aboutsummaryrefslogtreecommitdiffstats
path: root/src/entropy/proc_walk
diff options
context:
space:
mode:
authorlloyd <[email protected]>2008-11-21 23:57:47 +0000
committerlloyd <[email protected]>2008-11-21 23:57:47 +0000
commitb4dab19af8894d8a79ecc3dffeed5ca39f740b5a (patch)
treece6a1755b4a9a96f6ea7acec433a422f5c1e34d3 /src/entropy/proc_walk
parent518eecd2718fecef6b545dd783156976cc1b9e76 (diff)
Last minute es_ftw optimizations / logic changes. Performance of seeding
was too slow, it was noticably slowing down AutoSeeded_RNG. Reduce the amount of output gathered to 32 times the size of the output buffer, and instead of using Buffered_EntropySource, just xor the read file data directly into the output buffer. Read up to 4096 bytes per file, but only count the first 128 towards the total goal (/proc/config.gz being a major culprit - large, random looking, and entirely or almost static).
Diffstat (limited to 'src/entropy/proc_walk')
-rw-r--r--src/entropy/proc_walk/es_ftw.cpp49
-rw-r--r--src/entropy/proc_walk/es_ftw.h13
2 files changed, 27 insertions, 35 deletions
diff --git a/src/entropy/proc_walk/es_ftw.cpp b/src/entropy/proc_walk/es_ftw.cpp
index f90d422a5..013bb922b 100644
--- a/src/entropy/proc_walk/es_ftw.cpp
+++ b/src/entropy/proc_walk/es_ftw.cpp
@@ -4,6 +4,7 @@
*************************************************/
#include <botan/es_ftw.h>
+#include <botan/secmem.h>
#include <botan/util.h>
#include <cstring>
#include <deque>
@@ -109,34 +110,16 @@ FTW_EntropySource::~FTW_EntropySource()
delete dir;
}
-/*************************************************
-* FTW Fast Poll *
-*************************************************/
-void FTW_EntropySource::do_fast_poll()
- {
- poll(32*1024);
- }
-
-/*************************************************
-* FTW Slow Poll *
-*************************************************/
-void FTW_EntropySource::do_slow_poll()
- {
- poll(256*1024);
- }
-
-/*************************************************
-* FTW Poll *
-*************************************************/
-void FTW_EntropySource::poll(u32bit max_read)
+u32bit FTW_EntropySource::slow_poll(byte buf[], u32bit length)
{
if(!dir)
dir = new Directory_Walker(path);
- SecureVector<byte> read_buf(1024);
+ SecureVector<byte> read_buf(4096);
- u32bit read_so_far = 0;
- while(read_so_far < max_read)
+ u32bit bytes_read = 0;
+
+ while(bytes_read < length * 32)
{
int fd = dir->next_fd();
@@ -146,20 +129,30 @@ void FTW_EntropySource::poll(u32bit max_read)
dir = new Directory_Walker(path);
fd = dir->next_fd();
- if(fd == -1) // still fails (directory not mounted, etc) -> exit
- break;
+ if(fd == -1) // still fails (directory not mounted, etc) -> fail
+ return 0;
}
ssize_t got = ::read(fd, read_buf.begin(), read_buf.size());
- if(got > 0)
+ if(got > 0 && got <= read_buf.size())
{
- add_bytes(read_buf, got);
- read_so_far += got;
+ for(ssize_t i = 0; i != got; ++i)
+ buf[i % length] ^= read_buf[i];
+
+ // never count any one file for more than 128 bytes
+ bytes_read += std::min<u32bit>(got, 128);
}
::close(fd);
}
+
+ return length;
+ }
+
+u32bit FTW_EntropySource::fast_poll(byte[], u32bit)
+ {
+ return 0; // no op
}
}
diff --git a/src/entropy/proc_walk/es_ftw.h b/src/entropy/proc_walk/es_ftw.h
index a0d480aae..5b127943f 100644
--- a/src/entropy/proc_walk/es_ftw.h
+++ b/src/entropy/proc_walk/es_ftw.h
@@ -6,18 +6,21 @@
#ifndef BOTAN_ENTROPY_SRC_FTW_H__
#define BOTAN_ENTROPY_SRC_FTW_H__
-#include <botan/buf_es.h>
+#include <botan/entropy_src.h>
namespace Botan {
/*************************************************
* File Tree Walking Entropy Source *
*************************************************/
-class BOTAN_DLL FTW_EntropySource : public Buffered_EntropySource
+class BOTAN_DLL FTW_EntropySource : public EntropySource
{
public:
std::string name() const { return "Proc Walker"; }
+ u32bit slow_poll(byte buf[], u32bit len);
+ u32bit fast_poll(byte buf[], u32bit len);
+
FTW_EntropySource(const std::string& root_dir);
~FTW_EntropySource();
@@ -28,12 +31,8 @@ class BOTAN_DLL FTW_EntropySource : public Buffered_EntropySource
virtual ~File_Descriptor_Source() {}
};
private:
- void do_fast_poll();
- void do_slow_poll();
-
- void poll(u32bit max_read);
- const std::string path;
+ std::string path;
File_Descriptor_Source* dir;
};