GeneralName::MatchResult GeneralName::matches(const X509_Certificate& cert) const { std::vector<std::string> nam; std::function<bool(const GeneralName*, const std::string&)> match_fn; const X509_DN& dn = cert.subject_dn(); const AlternativeName& alt_name = cert.subject_alt_name(); if(type() == "DNS") { match_fn = std::mem_fn(&GeneralName::matches_dns); nam = alt_name.get_attribute("DNS"); if(nam.empty()) { nam = dn.get_attribute("CN"); } } else if(type() == "DN") { match_fn = std::mem_fn(&GeneralName::matches_dn); std::stringstream ss; ss << dn; nam.push_back(ss.str()); } else if(type() == "IP") { match_fn = std::mem_fn(&GeneralName::matches_ip); nam = alt_name.get_attribute("IP"); } else { return MatchResult::UnknownType; } if(nam.empty()) { return MatchResult::NotFound; } bool some = false; bool all = true; for(const std::string& n: nam) { bool m = match_fn(this, n); some |= m; all &= m; } if(all) { return MatchResult::All; } else if(some) { return MatchResult::Some; } else { return MatchResult::None; } }