9#ifndef BOTAN_X509_EXTENSIONS_H_
10#define BOTAN_X509_EXTENSIONS_H_
12#include <botan/bigint.h>
13#include <botan/pkix_types.h>
30static const size_t NO_CERT_PATH_LIMIT = 0xFFFFFFF0;
37 std::unique_ptr<Certificate_Extension>
copy()
const override {
38 return std::make_unique<Basic_Constraints>(m_is_ca, m_path_length_constraint);
51 BOTAN_DEPRECATED(
"Use path_length_constraint") size_t get_path_limit() const;
53 bool is_ca()
const {
return m_is_ca; }
62 std::string oid_name()
const override {
return "X509v3.BasicConstraints"; }
66 std::vector<uint8_t> encode_inner()
const override;
67 void decode_inner(
const std::vector<uint8_t>& in)
override;
70 std::optional<size_t> m_path_length_constraint;
78 std::unique_ptr<Certificate_Extension>
copy()
const override {
79 return std::make_unique<Key_Usage>(m_constraints);
93 std::string oid_name()
const override {
return "X509v3.KeyUsage"; }
97 bool should_encode()
const override {
return !m_constraints.empty(); }
99 std::vector<uint8_t> encode_inner()
const override;
100 void decode_inner(
const std::vector<uint8_t>& in)
override;
102 Key_Constraints m_constraints;
125 Subject_Key_ID(const std::vector<uint8_t>& public_key, std::string_view hash_fn);
128 return std::make_unique<Subject_Key_ID>(m_key_id);
131 const std::vector<uint8_t>&
get_key_id()
const {
return m_key_id; }
138 std::string oid_name()
const override {
return "X509v3.SubjectKeyIdentifier"; }
142 bool should_encode()
const override {
return (!m_key_id.empty()); }
144 std::vector<uint8_t> encode_inner()
const override;
145 void decode_inner(
const std::vector<uint8_t>& in)
override;
147 std::vector<uint8_t> m_key_id;
155 std::unique_ptr<Certificate_Extension>
copy()
const override {
return std::make_unique<Authority_Key_ID>(*
this); }
171 m_key_id(k), m_authority_cert(std::move(authority_cert)) {}
173 const std::vector<uint8_t>&
get_key_id()
const {
return m_key_id; }
185 std::string oid_name()
const override {
return "X509v3.AuthorityKeyIdentifier"; }
189 bool should_encode()
const override {
return !m_key_id.empty() || m_authority_cert.has_value(); }
191 std::vector<uint8_t> encode_inner()
const override;
192 void decode_inner(
const std::vector<uint8_t>& in)
override;
194 std::vector<uint8_t> m_key_id;
195 std::optional<Authority_Cert_Identifier> m_authority_cert;
209 std::unique_ptr<Certificate_Extension>
copy()
const override {
210 return std::make_unique<Subject_Alternative_Name>(
get_alt_name());
216 std::string oid_name()
const override {
return "X509v3.SubjectAlternativeName"; }
220 bool should_encode()
const override {
return m_alt_name.has_items(); }
222 std::vector<uint8_t> encode_inner()
const override;
223 void decode_inner(
const std::vector<uint8_t>& in)
override;
225 AlternativeName m_alt_name;
239 std::unique_ptr<Certificate_Extension>
copy()
const override {
240 return std::make_unique<Issuer_Alternative_Name>(
get_alt_name());
246 std::string oid_name()
const override {
return "X509v3.IssuerAlternativeName"; }
250 bool should_encode()
const override {
return m_alt_name.has_items(); }
252 std::vector<uint8_t> encode_inner()
const override;
253 void decode_inner(
const std::vector<uint8_t>& in)
override;
255 AlternativeName m_alt_name;
263 std::unique_ptr<Certificate_Extension>
copy()
const override {
264 return std::make_unique<Extended_Key_Usage>(m_oids);
278 std::string oid_name()
const override {
return "X509v3.ExtendedKeyUsage"; }
282 bool should_encode()
const override {
return (!m_oids.empty()); }
284 std::vector<uint8_t> encode_inner()
const override;
285 void decode_inner(
const std::vector<uint8_t>& in)
override;
287 std::vector<OID> m_oids;
295 std::unique_ptr<Certificate_Extension>
copy()
const override {
296 return std::make_unique<Name_Constraints>(m_name_constraints);
304 const std::optional<X509_Certificate>& issuer,
305 const std::vector<X509_Certificate>& cert_path,
306 std::vector<std::set<Certificate_Status_Code>>& cert_status,
307 size_t pos)
const override;
316 std::string oid_name()
const override {
return "X509v3.NameConstraints"; }
320 bool should_encode()
const override {
return true; }
322 std::vector<uint8_t> encode_inner()
const override;
323 void decode_inner(
const std::vector<uint8_t>& in)
override;
325 NameConstraints m_name_constraints;
333 std::unique_ptr<Certificate_Extension>
copy()
const override {
334 return std::make_unique<Certificate_Policies>(*
this);
348 const std::optional<X509_Certificate>& issuer,
349 const std::vector<X509_Certificate>& cert_path,
350 std::vector<std::set<Certificate_Status_Code>>& cert_status,
351 size_t pos)
const override;
354 std::string oid_name()
const override {
return "X509v3.CertificatePolicies"; }
358 bool should_encode()
const override {
return (!m_oids.empty()); }
360 std::vector<uint8_t> encode_inner()
const override;
361 void decode_inner(
const std::vector<uint8_t>& in)
override;
363 std::vector<OID> m_oids;
364 bool m_has_duplicate =
false;
386 m_method(std::move(method)),
411 std::optional<std::string> location_as_uri_string()
const;
417 std::vector<uint8_t> m_location_value;
420 std::unique_ptr<Certificate_Extension> copy()
const override;
426 const std::vector<std::
string>&
ca_issuers = std::vector<std::
string>());
430 const std::vector<std::
string>&
ca_issuers = std::vector<std::
string>());
452 if(m_ocsp_responders.empty()) {
455 return m_ocsp_responders[0].original_input();
458 BOTAN_DEPRECATED(
"Use ocsp_responder_uris") std::vector<std::
string> ocsp_responders() const;
472 BOTAN_DEPRECATED(
"Use ca_issuer_uris") std::vector<std::
string> ca_issuers() const;
477 std::string oid_name()
const override {
return "PKIX.AuthorityInformationAccess"; }
481 bool should_encode()
const override {
483 return !m_access_descriptions.empty();
486 std::vector<uint8_t> encode_inner()
const override;
487 void decode_inner(
const std::vector<uint8_t>& in)
override;
489 std::vector<URI> m_ocsp_responders;
490 std::vector<URI> m_ca_issuers;
491 std::vector<AccessDescription> m_access_descriptions;
499 std::unique_ptr<Certificate_Extension>
copy()
const override;
507 const BigInt& crl_number()
const;
516 std::string oid_name()
const override {
return "X509v3.CRLNumber"; }
520 bool should_encode()
const override {
return m_has_value; }
522 std::vector<uint8_t> encode_inner()
const override;
523 void decode_inner(
const std::vector<uint8_t>& in)
override;
534 std::unique_ptr<Certificate_Extension>
copy()
const override {
535 return std::make_unique<CRL_ReasonCode>(m_reason);
547 std::string oid_name()
const override {
return "X509v3.ReasonCode"; }
553 std::vector<uint8_t> encode_inner()
const override;
554 void decode_inner(
const std::vector<uint8_t>& in)
override;
587 const std::optional<AlternativeName>&
full_name()
const {
return m_full_name; }
590 std::optional<AlternativeName> m_full_name;
614 std::optional<ReasonFlags>
reasons,
616 m_dp_name(std::move(dp_name)), m_reasons(
reasons), m_crl_issuer(std::move(
crl_issuer)) {}
626 const std::optional<ReasonFlags>&
reasons()
const {
return m_reasons; }
631 const std::optional<AlternativeName>&
crl_issuer()
const {
return m_crl_issuer; }
649 return std::make_unique<CRL_Distribution_Points>(*
this);
658 BOTAN_DEPRECATED(
"Use crl_distribution_point_uris") std::vector<std::
string> crl_distribution_urls() const;
667 std::string oid_name()
const override {
return "X509v3.CRLDistributionPoints"; }
671 bool should_encode()
const override {
return !m_distribution_points.empty(); }
673 std::vector<uint8_t> encode_inner()
const override;
674 void decode_inner(
const std::vector<uint8_t>& in)
override;
676 std::vector<Distribution_Point> m_distribution_points;
677 std::vector<URI> m_crl_distribution_urls;
703 m_dp_name(std::move(dp_name)),
718 std::unique_ptr<Certificate_Extension>
copy()
const override {
719 return std::make_unique<CRL_Issuing_Distribution_Point>(*
this);
749 std::string oid_name()
const override {
return "X509v3.CRLIssuingDistributionPoint"; }
758 bool should_encode()
const override {
759 return m_dp_name.has_value() || m_only_contains_user_certs || m_only_contains_ca_certs ||
760 m_only_some_reasons.has_value() || m_indirect_crl || m_only_contains_attribute_certs;
763 std::vector<uint8_t> encode_inner()
const override;
764 void decode_inner(
const std::vector<uint8_t>& in)
override;
766 std::optional<DistributionPointName> m_dp_name;
767 bool m_only_contains_user_certs =
false;
768 bool m_only_contains_ca_certs =
false;
769 std::optional<ReasonFlags> m_only_some_reasons;
770 bool m_indirect_crl =
false;
771 bool m_only_contains_attribute_certs =
false;
789 std::unique_ptr<Certificate_Extension>
copy()
const override {
return std::make_unique<OCSP_NoCheck>(); }
796 const std::optional<X509_Certificate>& issuer,
797 const std::vector<X509_Certificate>& cert_path,
798 std::vector<std::set<Certificate_Status_Code>>& cert_status,
799 size_t pos)
const override;
802 std::string oid_name()
const override {
return "PKIX.OCSP.NoCheck"; }
806 bool should_encode()
const override {
return true; }
808 std::vector<uint8_t> encode_inner()
const override;
810 void decode_inner(
const std::vector<uint8_t>& in)
override;
832 std::unique_ptr<Certificate_Extension>
copy()
const override {
return std::make_unique<NoRevocationAvailable>(); }
839 const std::optional<X509_Certificate>& issuer,
840 const std::vector<X509_Certificate>& cert_path,
841 std::vector<std::set<Certificate_Status_Code>>& cert_status,
842 size_t pos)
const override;
845 std::string oid_name()
const override {
return "X509v3.NoRevocationAvailable"; }
849 bool should_encode()
const override {
return true; }
851 std::vector<uint8_t> encode_inner()
const override;
852 void decode_inner(
const std::vector<uint8_t>& in)
override;
886 const std::string& service_provider_code()
const;
888 const RangeContainer& telephone_number_range()
const;
890 const std::string& telephone_number()
const;
894 DataContainer m_data;
899 std::unique_ptr<Certificate_Extension>
copy()
const override {
return std::make_unique<TNAuthList>(*
this); }
905 const std::vector<Entry>&
entries()
const {
return m_tn_entries; }
908 std::string oid_name()
const override {
return "PKIX.TNAuthList"; }
912 bool should_encode()
const override {
return true; }
914 std::vector<uint8_t> encode_inner()
const override;
915 void decode_inner(
const std::vector<uint8_t>& in)
override;
917 std::vector<Entry> m_tn_entries;
935 static constexpr size_t Length =
static_cast<size_t>(V);
938 explicit IPAddress(std::span<const uint8_t> v);
940 std::array<uint8_t, Length>
value()
const {
return m_value; }
947 for(
auto it = m_value.rbegin(); it != m_value.rend(); it++) {
959 for(
size_t i = 0; i < rhs; i++) {
966 for(
size_t i = 0; i < Length; i++) {
968 return std::strong_ordering::less;
970 return std::strong_ordering::greater;
973 return std::strong_ordering::equal;
980 std::array<uint8_t, Length> m_value;
1005 IPAddress<V> m_max{};
1007 IPAddress<V> decode_single_address(
const ASN1_BitString& decoded,
bool min);
1010 template <Version V>
1016 const std::optional<std::vector<IPAddressOrRange<V>>>&
ranges()
const {
return m_ip_addr_ranges; }
1023 std::optional<std::vector<IPAddressOrRange<V>>> m_ip_addr_ranges;
1036 m_safi(
safi), m_ip_addr_choice(choice) {
1044 uint16_t
afi()
const {
return m_afi; }
1046 std::optional<uint8_t>
safi()
const {
return m_safi; }
1052 std::optional<uint8_t> m_safi;
1053 AddrChoice m_ip_addr_choice;
1058 explicit IPAddressBlocks(
const std::vector<IPAddressFamily>& blocks) : m_ip_addr_blocks(blocks) {
1059 this->sort_and_merge();
1062 std::unique_ptr<Certificate_Extension>
copy()
const override {
return std::make_unique<IPAddressBlocks>(*
this); }
1069 const std::optional<X509_Certificate>& issuer,
1070 const std::vector<X509_Certificate>& cert_path,
1071 std::vector<std::set<Certificate_Status_Code>>& cert_status,
1072 size_t pos)
const override;
1075 template <Version V>
1076 void add_address(
const std::array<uint8_t,
static_cast<size_t>(V)>& address,
1077 std::optional<uint8_t> safi = std::nullopt) {
1082 template <Version V>
1083 void add_address(
const std::array<uint8_t,
static_cast<std::size_t
>(V)>& min,
1084 const std::array<uint8_t,
static_cast<std::size_t
>(V)>& max,
1085 std::optional<uint8_t> safi = std::nullopt) {
1092 template <Version V>
1093 void restrict(std::optional<uint8_t> safi = std::nullopt) {
1094 std::vector<IPAddressOrRange<V>> addresses = {};
1100 template <Version V>
1101 void inherit(std::optional<uint8_t> safi = std::nullopt) {
1106 const std::vector<IPAddressFamily>&
addr_blocks()
const {
return m_ip_addr_blocks; }
1115 std::string oid_name()
const override {
return "PKIX.IpAddrBlocks"; }
1119 bool should_encode()
const override {
return true; }
1121 std::vector<uint8_t> encode_inner()
const override;
1122 void decode_inner(
const std::vector<uint8_t>& in)
override;
1124 std::vector<IPAddressFamily> m_ip_addr_blocks;
1125 size_t m_v4_count = 0;
1126 size_t m_v6_count = 0;
1128 void sort_and_merge();
1129 template <Version V>
1130 IPAddressFamily merge(std::vector<IPAddressFamily>& blocks);
1176 const std::optional<std::vector<ASIdOrRange>>&
ranges()
const {
return m_as_ranges; }
1179 std::optional<std::vector<ASIdOrRange>> m_as_ranges;
1188 const std::optional<ASIdentifierChoice>&
rdi) :
1190 if(!m_asnum.has_value() && !m_rdi.has_value()) {
1191 throw Decoding_Error(
"One of asnum, rdi must be present");
1195 const std::optional<ASIdentifierChoice>&
asnum()
const {
return m_asnum; }
1197 const std::optional<ASIdentifierChoice>&
rdi()
const {
return m_rdi; }
1203 std::optional<ASIdentifierChoice> m_asnum;
1204 std::optional<ASIdentifierChoice> m_rdi;
1211 std::unique_ptr<Certificate_Extension>
copy()
const override {
return std::make_unique<ASBlocks>(*
this); }
1218 const std::optional<X509_Certificate>& issuer,
1219 const std::vector<X509_Certificate>& cert_path,
1220 std::vector<std::set<Certificate_Status_Code>>& cert_status,
1221 size_t pos)
const override;
1228 m_as_identifiers =
ASIdentifiers(add_new(m_as_identifiers.asnum(), min, max), m_as_identifiers.rdi());
1233 std::vector<ASIdOrRange> empty;
1245 m_as_identifiers =
ASIdentifiers(m_as_identifiers.asnum(), add_new(m_as_identifiers.rdi(), min, max));
1250 std::vector<ASIdOrRange> empty;
1260 ASIdentifiers m_as_identifiers;
1262 std::string oid_name()
const override {
return "PKIX.AutonomousSysIds"; }
1266 bool should_encode()
const override {
return true; }
1268 static ASIdentifierChoice add_new(
const std::optional<ASIdentifierChoice>& old, asnum_t min, asnum_t max);
1270 std::vector<uint8_t> encode_inner()
const override;
1271 void decode_inner(
const std::vector<uint8_t>& in)
override;
1283 std::unique_ptr<Certificate_Extension>
copy()
const override {
1284 return std::make_unique<Unknown_Extension>(*
this);
1311 const std::optional<X509_Certificate>& ,
1312 const std::vector<X509_Certificate>& ,
1313 std::vector<std::set<Certificate_Status_Code>>& cert_status,
1314 size_t pos)
const override {
1315 if(m_failed_to_decode) {
1317 }
else if(m_critical) {
1323 std::string oid_name()
const override {
return ""; }
1327 bool should_encode()
const override {
return true; }
1329 std::vector<uint8_t> encode_inner()
const override;
1330 void decode_inner(
const std::vector<uint8_t>& in)
override;
1334 bool m_failed_to_decode;
1335 std::vector<uint8_t> m_bytes;
#define BOTAN_PUBLIC_API(maj, min)
#define BOTAN_DEPRECATED(msg)
#define BOTAN_FUTURE_EXPLICIT
void encode_into(DER_Encoder &to) const override
ASIdOrRange(asnum_t min, asnum_t max)
void decode_from(BER_Decoder &from) override
void encode_into(DER_Encoder &to) const override
ASIdentifierChoice()=default
void decode_from(BER_Decoder &from) override
const std::optional< std::vector< ASIdOrRange > > & ranges() const
const std::optional< ASIdentifierChoice > & asnum() const
ASIdentifiers(const std::optional< ASIdentifierChoice > &asnum, const std::optional< ASIdentifierChoice > &rdi)
const std::optional< ASIdentifierChoice > & rdi() const
void encode_into(DER_Encoder &to) const override
void decode_from(BER_Decoder &from) override
void inherit_asnum()
Mark the asnum entry as 'inherit'.
void restrict_rdi()
Make the extension contain no allowed rdi's.
void inherit_rdi()
Mark the rdi entry as 'inherit'.
void add_rdi(asnum_t min, asnum_t max)
Add an rdi range to this extension.
const ASIdentifiers & as_identifiers() const
ASBlocks(const ASIdentifiers &as_idents)
OID oid_of() const override
void restrict_asnum()
Make the extension contain no allowed asnum's.
std::unique_ptr< Certificate_Extension > copy() const override
void add_asnum(asnum_t asnum)
Add a single asnum to this extension.
void add_rdi(asnum_t rdi)
Add a single rdi to this extension.
void add_asnum(asnum_t min, asnum_t max)
Add an asnum range to this extension.
Authority_Key_ID(const std::vector< uint8_t > &k)
OID oid_of() const override
const std::optional< Authority_Cert_Identifier > & authority_cert_identifier() const
Authority_Key_ID()=default
std::unique_ptr< Certificate_Extension > copy() const override
const std::vector< uint8_t > & get_key_id() const
Authority_Key_ID(const std::vector< uint8_t > &k, Authority_Cert_Identifier authority_cert)
OID oid_of() const override
BOTAN_FUTURE_EXPLICIT Basic_Constraints(bool is_ca=false, size_t path_length_constraint=0)
std::unique_ptr< Certificate_Extension > copy() const override
std::optional< size_t > path_length_constraint() const
const std::optional< ReasonFlags > & reasons() const
Distribution_Point()=default
const std::optional< AlternativeName > & crl_issuer() const
void encode_into(DER_Encoder &to) const override
void decode_from(BER_Decoder &from) override
Distribution_Point(const AlternativeName &name)
Distribution_Point(std::optional< DistributionPointName > dp_name, std::optional< ReasonFlags > reasons, std::optional< AlternativeName > crl_issuer)
const std::optional< DistributionPointName > & distribution_point_name() const
CRL_Distribution_Points()=default
OID oid_of() const override
const std::vector< URI > & crl_distribution_point_uris() const
std::unique_ptr< Certificate_Extension > copy() const override
const std::vector< Distribution_Point > & distribution_points() const
bool only_contains_user_certs() const
const std::optional< DistributionPointName > & distribution_point_name() const
const std::optional< ReasonFlags > & only_some_reasons() const
OID oid_of() const override
std::unique_ptr< Certificate_Extension > copy() const override
bool only_contains_ca_certs() const
CRL_Issuing_Distribution_Point(DistributionPointName dp_name)
bool only_contains_attribute_certs() const
CRL_Issuing_Distribution_Point(std::optional< DistributionPointName > dp_name, bool only_contains_user_certs, bool only_contains_ca_certs, std::optional< ReasonFlags > only_some_reasons, bool indirect_crl, bool only_contains_attribute_certs)
CRL_Issuing_Distribution_Point()=default
bool indirect_crl() const
OID oid_of() const override
std::unique_ptr< Certificate_Extension > copy() const override
BOTAN_FUTURE_EXPLICIT CRL_Number(size_t n)
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
OID oid_of() const override
DistributionPointName()=default
const std::optional< AlternativeName > & full_name() const
DistributionPointName(AlternativeName full_name)
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)
const std::optional< std::vector< IPAddressOrRange< V > > > & ranges() const
void decode_from(BER_Decoder &from) override
void encode_into(DER_Encoder &to) const override
IPAddressChoice()=default
IPAddressChoice(std::optional< std::span< const IPAddressOrRange< V > > > ranges)
void encode_into(DER_Encoder &to) const override
std::variant< IPAddressChoice< Version::IPv4 >, IPAddressChoice< Version::IPv6 > > AddrChoice
IPAddressFamily(const AddrChoice &choice, std::optional< uint8_t > safi=std::nullopt)
std::optional< uint8_t > safi() const
void decode_from(BER_Decoder &from) override
const AddrChoice & addr_choice() const
IPAddressFamily()=default
IPAddress< V > min() const
void encode_into(DER_Encoder &to) const override
IPAddressOrRange(const IPAddress< V > &min, const IPAddress< V > &max)
IPAddressOrRange(const IPAddress< V > &addr)
IPAddressOrRange()=default
void decode_from(BER_Decoder &from) override
IPAddress< V > max() const
IPAddress(std::span< const uint8_t > v)
friend class IPAddressBlocks
friend bool operator==(const IPAddress< V > &lhs, const IPAddress< V > &rhs)
friend IPAddress< V > operator+(IPAddress< V > lhs, size_t rhs)
friend std::strong_ordering operator<=>(const IPAddress< V > lhs, const IPAddress< V > &rhs)
std::array< uint8_t, Length > value() const
void inherit(std::optional< uint8_t > safi=std::nullopt)
Mark the specified IP version as 'inherit' (for the specified SAFI, if any).
void add_address(const std::array< uint8_t, static_cast< size_t >(V)> &address, std::optional< uint8_t > safi=std::nullopt)
Add a single IP address to this extension (for the specified SAFI, if any).
IPAddressBlocks()=default
size_t v6_count() const
The number of IPv6 families contained in the extension.
std::unique_ptr< Certificate_Extension > copy() const override
void restrict(std::optional< uint8_t > safi=std::nullopt)
Make the extension contain no allowed IP addresses for the specified IP version (and SAFI,...
void add_address(const std::array< uint8_t, static_cast< std::size_t >(V)> &min, const std::array< uint8_t, static_cast< std::size_t >(V)> &max, std::optional< uint8_t > safi=std::nullopt)
Add an IP address range to this extension (for the specified SAFI, if any).
const std::vector< IPAddressFamily > & addr_blocks() const
IPAddressBlocks(const std::vector< IPAddressFamily > &blocks)
OID oid_of() const override
size_t v4_count() const
The number of IPv4 families contained in the extension.
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
BOTAN_FUTURE_EXPLICIT 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
NoRevocationAvailable()=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
std::vector< TelephoneNumberRangeData > RangeContainer
void decode_from(class BER_Decoder &from) override
void encode_into(DER_Encoder &to) const override
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
OID oid_of() const override
std::unique_ptr< Certificate_Extension > copy() const override
Unknown_Extension(const OID &oid, bool critical, bool failed_to_decode=false)
const std::vector< uint8_t > & extension_contents() const
bool failed_to_decode() const
void validate(const X509_Certificate &, const std::optional< X509_Certificate > &, const std::vector< X509_Certificate > &, std::vector< std::set< Certificate_Status_Code > > &cert_status, size_t pos) const override
bool is_critical_extension() const
@ EXTENSION_ENCODING_ERROR
@ UNKNOWN_CRITICAL_EXTENSION
X509_Serial_Number serial_number