10#include <botan/parsing.h>
11#include <botan/exceptn.h>
12#include <botan/charset.h>
13#include <botan/loadstor.h>
19#if defined(BOTAN_HAS_ASN1)
20 #include <botan/asn1_obj.h>
32 return static_cast<uint16_t
>(x);
38 for(
const char chr : str)
40 if(chr <
'0' || chr >
'9')
42 std::string chrAsString(1, chr);
47 const unsigned long int x = std::stoul(str);
49 if(
sizeof(
unsigned long int) > 4)
52 if (x > std::numeric_limits<uint32_t>::max())
58 return static_cast<uint32_t
>(x);
69 const char suffix = timespec[timespec.size()-1];
70 std::string value = timespec.substr(0, timespec.size()-1);
76 else if(suffix ==
's')
78 else if(suffix ==
'm')
80 else if(suffix ==
'h')
82 else if(suffix ==
'd')
84 else if(suffix ==
'y')
85 scale = 365 * 24 * 60 * 60;
97 if(namex.find(
'(') == std::string::npos &&
98 namex.find(
')') == std::string::npos)
99 return std::vector<std::string>(1, namex);
101 std::string
name = namex, substring;
102 std::vector<std::string> elems;
105 elems.push_back(
name.substr(0,
name.find(
'(')));
108 for(
auto i =
name.begin(); i !=
name.end(); ++i)
116 if(level == 1 && i ==
name.end() - 1)
118 if(elems.size() == 1)
119 elems.push_back(substring.substr(1));
121 elems.push_back(substring);
125 if(level == 0 || (level == 1 && i !=
name.end() - 1))
130 if(c ==
',' && level == 1)
132 if(elems.size() == 1)
133 elems.push_back(substring.substr(1));
135 elems.push_back(substring);
142 if(!substring.empty())
148std::vector<std::string>
split_on(
const std::string& str,
char delim)
150 return split_on_pred(str, [delim](
char c) {
return c == delim; });
154 std::function<
bool (
char)> pred)
156 std::vector<std::string> elems;
157 if(str.empty())
return elems;
160 for(
auto i = str.begin(); i != str.end(); ++i)
165 elems.push_back(substr);
174 elems.push_back(substr);
182std::string
string_join(
const std::vector<std::string>& strs,
char delim)
184 std::string out =
"";
186 for(
size_t i = 0; i != strs.size(); ++i)
201#if defined(BOTAN_HAS_ASN1)
214 auto p1 = name1.begin();
215 auto p2 = name2.begin();
220 while(p1 != name1.end() && p2 != name2.end())
230 if(p1 == name1.end() && p2 == name2.end())
232 if(p1 == name1.end() || p2 == name2.end())
245 if((p1 != name1.end()) || (p2 != name2.end()))
255 std::vector<std::string> parts =
split_on(str,
'.');
257 if(parts.size() != 4)
262 for(
auto part = parts.begin(); part != parts.end(); ++part)
269 ip = (ip << 8) | (octet & 0xFF);
282 for(
size_t i = 0; i !=
sizeof(ip); ++i)
286 str += std::to_string(
get_byte(i, ip));
292std::string
erase_chars(
const std::string& str,
const std::set<char>& chars)
297 if(chars.count(c) == 0)
304 const std::set<char>& chars,
307 std::string out = str;
309 for(
size_t i = 0; i != out.size(); ++i)
310 if(chars.count(out[i]))
316std::string
replace_char(
const std::string& str,
char from_char,
char to_char)
318 std::string out = str;
320 for(
size_t i = 0; i != out.size(); ++i)
321 if(out[i] == from_char)
330 for(
size_t i = 0; i != s.size(); ++i)
332 const int cu =
static_cast<unsigned char>(s[i]);
334 s[i] =
static_cast<char>(std::tolower(cu));
344 if(host.empty() || issued.empty())
351 if(std::count(issued.begin(), issued.end(),
char(0)) > 0)
355 const size_t stars = std::count(issued.begin(), issued.end(),
'*');
360 if(std::count(host.begin(), host.end(),
'*') != 0)
364 if(host[host.size() - 1] ==
'.')
368 if(host.find(
"..") != std::string::npos)
385 if(issued.size() > host.size() + 1)
406 size_t dots_seen = 0;
409 for(
size_t i = 0; i != issued.size(); ++i)
411 dots_seen += (issued[i] ==
'.');
426 const size_t advance = (host.size() - issued.size() + 1);
428 if(host_idx + advance > host.size())
432 if(std::count(host.begin() + host_idx,
433 host.begin() + host_idx + advance,
'.') != 0)
440 if(issued[i] != host[host_idx])
#define BOTAN_UNUSED(...)
const std::vector< uint32_t > & get_components() const
bool caseless_cmp(char a, char b)
std::vector< std::string > split_on(const std::string &str, char delim)
std::string erase_chars(const std::string &str, const std::set< char > &chars)
std::string replace_char(const std::string &str, char from_char, char to_char)
uint32_t string_to_ipv4(const std::string &str)
uint16_t to_uint16(const std::string &str)
std::string replace_chars(const std::string &str, const std::set< char > &chars, char to_char)
uint32_t timespec_to_u32bit(const std::string ×pec)
std::string string_join(const std::vector< std::string > &strs, char delim)
std::string tolower_string(const std::string &in)
std::vector< uint32_t > parse_asn1_oid(const std::string &oid)
bool x500_name_cmp(const std::string &name1, const std::string &name2)
std::vector< std::string > split_on_pred(const std::string &str, std::function< bool(char)> pred)
std::vector< std::string > parse_algorithm_name(const std::string &namex)
std::string ipv4_to_string(uint32_t ip)
constexpr uint8_t get_byte(size_t byte_num, T input)
uint32_t to_u32bit(const std::string &str)
bool host_wildcard_match(const std::string &issued_, const std::string &host_)