Botan 3.12.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/asn1_obj.h>
11#include <botan/asn1_time.h>
12#include <botan/ber_dec.h>
13#include <botan/bigint.h>
14#include <botan/der_enc.h>
15#include <botan/x509_ext.h>
16#include <botan/x509cert.h>
17
18namespace Botan {
19
20class CRL_Entry_Data final {
21 public:
22 CRL_Entry_Data(const X509_Certificate& cert, CRL_Code why) :
23 m_serial(cert.serial_number()), m_time(X509_Time(std::chrono::system_clock::now())), m_reason(why) {
24 if(why != CRL_Code::Unspecified) {
25 m_extensions.add(std::make_unique<Cert_Extension::CRL_ReasonCode>(why));
26 }
27 }
28
29 CRL_Entry_Data() = default;
30
31 // NOLINTBEGIN(*non-private-member-variables-in-classes)
32 std::vector<uint8_t> m_serial;
33 X509_Time m_time;
35 Extensions m_extensions;
36 // NOLINTEND(*non-private-member-variables-in-classes)
37};
38
39/*
40* Create a CRL_Entry
41*/
43 m_data = std::make_shared<CRL_Entry_Data>(cert, why);
44}
45
46/*
47* Compare two CRL_Entry structs for equality
48*/
49bool operator==(const CRL_Entry& a1, const CRL_Entry& a2) {
50 if(a1.serial_number() != a2.serial_number()) {
51 return false;
52 }
53 if(a1.expire_time() != a2.expire_time()) {
54 return false;
55 }
56 if(a1.reason_code() != a2.reason_code()) {
57 return false;
58 }
59 return true;
60}
61
62/*
63* Compare two CRL_Entry structs for inequality
64*/
65bool operator!=(const CRL_Entry& a1, const CRL_Entry& a2) {
66 return !(a1 == a2);
67}
68
69/*
70* DER encode a CRL_Entry
71*/
81
82/*
83* Decode a BER encoded CRL_Entry
84*/
86 auto data = std::make_unique<CRL_Entry_Data>();
87
88 BER_Decoder entry = source.start_sequence();
89
90 BigInt serial;
91 entry.decode(serial);
92 data->m_serial = serial.serialize();
93
94 entry.decode(data->m_time);
95
96 if(entry.more_items()) {
97 entry.decode(data->m_extensions);
98 if(const auto* ext = data->m_extensions.get_extension_object_as<Cert_Extension::CRL_ReasonCode>()) {
99 data->m_reason = ext->get_reason();
100 } else {
101 data->m_reason = CRL_Code::Unspecified;
102 }
103 }
104
105 entry.end_cons();
106
107 m_data = std::move(data);
108}
109
110const CRL_Entry_Data& CRL_Entry::data() const {
111 if(!m_data) {
112 throw Invalid_State("CRL_Entry_Data uninitialized");
113 }
114
115 return *m_data;
116}
117
118const std::vector<uint8_t>& CRL_Entry::serial_number() const {
119 return data().m_serial;
120}
121
123 return data().m_time;
124}
125
127 return data().m_reason;
128}
129
131 return data().m_extensions;
132}
133
134} // namespace Botan
BER_Decoder & decode(bool &out)
Definition ber_dec.h:220
bool more_items() const
Definition ber_dec.cpp:371
BER_Decoder & end_cons()
Definition ber_dec.cpp:524
BER_Decoder start_sequence()
Definition ber_dec.h:160
static BigInt from_bytes(std::span< const uint8_t > bytes)
Definition bigint.cpp:83
T serialize(size_t len) const
Definition bigint.h:744
Definition x509_crl.h:29
CRL_Code reason_code() const
Definition crl_ent.cpp:126
void encode_into(DER_Encoder &to) const override
Definition crl_ent.cpp:72
const X509_Time & expire_time() const
Definition crl_ent.cpp:122
CRL_Entry()=default
const std::vector< uint8_t > & serial_number() const
Definition crl_ent.cpp:118
void decode_from(BER_Decoder &from) override
Definition crl_ent.cpp:85
const Extensions & extensions() const
Definition crl_ent.cpp:130
DER_Encoder & start_sequence()
Definition der_enc.h:67
DER_Encoder & end_cons()
Definition der_enc.cpp:173
DER_Encoder & encode(bool b)
Definition der_enc.cpp:245
ASN1_Time X509_Time
Definition asn1_obj.h:23
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