Botan 3.13.0
Crypto and TLS for C&
x509_ext.h
Go to the documentation of this file.
1/*
2* X.509 Certificate Extensions
3* (C) 1999-2007,2012 Jack Lloyd
4* (C) 2024 Anton Einax, Dominik Schricker
5*
6* Botan is released under the Simplified BSD License (see license.txt)
7*/
8
9#ifndef BOTAN_X509_EXTENSIONS_H_
10#define BOTAN_X509_EXTENSIONS_H_
11
12#include <botan/bigint.h>
13#include <botan/pkix_types.h>
14
15#include <array>
16#include <memory>
17#include <optional>
18#include <set>
19#include <string>
20#include <string_view>
21#include <variant>
22#include <vector>
23
24namespace Botan {
25
27
28namespace Cert_Extension {
29
30static const size_t NO_CERT_PATH_LIMIT = 0xFFFFFFF0;
31
32/**
33* Basic Constraints Extension
34*/
36 public:
37 std::unique_ptr<Certificate_Extension> copy() const override {
38 return std::make_unique<Basic_Constraints>(m_is_ca, m_path_length_constraint);
39 }
40
41 BOTAN_FUTURE_EXPLICIT Basic_Constraints(bool is_ca = false, size_t path_length_constraint = 0);
42
43 Basic_Constraints(bool is_ca, std::optional<size_t> path_length_constraint);
44
45 BOTAN_DEPRECATED("Use is_ca") bool get_is_ca() const { return m_is_ca; }
46
47 /**
48 * Note that this function returns NO_CERT_PATH_LIMIT if the value was not set
49 * in the extension.
50 */
51 BOTAN_DEPRECATED("Use path_length_constraint") size_t get_path_limit() const;
52
53 bool is_ca() const { return m_is_ca; }
54
55 std::optional<size_t> path_length_constraint() const { return m_path_length_constraint; }
56
57 static OID static_oid() { return OID({2, 5, 29, 19}); }
58
59 OID oid_of() const override { return static_oid(); }
60
61 private:
62 std::string oid_name() const override { return "X509v3.BasicConstraints"; }
63
64 bool is_appropriate_context(Extension_Context context) const override;
65
66 std::vector<uint8_t> encode_inner() const override;
67 void decode_inner(const std::vector<uint8_t>& in) override;
68
69 bool m_is_ca;
70 std::optional<size_t> m_path_length_constraint;
71};
72
73/**
74* Key Usage Constraints Extension
75*/
77 public:
78 std::unique_ptr<Certificate_Extension> copy() const override {
79 return std::make_unique<Key_Usage>(m_constraints);
80 }
81
82 explicit Key_Usage(Key_Constraints c) : m_constraints(c) {}
83
84 explicit Key_Usage() : m_constraints(Key_Constraints::None) {}
85
86 Key_Constraints get_constraints() const { return m_constraints; }
87
88 static OID static_oid() { return OID({2, 5, 29, 15}); }
89
90 OID oid_of() const override { return static_oid(); }
91
92 private:
93 std::string oid_name() const override { return "X509v3.KeyUsage"; }
94
95 bool is_appropriate_context(Extension_Context context) const override;
96
97 bool should_encode() const override { return !m_constraints.empty(); }
98
99 std::vector<uint8_t> encode_inner() const override;
100 void decode_inner(const std::vector<uint8_t>& in) override;
101
102 Key_Constraints m_constraints;
103};
104
105/**
106* Subject Key Identifier Extension
107*/
109 public:
110 Subject_Key_ID() = default;
111
112 explicit Subject_Key_ID(const std::vector<uint8_t>& k) : m_key_id(k) {}
113
114 /**
115 * Derive the key identifier from the public key, using the first
116 * method given in RFC 5280 4.2.1.2:
117 *
118 * (1) The keyIdentifier is composed of the 160-bit SHA-1 hash of
119 * the value of the BIT STRING subjectPublicKey (excluding the tag,
120 * length, and number of unused bits).
121 */
122 explicit Subject_Key_ID(const Public_Key& pub_key);
123
124 BOTAN_DEPRECATED("Use Subject_Key_ID(const Public_Key&)")
125 Subject_Key_ID(const std::vector<uint8_t>& public_key, std::string_view hash_fn);
126
127 std::unique_ptr<Certificate_Extension> copy() const override {
128 return std::make_unique<Subject_Key_ID>(m_key_id);
129 }
130
131 const std::vector<uint8_t>& get_key_id() const { return m_key_id; }
132
133 static OID static_oid() { return OID({2, 5, 29, 14}); }
134
135 OID oid_of() const override { return static_oid(); }
136
137 private:
138 std::string oid_name() const override { return "X509v3.SubjectKeyIdentifier"; }
139
140 bool is_appropriate_context(Extension_Context context) const override;
141
142 bool should_encode() const override { return (!m_key_id.empty()); }
143
144 std::vector<uint8_t> encode_inner() const override;
145 void decode_inner(const std::vector<uint8_t>& in) override;
146
147 std::vector<uint8_t> m_key_id;
148};
149
150/**
151* Authority Key Identifier Extension
152*/
154 public:
155 std::unique_ptr<Certificate_Extension> copy() const override { return std::make_unique<Authority_Key_ID>(*this); }
156
157 Authority_Key_ID() = default;
158
159 explicit Authority_Key_ID(const std::vector<uint8_t>& k) : m_key_id(k) {}
160
161 /**
162 * The authorityCertIssuer and authorityCertSerialNumber fields, which
163 * identify the certificate holding the authority's signing key.
164 */
169
170 Authority_Key_ID(const std::vector<uint8_t>& k, Authority_Cert_Identifier authority_cert) :
171 m_key_id(k), m_authority_cert(std::move(authority_cert)) {}
172
173 const std::vector<uint8_t>& get_key_id() const { return m_key_id; }
174
175 /**
176 * The authorityCertIssuer/authorityCertSerialNumber fields, if present
177 */
178 const std::optional<Authority_Cert_Identifier>& authority_cert_identifier() const { return m_authority_cert; }
179
180 static OID static_oid() { return OID({2, 5, 29, 35}); }
181
182 OID oid_of() const override { return static_oid(); }
183
184 private:
185 std::string oid_name() const override { return "X509v3.AuthorityKeyIdentifier"; }
186
187 bool is_appropriate_context(Extension_Context context) const override;
188
189 bool should_encode() const override { return !m_key_id.empty() || m_authority_cert.has_value(); }
190
191 std::vector<uint8_t> encode_inner() const override;
192 void decode_inner(const std::vector<uint8_t>& in) override;
193
194 std::vector<uint8_t> m_key_id;
195 std::optional<Authority_Cert_Identifier> m_authority_cert;
196};
197
198/**
199* Subject Alternative Name Extension
200*/
202 public:
203 const AlternativeName& get_alt_name() const { return m_alt_name; }
204
205 static OID static_oid() { return OID({2, 5, 29, 17}); }
206
207 OID oid_of() const override { return static_oid(); }
208
209 std::unique_ptr<Certificate_Extension> copy() const override {
210 return std::make_unique<Subject_Alternative_Name>(get_alt_name());
211 }
212
213 explicit Subject_Alternative_Name(const AlternativeName& name = AlternativeName()) : m_alt_name(name) {}
214
215 private:
216 std::string oid_name() const override { return "X509v3.SubjectAlternativeName"; }
217
218 bool is_appropriate_context(Extension_Context context) const override;
219
220 bool should_encode() const override { return m_alt_name.has_items(); }
221
222 std::vector<uint8_t> encode_inner() const override;
223 void decode_inner(const std::vector<uint8_t>& in) override;
224
225 AlternativeName m_alt_name;
226};
227
228/**
229* Issuer Alternative Name Extension
230*/
232 public:
233 const AlternativeName& get_alt_name() const { return m_alt_name; }
234
235 static OID static_oid() { return OID({2, 5, 29, 18}); }
236
237 OID oid_of() const override { return static_oid(); }
238
239 std::unique_ptr<Certificate_Extension> copy() const override {
240 return std::make_unique<Issuer_Alternative_Name>(get_alt_name());
241 }
242
243 explicit Issuer_Alternative_Name(const AlternativeName& name = AlternativeName()) : m_alt_name(name) {}
244
245 private:
246 std::string oid_name() const override { return "X509v3.IssuerAlternativeName"; }
247
248 bool is_appropriate_context(Extension_Context context) const override;
249
250 bool should_encode() const override { return m_alt_name.has_items(); }
251
252 std::vector<uint8_t> encode_inner() const override;
253 void decode_inner(const std::vector<uint8_t>& in) override;
254
255 AlternativeName m_alt_name;
256};
257
258/**
259* Extended Key Usage Extension
260*/
262 public:
263 std::unique_ptr<Certificate_Extension> copy() const override {
264 return std::make_unique<Extended_Key_Usage>(m_oids);
265 }
266
268
269 explicit Extended_Key_Usage(const std::vector<OID>& o) : m_oids(o) {}
270
271 const std::vector<OID>& object_identifiers() const { return m_oids; }
272
273 static OID static_oid() { return OID({2, 5, 29, 37}); }
274
275 OID oid_of() const override { return static_oid(); }
276
277 private:
278 std::string oid_name() const override { return "X509v3.ExtendedKeyUsage"; }
279
280 bool is_appropriate_context(Extension_Context context) const override;
281
282 bool should_encode() const override { return (!m_oids.empty()); }
283
284 std::vector<uint8_t> encode_inner() const override;
285 void decode_inner(const std::vector<uint8_t>& in) override;
286
287 std::vector<OID> m_oids;
288};
289
290/**
291* Name Constraints
292*/
294 public:
295 std::unique_ptr<Certificate_Extension> copy() const override {
296 return std::make_unique<Name_Constraints>(m_name_constraints);
297 }
298
299 Name_Constraints() = default;
300
301 BOTAN_FUTURE_EXPLICIT Name_Constraints(const NameConstraints& nc) : m_name_constraints(nc) {}
302
303 void validate(const X509_Certificate& subject,
304 const std::optional<X509_Certificate>& issuer,
305 const std::vector<X509_Certificate>& cert_path,
306 std::vector<std::set<Certificate_Status_Code>>& cert_status,
307 size_t pos) const override;
308
309 const NameConstraints& get_name_constraints() const { return m_name_constraints; }
310
311 static OID static_oid() { return OID({2, 5, 29, 30}); }
312
313 OID oid_of() const override { return static_oid(); }
314
315 private:
316 std::string oid_name() const override { return "X509v3.NameConstraints"; }
317
318 bool is_appropriate_context(Extension_Context context) const override;
319
320 bool should_encode() const override { return true; }
321
322 std::vector<uint8_t> encode_inner() const override;
323 void decode_inner(const std::vector<uint8_t>& in) override;
324
325 NameConstraints m_name_constraints;
326};
327
328/**
329* Certificate Policies Extension
330*/
332 public:
333 std::unique_ptr<Certificate_Extension> copy() const override {
334 return std::make_unique<Certificate_Policies>(*this);
335 }
336
338
339 explicit Certificate_Policies(const std::vector<OID>& oids);
340
341 const std::vector<OID>& get_policy_oids() const { return m_oids; }
342
343 static OID static_oid() { return OID({2, 5, 29, 32}); }
344
345 OID oid_of() const override { return static_oid(); }
346
347 void validate(const X509_Certificate& subject,
348 const std::optional<X509_Certificate>& issuer,
349 const std::vector<X509_Certificate>& cert_path,
350 std::vector<std::set<Certificate_Status_Code>>& cert_status,
351 size_t pos) const override;
352
353 private:
354 std::string oid_name() const override { return "X509v3.CertificatePolicies"; }
355
356 bool is_appropriate_context(Extension_Context context) const override;
357
358 bool should_encode() const override { return (!m_oids.empty()); }
359
360 std::vector<uint8_t> encode_inner() const override;
361 void decode_inner(const std::vector<uint8_t>& in) override;
362
363 std::vector<OID> m_oids;
364 bool m_has_duplicate = false;
365};
366
367/**
368* Authority Information Access Extension
369*/
371 public:
372 /**
373 * An AccessDescription preserving accessMethod plus a raw view of the
374 * accessLocation GeneralName.
375 *
376 * AccessDescription ::= SEQUENCE {
377 * accessMethod OBJECT IDENTIFIER,
378 * accessLocation GeneralName }
379 */
381 public:
385 std::vector<uint8_t> location_value) :
386 m_method(std::move(method)),
387 m_location_tag(location_tag),
388 m_location_class(location_class),
389 m_location_value(std::move(location_value)) {}
390
391 const OID& access_method() const { return m_method; }
392
393 /**
394 * The GeneralName CHOICE tag (the [n] of the access location).
395 */
396 ASN1_Type location_tag() const { return m_location_tag; }
397
398 ASN1_Class location_class() const { return m_location_class; }
399
400 /**
401 * The raw value bytes of the accessLocation, without the leading
402 * tag/length. For a URI accessLocation this is the IA5String value;
403 * for directoryName it is the DER of the Name.
404 */
405 const std::vector<uint8_t>& location_value() const { return m_location_value; }
406
407 /**
408 * If location is a URI (tag 6 IMPLICIT IA5String), return the string;
409 * nullopt otherwise.
410 */
411 std::optional<std::string> location_as_uri_string() const;
412
413 private:
414 OID m_method;
415 ASN1_Type m_location_tag;
416 ASN1_Class m_location_class;
417 std::vector<uint8_t> m_location_value;
418 };
419
420 std::unique_ptr<Certificate_Extension> copy() const override;
421
423
424 BOTAN_DEPRECATED("Use constructor with list of OCSP responder URIs")
425 explicit Authority_Information_Access(std::string_view ocsp,
426 const std::vector<std::string>& ca_issuers = std::vector<std::string>());
427
428 BOTAN_DEPRECATED("Use constructor that accepts URI types")
429 explicit Authority_Information_Access(const std::vector<std::string>& ocsp_responders,
430 const std::vector<std::string>& ca_issuers = std::vector<std::string>());
431
433 std::vector<URI> ca_issuers = std::vector<URI>());
434
435 /**
436 * Construct an AIA from raw AccessDescriptions, allowing the caller to
437 * emit access methods beyond id-ad-ocsp / id-ad-caIssuers and access
438 * locations beyond URIs. The typed URI accessors (ocsp_responder_uris,
439 * ca_issuer_uris) are also populated from any URI-form entries whose
440 * accessMethod is id-ad-ocsp or id-ad-caIssuers so the two views stay
441 * consistent.
442 */
444
445 /**
446 * Append a single AccessDescription. URI-form id-ad-ocsp / id-ad-caIssuers
447 * entries also populate the corresponding typed URI accessor list.
448 */
450
451 BOTAN_DEPRECATED("Use ocsp_responder_uris") std::string ocsp_responder() const {
452 if(m_ocsp_responders.empty()) {
453 return {};
454 }
455 return m_ocsp_responders[0].original_input();
456 }
457
458 BOTAN_DEPRECATED("Use ocsp_responder_uris") std::vector<std::string> ocsp_responders() const;
459
460 const std::vector<URI>& ocsp_responder_uris() const { return m_ocsp_responders; }
461
462 /**
463 * The full set of AccessDescriptions, including access methods that are
464 * not id-ad-ocsp or id-ad-caIssuers and access locations that are not URIs
465 */
466 const std::vector<AccessDescription>& access_descriptions() const { return m_access_descriptions; }
467
468 static OID static_oid() { return OID({1, 3, 6, 1, 5, 5, 7, 1, 1}); }
469
470 OID oid_of() const override { return static_oid(); }
471
472 BOTAN_DEPRECATED("Use ca_issuer_uris") std::vector<std::string> ca_issuers() const;
473
474 const std::vector<URI>& ca_issuer_uris() const { return m_ca_issuers; }
475
476 private:
477 std::string oid_name() const override { return "PKIX.AuthorityInformationAccess"; }
478
479 bool is_appropriate_context(Extension_Context context) const override;
480
481 bool should_encode() const override {
482 // The URI lists are views into the general AccessDescription list
483 return !m_access_descriptions.empty();
484 }
485
486 std::vector<uint8_t> encode_inner() const override;
487 void decode_inner(const std::vector<uint8_t>& in) override;
488
489 std::vector<URI> m_ocsp_responders;
490 std::vector<URI> m_ca_issuers;
491 std::vector<AccessDescription> m_access_descriptions;
492};
493
494/**
495* CRL Number Extension
496*/
498 public:
499 std::unique_ptr<Certificate_Extension> copy() const override;
500
501 CRL_Number() : m_has_value(false), m_crl_number(BigInt::zero()) {}
502
504
505 explicit CRL_Number(BigInt n);
506
507 const BigInt& crl_number() const;
508
509 BOTAN_DEPRECATED("Use crl_number") size_t get_crl_number() const;
510
511 static OID static_oid() { return OID({2, 5, 29, 20}); }
512
513 OID oid_of() const override { return static_oid(); }
514
515 private:
516 std::string oid_name() const override { return "X509v3.CRLNumber"; }
517
518 bool is_appropriate_context(Extension_Context context) const override;
519
520 bool should_encode() const override { return m_has_value; }
521
522 std::vector<uint8_t> encode_inner() const override;
523 void decode_inner(const std::vector<uint8_t>& in) override;
524
525 bool m_has_value;
526 BigInt m_crl_number;
527};
528
529/**
530* CRL Entry Reason Code Extension
531*/
533 public:
534 std::unique_ptr<Certificate_Extension> copy() const override {
535 return std::make_unique<CRL_ReasonCode>(m_reason);
536 }
537
538 explicit CRL_ReasonCode(CRL_Code r = CRL_Code::Unspecified) : m_reason(r) {}
539
540 CRL_Code get_reason() const { return m_reason; }
541
542 static OID static_oid() { return OID({2, 5, 29, 21}); }
543
544 OID oid_of() const override { return static_oid(); }
545
546 private:
547 std::string oid_name() const override { return "X509v3.ReasonCode"; }
548
549 bool is_appropriate_context(Extension_Context context) const override;
550
551 bool should_encode() const override { return (m_reason != CRL_Code::Unspecified); }
552
553 std::vector<uint8_t> encode_inner() const override;
554 void decode_inner(const std::vector<uint8_t>& in) override;
555
556 CRL_Code m_reason;
557};
558
559/**
560* DistributionPointName used by CRLDistributionPoints and
561* IssuingDistributionPoint (RFC 5280 4.2.1.13 / 5.2.5).
562*
563* DistributionPointName ::= CHOICE {
564* fullName [0] GeneralNames,
565* nameRelativeToCRLIssuer [1] RelativeDistinguishedName }
566*
567* Currently only the fullName CHOICE arm is supported; nameRelativeToCRLIssuer
568* is rejected at decode time.
569*/
571 public:
573
574 explicit DistributionPointName(AlternativeName full_name) : m_full_name(std::move(full_name)) {}
575
576 void encode_into(DER_Encoder& to) const override;
577 void decode_from(BER_Decoder& from) override;
578
579 /**
580 * The fullName GeneralNames
581 *
582 * In the current implementation this will always be set, it returns an
583 * optional to help any future addition of nameRelativeToCRLIssuer, in
584 * which case full_name would return nullopt and another getter would
585 * return the relative name.
586 */
587 const std::optional<AlternativeName>& full_name() const { return m_full_name; }
588
589 private:
590 std::optional<AlternativeName> m_full_name;
591};
592
593/**
594* CRL Distribution Points Extension (RFC 5280 4.2.1.13)
595*/
597 public:
598 /*
599 * DistributionPoint ::= SEQUENCE {
600 * distributionPoint [0] DistributionPointName OPTIONAL,
601 * reasons [1] ReasonFlags OPTIONAL,
602 * cRLIssuer [2] GeneralNames OPTIONAL }
603 */
605 public:
606 void encode_into(DER_Encoder& to) const override;
607 void decode_from(BER_Decoder& from) override;
608
610
611 explicit Distribution_Point(const AlternativeName& name) : m_dp_name(DistributionPointName(name)) {}
612
613 Distribution_Point(std::optional<DistributionPointName> dp_name,
614 std::optional<ReasonFlags> reasons,
615 std::optional<AlternativeName> crl_issuer) :
616 m_dp_name(std::move(dp_name)), m_reasons(reasons), m_crl_issuer(std::move(crl_issuer)) {}
617
618 /**
619 * Return the optional distribution point name
620 */
621 const std::optional<DistributionPointName>& distribution_point_name() const { return m_dp_name; }
622
623 /**
624 * Return the optional reason flags
625 */
626 const std::optional<ReasonFlags>& reasons() const { return m_reasons; }
627
628 /**
629 * Return the optional CRL issuer name
630 */
631 const std::optional<AlternativeName>& crl_issuer() const { return m_crl_issuer; }
632
633 /**
634 * Deprecated compatibility shim. Raises Invalid_State if the distributionPoint
635 * field is absent or the name is a relative name.
636 *
637 * Prefer distribution_point_name(), which surfaces both the OPTIONAL field and
638 * the CHOICE arm explicitly.
639 */
640 BOTAN_DEPRECATED("Use distribution_point_name()") const AlternativeName& point() const;
641
642 private:
643 std::optional<DistributionPointName> m_dp_name;
644 std::optional<ReasonFlags> m_reasons;
645 std::optional<AlternativeName> m_crl_issuer;
646 };
647
648 std::unique_ptr<Certificate_Extension> copy() const override {
649 return std::make_unique<CRL_Distribution_Points>(*this);
650 }
651
653
654 explicit CRL_Distribution_Points(const std::vector<Distribution_Point>& points);
655
656 const std::vector<Distribution_Point>& distribution_points() const { return m_distribution_points; }
657
658 BOTAN_DEPRECATED("Use crl_distribution_point_uris") std::vector<std::string> crl_distribution_urls() const;
659
660 const std::vector<URI>& crl_distribution_point_uris() const { return m_crl_distribution_urls; }
661
662 static OID static_oid() { return OID({2, 5, 29, 31}); }
663
664 OID oid_of() const override { return static_oid(); }
665
666 private:
667 std::string oid_name() const override { return "X509v3.CRLDistributionPoints"; }
668
669 bool is_appropriate_context(Extension_Context context) const override;
670
671 bool should_encode() const override { return !m_distribution_points.empty(); }
672
673 std::vector<uint8_t> encode_inner() const override;
674 void decode_inner(const std::vector<uint8_t>& in) override;
675
676 std::vector<Distribution_Point> m_distribution_points;
677 std::vector<URI> m_crl_distribution_urls;
678};
679
680/**
681* CRL Issuing Distribution Point Extension (RFC 5280 5.2.5)
682*
683* IssuingDistributionPoint ::= SEQUENCE {
684* distributionPoint [0] DistributionPointName OPTIONAL,
685* onlyContainsUserCerts [1] BOOLEAN DEFAULT FALSE,
686* onlyContainsCACerts [2] BOOLEAN DEFAULT FALSE,
687* onlySomeReasons [3] ReasonFlags OPTIONAL,
688* indirectCRL [4] BOOLEAN DEFAULT FALSE,
689* onlyContainsAttributeCerts [5] BOOLEAN DEFAULT FALSE }
690*/
692 public:
694
695 explicit CRL_Issuing_Distribution_Point(DistributionPointName dp_name) : m_dp_name(std::move(dp_name)) {}
696
697 CRL_Issuing_Distribution_Point(std::optional<DistributionPointName> dp_name,
700 std::optional<ReasonFlags> only_some_reasons,
701 bool indirect_crl,
703 m_dp_name(std::move(dp_name)),
704 m_only_contains_user_certs(only_contains_user_certs),
705 m_only_contains_ca_certs(only_contains_ca_certs),
706 m_only_some_reasons(only_some_reasons),
707 m_indirect_crl(indirect_crl),
708 m_only_contains_attribute_certs(only_contains_attribute_certs) {}
709
710 /**
711 * Deprecated compatibility shim for the pre-3.13 API. Extracts the
712 * DistributionPointName from a cert-side Distribution_Point.
713 */
714 BOTAN_DEPRECATED("Use the DistributionPointName constructor")
715 explicit CRL_Issuing_Distribution_Point(const CRL_Distribution_Points::Distribution_Point& distribution_point) :
716 m_dp_name(distribution_point.distribution_point_name()) {}
717
718 std::unique_ptr<Certificate_Extension> copy() const override {
719 return std::make_unique<CRL_Issuing_Distribution_Point>(*this);
720 }
721
722 /**
723 * distributionPoint [0] DistributionPointName OPTIONAL.
724 */
725 const std::optional<DistributionPointName>& distribution_point_name() const { return m_dp_name; }
726
727 bool only_contains_user_certs() const { return m_only_contains_user_certs; }
728
729 bool only_contains_ca_certs() const { return m_only_contains_ca_certs; }
730
731 const std::optional<ReasonFlags>& only_some_reasons() const { return m_only_some_reasons; }
732
733 bool indirect_crl() const { return m_indirect_crl; }
734
735 bool only_contains_attribute_certs() const { return m_only_contains_attribute_certs; }
736
737 /**
738 * Deprecated compatibility shim for the pre-3.13 API. Returns the
739 * fullName GeneralNames; raises Invalid_State if the distributionPoint
740 * field is absent or its CHOICE arm is nameRelativeToCRLIssuer.
741 */
742 BOTAN_DEPRECATED("Use distribution_point_name()") const AlternativeName& get_point() const;
743
744 static OID static_oid() { return OID({2, 5, 29, 28}); }
745
746 OID oid_of() const override { return static_oid(); }
747
748 private:
749 std::string oid_name() const override { return "X509v3.CRLIssuingDistributionPoint"; }
750
751 bool is_appropriate_context(Extension_Context context) const override;
752
753 /**
754 * RFC 5280 5.2.5: "Conforming CRL issuers MUST NOT issue CRLs where
755 * the DER encoding of the issuing distribution point extension is
756 * an empty sequence." Suppress emission when no field is set.
757 */
758 bool should_encode() const override {
759 return m_dp_name.has_value() || m_only_contains_user_certs || m_only_contains_ca_certs ||
760 m_only_some_reasons.has_value() || m_indirect_crl || m_only_contains_attribute_certs;
761 }
762
763 std::vector<uint8_t> encode_inner() const override;
764 void decode_inner(const std::vector<uint8_t>& in) override;
765
766 std::optional<DistributionPointName> m_dp_name;
767 bool m_only_contains_user_certs = false;
768 bool m_only_contains_ca_certs = false;
769 std::optional<ReasonFlags> m_only_some_reasons;
770 bool m_indirect_crl = false;
771 bool m_only_contains_attribute_certs = false;
772};
773
774/**
775* OCSP NoCheck Extension
776*
777* RFC6960 4.2.2.2.1
778* A CA may specify that an OCSP client can trust a responder for the
779* lifetime of the responder's certificate. The CA does so by
780* including the extension id-pkix-ocsp-nocheck.
781*
782* In other words: OCSP responder certificates with this extension do not need
783* to be validated against some revocation info.
784*/
786 public:
787 OCSP_NoCheck() = default;
788
789 std::unique_ptr<Certificate_Extension> copy() const override { return std::make_unique<OCSP_NoCheck>(); }
790
791 static OID static_oid() { return OID({1, 3, 6, 1, 5, 5, 7, 48, 1, 5}); }
792
793 OID oid_of() const override { return static_oid(); }
794
795 void validate(const X509_Certificate& subject,
796 const std::optional<X509_Certificate>& issuer,
797 const std::vector<X509_Certificate>& cert_path,
798 std::vector<std::set<Certificate_Status_Code>>& cert_status,
799 size_t pos) const override;
800
801 private:
802 std::string oid_name() const override { return "PKIX.OCSP.NoCheck"; }
803
804 bool is_appropriate_context(Extension_Context context) const override;
805
806 bool should_encode() const override { return true; }
807
808 std::vector<uint8_t> encode_inner() const override;
809
810 void decode_inner(const std::vector<uint8_t>& in) override;
811};
812
813/**
814* No Revocation Available Extension
815*
816* RFC 9608 Section 2
817*
818* The noRevAvail extension, defined in [X.509-2019-TC2], allows a CA to
819* indicate that no revocation information will be made available for
820* this certificate.
821*
822* This extension MUST NOT be present in CA public key certificates.
823*
824* Conforming CAs MUST include this extension in certificates for which
825* no revocation information will be published. When present,
826* conforming CAs MUST mark this extension as non-critical.
827*/
829 public:
831
832 std::unique_ptr<Certificate_Extension> copy() const override { return std::make_unique<NoRevocationAvailable>(); }
833
834 static OID static_oid() { return OID({2, 5, 29, 56}); }
835
836 OID oid_of() const override { return static_oid(); }
837
838 void validate(const X509_Certificate& subject,
839 const std::optional<X509_Certificate>& issuer,
840 const std::vector<X509_Certificate>& cert_path,
841 std::vector<std::set<Certificate_Status_Code>>& cert_status,
842 size_t pos) const override;
843
844 private:
845 std::string oid_name() const override { return "X509v3.NoRevocationAvailable"; }
846
847 bool is_appropriate_context(Extension_Context context) const override;
848
849 bool should_encode() const override { return true; }
850
851 std::vector<uint8_t> encode_inner() const override;
852 void decode_inner(const std::vector<uint8_t>& in) override;
853};
854
855/**
856* TNAuthList extension
857*
858* RFC8226 Secure Telephone Identity Credentials
859* https://www.rfc-editor.org/rfc/rfc8226#section-9
860*/
862 public:
863 class BOTAN_PUBLIC_API(3, 5) Entry final : public ASN1_Object {
864 public:
865 /* TNEntry choice values
866 * see: https://datatracker.ietf.org/doc/html/rfc8226#section-9 */
867 enum Type : uint8_t /* NOLINT(*-use-enum-class) */ {
871 };
872
874 ASN1_String start; //TelephoneNumber (IA5String)
875 size_t count{}; //2..MAX
876 };
877
878 using RangeContainer = std::vector<TelephoneNumberRangeData>;
879 using DataContainer = std::variant<ASN1_String, RangeContainer>;
880
881 void encode_into(DER_Encoder& to) const override;
882 void decode_from(class BER_Decoder& from) override;
883
884 Type type() const { return m_type; }
885
886 const std::string& service_provider_code() const;
887
888 const RangeContainer& telephone_number_range() const;
889
890 const std::string& telephone_number() const;
891
892 private:
893 Type m_type{};
894 DataContainer m_data;
895 };
896
897 TNAuthList() = default;
898
899 std::unique_ptr<Certificate_Extension> copy() const override { return std::make_unique<TNAuthList>(*this); }
900
901 static OID static_oid() { return OID({1, 3, 6, 1, 5, 5, 7, 1, 26}); }
902
903 OID oid_of() const override { return static_oid(); }
904
905 const std::vector<Entry>& entries() const { return m_tn_entries; }
906
907 private:
908 std::string oid_name() const override { return "PKIX.TNAuthList"; }
909
910 bool is_appropriate_context(Extension_Context context) const override;
911
912 bool should_encode() const override { return true; }
913
914 std::vector<uint8_t> encode_inner() const override;
915 void decode_inner(const std::vector<uint8_t>& in) override;
916
917 std::vector<Entry> m_tn_entries;
918};
919
920/**
921 * IP Address Blocks Extension
922 *
923 * RFC 3779 X.509 Extensions for IP Addr
924 *
925*/
927 public:
928 enum class Version : uint8_t {
929 IPv4 = 4,
930 IPv6 = 16,
931 };
932
933 template <Version V>
934 class BOTAN_PUBLIC_API(3, 9) IPAddress final {
935 static constexpr size_t Length = static_cast<size_t>(V);
936
937 public:
938 explicit IPAddress(std::span<const uint8_t> v);
939
940 std::array<uint8_t, Length> value() const { return m_value; }
941
942 private:
943 friend class IPAddressBlocks;
944 IPAddress() = default;
945
946 void next() {
947 for(auto it = m_value.rbegin(); it != m_value.rend(); it++) {
948 // we increment the current octet
949 (*it)++;
950 // if it did not wrap around we are done, else look at the next octet
951 if(*it != 0) {
952 break;
953 }
954 }
955 }
956
957 friend IPAddress<V> operator+(IPAddress<V> lhs, size_t rhs) {
958 // we only really need to be able to compute +1, so this is fine
959 for(size_t i = 0; i < rhs; i++) {
960 lhs.next();
961 }
962 return IPAddress<V>(lhs);
963 }
964
965 friend std::strong_ordering operator<=>(const IPAddress<V> lhs, const IPAddress<V>& rhs) {
966 for(size_t i = 0; i < Length; i++) {
967 if(lhs.value()[i] < rhs.value()[i]) {
968 return std::strong_ordering::less;
969 } else if(lhs.value()[i] > rhs.value()[i]) {
970 return std::strong_ordering::greater;
971 }
972 }
973 return std::strong_ordering::equal;
974 }
975
976 friend bool operator==(const IPAddress<V>& lhs, const IPAddress<V>& rhs) {
977 return lhs.value() == rhs.value();
978 }
979
980 std::array<uint8_t, Length> m_value;
981 };
982
983 template <Version V>
984 class BOTAN_PUBLIC_API(3, 9) IPAddressOrRange final : public ASN1_Object {
985 public:
986 void encode_into(DER_Encoder& to) const override;
987 void decode_from(BER_Decoder& from) override;
988
989 IPAddressOrRange() = default;
990
991 explicit IPAddressOrRange(const IPAddress<V>& addr) : m_min(addr), m_max(addr) {}
992
993 IPAddressOrRange(const IPAddress<V>& min, const IPAddress<V>& max) : m_min(min), m_max(max) {
994 if(max < min) {
995 throw Decoding_Error("IP address ranges must be sorted");
996 }
997 }
998
999 IPAddress<V> min() const { return m_min; }
1000
1001 IPAddress<V> max() const { return m_max; }
1002
1003 private:
1004 IPAddress<V> m_min{};
1005 IPAddress<V> m_max{};
1006
1007 IPAddress<V> decode_single_address(const ASN1_BitString& decoded, bool min);
1008 };
1009
1010 template <Version V>
1011 class BOTAN_PUBLIC_API(3, 9) IPAddressChoice final : public ASN1_Object {
1012 public:
1013 void encode_into(DER_Encoder& to) const override;
1014 void decode_from(BER_Decoder& from) override;
1015
1016 const std::optional<std::vector<IPAddressOrRange<V>>>& ranges() const { return m_ip_addr_ranges; }
1017
1018 IPAddressChoice() = default;
1019
1020 explicit IPAddressChoice(std::optional<std::span<const IPAddressOrRange<V>>> ranges);
1021
1022 private:
1023 std::optional<std::vector<IPAddressOrRange<V>>> m_ip_addr_ranges;
1024 };
1025
1026 class BOTAN_PUBLIC_API(3, 9) IPAddressFamily final : public ASN1_Object {
1027 public:
1028 typedef std::variant<IPAddressChoice<Version::IPv4>, IPAddressChoice<Version::IPv6>> AddrChoice;
1029
1030 void encode_into(DER_Encoder& to) const override;
1031 void decode_from(BER_Decoder& from) override;
1032
1033 IPAddressFamily() = default;
1034
1035 explicit IPAddressFamily(const AddrChoice& choice, std::optional<uint8_t> safi = std::nullopt) :
1036 m_safi(safi), m_ip_addr_choice(choice) {
1037 if(std::holds_alternative<IPAddressChoice<Version::IPv4>>(choice)) {
1038 m_afi = 1;
1039 } else {
1040 m_afi = 2;
1041 }
1042 }
1043
1044 uint16_t afi() const { return m_afi; }
1045
1046 std::optional<uint8_t> safi() const { return m_safi; }
1047
1048 const AddrChoice& addr_choice() const { return m_ip_addr_choice; }
1049
1050 private:
1051 uint16_t m_afi = 1;
1052 std::optional<uint8_t> m_safi;
1053 AddrChoice m_ip_addr_choice;
1054 };
1055
1056 IPAddressBlocks() = default;
1057
1058 explicit IPAddressBlocks(const std::vector<IPAddressFamily>& blocks) : m_ip_addr_blocks(blocks) {
1059 this->sort_and_merge();
1060 }
1061
1062 std::unique_ptr<Certificate_Extension> copy() const override { return std::make_unique<IPAddressBlocks>(*this); }
1063
1064 static OID static_oid() { return OID({1, 3, 6, 1, 5, 5, 7, 1, 7}); }
1065
1066 OID oid_of() const override { return static_oid(); }
1067
1068 void validate(const X509_Certificate& subject,
1069 const std::optional<X509_Certificate>& issuer,
1070 const std::vector<X509_Certificate>& cert_path,
1071 std::vector<std::set<Certificate_Status_Code>>& cert_status,
1072 size_t pos) const override;
1073
1074 /// Add a single IP address to this extension (for the specified SAFI, if any)
1075 template <Version V>
1076 void add_address(const std::array<uint8_t, static_cast<size_t>(V)>& address,
1077 std::optional<uint8_t> safi = std::nullopt) {
1078 add_address<V>(address, address, safi);
1079 }
1080
1081 /// Add an IP address range to this extension (for the specified SAFI, if any)
1082 template <Version V>
1083 void add_address(const std::array<uint8_t, static_cast<std::size_t>(V)>& min,
1084 const std::array<uint8_t, static_cast<std::size_t>(V)>& max,
1085 std::optional<uint8_t> safi = std::nullopt) {
1086 std::vector<IPAddressOrRange<V>> addresses = {IPAddressOrRange<V>(IPAddress<V>(min), IPAddress<V>(max))};
1087 m_ip_addr_blocks.push_back(IPAddressFamily(IPAddressChoice<V>(addresses), safi));
1088 sort_and_merge();
1089 }
1090
1091 /// Make the extension contain no allowed IP addresses for the specified IP version (and SAFI, if any)
1092 template <Version V>
1093 void restrict(std::optional<uint8_t> safi = std::nullopt) {
1094 std::vector<IPAddressOrRange<V>> addresses = {};
1095 m_ip_addr_blocks.push_back(IPAddressFamily(IPAddressChoice<V>(addresses), safi));
1096 sort_and_merge();
1097 }
1098
1099 /// Mark the specified IP version as 'inherit' (for the specified SAFI, if any)
1100 template <Version V>
1101 void inherit(std::optional<uint8_t> safi = std::nullopt) {
1102 m_ip_addr_blocks.push_back(IPAddressFamily(IPAddressChoice<V>(), safi));
1103 sort_and_merge();
1104 }
1105
1106 const std::vector<IPAddressFamily>& addr_blocks() const { return m_ip_addr_blocks; }
1107
1108 /// The number of IPv4 families contained in the extension
1109 size_t v4_count() const { return m_v4_count; }
1110
1111 /// The number of IPv6 families contained in the extension
1112 size_t v6_count() const { return m_v6_count; }
1113
1114 private:
1115 std::string oid_name() const override { return "PKIX.IpAddrBlocks"; }
1116
1117 bool is_appropriate_context(Extension_Context context) const override;
1118
1119 bool should_encode() const override { return true; }
1120
1121 std::vector<uint8_t> encode_inner() const override;
1122 void decode_inner(const std::vector<uint8_t>& in) override;
1123
1124 std::vector<IPAddressFamily> m_ip_addr_blocks;
1125 size_t m_v4_count = 0;
1126 size_t m_v6_count = 0;
1127
1128 void sort_and_merge();
1129 template <Version V>
1130 IPAddressFamily merge(std::vector<IPAddressFamily>& blocks);
1131};
1132
1133/**
1134 * AS Blocks Extension
1135 *
1136 * RFC 3779 X.509 Extensions for AS ID
1137 *
1138*/
1140 public:
1141 typedef uint32_t asnum_t;
1142
1143 class BOTAN_PUBLIC_API(3, 9) ASIdOrRange final : public ASN1_Object {
1144 public:
1145 void encode_into(DER_Encoder& to) const override;
1146 void decode_from(BER_Decoder& from) override;
1147
1148 asnum_t min() const { return m_min; }
1149
1150 asnum_t max() const { return m_max; }
1151
1152 ASIdOrRange() = default;
1153
1154 explicit ASIdOrRange(asnum_t id) : m_min(id), m_max(id) {}
1155
1156 ASIdOrRange(asnum_t min, asnum_t max) : m_min(min), m_max(max) {
1157 if(max < min) {
1158 throw Decoding_Error("AS range numbers must be sorted");
1159 }
1160 }
1161
1162 private:
1163 asnum_t m_min = 0;
1164 asnum_t m_max = 0;
1165 };
1166
1168 public:
1169 void encode_into(DER_Encoder& to) const override;
1170 void decode_from(BER_Decoder& from) override;
1171
1173
1174 explicit ASIdentifierChoice(const std::optional<std::vector<ASIdOrRange>>& ranges);
1175
1176 const std::optional<std::vector<ASIdOrRange>>& ranges() const { return m_as_ranges; }
1177
1178 private:
1179 std::optional<std::vector<ASIdOrRange>> m_as_ranges;
1180 };
1181
1182 class BOTAN_PUBLIC_API(3, 9) ASIdentifiers final : public ASN1_Object {
1183 public:
1184 void encode_into(DER_Encoder& to) const override;
1185 void decode_from(BER_Decoder& from) override;
1186
1187 explicit ASIdentifiers(const std::optional<ASIdentifierChoice>& asnum,
1188 const std::optional<ASIdentifierChoice>& rdi) :
1189 m_asnum(asnum), m_rdi(rdi) {
1190 if(!m_asnum.has_value() && !m_rdi.has_value()) {
1191 throw Decoding_Error("One of asnum, rdi must be present");
1192 }
1193 }
1194
1195 const std::optional<ASIdentifierChoice>& asnum() const { return m_asnum; }
1196
1197 const std::optional<ASIdentifierChoice>& rdi() const { return m_rdi; }
1198
1199 private:
1200 friend class ASBlocks;
1201 ASIdentifiers() = default;
1202
1203 std::optional<ASIdentifierChoice> m_asnum;
1204 std::optional<ASIdentifierChoice> m_rdi;
1205 };
1206
1207 ASBlocks() = default;
1208
1209 explicit ASBlocks(const ASIdentifiers& as_idents) : m_as_identifiers(as_idents) {}
1210
1211 std::unique_ptr<Certificate_Extension> copy() const override { return std::make_unique<ASBlocks>(*this); }
1212
1213 static OID static_oid() { return OID({1, 3, 6, 1, 5, 5, 7, 1, 8}); }
1214
1215 OID oid_of() const override { return static_oid(); }
1216
1217 void validate(const X509_Certificate& subject,
1218 const std::optional<X509_Certificate>& issuer,
1219 const std::vector<X509_Certificate>& cert_path,
1220 std::vector<std::set<Certificate_Status_Code>>& cert_status,
1221 size_t pos) const override;
1222
1223 /// Add a single asnum to this extension
1224 void add_asnum(asnum_t asnum) { add_asnum(asnum, asnum); }
1225
1226 /// Add an asnum range to this extension
1227 void add_asnum(asnum_t min, asnum_t max) {
1228 m_as_identifiers = ASIdentifiers(add_new(m_as_identifiers.asnum(), min, max), m_as_identifiers.rdi());
1229 }
1230
1231 /// Make the extension contain no allowed asnum's
1233 std::vector<ASIdOrRange> empty;
1234 m_as_identifiers = ASIdentifiers(ASIdentifierChoice(empty), m_as_identifiers.rdi());
1235 }
1236
1237 /// Mark the asnum entry as 'inherit'
1238 void inherit_asnum() { m_as_identifiers = ASIdentifiers(ASIdentifierChoice(), m_as_identifiers.rdi()); }
1239
1240 /// Add a single rdi to this extension
1241 void add_rdi(asnum_t rdi) { add_rdi(rdi, rdi); }
1242
1243 /// Add an rdi range to this extension
1244 void add_rdi(asnum_t min, asnum_t max) {
1245 m_as_identifiers = ASIdentifiers(m_as_identifiers.asnum(), add_new(m_as_identifiers.rdi(), min, max));
1246 }
1247
1248 /// Make the extension contain no allowed rdi's
1250 std::vector<ASIdOrRange> empty;
1251 m_as_identifiers = ASIdentifiers(m_as_identifiers.asnum(), ASIdentifierChoice(empty));
1252 }
1253
1254 /// Mark the rdi entry as 'inherit'
1255 void inherit_rdi() { m_as_identifiers = ASIdentifiers(m_as_identifiers.asnum(), ASIdentifierChoice()); }
1256
1257 const ASIdentifiers& as_identifiers() const { return m_as_identifiers; }
1258
1259 private:
1260 ASIdentifiers m_as_identifiers;
1261
1262 std::string oid_name() const override { return "PKIX.AutonomousSysIds"; }
1263
1264 bool is_appropriate_context(Extension_Context context) const override;
1265
1266 bool should_encode() const override { return true; }
1267
1268 static ASIdentifierChoice add_new(const std::optional<ASIdentifierChoice>& old, asnum_t min, asnum_t max);
1269
1270 std::vector<uint8_t> encode_inner() const override;
1271 void decode_inner(const std::vector<uint8_t>& in) override;
1272};
1273
1274/**
1275* An unknown X.509 extension
1276* Will add a failure to the path validation result, if critical
1277*/
1279 public:
1280 Unknown_Extension(const OID& oid, bool critical, bool failed_to_decode = false) :
1281 m_oid(oid), m_critical(critical), m_failed_to_decode(failed_to_decode) {}
1282
1283 std::unique_ptr<Certificate_Extension> copy() const override {
1284 return std::make_unique<Unknown_Extension>(*this);
1285 }
1286
1287 /**
1288 * Return the OID of this unknown extension
1289 */
1290 OID oid_of() const override { return m_oid; }
1291
1292 //static_oid not defined for Unknown_Extension
1293
1294 /**
1295 * Return the extension contents
1296 */
1297 const std::vector<uint8_t>& extension_contents() const { return m_bytes; }
1298
1299 /**
1300 * Return if this extension was marked critical
1301 */
1302 bool is_critical_extension() const { return m_critical; }
1303
1304 /**
1305 * Return true if this extension's OID was recognized but the contents
1306 * failed to decode.
1307 */
1308 bool failed_to_decode() const { return m_failed_to_decode; }
1309
1310 void validate(const X509_Certificate& /*subject*/,
1311 const std::optional<X509_Certificate>& /*issuer*/,
1312 const std::vector<X509_Certificate>& /*cert_path*/,
1313 std::vector<std::set<Certificate_Status_Code>>& cert_status,
1314 size_t pos) const override {
1315 if(m_failed_to_decode) {
1316 cert_status.at(pos).insert(Certificate_Status_Code::EXTENSION_ENCODING_ERROR);
1317 } else if(m_critical) {
1318 cert_status.at(pos).insert(Certificate_Status_Code::UNKNOWN_CRITICAL_EXTENSION);
1319 }
1320 }
1321
1322 private:
1323 std::string oid_name() const override { return ""; }
1324
1325 bool is_appropriate_context(Extension_Context context) const override;
1326
1327 bool should_encode() const override { return true; }
1328
1329 std::vector<uint8_t> encode_inner() const override;
1330 void decode_inner(const std::vector<uint8_t>& in) override;
1331
1332 OID m_oid;
1333 bool m_critical;
1334 bool m_failed_to_decode;
1335 std::vector<uint8_t> m_bytes;
1336};
1337
1338} // namespace Cert_Extension
1339
1340} // namespace Botan
1341
1342#endif
#define BOTAN_PUBLIC_API(maj, min)
Definition api.h:21
#define BOTAN_DEPRECATED(msg)
Definition api.h:73
#define BOTAN_FUTURE_EXPLICIT
Definition api.h:52
ASN1_Object()=default
void encode_into(DER_Encoder &to) const override
ASIdOrRange(asnum_t min, asnum_t max)
Definition x509_ext.h:1156
void decode_from(BER_Decoder &from) override
void encode_into(DER_Encoder &to) const override
void decode_from(BER_Decoder &from) override
const std::optional< std::vector< ASIdOrRange > > & ranges() const
Definition x509_ext.h:1176
const std::optional< ASIdentifierChoice > & asnum() const
Definition x509_ext.h:1195
ASIdentifiers(const std::optional< ASIdentifierChoice > &asnum, const std::optional< ASIdentifierChoice > &rdi)
Definition x509_ext.h:1187
const std::optional< ASIdentifierChoice > & rdi() const
Definition x509_ext.h:1197
void encode_into(DER_Encoder &to) const override
void decode_from(BER_Decoder &from) override
void inherit_asnum()
Mark the asnum entry as 'inherit'.
Definition x509_ext.h:1238
void restrict_rdi()
Make the extension contain no allowed rdi's.
Definition x509_ext.h:1249
void inherit_rdi()
Mark the rdi entry as 'inherit'.
Definition x509_ext.h:1255
void add_rdi(asnum_t min, asnum_t max)
Add an rdi range to this extension.
Definition x509_ext.h:1244
const ASIdentifiers & as_identifiers() const
Definition x509_ext.h:1257
ASBlocks(const ASIdentifiers &as_idents)
Definition x509_ext.h:1209
OID oid_of() const override
Definition x509_ext.h:1215
void restrict_asnum()
Make the extension contain no allowed asnum's.
Definition x509_ext.h:1232
std::unique_ptr< Certificate_Extension > copy() const override
Definition x509_ext.h:1211
void add_asnum(asnum_t asnum)
Add a single asnum to this extension.
Definition x509_ext.h:1224
void add_rdi(asnum_t rdi)
Add a single rdi to this extension.
Definition x509_ext.h:1241
void add_asnum(asnum_t min, asnum_t max)
Add an asnum range to this extension.
Definition x509_ext.h:1227
AccessDescription(OID method, ASN1_Type location_tag, ASN1_Class location_class, std::vector< uint8_t > location_value)
Definition x509_ext.h:382
std::vector< std::string > ca_issuers() const
const std::vector< URI > & ca_issuer_uris() const
Definition x509_ext.h:474
const std::vector< AccessDescription > & access_descriptions() const
Definition x509_ext.h:466
const std::vector< URI > & ocsp_responder_uris() const
Definition x509_ext.h:460
std::vector< std::string > ocsp_responders() const
Authority_Key_ID(const std::vector< uint8_t > &k)
Definition x509_ext.h:159
const std::optional< Authority_Cert_Identifier > & authority_cert_identifier() const
Definition x509_ext.h:178
std::unique_ptr< Certificate_Extension > copy() const override
Definition x509_ext.h:155
const std::vector< uint8_t > & get_key_id() const
Definition x509_ext.h:173
Authority_Key_ID(const std::vector< uint8_t > &k, Authority_Cert_Identifier authority_cert)
Definition x509_ext.h:170
BOTAN_FUTURE_EXPLICIT Basic_Constraints(bool is_ca=false, size_t path_length_constraint=0)
Definition x509_ext.cpp:445
std::unique_ptr< Certificate_Extension > copy() const override
Definition x509_ext.h:37
std::optional< size_t > path_length_constraint() const
Definition x509_ext.h:55
const std::optional< ReasonFlags > & reasons() const
Definition x509_ext.h:626
const std::optional< AlternativeName > & crl_issuer() const
Definition x509_ext.h:631
Distribution_Point(std::optional< DistributionPointName > dp_name, std::optional< ReasonFlags > reasons, std::optional< AlternativeName > crl_issuer)
Definition x509_ext.h:613
const std::optional< DistributionPointName > & distribution_point_name() const
Definition x509_ext.h:621
const std::vector< URI > & crl_distribution_point_uris() const
Definition x509_ext.h:660
std::unique_ptr< Certificate_Extension > copy() const override
Definition x509_ext.h:648
const std::vector< Distribution_Point > & distribution_points() const
Definition x509_ext.h:656
const std::optional< DistributionPointName > & distribution_point_name() const
Definition x509_ext.h:725
const std::optional< ReasonFlags > & only_some_reasons() const
Definition x509_ext.h:731
std::unique_ptr< Certificate_Extension > copy() const override
Definition x509_ext.h:718
CRL_Issuing_Distribution_Point(DistributionPointName dp_name)
Definition x509_ext.h:695
CRL_Issuing_Distribution_Point(std::optional< DistributionPointName > dp_name, bool only_contains_user_certs, bool only_contains_ca_certs, std::optional< ReasonFlags > only_some_reasons, bool indirect_crl, bool only_contains_attribute_certs)
Definition x509_ext.h:697
OID oid_of() const override
Definition x509_ext.h:513
std::unique_ptr< Certificate_Extension > copy() const override
BOTAN_FUTURE_EXPLICIT CRL_Number(size_t n)
Definition x509_ext.h:503
std::unique_ptr< Certificate_Extension > copy() const override
Definition x509_ext.h:534
CRL_ReasonCode(CRL_Code r=CRL_Code::Unspecified)
Definition x509_ext.h:538
const std::vector< OID > & get_policy_oids() const
Definition x509_ext.h:341
std::unique_ptr< Certificate_Extension > copy() const override
Definition x509_ext.h:333
const std::optional< AlternativeName > & full_name() const
Definition x509_ext.h:587
DistributionPointName(AlternativeName full_name)
Definition x509_ext.h:574
const std::vector< OID > & object_identifiers() const
Definition x509_ext.h:271
std::unique_ptr< Certificate_Extension > copy() const override
Definition x509_ext.h:263
Extended_Key_Usage(const std::vector< OID > &o)
Definition x509_ext.h:269
const std::optional< std::vector< IPAddressOrRange< V > > > & ranges() const
Definition x509_ext.h:1016
void encode_into(DER_Encoder &to) const override
IPAddressChoice(std::optional< std::span< const IPAddressOrRange< V > > > ranges)
void encode_into(DER_Encoder &to) const override
std::variant< IPAddressChoice< Version::IPv4 >, IPAddressChoice< Version::IPv6 > > AddrChoice
Definition x509_ext.h:1028
IPAddressFamily(const AddrChoice &choice, std::optional< uint8_t > safi=std::nullopt)
Definition x509_ext.h:1035
void encode_into(DER_Encoder &to) const override
IPAddressOrRange(const IPAddress< V > &min, const IPAddress< V > &max)
Definition x509_ext.h:993
friend bool operator==(const IPAddress< V > &lhs, const IPAddress< V > &rhs)
Definition x509_ext.h:976
friend IPAddress< V > operator+(IPAddress< V > lhs, size_t rhs)
Definition x509_ext.h:957
friend std::strong_ordering operator<=>(const IPAddress< V > lhs, const IPAddress< V > &rhs)
Definition x509_ext.h:965
std::array< uint8_t, Length > value() const
Definition x509_ext.h:940
void inherit(std::optional< uint8_t > safi=std::nullopt)
Mark the specified IP version as 'inherit' (for the specified SAFI, if any).
Definition x509_ext.h:1101
void add_address(const std::array< uint8_t, static_cast< size_t >(V)> &address, std::optional< uint8_t > safi=std::nullopt)
Add a single IP address to this extension (for the specified SAFI, if any).
Definition x509_ext.h:1076
size_t v6_count() const
The number of IPv6 families contained in the extension.
Definition x509_ext.h:1112
std::unique_ptr< Certificate_Extension > copy() const override
Definition x509_ext.h:1062
void restrict(std::optional< uint8_t > safi=std::nullopt)
Make the extension contain no allowed IP addresses for the specified IP version (and SAFI,...
Definition x509_ext.h:1093
void add_address(const std::array< uint8_t, static_cast< std::size_t >(V)> &min, const std::array< uint8_t, static_cast< std::size_t >(V)> &max, std::optional< uint8_t > safi=std::nullopt)
Add an IP address range to this extension (for the specified SAFI, if any).
Definition x509_ext.h:1083
const std::vector< IPAddressFamily > & addr_blocks() const
Definition x509_ext.h:1106
IPAddressBlocks(const std::vector< IPAddressFamily > &blocks)
Definition x509_ext.h:1058
size_t v4_count() const
The number of IPv4 families contained in the extension.
Definition x509_ext.h:1109
std::unique_ptr< Certificate_Extension > copy() const override
Definition x509_ext.h:239
const AlternativeName & get_alt_name() const
Definition x509_ext.h:233
Issuer_Alternative_Name(const AlternativeName &name=AlternativeName())
Definition x509_ext.h:243
std::unique_ptr< Certificate_Extension > copy() const override
Definition x509_ext.h:78
OID oid_of() const override
Definition x509_ext.h:90
Key_Usage(Key_Constraints c)
Definition x509_ext.h:82
Key_Constraints get_constraints() const
Definition x509_ext.h:86
BOTAN_FUTURE_EXPLICIT Name_Constraints(const NameConstraints &nc)
Definition x509_ext.h:301
const NameConstraints & get_name_constraints() const
Definition x509_ext.h:309
std::unique_ptr< Certificate_Extension > copy() const override
Definition x509_ext.h:295
std::unique_ptr< Certificate_Extension > copy() const override
Definition x509_ext.h:832
std::unique_ptr< Certificate_Extension > copy() const override
Definition x509_ext.h:789
OID oid_of() const override
Definition x509_ext.h:793
const AlternativeName & get_alt_name() const
Definition x509_ext.h:203
Subject_Alternative_Name(const AlternativeName &name=AlternativeName())
Definition x509_ext.h:213
std::unique_ptr< Certificate_Extension > copy() const override
Definition x509_ext.h:209
Subject_Key_ID(const std::vector< uint8_t > &k)
Definition x509_ext.h:112
std::unique_ptr< Certificate_Extension > copy() const override
Definition x509_ext.h:127
const std::vector< uint8_t > & get_key_id() const
Definition x509_ext.h:131
std::vector< TelephoneNumberRangeData > RangeContainer
Definition x509_ext.h:878
void decode_from(class BER_Decoder &from) override
void encode_into(DER_Encoder &to) const override
std::variant< ASN1_String, RangeContainer > DataContainer
Definition x509_ext.h:879
std::unique_ptr< Certificate_Extension > copy() const override
Definition x509_ext.h:899
OID oid_of() const override
Definition x509_ext.h:903
const std::vector< Entry > & entries() const
Definition x509_ext.h:905
std::unique_ptr< Certificate_Extension > copy() const override
Definition x509_ext.h:1283
Unknown_Extension(const OID &oid, bool critical, bool failed_to_decode=false)
Definition x509_ext.h:1280
const std::vector< uint8_t > & extension_contents() const
Definition x509_ext.h:1297
void validate(const X509_Certificate &, const std::optional< X509_Certificate > &, const std::vector< X509_Certificate > &, std::vector< std::set< Certificate_Status_Code > > &cert_status, size_t pos) const override
Definition x509_ext.h:1310
Name Constraints.
Definition pkix_types.h:750
ASN1_Class
Definition asn1_obj.h:32
ASN1_Type
Definition asn1_obj.h:47
Extension_Context
Definition pkix_types.h:797