Botan 3.12.0
Crypto and TLS for C&
Botan::Extensions Class Referencefinal

#include <pkix_types.h>

Inheritance diagram for Botan::Extensions:
Botan::ASN1_Object

Public Member Functions

void add (std::unique_ptr< Certificate_Extension > extn, bool critical=false)
bool add_new (std::unique_ptr< Certificate_Extension > extn, bool critical=false)
std::vector< uint8_t > BER_encode () const
bool critical_extension_set (const OID &oid) const
std::vector< OIDcritical_extensions () const
void decode_from (BER_Decoder &from) override
void encode_into (DER_Encoder &to) const override
bool extension_set (const OID &oid) const
 Extensions ()=default
 Extensions (const Extensions &)=default
 Extensions (Extensions &&)=default
std::vector< std::pair< std::unique_ptr< Certificate_Extension >, bool > > extensions () const
std::map< OID, std::pair< std::vector< uint8_t >, bool > > extensions_raw () const
std::unique_ptr< Certificate_Extensionget (const OID &oid) const
std::vector< uint8_t > get_extension_bits (const OID &oid) const
const Certificate_Extensionget_extension_object (const OID &oid) const
template<typename T>
const T * get_extension_object_as (const OID &oid=T::static_oid()) const
const std::vector< OID > & get_extension_oids () const
template<typename T>
std::unique_ptr< T > get_raw (const OID &oid) const
Extensionsoperator= (const Extensions &)=default
Extensionsoperator= (Extensions &&)=default
bool remove (const OID &oid)
void replace (std::unique_ptr< Certificate_Extension > extn, bool critical=false)
 ~Extensions () override=default

Detailed Description

X.509 Certificate Extension List

Definition at line 539 of file pkix_types.h.

Constructor & Destructor Documentation

◆ Extensions() [1/3]

Botan::Extensions::Extensions ( )
default

◆ Extensions() [2/3]

Botan::Extensions::Extensions ( const Extensions & )
default

References Extensions().

◆ Extensions() [3/3]

Botan::Extensions::Extensions ( Extensions && )
default

References Extensions().

◆ ~Extensions()

Botan::Extensions::~Extensions ( )
overridedefault

References BOTAN_UNSTABLE_API.

Member Function Documentation

◆ add()

void Botan::Extensions::add ( std::unique_ptr< Certificate_Extension > extn,
bool critical = false )

Adds a new extension to the list.

Parameters
extnpointer to the certificate extension (Extensions takes ownership)
criticalwhether this extension should be marked as critical
Exceptions
Invalid_Argumentif the extension is already present in the list

Definition at line 166 of file x509_ext.cpp.

166 {
167 // sanity check: we don't want to have the same extension more than once
168 if(m_extension_info.contains(extn->oid_of())) {
169 const std::string name = extn->oid_name();
170 throw Invalid_Argument("Extension " + name + " already present in Extensions::add");
171 }
172
173 const OID oid = extn->oid_of();
174 Extensions_Info info(critical, std::move(extn));
175 m_extension_oids.push_back(oid);
176 m_extension_info.emplace(oid, info);
177}

◆ add_new()

bool Botan::Extensions::add_new ( std::unique_ptr< Certificate_Extension > extn,
bool critical = false )

Adds a new extension to the list unless it already exists. If the extension already exists within the Extensions object, the extn pointer will be deleted.

Parameters
extnpointer to the certificate extension (Extensions takes ownership)
criticalwhether this extension should be marked as critical
Returns
true if the object was added false if the extension was already used

Definition at line 179 of file x509_ext.cpp.

179 {
180 if(m_extension_info.contains(extn->oid_of())) {
181 return false; // already exists
182 }
183
184 const OID oid = extn->oid_of();
185 Extensions_Info info(critical, std::move(extn));
186 m_extension_oids.push_back(oid);
187 m_extension_info.emplace(oid, info);
188 return true;
189}

Referenced by Botan::X509::create_cert_req(), and Botan::X509::create_self_signed_cert().

◆ 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 20 of file asn1_obj.cpp.

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

References encode_into().

Referenced by decode_from(), 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(), Botan::PSS_Params::PSS_Params(), and Botan::Certificate_Store_In_SQL::revoke_cert().

◆ critical_extension_set()

bool Botan::Extensions::critical_extension_set ( const OID & oid) const

Return true if an extension was set and marked critical

Definition at line 215 of file x509_ext.cpp.

215 {
216 auto i = m_extension_info.find(oid);
217 if(i != m_extension_info.end()) {
218 return i->second.is_critical();
219 }
220 return false;
221}

Referenced by Botan::X509_Certificate::is_critical().

◆ critical_extensions()

std::vector< OID > Botan::Extensions::critical_extensions ( ) const

Return the set of critical extensions in the order they appeared in the extension list (This may be an empty vector)

Definition at line 109 of file x509_ext.cpp.

109 {
110 std::vector<OID> crit;
111
112 for(const auto& oid : m_extension_oids) {
113 auto ext_info = m_extension_info.find(oid);
114 BOTAN_ASSERT_NOMSG(ext_info != m_extension_info.end());
115 if(ext_info->second.is_critical()) {
116 crit.push_back(oid);
117 }
118 }
119
120 return crit;
121}
#define BOTAN_ASSERT_NOMSG(expr)
Definition assert.h:75

References BOTAN_ASSERT_NOMSG.

Referenced by Botan::OCSP::SingleResponse::decode_from(), and Botan::OCSP::Response::Response().

◆ decode_from()

void Botan::Extensions::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 288 of file x509_ext.cpp.

288 {
289 m_extension_oids.clear();
290 m_extension_info.clear();
291
292 BER_Decoder sequence = from_source.start_sequence();
293
294 while(sequence.more_items()) {
295 OID oid;
296 bool critical = false;
297 std::vector<uint8_t> bits;
298
299 sequence.start_sequence()
300 .decode(oid)
301 .decode_optional(critical, ASN1_Type::Boolean, ASN1_Class::Universal, false)
302 .decode(bits, ASN1_Type::OctetString)
303 .end_cons();
304
305 auto obj = create_extn_obj(oid, critical, bits);
306 Extensions_Info info(critical, bits, std::move(obj));
307
308 // RFC 5280 4.2: "A certificate MUST NOT include more than one
309 // instance of a particular extension."
310 if(!m_extension_info.emplace(oid, info).second) {
311 throw Decoding_Error("Duplicate certificate extension encountered");
312 }
313 m_extension_oids.push_back(oid);
314 }
315 sequence.verify_end();
316}

References Botan::Boolean, Botan::BER_Decoder::decode(), Botan::BER_Decoder::decode_optional(), Botan::BER_Decoder::end_cons(), Botan::BER_Decoder::more_items(), Botan::OctetString, Botan::BER_Decoder::start_sequence(), Botan::Universal, and Botan::BER_Decoder::verify_end().

◆ encode_into()

void Botan::Extensions::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 268 of file x509_ext.cpp.

268 {
269 for(const auto& [oid, extn] : m_extension_info) {
270 const bool should_encode = extn.obj().should_encode();
271
272 if(should_encode) {
273 const auto is_critical = extn.is_critical() ? std::optional<bool>{true} : std::nullopt;
274 const std::vector<uint8_t>& ext_value = extn.bits();
275
276 to_object.start_sequence()
277 .encode(oid)
278 .encode_optional(is_critical)
279 .encode(ext_value, ASN1_Type::OctetString)
280 .end_cons();
281 }
282 }
283}

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

◆ extension_set()

bool Botan::Extensions::extension_set ( const OID & oid) const

Return true if an extension was set

Definition at line 211 of file x509_ext.cpp.

211 {
212 return m_extension_info.contains(oid);
213}

Referenced by botan_x509_cert_issuer_alternative_names(), and botan_x509_cert_subject_alternative_names().

◆ extensions()

std::vector< std::pair< std::unique_ptr< Certificate_Extension >, bool > > Botan::Extensions::extensions ( ) const

Returns a copy of the list of extensions together with the corresponding criticality flag. All extensions are encoded as some object, falling back to Unknown_Extension class which simply allows reading the bytes as well as the criticality flag.

Definition at line 248 of file x509_ext.cpp.

248 {
249 std::vector<std::pair<std::unique_ptr<Certificate_Extension>, bool>> exts;
250 exts.reserve(m_extension_info.size());
251 for(auto&& ext : m_extension_info) {
252 exts.push_back(std::make_pair(ext.second.obj().copy(), ext.second.is_critical()));
253 }
254 return exts;
255}

Referenced by Botan::PKIX::check_chain(), and Botan::X509_CA::choose_extensions().

◆ extensions_raw()

std::map< OID, std::pair< std::vector< uint8_t >, bool > > Botan::Extensions::extensions_raw ( ) const

Returns the list of extensions as raw, encoded bytes together with the corresponding criticality flag. Contains all extensions, including any extensions encoded as Unknown_Extension

Definition at line 257 of file x509_ext.cpp.

257 {
258 std::map<OID, std::pair<std::vector<uint8_t>, bool>> out;
259 for(auto&& ext : m_extension_info) {
260 out.emplace(ext.first, std::make_pair(ext.second.bits(), ext.second.is_critical()));
261 }
262 return out;
263}

◆ get()

std::unique_ptr< Certificate_Extension > Botan::Extensions::get ( const OID & oid) const

Searches for an extension by OID and returns the result. Only the known extensions types declared in this header are searched for by this function.

Returns
Copy of extension with oid, nullptr if not found. Can avoid creating a copy by using get_extension_object function

Definition at line 241 of file x509_ext.cpp.

241 {
242 if(const Certificate_Extension* ext = this->get_extension_object(oid)) {
243 return ext->copy();
244 }
245 return nullptr;
246}
const Certificate_Extension * get_extension_object(const OID &oid) const
Definition x509_ext.cpp:232

References get_extension_object().

◆ get_extension_bits()

std::vector< uint8_t > Botan::Extensions::get_extension_bits ( const OID & oid) const

Return the raw bytes of the extension Will throw if OID was not set as an extension.

Definition at line 223 of file x509_ext.cpp.

223 {
224 auto i = m_extension_info.find(oid);
225 if(i == m_extension_info.end()) {
226 throw Invalid_Argument("Extensions::get_extension_bits no such extension set");
227 }
228
229 return i->second.bits();
230}

◆ get_extension_object()

const Certificate_Extension * Botan::Extensions::get_extension_object ( const OID & oid) const

Look up an object in the extensions, based on OID Returns nullptr if not set, if the extension was either absent or not handled. The pointer returned is owned by the Extensions object. This would be better with an optional<T> return value

Definition at line 232 of file x509_ext.cpp.

232 {
233 auto extn = m_extension_info.find(oid);
234 if(extn == m_extension_info.end()) {
235 return nullptr;
236 }
237
238 return &extn->second.obj();
239}

Referenced by get(), and get_extension_object_as().

◆ get_extension_object_as()

template<typename T>
const T * Botan::Extensions::get_extension_object_as ( const OID & oid = T::static_oid()) const
inline

Definition at line 551 of file pkix_types.h.

551 {
552 if(const Certificate_Extension* extn = get_extension_object(oid)) {
553 // Unknown_Extension oid_name is empty
554 if(extn->oid_name().empty()) {
555 return nullptr;
556 } else if(const T* extn_as_T = dynamic_cast<const T*>(extn)) {
557 return extn_as_T;
558 } else {
559 throw Decoding_Error("Exception::get_extension_object_as dynamic_cast failed");
560 }
561 }
562
563 return nullptr;
564 }

References get_extension_object().

Referenced by Botan::X509_CRL::has_matching_distribution_point().

◆ get_extension_oids()

const std::vector< OID > & Botan::Extensions::get_extension_oids ( ) const
inline

Return the set of extensions in the order they appeared in the certificate (or as they were added, if constructed)

Definition at line 570 of file pkix_types.h.

570{ return m_extension_oids; }

Referenced by Botan::PKIX::check_chain().

◆ get_raw()

template<typename T>
std::unique_ptr< T > Botan::Extensions::get_raw ( const OID & oid) const
inline

Searches for an extension by OID and returns the result decoding it to some arbitrary extension type chosen by the application.

Only the unknown extensions, that is, extensions types that are not declared in this header, are searched for by this function.

Returns
Pointer to new extension with oid, nullptr if not found.

Definition at line 648 of file pkix_types.h.

648 {
649 auto extn_info = m_extension_info.find(oid);
650
651 if(extn_info != m_extension_info.end()) {
652 // Unknown_Extension oid_name is empty
653 if(extn_info->second.obj().oid_name().empty()) {
654 auto ext = std::make_unique<T>();
655 ext->decode_inner(extn_info->second.bits());
656 return ext;
657 }
658 }
659 return nullptr;
660 }

◆ operator=() [1/2]

Extensions & Botan::Extensions::operator= ( const Extensions & )
default

References Extensions().

◆ operator=() [2/2]

Extensions & Botan::Extensions::operator= ( Extensions && )
default

References Extensions().

◆ remove()

bool Botan::Extensions::remove ( const OID & oid)

Remove an extension from the list. Returns true if the extension had been set, false otherwise.

Definition at line 191 of file x509_ext.cpp.

191 {
192 const bool erased = m_extension_info.erase(oid) > 0;
193
194 if(erased) {
195 m_extension_oids.erase(std::find(m_extension_oids.begin(), m_extension_oids.end(), oid));
196 }
197
198 return erased;
199}

Referenced by replace().

◆ replace()

void Botan::Extensions::replace ( std::unique_ptr< Certificate_Extension > extn,
bool critical = false )

Adds an extension to the list or replaces it.

Parameters
extnthe certificate extension
criticalwhether this extension should be marked as critical

Definition at line 201 of file x509_ext.cpp.

201 {
202 // Remove it if it existed
203 remove(extn->oid_of());
204
205 const OID oid = extn->oid_of();
206 Extensions_Info info(critical, std::move(extn));
207 m_extension_oids.push_back(oid);
208 m_extension_info.emplace(oid, info);
209}
bool remove(const OID &oid)
Definition x509_ext.cpp:191

References remove().

Referenced by Botan::X509::create_cert_req(), and Botan::X509::create_self_signed_cert().


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