f630d2a05835ad002fe54279b5adf777036287b0
[gnuk/gnuk.git] / src / neug.c
1 /*
2  * neug.c - true random number generation
3  *
4  * Copyright (C) 2011, 2012, 2013, 2016, 2017
5  *               Free Software Initiative of Japan
6  * Author: NIIBE Yutaka <gniibe@fsij.org>
7  *
8  * This file is a part of NeuG, a True Random Number Generator
9  * implementation based on quantization error of ADC (for STM32F103).
10  *
11  * NeuG is free software: you can redistribute it and/or modify it
12  * under the terms of the GNU General Public License as published by
13  * the Free Software Foundation, either version 3 of the License, or
14  * (at your option) any later version.
15  *
16  * NeuG is distributed in the hope that it will be useful, but WITHOUT
17  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
18  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
19  * License for more details.
20  *
21  * You should have received a copy of the GNU General Public License
22  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
23  *
24  */
25
26 #include <stdint.h>
27 #include <string.h>
28 #include <chopstx.h>
29
30 #include "sys.h"
31 #include "neug.h"
32 #ifndef GNU_LINUX_EMULATION
33 #include "mcu/stm32.h"
34 #include "mcu/stm32f103.h"
35 #endif
36 #include "adc.h"
37 #include "sha256.h"
38
39 #ifdef GNU_LINUX_EMULATION
40 static const uint32_t crc32_rv_table[256] = {
41   0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x130476dc, 0x17c56b6b,
42   0x1a864db2, 0x1e475005, 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61,
43   0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd, 0x4c11db70, 0x48d0c6c7,
44   0x4593e01e, 0x4152fda9, 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75,
45   0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011, 0x791d4014, 0x7ddc5da3,
46   0x709f7b7a, 0x745e66cd, 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,
47   0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, 0xbe2b5b58, 0xbaea46ef,
48   0xb7a96036, 0xb3687d81, 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d,
49   0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49, 0xc7361b4c, 0xc3f706fb,
50   0xceb42022, 0xca753d95, 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1,
51   0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, 0x34867077, 0x30476dc0,
52   0x3d044b19, 0x39c556ae, 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072,
53   0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16, 0x018aeb13, 0x054bf6a4,
54   0x0808d07d, 0x0cc9cdca, 0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde,
55   0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02, 0x5e9f46bf, 0x5a5e5b08,
56   0x571d7dd1, 0x53dc6066, 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,
57   0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, 0xbfa1b04b, 0xbb60adfc,
58   0xb6238b25, 0xb2e29692, 0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6,
59   0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a, 0xe0b41de7, 0xe4750050,
60   0xe9362689, 0xedf73b3e, 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2,
61   0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686, 0xd5b88683, 0xd1799b34,
62   0xdc3abded, 0xd8fba05a, 0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637,
63   0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb, 0x4f040d56, 0x4bc510e1,
64   0x46863638, 0x42472b8f, 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53,
65   0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47, 0x36194d42, 0x32d850f5,
66   0x3f9b762c, 0x3b5a6b9b, 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,
67   0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, 0xf12f560e, 0xf5ee4bb9,
68   0xf8ad6d60, 0xfc6c70d7, 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b,
69   0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f, 0xc423cd6a, 0xc0e2d0dd,
70   0xcda1f604, 0xc960ebb3, 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7,
71   0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, 0x9b3660c6, 0x9ff77d71,
72   0x92b45ba8, 0x9675461f, 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3,
73   0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640, 0x4e8ee645, 0x4a4ffbf2,
74   0x470cdd2b, 0x43cdc09c, 0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8,
75   0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24, 0x119b4be9, 0x155a565e,
76   0x18197087, 0x1cd86d30, 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,
77   0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, 0x2497d08d, 0x2056cd3a,
78   0x2d15ebe3, 0x29d4f654, 0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0,
79   0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c, 0xe3a1cbc1, 0xe760d676,
80   0xea23f0af, 0xeee2ed18, 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4,
81   0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0, 0x9abc8bd5, 0x9e7d9662,
82   0x933eb0bb, 0x97ffad0c, 0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668,
83   0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4
84 };
85
86 static uint32_t crc;
87
88 void
89 crc32_rv_reset (void)
90 {
91   crc = 0xffffffff;
92 }
93
94 void
95 crc32_rv_step (uint32_t v)
96 {
97   crc = crc32_rv_table[(crc ^ (v << 0))  >> 24] ^ (crc << 8);
98   crc = crc32_rv_table[(crc ^ (v << 8))  >> 24] ^ (crc << 8);
99   crc = crc32_rv_table[(crc ^ (v << 16)) >> 24] ^ (crc << 8);
100   crc = crc32_rv_table[(crc ^ (v << 24)) >> 24] ^ (crc << 8);
101 }
102
103 uint32_t
104 crc32_rv_get (void)
105 {
106   return crc;
107 }
108
109 uint32_t
110 rbit (uint32_t v)
111 {
112   v = ((v >> 1) & 0x55555555) | ((v & 0x55555555) << 1);
113   v = ((v >> 2) & 0x33333333) | ((v & 0x33333333) << 2);
114   v = ((v >> 4) & 0x0F0F0F0F) | ((v & 0x0F0F0F0F) << 4);
115   v = ((v >> 8) & 0x00FF00FF) | ((v & 0x00FF00FF) << 8);
116   v = ( v >> 16             ) | ( v               << 16);
117   return v;
118 }
119 #else
120 void
121 crc32_rv_reset (void)
122 {
123   RCC->AHBENR |= RCC_AHBENR_CRCEN;
124   CRC->CR = CRC_CR_RESET;
125 }
126
127 void
128 crc32_rv_step (uint32_t v)
129 {
130   CRC->DR = v;
131 }
132
133 uint32_t
134 crc32_rv_get (void)
135 {
136   return CRC->DR;
137 }
138
139 uint32_t
140 rbit (uint32_t v)
141 {
142   uint32_t r;
143
144   asm ("rbit    %0, %1" : "=r" (r) : "r" (v));
145   return r;
146 }
147
148 void
149 crc32_rv_stop (void)
150 {
151   RCC->AHBENR &= ~RCC_AHBENR_CRCEN;
152 }
153 #endif
154
155 static chopstx_mutex_t mode_mtx;
156 static chopstx_cond_t  mode_cond;
157
158 static sha256_context sha256_ctx_data;
159 static uint32_t sha256_output[SHA256_DIGEST_SIZE/sizeof (uint32_t)];
160
161 /*
162  * To be a full entropy source, the requirement is to have N samples
163  * for output of 256-bit, where:
164  *
165  *      N = (256 * 2) / <min-entropy of a sample>
166  *
167  * For example, N should be more than 103 for min-entropy = 5.0.
168  *
169  * On the other hand, in the section 6.2 "Full Entropy Source
170  * Requirements", it says:
171  *
172  *     At least twice the block size of the underlying cryptographic
173  *     primitive shall be provided as input to the conditioning
174  *     function to produce full entropy output.
175  *
176  * For us, cryptographic primitive is SHA-256 and its blocksize is
177  * 512-bit (64-byte), thus, N >= 128.
178  *
179  * We chose N=140.  Note that we have "additional bits" of 16-byte for
180  * last block (feedback from previous output of SHA-256) to feed
181  * hash_df function of SHA-256, together with sample data of 140-byte.
182  *
183  * N=140 corresponds to min-entropy >= 3.68.
184  *
185  */
186 #define NUM_NOISE_INPUTS 140
187
188 #define EP_ROUND_0 0 /* initial-five-byte and 3-byte, then 56-byte-input */
189 #define EP_ROUND_1 1 /* 64-byte-input */
190 #define EP_ROUND_2 2 /* 17-byte-input */
191 #define EP_ROUND_RAW      3 /* 32-byte-input */
192 #define EP_ROUND_RAW_DATA 4 /* 32-byte-input */
193
194 #define EP_ROUND_0_INPUTS 56
195 #define EP_ROUND_1_INPUTS 64
196 #define EP_ROUND_2_INPUTS 17
197 #define EP_ROUND_RAW_INPUTS 32
198 #define EP_ROUND_RAW_DATA_INPUTS 32
199
200 static uint8_t ep_round;
201
202 static void noise_source_continuous_test (uint8_t noise);
203 static void noise_source_continuous_test_word (uint8_t b0, uint8_t b1,
204                                                uint8_t b2, uint8_t b3);
205
206 /*
207  * Hash_df initial string:
208  *
209  *  Initial five bytes are:
210  *    1,          : counter = 1
211  *    0, 0, 1, 0  : no_of_bits_returned (in big endian)
212  *
213  *  Then, three-byte from noise source follows.
214  *
215  *  One-byte was used in the previous turn, and we have three bytes in
216  *  CRC32.
217  */
218 static void ep_fill_initial_string (void)
219 {
220   uint32_t v = crc32_rv_get ();
221   uint8_t b1, b2, b3;
222
223   b3 = v >> 24;
224   b2 = v >> 16;
225   b1 = v >> 8;
226
227   noise_source_continuous_test (b1);
228   noise_source_continuous_test (b2);
229   noise_source_continuous_test (b3);
230
231   adc_buf[0] = 0x01000001;
232   adc_buf[1] = (v & 0xffffff00);
233 }
234
235 static void ep_init (int mode)
236 {
237   if (mode == NEUG_MODE_RAW)
238     {
239       ep_round = EP_ROUND_RAW;
240       adc_start_conversion (0, EP_ROUND_RAW_INPUTS);
241     }
242   else if (mode == NEUG_MODE_RAW_DATA)
243     {
244       ep_round = EP_ROUND_RAW_DATA;
245       adc_start_conversion (0, EP_ROUND_RAW_DATA_INPUTS / 4);
246     }
247   else
248     {
249       ep_round = EP_ROUND_0;
250       ep_fill_initial_string ();
251       adc_start_conversion (2, EP_ROUND_0_INPUTS);
252     }
253 }
254
255
256 static void ep_fill_wbuf_v (int i, int test, uint32_t v)
257 {
258   if (test)
259     {
260       uint8_t b0, b1, b2, b3;
261
262       b3 = v >> 24;
263       b2 = v >> 16;
264       b1 = v >> 8;
265       b0 = v;
266
267       noise_source_continuous_test_word (b0, b1, b2, b3);
268     }
269
270   sha256_ctx_data.wbuf[i] = v;
271 }
272
273 /* Here, we assume a little endian architecture.  */
274 static int ep_process (int mode)
275 {
276   int i, n;
277   uint32_t v;
278
279   if (ep_round == EP_ROUND_0)
280     {
281       sha256_start (&sha256_ctx_data);
282       sha256_ctx_data.wbuf[0] = adc_buf[0];
283       sha256_ctx_data.wbuf[1] = adc_buf[1];
284       for (i = 0; i < EP_ROUND_0_INPUTS / 4; i++)
285         {
286           crc32_rv_step (adc_buf[i*4 + 2]);
287           crc32_rv_step (adc_buf[i*4 + 3]);
288           crc32_rv_step (adc_buf[i*4 + 4]);
289           crc32_rv_step (adc_buf[i*4 + 5]);
290           v = crc32_rv_get ();
291           ep_fill_wbuf_v (i+2, 1, v);
292         }
293
294       adc_start_conversion (0, EP_ROUND_1_INPUTS);
295       sha256_process (&sha256_ctx_data);
296       ep_round++;
297       return 0;
298     }
299   else if (ep_round == EP_ROUND_1)
300     {
301       for (i = 0; i < EP_ROUND_1_INPUTS / 4; i++)
302         {
303           crc32_rv_step (adc_buf[i*4]);
304           crc32_rv_step (adc_buf[i*4 + 1]);
305           crc32_rv_step (adc_buf[i*4 + 2]);
306           crc32_rv_step (adc_buf[i*4 + 3]);
307           v = crc32_rv_get ();
308           ep_fill_wbuf_v (i, 1, v);
309         }
310
311       adc_start_conversion (0, EP_ROUND_2_INPUTS + 3);
312       sha256_process (&sha256_ctx_data);
313       ep_round++;
314       return 0;
315     }
316   else if (ep_round == EP_ROUND_2)
317     {
318       for (i = 0; i < EP_ROUND_2_INPUTS / 4; i++)
319         {
320           crc32_rv_step (adc_buf[i*4]);
321           crc32_rv_step (adc_buf[i*4 + 1]);
322           crc32_rv_step (adc_buf[i*4 + 2]);
323           crc32_rv_step (adc_buf[i*4 + 3]);
324           v = crc32_rv_get ();
325           ep_fill_wbuf_v (i, 1, v);
326         }
327
328       crc32_rv_step (adc_buf[i*4]);
329       crc32_rv_step (adc_buf[i*4 + 1]);
330       crc32_rv_step (adc_buf[i*4 + 2]);
331       crc32_rv_step (adc_buf[i*4 + 3]);
332       v = crc32_rv_get () & 0xff;   /* First byte of CRC32 is used here.  */
333       noise_source_continuous_test (v);
334       sha256_ctx_data.wbuf[i] = v;
335       ep_init (NEUG_MODE_CONDITIONED); /* The rest three-byte of
336                                           CRC32 is used here.  */
337       n = SHA256_DIGEST_SIZE / 2;
338       memcpy (((uint8_t *)sha256_ctx_data.wbuf) + EP_ROUND_2_INPUTS,
339               sha256_output, n);
340       sha256_ctx_data.total[0] = 5 + NUM_NOISE_INPUTS + n;
341       sha256_finish (&sha256_ctx_data, (uint8_t *)sha256_output);
342       return SHA256_DIGEST_SIZE / sizeof (uint32_t);
343     }
344   else if (ep_round == EP_ROUND_RAW)
345     {
346       for (i = 0; i < EP_ROUND_RAW_INPUTS / 4; i++)
347         {
348           crc32_rv_step (adc_buf[i*4]);
349           crc32_rv_step (adc_buf[i*4 + 1]);
350           crc32_rv_step (adc_buf[i*4 + 2]);
351           crc32_rv_step (adc_buf[i*4 + 3]);
352           v = crc32_rv_get ();
353           ep_fill_wbuf_v (i, 1, v);
354         }
355
356       ep_init (mode);
357       return EP_ROUND_RAW_INPUTS / 4;
358     }
359   else if (ep_round == EP_ROUND_RAW_DATA)
360     {
361       for (i = 0; i < EP_ROUND_RAW_DATA_INPUTS / 4; i++)
362         {
363           v = adc_buf[i];
364           ep_fill_wbuf_v (i, 0, v);
365         }
366
367       ep_init (mode);
368       return EP_ROUND_RAW_DATA_INPUTS / 4;
369     }
370
371   return 0;
372 }
373
374
375 static const uint32_t *ep_output (int mode)
376 {
377   if (mode)
378     return sha256_ctx_data.wbuf;
379   else
380     return sha256_output;
381 }
382 \f
383 #define REPETITION_COUNT           1
384 #define ADAPTIVE_PROPORTION_64     2
385 #define ADAPTIVE_PROPORTION_4096   4
386
387 uint8_t neug_err_state;
388 uint16_t neug_err_cnt;
389 uint16_t neug_err_cnt_rc;
390 uint16_t neug_err_cnt_p64;
391 uint16_t neug_err_cnt_p4k;
392
393 uint16_t neug_rc_max;
394 uint16_t neug_p64_max;
395 uint16_t neug_p4k_max;
396
397 static void noise_source_cnt_max_reset (void)
398 {
399   neug_err_cnt = neug_err_cnt_rc = neug_err_cnt_p64 = neug_err_cnt_p4k = 0;
400   neug_rc_max = neug_p64_max = neug_p4k_max = 0;
401 }
402
403 static void noise_source_error_reset (void)
404 {
405   neug_err_state = 0;
406 }
407
408 static void noise_source_error (uint32_t err)
409 {
410   neug_err_state |= err;
411   neug_err_cnt++;
412
413   if ((err & REPETITION_COUNT))
414     neug_err_cnt_rc++;
415   if ((err & ADAPTIVE_PROPORTION_64))
416     neug_err_cnt_p64++;
417   if ((err & ADAPTIVE_PROPORTION_4096))
418     neug_err_cnt_p4k++;
419 }
420
421 /*
422  * For health tests, we assume that the device noise source has
423  * min-entropy >= 4.2.  Observing raw data stream (before CRC-32) has
424  * more than 4.2 bit/byte entropy.  When the data stream after CRC-32
425  * filter will be less than 4.2 bit/byte entropy, that must be
426  * something wrong.  Note that even we observe < 4.2, we still have
427  * some margin, since we use NUM_NOISE_INPUTS=140.
428  *
429  */
430
431 /* Cuttoff = 9, when min-entropy = 4.2, W= 2^-30 */
432 /* ceiling of (1+30/4.2) */
433 #define REPITITION_COUNT_TEST_CUTOFF 9
434
435 static uint8_t rct_a;
436 static uint8_t rct_b;
437
438 static void repetition_count_test (uint8_t sample)
439 {
440   if (rct_a == sample)
441     {
442       rct_b++;
443       if (rct_b >= REPITITION_COUNT_TEST_CUTOFF)
444         noise_source_error (REPETITION_COUNT);
445       if (rct_b > neug_rc_max)
446         neug_rc_max = rct_b;
447    }
448   else
449     {
450       rct_a = sample;
451       rct_b = 1;
452     }
453 }
454
455 static void repetition_count_test_word (uint8_t b0, uint8_t b1,
456                                         uint8_t b2, uint8_t b3)
457 {
458   if (rct_a == b0)
459     rct_b++;
460   else
461     {
462       rct_a = b0;
463       rct_b = 1;
464     }
465
466   if (rct_a == b1)
467     rct_b++;
468   else
469     {
470       rct_a = b1;
471       rct_b = 1;
472     }
473
474   if (rct_a == b2)
475     rct_b++;
476   else
477     {
478       rct_a = b2;
479       rct_b = 1;
480     }
481
482   if (rct_a == b3)
483     rct_b++;
484   else
485     {
486       rct_a = b3;
487       rct_b = 1;
488     }
489
490   if (rct_b >= REPITITION_COUNT_TEST_CUTOFF)
491     noise_source_error (REPETITION_COUNT);
492   if (rct_b > neug_rc_max)
493     neug_rc_max = rct_b;
494 }
495
496 /* Cuttoff = 18, when min-entropy = 4.2, W= 2^-30 */
497 /* With R, qbinom(1-2^-30,64,2^-4.2) */
498 #define ADAPTIVE_PROPORTION_64_TEST_CUTOFF 18
499
500 static uint8_t ap64t_a;
501 static uint8_t ap64t_b;
502 static uint8_t ap64t_s;
503
504 static void adaptive_proportion_64_test (uint8_t sample)
505 {
506   if (ap64t_s++ >= 64)
507     {
508       ap64t_a = sample;
509       ap64t_s = 1;
510       ap64t_b = 0;
511     }
512   else
513     if (ap64t_a == sample)
514       {
515         ap64t_b++;
516         if (ap64t_b > ADAPTIVE_PROPORTION_64_TEST_CUTOFF)
517           noise_source_error (ADAPTIVE_PROPORTION_64);
518         if (ap64t_b > neug_p64_max)
519           neug_p64_max = ap64t_b;
520       }
521 }
522
523 static void adaptive_proportion_64_test_word (uint8_t b0, uint8_t b1,
524                                               uint8_t b2, uint8_t b3)
525 {
526   if (ap64t_s >= 64)
527     {
528       ap64t_a = b0;
529       ap64t_s = 4;
530       ap64t_b = 0;
531     }
532   else
533     {
534       ap64t_s += 4;
535
536       if (ap64t_a == b0)
537         ap64t_b++;
538     }
539
540   if (ap64t_a == b1)
541     ap64t_b++;
542
543   if (ap64t_a == b2)
544     ap64t_b++;
545
546   if (ap64t_a == b3)
547     ap64t_b++;
548
549   if (ap64t_b > ADAPTIVE_PROPORTION_64_TEST_CUTOFF)
550     noise_source_error (ADAPTIVE_PROPORTION_64);
551   if (ap64t_b > neug_p64_max)
552     neug_p64_max = ap64t_b;
553 }
554
555 /* Cuttoff = 315, when min-entropy = 4.2, W= 2^-30 */
556 /* With R, qbinom(1-2^-30,4096,2^-4.2) */
557 #define ADAPTIVE_PROPORTION_4096_TEST_CUTOFF 315
558
559 static uint8_t ap4096t_a;
560 static uint16_t ap4096t_b;
561 static uint16_t ap4096t_s;
562
563 static void adaptive_proportion_4096_test (uint8_t sample)
564 {
565   if (ap4096t_s++ >= 4096)
566     {
567       ap4096t_a = sample;
568       ap4096t_s = 1;
569       ap4096t_b = 0;
570     }
571   else
572     if (ap4096t_a == sample)
573       {
574         ap4096t_b++;
575         if (ap4096t_b > ADAPTIVE_PROPORTION_4096_TEST_CUTOFF)
576           noise_source_error (ADAPTIVE_PROPORTION_4096);
577         if (ap4096t_b > neug_p4k_max)
578           neug_p4k_max = ap4096t_b;
579       }
580 }
581
582 static void adaptive_proportion_4096_test_word (uint8_t b0, uint8_t b1,
583                                                 uint8_t b2, uint8_t b3)
584 {
585   if (ap4096t_s >= 4096)
586     {
587       ap4096t_a = b0;
588       ap4096t_s = 4;
589       ap4096t_b = 0;
590     }
591   else
592     {
593       ap4096t_s += 4;
594
595       if (ap4096t_a == b0)
596         ap4096t_b++;
597     }
598
599   if (ap4096t_a == b1)
600     ap4096t_b++;
601
602   if (ap4096t_a == b2)
603         ap4096t_b++;
604
605   if (ap4096t_a == b3)
606     ap4096t_b++;
607
608   if (ap4096t_b > ADAPTIVE_PROPORTION_4096_TEST_CUTOFF)
609     noise_source_error (ADAPTIVE_PROPORTION_4096);
610   if (ap4096t_b > neug_p4k_max)
611     neug_p4k_max = ap4096t_b;
612 }
613
614
615 static void noise_source_continuous_test (uint8_t noise)
616 {
617   repetition_count_test (noise);
618   adaptive_proportion_64_test (noise);
619   adaptive_proportion_4096_test (noise);
620 }
621
622 static void noise_source_continuous_test_word (uint8_t b0, uint8_t b1,
623                                                uint8_t b2, uint8_t b3)
624 {
625   repetition_count_test_word (b0, b1, b2, b3);
626   adaptive_proportion_64_test_word (b0, b1, b2, b3);
627   adaptive_proportion_4096_test_word (b0, b1, b2, b3);
628 }
629 \f
630 /*
631  * Ring buffer, filled by generator, consumed by neug_get routine.
632  */
633 struct rng_rb {
634   uint32_t *buf;
635   chopstx_mutex_t m;
636   chopstx_cond_t data_available;
637   chopstx_cond_t space_available;
638   uint8_t head, tail;
639   uint8_t size;
640   unsigned int full :1;
641   unsigned int empty :1;
642 };
643
644 static void rb_init (struct rng_rb *rb, uint32_t *p, uint8_t size)
645 {
646   rb->buf = p;
647   rb->size = size;
648   chopstx_mutex_init (&rb->m);
649   chopstx_cond_init (&rb->data_available);
650   chopstx_cond_init (&rb->space_available);
651   rb->head = rb->tail = 0;
652   rb->full = 0;
653   rb->empty = 1;
654 }
655
656 static void rb_add (struct rng_rb *rb, uint32_t v)
657 {
658   rb->buf[rb->tail++] = v;
659   if (rb->tail == rb->size)
660     rb->tail = 0;
661   if (rb->tail == rb->head)
662     rb->full = 1;
663   rb->empty = 0;
664 }
665
666 static uint32_t rb_del (struct rng_rb *rb)
667 {
668   uint32_t v = rb->buf[rb->head++];
669
670   if (rb->head == rb->size)
671     rb->head = 0;
672   if (rb->head == rb->tail)
673     rb->empty = 1;
674   rb->full = 0;
675
676   return v;
677 }
678
679 uint8_t neug_mode;
680 static int rng_should_terminate;
681 static chopstx_t rng_thread;
682
683
684 /**
685  * @brief Random number generation thread.
686  */
687 static void *
688 rng (void *arg)
689 {
690   struct rng_rb *rb = (struct rng_rb *)arg;
691   int mode = neug_mode;
692
693   rng_should_terminate = 0;
694   chopstx_mutex_init (&mode_mtx);
695   chopstx_cond_init (&mode_cond);
696
697   /* Enable ADCs */
698   adc_start ();
699
700   ep_init (mode);
701   while (!rng_should_terminate)
702     {
703       int err;
704       int n;
705
706       err = adc_wait_completion ();
707
708       chopstx_mutex_lock (&mode_mtx);
709       if (err || mode != neug_mode)
710         {
711           mode = neug_mode;
712
713           noise_source_cnt_max_reset ();
714
715           /* Discarding data available, re-initiate from the start.  */
716           ep_init (mode);
717           chopstx_cond_signal (&mode_cond);
718           chopstx_mutex_unlock (&mode_mtx);
719           continue;
720         }
721       else
722         chopstx_mutex_unlock (&mode_mtx);
723
724       if ((n = ep_process (mode)))
725         {
726           int i;
727           const uint32_t *vp;
728
729           if (neug_err_state != 0
730               && (mode == NEUG_MODE_CONDITIONED || mode == NEUG_MODE_RAW))
731             {
732               /* Don't use the result and do it again.  */
733               noise_source_error_reset ();
734               continue;
735             }
736
737           vp = ep_output (mode);
738
739           chopstx_mutex_lock (&rb->m);
740           while (rb->full)
741             chopstx_cond_wait (&rb->space_available, &rb->m);
742
743           for (i = 0; i < n; i++)
744             {
745               rb_add (rb, *vp++);
746               if (rb->full)
747                 break;
748             }
749
750           chopstx_cond_signal (&rb->data_available);
751           chopstx_mutex_unlock (&rb->m);
752         }
753     }
754
755   adc_stop ();
756
757   return NULL;
758 }
759
760 static struct rng_rb the_ring_buffer;
761
762 #define STACK_PROCESS_2
763 #include "stack-def.h"
764 #define STACK_ADDR_RNG ((uintptr_t)process2_base)
765 #define STACK_SIZE_RNG (sizeof process2_base)
766
767 #define PRIO_RNG 2
768
769 /**
770  * @brief Initialize NeuG.
771  */
772 void
773 neug_init (uint32_t *buf, uint8_t size)
774 {
775   const uint32_t *u = (const uint32_t *)unique_device_id ();
776   struct rng_rb *rb = &the_ring_buffer;
777   int i;
778
779   crc32_rv_reset ();
780
781   /*
782    * This initialization ensures that it generates different sequence
783    * even if all physical conditions are same.
784    */
785   for (i = 0; i < 3; i++)
786     crc32_rv_step (*u++);
787
788   neug_mode = NEUG_MODE_CONDITIONED;
789   rb_init (rb, buf, size);
790
791   rng_thread = chopstx_create (PRIO_RNG, STACK_ADDR_RNG, STACK_SIZE_RNG,
792                                rng, rb);
793 }
794
795 /**
796  * @breif Flush random bytes.
797  */
798 void
799 neug_flush (void)
800 {
801   struct rng_rb *rb = &the_ring_buffer;
802
803   chopstx_mutex_lock (&rb->m);
804   while (!rb->empty)
805     (void)rb_del (rb);
806   chopstx_cond_signal (&rb->space_available);
807   chopstx_mutex_unlock (&rb->m);
808 }
809
810
811 /**
812  * @brief  Wakes up RNG thread to generate random numbers.
813  */
814 void
815 neug_kick_filling (void)
816 {
817   struct rng_rb *rb = &the_ring_buffer;
818
819   chopstx_mutex_lock (&rb->m);
820   if (!rb->full)
821     chopstx_cond_signal (&rb->space_available);
822   chopstx_mutex_unlock (&rb->m);
823 }
824
825 /**
826  * @brief  Get random word (32-bit) from NeuG.
827  * @detail With NEUG_KICK_FILLING, it wakes up RNG thread.
828  *         With NEUG_NO_KICK, it doesn't wake up RNG thread automatically,
829  *         it is needed to call neug_kick_filling later.
830  */
831 uint32_t
832 neug_get (int kick)
833 {
834   struct rng_rb *rb = &the_ring_buffer;
835   uint32_t v;
836
837   chopstx_mutex_lock (&rb->m);
838   while (rb->empty)
839     chopstx_cond_wait (&rb->data_available, &rb->m);
840   v = rb_del (rb);
841   if (kick)
842     chopstx_cond_signal (&rb->space_available);
843   chopstx_mutex_unlock (&rb->m);
844
845   return v;
846 }
847
848 int
849 neug_get_nonblock (uint32_t *p)
850 {
851   struct rng_rb *rb = &the_ring_buffer;
852   int r = 0;
853
854   chopstx_mutex_lock (&rb->m);
855   if (rb->empty)
856     {
857       r = -1;
858       chopstx_cond_signal (&rb->space_available);
859     }
860   else
861     *p = rb_del (rb);
862   chopstx_mutex_unlock (&rb->m);
863
864   return r;
865 }
866
867 int neug_consume_random (void (*proc) (uint32_t, int))
868 {
869   int i = 0;
870   struct rng_rb *rb = &the_ring_buffer;
871
872   chopstx_mutex_lock (&rb->m);
873   while (!rb->empty)
874     {
875       uint32_t v;
876
877       v = rb_del (rb);
878       proc (v, i);
879       i++;
880     }
881   chopstx_cond_signal (&rb->space_available);
882   chopstx_mutex_unlock (&rb->m);
883
884   return i;
885 }
886
887 void
888 neug_wait_full (void)
889 {
890   struct rng_rb *rb = &the_ring_buffer;
891
892   chopstx_mutex_lock (&rb->m);
893   while (!rb->full)
894     chopstx_cond_wait (&rb->data_available, &rb->m);
895   chopstx_mutex_unlock (&rb->m);
896 }
897
898 void
899 neug_fini (void)
900 {
901   rng_should_terminate = 1;
902   neug_get (1);
903   chopstx_join (rng_thread, NULL);
904   crc32_rv_stop ();
905 }
906
907 void
908 neug_mode_select (uint8_t mode)
909 {
910   if (neug_mode == mode)
911     return;
912
913   neug_wait_full ();
914
915   chopstx_mutex_lock (&mode_mtx);
916   neug_mode = mode;
917   neug_flush ();
918   chopstx_cond_wait (&mode_cond, &mode_mtx);
919   chopstx_mutex_unlock (&mode_mtx);
920
921   neug_wait_full ();
922   neug_flush ();
923 }