39 lines
765 B
Python
39 lines
765 B
Python
from machine import ADC
|
|
import utime
|
|
import uhashlib
|
|
|
|
adc = ADC(26)
|
|
|
|
|
|
def get_entropy(samples: int = 512):
|
|
entropy = bytearray()
|
|
|
|
for _ in range(samples):
|
|
|
|
value = adc.read_u16()
|
|
|
|
mixed = (
|
|
value ^
|
|
(value >> 2) ^
|
|
(value >> 5) ^
|
|
utime.ticks_cpu()
|
|
) & 0xFF
|
|
|
|
entropy.append(mixed)
|
|
|
|
utime.sleep_us(5)
|
|
|
|
return entropy
|
|
|
|
def secure_random(num_bytes: int = 32):
|
|
entropy = get_entropy()
|
|
|
|
digest = uhashlib.sha256(entropy).digest()
|
|
|
|
output = bytearray()
|
|
|
|
while len(output) < num_bytes:
|
|
digest = uhashlib.sha256(digest).digest()
|
|
output.extend(digest)
|
|
|
|
return bytes(output[:num_bytes]) |