8 #ifndef BOTAN_X509_EXTENSIONS_H_
9 #define BOTAN_X509_EXTENSIONS_H_
11 #include <botan/asn1_obj.h>
12 #include <botan/asn1_oid.h>
13 #include <botan/asn1_alt_name.h>
14 #include <botan/cert_status.h>
15 #include <botan/name_constraint.h>
16 #include <botan/key_constraint.h>
17 #include <botan/crl_ent.h>
23 class X509_Certificate;
34 virtual OID oid_of()
const = 0;
42 virtual std::string oid_name()
const = 0;
75 const std::vector<std::shared_ptr<const X509_Certificate>>& cert_path,
76 std::vector<std::set<Certificate_Status_Code>>& cert_status,
83 virtual std::vector<uint8_t> encode_inner()
const = 0;
84 virtual void decode_inner(
const std::vector<uint8_t>&) = 0;
108 if(extn->oid_name().empty())
112 else if(
const T* extn_as_T = dynamic_cast<const T*>(extn))
118 throw Decoding_Error(
"Exception::get_extension_object_as dynamic_cast failed");
131 return m_extension_oids;
137 bool extension_set(
const OID& oid)
const;
142 bool critical_extension_set(
const OID& oid)
const;
148 std::vector<uint8_t> get_extension_bits(
const OID& oid)
const;
150 void encode_into(
class DER_Encoder&)
const override;
183 bool remove(
const OID& oid);
192 std::unique_ptr<Certificate_Extension>
get(
const OID& oid)
const;
207 auto extn_info = m_extension_info.find(oid);
209 if(extn_info != m_extension_info.end())
212 if(extn_info->second.obj().oid_name() ==
"")
214 std::unique_ptr<T> ext(
new T);
215 ext->decode_inner(extn_info->second.bits());
228 std::vector<std::pair<std::unique_ptr<Certificate_Extension>,
bool>> extensions()
const;
235 std::map<OID, std::pair<std::vector<uint8_t>,
bool>> extensions_raw()
const;
246 static std::unique_ptr<Certificate_Extension>
247 create_extn_obj(
const OID& oid,
249 const std::vector<uint8_t>& body);
251 class Extensions_Info
254 Extensions_Info(
bool critical,
262 Extensions_Info(
bool critical,
263 const std::vector<uint8_t>& encoding,
264 Certificate_Extension* ext) :
271 bool is_critical()
const {
return m_critical; }
272 const std::vector<uint8_t>& bits()
const {
return m_bits; }
273 const Certificate_Extension& obj()
const
280 std::shared_ptr<Certificate_Extension>
m_obj;
281 std::vector<uint8_t>
m_bits;
282 bool m_critical =
false;
285 std::vector<OID> m_extension_oids;
286 std::map<OID, Extensions_Info> m_extension_info;
289 namespace Cert_Extension {
291 static const size_t NO_CERT_PATH_LIMIT = 0xFFFFFFF0;
303 m_is_ca(ca), m_path_limit(limit) {}
306 size_t get_path_limit()
const;
312 std::string oid_name()
const override
313 {
return "X509v3.BasicConstraints"; }
315 std::vector<uint8_t> encode_inner()
const override;
316 void decode_inner(
const std::vector<uint8_t>&)
override;
339 std::string oid_name()
const override {
return "X509v3.KeyUsage"; }
341 bool should_encode()
const override
343 std::vector<uint8_t> encode_inner()
const override;
344 void decode_inner(
const std::vector<uint8_t>&)
override;
345 void contents_to(Data_Store&, Data_Store&)
const override;
361 const std::string& hash_fn);
366 const std::vector<uint8_t>&
get_key_id()
const {
return m_key_id; }
373 std::string oid_name()
const override
374 {
return "X509v3.SubjectKeyIdentifier"; }
376 bool should_encode()
const override {
return (m_key_id.size() > 0); }
377 std::vector<uint8_t> encode_inner()
const override;
378 void decode_inner(
const std::vector<uint8_t>&)
override;
379 void contents_to(Data_Store&, Data_Store&)
const override;
381 std::vector<uint8_t> m_key_id;
396 const std::vector<uint8_t>&
get_key_id()
const {
return m_key_id; }
402 std::string oid_name()
const override
403 {
return "X509v3.AuthorityKeyIdentifier"; }
405 bool should_encode()
const override {
return (m_key_id.size() > 0); }
406 std::vector<uint8_t> encode_inner()
const override;
407 void decode_inner(
const std::vector<uint8_t>&)
override;
408 void contents_to(Data_Store&, Data_Store&)
const override;
410 std::vector<uint8_t> m_key_id;
431 std::string oid_name()
const override {
return "X509v3.SubjectAlternativeName"; }
433 bool should_encode()
const override {
return m_alt_name.has_items(); }
434 std::vector<uint8_t> encode_inner()
const override;
435 void decode_inner(
const std::vector<uint8_t>&)
override;
436 void contents_to(Data_Store&, Data_Store&)
const override;
438 AlternativeName m_alt_name;
459 std::string oid_name()
const override {
return "X509v3.IssuerAlternativeName"; }
461 bool should_encode()
const override {
return m_alt_name.has_items(); }
462 std::vector<uint8_t> encode_inner()
const override;
463 void decode_inner(
const std::vector<uint8_t>&)
override;
464 void contents_to(Data_Store&, Data_Store&)
const override;
466 AlternativeName m_alt_name;
481 const std::vector<OID>&
get_oids()
const {
return m_oids; }
487 std::string oid_name()
const override {
return "X509v3.ExtendedKeyUsage"; }
489 bool should_encode()
const override {
return (m_oids.size() > 0); }
490 std::vector<uint8_t> encode_inner()
const override;
491 void decode_inner(
const std::vector<uint8_t>&)
override;
492 void contents_to(Data_Store&, Data_Store&)
const override;
494 std::vector<OID> m_oids;
510 const std::vector<std::shared_ptr<const X509_Certificate>>& cert_path,
511 std::vector<std::set<Certificate_Status_Code>>& cert_status,
512 size_t pos)
override;
520 std::string oid_name()
const override
521 {
return "X509v3.NameConstraints"; }
523 bool should_encode()
const override {
return true; }
524 std::vector<uint8_t> encode_inner()
const override;
525 void decode_inner(
const std::vector<uint8_t>&)
override;
526 void contents_to(Data_Store&, Data_Store&)
const override;
528 NameConstraints m_name_constraints;
543 BOTAN_DEPRECATED(
"Use get_policy_oids")
544 std::vector<
OID> get_oids()
const {
return m_oids; }
552 const std::vector<std::shared_ptr<const X509_Certificate>>& cert_path,
553 std::vector<std::set<Certificate_Status_Code>>& cert_status,
554 size_t pos)
override;
556 std::string oid_name()
const override
557 {
return "X509v3.CertificatePolicies"; }
559 bool should_encode()
const override {
return (m_oids.size() > 0); }
560 std::vector<uint8_t> encode_inner()
const override;
561 void decode_inner(
const std::vector<uint8_t>&)
override;
562 void contents_to(Data_Store&, Data_Store&)
const override;
564 std::vector<OID> m_oids;
579 m_ocsp_responder(ocsp), m_ca_issuers(ca_issuers) {}
585 const std::vector<std::string>
ca_issuers()
const {
return m_ca_issuers; }
588 std::string oid_name()
const override
589 {
return "PKIX.AuthorityInformationAccess"; }
591 bool should_encode()
const override {
return (!m_ocsp_responder.empty()); }
593 std::vector<uint8_t> encode_inner()
const override;
594 void decode_inner(
const std::vector<uint8_t>&)
override;
596 void contents_to(Data_Store&, Data_Store&)
const override;
598 std::string m_ocsp_responder;
599 std::vector<std::string> m_ca_issuers;
613 size_t get_crl_number()
const;
619 std::string oid_name()
const override {
return "X509v3.CRLNumber"; }
621 bool should_encode()
const override {
return m_has_value; }
622 std::vector<uint8_t> encode_inner()
const override;
623 void decode_inner(
const std::vector<uint8_t>&)
override;
624 void contents_to(Data_Store&, Data_Store&)
const override;
647 std::string oid_name()
const override {
return "X509v3.ReasonCode"; }
649 bool should_encode()
const override {
return (m_reason != UNSPECIFIED); }
650 std::vector<uint8_t> encode_inner()
const override;
651 void decode_inner(
const std::vector<uint8_t>&)
override;
652 void contents_to(Data_Store&, Data_Store&)
const override;
667 void encode_into(
class DER_Encoder&)
const override;
681 m_distribution_points(points) {}
684 {
return m_distribution_points; }
687 {
return m_crl_distribution_urls; }
693 std::string oid_name()
const override
694 {
return "X509v3.CRLDistributionPoints"; }
696 bool should_encode()
const override
697 {
return !m_distribution_points.empty(); }
699 std::vector<uint8_t> encode_inner()
const override;
700 void decode_inner(
const std::vector<uint8_t>&)
override;
701 void contents_to(Data_Store&, Data_Store&)
const override;
703 std::vector<Distribution_Point> m_distribution_points;
704 std::vector<std::string> m_crl_distribution_urls;
717 m_distribution_point(distribution_point) {}
723 {
return m_distribution_point.
point(); }
729 std::string oid_name()
const override
730 {
return "X509v3.CRLIssuingDistributionPoint"; }
732 bool should_encode()
const override {
return true; }
733 std::vector<uint8_t> encode_inner()
const override;
734 void decode_inner(
const std::vector<uint8_t>&)
override;
735 void contents_to(Data_Store&, Data_Store&)
const override;
737 CRL_Distribution_Points::Distribution_Point m_distribution_point;
748 m_oid(oid), m_critical(critical) {}
772 const std::vector<std::shared_ptr<const X509_Certificate>>&,
773 std::vector<std::set<Certificate_Status_Code>>& cert_status,
783 std::string oid_name()
const override {
return ""; }
785 bool should_encode()
const override {
return true; }
786 std::vector<uint8_t> encode_inner()
const override;
787 void decode_inner(
const std::vector<uint8_t>&)
override;
788 void contents_to(Data_Store&, Data_Store&)
const override;
792 std::vector<uint8_t> m_bytes;
const std::vector< uint8_t > & get_key_id() const
const T * get_extension_object_as(const OID &oid=T::static_oid()) const
CRL_Distribution_Points * copy() const override
const NameConstraints & get_name_constraints() const
OID oid_of() const override
OID oid_of() const override
const std::vector< OID > & get_oids() const
OID oid_of() const override
std::unique_ptr< T > get_raw(const OID &oid) const
Key_Usage * copy() const override
std::vector< bitmask_type > m_bits
const std::vector< uint8_t > & extension_contents() const
int(* final)(unsigned char *, CTX *)
#define BOTAN_PUBLIC_API(maj, min)
const AlternativeName & point() const
Issuer_Alternative_Name(const AlternativeName &name=AlternativeName())
CRL_Issuing_Distribution_Point * copy() const override
OID oid_of() const override
Unknown_Extension * copy() const override
OID oid_of() const override
Key_Constraints get_constraints() const
CRL_Code get_reason() const
const AlternativeName & get_alt_name() const
OID oid_of() const override
OID oid_of() const override
Subject_Alternative_Name * copy() const override
Authority_Key_ID(const std::vector< uint8_t > &k)
Certificate_Policies(const std::vector< OID > &o)
Basic_Constraints(bool ca=false, size_t limit=0)
#define BOTAN_ASSERT_NONNULL(ptr)
OID oid_of() const override
const std::vector< std::string > & crl_distribution_urls() const
const std::vector< OID > & get_extension_oids() const
CRL_ReasonCode * copy() const override
OID oid_of() const override
const std::vector< Distribution_Point > & distribution_points() const
const std::vector< OID > & get_policy_oids() const
Name_Constraints * copy() const override
OID oid_of() const override
CRL_Distribution_Points(const std::vector< Distribution_Point > &points)
const AlternativeName & get_point() const
virtual bool should_encode() const
Basic_Constraints * copy() const override
OID oid_of() const override
const AlternativeName & get_alt_name() const
const std::vector< uint8_t > & get_key_id() const
Extended_Key_Usage(const std::vector< OID > &o)
Name_Constraints(const NameConstraints &nc)
Subject_Key_ID(const std::vector< uint8_t > &k)
OID oid_of() const override
OID oid_of() const override
bool is_critical_extension() const
CRL_Issuing_Distribution_Point()=default
Key_Usage(Key_Constraints c=NO_CONSTRAINTS)
OID oid_of() const override
CRL_Issuing_Distribution_Point(const CRL_Distribution_Points::Distribution_Point &distribution_point)
void validate(const X509_Certificate &, const X509_Certificate &, const std::vector< std::shared_ptr< const X509_Certificate >> &, std::vector< std::set< Certificate_Status_Code >> &cert_status, size_t pos) override
Issuer_Alternative_Name * copy() const override
CRL_ReasonCode(CRL_Code r=UNSPECIFIED)
Extended_Key_Usage * copy() const override
Unknown_Extension(const OID &oid, bool critical)
Authority_Key_ID * copy() const override
Subject_Key_ID * copy() const override
Subject_Alternative_Name(const AlternativeName &name=AlternativeName())
Certificate_Policies * copy() const override