8#include <botan/pkix_types.h>
9#include <botan/ber_dec.h>
10#include <botan/loadstor.h>
11#include <botan/x509cert.h>
12#include <botan/parsing.h>
21 size_t p = str.find(
':');
23 if(p != std::string::npos)
25 m_type = str.substr(0, p);
26 m_name = str.substr(p + 1, std::string::npos);
78 else if(obj.
length() == 32)
95 std::vector<std::string> nam;
96 std::function<bool(
const GeneralName*,
const std::string&)> match_fn;
103 match_fn = std::mem_fn(&GeneralName::matches_dns);
112 else if(
type() ==
"DN")
114 match_fn = std::mem_fn(&GeneralName::matches_dn);
118 const auto alt_dn = alt_name.
dn();
119 if(alt_dn.empty() ==
false)
121 nam.push_back(alt_dn.to_string());
124 else if(
type() ==
"IP")
126 match_fn = std::mem_fn(&GeneralName::matches_ip);
142 for(
const std::string& n: nam)
144 bool m = match_fn(
this, n);
164bool GeneralName::matches_dns(
const std::string& nam)
const
166 if(nam.size() ==
name().size())
170 else if(
name().size() > nam.size())
178 const std::string constr =
name().front() ==
'.' ?
name() :
"." +
name();
179 const std::string substr = nam.substr(nam.size() - constr.size(), constr.size());
184bool GeneralName::matches_dn(
const std::string& nam)
const
186 std::stringstream ss(nam);
187 std::stringstream tt(
name());
188 X509_DN nam_dn, my_dn;
193 auto attr = nam_dn.get_attributes();
197 for(
const auto& c: my_dn.dn_info())
199 auto i = attr.equal_range(c.first);
201 if(i.first != i.second)
204 ret = ret && (i.first->second == c.second.value());
208 return trys > 0 && ret;
211bool GeneralName::matches_ip(
const std::string& nam)
const
217 throw Decoding_Error(
"failed to parse IPv4 address");
222 return (ip & mask) == net;
227 os << gn.
type() <<
":" << gn.
name();
234 const auto min = std::stoull(str, &p0, 10);
235 const auto max = std::stoull(str.substr(p0 + 1), &p1, 10);
240 m_minimum =
static_cast<size_t>(min);
241 m_maximum =
static_cast<size_t>(max);
265 m_maximum = std::numeric_limits<std::size_t>::max();
std::vector< std::string > get_attribute(const std::string &attr) const
BER_Decoder start_cons(ASN1_Tag type_tag, ASN1_Tag class_tag=UNIVERSAL)
BER_Object get_next_object()
BER_Decoder & decode(bool &out)
BER_Decoder & decode_optional(T &out, ASN1_Tag type_tag, ASN1_Tag class_tag, const T &default_value=T())
const uint8_t * bits() const
bool is_a(ASN1_Tag type_tag, ASN1_Tag class_tag) const
const std::string & type() const
void encode_into(DER_Encoder &) const override
MatchResult matches(const X509_Certificate &cert) const
void decode_from(BER_Decoder &) override
const std::string & name() const
A single Name Constraint.
void decode_from(BER_Decoder &) override
const GeneralName & base() const
void encode_into(DER_Encoder &) const override
const X509_DN & subject_dn() const
const AlternativeName & subject_alt_name() const
void decode_from(BER_Decoder &) override
std::vector< std::string > get_attribute(const std::string &attr) const
std::string to_string() const
std::string to_string(const BER_Object &obj)
std::vector< std::string > split_on(const std::string &str, char delim)
uint32_t string_to_ipv4(const std::string &str)
uint32_t load_be< uint32_t >(const uint8_t in[], size_t off)
std::string tolower_string(const std::string &in)
int operator<<(int fd, Pipe &pipe)
std::string ipv4_to_string(uint32_t ip)