mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-07-16 18:47:32 -05:00
Replace random_byte() with random_read().
This is in preparation for a PRNG revamp which will want to have a well defined boundary for any given request-for-randomness, so that it can destroy the evidence afterwards. So no more looping round calling random_byte() and then stopping when we feel like it: now you say up front how many random bytes you want, and call random_read() which gives you that many in one go. Most of the call sites that had to be fixed are fairly mechanical, and quite a few ended up more concise afterwards. A few became more cumbersome, such as mp_random_bits, in which the new API doesn't let me load the random bytes directly into the target integer without triggering undefined behaviour, so instead I have to allocate a separate temporary buffer. The _most_ interesting call site was in the PKCS#1 v1.5 padding code in sshrsa.c (used in SSH-1), in which you need a stream of _nonzero_ random bytes. The previous code just looped on random_byte, retrying if it got a zero. Now I'm doing a much more interesting thing with an mpint, essentially scaling a binary fraction repeatedly to extract a number in the range [0,255) and then adding 1 to it.
This commit is contained in:
14
sshrand.c
14
sshrand.c
@ -52,9 +52,10 @@ void random_add_noise(void *noise, int length) { }
|
||||
void random_add_heavynoise(void *noise, int length) { }
|
||||
void random_ref(void) { }
|
||||
void random_unref(void) { }
|
||||
int random_byte(void)
|
||||
void random_read(void *out, size_t size)
|
||||
{
|
||||
return 0x45; /* Chosen by eight fair coin tosses */
|
||||
memset(out, 0x45, size); /* Chosen by eight fair coin tosses */
|
||||
}
|
||||
void random_get_savedata(void **data, int *len) { }
|
||||
#else /* !FUZZING */
|
||||
@ -319,14 +320,17 @@ void random_unref(void)
|
||||
random_active--;
|
||||
}
|
||||
|
||||
int random_byte(void)
|
||||
void random_read(void *vout, size_t size)
|
||||
{
|
||||
assert(random_active);
|
||||
|
||||
if (pool.poolpos >= POOLSIZE)
|
||||
random_stir();
|
||||
uint8_t *out = (uint8_t *)vout;
|
||||
while (size-- > 0) {
|
||||
if (pool.poolpos >= POOLSIZE)
|
||||
random_stir();
|
||||
|
||||
return pool.pool[pool.poolpos++];
|
||||
*out++ = pool.pool[pool.poolpos++];
|
||||
}
|
||||
}
|
||||
|
||||
void random_get_savedata(void **data, int *len)
|
||||
|
Reference in New Issue
Block a user