mirror of
https://github.com/RIOT-OS/RIOT.git
synced 2024-12-29 04:50:03 +01:00
145 lines
4.0 KiB
Diff
145 lines
4.0 KiB
Diff
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 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 daa144a..3691fc4 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 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 MODULE_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 /* 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
|
|
@@ -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 MODULE_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 /* 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.7.4
|