mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-07-01 03:22:48 -05:00
Stop using short exponents for Diffie-Hellman.
I recently encountered a paper [1] which catalogues all kinds of things that can go wrong when one party in a discrete-log system invents a prime and the other party chooses an exponent. In particular, some choices of prime make it reasonable to use a short exponent to save time, but others make that strategy very bad. That paper is about the ElGamal encryption scheme used in OpenPGP, which is basically integer Diffie-Hellman with one side's key being persistent: a shared-secret integer is derived exactly as in DH, and then it's used to communicate a message integer by simply multiplying the shared secret by the message, mod p. I don't _know_ that any problem of this kind arises in the SSH usage of Diffie-Hellman: the standard integer DH groups in SSH are safe primes, and as far as I know, the usual generation of prime moduli for DH group exchange also picks safe primes. So the short exponents PuTTY has been using _should_ be OK. However, the range of imaginative other possibilities shown in that paper make me nervous, even so! So I think I'm going to retire the short exponent strategy, on general principles of overcaution. This slows down 4096-bit integer DH by about a factor of 3-4 (which would be worse if it weren't for the modpow speedup in the previous commit). I think that's OK, because, firstly, computers are a lot faster these days than when I originally chose to use short exponents, and secondly, more and more implementations are now switching to elliptic-curve DH, which is unaffected by this change (and with which we've always been using maximum-length exponents). [1] On the (in)security of ElGamal in OpenPGP. Luca De Feo, Bertram Poettering, Alessandro Sorniotti. https://eprint.iacr.org/2021/923
This commit is contained in:
@ -118,7 +118,7 @@ void ssh2kex_coroutine(struct ssh2_transport_state *s, bool *aborted)
|
||||
* Now generate and send e for Diffie-Hellman.
|
||||
*/
|
||||
seat_set_busy_status(s->ppl.seat, BUSY_CPU);
|
||||
s->e = dh_create_e(s->dh_ctx, s->nbits * 2);
|
||||
s->e = dh_create_e(s->dh_ctx);
|
||||
pktout = ssh_bpp_new_pktout(s->ppl.bpp, s->kex_init_value);
|
||||
put_mp_ssh2(pktout, s->e);
|
||||
pq_push(s->ppl.out_pq, pktout);
|
||||
@ -322,7 +322,7 @@ void ssh2kex_coroutine(struct ssh2_transport_state *s, bool *aborted)
|
||||
"exchange with hash %s", ssh_hash_alg(s->exhash)->text_name);
|
||||
/* Now generate e for Diffie-Hellman. */
|
||||
seat_set_busy_status(s->ppl.seat, BUSY_CPU);
|
||||
s->e = dh_create_e(s->dh_ctx, s->nbits * 2);
|
||||
s->e = dh_create_e(s->dh_ctx);
|
||||
|
||||
if (s->shgss->lib->gsslogmsg)
|
||||
ppl_logevent("%s", s->shgss->lib->gsslogmsg);
|
||||
|
@ -128,7 +128,7 @@ void ssh2kex_coroutine(struct ssh2_transport_state *s, bool *aborted)
|
||||
/*
|
||||
* Generate e for Diffie-Hellman.
|
||||
*/
|
||||
s->e = dh_create_e(s->dh_ctx, s->nbits * 2);
|
||||
s->e = dh_create_e(s->dh_ctx);
|
||||
|
||||
/*
|
||||
* Wait to receive f.
|
||||
|
Reference in New Issue
Block a user