2015-09-24 10:48:16 +00:00
|
|
|
/* 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>
|
|
|
|
|
2017-07-20 06:24:45 +00:00
|
|
|
/* Return a random 32-bit number.
|
|
|
|
*
|
|
|
|
* This is also used as a substitute for rand() called from
|
|
|
|
* lmac.a:sdk_lmacTxFrame to avoid touching the newlib reent structures within
|
|
|
|
* the NMI and the NMI code needs to be in IRAM.
|
|
|
|
*/
|
|
|
|
uint32_t IRAM hwrand(void)
|
2015-09-24 10:48:16 +00:00
|
|
|
{
|
|
|
|
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));
|
|
|
|
}
|
|
|
|
}
|