aboutsummaryrefslogtreecommitdiffstats
path: root/src/entropy/buf_es/buf_es.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/entropy/buf_es/buf_es.cpp')
-rw-r--r--src/entropy/buf_es/buf_es.cpp89
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;
+ }
+
+}