diff options
Diffstat (limited to 'src/entropy/buf_es/buf_es.cpp')
-rw-r--r-- | src/entropy/buf_es/buf_es.cpp | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/src/entropy/buf_es/buf_es.cpp b/src/entropy/buf_es/buf_es.cpp new file mode 100644 index 000000000..19f30e22c --- /dev/null +++ b/src/entropy/buf_es/buf_es.cpp @@ -0,0 +1,89 @@ +/************************************************* +* Buffered EntropySource Source File * +* (C) 1999-2007 Jack Lloyd * +*************************************************/ + +#include <botan/buf_es.h> +#include <botan/xor_buf.h> +#include <botan/util.h> +#include <algorithm> + +namespace Botan { + +/************************************************* +* Buffered_EntropySource Constructor * +*************************************************/ +Buffered_EntropySource::Buffered_EntropySource() : buffer(256) + { + read_pos = write_pos = 0; + done_slow_poll = false; + } + +/************************************************* +* Fast Poll * +*************************************************/ +u32bit Buffered_EntropySource::fast_poll(byte out[], u32bit length) + { + if(!done_slow_poll) { do_slow_poll(); done_slow_poll = true; } + + do_fast_poll(); + return copy_out(out, length, buffer.size() / 4); + } + +/************************************************* +* Slow Poll * +*************************************************/ +u32bit Buffered_EntropySource::slow_poll(byte out[], u32bit length) + { + do_slow_poll(); + done_slow_poll = true; + return copy_out(out, length, buffer.size()); + } + +/************************************************* +* Default fast poll operation * +*************************************************/ +void Buffered_EntropySource::do_fast_poll() + { + return do_slow_poll(); + } + +/************************************************* +* Add entropy to the internal buffer * +*************************************************/ +void Buffered_EntropySource::add_bytes(const void* entropy_ptr, u32bit length) + { + const byte* bytes = static_cast<const byte*>(entropy_ptr); + + while(length) + { + u32bit copied = std::min(length, buffer.size() - write_pos); + xor_buf(buffer + write_pos, bytes, copied); + bytes += copied; + length -= copied; + write_pos = (write_pos + copied) % buffer.size(); + } + } + +/************************************************* +* Add entropy to the internal buffer * +*************************************************/ +void Buffered_EntropySource::add_bytes(u64bit entropy) + { + add_bytes(&entropy, 8); + } + +/************************************************* +* Take entropy from the internal buffer * +*************************************************/ +u32bit Buffered_EntropySource::copy_out(byte out[], u32bit length, + u32bit max_read) + { + length = std::min(length, max_read); + u32bit copied = std::min(length, buffer.size() - read_pos); + xor_buf(out, buffer + read_pos, copied); + read_pos = (read_pos + copied) % buffer.size(); + return copied; + } + +} |