Update more usage of hwGetentropy() (#869)

* Update more usage of hwGetentropy()

* Add hwGetentropy() to Teensy 3.5/3.6
This commit is contained in:
d00616
2017-06-03 21:58:40 +02:00
committed by Olivier
parent 28c4f3f19e
commit e6925f69e8
10 changed files with 49 additions and 36 deletions
+3 -3
View File
@@ -149,9 +149,9 @@ bool signerAtsha204SoftGetNonce(MyMessage &msg)
return false; return false;
} }
#ifdef MY_HW_HAS_GETRANDOM #ifdef MY_HW_HAS_GETENTROPY
// Try to get MAX_PAYLOAD (or 32) random bytes // Try to get MAX_PAYLOAD random bytes
while (hwGetentropy(&_signing_verifying_nonce, MIN(MAX_PAYLOAD, 32)) != MIN(MAX_PAYLOAD, 32)); while (hwGetentropy(&_signing_verifying_nonce, MAX_PAYLOAD) != MAX_PAYLOAD);
#else #else
// We used a basic whitening technique that XORs a random byte with the current hwMillis() counter // We used a basic whitening technique that XORs a random byte with the current hwMillis() counter
// and then the byte is hashed (SHA256) to produce the resulting nonce // and then the byte is hashed (SHA256) to produce the resulting nonce
@@ -527,13 +527,15 @@ static void halt(bool success)
*/ */
static bool generate_random_data(uint8_t* data, size_t sz) static bool generate_random_data(uint8_t* data, size_t sz)
{ {
#ifdef USE_SOFT_SIGNING #if defined(USE_SOFT_SIGNING) && ! defined(MY_HW_HAS_GETENTROPY)
for (size_t i = 0; i < sz; i++) { for (size_t i = 0; i < sz; i++) {
data[i] = random(256) ^ micros(); data[i] = random(256) ^ micros();
unsigned long enter = hwMillis(); unsigned long enter = hwMillis();
while (hwMillis() - enter < (unsigned long)2); while (hwMillis() - enter < (unsigned long)2);
} }
return true; return true;
#elif defined(USE_SOFT_SIGNING) && defined(MY_HW_HAS_GETENTROPY)
hwGetentropy(&data, sz);
#else #else
ret_code = sha204.sha204m_random(tx_buffer, rx_buffer, RANDOM_SEED_UPDATE); ret_code = sha204.sha204m_random(tx_buffer, rx_buffer, RANDOM_SEED_UPDATE);
if ((ret_code != SHA204_SUCCESS) || (lockConfig != 0x00)) { if ((ret_code != SHA204_SUCCESS) || (lockConfig != 0x00)) {
+3 -3
View File
@@ -44,12 +44,12 @@ uint8_t hwReadConfig(int adr);
*/ */
/** /**
* @def MY_HW_HAS_GETRANDOM * @def MY_HW_HAS_GETENTROPY
* @brief Define this, if hwGetentropy is implemented * @brief Define this, if hwGetentropy is implemented
* *
* ssize_t hwGetentropy(void *__buffer, size_t __length); * ssize_t hwGetentropy(void *__buffer, size_t __length);
*/ */
//#define MY_HW_HAS_GETRANDOM //#define MY_HW_HAS_GETENTROPY
/// @brief unique ID /// @brief unique ID
typedef uint8_t unique_id_t[16]; typedef uint8_t unique_id_t[16];
@@ -141,7 +141,7 @@ void hwDebugPrint(const char *fmt, ... );
*/ */
#ifdef DOXYGEN #ifdef DOXYGEN
#define MY_CRITICAL_SECTION #define MY_CRITICAL_SECTION
#define MY_HW_HAS_GETRANDOM #define MY_HW_HAS_GETENTROPY
#endif /* DOXYGEN */ #endif /* DOXYGEN */
#endif // #ifdef MyHw_h #endif // #ifdef MyHw_h
+1 -1
View File
@@ -52,7 +52,7 @@ void hwWriteConfigBlock(void* buf, void* adr, size_t length);
void hwWriteConfig(const int addr, uint8_t value); void hwWriteConfig(const int addr, uint8_t value);
uint8_t hwReadConfig(const int addr); uint8_t hwReadConfig(const int addr);
ssize_t hwGetentropy(void *__buffer, size_t __length); ssize_t hwGetentropy(void *__buffer, size_t __length);
//#define MY_HW_HAS_GETRANDOM //#define MY_HW_HAS_GETENTROPY
/** /**
* Restore interrupt state. * Restore interrupt state.
+1 -1
View File
@@ -58,7 +58,7 @@ inline uint8_t hwReadConfig(int addr);
inline void hwWriteConfig(int addr, uint8_t value); inline void hwWriteConfig(int addr, uint8_t value);
inline void hwRandomNumberInit(); inline void hwRandomNumberInit();
ssize_t hwGetentropy(void *__buffer, size_t __length); ssize_t hwGetentropy(void *__buffer, size_t __length);
#define MY_HW_HAS_GETRANDOM #define MY_HW_HAS_GETENTROPY
inline unsigned long hwMillis(); inline unsigned long hwMillis();
#ifdef MY_RF24_IRQ_PIN #ifdef MY_RF24_IRQ_PIN
+1 -1
View File
@@ -63,7 +63,7 @@ void hwWriteConfig(int adr, uint8_t value);
uint8_t hwReadConfig(int adr); uint8_t hwReadConfig(int adr);
void hwRandomNumberInit(); void hwRandomNumberInit();
ssize_t hwGetentropy(void *__buffer, size_t __length); ssize_t hwGetentropy(void *__buffer, size_t __length);
#define MY_HW_HAS_GETRANDOM #define MY_HW_HAS_GETENTROPY
#ifndef MY_SERIALDEVICE #ifndef MY_SERIALDEVICE
#define MY_SERIALDEVICE Serial #define MY_SERIALDEVICE Serial
+22 -7
View File
@@ -132,18 +132,33 @@ uint16_t hwFreeMem()
return FUNCTION_NOT_SUPPORTED; return FUNCTION_NOT_SUPPORTED;
} }
void hwRandomNumberInit(void) #if defined(MY_HW_HAS_GETENTROPY)
ssize_t hwGetentropy(void *__buffer, const size_t __length)
{ {
#if defined(__MK64FX512__) || defined(__MK66FX1M0__)
// use HW RNG present on Teensy3.5/3.6
// init RNG
SIM_SCGC6 |= SIM_SCGC6_RNGA; // enable RNG SIM_SCGC6 |= SIM_SCGC6_RNGA; // enable RNG
RNG_CR &= ~RNG_CR_SLP_MASK; RNG_CR &= ~RNG_CR_SLP_MASK;
RNG_CR |= RNG_CR_HA_MASK; // high assurance RNG_CR |= RNG_CR_HA_MASK; //high assurance, not needed
// get random number size_t pos = 0;
while (pos < __length) {
RNG_CR |= RNG_CR_GO_MASK; RNG_CR |= RNG_CR_GO_MASK;
while (!(RNG_SR & RNG_SR_OREG_LVL(0xF))); while (!(RNG_SR & RNG_SR_OREG_LVL(0xF)));
const uint32_t seed = RNG_OR; const uint32_t rndVar = RNG_OR;
const uint8_t bsize = (__length - pos) > sizeof(rndVar) ? sizeof(rndVar) : (__length - pos);
(void)memcpy((uint8_t*)__buffer + pos, &rndVar, bsize);
pos += bsize;
}
SIM_SCGC6 &= ~SIM_SCGC6_RNGA; // disable RNG
return pos;
}
#endif
void hwRandomNumberInit(void)
{
#if defined(MY_HW_HAS_GETENTROPY)
// use HW RNG present on Teensy3.5/3.6
// init RNG
uint32_t seed = 0;
hwGetentropy(&seed, sizeof(seed));
randomSeed(seed); randomSeed(seed);
#else #else
randomSeed(analogRead(MY_SIGNING_SOFT_RANDOMSEED_PIN)); randomSeed(analogRead(MY_SIGNING_SOFT_RANDOMSEED_PIN));
+4
View File
@@ -74,6 +74,10 @@ void hwReboot(void);
#define MY_SERIALDEVICE Serial #define MY_SERIALDEVICE Serial
#endif #endif
#if defined(__MK64FX512__) || defined(__MK66FX1M0__)
#define MY_HW_HAS_GETENTROPY
#endif
#define MY_CRITICAL_SECTION ATOMIC_BLOCK(ATOMIC_RESTORESTATE) #define MY_CRITICAL_SECTION ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
#endif #endif
+3 -15
View File
@@ -148,11 +148,7 @@ void generate_soft_sign_hmac_key()
{ {
uint8_t key[32]; uint8_t key[32];
for (int i = 0; i < 32; i++) { while (hwGetentropy(&key, sizeof(key)) != sizeof(key));
key[i] = random(256) ^ micros();
unsigned long enter = hwMillis();
while (hwMillis() - enter < (unsigned long)2);
}
print_soft_sign_hmac_key(key); print_soft_sign_hmac_key(key);
@@ -223,11 +219,7 @@ void generate_soft_sign_serial_key()
{ {
uint8_t key[9]; uint8_t key[9];
for (int i = 0; i < 9; i++) { while (hwGetentropy(&key, sizeof(key)) != sizeof(key));
key[i] = random(256) ^ micros();
unsigned long enter = hwMillis();
while (hwMillis() - enter < (unsigned long)2);
}
print_soft_sign_serial_key(key); print_soft_sign_serial_key(key);
@@ -303,11 +295,7 @@ void generate_aes_key()
{ {
uint8_t key[16]; uint8_t key[16];
for (int i = 0; i < 16; i++) { while (hwGetentropy(&key, sizeof(key)) != sizeof(key));
key[i] = random(256) ^ micros();
unsigned long enter = hwMillis();
while (hwMillis() - enter < (unsigned long)2);
}
print_aes_key(key); print_aes_key(key);
+4
View File
@@ -90,6 +90,10 @@ MY_NODE_LOCK_FEATURE LITERAL1
MY_NODE_UNLOCK_PIN LITERAL1 MY_NODE_UNLOCK_PIN LITERAL1
MY_NODE_LOCK_COUNTER_MAX LITERAL1 MY_NODE_LOCK_COUNTER_MAX LITERAL1
# Random
MY_HW_HAS_GETENTROPY LITERAL1
hwGetentropy KEYWORD2
# SoftSPI # SoftSPI
MY_SOFTSPI LITERAL1 MY_SOFTSPI LITERAL1
MY_SOFT_SPI_SCK_PIN LITERAL1 MY_SOFT_SPI_SCK_PIN LITERAL1