Botan 3.13.0
Crypto and TLS for C&
Botan::Cert_Extension::ASBlocks Class Referencefinal

#include <x509_ext.h>

Inheritance diagram for Botan::Cert_Extension::ASBlocks:
Botan::Certificate_Extension

Classes

class  ASIdentifierChoice
class  ASIdentifiers
class  ASIdOrRange

Public Types

typedef uint32_t asnum_t

Public Member Functions

void add_asnum (asnum_t asnum)
 Add a single asnum to this extension.
void add_asnum (asnum_t min, asnum_t max)
 Add an asnum range to this extension.
void add_rdi (asnum_t min, asnum_t max)
 Add an rdi range to this extension.
void add_rdi (asnum_t rdi)
 Add a single rdi to this extension.
const ASIdentifiersas_identifiers () const
 ASBlocks ()=default
 ASBlocks (const ASIdentifiers &as_idents)
std::unique_ptr< Certificate_Extensioncopy () const override
void inherit_asnum ()
 Mark the asnum entry as 'inherit'.
void inherit_rdi ()
 Mark the rdi entry as 'inherit'.
OID oid_of () const override
void restrict_asnum ()
 Make the extension contain no allowed asnum's.
void restrict_rdi ()
 Make the extension contain no allowed rdi's.
void validate (const X509_Certificate &subject, const std::optional< X509_Certificate > &issuer, const std::vector< X509_Certificate > &cert_path, std::vector< std::set< Certificate_Status_Code > > &cert_status, size_t pos) const override

Static Public Member Functions

static OID static_oid ()

Detailed Description

AS Blocks Extension

RFC 3779 X.509 Extensions for AS ID

Definition at line 1139 of file x509_ext.h.

Member Typedef Documentation

◆ asnum_t

Definition at line 1141 of file x509_ext.h.

Constructor & Destructor Documentation

◆ ASBlocks() [1/2]

Botan::Cert_Extension::ASBlocks::ASBlocks ( )
default

Referenced by validate().

◆ ASBlocks() [2/2]

Botan::Cert_Extension::ASBlocks::ASBlocks ( const ASIdentifiers & as_idents)
inlineexplicit

Definition at line 1209 of file x509_ext.h.

1209: m_as_identifiers(as_idents) {}

Member Function Documentation

◆ add_asnum() [1/2]

void Botan::Cert_Extension::ASBlocks::add_asnum ( asnum_t asnum)
inline

Add a single asnum to this extension.

Definition at line 1224 of file x509_ext.h.

1224{ add_asnum(asnum, asnum); }
void add_asnum(asnum_t asnum)
Add a single asnum to this extension.
Definition x509_ext.h:1224

References add_asnum().

Referenced by add_asnum().

◆ add_asnum() [2/2]

void Botan::Cert_Extension::ASBlocks::add_asnum ( asnum_t min,
asnum_t max )
inline

Add an asnum range to this extension.

Definition at line 1227 of file x509_ext.h.

1227 {
1228 m_as_identifiers = ASIdentifiers(add_new(m_as_identifiers.asnum(), min, max), m_as_identifiers.rdi());
1229 }

◆ add_rdi() [1/2]

void Botan::Cert_Extension::ASBlocks::add_rdi ( asnum_t min,
asnum_t max )
inline

Add an rdi range to this extension.

Definition at line 1244 of file x509_ext.h.

1244 {
1245 m_as_identifiers = ASIdentifiers(m_as_identifiers.asnum(), add_new(m_as_identifiers.rdi(), min, max));
1246 }

◆ add_rdi() [2/2]

void Botan::Cert_Extension::ASBlocks::add_rdi ( asnum_t rdi)
inline

Add a single rdi to this extension.

Definition at line 1241 of file x509_ext.h.

1241{ add_rdi(rdi, rdi); }
void add_rdi(asnum_t rdi)
Add a single rdi to this extension.
Definition x509_ext.h:1241

References add_rdi().

Referenced by add_rdi().

◆ as_identifiers()

const ASIdentifiers & Botan::Cert_Extension::ASBlocks::as_identifiers ( ) const
inline

Definition at line 1257 of file x509_ext.h.

1257{ return m_as_identifiers; }

Referenced by botan_x509_ext_as_blocks_get_entry_at(), botan_x509_ext_as_blocks_get_info(), and validate().

◆ copy()

std::unique_ptr< Certificate_Extension > Botan::Cert_Extension::ASBlocks::copy ( ) const
inlineoverridevirtual

Make a copy of this extension

Returns
copy of this

Implements Botan::Certificate_Extension.

Definition at line 1211 of file x509_ext.h.

1211{ return std::make_unique<ASBlocks>(*this); }

◆ inherit_asnum()

void Botan::Cert_Extension::ASBlocks::inherit_asnum ( )
inline

Mark the asnum entry as 'inherit'.

Definition at line 1238 of file x509_ext.h.

1238{ m_as_identifiers = ASIdentifiers(ASIdentifierChoice(), m_as_identifiers.rdi()); }

◆ inherit_rdi()

void Botan::Cert_Extension::ASBlocks::inherit_rdi ( )
inline

Mark the rdi entry as 'inherit'.

Definition at line 1255 of file x509_ext.h.

1255{ m_as_identifiers = ASIdentifiers(m_as_identifiers.asnum(), ASIdentifierChoice()); }

◆ oid_of()

OID Botan::Cert_Extension::ASBlocks::oid_of ( ) const
inlineoverridevirtual

Return object identifier for this extension

Returns
OID representing this extension

Implements Botan::Certificate_Extension.

Definition at line 1215 of file x509_ext.h.

1215{ return static_oid(); }

References static_oid().

◆ restrict_asnum()

void Botan::Cert_Extension::ASBlocks::restrict_asnum ( )
inline

Make the extension contain no allowed asnum's.

Definition at line 1232 of file x509_ext.h.

1232 {
1233 std::vector<ASIdOrRange> empty;
1234 m_as_identifiers = ASIdentifiers(ASIdentifierChoice(empty), m_as_identifiers.rdi());
1235 }

◆ restrict_rdi()

void Botan::Cert_Extension::ASBlocks::restrict_rdi ( )
inline

Make the extension contain no allowed rdi's.

Definition at line 1249 of file x509_ext.h.

1249 {
1250 std::vector<ASIdOrRange> empty;
1251 m_as_identifiers = ASIdentifiers(m_as_identifiers.asnum(), ASIdentifierChoice(empty));
1252 }

◆ static_oid()

OID Botan::Cert_Extension::ASBlocks::static_oid ( )
inlinestatic

Definition at line 1213 of file x509_ext.h.

1213{ return OID({1, 3, 6, 1, 5, 5, 7, 1, 8}); }

Referenced by oid_of().

◆ validate()

void Botan::Cert_Extension::ASBlocks::validate ( const X509_Certificate & subject,
const std::optional< X509_Certificate > & issuer,
const std::vector< X509_Certificate > & cert_path,
std::vector< std::set< Certificate_Status_Code > > & cert_status,
size_t pos ) const
overridevirtual

Callback visited during path validation.

An extension can implement this callback to inspect the path during path validation.

If an error occurs during validation of this extension, an appropriate status code shall be added to cert_status.

Parameters
subjectSubject certificate that contains this extension
issuerIssuer certificate. nullopt for certificates with no available issuer (e.g. non self-signed trust anchors).
cert_pathCertificate path which is currently validated
cert_statusCertificate validation status codes for subject certificate
posPosition of subject certificate in cert_path

Reimplemented from Botan::Certificate_Extension.

Definition at line 2444 of file x509_ext.cpp.

2448 {
2449 // the extension may not contain asnums or rdis, but one of them is always present
2450 const bool asnum_present = m_as_identifiers.asnum().has_value();
2451 const bool rdi_present = m_as_identifiers.rdi().has_value();
2452
2453 if(!asnum_present && !rdi_present) {
2454 // Invalid, should have been caught during decoding
2455 cert_status.at(pos).insert(Certificate_Status_Code::AS_BLOCKS_ERROR);
2456 return;
2457 }
2458
2459 bool asnum_needs_check = asnum_present ? m_as_identifiers.asnum().value().ranges().has_value() : false;
2460 bool rdi_needs_check = rdi_present ? m_as_identifiers.rdi().value().ranges().has_value() : false;
2461
2462 // we are at the (trusted) root cert, there is no parent to verify against
2463 if(pos == cert_path.size() - 1) {
2464 // asnum / rdi is present, but has 'inherit' value, but there is nothing to inherit from
2465 if((asnum_present && !asnum_needs_check) || (rdi_present && !rdi_needs_check)) {
2466 cert_status.at(pos).insert(Certificate_Status_Code::AS_BLOCKS_ERROR);
2467 }
2468 return;
2469 }
2470
2471 // traverse the chain until we find a cert with concrete values for the extension (so not 'inherit')
2472 for(auto it = cert_path.begin() + pos + 1; it != cert_path.end(); it++) {
2473 const ASBlocks* const parent_as = it->v3_extensions().get_extension_object_as<ASBlocks>();
2474 // no extension at all or no asnums or no rdis (if needed)
2475 if(parent_as == nullptr || (asnum_present && !parent_as->as_identifiers().asnum().has_value()) ||
2476 (rdi_present && !parent_as->as_identifiers().rdi().has_value())) {
2477 cert_status.at(pos).insert(Certificate_Status_Code::AS_BLOCKS_ERROR);
2478 return;
2479 }
2480 const auto as_identifiers = parent_as->as_identifiers();
2481
2482 // only something to validate if the subject does not have 'inherit' as a value
2483 if(asnum_needs_check && as_identifiers.asnum().value().ranges().has_value()) {
2484 const std::vector<ASBlocks::ASIdOrRange>& subject_asnums = m_as_identifiers.asnum()->ranges().value();
2485 const std::vector<ASBlocks::ASIdOrRange>& issuer_asnums = as_identifiers.asnum()->ranges().value();
2486
2487 if(!validate_subject_in_issuer<ASBlocks::ASIdOrRange>(subject_asnums, issuer_asnums)) {
2488 cert_status.at(pos).insert(Certificate_Status_Code::AS_BLOCKS_ERROR);
2489 return;
2490 }
2491 // successfully validated the asnums, but we may need to step further for rdis
2492 asnum_needs_check = false;
2493 }
2494
2495 if(rdi_needs_check && as_identifiers.rdi().value().ranges().has_value()) {
2496 const std::vector<ASBlocks::ASIdOrRange>& subject_rdis = m_as_identifiers.rdi()->ranges().value();
2497 const std::vector<ASBlocks::ASIdOrRange>& issuer_rdis = as_identifiers.rdi()->ranges().value();
2498
2499 if(!validate_subject_in_issuer<ASBlocks::ASIdOrRange>(subject_rdis, issuer_rdis)) {
2500 cert_status.at(pos).insert(Certificate_Status_Code::AS_BLOCKS_ERROR);
2501 return;
2502 }
2503 // successfully validated the rdis, but we may need to step further for asnums
2504 rdi_needs_check = false;
2505 }
2506
2507 if(!asnum_needs_check && !rdi_needs_check) {
2508 // we've validated what we need to and can stop traversing the cert chain
2509 return;
2510 }
2511 }
2512}
const ASIdentifiers & as_identifiers() const
Definition x509_ext.h:1257

References Botan::AS_BLOCKS_ERROR, as_identifiers(), ASBlocks(), Botan::Cert_Extension::ASBlocks::ASIdentifiers::asnum(), and Botan::Cert_Extension::ASBlocks::ASIdentifiers::rdi().


The documentation for this class was generated from the following files: