From ba4cf2343f4a0d821dc4e30aabfb05f17f57543f Mon Sep 17 00:00:00 2001 From: Wentao Shang Date: Mon, 12 Dec 2016 16:19:34 -0800 Subject: [PATCH 1/2] 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..cb0ac42 100644 --- a/platform-specific.inc +++ b/platform-specific.inc @@ -5,6 +5,8 @@ #include "types.h" +#ifdef MODULE_PERIPH_HWRNG + #if (defined(_WIN32) || defined(_WIN64)) /* Windows */ @@ -64,4 +66,6 @@ static int default_RNG(uint8_t *dest, unsigned size) { #endif /* platform */ +#endif /* MODULE_PERIPH_HWRNG */ + #endif /* _UECC_PLATFORM_SPECIFIC_H_ */ diff --git a/uECC.c b/uECC.c index 7717533..c559a48 100644 --- a/uECC.c +++ b/uECC.c @@ -2,6 +2,9 @@ #include "uECC.h" #include "uECC_vli.h" +#ifdef MODULE_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 MODULE_PERIPH_HWRNG +int riot_hwrng(uint8_t *dest, unsigned size) { + hwrng_read(dest, size); + return 1; +} +#endif + +#ifdef MODULE_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 MODULE_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 /* MODULE_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 MODULE_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 /* MODULE_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 1193ce8..dc40721 100644 --- a/uECC.h +++ b/uECC.h @@ -142,6 +142,8 @@ Returns the size of a public key for the curve in bytes. */ int uECC_curve_public_key_size(uECC_Curve curve); +#ifdef MODULE_PERIPH_HWRNG + /* uECC_make_key() function. Create a public/private key pair. @@ -160,6 +162,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 /* MODULE_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 @@ -233,6 +237,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 MODULE_PERIPH_HWRNG + /* uECC_sign() function. Generate an ECDSA signature for a given hash value. @@ -256,6 +262,8 @@ int uECC_sign(const uint8_t *private_key, uint8_t *signature, uECC_Curve curve); +#endif /* MODULE_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.25.1