From 3fe24df1237a77549ba64c6331383a9a40aed1de Mon Sep 17 00:00:00 2001 From: emkael Date: Sat, 25 Nov 2017 16:15:54 +0100 Subject: Initial BigDeal sources --- collect.c | 112 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 collect.c (limited to 'collect.c') diff --git a/collect.c b/collect.c new file mode 100644 index 0000000..e800edd --- /dev/null +++ b/collect.c @@ -0,0 +1,112 @@ +/* + * Collect various pieces of randomness + */ + +static char rcsid[] = "$Header: /home/sater/bridge/bigdeal/RCS/collect.c,v 1.7 2000/08/25 15:55:26 sater Exp $"; + +#include "types.h" +#include "rmd160.h" +#include "bigdeal.h" +#include + +static dword MDbuf[RMDdwords]; /* Contains state of RIPEMD-160 */ +static byte variousbytes[64]; +static int vbytesindex; + +int nrandombits; /* Collected bits of randomness */ +static int nhashbytes; /* Number of bytes hashed */ + +#ifdef BIGDEALX +extern FILE *flog; +#endif + +void +collect_start() +/* + * Set everything to zero, and init the hashing engine + */ +{ + + MDinit(MDbuf); + vbytesindex = 0; + nhashbytes = 0; + nrandombits = 0; +} + +static void +collect_byte(byte b) +/* + * Throw another byte into the machine. If it fills up the buffer run the + * buffer through the hashing engine + */ +{ + dword X[16]; + int i; + byte *bp; + + nhashbytes++; + variousbytes[vbytesindex++] = b; + if (vbytesindex == 64) { + bp = variousbytes; + for (i=0; i<16; i++) { + X[i] = BYTES_TO_DWORD(bp); + bp += 4; + } + compress(MDbuf, X); + vbytesindex = 0; +#ifdef BIGDEALX + if (flog) + fprintf(flog, "compressed another 64 bytes\n"); +#endif + } +} + +void +collect_more(byte *bp, int nbytes, int entropybits) +/* + * Throw a bunch of information into the machine. + * The user supplies a hopefully pessimistic estimate of the entropy + */ +{ + + nrandombits += entropybits; +#ifdef BIGDEALX + if (flog) { + int i; + + fprintf(flog, "collect_more("); + for (i=0; i < nbytes; i++) + fprintf(flog, "%02x", bp[i]); + fprintf(flog, ", %d, %d) -> %d\n", nbytes, entropybits, nrandombits); + } +#endif + while(nbytes > 0) { + collect_byte(*bp); + nbytes--; + bp++; + } +} + +void +collect_finish(byte *hash) +/* + * Halt the hashing engine + * Extract the result into hash[] + */ +{ + int i; + + MDfinish(MDbuf, variousbytes, nhashbytes, 0); +#ifdef BIGDEALX + if (flog) + fprintf(flog, "collected %d random bits, from %d bytes of data\n", + nrandombits, nhashbytes); + +#endif + for (i=0; i>2]; /* implicit cast to byte */ + hash[i+1] = (MDbuf[i>>2] >> 8); /* extracts the 8 least */ + hash[i+2] = (MDbuf[i>>2] >> 16); /* significant bits. */ + hash[i+3] = (MDbuf[i>>2] >> 24); + } +} -- cgit v1.2.3