blob: 059e4341455b587c6fead028221edb68dc48a578 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
/*************************************************
* Globally Saved X.509 State Source *
* (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(NAME, TYPE) \
do { \
struct TYPE ## _Prototype : public Extension_Prototype \
{ \
Certificate_Extension* make(const OID& oid) \
{ \
if(OIDS::name_of(oid, NAME)) \
return new Cert_Extension::TYPE(); \
return 0; \
} \
}; \
\
add(new TYPE ## _Prototype); \
} while(0);
CREATE_PROTOTYPE("X509v3.KeyUsage", Key_Usage);
CREATE_PROTOTYPE("X509v3.BasicConstraints", Basic_Constraints);
CREATE_PROTOTYPE("X509v3.SubjectKeyIdentifier", Subject_Key_ID);
CREATE_PROTOTYPE("X509v3.AuthorityKeyIdentifier", Authority_Key_ID);
CREATE_PROTOTYPE("X509v3.ExtendedKeyUsage", Extended_Key_Usage);
CREATE_PROTOTYPE("X509v3.IssuerAlternativeName", Issuer_Alternative_Name);
CREATE_PROTOTYPE("X509v3.SubjectAlternativeName", Subject_Alternative_Name);
CREATE_PROTOTYPE("X509v3.CRLNumber", CRL_Number);
CREATE_PROTOTYPE("X509v3.CertificatePolicies", Certificate_Policies);
#undef CREATE_PROTOTYPE
}
/*************************************************
* Destroy this global state object *
*************************************************/
X509_GlobalState::~X509_GlobalState()
{
for(u32bit j = 0; j != prototypes.size(); ++j)
delete prototypes[j];
prototypes.clear();
}
}
|