From 459241f2801c3b1a0d28c5669527e165ce4b384e Mon Sep 17 00:00:00 2001 From: Wentao Shang Date: Mon, 12 Dec 2016 16:19:34 -0800 Subject: [PATCH 2/3] Include RIOT Hardware RNG interface --- platform-specific.inc | 4 ++++ uECC.c | 22 ++++++++++++++++++++++ uECC.h | 8 ++++++++ 3 files changed, 34 insertions(+) diff --git a/platform-specific.inc b/platform-specific.inc index 1bb595a..b13fdbe 100644 --- a/platform-specific.inc +++ b/platform-specific.inc @@ -5,6 +5,8 @@ #include "types.h" +#ifdef FEATURE_PERIPH_HWRNG + #if (defined(_WIN32) || defined(_WIN64)) /* Windows */ @@ -64,4 +66,6 @@ static int default_RNG(uint8_t *dest, unsigned size) { #endif /* platform */ +#endif /* FEATURE_PERIPH_HWRNG */ + #endif /* _UECC_PLATFORM_SPECIFIC_H_ */ diff --git a/uECC.c b/uECC.c index daa144a..3691fc4 100644 --- a/uECC.c +++ b/uECC.c @@ -2,6 +2,9 @@ #include "uECC.h" #include "uECC_vli.h" +#ifdef FEATURE_PERIPH_HWRNG +#include "periph/hwrng.h" +#endif #ifndef uECC_RNG_MAX_TRIES #define uECC_RNG_MAX_TRIES 64 @@ -181,9 +184,20 @@ static cmpresult_t uECC_vli_cmp_unsafe(const uECC_word_t *left, #include "asm_avr.inc" #endif +#ifdef FEATURE_PERIPH_HWRNG +int riot_hwrng(uint8_t *dest, unsigned size) { + hwrng_read(dest, size); + return 1; +} +#endif + +#ifdef FEATURE_PERIPH_HWRNG #if default_RNG_defined static uECC_RNG_Function g_rng_function = &default_RNG; #else +static uECC_RNG_Function g_rng_function = &riot_hwrng; +#endif +#else static uECC_RNG_Function g_rng_function = 0; #endif @@ -1001,6 +1015,8 @@ uECC_VLI_API int uECC_generate_random_int(uECC_word_t *random, return 0; } +#ifdef FEATURE_PERIPH_HWRNG + int uECC_make_key(uint8_t *public_key, uint8_t *private_key, uECC_Curve curve) { @@ -1031,6 +1047,8 @@ int uECC_make_key(uint8_t *public_key, return 0; } +#endif /* FEATURE_PERIPH_HWRNG */ + int uECC_shared_secret(const uint8_t *public_key, const uint8_t *private_key, uint8_t *secret, @@ -1303,6 +1321,8 @@ static int uECC_sign_with_k(const uint8_t *private_key, return 1; } +#ifdef FEATURE_PERIPH_HWRNG + int uECC_sign(const uint8_t *private_key, const uint8_t *message_hash, unsigned hash_size, @@ -1323,6 +1343,8 @@ int uECC_sign(const uint8_t *private_key, return 0; } +#endif /* FEATURE_PERIPH_HWRNG */ + /* Compute an HMAC using K as a key (as in RFC 6979). Note that K is always the same size as the hash result size. */ static void HMAC_init(const uECC_HashContext *hash_context, const uint8_t *K) { diff --git a/uECC.h b/uECC.h index 9911763..6433143 100644 --- a/uECC.h +++ b/uECC.h @@ -144,6 +144,8 @@ Returns the size of a public key for the curve in bytes. */ int uECC_curve_public_key_size(uECC_Curve curve); +#ifdef FEATURE_PERIPH_HWRNG + /* uECC_make_key() function. Create a public/private key pair. @@ -162,6 +164,8 @@ Returns 1 if the key pair was generated successfully, 0 if an error occurred. */ int uECC_make_key(uint8_t *public_key, uint8_t *private_key, uECC_Curve curve); +#endif /* FEATURE_PERIPH_HWRNG */ + /* uECC_shared_secret() function. Compute a shared secret given your secret key and someone else's public key. Note: It is recommended that you hash the result of uECC_shared_secret() before using it for @@ -235,6 +239,8 @@ Returns 1 if the key was computed successfully, 0 if an error occurred. */ int uECC_compute_public_key(const uint8_t *private_key, uint8_t *public_key, uECC_Curve curve); +#ifdef FEATURE_PERIPH_HWRNG + /* uECC_sign() function. Generate an ECDSA signature for a given hash value. @@ -258,6 +264,8 @@ int uECC_sign(const uint8_t *private_key, uint8_t *signature, uECC_Curve curve); +#endif /* FEATURE_PERIPH_HWRNG */ + /* uECC_HashContext structure. This is used to pass in an arbitrary hash function to uECC_sign_deterministic(). The structure will be used for multiple hash computations; each time a new hash -- 2.7.4