1 #ifndef _IPXE_RTC_ENTROPY_H 2 #define _IPXE_RTC_ENTROPY_H 3 4 /** @file 5 * 6 * RTC-based entropy source 7 * 8 */ 9 10 FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); 11 12 #include <stdint.h> 13 14 #ifdef ENTROPY_RTC 15 #define ENTROPY_PREFIX_rtc 16 #else 17 #define ENTROPY_PREFIX_rtc __rtc_ 18 #endif 19 20 /** 21 * min-entropy per sample 22 * 23 * @ret min_entropy min-entropy of each sample 24 */ 25 static inline __always_inline min_entropy_t ENTROPY_INLINE(rtc,min_entropy_per_sample)26ENTROPY_INLINE ( rtc, min_entropy_per_sample ) ( void ) { 27 28 /* The min-entropy has been measured on several platforms 29 * using the entropy_sample test code. Modelling the samples 30 * as independent, and using a confidence level of 99.99%, the 31 * measurements were as follows: 32 * 33 * qemu-kvm : 7.38 bits 34 * VMware : 7.46 bits 35 * Physical hardware : 2.67 bits 36 * 37 * We choose the lowest of these (2.67 bits) and apply a 50% 38 * safety margin to allow for some potential non-independence 39 * of samples. 40 */ 41 return MIN_ENTROPY ( 1.3 ); 42 } 43 44 extern uint8_t rtc_sample ( void ); 45 46 /** 47 * Get noise sample 48 * 49 * @ret noise Noise sample 50 * @ret rc Return status code 51 */ 52 static inline __always_inline int ENTROPY_INLINE(rtc,get_noise)53ENTROPY_INLINE ( rtc, get_noise ) ( noise_sample_t *noise ) { 54 55 /* Get sample */ 56 *noise = rtc_sample(); 57 58 /* Always successful */ 59 return 0; 60 } 61 62 #endif /* _IPXE_RTC_ENTROPY_H */ 63