Chromium Code Reviews| Index: nss/lib/freebl/dh.c |
| diff --git a/nss/lib/freebl/dh.c b/nss/lib/freebl/dh.c |
| index 54ff4803ea51fb03d6bf3b1341ad85b99a125ff9..66c11013470e7206c8d85007a9fe651d71d24a66 100644 |
| --- a/nss/lib/freebl/dh.c |
| +++ b/nss/lib/freebl/dh.c |
| @@ -205,7 +205,7 @@ DH_Derive(SECItem *publicValue, |
| { |
| mp_int p, Xa, Yb, ZZ, psub1; |
| mp_err err = MP_OKAY; |
| - int len = 0; |
| + unsigned int len = 0; |
| unsigned int nb; |
| unsigned char *secret = NULL; |
| if (!publicValue || !prime || !privateValue || !derivedSecret) { |
| @@ -252,6 +252,24 @@ DH_Derive(SECItem *publicValue, |
| err = MP_BADARG; |
| goto cleanup; |
| } |
| + |
| + /* |
| + * We check to make sure that ZZ is not equal to 1 or -1 mod p. |
|
Ryan Sleevi
2015/12/11 01:26:14
Of interest
davidben
2015/12/11 22:10:58
Meh. https://crbug.com/482950.
If I'm understandi
|
| + * This helps guard against small subgroup attacks, since an attacker |
| + * using a subgroup of size N will produce 1 or -1 with probability 1/N. |
| + * When the protocol is executed within a properly large subgroup, the |
| + * probability of this result will be negligibly small. For example, |
| + * with a strong prime of the form 2p+1, the probability will be 1/p. |
| + * |
| + * We return MP_BADARG because this is probably the result of a bad |
| + * public value or a bad prime having been provided. |
| + */ |
| + if (mp_cmp_d(&ZZ, 1) == 0 || |
| + mp_cmp(&ZZ, &psub1) == 0) { |
| + err = MP_BADARG; |
| + goto cleanup; |
| + } |
| + |
| /* allocate a buffer which can hold the entire derived secret. */ |
| secret = PORT_Alloc(len); |
| /* grab the derived secret */ |