1313#include < botan/data_src.h>
1414#include < botan/x509_ext.h>
1515#include < botan/x509cert.h>
16+ #include < set>
1617
1718namespace Botan {
1819
@@ -22,10 +23,23 @@ class CRL_Data final {
2223 const X509_Time& this_update,
2324 const X509_Time& next_update,
2425 const std::vector<CRL_Entry>& revoked) :
25- m_issuer (issuer), m_this_update(this_update), m_next_update(next_update), m_entries(revoked) {}
26+ m_issuer (issuer), m_this_update(this_update), m_next_update(next_update), m_entries(revoked) {
27+ this ->update_index ();
28+ }
2629
2730 CRL_Data () = default ;
2831
32+ void update_index () {
33+ m_revoked_serials.clear ();
34+ for (const auto & entry : m_entries) {
35+ if (entry.reason_code () == CRL_Code::RemoveFromCrl) {
36+ m_revoked_serials.erase (entry.serial_number ());
37+ } else {
38+ m_revoked_serials.insert (entry.serial_number ());
39+ }
40+ }
41+ }
42+
2943 // NOLINTBEGIN(*non-private-member-variables-in-classes)
3044 X509_DN m_issuer;
3145 size_t m_version{};
@@ -34,6 +48,9 @@ class CRL_Data final {
3448 std::vector<CRL_Entry> m_entries;
3549 Extensions m_extensions;
3650
51+ // cached values from entries
52+ std::set<std::vector<uint8_t >> m_revoked_serials;
53+
3754 // cached values from extensions
3855 size_t m_crl_number = 0 ;
3956 std::vector<uint8_t > m_auth_key_id;
@@ -93,22 +110,7 @@ bool X509_CRL::is_revoked(const X509_Certificate& cert) const {
93110 }
94111 }
95112
96- const std::vector<uint8_t >& cert_serial = cert.serial_number ();
97-
98- bool is_revoked = false ;
99-
100- // FIXME would be nice to avoid a linear scan here - maybe sort the entries?
101- for (const CRL_Entry& entry : get_revoked ()) {
102- if (cert_serial == entry.serial_number ()) {
103- if (entry.reason_code () == CRL_Code::RemoveFromCrl) {
104- is_revoked = false ;
105- } else {
106- is_revoked = true ;
107- }
108- }
109- }
110-
111- return is_revoked;
113+ return data ().m_revoked_serials .contains (cert.serial_number ());
112114}
113115
114116/*
@@ -184,6 +186,8 @@ std::unique_ptr<CRL_Data> decode_crl_body(const std::vector<uint8_t>& body, cons
184186 data->m_idp_urls = ext->get_point ().get_attribute (" URL" );
185187 }
186188
189+ data->update_index ();
190+
187191 return data;
188192}
189193
0 commit comments