| #pragma once | |
| #include <array> | |
| #include <concepts> | |
| #include <cstdint> | |
| /** | |
| * Concept for an Ethernet adaptor. | |
| */ | |
| template<typename T> | |
| concept IsEntropySource = requires(T source) | |
| { | |
| /** | |
| * Must export a flag indicating whether this is a cryptographically | |
| * secure random number. | |
| */ | |
| { | |
| T::IsSecure | |
| } -> std::convertible_to<const bool>; | |
| /** | |
| * Must return a random number. All bits of the value type are assumed to | |
| * be random, this should use a narrower type if it guarantees less | |
| * entropy. | |
| */ | |
| { | |
| source() | |
| } -> std::same_as<typename T::ValueType>; | |
| /** | |
| * Must provide a method that reseeds the entropy source. If this is a | |
| * hardware whitening engine that is continuously fed with entropy, this | |
| * may be an empty function. There are no constraints on the return type | |
| * of this. | |
| */ | |
| {source.reseed()}; | |
| }; |