1 /** 2 * EntropySource 3 * 4 * Copyright: 5 * (C) 2008-2009,2014 Jack Lloyd 6 * (C) 2014-2015 Etienne Cimon 7 * 8 * License: 9 * Botan is released under the Simplified BSD License (see LICENSE.md) 10 */ 11 module botan.entropy.entropy_src; 12 13 import memutils.vector; 14 import botan.utils.types; 15 16 /** 17 * Class used to accumulate the poll results of EntropySources 18 */ 19 struct EntropyAccumulator 20 { 21 public: 22 /** 23 * Initialize an EntropyAccumulator 24 * Params: 25 * accum = a delegate to send the bytes and entropy value 26 */ 27 this(bool delegate(const(ubyte)*, size_t len, double) accum) 28 { 29 m_accum_fn = accum; 30 m_done = false; 31 } 32 33 ~this() {} 34 35 /** 36 * Get a cached I/O buffer (purely for minimizing allocation 37 * overhead to polls) 38 * 39 * Params: 40 * size = requested size for the I/O buffer 41 * Returns: cached I/O buffer for repeated polls 42 */ 43 ref SecureVector!ubyte getIoBuffer(size_t size) 44 { 45 m_io_buffer.clear(); 46 m_io_buffer.resize(size); 47 return m_io_buffer; 48 } 49 50 /** 51 * Returns: if our polling goal has been achieved 52 */ 53 bool pollingGoalAchieved() const { return m_done; } 54 55 /** 56 * Add entropy to the accumulator 57 * Params: 58 * bytes = the input bytes 59 * length = specifies how many bytes the input is 60 * entropy_bits_per_byte = is a best guess at how much 61 * entropy per ubyte is in this input 62 */ 63 void add(const void* bytes, size_t length, double entropy_bits_per_byte) 64 { 65 m_done = m_accum_fn(cast(const(ubyte)*)(bytes), length, entropy_bits_per_byte * length); 66 } 67 68 /** 69 * Add entropy to the accumulator 70 * Params: 71 * v = is some value 72 * entropy_bits_per_byte = is a best guess at how much 73 * entropy per ubyte is in this input 74 */ 75 void add(T)(in T v, double entropy_bits_per_byte) 76 { 77 add(&v, T.sizeof, entropy_bits_per_byte); 78 } 79 private: 80 bool delegate(const(ubyte)*, size_t, double) m_accum_fn; 81 bool m_done; 82 SecureVector!ubyte m_io_buffer; 83 } 84 85 /** 86 * Abstract interface to a source of entropy 87 */ 88 interface EntropySource 89 { 90 public: 91 /** 92 * Returns: name identifying this entropy source 93 */ 94 @property string name() const; 95 96 /** 97 * Perform an entropy gathering poll 98 * Params: 99 * accum = is an accumulator object that will be given entropy 100 */ 101 void poll(ref EntropyAccumulator accum); 102 }