From ae3e85813614402347f143bd1df3caa148a5a48e Mon Sep 17 00:00:00 2001 From: Richard Moore Date: Wed, 20 May 2015 12:02:51 -0400 Subject: [PATCH] Added error checking to uECC_compute_public_key. --- test/test_compute.c | 23 ++++++++++++++++++----- uECC.c | 26 +++++++++++++++++++++++--- uECC.h | 4 +++- 3 files changed, 44 insertions(+), 9 deletions(-) diff --git a/test/test_compute.c b/test/test_compute.c index 160fac5..88b6703 100644 --- a/test/test_compute.c +++ b/test/test_compute.c @@ -17,12 +17,13 @@ void vli_print(uint8_t *p_vli, unsigned int p_size) int main() { int i; - + int success; + uint8_t l_private[uECC_BYTES]; - + uint8_t l_public[uECC_BYTES * 2]; uint8_t l_public_computed[uECC_BYTES * 2]; - + printf("Testing 256 random private key pairs\n"); for(i=0; i<256; ++i) @@ -36,7 +37,10 @@ int main() return 1; } - uECC_compute_public_key(l_private, l_public_computed); + success = uECC_compute_public_key(l_private, l_public_computed); + if (!success) { + printf("uECC_compute_public_key() failed\n"); + } if(memcmp(l_public, l_public_computed, sizeof(l_public)) != 0) { @@ -52,7 +56,16 @@ int main() printf("\n"); } } + printf("\n"); - + + printf("Testing private key = 0\n"); + + memset(l_private, 0, uECC_BYTES); + success = uECC_compute_public_key(l_private, l_public_computed); + if (success) { + printf("uECC_compute_public_key() should have failed\n"); + } + return 0; } diff --git a/uECC.c b/uECC.c index 33cae0c..dd9da34 100644 --- a/uECC.c +++ b/uECC.c @@ -2380,16 +2380,36 @@ int uECC_verify(const uint8_t p_publicKey[uECC_BYTES*2], const uint8_t p_hash[uE return vli_equal(rx, r); } -void uECC_compute_public_key(const uint8_t p_privateKey[uECC_BYTES], uint8_t p_publicKey[uECC_BYTES * 2]) { - EccPoint l_public; +int uECC_compute_public_key(const uint8_t p_privateKey[uECC_BYTES], uint8_t p_publicKey[uECC_BYTES * 2]) { uECC_word_t l_private[uECC_WORDS]; - vli_bytesToNative(l_private, p_privateKey); + /* Make sure the private key is in the range [1, n-1]. */ + if(vli_isZero(l_private)) + { + return 0; + } + +#if uECC_CURVE != uECC_secp160r1 + if(vli_cmp(curve_n, l_private) != 1) + { + return 0; + } +#endif + + /* Compute the public point */ + EccPoint l_public; EccPoint_mult(&l_public, &curve_G, l_private, 0, vli_numBits(l_private, uECC_WORDS)); + if (EccPoint_isZero(&l_public)) + { + return 0; + } + vli_nativeToBytes(p_publicKey, l_public.x); vli_nativeToBytes(p_publicKey + uECC_BYTES, l_public.y); + + return 1; } int uECC_bytes(void) diff --git a/uECC.h b/uECC.h index ace1f4e..4787457 100644 --- a/uECC.h +++ b/uECC.h @@ -186,8 +186,10 @@ Inputs: Outputs: p_publicKey - Will be filled in with the corresponding public key + +Returns 1 if the key was computed successfully, 0 if an error occurred. */ -void uECC_compute_public_key(const uint8_t p_privateKey[uECC_BYTES], uint8_t p_publicKey[uECC_BYTES * 2]); +int uECC_compute_public_key(const uint8_t p_privateKey[uECC_BYTES], uint8_t p_publicKey[uECC_BYTES * 2]); /* uECC_bytes() function.