9#include <botan/certstor.h>
10#include <botan/pkix_types.h>
11#include <botan/internal/filesystem.h>
12#include <botan/hash.h>
13#include <botan/data_src.h>
19std::shared_ptr<const X509_Certificate>
40 for(
const auto& c : m_certs)
44 m_certs.push_back(std::make_shared<const X509_Certificate>(cert));
49 for(
const auto& c : m_certs)
53 m_certs.push_back(cert);
58 std::vector<X509_DN> subjects;
59 for(
const auto& cert : m_certs)
60 subjects.push_back(cert->subject_dn());
64std::shared_ptr<const X509_Certificate>
66 const std::vector<uint8_t>& key_id)
const
68 for(
const auto& cert : m_certs)
73 std::vector<uint8_t> skid = cert->subject_key_id();
75 if(skid.size() && skid != key_id)
79 if(cert->subject_dn() == subject_dn)
88 const std::vector<uint8_t>& key_id)
const
90 std::vector<std::shared_ptr<const X509_Certificate>> matches;
92 for(
const auto& cert : m_certs)
96 std::vector<uint8_t> skid = cert->subject_key_id();
98 if(skid.size() && skid != key_id)
102 if(cert->subject_dn() == subject_dn)
103 matches.push_back(cert);
109std::shared_ptr<const X509_Certificate>
112 if(key_hash.size() != 20)
113 throw Invalid_Argument(
"Certificate_Store_In_Memory::find_cert_by_pubkey_sha1 invalid hash");
117 for(
const auto& cert : m_certs){
118 hash->update(cert->subject_public_key_bitstring());
119 if(key_hash ==
hash->final_stdvec())
126std::shared_ptr<const X509_Certificate>
129 if(subject_hash.size() != 32)
130 throw Invalid_Argument(
"Certificate_Store_In_Memory::find_cert_by_raw_subject_dn_sha256 invalid hash");
134 for(
const auto& cert : m_certs){
135 hash->update(cert->raw_subject_dn());
136 if(subject_hash ==
hash->final_stdvec())
145 std::shared_ptr<const X509_CRL> crl_s = std::make_shared<const X509_CRL>(crl);
151 X509_DN crl_issuer = crl->issuer_dn();
153 for(
auto& c : m_crls)
156 if(c->issuer_dn() == crl_issuer)
158 if(c->this_update() <= crl->this_update())
165 m_crls.push_back(crl);
172 for(
const auto& c : m_crls)
177 std::vector<uint8_t> akid = c->authority_key_id();
179 if(akid.size() && akid != key_id)
183 if(c->issuer_dn() == subject.
issuer_dn())
195#if defined(BOTAN_TARGET_OS_HAS_FILESYSTEM)
203 if(maybe_certs.empty())
205 maybe_certs.push_back(dir);
208 for(
auto&& cert_file : maybe_certs)
212 DataSource_Stream src(cert_file,
true);
213 while(!src.end_of_data())
217 m_certs.push_back(std::make_shared<X509_Certificate>(src));
219 catch(std::exception&)
226 catch(std::exception&)
std::shared_ptr< const X509_Certificate > find_cert_by_raw_subject_dn_sha256(const std::vector< uint8_t > &subject_hash) const override
Certificate_Store_In_Memory()=default
std::shared_ptr< const X509_Certificate > find_cert(const X509_DN &subject_dn, const std::vector< uint8_t > &key_id) const override
std::shared_ptr< const X509_Certificate > find_cert_by_pubkey_sha1(const std::vector< uint8_t > &key_hash) const override
void add_crl(const X509_CRL &crl)
std::vector< std::shared_ptr< const X509_Certificate > > find_all_certs(const X509_DN &subject_dn, const std::vector< uint8_t > &key_id) const override
void add_certificate(const X509_Certificate &cert)
std::shared_ptr< const X509_CRL > find_crl_for(const X509_Certificate &subject) const override
std::vector< X509_DN > all_subjects() const override
virtual std::shared_ptr< const X509_Certificate > find_cert(const X509_DN &subject_dn, const std::vector< uint8_t > &key_id) const
virtual std::vector< std::shared_ptr< const X509_Certificate > > find_all_certs(const X509_DN &subject_dn, const std::vector< uint8_t > &key_id) const =0
virtual std::shared_ptr< const X509_CRL > find_crl_for(const X509_Certificate &subject) const
virtual ~Certificate_Store()
static std::unique_ptr< HashFunction > create(const std::string &algo_spec, const std::string &provider="")
const std::vector< uint8_t > & authority_key_id() const
const X509_DN & issuer_dn() const
std::vector< std::string > get_files_recursive(const std::string &dir)