trying to fix dh_shared_secret - #119
This commit is contained in:
parent
bc4236d90f
commit
114b694735
@ -355,7 +355,7 @@ error:
|
|||||||
int dh_shared_secret(dh_key *private_key, dh_key *public_key,
|
int dh_shared_secret(dh_key *private_key, dh_key *public_key,
|
||||||
unsigned char *out, unsigned long *outlen)
|
unsigned char *out, unsigned long *outlen)
|
||||||
{
|
{
|
||||||
void *tmp, *p;
|
void *tmp, *p, *p_minus1;
|
||||||
unsigned long x;
|
unsigned long x;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
@ -375,26 +375,31 @@ int dh_shared_secret(dh_key *private_key, dh_key *public_key,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* compute y^x mod p */
|
/* compute y^x mod p */
|
||||||
if ((err = mp_init_multi(&tmp, &p, NULL)) != CRYPT_OK) {
|
if ((err = mp_init_multi(&tmp, &p, &p_minus1, NULL)) != CRYPT_OK) {
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((err = mp_read_radix(p, (char *)sets[private_key->idx].prime, 16)) != CRYPT_OK) { goto error; }
|
if ((err = mp_read_radix(p, sets[private_key->idx].prime, 16)) != CRYPT_OK) { goto error; }
|
||||||
|
if ((err = mp_sub_d(p, 1, p_minus1)) != CRYPT_OK) { goto error; }
|
||||||
|
if (mp_cmp(public_key->y, p_minus1) != LTC_MP_LT || mp_cmp_d(public_key->y, 1) != LTC_MP_GT) {
|
||||||
|
/* reject public key with: y <= 1 OR y >= p-1 */
|
||||||
|
err = CRYPT_INVALID_ARG;
|
||||||
|
goto error;
|
||||||
|
};
|
||||||
if ((err = mp_exptmod(public_key->y, private_key->x, p, tmp)) != CRYPT_OK) { goto error; }
|
if ((err = mp_exptmod(public_key->y, private_key->x, p, tmp)) != CRYPT_OK) { goto error; }
|
||||||
|
|
||||||
/* enough space for output? */
|
/* enough space for output? */
|
||||||
x = (unsigned long)mp_unsigned_bin_size(tmp);
|
x = (unsigned long)mp_unsigned_bin_size(tmp);
|
||||||
if (*outlen < x) {
|
if (*outlen < x) {
|
||||||
err = CRYPT_BUFFER_OVERFLOW;
|
err = CRYPT_BUFFER_OVERFLOW;
|
||||||
goto done;
|
goto error;
|
||||||
}
|
}
|
||||||
if ((err = mp_to_unsigned_bin(tmp, out)) != CRYPT_OK) { goto error; }
|
if ((err = mp_to_unsigned_bin(tmp, out)) != CRYPT_OK) { goto error; }
|
||||||
*outlen = x;
|
*outlen = x;
|
||||||
err = CRYPT_OK;
|
err = CRYPT_OK;
|
||||||
goto done;
|
|
||||||
error:
|
error:
|
||||||
done:
|
mp_clear_multi(p_minus1, p, tmp, NULL);
|
||||||
mp_clear_multi(p, tmp, NULL);
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user