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

#include <x509_ext.h>

Inheritance diagram for Botan::Cert_Extension::CRL_Distribution_Points::Distribution_Point:
Botan::ASN1_Object

Public Member Functions

std::vector< uint8_t > BER_encode () const
const std::optional< AlternativeName > & crl_issuer () const
void decode_from (BER_Decoder &from) override
 Distribution_Point ()=default
 Distribution_Point (const AlternativeName &name)
 Distribution_Point (std::optional< DistributionPointName > dp_name, std::optional< ReasonFlags > reasons, std::optional< AlternativeName > crl_issuer)
const std::optional< DistributionPointName > & distribution_point_name () const
void encode_into (DER_Encoder &to) const override
const AlternativeNamepoint () const
const std::optional< ReasonFlags > & reasons () const

Detailed Description

Definition at line 604 of file x509_ext.h.

Constructor & Destructor Documentation

◆ Distribution_Point() [1/3]

Botan::Cert_Extension::CRL_Distribution_Points::Distribution_Point::Distribution_Point ( )
default

◆ Distribution_Point() [2/3]

Botan::Cert_Extension::CRL_Distribution_Points::Distribution_Point::Distribution_Point ( const AlternativeName & name)
inlineexplicit

Definition at line 611 of file x509_ext.h.

611: m_dp_name(DistributionPointName(name)) {}

◆ Distribution_Point() [3/3]

Botan::Cert_Extension::CRL_Distribution_Points::Distribution_Point::Distribution_Point ( std::optional< DistributionPointName > dp_name,
std::optional< ReasonFlags > reasons,
std::optional< AlternativeName > crl_issuer )
inline

Definition at line 613 of file x509_ext.h.

615 :
616 m_dp_name(std::move(dp_name)), m_reasons(reasons), m_crl_issuer(std::move(crl_issuer)) {}
const std::optional< ReasonFlags > & reasons() const
Definition x509_ext.h:626
const std::optional< AlternativeName > & crl_issuer() const
Definition x509_ext.h:631

References crl_issuer(), and reasons().

Member Function Documentation

◆ BER_encode()

std::vector< uint8_t > Botan::ASN1_Object::BER_encode ( ) const
inherited

Return the encoding of this object. This is a convenience method when just one object needs to be serialized. Use DER_Encoder for complicated encodings.

Definition at line 21 of file asn1_obj.cpp.

21 {
22 std::vector<uint8_t> output;
23 DER_Encoder der(output);
24 this->encode_into(der);
25 return output;
26}
virtual void encode_into(DER_Encoder &to) const =0

References encode_into().

Referenced by decode_from(), Botan::PKCS12::export_to(), Botan::Certificate_Store_In_SQL::find_all_certs(), Botan::Certificate_Store_In_SQL::find_cert(), Botan::X509_Certificate::fingerprint(), Botan::Certificate_Store_In_SQL::insert_cert(), Botan::X509_Object::PEM_encode(), and Botan::PSS_Params::PSS_Params().

◆ crl_issuer()

const std::optional< AlternativeName > & Botan::Cert_Extension::CRL_Distribution_Points::Distribution_Point::crl_issuer ( ) const
inline

Return the optional CRL issuer name

Definition at line 631 of file x509_ext.h.

631{ return m_crl_issuer; }

Referenced by decode_from(), and Distribution_Point().

◆ decode_from()

void Botan::Cert_Extension::CRL_Distribution_Points::Distribution_Point::decode_from ( BER_Decoder & from)
overridevirtual

Decode whatever this object is from from

Parameters
fromthe BER_Decoder that will be read from

Implements Botan::ASN1_Object.

Definition at line 1447 of file x509_ext.cpp.

1447 {
1448 /*
1449 * DistributionPoint ::= SEQUENCE {
1450 * distributionPoint [0] DistributionPointName OPTIONAL,
1451 * reasons [1] ReasonFlags OPTIONAL,
1452 * cRLIssuer [2] GeneralNames OPTIONAL }
1453 */
1454 BER_Decoder dp = ber.start_sequence();
1455
1456 m_dp_name.reset();
1457 m_reasons.reset();
1458 m_crl_issuer.reset();
1459
1460 // DER: these optional fields appear at most once and in increasing tag
1461 // order. Decoding them in tag order and then rejecting anything left over
1462 // (see end_cons below) catches out-of-order, duplicate, and unknown fields.
1463 dp.decode_optional_field(0,
1465 [&](BER_Decoder& d) {
1466 DistributionPointName name;
1467 d.start_context_specific(0).decode(name).verify_end();
1468 m_dp_name = std::move(name);
1469 })
1470 .decode_optional_field(
1471 1, ASN1_Class::ContextSpecific, [&](BER_Decoder& d) { m_reasons = decode_reason_flags_implicit(d, 1); })
1472 .decode_optional_field(2, ASN1_Class::ContextSpecific | ASN1_Class::Constructed, [&](BER_Decoder& d) {
1473 AlternativeName crl_issuer;
1474 d.decode_implicit(crl_issuer,
1475 ASN1_Type(2),
1479 m_crl_issuer = std::move(crl_issuer);
1480 });
1481
1482 dp.end_cons();
1483
1484 // RFC 5280 4.2.1.6: GeneralNames ::= SEQUENCE SIZE (1..MAX) OF GeneralName
1485 if(m_crl_issuer.has_value() && m_crl_issuer->is_empty()) {
1486 throw Decoding_Error("cRLIssuer GeneralNames must contain at least one GeneralName");
1487 }
1488
1489 if(m_crl_issuer.has_value() && !crl_issuer_is_well_formed(*m_crl_issuer)) {
1490 /* RFC 5280 4.2.1.13: "If present, the cRLIssuer MUST only contain the
1491 * distinguished name (DN) from the issuer field of the CRL". */
1492 throw Decoding_Error("cRLIssuer must contain exactly one non-empty directoryName GeneralName");
1493 }
1494
1495 if(!m_dp_name.has_value() && !m_crl_issuer.has_value()) {
1496 throw Decoding_Error("DistributionPoint must contain either distributionPoint or cRLIssuer");
1497 }
1498}
ASN1_Type
Definition asn1_obj.h:47

References Botan::Constructed, Botan::ContextSpecific, crl_issuer(), Botan::BER_Decoder::decode(), Botan::BER_Decoder::decode_implicit(), Botan::BER_Decoder::decode_optional_field(), Botan::BER_Decoder::end_cons(), Botan::Sequence, Botan::BER_Decoder::start_context_specific(), Botan::BER_Decoder::start_sequence(), and Botan::BER_Decoder::verify_end().

◆ distribution_point_name()

const std::optional< DistributionPointName > & Botan::Cert_Extension::CRL_Distribution_Points::Distribution_Point::distribution_point_name ( ) const
inline

Return the optional distribution point name

Definition at line 621 of file x509_ext.h.

621{ return m_dp_name; }

◆ encode_into()

void Botan::Cert_Extension::CRL_Distribution_Points::Distribution_Point::encode_into ( DER_Encoder & to) const
overridevirtual

Encode whatever this object is into to

Parameters
tothe DER_Encoder that will be written to

Implements Botan::ASN1_Object.

Definition at line 1409 of file x509_ext.cpp.

1409 {
1410 /*
1411 * DistributionPoint ::= SEQUENCE {
1412 * distributionPoint [0] DistributionPointName OPTIONAL,
1413 * reasons [1] ReasonFlags OPTIONAL,
1414 * cRLIssuer [2] GeneralNames OPTIONAL }
1415 *
1416 * RFC 5280 4.2.1.13: "either distributionPoint or cRLIssuer MUST be present".
1417 */
1418 const bool has_dp_name = m_dp_name.has_value();
1419 const bool has_crl_issuer = m_crl_issuer.has_value();
1420 if(!has_dp_name && !has_crl_issuer) {
1421 throw Encoding_Error("DistributionPoint must contain either distributionPoint or cRLIssuer");
1422 }
1423 if(has_crl_issuer && !crl_issuer_is_well_formed(*m_crl_issuer)) {
1424 /* RFC 5280 4.2.1.13: "If present, the cRLIssuer MUST only contain the
1425 * distinguished name (DN) from the issuer field of the CRL". */
1426 throw Encoding_Error("cRLIssuer must contain exactly one non-empty directoryName GeneralName");
1427 }
1428
1429 der.start_sequence();
1430
1431 if(has_dp_name) {
1432 // distributionPoint [0] EXPLICIT DistributionPointName
1433 der.start_explicit_context_specific(0).encode(*m_dp_name).end_cons();
1434 }
1435
1436 if(m_reasons) {
1437 emit_reason_flags_implicit(der, 1, *m_reasons);
1438 }
1439
1440 if(has_crl_issuer) {
1441 emit_general_names_implicit(der, *m_crl_issuer, 2);
1442 }
1443
1444 der.end_cons();
1445}

References Botan::DER_Encoder::encode(), Botan::DER_Encoder::end_cons(), Botan::DER_Encoder::start_explicit_context_specific(), and Botan::DER_Encoder::start_sequence().

◆ point()

const AlternativeName & Botan::Cert_Extension::CRL_Distribution_Points::Distribution_Point::point ( ) const

Deprecated compatibility shim. Raises Invalid_State if the distributionPoint field is absent or the name is a relative name.

Prefer distribution_point_name(), which surfaces both the OPTIONAL field and the CHOICE arm explicitly.

Definition at line 1331 of file x509_ext.cpp.

1331 {
1332 BOTAN_STATE_CHECK(m_dp_name.has_value() && m_dp_name->full_name().has_value());
1333 return *m_dp_name->full_name();
1334}
#define BOTAN_STATE_CHECK(expr)
Definition assert.h:49

References BOTAN_STATE_CHECK.

◆ reasons()

const std::optional< ReasonFlags > & Botan::Cert_Extension::CRL_Distribution_Points::Distribution_Point::reasons ( ) const
inline

Return the optional reason flags

Definition at line 626 of file x509_ext.h.

626{ return m_reasons; }

Referenced by Distribution_Point().


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