aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt5
-rw-r--r--README.adoc4
-rw-r--r--siprandom.c90
3 files changed, 97 insertions, 2 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index b5e03bc..14a08a0 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -53,6 +53,9 @@ if (WITH_GDM)
target_link_libraries (gdm-switch-user ${gdm_LIBRARIES})
endif (WITH_GDM)
+add_executable (siprandom siprandom.c)
+target_link_libraries (siprandom ${project_libraries})
+
# The files to be installed
include (GNUInstallDirs)
@@ -67,7 +70,7 @@ if (WITH_GDM)
install (TARGETS gdm-switch-user DESTINATION ${CMAKE_INSTALL_BINDIR})
endif (WITH_GDM)
-install (TARGETS dwmstatus brightness fancontrol-ng
+install (TARGETS dwmstatus brightness fancontrol-ng siprandom
DESTINATION ${CMAKE_INSTALL_BINDIR})
install (PROGRAMS shellify DESTINATION ${CMAKE_INSTALL_BINDIR})
install (FILES LICENSE DESTINATION ${CMAKE_INSTALL_DOCDIR})
diff --git a/README.adoc b/README.adoc
index acf7593..008f01a 100644
--- a/README.adoc
+++ b/README.adoc
@@ -3,7 +3,7 @@ desktop-tools
:compact-option:
'desktop-tools' is a collection of tools to run my desktop that might be useful
-to other people as well.
+to other people as well:
- 'dwmstatus' does literally everything my dwm doesn't but I'd like it to. It
includes PulseAudio volume management and hand-written NUT and MPD clients,
@@ -16,6 +16,8 @@ to other people as well.
and nmcli that are painfully lacking it
- 'gdm-switch-user' tells the running GDM daemon, if any, to show the switch
user screen
+ - 'siprandom' uses the SipHash 2-4 algorithm to produce a stream of
+ pseudo-random data; it should be fast enough to saturate most devices
Don't expect them to work under any OS that isn't Linux.
diff --git a/siprandom.c b/siprandom.c
new file mode 100644
index 0000000..20e8545
--- /dev/null
+++ b/siprandom.c
@@ -0,0 +1,90 @@
+/*
+ * siprandom.c: relatively fast pseudo-random data generator
+ *
+ * Copyright (c) 2016, Přemysl Janouch <p.janouch@gmail.com>
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ */
+
+#include "config.h"
+#undef PROGRAM_NAME
+#define PROGRAM_NAME "siprandom"
+#include "liberty/liberty.c"
+
+static void
+parse_program_arguments (int argc, char **argv)
+{
+ static const struct opt opts[] =
+ {
+ { 'd', "debug", NULL, 0, "run in debug mode" },
+ { 'h', "help", NULL, 0, "display this help and exit" },
+ { 'V', "version", NULL, 0, "output version information and exit" },
+ { 0, NULL, NULL, 0, NULL }
+ };
+
+ struct opt_handler oh;
+ opt_handler_init (&oh, argc, argv, opts, "CONFIG", "PRNG.");
+
+ int c;
+ while ((c = opt_handler_get (&oh)) != -1)
+ switch (c)
+ {
+ case 'd':
+ g_debug_mode = true;
+ break;
+ case 'h':
+ opt_handler_usage (&oh, stdout);
+ exit (EXIT_SUCCESS);
+ case 'V':
+ printf (PROGRAM_NAME " " PROGRAM_VERSION "\n");
+ exit (EXIT_SUCCESS);
+ default:
+ print_error ("wrong options");
+ opt_handler_usage (&oh, stderr);
+ exit (EXIT_FAILURE);
+ }
+
+ argc -= optind;
+ argv += optind;
+
+ if (argc)
+ {
+ opt_handler_usage (&oh, stderr);
+ exit (EXIT_FAILURE);
+ }
+
+ opt_handler_free (&oh);
+}
+
+int
+main (int argc, char *argv[])
+{
+ parse_program_arguments (argc, argv);
+
+ uint64_t counter, hash;
+ struct error *e = NULL;
+ if (!random_bytes (g_siphash_key, sizeof g_siphash_key, &e)
+ || !random_bytes (&counter, sizeof counter, &e)
+ || !random_bytes (&hash, sizeof hash, &e))
+ exit_fatal ("%s: %s", "failed to obtain random data seed", e->message);
+
+ do
+ {
+ hash ^= siphash_wrapper (&counter, sizeof counter);
+ counter++;
+ }
+ while (fwrite (&hash, sizeof hash, 1, stdout) == 1);
+ return EXIT_SUCCESS;
+}