You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

145 lines
4.0 KiB

From 459241f2801c3b1a0d28c5669527e165ce4b384e Mon Sep 17 00:00:00 2001
From: Wentao Shang <wentaoshang@gmail.com>
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