Botan 3.9.0
Crypto and TLS for C&
crl_ent.cpp
Go to the documentation of this file.
1/*
2* CRL Entry
3* (C) 1999-2010 Jack Lloyd
4*
5* Botan is released under the Simplified BSD License (see license.txt)
6*/
7
8#include <botan/x509_crl.h>
9
10#include <botan/ber_dec.h>
11#include <botan/bigint.h>
12#include <botan/der_enc.h>
13#include <botan/x509_ext.h>
14#include <botan/x509cert.h>
15
16namespace Botan {
17
18struct CRL_Entry_Data {
19 std::vector<uint8_t> m_serial;
20 X509_Time m_time;
22 Extensions m_extensions;
23};
24
25/*
26* Create a CRL_Entry
27*/
29 m_data = std::make_shared<CRL_Entry_Data>();
30 m_data->m_serial = cert.serial_number();
31 m_data->m_time = X509_Time(std::chrono::system_clock::now());
32 m_data->m_reason = why;
33
34 if(why != CRL_Code::Unspecified) {
35 m_data->m_extensions.add(std::make_unique<Cert_Extension::CRL_ReasonCode>(why));
36 }
37}
38
39/*
40* Compare two CRL_Entrys for equality
41*/
42bool operator==(const CRL_Entry& a1, const CRL_Entry& a2) {
43 if(a1.serial_number() != a2.serial_number()) {
44 return false;
45 }
46 if(a1.expire_time() != a2.expire_time()) {
47 return false;
48 }
49 if(a1.reason_code() != a2.reason_code()) {
50 return false;
51 }
52 return true;
53}
54
55/*
56* Compare two CRL_Entrys for inequality
57*/
58bool operator!=(const CRL_Entry& a1, const CRL_Entry& a2) {
59 return !(a1 == a2);
60}
61
62/*
63* DER encode a CRL_Entry
64*/
74
75namespace {
76
77std::vector<uint8_t> decode_serial_number(const BER_Object& obj) {
79
80 if(!obj.data().empty() && obj.data()[0] == 0x00) {
81 return std::vector<uint8_t>(obj.data().begin() + 1, obj.data().end());
82 } else if(!obj.data().empty() && ((obj.data()[0] & 0x80) == 0x80)) {
83 std::vector<uint8_t> vec(obj.data().begin(), obj.data().end());
84 for(size_t i = vec.size(); i > 0; --i) {
85 bool gt0 = vec[i - 1] > 0;
86 vec[i - 1] -= 1;
87 if(gt0) {
88 break;
89 }
90 }
91 for(auto& b : vec) {
92 b = ~b;
93 }
94
95 return vec;
96 } else {
97 return std::vector<uint8_t>(obj.data().begin(), obj.data().end());
98 }
99}
100
101} // namespace
102
103/*
104* Decode a BER encoded CRL_Entry
105*/
107 auto data = std::make_unique<CRL_Entry_Data>();
108
109 BER_Decoder entry = source.start_sequence();
110
111 data->m_serial = decode_serial_number(entry.get_next_object());
112
113 entry.decode(data->m_time);
114
115 if(entry.more_items()) {
116 entry.decode(data->m_extensions);
117 if(const auto* ext = data->m_extensions.get_extension_object_as<Cert_Extension::CRL_ReasonCode>()) {
118 data->m_reason = ext->get_reason();
119 } else {
120 data->m_reason = CRL_Code::Unspecified;
121 }
122 }
123
124 entry.end_cons();
125
126 m_data = std::move(data);
127}
128
129const CRL_Entry_Data& CRL_Entry::data() const {
130 if(!m_data) {
131 throw Invalid_State("CRL_Entry_Data uninitialized");
132 }
133
134 return *m_data;
135}
136
137const std::vector<uint8_t>& CRL_Entry::serial_number() const {
138 return data().m_serial;
139}
140
142 return data().m_time;
143}
144
146 return data().m_reason;
147}
148
150 return data().m_extensions;
151}
152
153} // namespace Botan
BER_Object get_next_object()
Definition ber_dec.cpp:248
BER_Decoder & decode(bool &out)
Definition ber_dec.h:188
bool more_items() const
Definition ber_dec.cpp:204
BER_Decoder & end_cons()
Definition ber_dec.cpp:312
BER_Decoder start_sequence()
Definition ber_dec.h:125
void assert_is_a(ASN1_Type type_tag, ASN1_Class class_tag, std::string_view descr="object") const
Definition asn1_obj.cpp:29
std::span< const uint8_t > data() const
Definition asn1_obj.h:154
static BigInt from_bytes(std::span< const uint8_t > bytes)
Definition bigint.cpp:87
Definition x509_crl.h:29
CRL_Code reason_code() const
Definition crl_ent.cpp:145
void encode_into(DER_Encoder &to) const override
Definition crl_ent.cpp:65
const X509_Time & expire_time() const
Definition crl_ent.cpp:141
CRL_Entry()=default
const std::vector< uint8_t > & serial_number() const
Definition crl_ent.cpp:137
void decode_from(BER_Decoder &from) override
Definition crl_ent.cpp:106
const Extensions & extensions() const
Definition crl_ent.cpp:149
DER_Encoder & start_sequence()
Definition der_enc.h:65
DER_Encoder & end_cons()
Definition der_enc.cpp:173
DER_Encoder & encode(bool b)
Definition der_enc.cpp:252
const std::vector< uint8_t > & serial_number() const
Definition x509cert.cpp:399
ASN1_Time X509_Time
Definition asn1_obj.h:424
bool operator!=(const AlgorithmIdentifier &a1, const AlgorithmIdentifier &a2)
Definition alg_id.cpp:68
bool operator==(const AlgorithmIdentifier &a1, const AlgorithmIdentifier &a2)
Definition alg_id.cpp:53