summaryrefslogtreecommitdiff
path: root/src/drivers/ao_trng_send.c
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2016-08-02 16:26:49 -0700
committerKeith Packard <keithp@keithp.com>2016-08-02 16:55:11 -0700
commit826ad792389150ea8d80e341cb8ea023db83c9a2 (patch)
tree3cd1aba84ec58761c4d3374a9386177a9dc4e6a2 /src/drivers/ao_trng_send.c
parent1934468e96ea9d179abf6e3e728b6b14ce793f46 (diff)
altos: Use standard FIPS testing for chaoskey
Check to make sure we aren't repeating a block coming from the unwhitened source, which is the standard online FIPS test for RNGs. Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'src/drivers/ao_trng_send.c')
-rw-r--r--src/drivers/ao_trng_send.c30
1 files changed, 7 insertions, 23 deletions
diff --git a/src/drivers/ao_trng_send.c b/src/drivers/ao_trng_send.c
index 00efa8d9..85034efd 100644
--- a/src/drivers/ao_trng_send.c
+++ b/src/drivers/ao_trng_send.c
@@ -97,18 +97,7 @@ ao_trng_send_raw(void)
#endif
-/* Make sure there's at least 8 bits of variance in the samples */
-#define MIN_VARIANCE (128 * 128)
-
-/* Make sure the signal is spread around a bit */
-#define MAX_VARIANCE (512 * 512)
-
-#define ADD_STATS(value) do { \
- sum += (value); \
- sum2 += (value) * (value); \
- } while(0)
-
-#define VARIANCE(n) ((sum2 - (sum / (n) * sum)) / (n))
+static uint32_t previous[AO_USB_IN_SIZE / sizeof (uint16_t)];
static int
ao_trng_get_cooked(uint16_t *buf)
@@ -116,29 +105,24 @@ ao_trng_get_cooked(uint16_t *buf)
uint16_t i;
uint16_t t;
uint32_t *rnd = (uint32_t *) ao_adc_ring;
- int32_t sum, sum2, var;
+ uint8_t mismatch = 0;
- sum = sum2 = 0;
t = ao_adc_get(AO_USB_IN_SIZE) >> 1; /* one 16-bit value per output byte */
for (i = 0; i < AO_USB_IN_SIZE / sizeof (uint16_t); i++) {
uint32_t v;
- uint16_t v1, v2;
/* Fetch two values in one operation */
v = rnd[t];
+ if (v != previous[i]) {
+ mismatch = 1;
+ previous[i] = v;
+ }
t = (t + 1) & ((AO_ADC_RING_SIZE >> 1) - 1);
*buf++ = ao_crc_in_32_out_16(v);
-
- v1 = v;
- v2 = v >> 16;
-
- ADD_STATS(v1);
- ADD_STATS(v2);
}
ao_adc_ack(AO_USB_IN_SIZE);
- var = VARIANCE(2 * AO_USB_IN_SIZE / sizeof (uint16_t));
- return var >= MIN_VARIANCE && var <= MAX_VARIANCE;
+ return mismatch;
}
#define AO_TRNG_START_WAIT 1024