entropy_source.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2020 HAW Hamburg
3  *
4  * This file is subject to the terms and conditions of the GNU Lesser
5  * General Public License v2.1. See the file LICENSE in the top level
6  * directory for more details.
7  */
8 
21 #ifndef ENTROPY_SOURCE_H
22 #define ENTROPY_SOURCE_H
23 
24 #ifdef __cplusplus
25 extern "C" {
26 #endif
27 
28 #include <stddef.h>
29 #include <inttypes.h>
30 #include <assert.h>
31 
35 typedef enum {
45 
49 typedef struct {
50  uint8_t old_sample;
51  uint16_t cnt_rep;
52  uint8_t c_rep;
54 
58 typedef struct {
59  uint8_t old_sample;
60  uint16_t cnt_prop;
61  uint16_t cnt_window;
62  uint16_t c_prop;
64 
70 #define ENTROPY_SOURCE_HMIN_SCALE(x) ((x * (1UL << 16)))
71 
76 #define ENTROPY_SOURCE_HMIN_SCALE_BACK(x) ((float)x / (1UL << 16))
77 
93 #ifndef CONFIG_ENTROPY_SOURCE_TESTS_WIN
94 #define CONFIG_ENTROPY_SOURCE_TESTS_WIN (512)
95 #endif
96 
103 #ifndef CONFIG_ENTROPY_SOURCE_NEUMANN_ABORT
104 #define CONFIG_ENTROPY_SOURCE_NEUMANN_ABORT (5)
105 #endif
120 typedef int (*entropy_source_sample_func_t)(uint8_t *sample);
121 
141  uint8_t *out, size_t len);
142 
161 static inline uint32_t entropy_source_test_rep_cutoff(uint32_t entropy_per_sample)
162 {
163  return (1 + ((20 * 65536) / entropy_per_sample));
164 }
165 
177 static inline int entropy_source_test_prop_cutoff(uint32_t entropy_per_sample)
178 {
179  int ret;
180 
181  if (entropy_per_sample < 49152UL) { /* 0.75 bit/sample */
182  ret = 410;
183  }
184  else if (entropy_per_sample < 98304UL) { /* 1.5 bit/sample */
185  ret = 311;
186  }
187  else if (entropy_per_sample < 196608UL) { /* 3 bit/sample */
188  ret = 177;
189  }
190  else if (entropy_per_sample < 393216UL) { /* 6 bit/sample */
191  ret = 62;
192  }
193  else if (entropy_per_sample <= 524288UL) { /* 8 bit/sample */
194  ret = 13;
195  }
196  else {
198  }
199 
200  return ret;
201 }
202 
210 static inline void entropy_source_test_rep_init(
211  entropy_source_tests_rep_t *state, uint16_t c_rep)
212 {
213  assert(state != NULL);
214 
215  state->old_sample = 0;
216  state->cnt_rep = 0;
217  state->c_rep = c_rep;
218 }
219 
227 static inline void entropy_source_test_prop_init(
228  entropy_source_tests_prop_t *state, uint16_t c_prop)
229 {
230  assert(state != NULL);
231 
232  state->old_sample = 0;
233  state->cnt_prop = 0;
235  state->c_prop = c_prop;
236 }
237 
250 
263  uint8_t sample);
264 
280 static inline int entropy_source_test(entropy_source_tests_rep_t *state_rep,
281  entropy_source_tests_prop_t *state_prop,
282  uint8_t sample)
283 {
284  int ret = ENTROPY_SOURCE_OK;
285 
286  if (entropy_source_test_rep(state_rep, sample) < 0) {
288  }
289  if (entropy_source_test_prop(state_prop, sample) < 0) {
290  /* If repetition count failed before, indicate that both tests failed */
291  if (ret == ENTROPY_SOURCE_ERR_TEST_REP) {
293  }
294  else {
296  }
297  }
298  return ret;
299 }
300 
301 #ifdef __cplusplus
302 }
303 #endif
304 
305 #endif /* ENTROPY_SOURCE_H */
POSIX.1-2008 compliant version of the assert macro.
#define assert(cond)
abort the program if assertion is false
Definition: assert.h:136
static void entropy_source_test_prop_init(entropy_source_tests_prop_t *state, uint16_t c_prop)
Initialize structure for Adaptive Proportion Test.
static uint32_t entropy_source_test_rep_cutoff(uint32_t entropy_per_sample)
Calculate cutoff value for Repetition Count Test (NIST SP 800-90B 4.4.1)
entropy_source_error_t
Entropy source error codes.
int entropy_source_test_rep(entropy_source_tests_rep_t *state, uint8_t sample)
Performs Repetition Count Test (NIST SP 800-90B 4.4.1).
static int entropy_source_test(entropy_source_tests_rep_t *state_rep, entropy_source_tests_prop_t *state_prop, uint8_t sample)
Convenience function to perform entropy_source_test_rep and entropy_source_test_prop.
int entropy_source_test_prop(entropy_source_tests_prop_t *state, uint8_t sample)
Performs Adaptive Proportion Test (NIST SP 800-90B 4.4.2).
int(* entropy_source_sample_func_t)(uint8_t *sample)
Get one sample of the entropy source.
int entropy_source_neumann_unbias(entropy_source_sample_func_t func, uint8_t *out, size_t len)
Applies von Neumann unbiasing.
static int entropy_source_test_prop_cutoff(uint32_t entropy_per_sample)
Calculate cutoff value for Adaptive Proportion Test (NIST SP 800-90B 4.4.2)
static void entropy_source_test_rep_init(entropy_source_tests_rep_t *state, uint16_t c_rep)
Initialize structure for Repetition Count Test.
@ ENTROPY_SOURCE_ERR_COND
Conditioning error.
@ ENTROPY_SOURCE_ERR_CONFIG
Source configuration error.
@ ENTROPY_SOURCE_ERR_TEST_BOTH
Repetition count and Adaptive proportion test error.
@ ENTROPY_SOURCE_ERR_TEST_PROP
Adaptive proportion test error.
@ ENTROPY_SOURCE_ERR_TEST_REP
Repetition count test error.
@ ENTROPY_SOURCE_ERR_INIT
Source initialization error.
@ ENTROPY_SOURCE_OK
Success.
#define CONFIG_ENTROPY_SOURCE_TESTS_WIN
Window size for Adaptive Proportion Test (NIST SP 800-90B 4.4.2).
Adds include for missing inttype definitions.
Data structure for Adaptive Proportion Test (NIST SP 800-90B 4.4.2).
uint16_t cnt_window
Counter to count window size.
uint16_t c_prop
Cutoff threshold.
uint16_t cnt_prop
Counter to count proportion.
uint8_t old_sample
Preceding sample to compare for repetition.
Data structure for Repetition Count Test (NIST SP 800-90B 4.4.1).
uint16_t cnt_rep
Counter to count repetition.
uint8_t old_sample
Preceding sample to compare for repetition.
uint8_t c_rep
Cutoff threshold.