8#ifndef BOTAN_X509_EXTENSIONS_H_
9#define BOTAN_X509_EXTENSIONS_H_
11#include <botan/pkix_types.h>
16class X509_Certificate;
18namespace Cert_Extension {
20static const size_t NO_CERT_PATH_LIMIT = 0xFFFFFFF0;
28 std::unique_ptr<Certificate_Extension>
copy()
const override
29 {
return std::make_unique<Basic_Constraints>(m_is_ca, m_path_limit); }
32 m_is_ca(ca), m_path_limit(limit) {}
35 size_t get_path_limit()
const;
38 OID oid_of()
const override {
return static_oid(); }
41 std::string oid_name()
const override
42 {
return "X509v3.BasicConstraints"; }
44 std::vector<uint8_t> encode_inner()
const override;
45 void decode_inner(
const std::vector<uint8_t>&)
override;
57 std::unique_ptr<Certificate_Extension>
copy()
const override
59 return std::make_unique<Key_Usage>(m_constraints);
69 OID oid_of()
const override {
return static_oid(); }
72 std::string oid_name()
const override {
return "X509v3.KeyUsage"; }
74 bool should_encode()
const override
75 {
return !m_constraints.empty(); }
76 std::vector<uint8_t> encode_inner()
const override;
77 void decode_inner(
const std::vector<uint8_t>&)
override;
79 Key_Constraints m_constraints;
93 std::string_view hash_fn);
95 std::unique_ptr<Certificate_Extension>
copy()
const override
96 {
return std::make_unique<Subject_Key_ID>(m_key_id); }
98 const std::vector<uint8_t>&
get_key_id()
const {
return m_key_id; }
105 std::string oid_name()
const override
106 {
return "X509v3.SubjectKeyIdentifier"; }
108 bool should_encode()
const override {
return (m_key_id.size() > 0); }
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;
121 std::unique_ptr<Certificate_Extension>
copy()
const override
122 {
return std::make_unique<Authority_Key_ID>(m_key_id); }
127 const std::vector<uint8_t>&
get_key_id()
const {
return m_key_id; }
133 std::string oid_name()
const override
134 {
return "X509v3.AuthorityKeyIdentifier"; }
136 bool should_encode()
const override {
return (m_key_id.size() > 0); }
137 std::vector<uint8_t> encode_inner()
const override;
138 void decode_inner(
const std::vector<uint8_t>&)
override;
140 std::vector<uint8_t> m_key_id;
154 std::unique_ptr<Certificate_Extension>
copy()
const override
155 {
return std::make_unique<Subject_Alternative_Name>(get_alt_name()); }
161 std::string oid_name()
const override {
return "X509v3.SubjectAlternativeName"; }
163 bool should_encode()
const override {
return m_alt_name.has_items(); }
164 std::vector<uint8_t> encode_inner()
const override;
165 void decode_inner(
const std::vector<uint8_t>&)
override;
167 AlternativeName m_alt_name;
181 std::unique_ptr<Certificate_Extension>
copy()
const override
182 {
return std::make_unique<Issuer_Alternative_Name>(get_alt_name()); }
188 std::string oid_name()
const override {
return "X509v3.IssuerAlternativeName"; }
190 bool should_encode()
const override {
return m_alt_name.has_items(); }
191 std::vector<uint8_t> encode_inner()
const override;
192 void decode_inner(
const std::vector<uint8_t>&)
override;
194 AlternativeName m_alt_name;
203 std::unique_ptr<Certificate_Extension>
copy()
const override
204 {
return std::make_unique<Extended_Key_Usage>(m_oids); }
215 std::string oid_name()
const override {
return "X509v3.ExtendedKeyUsage"; }
217 bool should_encode()
const override {
return (m_oids.size() > 0); }
218 std::vector<uint8_t> encode_inner()
const override;
219 void decode_inner(
const std::vector<uint8_t>&)
override;
221 std::vector<OID> m_oids;
230 std::unique_ptr<Certificate_Extension>
copy()
const override
231 {
return std::make_unique<Name_Constraints>(m_name_constraints); }
237 const std::vector<X509_Certificate>& cert_path,
238 std::vector<std::set<Certificate_Status_Code>>& cert_status,
239 size_t pos)
override;
247 std::string oid_name()
const override
248 {
return "X509v3.NameConstraints"; }
250 bool should_encode()
const override {
return true; }
251 std::vector<uint8_t> encode_inner()
const override;
252 void decode_inner(
const std::vector<uint8_t>&)
override;
254 NameConstraints m_name_constraints;
263 std::unique_ptr<Certificate_Extension>
copy()
const override
264 {
return std::make_unique<Certificate_Policies>(m_oids); }
275 const std::vector<X509_Certificate>& cert_path,
276 std::vector<std::set<Certificate_Status_Code>>& cert_status,
277 size_t pos)
override;
279 std::string oid_name()
const override
280 {
return "X509v3.CertificatePolicies"; }
282 bool should_encode()
const override {
return (m_oids.size() > 0); }
283 std::vector<uint8_t> encode_inner()
const override;
284 void decode_inner(
const std::vector<uint8_t>&)
override;
286 std::vector<OID> m_oids;
295 std::unique_ptr<Certificate_Extension>
copy()
const override
296 {
return std::make_unique<Authority_Information_Access>(m_ocsp_responder, m_ca_issuers); }
301 m_ocsp_responder(ocsp), m_ca_issuers(ca_issuers) {}
307 const std::vector<std::string>
ca_issuers()
const {
return m_ca_issuers; }
310 std::string oid_name()
const override
311 {
return "PKIX.AuthorityInformationAccess"; }
313 bool should_encode()
const override {
return (!m_ocsp_responder.empty()); }
315 std::vector<uint8_t> encode_inner()
const override;
316 void decode_inner(
const std::vector<uint8_t>&)
override;
319 std::string m_ocsp_responder;
320 std::vector<std::string> m_ca_issuers;
329 std::unique_ptr<Certificate_Extension> copy()
const override;
334 size_t get_crl_number()
const;
340 std::string oid_name()
const override {
return "X509v3.CRLNumber"; }
342 bool should_encode()
const override {
return m_has_value; }
343 std::vector<uint8_t> encode_inner()
const override;
344 void decode_inner(
const std::vector<uint8_t>&)
override;
356 std::unique_ptr<Certificate_Extension>
copy()
const override
357 {
return std::make_unique<CRL_ReasonCode>(m_reason); }
367 std::string oid_name()
const override {
return "X509v3.ReasonCode"; }
369 bool should_encode()
const override {
return (m_reason != CRL_Code::Unspecified); }
370 std::vector<uint8_t> encode_inner()
const override;
371 void decode_inner(
const std::vector<uint8_t>&)
override;
394 std::unique_ptr<Certificate_Extension>
copy()
const override
395 {
return std::make_unique<CRL_Distribution_Points>(m_distribution_points); }
400 m_distribution_points(points) {}
403 {
return m_distribution_points; }
406 {
return m_crl_distribution_urls; }
412 std::string oid_name()
const override
413 {
return "X509v3.CRLDistributionPoints"; }
415 bool should_encode()
const override
416 {
return !m_distribution_points.empty(); }
418 std::vector<uint8_t> encode_inner()
const override;
419 void decode_inner(
const std::vector<uint8_t>&)
override;
421 std::vector<Distribution_Point> m_distribution_points;
422 std::vector<std::string> m_crl_distribution_urls;
435 m_distribution_point(distribution_point) {}
437 std::unique_ptr<Certificate_Extension>
copy()
const override
438 {
return std::make_unique<CRL_Issuing_Distribution_Point>(m_distribution_point); }
441 {
return m_distribution_point.
point(); }
447 std::string oid_name()
const override
448 {
return "X509v3.CRLIssuingDistributionPoint"; }
450 bool should_encode()
const override {
return true; }
451 std::vector<uint8_t> encode_inner()
const override;
452 void decode_inner(
const std::vector<uint8_t>&)
override;
454 CRL_Distribution_Points::Distribution_Point m_distribution_point;
473 std::unique_ptr<Certificate_Extension>
copy()
const override {
return std::make_unique<OCSP_NoCheck>(); }
478 std::string oid_name()
const override
479 {
return "PKIX.OCSP.NoCheck"; }
481 bool should_encode()
const override {
return true; }
482 std::vector<uint8_t> encode_inner()
const override {
return {}; }
483 void decode_inner(
const std::vector<uint8_t>&)
override;
494 m_oid(oid), m_critical(critical) {}
496 std::unique_ptr<Certificate_Extension>
copy()
const override
497 {
return std::make_unique<Unknown_Extension>(m_oid, m_critical); }
518 const std::vector<X509_Certificate>&,
519 std::vector<std::set<Certificate_Status_Code>>& cert_status,
524 cert_status.at(pos).insert(Certificate_Status_Code::UNKNOWN_CRITICAL_EXTENSION);
529 std::string oid_name()
const override {
return ""; }
531 bool should_encode()
const override {
return true; }
532 std::vector<uint8_t> encode_inner()
const override;
533 void decode_inner(
const std::vector<uint8_t>&)
override;
537 std::vector<uint8_t> m_bytes;
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)
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
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 *)
#define BOTAN_PUBLIC_API(maj, min)