8 #include <botan/name_constraint.h>
9 #include <botan/asn1_alt_name.h>
10 #include <botan/ber_dec.h>
11 #include <botan/loadstor.h>
12 #include <botan/x509_dn.h>
13 #include <botan/x509cert.h>
14 #include <botan/parsing.h>
23 size_t p = str.find(
':');
25 if(p != std::string::npos)
27 m_type = str.substr(0, p);
28 m_name = str.substr(p + 1, std::string::npos);
80 else if(obj.
length() == 32)
97 std::vector<std::string> nam;
98 std::function<bool(const GeneralName*, const std::string&)> match_fn;
105 match_fn = std::mem_fn(&GeneralName::matches_dns);
114 else if(
type() ==
"DN")
116 match_fn = std::mem_fn(&GeneralName::matches_dn);
118 std::stringstream ss;
120 nam.push_back(ss.str());
122 else if(
type() ==
"IP")
124 match_fn = std::mem_fn(&GeneralName::matches_ip);
129 return MatchResult::UnknownType;
134 return MatchResult::NotFound;
140 for(
const std::string& n: nam)
142 bool m = match_fn(
this, n);
150 return MatchResult::All;
154 return MatchResult::Some;
158 return MatchResult::None;
162 bool GeneralName::matches_dns(
const std::string& nam)
const
164 if(nam.size() ==
name().size())
166 return nam ==
name();
168 else if(
name().size() > nam.size())
174 std::string constr =
name().front() ==
'.' ?
name() :
"." +
name();
176 return constr == nam.substr(nam.size() - constr.size(), constr.size());
180 bool GeneralName::matches_dn(
const std::string& nam)
const
182 std::stringstream ss(nam);
183 std::stringstream tt(
name());
184 X509_DN nam_dn, my_dn;
189 auto attr = nam_dn.get_attributes();
193 for(
const auto& c: my_dn.dn_info())
195 auto i = attr.equal_range(c.first);
197 if(i.first != i.second)
200 ret = ret && (i.first->second == c.second.value());
204 return trys > 0 && ret;
207 bool GeneralName::matches_ip(
const std::string& nam)
const
213 throw Decoding_Error(
"failed to parse IPv4 address");
218 return (ip & mask) == net;
223 os << gn.
type() <<
":" << gn.
name();
230 const auto min = std::stoull(str, &p0, 10);
231 const auto max = std::stoull(str.substr(p0 + 1), &p1, 10);
236 m_minimum =
static_cast<size_t>(min);
237 m_maximum =
static_cast<size_t>(max);
261 m_maximum = std::numeric_limits<std::size_t>::max();
const AlternativeName & subject_alt_name() const
void decode_from(BER_Decoder &) override
int operator<<(int fd, Pipe &pipe)
MatchResult matches(const X509_Certificate &cert) const
std::vector< std::string > split_on(const std::string &str, char delim)
uint32_t load_be< uint32_t >(const uint8_t in[], size_t off)
std::string to_string(const BER_Object &obj)
bool is_a(ASN1_Tag type_tag, ASN1_Tag class_tag) const
BER_Decoder & decode(bool &out)
const uint8_t * bits() const
void decode_from(class BER_Decoder &) override
BER_Decoder & decode_optional(T &out, ASN1_Tag type_tag, ASN1_Tag class_tag, const T &default_value=T())
void encode_into(DER_Encoder &) const override
std::string ipv4_to_string(uint32_t ip)
void encode_into(DER_Encoder &) const override
BER_Decoder start_cons(ASN1_Tag type_tag, ASN1_Tag class_tag=UNIVERSAL)
uint32_t string_to_ipv4(const std::string &str)
A single Name Constraint.
std::vector< std::string > get_attribute(const std::string &attr) const
const std::string & name() const
void decode_from(BER_Decoder &) override
BER_Object get_next_object()
const GeneralName & base() const
const std::string & type() const
const X509_DN & subject_dn() const
std::vector< std::string > get_attribute(const std::string &attr) const