7#include <botan/pkix_types.h>
9#include <botan/ber_dec.h>
10#include <botan/der_enc.h>
11#include <botan/internal/fmt.h>
12#include <botan/internal/int_utils.h>
13#include <botan/internal/loadstor.h>
29 m_uri.insert(std::move(uri));
33 std::set<std::string> out;
34 for(
const auto& uri : m_uri) {
35 out.insert(uri.original_input());
47 throw Decoding_Error(
"Invalid email address in SubjectAlternativeName");
52 m_email.insert(std::move(addr));
56 std::set<std::string> out;
57 for(
const auto& addr : m_email) {
58 out.insert(addr.to_string());
70 throw Decoding_Error(
"Invalid DNS name in SubjectAlternativeName");
75 m_dns.insert(std::move(
dns));
79 std::set<std::string> out;
80 for(
const auto& name : m_dns) {
81 out.insert(name.to_string());
87 m_othernames.insert(std::make_pair(oid, value));
88 std::vector<uint8_t> raw;
98 m_registered_ids.insert(oid);
102 m_dn_names.insert(
dn);
106 m_ipv4_addrs.insert(ip);
110 m_ipv6_addrs.insert(ip);
120 m_other_name_values.size(),
121 m_registered_ids.size());
128 return this->
count() > 0;
132 return this->
count() == 0;
151 for(
const auto& othername : m_other_name_values) {
160 for(
const auto& addr : m_email) {
165 for(
const auto& name : m_dns) {
170 for(
const auto& name : m_dn_names) {
174 for(
const auto& name : m_uri) {
179 for(
const auto& ip : m_ipv4_addrs) {
184 for(
const auto& ip : m_ipv6_addrs) {
189 for(
const auto& reg_id : m_registered_ids) {
223 std::vector<uint8_t> raw_value;
225 m_other_name_values.insert(
OtherNameValue{oid, std::move(raw_value)});
237 throw Decoding_Error(
"SmtpUTF8Mailbox otherName must contain a UTF8String");
240 if(!parsed_mailbox.has_value()) {
243 m_smtp_utf8_mailboxes.insert(std::move(*parsed_mailbox));
270 }
else if(obj.
length() == 16) {
274 throw Decoding_Error(
"Invalid IP constraint neither IPv4 or IPv6");
283 static_cast<uint32_t
>(obj.
type_tag()),
284 static_cast<uint32_t
>(obj.
class_tag())));
#define BOTAN_ASSERT_NOMSG(expr)
const std::string & value() const
static bool is_string_type(ASN1_Type tag)
An "OtherName" GeneralName entry: type-id OID and the inner ANY value as raw BER.
void add_dns(std::string_view dns)
Add a DNS name to this AlternativeName, parsing and validating the input.
std::set< std::string > dns() const
void add_ipv4_address(uint32_t ipv4)
Add an IP address to this alternative name.
void add_email(std::string_view addr)
Add an email address to this AlternativeName, parsing and validating the input.
void encode_into(DER_Encoder &to) const override
void add_uri(std::string_view uri)
Add a URI to this AlternativeName, parsing and validating the input.
void add_registered_id(const OID &oid)
Add a registeredID (RFC 5280 [8]).
void add_ipv6_address(const IPv6Address &ipv6)
Add an IPv6 address to this alternative name.
bool has_items() const
Return true if this has any names set.
void add_other_name_value(const OID &oid, std::span< const uint8_t > value)
void add_other_name(const OID &oid, const ASN1_String &value)
Add an "OtherName" identified by object identifier to this AlternativeName.
std::set< std::string > uris() const
std::set< std::string > email() const
void add_dn(const X509_DN &dn)
Add a directory name to this AlternativeName.
void decode_from(BER_Decoder &from) override
bool is_empty() const
Return true if this alternative name is empty (zero names).
BER_Object get_next_object()
BER_Decoder & decode(bool &out)
BER_Decoder & verify_end()
BER_Decoder start_sequence()
BER_Decoder & decode_implicit(BER_Object obj, T &out, ASN1_Type real_type, ASN1_Class real_class)
const uint8_t * bits() const
bool is_a(ASN1_Type type_tag, ASN1_Class class_tag) const
ASN1_Type type_tag() const
std::span< const uint8_t > data() const
ASN1_Class get_class() const
ASN1_Class class_tag() const
DER_Encoder & add_object(ASN1_Type type_tag, ASN1_Class class_tag, const uint8_t rep[], size_t length)
DER_Encoder & encode_implicit(const T &value, ASN1_Type type_tag, ASN1_Class class_tag=ASN1_Class::ContextSpecific)
DER_Encoder & end_explicit()
DER_Encoder & start_explicit(uint16_t type_tag)
DER_Encoder & start_sequence()
DER_Encoder & raw_bytes(const uint8_t val[], size_t len)
DER_Encoder & encode(bool b)
static std::optional< DNSName > from_san_string(std::string_view name)
static std::optional< EmailAddress > from_string(std::string_view addr)
static OID from_string(std::string_view str)
static std::optional< SmtpUtf8Mailbox > from_string(std::string_view addr)
static std::optional< URI > from_string(std::string_view raw)
std::string to_string(const BER_Object &obj)
constexpr std::optional< T > checked_add(T a, T b)
@ ExplicitContextSpecific
std::string fmt(std::string_view format, const T &... args)
constexpr auto load_be(ParamTs &&... params)