150 if(
auto canon = check_and_canonicalize_dns_name(
name)) {
157 const auto first_star = canon->find(
'*');
158 if(first_star != std::string::npos) {
159 if(canon->find(
'*', first_star + 1) != std::string::npos) {
162 const auto first_dot = canon->find(
'.');
163 if(first_dot != std::string::npos && first_dot < first_star) {
171 if(canon->starts_with(
"xn--")) {
176 if(std::count(canon->begin(), canon->end(),
'.') < 2) {
180 return DNSName(std::move(*canon));
192 if(host.empty() || issued.empty()) {
197 if(host.size() > 253) {
205 if(issued.size() > host.size() + 1) {
213 if(issued.find(
'\0') != std::string_view::npos || host.find(
'\0') != std::string_view::npos) {
218 if(host.find(
'*') != std::string_view::npos) {
223 if(host.back() ==
'.') {
228 if(host.front() ==
'.') {
233 if(host.find(
"..") != std::string_view::npos) {
238 auto dns_char_eq = [](
char a,
char b) ->
bool {
242 const auto la =
static_cast<unsigned char>(a | 0x20);
243 const auto lb =
static_cast<unsigned char>(b | 0x20);
244 return la == lb && la >=
'a' && la <=
'z';
247 auto dns_char_eq_range = [&](std::string_view a, std::string_view b) ->
bool {
248 if(a.size() != b.size()) {
251 for(
size_t i = 0; i != a.size(); ++i) {
252 if(!dns_char_eq(a[i], b[i])) {
260 if(dns_char_eq_range(issued, host)) {
265 const size_t first_star = issued.find(
'*');
266 const bool has_wildcard = (first_star != std::string_view::npos);
269 if(has_wildcard && issued.find(
'*', first_star + 1) != std::string_view::npos) {
286 const auto is_idna_prefixed = [&](std::string_view label) {
287 return label.size() >= 4 && dns_char_eq_range(label.substr(0, 4),
"xn--");
289 const auto issued_label = issued.substr(0, issued.find(
'.'));
290 if(is_idna_prefixed(issued_label)) {
293 if(issued_label !=
"*" && is_idna_prefixed(host.substr(0, host.find(
'.')))) {
307 size_t dots_seen = 0;
310 for(
size_t i = 0; i != issued.size(); ++i) {
311 if(issued[i] ==
'.') {
315 if(issued[i] ==
'*') {
326 const size_t advance = (host.size() - issued.size() + 1);
328 if(host_idx + advance > host.size()) {
333 for(
size_t k = host_idx; k != host_idx + advance; ++k) {
341 if(!dns_char_eq(issued[i], host[host_idx])) {