summaryrefslogtreecommitdiff
path: root/src/librandom/surf_makeseed.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/librandom/surf_makeseed.c')
-rw-r--r--src/librandom/surf_makeseed.c35
1 files changed, 35 insertions, 0 deletions
diff --git a/src/librandom/surf_makeseed.c b/src/librandom/surf_makeseed.c
new file mode 100644
index 0000000..adae9a4
--- /dev/null
+++ b/src/librandom/surf_makeseed.c
@@ -0,0 +1,35 @@
+/* ISC license. */
+
+#include <unistd.h>
+#include <skalibs/uint32.h>
+#include <skalibs/tai.h>
+#include <skalibs/sha1.h>
+#include <skalibs/surf.h>
+
+void surf_makeseed (char *s)
+{
+ SHA1Schedule bak = SHA1_INIT() ;
+ {
+ tain_t now ;
+ char tmp[20 + TAIN_PACK] ;
+ 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) ;
+ 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) ;
+ }
+ }
+}