ed25519: Check retval of unpack_negative_vartime in donna.

This commit is contained in:
George Kadianakis 2017-06-28 14:10:10 +03:00
parent 559195ea82
commit 0d9873ac0d
2 changed files with 9 additions and 5 deletions

View File

@ -497,7 +497,8 @@ ed25519_public_key_from_curve25519_public_key(ed25519_public_key_t *pubkey,
* service descriptors are encrypted with a key derived from the service's * service descriptors are encrypted with a key derived from the service's
* long-term public key, and then signed with (and stored at a position * long-term public key, and then signed with (and stored at a position
* indexed by) a short-term key derived by blinding the long-term keys. * indexed by) a short-term key derived by blinding the long-term keys.
*/ *
* Return 0 if blinding was successful, else return -1. */
int int
ed25519_keypair_blind(ed25519_keypair_t *out, ed25519_keypair_blind(ed25519_keypair_t *out,
const ed25519_keypair_t *inp, const ed25519_keypair_t *inp,
@ -508,7 +509,9 @@ ed25519_keypair_blind(ed25519_keypair_t *out,
get_ed_impl()->blind_secret_key(out->seckey.seckey, get_ed_impl()->blind_secret_key(out->seckey.seckey,
inp->seckey.seckey, param); inp->seckey.seckey, param);
ed25519_public_blind(&pubkey_check, &inp->pubkey, param); if (ed25519_public_blind(&pubkey_check, &inp->pubkey, param) < 0) {
return -1;
}
ed25519_public_key_generate(&out->pubkey, &out->seckey); ed25519_public_key_generate(&out->pubkey, &out->seckey);
tor_assert(fast_memeq(pubkey_check.pubkey, out->pubkey.pubkey, 32)); tor_assert(fast_memeq(pubkey_check.pubkey, out->pubkey.pubkey, 32));
@ -528,8 +531,7 @@ ed25519_public_blind(ed25519_public_key_t *out,
const ed25519_public_key_t *inp, const ed25519_public_key_t *inp,
const uint8_t *param) const uint8_t *param)
{ {
get_ed_impl()->blind_public_key(out->pubkey, inp->pubkey, param); return get_ed_impl()->blind_public_key(out->pubkey, inp->pubkey, param);
return 0;
} }
/** /**

View File

@ -304,7 +304,9 @@ ed25519_donna_blind_public_key(unsigned char *out, const unsigned char *inp,
/* No "ge25519_unpack", negate the public key. */ /* No "ge25519_unpack", negate the public key. */
memcpy(pkcopy, inp, 32); memcpy(pkcopy, inp, 32);
pkcopy[31] ^= (1<<7); pkcopy[31] ^= (1<<7);
ge25519_unpack_negative_vartime(&A, pkcopy); if (!ge25519_unpack_negative_vartime(&A, pkcopy)) {
return -1;
}
/* A' = [tweak] * A + [0] * basepoint. */ /* A' = [tweak] * A + [0] * basepoint. */
ge25519_double_scalarmult_vartime(&Aprime, &A, t, zero); ge25519_double_scalarmult_vartime(&Aprime, &A, t, zero);