aboutsummaryrefslogtreecommitdiffstats
path: root/src/librandom/random_makeseed.c
diff options
context:
space:
mode:
authorLaurent Bercot <ska-skaware@skarnet.org>2016-10-14 17:07:56 +0000
committerLaurent Bercot <ska-skaware@skarnet.org>2016-10-14 17:07:56 +0000
commita1933bd1847951b959016f59ee744d1b18a00142 (patch)
tree42392f2df048defd712fa12d290bf84a7a77df6d /src/librandom/random_makeseed.c
parenteaf9404b22bba7be5092672144b867380c602beb (diff)
downloadskalibs-a1933bd1847951b959016f59ee744d1b18a00142.tar.gz
Clean up and modernize librandom.
Correct random number generation has historically been suprisingly painful to achieve. There was no standard, every system behaved in a subtly different way, and there were a few userland initiatives to get decent randomness, all incompatible of course. The situation is a bit better now, we're heading towards some standardization. The arc4random() series of functions is a good API, and available on a lot of systems - unfortunately not Linux, but on Linux the new getrandom() makes using /dev/random obsolete. So I removed the old crap in librandom, dropped EGD support, dropped dynamic backend selection, made a single API series (random_* instead of goodrandom_* and badrandom_*), added an arc4random backend and a getrandom backend, and defaulted to /dev/urandom backed up by SURF in the worst case. This should be much smaller and logical. However, it's a major API break, so the skarnet.org stack will be changed to adapt.
Diffstat (limited to 'src/librandom/random_makeseed.c')
-rw-r--r--src/librandom/random_makeseed.c44
1 files changed, 44 insertions, 0 deletions
diff --git a/src/librandom/random_makeseed.c b/src/librandom/random_makeseed.c
new file mode 100644
index 0000000..909e896
--- /dev/null
+++ b/src/librandom/random_makeseed.c
@@ -0,0 +1,44 @@
+/* ISC license. */
+
+#include <unistd.h>
+#include <skalibs/uint32.h>
+#include <skalibs/tai.h>
+#include <skalibs/sha1.h>
+
+/*
+ Writes 160 bytes of crap into s.
+ Certainly not cryptographically secure or 100% unpredictable,
+ but we're only using this to speed up /dev/urandom
+ initialization or to init an internal SURF PRNG.
+ iow: we are CS iff the system's RNG is CS.
+*/
+
+void random_makeseed (char *s)
+{
+ SHA1Schedule bak = SHA1_INIT() ;
+ {
+ tain_t now ;
+ char tmp[256] ;
+ uint32 x = getpid() ;
+ uint32_pack(tmp, x) ;
+ x = getppid() ;
+ uint32_pack(tmp + 4, x) ;
+ tain_now(&now) ;
+ tain_pack(tmp + 8, &now) ;
+ sha1_update(&bak, tmp, 8 + TAIN_PACK) ;
+ gethostname(tmp, 256) ;
+ sha1_update(&bak, tmp, 256) ;
+ sha1_final(&bak, tmp) ;
+ sha1_init(&bak) ;
+ sha1_update(&bak, tmp, 20) ;
+ }
+ {
+ char i = 0 ;
+ for (; i < 8 ; i++)
+ {
+ SHA1Schedule ctx = bak ;
+ sha1_update(&ctx, &i, 1) ;
+ sha1_final(&ctx, s + 20*i) ;
+ }
+ }
+}