Botan 1.10.17
entropy_src.h
Go to the documentation of this file.
1/*
2* EntropySource
3* (C) 2008-2009 Jack Lloyd
4*
5* Distributed under the terms of the Botan license
6*/
7
8#ifndef BOTAN_ENTROPY_SOURCE_BASE_H__
9#define BOTAN_ENTROPY_SOURCE_BASE_H__
10
11#include <botan/buf_comp.h>
12#include <string>
13
14namespace Botan {
15
16/**
17* Class used to accumulate the poll results of EntropySources
18*/
19class BOTAN_DLL Entropy_Accumulator
20 {
21 public:
22 /**
23 * Initialize an Entropy_Accumulator
24 * @param goal is how many bits we would like to collect
25 */
26 Entropy_Accumulator(size_t goal) :
27 entropy_goal(goal), collected_bits(0) {}
28
30
31 /**
32 * Get a cached I/O buffer (purely for minimizing allocation
33 * overhead to polls)
34 *
35 * @param size requested size for the I/O buffer
36 * @return cached I/O buffer for repeated polls
37 */
39 { io_buffer.resize(size); return io_buffer; }
40
41 /**
42 * @return number of bits collected so far
43 */
44 size_t bits_collected() const
45 { return static_cast<size_t>(collected_bits); }
46
47 /**
48 * @return if our polling goal has been achieved
49 */
51 { return (collected_bits >= entropy_goal); }
52
53 /**
54 * @return how many bits we need to reach our polling goal
55 */
57 {
58 if(collected_bits >= entropy_goal)
59 return 0;
60 return static_cast<size_t>(entropy_goal - collected_bits);
61 }
62
63 /**
64 * Add entropy to the accumulator
65 * @param bytes the input bytes
66 * @param length specifies how many bytes the input is
67 * @param entropy_bits_per_byte is a best guess at how much
68 * entropy per byte is in this input
69 */
70 void add(const void* bytes, size_t length, double entropy_bits_per_byte)
71 {
72 add_bytes(reinterpret_cast<const byte*>(bytes), length);
73 collected_bits += entropy_bits_per_byte * length;
74 }
75
76 /**
77 * Add entropy to the accumulator
78 * @param v is some value
79 * @param entropy_bits_per_byte is a best guess at how much
80 * entropy per byte is in this input
81 */
82 template<typename T>
83 void add(const T& v, double entropy_bits_per_byte)
84 {
85 add(&v, sizeof(T), entropy_bits_per_byte);
86 }
87 private:
88 virtual void add_bytes(const byte bytes[], size_t length) = 0;
89
90 SecureVector<byte> io_buffer;
91 size_t entropy_goal;
92 double collected_bits;
93 };
94
95/**
96* Entropy accumulator that puts the input into a Buffered_Computation
97*/
100 {
101 public:
102 /**
103 * @param sink the hash or MAC we are feeding the poll data into
104 * @param goal is how many bits we want to collect in this poll
105 */
107 size_t goal) :
108 Entropy_Accumulator(goal), entropy_sink(sink) {}
109
110 private:
111 virtual void add_bytes(const byte bytes[], size_t length)
112 {
113 entropy_sink.update(bytes, length);
114 }
115
116 Buffered_Computation& entropy_sink;
117 };
118
119/**
120* Abstract interface to a source of (hopefully unpredictable) system entropy
121*/
122class BOTAN_DLL EntropySource
123 {
124 public:
125 /**
126 * @return name identifying this entropy source
127 */
128 virtual std::string name() const = 0;
129
130 /**
131 * Perform an entropy gathering poll
132 * @param accum is an accumulator object that will be given entropy
133 */
134 virtual void poll(Entropy_Accumulator& accum) = 0;
135
136 virtual ~EntropySource() {}
137 };
138
139}
140
141#endif
virtual std::string name() const =0
virtual void poll(Entropy_Accumulator &accum)=0
Entropy_Accumulator_BufferedComputation(Buffered_Computation &sink, size_t goal)
bool polling_goal_achieved() const
Definition entropy_src.h:50
Entropy_Accumulator(size_t goal)
Definition entropy_src.h:26
MemoryRegion< byte > & get_io_buffer(size_t size)
Definition entropy_src.h:38
void add(const T &v, double entropy_bits_per_byte)
Definition entropy_src.h:83
void add(const void *bytes, size_t length, double entropy_bits_per_byte)
Definition entropy_src.h:70
size_t desired_remaining_bits() const
Definition entropy_src.h:56
size_t bits_collected() const
Definition entropy_src.h:44
void resize(size_t n)
Definition secmem.h:217