mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-07-18 19:41:01 -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:
@ -726,7 +726,8 @@ static void ssh2_bpp_format_packet_inner(struct ssh2_bpp_state *s, PktOut *pkt)
|
||||
maclen = s->out.mac ? ssh2_mac_alg(s->out.mac)->len : 0;
|
||||
origlen = pkt->length;
|
||||
for (i = 0; i < padding; i++)
|
||||
put_byte(pkt, random_byte());
|
||||
put_byte(pkt, 0); /* make space for random padding */
|
||||
random_read(pkt->data + origlen, padding);
|
||||
pkt->data[4] = padding;
|
||||
PUT_32BIT(pkt->data, origlen + padding - 4);
|
||||
|
||||
@ -820,8 +821,10 @@ static void ssh2_bpp_format_packet(struct ssh2_bpp_state *s, PktOut *pkt)
|
||||
|
||||
ignore_pkt = ssh2_bpp_new_pktout(SSH2_MSG_IGNORE);
|
||||
put_uint32(ignore_pkt, length);
|
||||
while (length-- > 0)
|
||||
put_byte(ignore_pkt, random_byte());
|
||||
size_t origlen = ignore_pkt->length;
|
||||
for (size_t i = 0; i < length; i++)
|
||||
put_byte(ignore_pkt, 0); /* make space for random padding */
|
||||
random_read(ignore_pkt->data + origlen, length);
|
||||
ssh2_bpp_format_packet_inner(s, ignore_pkt);
|
||||
bufchain_add(s->bpp.out_raw, ignore_pkt->data, ignore_pkt->length);
|
||||
ssh_free_pktout(ignore_pkt);
|
||||
|
Reference in New Issue
Block a user