8#include <botan/x509_crl.h>
10#include <botan/asn1_obj.h>
11#include <botan/asn1_time.h>
12#include <botan/ber_dec.h>
13#include <botan/data_src.h>
14#include <botan/x509_ext.h>
15#include <botan/x509cert.h>
23 CRL_Data(
const X509_DN& issuer,
26 const std::vector<CRL_Entry>& revoked) :
27 m_issuer(issuer), m_this_update(this_update), m_next_update(next_update), m_entries(revoked) {
34 m_revoked_serials.clear();
35 for(
const auto& entry : m_entries) {
37 m_revoked_serials.erase(entry.serial_number());
39 m_revoked_serials.insert(entry.serial_number());
49 std::vector<CRL_Entry> m_entries;
50 Extensions m_extensions;
53 std::set<std::vector<uint8_t>> m_revoked_serials;
56 size_t m_crl_number = 0;
57 std::vector<uint8_t> m_auth_key_id;
58 std::vector<std::string> m_idp_urls;
79#if defined(BOTAN_TARGET_OS_HAS_FILESYSTEM)
89 const std::vector<CRL_Entry>& revoked) {
108 if(!crl_akid.empty() && !cert_akid.empty()) {
109 if(crl_akid != cert_akid) {
114 return data().m_revoked_serials.contains(cert.
serial_number());
122std::unique_ptr<CRL_Data> decode_crl_body(
const std::vector<uint8_t>& body,
const AlgorithmIdentifier& sig_algo) {
123 auto data = std::make_unique<CRL_Data>();
128 data->m_version += 1;
130 if(data->m_version != 1 && data->m_version != 2) {
131 throw Decoding_Error(
"Unknown X.509 CRL version " + std::to_string(data->m_version));
134 AlgorithmIdentifier sig_algo_inner;
135 tbs_crl.decode(sig_algo_inner);
137 if(sig_algo != sig_algo_inner) {
138 throw Decoding_Error(
"Algorithm identifier mismatch in CRL");
141 tbs_crl.decode(data->m_issuer).decode(data->m_this_update);
150 const auto& next_update = tbs_crl.peek_next_object();
153 tbs_crl.decode(data->m_next_update);
162 while(cert_list.more_items()) {
164 cert_list.decode(entry);
165 data->m_entries.push_back(entry);
167 next = tbs_crl.get_next_object();
172 crl_options.decode(data->m_extensions).verify_end();
173 next = tbs_crl.get_next_object();
180 tbs_crl.verify_end();
184 data->m_crl_number = ext->get_crl_number();
187 data->m_auth_key_id = ext->get_key_id();
190 for(
const auto& uri : ext->get_point().uris()) {
191 data->m_idp_urls.push_back(uri);
195 data->update_index();
202void X509_CRL::force_decode() {
206const CRL_Data& X509_CRL::data()
const {
208 throw Invalid_State(
"X509_CRL uninitialized");
214 return data().m_extensions;
221 return data().m_entries;
225 return static_cast<uint32_t
>(data().m_version);
232 return data().m_issuer;
239 return data().m_auth_key_id;
246 return static_cast<uint32_t
>(data().m_crl_number);
253 return data().m_this_update;
260 return data().m_next_update;
267 if(!data().m_idp_urls.empty()) {
268 return data().m_idp_urls[0];
277 return data().m_idp_urls;
289 auto has_common = [](
const auto& s1,
const auto& s2) {
290 return std::ranges::any_of(s1, [&](
const auto& e) {
return s2.contains(e); });
300 if(cdp_ext ==
nullptr || cdp_ext->distribution_points().empty()) {
305 if(idp_ext ==
nullptr) {
309 return std::ranges::any_of(cdp_ext->distribution_points(),
310 [&](
const auto& dp) { return dp_names_overlap(dp.point(), idp_ext->get_point()); });
const std::set< X509_DN > & directory_names() const
Return the set of directory names included in this alternative name.
const std::set< std::string > & uris() const
Return the set of URIs included in this alternative name.
const T * get_extension_object_as(const OID &oid=T::static_oid()) const
const std::vector< CRL_Entry > & get_revoked() const
const std::vector< uint8_t > & authority_key_id() const
const X509_Time & this_update() const
std::vector< std::string > issuing_distribution_points() const
const Extensions & extensions() const
uint32_t crl_number() const
const X509_Time & next_update() const
const X509_DN & issuer_dn() const
bool has_matching_distribution_point(const X509_Certificate &cert) const
bool is_revoked(const X509_Certificate &cert) const
std::string crl_issuing_distribution_point() const
uint32_t x509_version() const
const std::vector< uint8_t > & serial_number() const
const std::vector< uint8_t > & authority_key_id() const
const Extensions & v3_extensions() const
const X509_DN & issuer_dn() const
const std::vector< uint8_t > & signed_body() const
const AlgorithmIdentifier & signature_algorithm() const
virtual std::vector< std::string > alternate_PEM_labels() const
void load_data(DataSource &src)
virtual std::string PEM_label() const =0