|
@@ -351,6 +351,31 @@ static int get_entropy ( entropy_sample_t *entropy ) {
|
351
|
351
|
return 0;
|
352
|
352
|
}
|
353
|
353
|
|
|
354
|
+/**
|
|
355
|
+ * Calculate number of samples required for startup tests
|
|
356
|
+ *
|
|
357
|
+ * @ret num_samples Number of samples required
|
|
358
|
+ *
|
|
359
|
+ * ANS X9.82 Part 2 (October 2011 Draft) Section 8.5.2.1.5 requires
|
|
360
|
+ * that at least one full cycle of the continuous tests must be
|
|
361
|
+ * performed at start-up.
|
|
362
|
+ */
|
|
363
|
+static inline __attribute__ (( always_inline )) unsigned int
|
|
364
|
+startup_test_count ( void ) {
|
|
365
|
+ unsigned int num_samples;
|
|
366
|
+
|
|
367
|
+ /* At least max(N,C) samples shall be generated by the noise
|
|
368
|
+ * source for start-up testing.
|
|
369
|
+ */
|
|
370
|
+ num_samples = repetition_count_cutoff();
|
|
371
|
+ if ( num_samples < adaptive_proportion_cutoff() )
|
|
372
|
+ num_samples = adaptive_proportion_cutoff();
|
|
373
|
+ linker_assert ( __builtin_constant_p ( num_samples ),
|
|
374
|
+ startup_test_count_not_constant );
|
|
375
|
+
|
|
376
|
+ return num_samples;
|
|
377
|
+}
|
|
378
|
+
|
354
|
379
|
/**
|
355
|
380
|
* Create next nonce value
|
356
|
381
|
*
|
|
@@ -387,6 +412,7 @@ static uint32_t make_next_nonce ( void ) {
|
387
|
412
|
*/
|
388
|
413
|
int get_entropy_input_tmp ( unsigned int num_samples, uint8_t *tmp,
|
389
|
414
|
size_t tmp_len ) {
|
|
415
|
+ static unsigned int startup_tested = 0;
|
390
|
416
|
struct {
|
391
|
417
|
uint32_t nonce;
|
392
|
418
|
entropy_sample_t sample;
|
|
@@ -398,6 +424,12 @@ int get_entropy_input_tmp ( unsigned int num_samples, uint8_t *tmp,
|
398
|
424
|
/* Enable entropy gathering */
|
399
|
425
|
entropy_enable();
|
400
|
426
|
|
|
427
|
+ /* Perform mandatory startup tests, if not yet performed */
|
|
428
|
+ for ( ; startup_tested < startup_test_count() ; startup_tested++ ) {
|
|
429
|
+ if ( ( rc = get_entropy ( &data.sample ) ) != 0 )
|
|
430
|
+ goto err_get_entropy;
|
|
431
|
+ }
|
|
432
|
+
|
401
|
433
|
/* 3. entropy_total = 0
|
402
|
434
|
*
|
403
|
435
|
* (Nothing to do; the number of entropy samples required has
|