aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/modules.h3
-rw-r--r--src/init_def.cpp40
-rw-r--r--src/modules.cpp8
3 files changed, 33 insertions, 18 deletions
diff --git a/include/modules.h b/include/modules.h
index d2d83985c..f81fcb64a 100644
--- a/include/modules.h
+++ b/include/modules.h
@@ -6,6 +6,7 @@
#ifndef BOTAN_MODULE_FACTORIES_H__
#define BOTAN_MODULE_FACTORIES_H__
+#include <botan/init.h>
#include <string>
#include <vector>
@@ -46,7 +47,7 @@ class Builtin_Modules : public Modules
std::vector<class EntropySource*> entropy_sources() const;
std::vector<class Engine*> engines() const;
- Builtin_Modules(bool sl) : should_lock(sl) {}
+ Builtin_Modules(const InitializerOptions&);
private:
const bool should_lock;
};
diff --git a/src/init_def.cpp b/src/init_def.cpp
index 31cb89ea7..f05ef6952 100644
--- a/src/init_def.cpp
+++ b/src/init_def.cpp
@@ -46,7 +46,7 @@ namespace Init {
*************************************************/
void initialize(const InitializerOptions& args)
{
- Builtin_Modules modules(args.secure_memory());
+ Builtin_Modules modules(args);
set_global_state(
new Library_State(
@@ -63,31 +63,37 @@ void initialize(const InitializerOptions& args)
global_state().load(modules);
global_state().set_prng(new ANSI_X931_RNG);
- const u32bit min_entropy =
- global_config().option_as_u32bit("rng/min_entropy");
-
- if(min_entropy != 0 && args.seed_rng())
+ if(args.seed_rng())
{
- u32bit bits_so_far = 0;
+ const u32bit min_entropy =
+ global_config().option_as_u32bit("rng/min_entropy");
- for(u32bit j = 0; j != 4; ++j)
+ if(min_entropy != 0)
{
- u32bit to_get = min_entropy - bits_so_far;
+ u32bit bits_so_far = 0;
- bits_so_far += global_state().seed_prng(true, to_get);
+ for(u32bit j = 0; j != 4; ++j)
+ {
+ u32bit to_get = min_entropy - bits_so_far;
- if(bits_so_far >= min_entropy)
- break;
- }
+ bits_so_far += global_state().seed_prng(true, to_get);
+
+ if(bits_so_far >= min_entropy)
+ break;
+ }
- if(bits_so_far < min_entropy)
- throw PRNG_Unseeded("Unable to collect sufficient entropy");
+ if(bits_so_far < min_entropy)
+ throw PRNG_Unseeded("Unable to collect sufficient entropy");
+ }
}
- if(!FIPS140::passes_self_tests())
+ if(args.fips_mode() || args.self_test())
{
- deinitialize();
- throw Self_Test_Failure("FIPS-140 startup tests");
+ if(!FIPS140::passes_self_tests())
+ {
+ deinitialize();
+ throw Self_Test_Failure("FIPS-140 startup tests");
+ }
}
}
diff --git a/src/modules.cpp b/src/modules.cpp
index 48b043afe..47a62c13f 100644
--- a/src/modules.cpp
+++ b/src/modules.cpp
@@ -213,4 +213,12 @@ Charset_Transcoder* Builtin_Modules::transcoder() const
return new Default_Charset_Transcoder;
}
+/*************************************************
+* Builtin_Modules Constructor *
+*************************************************/
+Builtin_Modules::Builtin_Modules(const InitializerOptions& args) :
+ should_lock(args.secure_memory())
+ {
+ }
+
}