Add siprandom

Based on an idea I got from a talk.
This commit is contained in:
Přemysl Eric Janouch 2016-02-14 19:28:22 +01:00
parent 949738401a
commit 74d634e562
3 changed files with 97 additions and 2 deletions

View File

@ -53,6 +53,9 @@ if (WITH_GDM)
target_link_libraries (gdm-switch-user ${gdm_LIBRARIES}) target_link_libraries (gdm-switch-user ${gdm_LIBRARIES})
endif (WITH_GDM) endif (WITH_GDM)
add_executable (siprandom siprandom.c)
target_link_libraries (siprandom ${project_libraries})
# The files to be installed # The files to be installed
include (GNUInstallDirs) include (GNUInstallDirs)
@ -67,7 +70,7 @@ if (WITH_GDM)
install (TARGETS gdm-switch-user DESTINATION ${CMAKE_INSTALL_BINDIR}) install (TARGETS gdm-switch-user DESTINATION ${CMAKE_INSTALL_BINDIR})
endif (WITH_GDM) endif (WITH_GDM)
install (TARGETS dwmstatus brightness fancontrol-ng install (TARGETS dwmstatus brightness fancontrol-ng siprandom
DESTINATION ${CMAKE_INSTALL_BINDIR}) DESTINATION ${CMAKE_INSTALL_BINDIR})
install (PROGRAMS shellify DESTINATION ${CMAKE_INSTALL_BINDIR}) install (PROGRAMS shellify DESTINATION ${CMAKE_INSTALL_BINDIR})
install (FILES LICENSE DESTINATION ${CMAKE_INSTALL_DOCDIR}) install (FILES LICENSE DESTINATION ${CMAKE_INSTALL_DOCDIR})

View File

@ -3,7 +3,7 @@ desktop-tools
:compact-option: :compact-option:
'desktop-tools' is a collection of tools to run my desktop that might be useful '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 - '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, 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 and nmcli that are painfully lacking it
- 'gdm-switch-user' tells the running GDM daemon, if any, to show the switch - 'gdm-switch-user' tells the running GDM daemon, if any, to show the switch
user screen 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. Don't expect them to work under any OS that isn't Linux.

90
siprandom.c Normal file
View File

@ -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;
}