blob: 61fd5d31ff542c9c634ab53e4220539b9181ef20 (
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
|
/*
* CRL Entry
* (C) 1999-2010 Jack Lloyd
*
* Botan is released under the Simplified BSD License (see license.txt)
*/
#include <botan/crl_ent.h>
#include <botan/x509cert.h>
#include <botan/x509_ext.h>
#include <botan/der_enc.h>
#include <botan/ber_dec.h>
#include <botan/bigint.h>
namespace Botan {
struct CRL_Entry_Data
{
std::vector<uint8_t> m_serial;
X509_Time m_time;
CRL_Code m_reason;
Extensions m_extensions;
};
/*
* Create a CRL_Entry
*/
CRL_Entry::CRL_Entry(const X509_Certificate& cert, CRL_Code why)
{
m_data.reset(new CRL_Entry_Data);
m_data->m_serial = cert.serial_number();
m_data->m_time = X509_Time(std::chrono::system_clock::now());
m_data->m_reason = why;
if(why != UNSPECIFIED)
{
m_data->m_extensions.add(new Cert_Extension::CRL_ReasonCode(why));
}
}
/*
* Compare two CRL_Entrys for equality
*/
bool operator==(const CRL_Entry& a1, const CRL_Entry& a2)
{
if(a1.serial_number() != a2.serial_number())
return false;
if(a1.expire_time() != a2.expire_time())
return false;
if(a1.reason_code() != a2.reason_code())
return false;
return true;
}
/*
* Compare two CRL_Entrys for inequality
*/
bool operator!=(const CRL_Entry& a1, const CRL_Entry& a2)
{
return !(a1 == a2);
}
/*
* DER encode a CRL_Entry
*/
void CRL_Entry::encode_into(DER_Encoder& der) const
{
der.start_cons(SEQUENCE)
.encode(BigInt::decode(serial_number()))
.encode(expire_time())
.start_cons(SEQUENCE)
.encode(extensions())
.end_cons()
.end_cons();
}
/*
* Decode a BER encoded CRL_Entry
*/
void CRL_Entry::decode_from(BER_Decoder& source)
{
BigInt serial_number_bn;
std::unique_ptr<CRL_Entry_Data> data(new CRL_Entry_Data);
BER_Decoder entry = source.start_cons(SEQUENCE);
entry.decode(serial_number_bn).decode(data->m_time);
data->m_serial = BigInt::encode(serial_number_bn);
if(entry.more_items())
{
entry.decode(data->m_extensions);
if(auto ext = data->m_extensions.get_extension_object_as<Cert_Extension::CRL_ReasonCode>())
{
data->m_reason = ext->get_reason();
}
else
{
data->m_reason = UNSPECIFIED;
}
}
entry.end_cons();
m_data.reset(data.release());
}
const CRL_Entry_Data& CRL_Entry::data() const
{
if(!m_data)
throw Decoding_Error("Uninitialized CRL_Entry");
return *m_data.get();
}
const std::vector<uint8_t>& CRL_Entry::serial_number() const
{
return data().m_serial;
}
const X509_Time& CRL_Entry::expire_time() const
{
return data().m_time;
}
CRL_Code CRL_Entry::reason_code() const
{
return data().m_reason;
}
const Extensions& CRL_Entry::extensions() const
{
return data().m_extensions;
}
}
|