9 #include <botan/parsing.h>
10 #include <botan/exceptn.h>
11 #include <botan/charset.h>
12 #include <botan/loadstor.h>
23 for (
const char chr : str)
25 if (chr < '0' || chr >
'9')
27 auto chrAsString = std::string(1, chr);
32 const auto integerValue = std::stoul(str);
42 catch(std::exception& e)
44 auto message = std::string(
"Could not read '" + str +
"' as decimal string");
45 auto exceptionMessage = std::string(e.what());
46 if (!exceptionMessage.empty()) message +=
": " + exceptionMessage;
59 const char suffix = timespec[timespec.size()-1];
60 std::string value = timespec.substr(0, timespec.size()-1);
66 else if(suffix ==
's')
68 else if(suffix ==
'm')
70 else if(suffix ==
'h')
72 else if(suffix ==
'd')
74 else if(suffix ==
'y')
75 scale = 365 * 24 * 60 * 60;
87 if(namex.find(
'(') == std::string::npos &&
88 namex.find(
')') == std::string::npos)
89 return std::vector<std::string>(1, namex);
91 std::string name = namex, substring;
92 std::vector<std::string> elems;
95 elems.push_back(name.substr(0, name.find(
'(')));
96 name = name.substr(name.find(
'('));
98 for(
auto i = name.begin(); i != name.end(); ++i)
106 if(level == 1 && i == name.end() - 1)
108 if(elems.size() == 1)
109 elems.push_back(substring.substr(1));
111 elems.push_back(substring);
115 if(level == 0 || (level == 1 && i != name.end() - 1))
120 if(c ==
',' && level == 1)
122 if(elems.size() == 1)
123 elems.push_back(substring.substr(1));
125 elems.push_back(substring);
132 if(!substring.empty())
138 std::vector<std::string>
split_on(
const std::string& str,
char delim)
140 return split_on_pred(str, [delim](
char c) {
return c == delim; });
144 std::function<
bool (
char)> pred)
146 std::vector<std::string> elems;
147 if(str.empty())
return elems;
150 for(
auto i = str.begin(); i != str.end(); ++i)
155 elems.push_back(substr);
164 elems.push_back(substr);
172 std::string
string_join(
const std::vector<std::string>& strs,
char delim)
174 std::string out =
"";
176 for(
size_t i = 0; i != strs.size(); ++i)
191 std::string substring;
192 std::vector<uint32_t> oid_elems;
194 for(
auto i = oid.begin(); i != oid.end(); ++i)
200 if(substring.empty())
202 oid_elems.push_back(
to_u32bit(substring));
209 if(substring.empty())
211 oid_elems.push_back(
to_u32bit(substring));
213 if(oid_elems.size() < 2)
224 auto p1 = name1.begin();
225 auto p2 = name2.begin();
230 while(p1 != name1.end() && p2 != name2.end())
240 if(p1 == name1.end() && p2 == name2.end())
242 if(p1 == name1.end() || p2 == name2.end())
255 if((p1 != name1.end()) || (p2 != name2.end()))
265 std::vector<std::string> parts =
split_on(str,
'.');
267 if(parts.size() != 4)
272 for(
auto part = parts.begin(); part != parts.end(); ++part)
279 ip = (ip << 8) | (octet & 0xFF);
292 for(
size_t i = 0; i !=
sizeof(ip); ++i)
302 std::string
erase_chars(
const std::string& str,
const std::set<char>& chars)
307 if(chars.count(c) == 0)
314 const std::set<char>& chars,
317 std::string out = str;
319 for(
size_t i = 0; i != out.size(); ++i)
320 if(chars.count(out[i]))
326 std::string
replace_char(
const std::string& str,
char from_char,
char to_char)
328 std::string out = str;
330 for(
size_t i = 0; i != out.size(); ++i)
331 if(out[i] == from_char)
342 if(issued.size() > 2 && issued[0] ==
'*' && issued[1] ==
'.')
344 size_t host_i = host.find(
'.');
345 if(host_i == std::string::npos || host_i == host.size() - 1)
348 const std::string host_base = host.substr(host_i + 1);
349 const std::string issued_base = issued.substr(2);
351 if(host_base == issued_base)
std::vector< std::string > parse_algorithm_name(const std::string &namex)
uint32_t to_u32bit(const std::string &str)
bool x500_name_cmp(const std::string &name1, const std::string &name2)
std::string string_join(const std::vector< std::string > &strs, char delim)
bool caseless_cmp(char a, char b)
std::string replace_chars(const std::string &str, const std::set< char > &chars, char to_char)
std::string erase_chars(const std::string &str, const std::set< char > &chars)
std::vector< std::string > split_on(const std::string &str, char delim)
std::string to_string(const BER_Object &obj)
std::string ipv4_to_string(uint32_t ip)
std::vector< std::string > split_on_pred(const std::string &str, std::function< bool(char)> pred)
std::vector< uint32_t > parse_asn1_oid(const std::string &oid)
uint8_t get_byte(size_t byte_num, T input)
bool host_wildcard_match(const std::string &issued, const std::string &host)
uint32_t timespec_to_u32bit(const std::string ×pec)
uint32_t string_to_ipv4(const std::string &str)
std::string replace_char(const std::string &str, char from_char, char to_char)