mirror of
https://github.com/kmackay/micro-ecc.git
synced 2026-08-28 12:50:05 +00:00
Use constant-time comparison when checking signature validity.
This commit is contained in:
@@ -308,6 +308,7 @@ static uECC_word_t vli_testBit(const uECC_word_t *p_vli, bitcount_t p_bit);
|
||||
static bitcount_t vli_numBits(const uECC_word_t *p_vli, wordcount_t p_maxWords);
|
||||
static void vli_set(uECC_word_t *p_dest, const uECC_word_t *p_src);
|
||||
static cmpresult_t vli_cmp(uECC_word_t *p_left, uECC_word_t *p_right);
|
||||
static cmpresult_t vli_equal(uECC_word_t *p_left, uECC_word_t *p_right);
|
||||
static void vli_rshift1(uECC_word_t *p_vli);
|
||||
static uECC_word_t vli_add(uECC_word_t *p_result, uECC_word_t *p_left, uECC_word_t *p_right);
|
||||
static uECC_word_t vli_sub(uECC_word_t *p_result, uECC_word_t *p_left, uECC_word_t *p_right);
|
||||
@@ -514,6 +515,19 @@ static cmpresult_t vli_cmp(uECC_word_t *p_left, uECC_word_t *p_right)
|
||||
}
|
||||
#endif
|
||||
|
||||
static cmpresult_t vli_equal(uECC_word_t *p_left, uECC_word_t *p_right)
|
||||
{
|
||||
uECC_word_t l_result = 0;
|
||||
|
||||
swordcount_t i;
|
||||
for(i = uECC_WORDS-1; i >= 0; --i)
|
||||
{
|
||||
l_result |= (p_left[i] ^ p_right[i]);
|
||||
}
|
||||
|
||||
return (l_result == 0);
|
||||
}
|
||||
|
||||
/* Computes p_vli = p_vli >> 1. */
|
||||
#if !asm_rshift1
|
||||
static void vli_rshift1(uECC_word_t *p_vli)
|
||||
@@ -2331,7 +2345,7 @@ int uECC_verify(const uint8_t p_publicKey[uECC_BYTES*2], const uint8_t p_hash[uE
|
||||
#endif
|
||||
|
||||
/* Accept only if v == r. */
|
||||
return (vli_cmp(rx, r) == 0);
|
||||
return vli_equal(rx, r);
|
||||
}
|
||||
|
||||
int uECC_bytes()
|
||||
|
||||
Reference in New Issue
Block a user