esp_random: XOR the RNG register value several times before returning it
Probably unnecessary, but avoids returning internal RNG state as-is.
This commit is contained in:
parent
3922ce47b2
commit
63e9806d85
|
@ -29,13 +29,19 @@ uint32_t IRAM_ATTR esp_random(void)
|
||||||
* this function needs to wait for at least 16 APB clock cycles after reading
|
* this function needs to wait for at least 16 APB clock cycles after reading
|
||||||
* previous word. This implementation may actually wait a bit longer
|
* previous word. This implementation may actually wait a bit longer
|
||||||
* due to extra time spent in arithmetic and branch statements.
|
* due to extra time spent in arithmetic and branch statements.
|
||||||
|
*
|
||||||
|
* As a (probably unncessary) precaution to avoid returning the
|
||||||
|
* RNG state as-is, the result is XORed with additional
|
||||||
|
* WDEV_RND_REG reads while waiting.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static uint32_t last_ccount = 0;
|
static uint32_t last_ccount = 0;
|
||||||
uint32_t ccount;
|
uint32_t ccount;
|
||||||
|
uint32_t result = 0;
|
||||||
do {
|
do {
|
||||||
ccount = XTHAL_GET_CCOUNT();
|
ccount = XTHAL_GET_CCOUNT();
|
||||||
|
result ^= REG_READ(WDEV_RND_REG);
|
||||||
} while (ccount - last_ccount < XT_CLOCK_FREQ / APB_CLK_FREQ * 16);
|
} while (ccount - last_ccount < XT_CLOCK_FREQ / APB_CLK_FREQ * 16);
|
||||||
last_ccount = ccount;
|
last_ccount = ccount;
|
||||||
return REG_READ(WDEV_RND_REG);
|
return result ^ REG_READ(WDEV_RND_REG);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue