mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-07-10 15:53:47 -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:
12
ssh1login.c
12
ssh1login.c
@ -201,8 +201,7 @@ static void ssh1_login_process_queue(PacketProtocolLayer *ppl)
|
||||
ssh1_compute_session_id(s->session_id, s->cookie,
|
||||
&s->hostkey, &s->servkey);
|
||||
|
||||
for (i = 0; i < 32; i++)
|
||||
s->session_key[i] = random_byte();
|
||||
random_read(s->session_key, 32);
|
||||
|
||||
/*
|
||||
* Verify that the `bits' and `bytes' parameters match.
|
||||
@ -986,10 +985,8 @@ static void ssh1_login_process_queue(PacketProtocolLayer *ppl)
|
||||
put_stringz(pkt, s->cur_prompt->prompts[0]->result);
|
||||
pq_push(s->ppl.out_pq, pkt);
|
||||
} else {
|
||||
int j;
|
||||
strbuf *random_data = strbuf_new();
|
||||
for (j = 0; j < i; j++)
|
||||
put_byte(random_data, random_byte());
|
||||
random_read(strbuf_append(random_data, i), i);
|
||||
|
||||
pkt = ssh_bpp_new_pktout(s->ppl.bpp, SSH1_MSG_IGNORE);
|
||||
put_stringsb(pkt, random_data);
|
||||
@ -1009,9 +1006,8 @@ static void ssh1_login_process_queue(PacketProtocolLayer *ppl)
|
||||
ppl_logevent("Sending length-padded password");
|
||||
pkt = ssh_bpp_new_pktout(s->ppl.bpp, s->pwpkt_type);
|
||||
put_asciz(padded_pw, s->cur_prompt->prompts[0]->result);
|
||||
do {
|
||||
put_byte(padded_pw, random_byte());
|
||||
} while (padded_pw->len % 64 != 0);
|
||||
size_t pad = 63 & -padded_pw->len;
|
||||
random_read(strbuf_append(padded_pw, pad), pad);
|
||||
put_stringsb(pkt, padded_pw);
|
||||
pq_push(s->ppl.out_pq, pkt);
|
||||
} else {
|
||||
|
Reference in New Issue
Block a user