Botan 3.11.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/pkix_types.h>
13
14#include <array>
15#include <memory>
16#include <optional>
17#include <set>
18#include <string>
19#include <string_view>
20#include <vector>
21
22namespace Botan {
23
25
26namespace Cert_Extension {
27
28static const size_t NO_CERT_PATH_LIMIT = 0xFFFFFFF0;
29
30/**
31* Basic Constraints Extension
32*/
34 public:
35 std::unique_ptr<Certificate_Extension> copy() const override {
36 return std::make_unique<Basic_Constraints>(m_is_ca, m_path_length_constraint);
37 }
38
39 BOTAN_FUTURE_EXPLICIT Basic_Constraints(bool is_ca = false, size_t path_length_constraint = 0);
40
41 Basic_Constraints(bool is_ca, std::optional<size_t> path_length_constraint);
42
43 BOTAN_DEPRECATED("Use is_ca") bool get_is_ca() const { return m_is_ca; }
44
45 /**
46 * Note that this function returns NO_CERT_PATH_LIMIT if the value was not set
47 * in the extension.
48 */
49 BOTAN_DEPRECATED("Use path_length_constraint") size_t get_path_limit() const;
50
51 bool is_ca() const { return m_is_ca; }
52
53 std::optional<size_t> path_length_constraint() const { return m_path_length_constraint; }
54
55 static OID static_oid() { return OID({2, 5, 29, 19}); }
56
57 OID oid_of() const override { return static_oid(); }
58
59 private:
60 std::string oid_name() const override { return "X509v3.BasicConstraints"; }
61
62 std::vector<uint8_t> encode_inner() const override;
63 void decode_inner(const std::vector<uint8_t>& in) override;
64
65 bool m_is_ca;
66 std::optional<size_t> m_path_length_constraint;
67};
68
69/**
70* Key Usage Constraints Extension
71*/
73 public:
74 std::unique_ptr<Certificate_Extension> copy() const override {
75 return std::make_unique<Key_Usage>(m_constraints);
76 }
77
78 explicit Key_Usage(Key_Constraints c) : m_constraints(c) {}
79
80 explicit Key_Usage() : m_constraints(Key_Constraints::None) {}
81
82 Key_Constraints get_constraints() const { return m_constraints; }
83
84 static OID static_oid() { return OID({2, 5, 29, 15}); }
85
86 OID oid_of() const override { return static_oid(); }
87
88 private:
89 std::string oid_name() const override { return "X509v3.KeyUsage"; }
90
91 bool should_encode() const override { return !m_constraints.empty(); }
92
93 std::vector<uint8_t> encode_inner() const override;
94 void decode_inner(const std::vector<uint8_t>& in) override;
95
96 Key_Constraints m_constraints;
97};
98
99/**
100* Subject Key Identifier Extension
101*/
103 public:
104 Subject_Key_ID() = default;
105
106 explicit Subject_Key_ID(const std::vector<uint8_t>& k) : m_key_id(k) {}
107
108 Subject_Key_ID(const std::vector<uint8_t>& public_key, std::string_view hash_fn);
109
110 std::unique_ptr<Certificate_Extension> copy() const override {
111 return std::make_unique<Subject_Key_ID>(m_key_id);
112 }
113
114 const std::vector<uint8_t>& get_key_id() const { return m_key_id; }
115
116 static OID static_oid() { return OID({2, 5, 29, 14}); }
117
118 OID oid_of() const override { return static_oid(); }
119
120 private:
121 std::string oid_name() const override { return "X509v3.SubjectKeyIdentifier"; }
122
123 bool should_encode() const override { return (!m_key_id.empty()); }
124
125 std::vector<uint8_t> encode_inner() const override;
126 void decode_inner(const std::vector<uint8_t>& in) override;
127
128 std::vector<uint8_t> m_key_id;
129};
130
131/**
132* Authority Key Identifier Extension
133*/
135 public:
136 std::unique_ptr<Certificate_Extension> copy() const override {
137 return std::make_unique<Authority_Key_ID>(m_key_id);
138 }
139
140 Authority_Key_ID() = default;
141
142 explicit Authority_Key_ID(const std::vector<uint8_t>& k) : m_key_id(k) {}
143
144 const std::vector<uint8_t>& get_key_id() const { return m_key_id; }
145
146 static OID static_oid() { return OID({2, 5, 29, 35}); }
147
148 OID oid_of() const override { return static_oid(); }
149
150 private:
151 std::string oid_name() const override { return "X509v3.AuthorityKeyIdentifier"; }
152
153 bool should_encode() const override { return (!m_key_id.empty()); }
154
155 std::vector<uint8_t> encode_inner() const override;
156 void decode_inner(const std::vector<uint8_t>& in) override;
157
158 std::vector<uint8_t> m_key_id;
159};
160
161/**
162* Subject Alternative Name Extension
163*/
165 public:
166 const AlternativeName& get_alt_name() const { return m_alt_name; }
167
168 static OID static_oid() { return OID({2, 5, 29, 17}); }
169
170 OID oid_of() const override { return static_oid(); }
171
172 std::unique_ptr<Certificate_Extension> copy() const override {
173 return std::make_unique<Subject_Alternative_Name>(get_alt_name());
174 }
175
176 explicit Subject_Alternative_Name(const AlternativeName& name = AlternativeName()) : m_alt_name(name) {}
177
178 private:
179 std::string oid_name() const override { return "X509v3.SubjectAlternativeName"; }
180
181 bool should_encode() const override { return m_alt_name.has_items(); }
182
183 std::vector<uint8_t> encode_inner() const override;
184 void decode_inner(const std::vector<uint8_t>& in) override;
185
186 AlternativeName m_alt_name;
187};
188
189/**
190* Issuer Alternative Name Extension
191*/
193 public:
194 const AlternativeName& get_alt_name() const { return m_alt_name; }
195
196 static OID static_oid() { return OID({2, 5, 29, 18}); }
197
198 OID oid_of() const override { return static_oid(); }
199
200 std::unique_ptr<Certificate_Extension> copy() const override {
201 return std::make_unique<Issuer_Alternative_Name>(get_alt_name());
202 }
203
204 explicit Issuer_Alternative_Name(const AlternativeName& name = AlternativeName()) : m_alt_name(name) {}
205
206 private:
207 std::string oid_name() const override { return "X509v3.IssuerAlternativeName"; }
208
209 bool should_encode() const override { return m_alt_name.has_items(); }
210
211 std::vector<uint8_t> encode_inner() const override;
212 void decode_inner(const std::vector<uint8_t>& in) override;
213
214 AlternativeName m_alt_name;
215};
216
217/**
218* Extended Key Usage Extension
219*/
221 public:
222 std::unique_ptr<Certificate_Extension> copy() const override {
223 return std::make_unique<Extended_Key_Usage>(m_oids);
224 }
225
227
228 explicit Extended_Key_Usage(const std::vector<OID>& o) : m_oids(o) {}
229
230 const std::vector<OID>& object_identifiers() const { return m_oids; }
231
232 static OID static_oid() { return OID({2, 5, 29, 37}); }
233
234 OID oid_of() const override { return static_oid(); }
235
236 private:
237 std::string oid_name() const override { return "X509v3.ExtendedKeyUsage"; }
238
239 bool should_encode() const override { return (!m_oids.empty()); }
240
241 std::vector<uint8_t> encode_inner() const override;
242 void decode_inner(const std::vector<uint8_t>& in) override;
243
244 std::vector<OID> m_oids;
245};
246
247/**
248* Name Constraints
249*/
251 public:
252 std::unique_ptr<Certificate_Extension> copy() const override {
253 return std::make_unique<Name_Constraints>(m_name_constraints);
254 }
255
256 Name_Constraints() = default;
257
258 BOTAN_FUTURE_EXPLICIT Name_Constraints(const NameConstraints& nc) : m_name_constraints(nc) {}
259
260 void validate(const X509_Certificate& subject,
261 const std::optional<X509_Certificate>& issuer,
262 const std::vector<X509_Certificate>& cert_path,
263 std::vector<std::set<Certificate_Status_Code>>& cert_status,
264 size_t pos) override;
265
266 const NameConstraints& get_name_constraints() const { return m_name_constraints; }
267
268 static OID static_oid() { return OID({2, 5, 29, 30}); }
269
270 OID oid_of() const override { return static_oid(); }
271
272 private:
273 std::string oid_name() const override { return "X509v3.NameConstraints"; }
274
275 bool should_encode() const override { return true; }
276
277 std::vector<uint8_t> encode_inner() const override;
278 void decode_inner(const std::vector<uint8_t>& in) override;
279
280 NameConstraints m_name_constraints;
281};
282
283/**
284* Certificate Policies Extension
285*/
287 public:
288 std::unique_ptr<Certificate_Extension> copy() const override {
289 return std::make_unique<Certificate_Policies>(m_oids);
290 }
291
293
294 explicit Certificate_Policies(const std::vector<OID>& o) : m_oids(o) {}
295
296 const std::vector<OID>& get_policy_oids() const { return m_oids; }
297
298 static OID static_oid() { return OID({2, 5, 29, 32}); }
299
300 OID oid_of() const override { return static_oid(); }
301
302 void validate(const X509_Certificate& subject,
303 const std::optional<X509_Certificate>& issuer,
304 const std::vector<X509_Certificate>& cert_path,
305 std::vector<std::set<Certificate_Status_Code>>& cert_status,
306 size_t pos) override;
307
308 private:
309 std::string oid_name() const override { return "X509v3.CertificatePolicies"; }
310
311 bool should_encode() const override { return (!m_oids.empty()); }
312
313 std::vector<uint8_t> encode_inner() const override;
314 void decode_inner(const std::vector<uint8_t>& in) override;
315
316 std::vector<OID> m_oids;
317};
318
319/**
320* Authority Information Access Extension
321*/
323 public:
324 std::unique_ptr<Certificate_Extension> copy() const override {
325 return std::make_unique<Authority_Information_Access>(m_ocsp_responders, m_ca_issuers);
326 }
327
329
330 BOTAN_DEPRECATED("Use constructor with list of OCSP responders")
331 explicit Authority_Information_Access(std::string_view ocsp,
332 const std::vector<std::string>& ca_issuers = std::vector<std::string>()) :
333 m_ocsp_responders{std::string(ocsp)}, m_ca_issuers(ca_issuers) {}
334
335 explicit Authority_Information_Access(std::vector<std::string> ocsp_responders,
336 std::vector<std::string> ca_issuers = std::vector<std::string>()) :
337 m_ocsp_responders(std::move(ocsp_responders)), m_ca_issuers(std::move(ca_issuers)) {}
338
339 BOTAN_DEPRECATED("Use ocsp_responders") std::string ocsp_responder() const {
340 if(m_ocsp_responders.empty()) {
341 return {};
342 }
343 return m_ocsp_responders[0];
344 }
345
346 const std::vector<std::string>& ocsp_responders() const { return m_ocsp_responders; }
347
348 static OID static_oid() { return OID({1, 3, 6, 1, 5, 5, 7, 1, 1}); }
349
350 OID oid_of() const override { return static_oid(); }
351
352 const std::vector<std::string>& ca_issuers() const { return m_ca_issuers; }
353
354 private:
355 std::string oid_name() const override { return "PKIX.AuthorityInformationAccess"; }
356
357 bool should_encode() const override { return (!m_ocsp_responders.empty() || !m_ca_issuers.empty()); }
358
359 std::vector<uint8_t> encode_inner() const override;
360 void decode_inner(const std::vector<uint8_t>& in) override;
361
362 std::vector<std::string> m_ocsp_responders;
363 std::vector<std::string> m_ca_issuers;
364};
365
366/**
367* CRL Number Extension
368*/
370 public:
371 std::unique_ptr<Certificate_Extension> copy() const override;
372
373 CRL_Number() : m_has_value(false), m_crl_number(0) {}
374
375 BOTAN_FUTURE_EXPLICIT CRL_Number(size_t n) : m_has_value(true), m_crl_number(n) {}
376
377 size_t get_crl_number() const;
378
379 static OID static_oid() { return OID({2, 5, 29, 20}); }
380
381 OID oid_of() const override { return static_oid(); }
382
383 private:
384 std::string oid_name() const override { return "X509v3.CRLNumber"; }
385
386 bool should_encode() const override { return m_has_value; }
387
388 std::vector<uint8_t> encode_inner() const override;
389 void decode_inner(const std::vector<uint8_t>& in) override;
390
391 bool m_has_value;
392 size_t m_crl_number;
393};
394
395/**
396* CRL Entry Reason Code Extension
397*/
399 public:
400 std::unique_ptr<Certificate_Extension> copy() const override {
401 return std::make_unique<CRL_ReasonCode>(m_reason);
402 }
403
404 explicit CRL_ReasonCode(CRL_Code r = CRL_Code::Unspecified) : m_reason(r) {}
405
406 CRL_Code get_reason() const { return m_reason; }
407
408 static OID static_oid() { return OID({2, 5, 29, 21}); }
409
410 OID oid_of() const override { return static_oid(); }
411
412 private:
413 std::string oid_name() const override { return "X509v3.ReasonCode"; }
414
415 bool should_encode() const override { return (m_reason != CRL_Code::Unspecified); }
416
417 std::vector<uint8_t> encode_inner() const override;
418 void decode_inner(const std::vector<uint8_t>& in) override;
419
420 CRL_Code m_reason;
421};
422
423/**
424* CRL Distribution Points Extension
425* todo enforce restrictions from RFC 5280 4.2.1.13
426*/
428 public:
430 public:
431 void encode_into(DER_Encoder& to) const override;
432 void decode_from(BER_Decoder& from) override;
433
434 explicit Distribution_Point(const AlternativeName& name = AlternativeName()) : m_point(name) {}
435
436 const AlternativeName& point() const { return m_point; }
437
438 private:
439 AlternativeName m_point;
440 };
441
442 std::unique_ptr<Certificate_Extension> copy() const override {
443 return std::make_unique<CRL_Distribution_Points>(m_distribution_points);
444 }
445
447
448 explicit CRL_Distribution_Points(const std::vector<Distribution_Point>& points) : m_distribution_points(points) {}
449
450 const std::vector<Distribution_Point>& distribution_points() const { return m_distribution_points; }
451
452 const std::vector<std::string>& crl_distribution_urls() const { return m_crl_distribution_urls; }
453
454 static OID static_oid() { return OID({2, 5, 29, 31}); }
455
456 OID oid_of() const override { return static_oid(); }
457
458 private:
459 std::string oid_name() const override { return "X509v3.CRLDistributionPoints"; }
460
461 bool should_encode() const override { return !m_distribution_points.empty(); }
462
463 std::vector<uint8_t> encode_inner() const override;
464 void decode_inner(const std::vector<uint8_t>& in) override;
465
466 std::vector<Distribution_Point> m_distribution_points;
467 std::vector<std::string> m_crl_distribution_urls;
468};
469
470/**
471* CRL Issuing Distribution Point Extension
472* todo enforce restrictions from RFC 5280 5.2.5
473*/
475 public:
477
479 m_distribution_point(distribution_point) {}
480
481 std::unique_ptr<Certificate_Extension> copy() const override {
482 return std::make_unique<CRL_Issuing_Distribution_Point>(m_distribution_point);
483 }
484
485 const AlternativeName& get_point() const { return m_distribution_point.point(); }
486
487 static OID static_oid() { return OID({2, 5, 29, 28}); }
488
489 OID oid_of() const override { return static_oid(); }
490
491 private:
492 std::string oid_name() const override { return "X509v3.CRLIssuingDistributionPoint"; }
493
494 bool should_encode() const override { return true; }
495
496 std::vector<uint8_t> encode_inner() const override;
497 void decode_inner(const std::vector<uint8_t>& in) override;
498
499 CRL_Distribution_Points::Distribution_Point m_distribution_point;
500};
501
502/**
503* OCSP NoCheck Extension
504*
505* RFC6960 4.2.2.2.1
506* A CA may specify that an OCSP client can trust a responder for the
507* lifetime of the responder's certificate. The CA does so by
508* including the extension id-pkix-ocsp-nocheck.
509*
510* In other words: OCSP responder certificates with this extension do not need
511* to be validated against some revocation info.
512*/
514 public:
515 OCSP_NoCheck() = default;
516
517 std::unique_ptr<Certificate_Extension> copy() const override { return std::make_unique<OCSP_NoCheck>(); }
518
519 static OID static_oid() { return OID({1, 3, 6, 1, 5, 5, 7, 48, 1, 5}); }
520
521 OID oid_of() const override { return static_oid(); }
522
523 private:
524 std::string oid_name() const override { return "PKIX.OCSP.NoCheck"; }
525
526 bool should_encode() const override { return true; }
527
528 std::vector<uint8_t> encode_inner() const override { return {}; }
529
530 void decode_inner(const std::vector<uint8_t>& in) override;
531};
532
533/**
534* TNAuthList extension
535*
536* RFC8226 Secure Telephone Identity Credentials
537* https://www.rfc-editor.org/rfc/rfc8226#section-9
538*/
540 public:
541 class BOTAN_PUBLIC_API(3, 5) Entry final : public ASN1_Object {
542 public:
543 /* TNEntry choice values
544 * see: https://datatracker.ietf.org/doc/html/rfc8226#section-9 */
545 enum Type : uint8_t /* NOLINT(*-use-enum-class) */ {
549 };
550
552 ASN1_String start; //TelephoneNumber (IA5String)
553 size_t count{}; //2..MAX
554 };
555
556 using RangeContainer = std::vector<TelephoneNumberRangeData>;
557 using DataContainer = std::variant<ASN1_String, RangeContainer>;
558
559 void encode_into(DER_Encoder& to) const override;
560 void decode_from(class BER_Decoder& from) override;
561
562 Type type() const { return m_type; }
563
564 const std::string& service_provider_code() const;
565
566 const RangeContainer& telephone_number_range() const;
567
568 const std::string& telephone_number() const;
569
570 private:
571 Type m_type{};
572 DataContainer m_data;
573 };
574
575 TNAuthList() = default;
576
577 std::unique_ptr<Certificate_Extension> copy() const override { return std::make_unique<TNAuthList>(*this); }
578
579 static OID static_oid() { return OID({1, 3, 6, 1, 5, 5, 7, 1, 26}); }
580
581 OID oid_of() const override { return static_oid(); }
582
583 const std::vector<Entry>& entries() const { return m_tn_entries; }
584
585 private:
586 std::string oid_name() const override { return "PKIX.TNAuthList"; }
587
588 bool should_encode() const override { return true; }
589
590 std::vector<uint8_t> encode_inner() const override;
591 void decode_inner(const std::vector<uint8_t>& in) override;
592
593 std::vector<Entry> m_tn_entries;
594};
595
596/**
597 * IP Address Blocks Extension
598 *
599 * RFC 3779 X.509 Extensions for IP Addr
600 *
601*/
603 public:
604 enum class Version : uint8_t {
605 IPv4 = 4,
606 IPv6 = 16,
607 };
608
609 template <Version V>
610 class BOTAN_PUBLIC_API(3, 9) IPAddress final {
611 static constexpr size_t Length = static_cast<size_t>(V);
612
613 public:
614 explicit IPAddress(std::span<const uint8_t> v);
615
616 std::array<uint8_t, Length> value() const { return m_value; }
617
618 private:
619 friend class IPAddressBlocks;
620 IPAddress() = default;
621
622 void next() {
623 for(auto it = m_value.rbegin(); it != m_value.rend(); it++) {
624 // we increment the current octet
625 (*it)++;
626 // if it did not wrap around we are done, else look at the next octet
627 if(*it != 0) {
628 break;
629 }
630 }
631 }
632
633 friend IPAddress<V> operator+(IPAddress<V> lhs, size_t rhs) {
634 // we only really need to be able to compute +1, so this is fine
635 for(size_t i = 0; i < rhs; i++) {
636 lhs.next();
637 }
638 return IPAddress<V>(lhs);
639 }
640
641 friend std::strong_ordering operator<=>(const IPAddress<V> lhs, const IPAddress<V>& rhs) {
642 for(size_t i = 0; i < Length; i++) {
643 if(lhs.value()[i] < rhs.value()[i]) {
644 return std::strong_ordering::less;
645 } else if(lhs.value()[i] > rhs.value()[i]) {
646 return std::strong_ordering::greater;
647 }
648 }
649 return std::strong_ordering::equal;
650 }
651
652 friend bool operator==(const IPAddress<V>& lhs, const IPAddress<V>& rhs) {
653 return lhs.value() == rhs.value();
654 }
655
656 std::array<uint8_t, Length> m_value;
657 };
658
659 template <Version V>
660 class BOTAN_PUBLIC_API(3, 9) IPAddressOrRange final : public ASN1_Object {
661 public:
662 void encode_into(DER_Encoder& to) const override;
663 void decode_from(BER_Decoder& from) override;
664
665 IPAddressOrRange() = default;
666
667 explicit IPAddressOrRange(const IPAddress<V>& addr) : m_min(addr), m_max(addr) {}
668
669 IPAddressOrRange(const IPAddress<V>& min, const IPAddress<V>& max) : m_min(min), m_max(max) {
670 if(max < min) {
671 throw Decoding_Error("IP address ranges must be sorted");
672 }
673 }
674
675 IPAddress<V> min() const { return m_min; }
676
677 IPAddress<V> max() const { return m_max; }
678
679 private:
680 IPAddress<V> m_min{};
681 IPAddress<V> m_max{};
682
683 IPAddress<V> decode_single_address(std::vector<uint8_t> decoded, bool min);
684 };
685
686 template <Version V>
687 class BOTAN_PUBLIC_API(3, 9) IPAddressChoice final : public ASN1_Object {
688 public:
689 void encode_into(DER_Encoder& to) const override;
690 void decode_from(BER_Decoder& from) override;
691
692 const std::optional<std::vector<IPAddressOrRange<V>>>& ranges() const { return m_ip_addr_ranges; }
693
694 IPAddressChoice() = default;
695
696 explicit IPAddressChoice(std::optional<std::span<const IPAddressOrRange<V>>> ranges);
697
698 private:
699 std::optional<std::vector<IPAddressOrRange<V>>> m_ip_addr_ranges;
700 };
701
702 class BOTAN_PUBLIC_API(3, 9) IPAddressFamily final : public ASN1_Object {
703 public:
704 typedef std::variant<IPAddressChoice<Version::IPv4>, IPAddressChoice<Version::IPv6>> AddrChoice;
705
706 void encode_into(DER_Encoder& to) const override;
707 void decode_from(BER_Decoder& from) override;
708
709 IPAddressFamily() = default;
710
711 explicit IPAddressFamily(const AddrChoice& choice, std::optional<uint8_t> safi = std::nullopt) :
712 m_safi(safi), m_ip_addr_choice(choice) {
713 if(std::holds_alternative<IPAddressChoice<Version::IPv4>>(choice)) {
714 m_afi = 1;
715 } else {
716 m_afi = 2;
717 }
718 }
719
720 uint16_t afi() const { return m_afi; }
721
722 std::optional<uint8_t> safi() const { return m_safi; }
723
724 const AddrChoice& addr_choice() const { return m_ip_addr_choice; }
725
726 private:
727 uint16_t m_afi = 1;
728 std::optional<uint8_t> m_safi;
729 AddrChoice m_ip_addr_choice;
730 };
731
732 IPAddressBlocks() = default;
733
734 explicit IPAddressBlocks(const std::vector<IPAddressFamily>& blocks) : m_ip_addr_blocks(blocks) {
735 this->sort_and_merge();
736 }
737
738 std::unique_ptr<Certificate_Extension> copy() const override { return std::make_unique<IPAddressBlocks>(*this); }
739
740 static OID static_oid() { return OID({1, 3, 6, 1, 5, 5, 7, 1, 7}); }
741
742 OID oid_of() const override { return static_oid(); }
743
744 void validate(const X509_Certificate& subject,
745 const std::optional<X509_Certificate>& issuer,
746 const std::vector<X509_Certificate>& cert_path,
747 std::vector<std::set<Certificate_Status_Code>>& cert_status,
748 size_t pos) override;
749
750 /// Add a single IP address to this extension (for the specified SAFI, if any)
751 template <Version V>
752 void add_address(const std::array<uint8_t, static_cast<size_t>(V)>& address,
753 std::optional<uint8_t> safi = std::nullopt) {
754 add_address<V>(address, address, safi);
755 }
756
757 /// Add an IP address range to this extension (for the specified SAFI, if any)
758 template <Version V>
759 void add_address(const std::array<uint8_t, static_cast<std::size_t>(V)>& min,
760 const std::array<uint8_t, static_cast<std::size_t>(V)>& max,
761 std::optional<uint8_t> safi = std::nullopt) {
762 std::vector<IPAddressOrRange<V>> addresses = {IPAddressOrRange<V>(IPAddress<V>(min), IPAddress<V>(max))};
763 m_ip_addr_blocks.push_back(IPAddressFamily(IPAddressChoice<V>(addresses), safi));
764 sort_and_merge();
765 }
766
767 /// Make the extension contain no allowed IP addresses for the specified IP version (and SAFI, if any)
768 template <Version V>
769 void restrict(std::optional<uint8_t> safi = std::nullopt) {
770 std::vector<IPAddressOrRange<V>> addresses = {};
771 m_ip_addr_blocks.push_back(IPAddressFamily(IPAddressChoice<V>(addresses), safi));
772 sort_and_merge();
773 }
774
775 /// Mark the specified IP version as 'inherit' (for the specified SAFI, if any)
776 template <Version V>
777 void inherit(std::optional<uint8_t> safi = std::nullopt) {
778 m_ip_addr_blocks.push_back(IPAddressFamily(IPAddressChoice<V>(), safi));
779 sort_and_merge();
780 }
781
782 const std::vector<IPAddressFamily>& addr_blocks() const { return m_ip_addr_blocks; }
783
784 private:
785 std::string oid_name() const override { return "PKIX.IpAddrBlocks"; }
786
787 bool should_encode() const override { return true; }
788
789 std::vector<uint8_t> encode_inner() const override;
790 void decode_inner(const std::vector<uint8_t>& in) override;
791
792 std::vector<IPAddressFamily> m_ip_addr_blocks;
793
794 void sort_and_merge();
795 template <Version V>
796 IPAddressFamily merge(std::vector<IPAddressFamily>& blocks);
797};
798
799/**
800 * AS Blocks Extension
801 *
802 * RFC 3779 X.509 Extensions for AS ID
803 *
804*/
806 public:
807 typedef uint32_t asnum_t;
808
809 class BOTAN_PUBLIC_API(3, 9) ASIdOrRange final : public ASN1_Object {
810 public:
811 void encode_into(DER_Encoder& to) const override;
812 void decode_from(BER_Decoder& from) override;
813
814 asnum_t min() const { return m_min; }
815
816 asnum_t max() const { return m_max; }
817
818 ASIdOrRange() = default;
819
820 explicit ASIdOrRange(asnum_t id) : m_min(id), m_max(id) {}
821
822 ASIdOrRange(asnum_t min, asnum_t max) : m_min(min), m_max(max) {
823 if(max < min) {
824 throw Decoding_Error("AS range numbers must be sorted");
825 }
826 }
827
828 private:
829 asnum_t m_min = 0;
830 asnum_t m_max = 0;
831 };
832
834 public:
835 void encode_into(DER_Encoder& to) const override;
836 void decode_from(BER_Decoder& from) override;
837
839
840 explicit ASIdentifierChoice(const std::optional<std::vector<ASIdOrRange>>& ranges);
841
842 const std::optional<std::vector<ASIdOrRange>>& ranges() const { return m_as_ranges; }
843
844 private:
845 std::optional<std::vector<ASIdOrRange>> m_as_ranges;
846 };
847
848 class BOTAN_PUBLIC_API(3, 9) ASIdentifiers final : public ASN1_Object {
849 public:
850 void encode_into(DER_Encoder& to) const override;
851 void decode_from(BER_Decoder& from) override;
852
853 explicit ASIdentifiers(const std::optional<ASIdentifierChoice>& asnum,
854 const std::optional<ASIdentifierChoice>& rdi) :
855 m_asnum(asnum), m_rdi(rdi) {
856 if(!m_asnum.has_value() && !m_rdi.has_value()) {
857 throw Decoding_Error("One of asnum, rdi must be present");
858 }
859 }
860
861 const std::optional<ASIdentifierChoice>& asnum() const { return m_asnum; }
862
863 const std::optional<ASIdentifierChoice>& rdi() const { return m_rdi; }
864
865 private:
866 friend class ASBlocks;
867 ASIdentifiers() = default;
868
869 std::optional<ASIdentifierChoice> m_asnum;
870 std::optional<ASIdentifierChoice> m_rdi;
871 };
872
873 ASBlocks() = default;
874
875 explicit ASBlocks(const ASIdentifiers& as_idents) : m_as_identifiers(as_idents) {}
876
877 std::unique_ptr<Certificate_Extension> copy() const override { return std::make_unique<ASBlocks>(*this); }
878
879 static OID static_oid() { return OID({1, 3, 6, 1, 5, 5, 7, 1, 8}); }
880
881 OID oid_of() const override { return static_oid(); }
882
883 void validate(const X509_Certificate& subject,
884 const std::optional<X509_Certificate>& issuer,
885 const std::vector<X509_Certificate>& cert_path,
886 std::vector<std::set<Certificate_Status_Code>>& cert_status,
887 size_t pos) override;
888
889 /// Add a single asnum to this extension
890 void add_asnum(asnum_t asnum) { add_asnum(asnum, asnum); }
891
892 /// Add an asnum range to this extension
893 void add_asnum(asnum_t min, asnum_t max) {
894 m_as_identifiers = ASIdentifiers(add_new(m_as_identifiers.asnum(), min, max), m_as_identifiers.rdi());
895 }
896
897 /// Make the extension contain no allowed asnum's
899 std::vector<ASIdOrRange> empty;
900 m_as_identifiers = ASIdentifiers(ASIdentifierChoice(empty), m_as_identifiers.rdi());
901 }
902
903 /// Mark the asnum entry as 'inherit'
904 void inherit_asnum() { m_as_identifiers = ASIdentifiers(ASIdentifierChoice(), m_as_identifiers.rdi()); }
905
906 /// Add a single rdi to this extension
907 void add_rdi(asnum_t rdi) { add_rdi(rdi, rdi); }
908
909 /// Add an rdi range to this extension
910 void add_rdi(asnum_t min, asnum_t max) {
911 m_as_identifiers = ASIdentifiers(m_as_identifiers.asnum(), add_new(m_as_identifiers.rdi(), min, max));
912 }
913
914 /// Make the extension contain no allowed rdi's
916 std::vector<ASIdOrRange> empty;
917 m_as_identifiers = ASIdentifiers(m_as_identifiers.asnum(), ASIdentifierChoice(empty));
918 }
919
920 /// Mark the rdi entry as 'inherit'
921 void inherit_rdi() { m_as_identifiers = ASIdentifiers(m_as_identifiers.asnum(), ASIdentifierChoice()); }
922
923 const ASIdentifiers& as_identifiers() const { return m_as_identifiers; }
924
925 private:
926 ASIdentifiers m_as_identifiers;
927
928 std::string oid_name() const override { return "PKIX.AutonomousSysIds"; }
929
930 bool should_encode() const override { return true; }
931
932 static ASIdentifierChoice add_new(const std::optional<ASIdentifierChoice>& old, asnum_t min, asnum_t max);
933
934 std::vector<uint8_t> encode_inner() const override;
935 void decode_inner(const std::vector<uint8_t>& in) override;
936};
937
938/**
939* An unknown X.509 extension
940* Will add a failure to the path validation result, if critical
941*/
943 public:
944 Unknown_Extension(const OID& oid, bool critical) : m_oid(oid), m_critical(critical) {}
945
946 std::unique_ptr<Certificate_Extension> copy() const override {
947 return std::make_unique<Unknown_Extension>(m_oid, m_critical);
948 }
949
950 /**
951 * Return the OID of this unknown extension
952 */
953 OID oid_of() const override { return m_oid; }
954
955 //static_oid not defined for Unknown_Extension
956
957 /**
958 * Return the extension contents
959 */
960 const std::vector<uint8_t>& extension_contents() const { return m_bytes; }
961
962 /**
963 * Return if this extension was marked critical
964 */
965 bool is_critical_extension() const { return m_critical; }
966
967 void validate(const X509_Certificate& /*subject*/,
968 const std::optional<X509_Certificate>& /*issuer*/,
969 const std::vector<X509_Certificate>& /*cert_path*/,
970 std::vector<std::set<Certificate_Status_Code>>& cert_status,
971 size_t pos) override {
972 if(m_critical) {
973 cert_status.at(pos).insert(Certificate_Status_Code::UNKNOWN_CRITICAL_EXTENSION);
974 }
975 }
976
977 private:
978 std::string oid_name() const override { return ""; }
979
980 bool should_encode() const override { return true; }
981
982 std::vector<uint8_t> encode_inner() const override;
983 void decode_inner(const std::vector<uint8_t>& in) override;
984
985 OID m_oid;
986 bool m_critical;
987 std::vector<uint8_t> m_bytes;
988};
989
990} // namespace Cert_Extension
991
992} // namespace Botan
993
994#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:822
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:842
const std::optional< ASIdentifierChoice > & asnum() const
Definition x509_ext.h:861
ASIdentifiers(const std::optional< ASIdentifierChoice > &asnum, const std::optional< ASIdentifierChoice > &rdi)
Definition x509_ext.h:853
const std::optional< ASIdentifierChoice > & rdi() const
Definition x509_ext.h:863
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:904
void restrict_rdi()
Make the extension contain no allowed rdi's.
Definition x509_ext.h:915
void inherit_rdi()
Mark the rdi entry as 'inherit'.
Definition x509_ext.h:921
void add_rdi(asnum_t min, asnum_t max)
Add an rdi range to this extension.
Definition x509_ext.h:910
const ASIdentifiers & as_identifiers() const
Definition x509_ext.h:923
ASBlocks(const ASIdentifiers &as_idents)
Definition x509_ext.h:875
OID oid_of() const override
Definition x509_ext.h:881
void restrict_asnum()
Make the extension contain no allowed asnum's.
Definition x509_ext.h:898
std::unique_ptr< Certificate_Extension > copy() const override
Definition x509_ext.h:877
void add_asnum(asnum_t asnum)
Add a single asnum to this extension.
Definition x509_ext.h:890
void add_rdi(asnum_t rdi)
Add a single rdi to this extension.
Definition x509_ext.h:907
void add_asnum(asnum_t min, asnum_t max)
Add an asnum range to this extension.
Definition x509_ext.h:893
const std::vector< std::string > & ca_issuers() const
Definition x509_ext.h:352
std::unique_ptr< Certificate_Extension > copy() const override
Definition x509_ext.h:324
const std::vector< std::string > & ocsp_responders() const
Definition x509_ext.h:346
Authority_Information_Access(std::vector< std::string > ocsp_responders, std::vector< std::string > ca_issuers=std::vector< std::string >())
Definition x509_ext.h:335
Authority_Key_ID(const std::vector< uint8_t > &k)
Definition x509_ext.h:142
std::unique_ptr< Certificate_Extension > copy() const override
Definition x509_ext.h:136
const std::vector< uint8_t > & get_key_id() const
Definition x509_ext.h:144
BOTAN_FUTURE_EXPLICIT Basic_Constraints(bool is_ca=false, size_t path_length_constraint=0)
Definition x509_ext.cpp:293
std::unique_ptr< Certificate_Extension > copy() const override
Definition x509_ext.h:35
std::optional< size_t > path_length_constraint() const
Definition x509_ext.h:53
Distribution_Point(const AlternativeName &name=AlternativeName())
Definition x509_ext.h:434
CRL_Distribution_Points(const std::vector< Distribution_Point > &points)
Definition x509_ext.h:448
std::unique_ptr< Certificate_Extension > copy() const override
Definition x509_ext.h:442
const std::vector< std::string > & crl_distribution_urls() const
Definition x509_ext.h:452
const std::vector< Distribution_Point > & distribution_points() const
Definition x509_ext.h:450
const AlternativeName & get_point() const
Definition x509_ext.h:485
std::unique_ptr< Certificate_Extension > copy() const override
Definition x509_ext.h:481
CRL_Issuing_Distribution_Point(const CRL_Distribution_Points::Distribution_Point &distribution_point)
Definition x509_ext.h:478
OID oid_of() const override
Definition x509_ext.h:381
std::unique_ptr< Certificate_Extension > copy() const override
Definition x509_ext.cpp:697
BOTAN_FUTURE_EXPLICIT CRL_Number(size_t n)
Definition x509_ext.h:375
std::unique_ptr< Certificate_Extension > copy() const override
Definition x509_ext.h:400
CRL_ReasonCode(CRL_Code r=CRL_Code::Unspecified)
Definition x509_ext.h:404
const std::vector< OID > & get_policy_oids() const
Definition x509_ext.h:296
std::unique_ptr< Certificate_Extension > copy() const override
Definition x509_ext.h:288
Certificate_Policies(const std::vector< OID > &o)
Definition x509_ext.h:294
const std::vector< OID > & object_identifiers() const
Definition x509_ext.h:230
std::unique_ptr< Certificate_Extension > copy() const override
Definition x509_ext.h:222
Extended_Key_Usage(const std::vector< OID > &o)
Definition x509_ext.h:228
const std::optional< std::vector< IPAddressOrRange< V > > > & ranges() const
Definition x509_ext.h:692
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
Definition x509_ext.cpp:888
std::variant< IPAddressChoice< Version::IPv4 >, IPAddressChoice< Version::IPv6 > > AddrChoice
Definition x509_ext.h:704
IPAddressFamily(const AddrChoice &choice, std::optional< uint8_t > safi=std::nullopt)
Definition x509_ext.h:711
void encode_into(DER_Encoder &to) const override
IPAddressOrRange(const IPAddress< V > &min, const IPAddress< V > &max)
Definition x509_ext.h:669
friend bool operator==(const IPAddress< V > &lhs, const IPAddress< V > &rhs)
Definition x509_ext.h:652
friend IPAddress< V > operator+(IPAddress< V > lhs, size_t rhs)
Definition x509_ext.h:633
friend std::strong_ordering operator<=>(const IPAddress< V > lhs, const IPAddress< V > &rhs)
Definition x509_ext.h:641
std::array< uint8_t, Length > value() const
Definition x509_ext.h:616
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:777
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:752
std::unique_ptr< Certificate_Extension > copy() const override
Definition x509_ext.h:738
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:769
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:759
const std::vector< IPAddressFamily > & addr_blocks() const
Definition x509_ext.h:782
IPAddressBlocks(const std::vector< IPAddressFamily > &blocks)
Definition x509_ext.h:734
std::unique_ptr< Certificate_Extension > copy() const override
Definition x509_ext.h:200
const AlternativeName & get_alt_name() const
Definition x509_ext.h:194
Issuer_Alternative_Name(const AlternativeName &name=AlternativeName())
Definition x509_ext.h:204
std::unique_ptr< Certificate_Extension > copy() const override
Definition x509_ext.h:74
OID oid_of() const override
Definition x509_ext.h:86
Key_Usage(Key_Constraints c)
Definition x509_ext.h:78
Key_Constraints get_constraints() const
Definition x509_ext.h:82
BOTAN_FUTURE_EXPLICIT Name_Constraints(const NameConstraints &nc)
Definition x509_ext.h:258
const NameConstraints & get_name_constraints() const
Definition x509_ext.h:266
std::unique_ptr< Certificate_Extension > copy() const override
Definition x509_ext.h:252
std::unique_ptr< Certificate_Extension > copy() const override
Definition x509_ext.h:517
OID oid_of() const override
Definition x509_ext.h:521
const AlternativeName & get_alt_name() const
Definition x509_ext.h:166
Subject_Alternative_Name(const AlternativeName &name=AlternativeName())
Definition x509_ext.h:176
std::unique_ptr< Certificate_Extension > copy() const override
Definition x509_ext.h:172
Subject_Key_ID(const std::vector< uint8_t > &k)
Definition x509_ext.h:106
std::unique_ptr< Certificate_Extension > copy() const override
Definition x509_ext.h:110
const std::vector< uint8_t > & get_key_id() const
Definition x509_ext.h:114
std::vector< TelephoneNumberRangeData > RangeContainer
Definition x509_ext.h:556
void decode_from(class BER_Decoder &from) override
Definition x509_ext.cpp:803
void encode_into(DER_Encoder &to) const override
Definition x509_ext.cpp:799
std::variant< ASN1_String, RangeContainer > DataContainer
Definition x509_ext.h:557
std::unique_ptr< Certificate_Extension > copy() const override
Definition x509_ext.h:577
OID oid_of() const override
Definition x509_ext.h:581
const std::vector< Entry > & entries() const
Definition x509_ext.h:583
std::unique_ptr< Certificate_Extension > copy() const override
Definition x509_ext.h:946
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) override
Definition x509_ext.h:967
Unknown_Extension(const OID &oid, bool critical)
Definition x509_ext.h:944
const std::vector< uint8_t > & extension_contents() const
Definition x509_ext.h:960
Name Constraints.
Definition pkix_types.h:408