mirror of
https://github.com/RIOT-OS/RIOT.git
synced 2024-12-29 04:50:03 +01:00
146 lines
4.0 KiB
Diff
146 lines
4.0 KiB
Diff
From ba4cf2343f4a0d821dc4e30aabfb05f17f57543f Mon Sep 17 00:00:00 2001
|
|
From: Wentao Shang <wentaoshang@gmail.com>
|
|
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
|
|
|