From 74d634e562323265e8d207200395c2c91cc19299 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C5=99emysl=20Janouch?= Date: Sun, 14 Feb 2016 19:28:22 +0100 Subject: Add siprandom Based on an idea I got from a talk. --- CMakeLists.txt | 5 +++- README.adoc | 4 ++- siprandom.c | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 97 insertions(+), 2 deletions(-) create mode 100644 siprandom.c 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 + * 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; +} -- cgit v1.2.3