Botan 3.12.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) 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 805 of file x509_ext.h.

Member Typedef Documentation

◆ asnum_t

Definition at line 807 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 875 of file x509_ext.h.

875: 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 890 of file x509_ext.h.

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

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 893 of file x509_ext.h.

893 {
894 m_as_identifiers = ASIdentifiers(add_new(m_as_identifiers.asnum(), min, max), m_as_identifiers.rdi());
895 }

◆ 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 910 of file x509_ext.h.

910 {
911 m_as_identifiers = ASIdentifiers(m_as_identifiers.asnum(), add_new(m_as_identifiers.rdi(), min, max));
912 }

◆ 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 907 of file x509_ext.h.

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

References add_rdi().

Referenced by add_rdi().

◆ as_identifiers()

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

Definition at line 923 of file x509_ext.h.

923{ return m_as_identifiers; }

Referenced by 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 877 of file x509_ext.h.

877{ 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 904 of file x509_ext.h.

904{ 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 921 of file x509_ext.h.

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

◆ oid_of()

OID Botan::Cert_Extension::ASBlocks::oid_of ( ) const
inlineoverridevirtual
Returns
OID representing this extension

Implements Botan::Certificate_Extension.

Definition at line 881 of file x509_ext.h.

881{ 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 898 of file x509_ext.h.

898 {
899 std::vector<ASIdOrRange> empty;
900 m_as_identifiers = ASIdentifiers(ASIdentifierChoice(empty), m_as_identifiers.rdi());
901 }

◆ restrict_rdi()

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

Make the extension contain no allowed rdi's.

Definition at line 915 of file x509_ext.h.

915 {
916 std::vector<ASIdOrRange> empty;
917 m_as_identifiers = ASIdentifiers(m_as_identifiers.asnum(), ASIdentifierChoice(empty));
918 }

◆ static_oid()

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

Definition at line 879 of file x509_ext.h.

879{ 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 )
overridevirtual

Reimplemented from Botan::Certificate_Extension.

Definition at line 1795 of file x509_ext.cpp.

1799 {
1800 // the extension may not contain asnums or rdis, but one of them is always present
1801 const bool asnum_present = m_as_identifiers.asnum().has_value();
1802 const bool rdi_present = m_as_identifiers.rdi().has_value();
1803
1804 if(!asnum_present && !rdi_present) {
1805 // Invalid, should have been caught during decoding
1806 cert_status.at(pos).insert(Certificate_Status_Code::AS_BLOCKS_ERROR);
1807 return;
1808 }
1809
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;
1812
1813 // we are at the (trusted) root cert, there is no parent to verify against
1814 if(pos == cert_path.size() - 1) {
1815 // asnum / rdi is present, but has 'inherit' value, but there is nothing to inherit from
1816 if((asnum_present && !asnum_needs_check) || (rdi_present && !rdi_needs_check)) {
1817 cert_status.at(pos).insert(Certificate_Status_Code::AS_BLOCKS_ERROR);
1818 }
1819 return;
1820 }
1821
1822 // traverse the chain until we find a cert with concrete values for the extension (so not 'inherit')
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>();
1825 // no extension at all or no asnums or no rdis (if needed)
1826 if(parent_as == nullptr || (asnum_present && !parent_as->as_identifiers().asnum().has_value()) ||
1827 (rdi_present && !parent_as->as_identifiers().rdi().has_value())) {
1828 cert_status.at(pos).insert(Certificate_Status_Code::AS_BLOCKS_ERROR);
1829 return;
1830 }
1831 const auto as_identifiers = parent_as->as_identifiers();
1832
1833 // only something to validate if the subject does not have 'inherit' as a 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();
1837
1838 if(!validate_subject_in_issuer<ASBlocks::ASIdOrRange>(subject_asnums, issuer_asnums)) {
1839 cert_status.at(pos).insert(Certificate_Status_Code::AS_BLOCKS_ERROR);
1840 return;
1841 }
1842 // successfully validated the asnums, but we may need to step further for rdis
1843 asnum_needs_check = false;
1844 }
1845
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();
1849
1850 if(!validate_subject_in_issuer<ASBlocks::ASIdOrRange>(subject_rdis, issuer_rdis)) {
1851 cert_status.at(pos).insert(Certificate_Status_Code::AS_BLOCKS_ERROR);
1852 return;
1853 }
1854 // successfully validated the rdis, but we may need to step further for asnums
1855 rdi_needs_check = false;
1856 }
1857
1858 if(!asnum_needs_check && !rdi_needs_check) {
1859 // we've validated what we need to and can stop traversing the cert chain
1860 return;
1861 }
1862 }
1863}
const ASIdentifiers & as_identifiers() const
Definition x509_ext.h:923

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: