8#ifndef BOTAN_X509_EXTENSIONS_H_
9#define BOTAN_X509_EXTENSIONS_H_
11#include <botan/pkix_types.h>
13#include <botan/assert.h>
18class X509_Certificate;
20namespace Cert_Extension {
22static const size_t NO_CERT_PATH_LIMIT = 0xFFFFFFF0;
29 std::unique_ptr<Certificate_Extension>
copy()
const override {
30 return std::make_unique<Basic_Constraints>(m_is_ca, m_path_limit);
29 std::unique_ptr<Certificate_Extension>
copy()
const override {
…}
37 size_t get_path_limit()
const;
41 OID oid_of()
const override {
return static_oid(); }
44 std::string oid_name()
const override {
return "X509v3.BasicConstraints"; }
46 std::vector<uint8_t> encode_inner()
const override;
47 void decode_inner(
const std::vector<uint8_t>&)
override;
58 std::unique_ptr<Certificate_Extension>
copy()
const override {
59 return std::make_unique<Key_Usage>(m_constraints);
58 std::unique_ptr<Certificate_Extension>
copy()
const override {
…}
70 OID oid_of()
const override {
return static_oid(); }
73 std::string oid_name()
const override {
return "X509v3.KeyUsage"; }
75 bool should_encode()
const override {
return !m_constraints.empty(); }
77 std::vector<uint8_t> encode_inner()
const override;
78 void decode_inner(
const std::vector<uint8_t>&)
override;
80 Key_Constraints m_constraints;
92 Subject_Key_ID(
const std::vector<uint8_t>& public_key, std::string_view hash_fn);
94 std::unique_ptr<Certificate_Extension>
copy()
const override {
95 return std::make_unique<Subject_Key_ID>(m_key_id);
94 std::unique_ptr<Certificate_Extension>
copy()
const override {
…}
98 const std::vector<uint8_t>&
get_key_id()
const {
return m_key_id; }
105 std::string oid_name()
const override {
return "X509v3.SubjectKeyIdentifier"; }
107 bool should_encode()
const override {
return (!m_key_id.empty()); }
109 std::vector<uint8_t> encode_inner()
const override;
110 void decode_inner(
const std::vector<uint8_t>&)
override;
112 std::vector<uint8_t> m_key_id;
120 std::unique_ptr<Certificate_Extension>
copy()
const override {
121 return std::make_unique<Authority_Key_ID>(m_key_id);
120 std::unique_ptr<Certificate_Extension>
copy()
const override {
…}
128 const std::vector<uint8_t>&
get_key_id()
const {
return m_key_id; }
135 std::string oid_name()
const override {
return "X509v3.AuthorityKeyIdentifier"; }
137 bool should_encode()
const override {
return (!m_key_id.empty()); }
139 std::vector<uint8_t> encode_inner()
const override;
140 void decode_inner(
const std::vector<uint8_t>&)
override;
142 std::vector<uint8_t> m_key_id;
156 std::unique_ptr<Certificate_Extension>
copy()
const override {
157 return std::make_unique<Subject_Alternative_Name>(get_alt_name());
156 std::unique_ptr<Certificate_Extension>
copy()
const override {
…}
163 std::string oid_name()
const override {
return "X509v3.SubjectAlternativeName"; }
165 bool should_encode()
const override {
return m_alt_name.has_items(); }
167 std::vector<uint8_t> encode_inner()
const override;
168 void decode_inner(
const std::vector<uint8_t>&)
override;
170 AlternativeName m_alt_name;
184 std::unique_ptr<Certificate_Extension>
copy()
const override {
185 return std::make_unique<Issuer_Alternative_Name>(get_alt_name());
184 std::unique_ptr<Certificate_Extension>
copy()
const override {
…}
191 std::string oid_name()
const override {
return "X509v3.IssuerAlternativeName"; }
193 bool should_encode()
const override {
return m_alt_name.has_items(); }
195 std::vector<uint8_t> encode_inner()
const override;
196 void decode_inner(
const std::vector<uint8_t>&)
override;
198 AlternativeName m_alt_name;
206 std::unique_ptr<Certificate_Extension>
copy()
const override {
207 return std::make_unique<Extended_Key_Usage>(m_oids);
206 std::unique_ptr<Certificate_Extension>
copy()
const override {
…}
221 std::string oid_name()
const override {
return "X509v3.ExtendedKeyUsage"; }
223 bool should_encode()
const override {
return (!m_oids.empty()); }
225 std::vector<uint8_t> encode_inner()
const override;
226 void decode_inner(
const std::vector<uint8_t>&)
override;
228 std::vector<OID> m_oids;
236 std::unique_ptr<Certificate_Extension>
copy()
const override {
237 return std::make_unique<Name_Constraints>(m_name_constraints);
236 std::unique_ptr<Certificate_Extension>
copy()
const override {
…}
246 const std::vector<X509_Certificate>& cert_path,
247 std::vector<std::set<Certificate_Status_Code>>& cert_status,
248 size_t pos)
override;
257 std::string oid_name()
const override {
return "X509v3.NameConstraints"; }
259 bool should_encode()
const override {
return true; }
261 std::vector<uint8_t> encode_inner()
const override;
262 void decode_inner(
const std::vector<uint8_t>&)
override;
264 NameConstraints m_name_constraints;
272 std::unique_ptr<Certificate_Extension>
copy()
const override {
273 return std::make_unique<Certificate_Policies>(m_oids);
272 std::unique_ptr<Certificate_Extension>
copy()
const override {
…}
288 const std::vector<X509_Certificate>& cert_path,
289 std::vector<std::set<Certificate_Status_Code>>& cert_status,
290 size_t pos)
override;
293 std::string oid_name()
const override {
return "X509v3.CertificatePolicies"; }
295 bool should_encode()
const override {
return (!m_oids.empty()); }
297 std::vector<uint8_t> encode_inner()
const override;
298 void decode_inner(
const std::vector<uint8_t>&)
override;
300 std::vector<OID> m_oids;
308 std::unique_ptr<Certificate_Extension>
copy()
const override {
309 return std::make_unique<Authority_Information_Access>(m_ocsp_responder, m_ca_issuers);
308 std::unique_ptr<Certificate_Extension>
copy()
const override {
…}
315 const std::vector<std::string>& ca_issuers = std::vector<std::string>()) :
316 m_ocsp_responder(ocsp), m_ca_issuers(ca_issuers) {}
324 const std::vector<std::string>&
ca_issuers()
const {
return m_ca_issuers; }
327 std::string oid_name()
const override {
return "PKIX.AuthorityInformationAccess"; }
329 bool should_encode()
const override {
return (!m_ocsp_responder.empty() || !m_ca_issuers.empty()); }
331 std::vector<uint8_t> encode_inner()
const override;
332 void decode_inner(
const std::vector<uint8_t>&)
override;
334 std::string m_ocsp_responder;
335 std::vector<std::string> m_ca_issuers;
343 std::unique_ptr<Certificate_Extension> copy()
const override;
349 size_t get_crl_number()
const;
356 std::string oid_name()
const override {
return "X509v3.CRLNumber"; }
358 bool should_encode()
const override {
return m_has_value; }
360 std::vector<uint8_t> encode_inner()
const override;
361 void decode_inner(
const std::vector<uint8_t>&)
override;
372 std::unique_ptr<Certificate_Extension>
copy()
const override {
373 return std::make_unique<CRL_ReasonCode>(m_reason);
372 std::unique_ptr<Certificate_Extension>
copy()
const override {
…}
385 std::string oid_name()
const override {
return "X509v3.ReasonCode"; }
387 bool should_encode()
const override {
return (m_reason != CRL_Code::Unspecified); }
389 std::vector<uint8_t> encode_inner()
const override;
390 void decode_inner(
const std::vector<uint8_t>&)
override;
414 std::unique_ptr<Certificate_Extension>
copy()
const override {
415 return std::make_unique<CRL_Distribution_Points>(m_distribution_points);
414 std::unique_ptr<Certificate_Extension>
copy()
const override {
…}
431 std::string oid_name()
const override {
return "X509v3.CRLDistributionPoints"; }
433 bool should_encode()
const override {
return !m_distribution_points.empty(); }
435 std::vector<uint8_t> encode_inner()
const override;
436 void decode_inner(
const std::vector<uint8_t>&)
override;
438 std::vector<Distribution_Point> m_distribution_points;
439 std::vector<std::string> m_crl_distribution_urls;
451 m_distribution_point(distribution_point) {}
453 std::unique_ptr<Certificate_Extension>
copy()
const override {
454 return std::make_unique<CRL_Issuing_Distribution_Point>(m_distribution_point);
453 std::unique_ptr<Certificate_Extension>
copy()
const override {
…}
464 std::string oid_name()
const override {
return "X509v3.CRLIssuingDistributionPoint"; }
466 bool should_encode()
const override {
return true; }
468 std::vector<uint8_t> encode_inner()
const override;
469 void decode_inner(
const std::vector<uint8_t>&)
override;
471 CRL_Distribution_Points::Distribution_Point m_distribution_point;
489 std::unique_ptr<Certificate_Extension>
copy()
const override {
return std::make_unique<OCSP_NoCheck>(); }
496 std::string oid_name()
const override {
return "PKIX.OCSP.NoCheck"; }
498 bool should_encode()
const override {
return true; }
500 std::vector<uint8_t> encode_inner()
const override {
return {}; }
502 void decode_inner(
const std::vector<uint8_t>&)
override;
517 enum Type { ServiceProviderCode = 0, TelephoneNumberRange = 1, TelephoneNumber = 2 };
528 void decode_from(
class BER_Decoder& from)
override;
534 return std::get<ASN1_String>(m_data).value();
539 return std::get<RangeContainer>(m_data);
544 return std::get<ASN1_String>(m_data).value();
549 DataContainer m_data;
554 std::unique_ptr<Certificate_Extension>
copy()
const override {
return std::make_unique<TNAuthList>(*
this); }
560 const std::vector<Entry>&
entries()
const {
return m_tn_entries; }
563 std::string oid_name()
const override {
return "PKIX.TNAuthList"; }
565 bool should_encode()
const override {
return true; }
567 std::vector<uint8_t> encode_inner()
const override;
568 void decode_inner(
const std::vector<uint8_t>&)
override;
570 std::vector<Entry> m_tn_entries;
581 std::unique_ptr<Certificate_Extension>
copy()
const override {
582 return std::make_unique<Unknown_Extension>(m_oid, m_critical);
581 std::unique_ptr<Certificate_Extension>
copy()
const override {
…}
604 const std::vector<X509_Certificate>&,
605 std::vector<std::set<Certificate_Status_Code>>& cert_status,
606 size_t pos)
override {
608 cert_status.at(pos).insert(Certificate_Status_Code::UNKNOWN_CRITICAL_EXTENSION);
613 std::string oid_name()
const override {
return ""; }
615 bool should_encode()
const override {
return true; }
617 std::vector<uint8_t> encode_inner()
const override;
618 void decode_inner(
const std::vector<uint8_t>&)
override;
622 std::vector<uint8_t> m_bytes;
#define BOTAN_PUBLIC_API(maj, min)
#define BOTAN_STATE_CHECK(expr)
Authority_Key_ID(const std::vector< uint8_t > &k)
OID oid_of() const override
Authority_Key_ID()=default
std::unique_ptr< Certificate_Extension > copy() const override
const std::vector< uint8_t > & get_key_id() const
OID oid_of() const override
std::unique_ptr< Certificate_Extension > copy() const override
Basic_Constraints(bool ca=false, size_t limit=0)
Distribution_Point(const AlternativeName &name=AlternativeName())
const AlternativeName & point() const
CRL_Distribution_Points(const std::vector< Distribution_Point > &points)
CRL_Distribution_Points()=default
OID oid_of() const override
std::unique_ptr< Certificate_Extension > copy() const override
const std::vector< std::string > & crl_distribution_urls() const
const std::vector< Distribution_Point > & distribution_points() const
const AlternativeName & get_point() const
OID oid_of() const override
std::unique_ptr< Certificate_Extension > copy() const override
CRL_Issuing_Distribution_Point(const CRL_Distribution_Points::Distribution_Point &distribution_point)
CRL_Issuing_Distribution_Point()=default
OID oid_of() const override
std::unique_ptr< Certificate_Extension > copy() const override
CRL_Code get_reason() const
CRL_ReasonCode(CRL_Code r=CRL_Code::Unspecified)
OID oid_of() const override
Certificate_Policies()=default
const std::vector< OID > & get_policy_oids() const
std::unique_ptr< Certificate_Extension > copy() const override
Certificate_Policies(const std::vector< OID > &o)
OID oid_of() const override
OID oid_of() const override
const std::vector< OID > & object_identifiers() const
std::unique_ptr< Certificate_Extension > copy() const override
Extended_Key_Usage()=default
Extended_Key_Usage(const std::vector< OID > &o)
std::unique_ptr< Certificate_Extension > copy() const override
const AlternativeName & get_alt_name() const
Issuer_Alternative_Name(const AlternativeName &name=AlternativeName())
OID oid_of() const override
std::unique_ptr< Certificate_Extension > copy() const override
OID oid_of() const override
Key_Usage(Key_Constraints c)
Key_Constraints get_constraints() const
Name_Constraints(const NameConstraints &nc)
OID oid_of() const override
const NameConstraints & get_name_constraints() const
std::unique_ptr< Certificate_Extension > copy() const override
Name_Constraints()=default
std::unique_ptr< Certificate_Extension > copy() const override
OID oid_of() const override
const AlternativeName & get_alt_name() const
OID oid_of() const override
Subject_Alternative_Name(const AlternativeName &name=AlternativeName())
std::unique_ptr< Certificate_Extension > copy() const override
OID oid_of() const override
Subject_Key_ID(const std::vector< uint8_t > &k)
std::unique_ptr< Certificate_Extension > copy() const override
const std::vector< uint8_t > & get_key_id() const
const std::string & service_provider_code() const
const std::string & telephone_number() const
const RangeContainer & telephone_number_range() const
std::vector< TelephoneNumberRangeData > RangeContainer
std::variant< ASN1_String, RangeContainer > DataContainer
std::unique_ptr< Certificate_Extension > copy() const override
OID oid_of() const override
const std::vector< Entry > & entries() const
void validate(const X509_Certificate &, const X509_Certificate &, const std::vector< X509_Certificate > &, std::vector< std::set< Certificate_Status_Code > > &cert_status, size_t pos) override
OID oid_of() const override
std::unique_ptr< Certificate_Extension > copy() const override
Unknown_Extension(const OID &oid, bool critical)
const std::vector< uint8_t > & extension_contents() const
bool is_critical_extension() const
int(* final)(unsigned char *, CTX *)