11#ifndef BOTAN_PKIX_TYPES_H_
12#define BOTAN_PKIX_TYPES_H_
14#include <botan/asn1_obj.h>
16#include <botan/ipv4_address.h>
17#include <botan/ipv6_address.h>
18#include <botan/pkix_enums.h>
19#include <initializer_list>
47 X509_DN(std::initializer_list<std::pair<std::string_view, std::string_view>> args) {
48 for(
const auto& i : args) {
58 explicit
X509_DN(const std::multimap<
OID, std::
string>& args) {
59 for(
const auto& i : args) {
69 explicit
X509_DN(const std::multimap<std::
string, std::
string>& args) {
70 for(
const auto& i : args) {
78 bool has_field(
const OID& oid)
const;
84 const std::vector<uint8_t>&
get_bits()
const {
return m_dn_bits; }
86 std::vector<uint8_t> DER_encode()
const;
88 bool empty()
const {
return m_rdn.empty(); }
90 size_t count()
const {
return m_rdn.size(); }
98 const std::vector<std::pair<OID, ASN1_String>>&
dn_info()
const {
return m_rdn; }
100 std::multimap<OID, std::string> get_attributes()
const;
101 std::multimap<std::string, std::string> contents()
const;
103 bool has_field(std::string_view attr)
const;
104 std::vector<std::string> get_attribute(std::string_view attr)
const;
105 std::string get_first_attribute(std::string_view attr)
const;
107 void add_attribute(std::string_view key, std::string_view val);
113 static std::string deref_info_field(std::string_view key);
122 static size_t lookup_ub(
const OID& oid);
125 std::vector<std::pair<OID, ASN1_String>> m_rdn;
126 std::vector<uint8_t> m_dn_bits;
129BOTAN_PUBLIC_API(2, 0) bool operator==(const X509_DN& dn1, const X509_DN& dn2);
130BOTAN_PUBLIC_API(2, 0)
bool operator!=(const X509_DN& dn1, const X509_DN& dn2);
136BOTAN_PUBLIC_API(2, 0)
bool operator<(const X509_DN& dn1, const X509_DN& dn2);
138BOTAN_PUBLIC_API(2, 0) std::ostream& operator<<(std::ostream& out, const X509_DN& dn);
139BOTAN_PUBLIC_API(2, 0) std::istream& operator>>(std::istream& in, X509_DN& dn);
153 void add_uri(std::string_view uri);
177 const std::set<std::string>&
uris()
const {
return m_uri; }
180 const std::set<std::string>&
email()
const {
return m_email; }
183 const std::set<std::string>&
dns()
const {
return m_dns; }
189 const std::set<IPv6Address>&
ipv6_address()
const {
return m_ipv6_addr; }
204 size_t count()
const;
207 bool has_items()
const;
210 BOTAN_DEPRECATED(
"Use AlternativeName::{uris, email, dns, othernames, directory_names}")
211 std::multimap<std::
string, std::
string> contents() const;
213 BOTAN_DEPRECATED(
"Use AlternativeName::{uris, email, dns, othernames, directory_names}.empty()")
214 bool has_field(std::string_view attr) const;
216 BOTAN_DEPRECATED(
"Use AlternativeName::{uris, email, dns, othernames, directory_names}")
217 std::vector<std::
string> get_attribute(std::string_view attr) const;
219 BOTAN_DEPRECATED(
"Use AlternativeName::{uris, email, dns, othernames, directory_names}")
220 std::multimap<std::
string, std::
string, std::less<>> get_attributes() const;
222 BOTAN_DEPRECATED(
"Use AlternativeName::{uris, email, dns, othernames, directory_names}")
223 std::
string get_first_attribute(std::string_view attr) const;
226 void add_attribute(std::string_view type, std::string_view value);
229 void add_othername(const
OID& oid, std::string_view value,
ASN1_Type type);
235 BOTAN_DEPRECATED(
"Use plain constructor plus add_{uri,dns,email,ipv4_address}")
237 std::string_view uri =
"",
238 std::string_view
dns =
"",
239 std::string_view ip_address =
"");
242 std::set<std::
string> m_dns;
243 std::set<std::
string> m_uri;
244 std::set<std::
string> m_email;
245 std::set<uint32_t> m_ipv4_addr;
261 Attribute(std::string_view oid_str,
const std::vector<uint8_t>& params);
265 const std::vector<uint8_t>&
parameters()
const {
return m_parameters; }
273 std::vector<uint8_t> m_parameters;
343 BOTAN_DEPRECATED(
"Deprecated no replacement") std::vector<uint8_t> binary_name() const;
352 bool matches_dns(const std::
string& dns_name) const;
353 bool matches_ipv4(uint32_t ip) const;
358 bool matches_dn(
const X509_DN& dn)
const;
362 static constexpr size_t RFC822_IDX = 0;
363 static constexpr size_t DNS_IDX = 1;
364 static constexpr size_t URI_IDX = 2;
365 static constexpr size_t DN_IDX = 3;
366 static constexpr size_t IPV4_IDX = 4;
367 static constexpr size_t IPV6_IDX = 5;
369 using NameVariant = std::variant<std::string, std::string, std::string, X509_DN, IPv4Subnet, IPv6Subnet>;
373 template <
size_t idx,
typename T>
376 return {NameType(idx + 1 ),
377 NameVariant(std::in_place_index_t<idx>(), std::forward<T>(value))};
380 NameType m_type = NameType::Unknown;
383 static bool matches_dns(std::string_view name, std::string_view constraint);
389 static bool matches_dn(
const X509_DN& name,
const X509_DN& constraint);
424BOTAN_DEPRECATED(
"Deprecated no replacement") std::ostream& operator<<(std::ostream& os, const GeneralSubtree& gs);
444 std::vector<GeneralSubtree>&& excluded_subtrees);
450 return m_permitted_subtrees;
457 return m_excluded_subtrees;
471 std::vector<GeneralSubtree> m_permitted_subtrees;
472 std::vector<GeneralSubtree> m_excluded_subtrees;
474 std::set<GeneralName::NameType> m_permitted_name_types;
475 std::set<GeneralName::NameType> m_excluded_name_types;
501 virtual std::unique_ptr<Certificate_Extension>
copy()
const = 0;
520 const std::optional<X509_Certificate>& issuer,
521 const std::vector<X509_Certificate>& cert_path,
522 std::vector<std::set<Certificate_Status_Code>>& cert_status,
550 template <
typename T>
554 if(extn->oid_name().empty()) {
556 }
else if(
const T* extn_as_T =
dynamic_cast<const T*
>(extn)) {
559 throw Decoding_Error(
"Exception::get_extension_object_as dynamic_cast failed");
576 std::vector<OID> critical_extensions()
const;
581 bool extension_set(
const OID& oid)
const;
586 bool critical_extension_set(
const OID& oid)
const;
592 std::vector<uint8_t> get_extension_bits(
const OID& oid)
const;
603 void add(std::unique_ptr<Certificate_Extension> extn,
bool critical =
false);
613 bool add_new(std::unique_ptr<Certificate_Extension> extn,
bool critical =
false);
620 void replace(std::unique_ptr<Certificate_Extension> extn,
bool critical =
false);
626 bool remove(
const OID& oid);
635 std::unique_ptr<Certificate_Extension> get(
const OID& oid)
const;
647 template <
typename T>
649 auto extn_info = m_extension_info.find(oid);
651 if(extn_info != m_extension_info.end()) {
653 if(extn_info->second.obj().oid_name().empty()) {
654 auto ext = std::make_unique<T>();
655 ext->decode_inner(extn_info->second.bits());
668 std::vector<std::pair<std::unique_ptr<Certificate_Extension>,
bool>> extensions()
const;
675 std::map<OID, std::pair<std::vector<uint8_t>,
bool>> extensions_raw()
const;
688 static std::unique_ptr<Certificate_Extension> create_extn_obj(
const OID& oid,
690 const std::vector<uint8_t>& body);
694 Extensions_Info(
bool critical, std::unique_ptr<Certificate_Extension> ext) :
695 m_obj(std::move(ext)), m_bits(m_obj->encode_inner()), m_critical(critical) {}
697 Extensions_Info(
bool critical,
698 const std::vector<uint8_t>& encoding,
699 std::unique_ptr<Certificate_Extension> ext) :
700 m_obj(std::move(ext)), m_bits(encoding), m_critical(critical) {}
702 bool is_critical()
const {
return m_critical; }
704 const std::vector<uint8_t>& bits()
const {
return m_bits; }
706 const Certificate_Extension& obj()
const;
709 std::shared_ptr<Certificate_Extension> m_obj;
710 std::vector<uint8_t> m_bits;
711 bool m_critical =
false;
714 std::vector<OID> m_extension_oids;
715 std::map<OID, Extensions_Info> m_extension_info;
#define BOTAN_PUBLIC_API(maj, min)
#define BOTAN_UNSTABLE_API
#define BOTAN_DEPRECATED(msg)
#define BOTAN_FUTURE_EXPLICIT
const std::set< X509_DN > & directory_names() const
Return the set of directory names included in this alternative name.
void add_dns(std::string_view dns)
Add a DNS name to this AlternativeName.
void add_ipv4_address(uint32_t ipv4)
Add an IP address to this alternative name.
void add_email(std::string_view addr)
Add a URI to this AlternativeName.
const std::set< uint32_t > & ipv4_address() const
Return the set of IPv4 addresses included in this alternative name.
void encode_into(DER_Encoder &to) const override
const std::set< std::pair< OID, ASN1_String > > & other_names() const
Return the set of "other names" included in this alternative name.
const std::set< std::string > & uris() const
Return the set of URIs included in this alternative name.
void add_uri(std::string_view uri)
Add a URI to this AlternativeName.
const std::set< std::string > & dns() const
Return the set of DNS names included in this alternative name.
void add_other_name(const OID &oid, const ASN1_String &value)
Add an "OtherName" identified by object identifier to this AlternativeName.
const std::set< IPv6Address > & ipv6_address() const
Return the set of IPv6 addresses included in this alternative name.
const std::set< std::string > & email() const
Return the set of email addresses included in this alternative name.
void add_dn(const X509_DN &dn)
Add a directory name to this AlternativeName.
void add_ipv4_address(IPv4Address ipv4)
Add an IP address to this alternative name.
AlternativeName()=default
Create an empty name.
void decode_from(BER_Decoder &from) override
std::multimap< OID, ASN1_String > get_othernames() const
const std::vector< uint8_t > & parameters() const
void decode_from(BER_Decoder &from) override
const OID & object_identifier() const
void encode_into(DER_Encoder &to) const override
const std::vector< uint8_t > & get_parameters() const
virtual bool should_encode() const
virtual std::string oid_name() const =0
virtual OID oid_of() const =0
virtual std::unique_ptr< Certificate_Extension > copy() const =0
virtual std::vector< uint8_t > encode_inner() const =0
virtual void validate(const X509_Certificate &subject, const std::optional< X509_Certificate > &issuer, const std::vector< X509_Certificate > &cert_path, std::vector< std::set< Certificate_Status_Code > > &cert_status, size_t pos)
virtual ~Certificate_Extension()=default
virtual void decode_inner(const std::vector< uint8_t > &)=0
const Certificate_Extension * get_extension_object(const OID &oid) const
std::unique_ptr< T > get_raw(const OID &oid) const
Extensions & operator=(const Extensions &)=default
Extensions(const Extensions &)=default
~Extensions() override=default
Extensions(Extensions &&)=default
const std::vector< OID > & get_extension_oids() const
const T * get_extension_object_as(const OID &oid=T::static_oid()) const
Extensions & operator=(Extensions &&)=default
static GeneralName email(std::string_view email)
void decode_from(BER_Decoder &from) override
static GeneralName ipv4_address(uint32_t ipv4)
bool matches_ipv4(IPv4Address ip) const
void encode_into(DER_Encoder &to) const override
static GeneralName uri(std::string_view uri)
static GeneralName ipv6_address(const IPv6Address &ipv6)
friend class NameConstraints
NameType type_code() const
bool matches_ipv4(uint32_t ip) const
static GeneralName dns(std::string_view dns)
static GeneralName directory_name(Botan::X509_DN dn)
A single Name Constraint.
void encode_into(DER_Encoder &to) const override
const GeneralName & base() const
void decode_from(BER_Decoder &from) override
uint32_t value() const
The address as a 32-bit big-endian integer.
NameConstraints()=default
const std::vector< GeneralSubtree > & permitted() const
const std::vector< GeneralSubtree > & excluded() const
void add_attribute(const OID &oid, std::string_view val)
void add_attribute(std::string_view key, std::string_view val)
const std::vector< std::pair< OID, ASN1_String > > & dn_info() const
X509_DN(std::initializer_list< std::pair< std::string_view, std::string_view > > args)
const std::vector< uint8_t > & get_bits() const
std::string to_string(ErrorType type)
Convert an ErrorType to string.
std::string key_constraints_to_string(Key_Constraints c)