diff options
author | lloyd <[email protected]> | 2006-06-24 02:06:30 +0000 |
---|---|---|
committer | lloyd <[email protected]> | 2006-06-24 02:06:30 +0000 |
commit | 5ff46baa0e2211e660c6925f5c42153c70eb1b11 (patch) | |
tree | 448cd34eec0238e43c1cb5808030c012aecde1ce | |
parent | 37a5509d230f4a84fbaa5a889cb40e19a2b0c0ad (diff) |
Add an X509_GlobalState pointer to the library state.
Initial implementation of a factory for extension objects
-rw-r--r-- | include/libstate.h | 6 | ||||
-rw-r--r-- | include/x509stat.h | 35 | ||||
-rw-r--r-- | src/libstate.cpp | 24 | ||||
-rw-r--r-- | src/x509_ca.cpp | 3 | ||||
-rw-r--r-- | src/x509stat.cpp | 79 |
5 files changed, 140 insertions, 7 deletions
diff --git a/include/libstate.h b/include/libstate.h index ff8266318..6e227140a 100644 --- a/include/libstate.h +++ b/include/libstate.h @@ -49,7 +49,10 @@ class Library_State void add_engine(class Engine*); - class Mutex* get_mutex(); + class Mutex* get_mutex() const; + + void set_x509_state(class X509_GlobalState*); + class X509_GlobalState& x509_state() const; void set_transcoder(class Charset_Transcoder*); std::string transcode(const std::string, @@ -66,6 +69,7 @@ class Library_State class Mutex_Factory* mutex_factory; class Timer* timer; + class X509_GlobalState* x509_state_obj; std::map<std::string, class Mutex*> locks; std::map<std::string, std::string> settings; diff --git a/include/x509stat.h b/include/x509stat.h new file mode 100644 index 000000000..4822119aa --- /dev/null +++ b/include/x509stat.h @@ -0,0 +1,35 @@ +/************************************************* +* Globally Saved X.509 State * +* (C) 1999-2006 The Botan Project * +*************************************************/ + +#include <botan/asn1_oid.h> + +namespace Botan { + +/************************************************* +* Prototype for a Certificate Extension * +*************************************************/ +class Extension_Prototype + { + public: + virtual class Certificate_Extension* make(const OID&) = 0; + virtual ~Extension_Prototype() {} + }; + +/************************************************* +* X.509 Global State * +*************************************************/ +class X509_GlobalState + { + public: + void add(Extension_Prototype*); + class Certificate_Extension* get_extension(const OID&) const; + + X509_GlobalState(); + ~X509_GlobalState(); + private: + std::vector<Extension_Prototype*> prototypes; + }; + +} diff --git a/src/libstate.cpp b/src/libstate.cpp index 2b7636cdf..ed0f685d7 100644 --- a/src/libstate.cpp +++ b/src/libstate.cpp @@ -4,8 +4,9 @@ *************************************************/ #include <botan/libstate.h> -#include <botan/stl_util.h> #include <botan/engine.h> +#include <botan/x509stat.h> +#include <botan/stl_util.h> #include <botan/mutex.h> #include <botan/timers.h> #include <botan/charset.h> @@ -78,7 +79,7 @@ Engine* Library_State::Engine_Iterator::next() /************************************************* * Get a new mutex object * *************************************************/ -Mutex* Library_State::get_mutex() +Mutex* Library_State::get_mutex() const { return mutex_factory->make(); } @@ -295,6 +296,22 @@ std::string Library_State::transcode(const std::string str, } /************************************************* +* Set the X509 global state class * +*************************************************/ +void Library_State::set_x509_state(X509_GlobalState* new_x509_state_obj) + { + x509_state_obj = new_x509_state_obj; + } + +/************************************************* +* Set the X509 global state class * +*************************************************/ +X509_GlobalState& Library_State::x509_state() const + { + return (*x509_state_obj); + } + +/************************************************* * Library_State Constructor * *************************************************/ Library_State::Library_State(Mutex_Factory* mutex_factory, Timer* timer) @@ -314,6 +331,7 @@ Library_State::Library_State(Mutex_Factory* mutex_factory, Timer* timer) locks["engine"] = get_mutex(); rng = 0; cached_default_allocator = 0; + x509_state_obj = 0; set_default_policy(); } @@ -325,6 +343,7 @@ Library_State::~Library_State() { cached_default_allocator = 0; delete rng; + delete x509_state_obj; for(u32bit j = 0; j != entropy_sources.size(); ++j) delete entropy_sources[j]; @@ -349,4 +368,3 @@ Library_State::~Library_State() } } -n diff --git a/src/x509_ca.cpp b/src/x509_ca.cpp index f5893734c..b13559341 100644 --- a/src/x509_ca.cpp +++ b/src/x509_ca.cpp @@ -48,11 +48,8 @@ X509_CA::X509_CA(const X509_Certificate& c, if(!dynamic_cast<const PK_Signing_Key*>(key_pointer)) throw Invalid_Argument("X509_CA: " + key.algo_name() + " cannot sign"); -#if 0 - // FIXME! if(!cert.is_CA_cert()) throw Invalid_Argument("X509_CA: This certificate is not for a CA"); -#endif std::string padding; Signature_Format format; diff --git a/src/x509stat.cpp b/src/x509stat.cpp new file mode 100644 index 000000000..25ca197ca --- /dev/null +++ b/src/x509stat.cpp @@ -0,0 +1,79 @@ +/************************************************* +* Globally Saved X.509 State * +* (C) 1999-2006 The Botan Project * +*************************************************/ + +#include <botan/x509stat.h> +#include <botan/x509_ext.h> +#include <botan/oids.h> + +namespace Botan { + +/************************************************* +* Add a new prototype * +*************************************************/ +void X509_GlobalState::add(Extension_Prototype* proto) + { + if(proto) + prototypes.push_back(proto); + } + +/************************************************* +* Get an extension object * +*************************************************/ +Certificate_Extension* X509_GlobalState::get_extension(const OID& oid) const + { + Certificate_Extension* extension = 0; + for(u32bit j = 0; j != prototypes.size() && !extension; ++j) + extension = prototypes[j]->make(oid); + return extension; + } + +/************************************************* +* Set up a new global state for X.509 * +*************************************************/ +X509_GlobalState::X509_GlobalState() + { +#define CREATE_PROTOTYPE(TYPE, NAME) \ + struct TYPE ## _Prototype : public Extension_Prototype \ + { \ + Certificate_Extension* make(const OID& oid) \ + { \ + if(oid == OIDS::lookup(NAME)) \ + return new Cert_Extension::TYPE(); \ + return 0; \ + } \ + }; \ + add(new TYPE ## _Prototype); + +#if 0 + class Basic_Constraints_Prototype : public Extension_Prototype + { + public: + Certificate_Extension* make(const OID& oid) + { + if(oid == OIDS::lookup("X509v3.BasicConstraints")) + return new Cert_Extension::Basic_Constraints(); + return 0; + } + }; + + add(new Basic_Constraints_Prototype); +#else + + CREATE_PROTOTYPE(Basic_Constraints, "X509v3.BasicConstraints"); + +#endif + } + +/************************************************* +* Destroy this global state object * +*************************************************/ +X509_GlobalState::~X509_GlobalState() + { + for(u32bit j = 0; j != prototypes.size(); ++j) + delete prototypes[j]; + prototypes.clear(); + } + +} |