Refactor Hardware RNG functions to esp/hwrand.h

As suggested by @foogod, thanks!
This commit is contained in:
Angus Gratton 2015-09-24 20:48:16 +10:00
parent 09405a9095
commit 87f77b1021
3 changed files with 51 additions and 7 deletions

27
core/esp_hwrand.c Normal file
View file

@ -0,0 +1,27 @@
/* Hardware Random Number Generator Functions
*
* For documentation, see http://esp8266-re.foogod.com/wiki/Random_Number_Generator
*
* Part of esp-open-rtos
* Copyright (C) 2015 Angus Gratton
* BSD Licensed as described in the file LICENSE
*/
#include <esp/hwrand.h>
#include <esp/wdev_regs.h>
#include <string.h>
/* Return a random 32-bit number */
uint32_t hwrand(void)
{
return WDEV.HWRNG;
}
/* Fill a variable size buffer with data from the Hardware RNG */
void hwrand_fill(uint8_t *buf, size_t len)
{
for(size_t i = 0; i < len; i+=4) {
uint32_t random = WDEV.HWRNG;
/* using memcpy here in case 'buf' is unaligned */
memcpy(buf + i, &random, (i+4 <= len) ? 4 : (len % 4));
}
}

22
core/include/esp/hwrand.h Normal file
View file

@ -0,0 +1,22 @@
/** esp/hwrand.h
*
* Hardware Random Number Generator functions.
*
* For documentation, see http://esp8266-re.foogod.com/wiki/Random_Number_Generator
*
* Part of esp-open-rtos
* Copyright (C) 2015 Angus Gratton
* BSD Licensed as described in the file LICENSE
*/
#ifndef _ESP_RNG_H
#define _ESP_RNG_H
#include <stdint.h>
#include <sys/types.h>
/* Return a random 32-bit number */
uint32_t hwrand(void);
/* Fill a variable size buffer with data from the Hardware RNG */
void hwrand_fill(uint8_t *buf, size_t len);
#endif

View file

@ -9,18 +9,13 @@
* BSD Licensed as described in the file LICENSE * BSD Licensed as described in the file LICENSE
*/ */
#include <mbedtls/entropy_poll.h> #include <mbedtls/entropy_poll.h>
#include <esp/wdev_regs.h> #include <esp/hwrand.h>
#include <string.h>
int mbedtls_hardware_poll( void *data, int mbedtls_hardware_poll( void *data,
unsigned char *output, size_t len, size_t *olen ) unsigned char *output, size_t len, size_t *olen )
{ {
(void)(data); (void)(data);
for(int i = 0; i < len; i+=4) { hwrand_fill(output, len);
uint32_t random = WDEV.HWRNG;
/* using memcpy here in case output is unaligned */
memcpy(output + i, &random, (i+4 <= len) ? 4 : (len % 4));
}
if(olen) if(olen)
*olen = len; *olen = len;
return 0; return 0;