325 if(!m_is_ca && m_path_length_constraint.has_value()) {
327 throw Invalid_Argument(
328 "Basic_Constraints nonsensical to set a path length constraint for a non-CA basicConstraints");
337 return m_path_length_constraint.value_or(NO_CERT_PATH_LIMIT);
339 throw Invalid_State(
"Basic_Constraints::get_path_limit: Not a CA");
347 std::vector<uint8_t> output;
361void Basic_Constraints::decode_inner(
const std::vector<uint8_t>& in) {
379 if(!m_is_ca && m_path_length_constraint.has_value()) {
380 throw Decoding_Error(
"BasicConstraints pathLenConstraint must not be present when cA is FALSE");
388 if(m_constraints.empty()) {
389 throw Encoding_Error(
"Cannot encode empty PKIX key constraints");
392 const size_t constraint_bits = m_constraints.value();
393 const size_t unused_bits =
ctz(
static_cast<uint32_t
>(constraint_bits));
395 std::vector<uint8_t> der;
397 der.push_back(2 + ((unused_bits < 8) ? 1 : 0));
398 der.push_back(unused_bits % 8);
399 der.push_back(
static_cast<uint8_t
>((constraint_bits >> 8) & 0xFF));
400 if((constraint_bits & 0xFF) != 0) {
401 der.push_back(
static_cast<uint8_t
>(constraint_bits & 0xFF));
410void Key_Usage::decode_inner(
const std::vector<uint8_t>& in) {
412 std::vector<uint8_t> bits;
417 const uint16_t usage = [&bits]() -> uint16_t {
418 switch(bits.size()) {
426 throw Decoding_Error(
"Invalid KeyUsage bitstring encoding");
434 throw Decoding_Error(
"KeyUsage extension must have at least one bit set");
437 m_constraints = Key_Constraints(usage);
444 std::vector<uint8_t> output;
452void Subject_Key_ID::decode_inner(
const std::vector<uint8_t>& in) {
456 if(m_key_id.empty()) {
457 throw Decoding_Error(
"SubjectKeyIdentifier must not be empty");
459 if(m_key_id.size() > MaximumKeyIdentifierLength) {
460 throw Decoding_Error(
461 fmt(
"SubjectKeyIdentifier length {} exceeds limit of {} bytes", m_key_id.size(), MaximumKeyIdentifierLength));
471 m_key_id.resize(hash->output_length());
473 hash->update(pub_key);
474 hash->final(m_key_id.data());
477 const size_t max_skid_len = (192 / 8);
478 if(m_key_id.size() > max_skid_len) {
479 m_key_id.resize(max_skid_len);
487 std::vector<uint8_t> output;
498void Authority_Key_ID::decode_inner(
const std::vector<uint8_t>& in) {
516 if(m_key_id.empty()) {
517 throw Decoding_Error(
"AuthorityKeyIdentifier keyIdentifier must not be empty");
519 if(m_key_id.size() > MaximumKeyIdentifierLength) {
520 throw Decoding_Error(
fmt(
"AuthorityKeyIdentifier keyIdentifier length {} exceeds limit of {} bytes",
522 MaximumKeyIdentifierLength));
531 std::vector<uint8_t> output;
532 DER_Encoder(output).encode(m_alt_name);
540 std::vector<uint8_t> output;
541 DER_Encoder(output).encode(m_alt_name);
548void Subject_Alternative_Name::decode_inner(
const std::vector<uint8_t>& in) {
552 if(!m_alt_name.has_items()) {
553 throw Decoding_Error(
"SubjectAlternativeName extension must contain at least one GeneralName");
560void Issuer_Alternative_Name::decode_inner(
const std::vector<uint8_t>& in) {
564 if(!m_alt_name.has_items()) {
565 throw Decoding_Error(
"IssuerAlternativeName extension must contain at least one GeneralName");
573 std::vector<uint8_t> output;
581void Extended_Key_Usage::decode_inner(
const std::vector<uint8_t>& in) {
585 throw Decoding_Error(
"ExtendedKeyUsage extension must contain at least one KeyPurposeId");
593 throw Not_Implemented(
"Name_Constraints encoding");
599void Name_Constraints::decode_inner(
const std::vector<uint8_t>& in) {
608 BER_Decoder inner = ber.start_sequence();
610 std::vector<GeneralSubtree> permitted;
612 if(permitted.empty()) {
613 throw Decoding_Error(
"Empty NameConstraint permitted list");
617 std::vector<GeneralSubtree> excluded;
619 if(excluded.empty()) {
620 throw Decoding_Error(
"Empty NameConstraint excluded list");
627 if(permitted.empty() && excluded.empty()) {
628 throw Decoding_Error(
"Empty NameConstraint extension");
631 m_name_constraints = NameConstraints(std::move(permitted), std::move(excluded));
635 const std::optional<X509_Certificate>& ,
636 const std::vector<X509_Certificate>& cert_path,
637 std::vector<std::set<Certificate_Status_Code>>& cert_status,
639 if(!m_name_constraints.permitted().empty() || !m_name_constraints.excluded().empty()) {
644 const bool issuer_name_constraint_critical = subject.
is_critical(
"X509v3.NameConstraints");
647 for(
size_t j = 0; j < pos; ++j) {
648 const auto& cert = cert_path.at(j);
653 if(j > 0 && cert.issuer_dn() == cert.subject_dn()) {
657 if(!m_name_constraints.is_permitted(cert, issuer_name_constraint_critical)) {
662 if(m_name_constraints.is_excluded(cert, issuer_name_constraint_critical)) {
675class Policy_Information final :
public ASN1_Object {
677 Policy_Information() =
default;
679 explicit Policy_Information(
const OID& oid) : m_oid(oid) {}
681 const OID& oid()
const {
return m_oid; }
683 void encode_into(DER_Encoder& codec)
const override { codec.start_sequence().encode(m_oid).end_cons(); }
685 void decode_from(BER_Decoder& codec)
override {
686 codec.start_sequence().decode(m_oid).discard_remaining().end_cons();
699 std::vector<Policy_Information> policies;
701 policies.reserve(m_oids.size());
702 for(
const auto& oid : m_oids) {
703 policies.push_back(Policy_Information(oid));
706 std::vector<uint8_t> output;
707 DER_Encoder(output).start_sequence().encode_list(policies).end_cons();
714void Certificate_Policies::decode_inner(
const std::vector<uint8_t>& in) {
716 std::vector<Policy_Information> policies;
719 if(policies.empty()) {
720 throw Decoding_Error(
"CertificatePolicies extension must contain at least one PolicyInformation");
723 for(
const auto& policy : policies) {
724 m_oids.push_back(policy.oid());
729 const std::optional<X509_Certificate>& ,
730 const std::vector<X509_Certificate>& ,
731 std::vector<std::set<Certificate_Status_Code>>& cert_status,
733 const std::set<OID> oid_set(m_oids.begin(), m_oids.end());
734 if(oid_set.size() != m_oids.size()) {
740 std::vector<uint8_t> output;
743 der.start_sequence();
754 for(
const auto& ca_issuer : m_ca_issuers) {
766void Authority_Information_Access::decode_inner(
const std::vector<uint8_t>& in) {
776 BER_Decoder ber = outer.start_sequence();
781 size_t access_descriptions_seen = 0;
782 while(ber.more_items()) {
785 BER_Decoder info = ber.start_sequence();
788 const BER_Object name = info.get_next_object();
791 access_descriptions_seen += 1;
803 if(access_descriptions_seen == 0) {
804 throw Decoding_Error(
"AuthorityInformationAccess extension must contain at least one AccessDescription");
825 return std::make_unique<CRL_Number>(m_crl_number);
832 std::vector<uint8_t> output;
840void CRL_Number::decode_inner(
const std::vector<uint8_t>& in) {
850 std::vector<uint8_t> output;
858void CRL_ReasonCode::decode_inner(
const std::vector<uint8_t>& in) {
875 size_t reason_code = 0;
880 if(reason_code == 7 || reason_code > 10) {
881 throw Decoding_Error(
fmt(
"CRLReason has unknown enumeration value {}", reason_code));
884 m_reason =
static_cast<CRL_Code>(reason_code);
888 std::vector<uint8_t> output;
889 DER_Encoder(output).start_sequence().encode_list(m_distribution_points).end_cons();
893void CRL_Distribution_Points::decode_inner(
const std::vector<uint8_t>& buf) {
901 if(m_distribution_points.empty()) {
902 throw Decoding_Error(
"CRLDistributionPoints extension must contain at least one DistributionPoint");
905 for(
const auto& distribution_point : m_distribution_points) {
906 for(
const auto& uri : distribution_point.point().uris()) {
907 m_crl_distribution_urls.push_back(uri);
913 const auto uris = m_point.uris();
916 throw Not_Implemented(
"Empty CRL_Distribution_Point encoding not implemented");
919 for(
const auto& uri : uris) {
946void CRL_Issuing_Distribution_Point::decode_inner(
const std::vector<uint8_t>& buf) {
952 throw Not_Implemented(
"TNAuthList extension entry serialization is not supported");
962 const uint32_t type_tag =
static_cast<uint32_t
>(obj.
type_tag());
968 m_data = std::move(spc_string);
972 auto& range_items = std::get<RangeContainer>(m_data);
979 if(!is_valid_telephone_number(entry.
start)) {
984 if(entry.
count < 2) {
988 range_items.emplace_back(std::move(entry));
992 if(range_items.empty()) {
999 if(!is_valid_telephone_number(one_string)) {
1002 m_data = std::move(one_string);
1009 throw Not_Implemented(
"TNAuthList extension serialization is not supported");
1012void TNAuthList::decode_inner(
const std::vector<uint8_t>& in) {
1015 if(m_tn_entries.empty()) {
1022 return std::get<ASN1_String>(m_data).value();
1027 return std::get<RangeContainer>(m_data);
1032 return std::get<ASN1_String>(m_data).value();
1036 std::vector<uint8_t> output;
1041void IPAddressBlocks::decode_inner(
const std::vector<uint8_t>& in) {
1052 if(m_safi.has_value()) {
1053 afam.push_back(m_safi.value());
1069 throw Decoding_Error(
fmt(
"Unexpected type for IPAddressFamily {}",
static_cast<uint32_t
>(next_tag)));
1074 std::vector<uint8_t> addr_family;
1076 const size_t addr_family_length = addr_family.size();
1078 if(addr_family_length != 2 && addr_family_length != 3) {
1082 m_afi = (addr_family[0] << 8) | addr_family[1];
1084 if(addr_family_length == 3) {
1085 m_safi = addr_family[2];
1092 }
else if(m_afi == 2) {
1103void IPAddressBlocks::sort_and_merge() {
1114 std::map<std::pair<uint16_t, std::optional<uint8_t>>, std::vector<IPAddressFamily>> afam_map;
1116 auto key = std::make_pair(block.afi(), block.safi());
1117 std::vector<IPAddressFamily>& fams = afam_map[key];
1118 fams.push_back(block);
1121 std::vector<IPAddressFamily> merged_blocks;
1122 for(
auto& it : afam_map) {
1124 std::vector<IPAddressFamily>& fams = it.second;
1130 if(std::holds_alternative<IPAddressChoice<Version::IPv4>>(fams[0].addr_choice())) {
1131 merged_blocks.push_back(merge<Version::IPv4>(fams));
1133 merged_blocks.push_back(merge<Version::IPv6>(fams));
1136 m_ip_addr_blocks = merged_blocks;
1139template <IPAddressBlocks::Version V>
1140IPAddressBlocks::IPAddressFamily IPAddressBlocks::merge(std::vector<IPAddressFamily>& blocks) {
1145 BOTAN_ASSERT(!blocks.empty(),
"Cannot merge an empty set of IP address blocks into a single family");
1148 if(blocks.size() == 1) {
1152 bool all_inherit =
true;
1153 bool none_inherit =
true;
1154 for(
const IPAddressFamily& block : blocks) {
1155 const IPAddressChoice<V> choice = std::get<IPAddressChoice<V>>(block.addr_choice());
1156 all_inherit = !choice.ranges().has_value() && all_inherit;
1157 none_inherit = choice.ranges().has_value() && none_inherit;
1162 return IPAddressFamily(IPAddressChoice<V>(), blocks[0].safi());
1166 if(!all_inherit && !none_inherit) {
1167 throw Decoding_Error(
"Invalid IPAddressBlocks: Only one of 'inherit' or 'do not inherit' is allowed per family");
1170 std::vector<IPAddressOrRange<V>> merged_ranges;
1171 for(
const IPAddressFamily& block : blocks) {
1172 const IPAddressChoice<V> choice = std::get<IPAddressChoice<V>>(block.addr_choice());
1173 const std::vector<IPAddressOrRange<V>> ranges = choice.ranges().value();
1174 for(
const IPAddressOrRange<V>& r : ranges) {
1175 merged_ranges.push_back(r);
1180 IPAddressChoice<V> choice(merged_ranges);
1181 IPAddressFamily fam(choice, blocks[0].safi());
1190template <IPAddressBlocks::Version V>
1191using IPRangeVec = std::vector<IPAddressBlocks::IPAddressOrRange<V>>;
1195template <IPAddressBlocks::Version V>
1196using IPValidationMap = std::map<uint32_t, std::pair<bool, const IPRangeVec<V>*>>;
1198template <
typename T>
1199std::optional<std::vector<T>> sort_and_merge_ranges(std::optional<std::span<const T>> ranges) {
1204 if(!ranges.has_value()) {
1205 return std::nullopt;
1208 std::vector<T> sorted(ranges.value().begin(), ranges.value().end());
1210 if(sorted.empty()) {
1215 std::sort(sorted.begin(), sorted.end(), [](T& a, T& b) { return a.min() < b.min(); });
1218 std::vector<T> merged;
1219 merged.reserve(sorted.size());
1220 merged.push_back(sorted[0]);
1222 for(
size_t i = 1; i < sorted.size(); ++i) {
1223 auto& back = merged.back();
1225 if(sorted[i].min() <= back.max() || sorted[i].min() == (back.max() + 1)) {
1226 back = T(back.min(), std::max(back.max(), sorted[i].max()));
1228 merged.push_back(sorted[i]);
1235template <
typename T>
1236bool validate_subject_in_issuer(std::span<const T> subject, std::span<const T> issuer) {
1241 if(issuer.empty()) {
1242 return subject.empty();
1244 for(
auto subj = subject.begin(), issu = issuer.begin(); subj != subject.end();) {
1246 if(subj->min() > issu->max()) {
1249 if(issu == issuer.end() && subj != subject.end()) {
1254 if(subj->min() < issu->min()) {
1258 if(subj->max() > issu->max()) {
1268template <IPAddressBlocks::Version V>
1269void populate_validation_map(uint32_t afam,
1271 IPValidationMap<V>& map) {
1272 const std::optional<IPRangeVec<V>>& ranges = std::get<IPAddressBlocks::IPAddressChoice<V>>(choice).ranges();
1273 const bool has_value = ranges.has_value();
1274 const IPRangeVec<V>* value = has_value ? &ranges.value() :
nullptr;
1275 map.emplace(afam, std::make_pair(has_value, std::move(value)));
1278std::pair<IPValidationMap<IPv4>, IPValidationMap<IPv6>> create_validation_map(
1279 const std::vector<IPAddressBlocks::IPAddressFamily>& addr_blocks) {
1280 IPValidationMap<IPv4> v4_map;
1281 IPValidationMap<IPv6> v6_map;
1283 for(
const IPAddressBlocks::IPAddressFamily& block : addr_blocks) {
1284 uint32_t afam = block.afi();
1285 if(block.safi().has_value()) {
1286 afam =
static_cast<uint32_t
>(afam << 8) | block.safi().value();
1290 if(std::holds_alternative<IPAddressBlocks::IPAddressChoice<IPv4>>(a_choice)) {
1291 populate_validation_map(afam, a_choice, v4_map);
1293 populate_validation_map(afam, a_choice, v6_map);
1297 return std::make_pair(v4_map, v6_map);
1302template <IPAddressBlocks::Version V>
1304 std::optional<std::span<
const IPAddressBlocks::IPAddressOrRange<V>>> ranges) {
1306 m_ip_addr_ranges = sort_and_merge_ranges<IPAddressOrRange<V>>(ranges);
1309template <IPAddressBlocks::Version V>
1311 if(m_ip_addr_ranges.has_value()) {
1318template <IPAddressBlocks::Version V>
1324 m_ip_addr_ranges = std::nullopt;
1326 std::vector<IPAddressOrRange<V>> ip_ranges;
1328 m_ip_addr_ranges = sort_and_merge_ranges<IPAddressOrRange<V>>(ip_ranges);
1330 throw Decoding_Error(
fmt(
"Unexpected type for IPAddressChoice {}",
static_cast<uint32_t
>(next_tag)));
1334template <IPAddressBlocks::Version V>
1350 const size_t version_octets =
static_cast<size_t>(V);
1352 std::array<uint8_t, version_octets>
min = m_min.value();
1353 std::array<uint8_t, version_octets>
max = m_max.value();
1358 bool zeros_done =
false;
1359 bool ones_done =
false;
1362 for(
size_t i = version_octets; i > 0; i--) {
1364 const uint8_t local_zeros =
static_cast<uint8_t
>(std::countr_zero(
min[i - 1]));
1365 zeros += local_zeros;
1366 zeros_done = (local_zeros != 8);
1370 const uint8_t local_ones =
static_cast<uint8_t
>(std::countr_one(
max[i - 1]));
1372 ones_done = (local_ones != 8);
1375 if(zeros_done && ones_done) {
1381 const uint8_t host = std::min(zeros, ones);
1384 const uint8_t discarded_octets = host / 8;
1386 const uint8_t unused_bits = host % 8;
1388 bool octets_match =
true;
1389 bool used_bits_match =
true;
1392 if(discarded_octets < version_octets) {
1394 for(
size_t i = 0; i < static_cast<uint8_t>(version_octets - discarded_octets - 1); i++) {
1396 octets_match =
false;
1402 const uint8_t shifted_min = (
min[version_octets - 1 - discarded_octets] >> unused_bits);
1403 const uint8_t shifted_max = (
max[version_octets - 1 - discarded_octets] >> unused_bits);
1404 used_bits_match = (shifted_min == shifted_max);
1409 if(octets_match && used_bits_match) {
1411 std::vector<uint8_t> prefix;
1413 prefix.push_back(unused_bits);
1414 for(
size_t i = 0; i < static_cast<uint8_t>(version_octets - discarded_octets); i++) {
1415 prefix.push_back(
min[i]);
1420 const uint8_t discarded_octets_min = zeros / 8;
1421 const uint8_t unused_bits_min = zeros % 8;
1423 const uint8_t discarded_octets_max = ones / 8;
1424 const uint8_t unused_bits_max = ones % 8;
1427 if(unused_bits_max != 0) {
1429 max[version_octets - 1 - discarded_octets_max] >>= unused_bits_max;
1430 max[version_octets - 1 - discarded_octets_max] <<= unused_bits_max;
1433 std::vector<uint8_t> compressed_min;
1434 std::vector<uint8_t> compressed_max;
1437 compressed_min.push_back(unused_bits_min);
1438 for(
size_t i = 0; i < static_cast<uint8_t>(version_octets - discarded_octets_min); i++) {
1439 compressed_min.push_back(
min[i]);
1442 compressed_max.push_back(unused_bits_max);
1443 for(
size_t i = 0; i < static_cast<uint8_t>(version_octets - discarded_octets_max); i++) {
1444 compressed_max.push_back(
max[i]);
1454template <IPAddressBlocks::Version V>
1462 std::vector<uint8_t> prefix_min;
1466 std::vector<uint8_t> prefix_max(prefix_min);
1469 m_min = decode_single_address(std::move(prefix_min),
true);
1471 m_max = decode_single_address(std::move(prefix_max),
false);
1475 std::vector<uint8_t> addr_min;
1476 std::vector<uint8_t> addr_max;
1483 m_min = decode_single_address(std::move(addr_min),
true);
1484 m_max = decode_single_address(std::move(addr_max),
false);
1490 throw Decoding_Error(
fmt(
"Unexpected type for IPAddressOrRange {}",
static_cast<uint32_t
>(next_tag)));
1494template <IPAddressBlocks::Version V>
1497 const size_t version_octets =
static_cast<size_t>(V);
1502 if(decoded.empty() || decoded.size() > version_octets + 1) {
1503 throw Decoding_Error(
fmt(
"IP address range entries must have a length between 1 and {} bytes.", version_octets));
1506 const uint8_t unused = decoded.front();
1507 const uint8_t discarded_octets = version_octets - (
static_cast<uint8_t
>(decoded.size()) - 1);
1509 decoded.erase(decoded.begin());
1511 if(decoded.empty() && unused != 0) {
1512 throw Decoding_Error(
"IP address range entry specified unused bits, but did not provide any octets.");
1517 throw Decoding_Error(
"IP address range entry specified invalid number of unused bits.");
1521 const uint8_t fill_discarded = min ? 0 : 0xff;
1522 for(
size_t i = 0; i < discarded_octets; i++) {
1523 decoded.push_back(fill_discarded);
1528 for(
size_t i = 0; i < unused; i++) {
1530 decoded[version_octets - 1 - discarded_octets] &= ~(1 << i);
1532 decoded[version_octets - 1 - discarded_octets] |= (1 << i);
1536 return IPAddressBlocks::IPAddress<V>(decoded);
1539template <IPAddressBlocks::Version V>
1541 if(v.size() != Length) {
1542 throw Decoding_Error(
"number of bytes does not match IP version used");
1545 for(
size_t i = 0; i < Length; i++) {
1551 const std::optional<X509_Certificate>& ,
1552 const std::vector<X509_Certificate>& cert_path,
1553 std::vector<std::set<Certificate_Status_Code>>& cert_status,
1556 auto [v4_needs_check, v6_needs_check] = create_validation_map(m_ip_addr_blocks);
1558 if(pos == cert_path.size() - 1) {
1560 auto validate_root_cert_ext = [&](
const auto& map) {
1562 return std::any_of(map.begin(), map.end(), [&](
const auto& it) {
1563 const auto& [_1, validation_info] = it;
1564 const auto& [needs_checking, _2] = validation_info;
1565 return !needs_checking;
1568 if(validate_root_cert_ext(v4_needs_check) || validate_root_cert_ext(v6_needs_check)) {
1575 for(
auto cert_path_it = cert_path.begin() + pos + 1; cert_path_it != cert_path.end(); cert_path_it++) {
1578 if(parent_ip ==
nullptr) {
1582 auto [issuer_v4, issuer_v6] = create_validation_map(parent_ip->
addr_blocks());
1584 auto validate_against_issuer = [&](
auto& subject_map,
const auto& issuer_map) {
1585 for(
auto map_it = subject_map.begin(); map_it != subject_map.end(); map_it++) {
1586 auto& [afam, validation_info] = *map_it;
1589 if(issuer_map.count(afam) == 0) {
1594 auto& [needs_check, subject_value] = validation_info;
1595 const auto& [issuer_has_value, issuer_value] = issuer_map.at(afam);
1600 if(needs_check && issuer_has_value) {
1601 if(!validate_subject_in_issuer(std::span(*subject_value), std::span(*issuer_value))) {
1605 needs_check =
false;
1611 if(!validate_against_issuer(v4_needs_check, issuer_v4) || !validate_against_issuer(v6_needs_check, issuer_v6)) {
1615 auto validate_no_checks_left = [&](
const auto& map) {
1618 return std::all_of(map.begin(), map.end(), [&](
const auto& it) {
1619 const auto& [_1, validation_info] = it;
1620 const auto& [needs_checking, _2] = validation_info;
1621 return !needs_checking;
1625 if(validate_no_checks_left(v4_needs_check) && validate_no_checks_left(v6_needs_check)) {
1640 std::vector<uint8_t> output;
1645void ASBlocks::decode_inner(
const std::vector<uint8_t>& in) {
1650ASBlocks::ASIdentifierChoice ASBlocks::add_new(
const std::optional<ASIdentifierChoice>& old, asnum_t min, asnum_t max) {
1651 std::vector<ASIdOrRange> range;
1652 if(!old.has_value() || !old.value().ranges().has_value()) {
1653 range = {ASIdOrRange(min, max)};
1655 range = old.value().ranges().value();
1656 range.push_back(ASIdOrRange(min, max));
1658 return ASIdentifierChoice(range);
1664 if(!m_asnum.has_value() && !m_rdi.has_value()) {
1668 if(m_asnum.has_value()) {
1670 into.
encode(m_asnum.value());
1674 if(m_rdi.has_value()) {
1676 into.
encode(m_rdi.value());
1686 throw Decoding_Error(
fmt(
"Unexpected type for ASIdentifiers {}",
static_cast<uint32_t
>(next_tag)));
1692 const uint32_t elem_type_tag =
static_cast<uint32_t
>(elem_obj.
type_tag());
1695 if(elem_type_tag == 0) {
1703 if(
static_cast<uint32_t
>(rdi_type_tag) == 1) {
1709 throw Decoding_Error(
fmt(
"Unexpected type for ASIdentifiers rdi: {}",
static_cast<uint32_t
>(rdi_type_tag)));
1714 if(elem_type_tag == 1) {
1723 fmt(
"Unexpected element with type {} in ASIdentifiers",
static_cast<uint32_t
>(end_type_tag)));
1729 if(!m_asnum.has_value() && !m_rdi.has_value()) {
1735 if(m_as_ranges.has_value()) {
1743 m_as_ranges = sort_and_merge_ranges<ASIdOrRange>(
ranges);
1751 m_as_ranges = std::nullopt;
1753 std::vector<ASIdOrRange> as_ranges;
1756 m_as_ranges = sort_and_merge_ranges<ASIdOrRange>(as_ranges);
1758 throw Decoding_Error(
fmt(
"Unexpected type for ASIdentifierChoice {}",
static_cast<uint32_t
>(next_tag)));
1763 if(m_min == m_max) {
1764 into.
encode(
static_cast<size_t>(m_min));
1766 if(m_min >= m_max) {
1787 if(m_min >= m_max) {
1791 throw Decoding_Error(
fmt(
"Unexpected type for ASIdOrRange {}",
static_cast<uint32_t
>(next_tag)));
1796 const std::optional<X509_Certificate>& ,
1797 const std::vector<X509_Certificate>& cert_path,
1798 std::vector<std::set<Certificate_Status_Code>>& cert_status,
1801 const bool asnum_present = m_as_identifiers.asnum().has_value();
1802 const bool rdi_present = m_as_identifiers.rdi().has_value();
1804 if(!asnum_present && !rdi_present) {
1810 bool asnum_needs_check = asnum_present ? m_as_identifiers.asnum().value().ranges().has_value() :
false;
1811 bool rdi_needs_check = rdi_present ? m_as_identifiers.rdi().value().ranges().has_value() :
false;
1814 if(pos == cert_path.size() - 1) {
1816 if((asnum_present && !asnum_needs_check) || (rdi_present && !rdi_needs_check)) {
1823 for(
auto it = cert_path.begin() + pos + 1; it != cert_path.end(); it++) {
1824 const ASBlocks*
const parent_as = it->v3_extensions().get_extension_object_as<
ASBlocks>();
1826 if(parent_as ==
nullptr || (asnum_present && !parent_as->
as_identifiers().
asnum().has_value()) ||
1834 if(asnum_needs_check &&
as_identifiers.asnum().value().ranges().has_value()) {
1835 const std::vector<ASBlocks::ASIdOrRange>& subject_asnums = m_as_identifiers.asnum()->ranges().value();
1836 const std::vector<ASBlocks::ASIdOrRange>& issuer_asnums =
as_identifiers.asnum()->ranges().value();
1838 if(!validate_subject_in_issuer<ASBlocks::ASIdOrRange>(subject_asnums, issuer_asnums)) {
1843 asnum_needs_check =
false;
1846 if(rdi_needs_check &&
as_identifiers.rdi().value().ranges().has_value()) {
1847 const std::vector<ASBlocks::ASIdOrRange>& subject_rdis = m_as_identifiers.rdi()->ranges().value();
1848 const std::vector<ASBlocks::ASIdOrRange>& issuer_rdis =
as_identifiers.rdi()->ranges().value();
1850 if(!validate_subject_in_issuer<ASBlocks::ASIdOrRange>(subject_rdis, issuer_rdis)) {
1855 rdi_needs_check =
false;
1858 if(!asnum_needs_check && !rdi_needs_check) {
1866 return {0x05, 0x00};
1869void OCSP_NoCheck::decode_inner(
const std::vector<uint8_t>& buf) {
1878void Unknown_Extension::decode_inner(
const std::vector<uint8_t>& bytes) {