1 /* R_RANDOM.C - random objects for RSAREF
4 /* Copyright (C) RSA Laboratories, a division of RSA Data Security,
5 Inc., created 1991. All rights reserved.
13 #define RANDOM_BYTES_NEEDED 256
15 int R_RandomInit (randomStruct)
16 R_RANDOM_STRUCT *randomStruct; /* new random structure */
18 randomStruct->bytesNeeded = RANDOM_BYTES_NEEDED;
19 R_memset ((POINTER)randomStruct->state, 0, sizeof (randomStruct->state));
20 randomStruct->outputAvailable = 0;
25 int R_RandomUpdate (randomStruct, block, blockLen)
26 R_RANDOM_STRUCT *randomStruct; /* random structure */
27 unsigned char *block; /* block of values to mix in */
28 unsigned int blockLen; /* length of block */
31 unsigned char digest[16];
35 MD5Update (&context, block, blockLen);
36 MD5Final (digest, &context);
38 /* add digest to state */
40 for (i = 0; i < 16; i++) {
41 x += randomStruct->state[15-i] + digest[15-i];
42 randomStruct->state[15-i] = (unsigned char)x;
46 if (randomStruct->bytesNeeded < blockLen)
47 randomStruct->bytesNeeded = 0;
49 randomStruct->bytesNeeded -= blockLen;
51 /* Zeroize sensitive information.
53 R_memset ((POINTER)digest, 0, sizeof (digest));
59 int R_GetRandomBytesNeeded (bytesNeeded, randomStruct)
60 unsigned int *bytesNeeded; /* number of mix-in bytes needed */
61 R_RANDOM_STRUCT *randomStruct; /* random structure */
63 *bytesNeeded = randomStruct->bytesNeeded;
68 int R_GenerateBytes (block, blockLen, randomStruct)
69 unsigned char *block; /* block */
70 unsigned int blockLen; /* length of block */
71 R_RANDOM_STRUCT *randomStruct; /* random structure */
74 unsigned int available, i;
76 if (randomStruct->bytesNeeded)
77 return (RE_NEED_RANDOM);
79 available = randomStruct->outputAvailable;
81 while (blockLen > available) {
83 ((POINTER)block, (POINTER)&randomStruct->output[16-available],
86 blockLen -= available;
88 /* generate new output */
90 MD5Update (&context, randomStruct->state, 16);
91 MD5Final (randomStruct->output, &context);
95 for (i = 0; i < 16; i++)
96 if (randomStruct->state[15-i]++)
101 ((POINTER)block, (POINTER)&randomStruct->output[16-available], blockLen);
102 randomStruct->outputAvailable = available - blockLen;
107 void R_RandomFinal (randomStruct)
108 R_RANDOM_STRUCT *randomStruct; /* random structure */
110 R_memset ((POINTER)randomStruct, 0, sizeof (*randomStruct));