Botan 3.0.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*
5* Botan is released under the Simplified BSD License (see license.txt)
6*/
7
8#ifndef BOTAN_X509_EXTENSIONS_H_
9#define BOTAN_X509_EXTENSIONS_H_
10
11#include <botan/pkix_types.h>
12#include <set>
13
14namespace Botan {
15
16class X509_Certificate;
17
18namespace Cert_Extension {
19
20static const size_t NO_CERT_PATH_LIMIT = 0xFFFFFFF0;
21
22/**
23* Basic Constraints Extension
24*/
26 {
27 public:
28 std::unique_ptr<Certificate_Extension> copy() const override
29 { return std::make_unique<Basic_Constraints>(m_is_ca, m_path_limit); }
30
31 Basic_Constraints(bool ca = false, size_t limit = 0) :
32 m_is_ca(ca), m_path_limit(limit) {}
33
34 bool get_is_ca() const { return m_is_ca; }
35 size_t get_path_limit() const;
36
37 static OID static_oid() { return OID("2.5.29.19"); }
38 OID oid_of() const override { return static_oid(); }
39
40 private:
41 std::string oid_name() const override
42 { return "X509v3.BasicConstraints"; }
43
44 std::vector<uint8_t> encode_inner() const override;
45 void decode_inner(const std::vector<uint8_t>&) override;
46
47 bool m_is_ca;
48 size_t m_path_limit;
49 };
50
51/**
52* Key Usage Constraints Extension
53*/
55 {
56 public:
57 std::unique_ptr<Certificate_Extension> copy() const override
58 {
59 return std::make_unique<Key_Usage>(m_constraints);
60 }
61
62 explicit Key_Usage(Key_Constraints c) : m_constraints(c) {}
63
64 explicit Key_Usage() : m_constraints(Key_Constraints::None) {}
65
66 Key_Constraints get_constraints() const { return m_constraints; }
67
68 static OID static_oid() { return OID("2.5.29.15"); }
69 OID oid_of() const override { return static_oid(); }
70
71 private:
72 std::string oid_name() const override { return "X509v3.KeyUsage"; }
73
74 bool should_encode() const override
75 { return !m_constraints.empty(); }
76 std::vector<uint8_t> encode_inner() const override;
77 void decode_inner(const std::vector<uint8_t>&) override;
78
79 Key_Constraints m_constraints;
80 };
81
82/**
83* Subject Key Identifier Extension
84*/
86 {
87 public:
88 Subject_Key_ID() = default;
89
90 explicit Subject_Key_ID(const std::vector<uint8_t>& k) : m_key_id(k) {}
91
92 Subject_Key_ID(const std::vector<uint8_t>& public_key,
93 std::string_view hash_fn);
94
95 std::unique_ptr<Certificate_Extension> copy() const override
96 { return std::make_unique<Subject_Key_ID>(m_key_id); }
97
98 const std::vector<uint8_t>& get_key_id() const { return m_key_id; }
99
100 static OID static_oid() { return OID("2.5.29.14"); }
101 OID oid_of() const override { return static_oid(); }
102
103 private:
104
105 std::string oid_name() const override
106 { return "X509v3.SubjectKeyIdentifier"; }
107
108 bool should_encode() const override { return (m_key_id.size() > 0); }
109 std::vector<uint8_t> encode_inner() const override;
110 void decode_inner(const std::vector<uint8_t>&) override;
111
112 std::vector<uint8_t> m_key_id;
113 };
114
115/**
116* Authority Key Identifier Extension
117*/
119 {
120 public:
121 std::unique_ptr<Certificate_Extension> copy() const override
122 { return std::make_unique<Authority_Key_ID>(m_key_id); }
123
124 Authority_Key_ID() = default;
125 explicit Authority_Key_ID(const std::vector<uint8_t>& k) : m_key_id(k) {}
126
127 const std::vector<uint8_t>& get_key_id() const { return m_key_id; }
128
129 static OID static_oid() { return OID("2.5.29.35"); }
130 OID oid_of() const override { return static_oid(); }
131
132 private:
133 std::string oid_name() const override
134 { return "X509v3.AuthorityKeyIdentifier"; }
135
136 bool should_encode() const override { return (m_key_id.size() > 0); }
137 std::vector<uint8_t> encode_inner() const override;
138 void decode_inner(const std::vector<uint8_t>&) override;
139
140 std::vector<uint8_t> m_key_id;
141 };
142
143/**
144* Subject Alternative Name Extension
145*/
147 {
148 public:
149 const AlternativeName& get_alt_name() const { return m_alt_name; }
150
151 static OID static_oid() { return OID("2.5.29.17"); }
152 OID oid_of() const override { return static_oid(); }
153
154 std::unique_ptr<Certificate_Extension> copy() const override
155 { return std::make_unique<Subject_Alternative_Name>(get_alt_name()); }
156
158 m_alt_name(name) {}
159
160 private:
161 std::string oid_name() const override { return "X509v3.SubjectAlternativeName"; }
162
163 bool should_encode() const override { return m_alt_name.has_items(); }
164 std::vector<uint8_t> encode_inner() const override;
165 void decode_inner(const std::vector<uint8_t>&) override;
166
167 AlternativeName m_alt_name;
168 };
169
170/**
171* Issuer Alternative Name Extension
172*/
174 {
175 public:
176 const AlternativeName& get_alt_name() const { return m_alt_name; }
177
178 static OID static_oid() { return OID("2.5.29.18"); }
179 OID oid_of() const override { return static_oid(); }
180
181 std::unique_ptr<Certificate_Extension> copy() const override
182 { return std::make_unique<Issuer_Alternative_Name>(get_alt_name()); }
183
185 m_alt_name(name) {}
186
187 private:
188 std::string oid_name() const override { return "X509v3.IssuerAlternativeName"; }
189
190 bool should_encode() const override { return m_alt_name.has_items(); }
191 std::vector<uint8_t> encode_inner() const override;
192 void decode_inner(const std::vector<uint8_t>&) override;
193
194 AlternativeName m_alt_name;
195 };
196
197/**
198* Extended Key Usage Extension
199*/
201 {
202 public:
203 std::unique_ptr<Certificate_Extension> copy() const override
204 { return std::make_unique<Extended_Key_Usage>(m_oids); }
205
207 explicit Extended_Key_Usage(const std::vector<OID>& o) : m_oids(o) {}
208
209 const std::vector<OID>& object_identifiers() const { return m_oids; }
210
211 static OID static_oid() { return OID("2.5.29.37"); }
212 OID oid_of() const override { return static_oid(); }
213
214 private:
215 std::string oid_name() const override { return "X509v3.ExtendedKeyUsage"; }
216
217 bool should_encode() const override { return (m_oids.size() > 0); }
218 std::vector<uint8_t> encode_inner() const override;
219 void decode_inner(const std::vector<uint8_t>&) override;
220
221 std::vector<OID> m_oids;
222 };
223
224/**
225* Name Constraints
226*/
228 {
229 public:
230 std::unique_ptr<Certificate_Extension> copy() const override
231 { return std::make_unique<Name_Constraints>(m_name_constraints); }
232
233 Name_Constraints() = default;
234 Name_Constraints(const NameConstraints &nc) : m_name_constraints(nc) {}
235
236 void validate(const X509_Certificate& subject, const X509_Certificate& issuer,
237 const std::vector<X509_Certificate>& cert_path,
238 std::vector<std::set<Certificate_Status_Code>>& cert_status,
239 size_t pos) override;
240
241 const NameConstraints& get_name_constraints() const { return m_name_constraints; }
242
243 static OID static_oid() { return OID("2.5.29.30"); }
244 OID oid_of() const override { return static_oid(); }
245
246 private:
247 std::string oid_name() const override
248 { return "X509v3.NameConstraints"; }
249
250 bool should_encode() const override { return true; }
251 std::vector<uint8_t> encode_inner() const override;
252 void decode_inner(const std::vector<uint8_t>&) override;
253
254 NameConstraints m_name_constraints;
255 };
256
257/**
258* Certificate Policies Extension
259*/
261 {
262 public:
263 std::unique_ptr<Certificate_Extension> copy() const override
264 { return std::make_unique<Certificate_Policies>(m_oids); }
265
267 explicit Certificate_Policies(const std::vector<OID>& o) : m_oids(o) {}
268
269 const std::vector<OID>& get_policy_oids() const { return m_oids; }
270
271 static OID static_oid() { return OID("2.5.29.32"); }
272 OID oid_of() const override { return static_oid(); }
273
274 void validate(const X509_Certificate& subject, const X509_Certificate& issuer,
275 const std::vector<X509_Certificate>& cert_path,
276 std::vector<std::set<Certificate_Status_Code>>& cert_status,
277 size_t pos) override;
278 private:
279 std::string oid_name() const override
280 { return "X509v3.CertificatePolicies"; }
281
282 bool should_encode() const override { return (m_oids.size() > 0); }
283 std::vector<uint8_t> encode_inner() const override;
284 void decode_inner(const std::vector<uint8_t>&) override;
285
286 std::vector<OID> m_oids;
287 };
288
289/**
290* Authority Information Access Extension
291*/
293 {
294 public:
295 std::unique_ptr<Certificate_Extension> copy() const override
296 { return std::make_unique<Authority_Information_Access>(m_ocsp_responder, m_ca_issuers); }
297
299
300 explicit Authority_Information_Access(std::string_view ocsp, const std::vector<std::string>& ca_issuers = std::vector<std::string>()) :
301 m_ocsp_responder(ocsp), m_ca_issuers(ca_issuers) {}
302
303 std::string ocsp_responder() const { return m_ocsp_responder; }
304
305 static OID static_oid() { return OID("1.3.6.1.5.5.7.1.1"); }
306 OID oid_of() const override { return static_oid(); }
307 const std::vector<std::string> ca_issuers() const { return m_ca_issuers; }
308
309 private:
310 std::string oid_name() const override
311 { return "PKIX.AuthorityInformationAccess"; }
312
313 bool should_encode() const override { return (!m_ocsp_responder.empty()); }
314
315 std::vector<uint8_t> encode_inner() const override;
316 void decode_inner(const std::vector<uint8_t>&) override;
317
318
319 std::string m_ocsp_responder;
320 std::vector<std::string> m_ca_issuers;
321 };
322
323/**
324* CRL Number Extension
325*/
327 {
328 public:
329 std::unique_ptr<Certificate_Extension> copy() const override;
330
331 CRL_Number() : m_has_value(false), m_crl_number(0) {}
332 CRL_Number(size_t n) : m_has_value(true), m_crl_number(n) {}
333
334 size_t get_crl_number() const;
335
336 static OID static_oid() { return OID("2.5.29.20"); }
337 OID oid_of() const override { return static_oid(); }
338
339 private:
340 std::string oid_name() const override { return "X509v3.CRLNumber"; }
341
342 bool should_encode() const override { return m_has_value; }
343 std::vector<uint8_t> encode_inner() const override;
344 void decode_inner(const std::vector<uint8_t>&) override;
345
346 bool m_has_value;
347 size_t m_crl_number;
348 };
349
350/**
351* CRL Entry Reason Code Extension
352*/
354 {
355 public:
356 std::unique_ptr<Certificate_Extension> copy() const override
357 { return std::make_unique<CRL_ReasonCode>(m_reason); }
358
359 explicit CRL_ReasonCode(CRL_Code r = CRL_Code::Unspecified) : m_reason(r) {}
360
361 CRL_Code get_reason() const { return m_reason; }
362
363 static OID static_oid() { return OID("2.5.29.21"); }
364 OID oid_of() const override { return static_oid(); }
365
366 private:
367 std::string oid_name() const override { return "X509v3.ReasonCode"; }
368
369 bool should_encode() const override { return (m_reason != CRL_Code::Unspecified); }
370 std::vector<uint8_t> encode_inner() const override;
371 void decode_inner(const std::vector<uint8_t>&) override;
372
373 CRL_Code m_reason;
374 };
375
376/**
377* CRL Distribution Points Extension
378* todo enforce restrictions from RFC 5280 4.2.1.13
379*/
381 {
382 public:
384 {
385 public:
386 void encode_into(DER_Encoder&) const override;
387 void decode_from(BER_Decoder&) override;
388
389 const AlternativeName& point() const { return m_point; }
390 private:
391 AlternativeName m_point;
392 };
393
394 std::unique_ptr<Certificate_Extension> copy() const override
395 { return std::make_unique<CRL_Distribution_Points>(m_distribution_points); }
396
398
399 explicit CRL_Distribution_Points(const std::vector<Distribution_Point>& points) :
400 m_distribution_points(points) {}
401
402 const std::vector<Distribution_Point>& distribution_points() const
403 { return m_distribution_points; }
404
405 const std::vector<std::string>& crl_distribution_urls() const
406 { return m_crl_distribution_urls; }
407
408 static OID static_oid() { return OID("2.5.29.31"); }
409 OID oid_of() const override { return static_oid(); }
410
411 private:
412 std::string oid_name() const override
413 { return "X509v3.CRLDistributionPoints"; }
414
415 bool should_encode() const override
416 { return !m_distribution_points.empty(); }
417
418 std::vector<uint8_t> encode_inner() const override;
419 void decode_inner(const std::vector<uint8_t>&) override;
420
421 std::vector<Distribution_Point> m_distribution_points;
422 std::vector<std::string> m_crl_distribution_urls;
423 };
424
425/**
426* CRL Issuing Distribution Point Extension
427* todo enforce restrictions from RFC 5280 5.2.5
428*/
430 {
431 public:
433
435 m_distribution_point(distribution_point) {}
436
437 std::unique_ptr<Certificate_Extension> copy() const override
438 { return std::make_unique<CRL_Issuing_Distribution_Point>(m_distribution_point); }
439
441 { return m_distribution_point.point(); }
442
443 static OID static_oid() { return OID("2.5.29.28"); }
444 OID oid_of() const override { return static_oid(); }
445
446 private:
447 std::string oid_name() const override
448 { return "X509v3.CRLIssuingDistributionPoint"; }
449
450 bool should_encode() const override { return true; }
451 std::vector<uint8_t> encode_inner() const override;
452 void decode_inner(const std::vector<uint8_t>&) override;
453
454 CRL_Distribution_Points::Distribution_Point m_distribution_point;
455 };
456
457/**
458* OCSP NoCheck Extension
459*
460* RFC6960 4.2.2.2.1
461* A CA may specify that an OCSP client can trust a responder for the
462* lifetime of the responder's certificate. The CA does so by
463* including the extension id-pkix-ocsp-nocheck.
464*
465* In other words: OCSP responder certificates with this extension do not need
466* to be validated against some revocation info.
467*/
469 {
470 public:
471 OCSP_NoCheck() = default;
472
473 std::unique_ptr<Certificate_Extension> copy() const override { return std::make_unique<OCSP_NoCheck>(); }
474 static OID static_oid() { return OID("1.3.6.1.5.5.7.48.1.5"); }
475 OID oid_of() const override { return static_oid(); }
476
477 private:
478 std::string oid_name() const override
479 { return "PKIX.OCSP.NoCheck"; }
480
481 bool should_encode() const override { return true; }
482 std::vector<uint8_t> encode_inner() const override { return {}; }
483 void decode_inner(const std::vector<uint8_t>&) override;
484 };
485
486/**
487* An unknown X.509 extension
488* Will add a failure to the path validation result, if critical
489*/
491 {
492 public:
493 Unknown_Extension(const OID& oid, bool critical) :
494 m_oid(oid), m_critical(critical) {}
495
496 std::unique_ptr<Certificate_Extension> copy() const override
497 { return std::make_unique<Unknown_Extension>(m_oid, m_critical); }
498
499 /**
500 * Return the OID of this unknown extension
501 */
502 OID oid_of() const override
503 { return m_oid; }
504
505 //static_oid not defined for Unknown_Extension
506
507 /**
508 * Return the extension contents
509 */
510 const std::vector<uint8_t>& extension_contents() const { return m_bytes; }
511
512 /**
513 * Return if this extension was marked critical
514 */
515 bool is_critical_extension() const { return m_critical; }
516
518 const std::vector<X509_Certificate>&,
519 std::vector<std::set<Certificate_Status_Code>>& cert_status,
520 size_t pos) override
521 {
522 if(m_critical)
523 {
524 cert_status.at(pos).insert(Certificate_Status_Code::UNKNOWN_CRITICAL_EXTENSION);
525 }
526 }
527
528 private:
529 std::string oid_name() const override { return ""; }
530
531 bool should_encode() const override { return true; }
532 std::vector<uint8_t> encode_inner() const override;
533 void decode_inner(const std::vector<uint8_t>&) override;
534
535 OID m_oid;
536 bool m_critical;
537 std::vector<uint8_t> m_bytes;
538 };
539
540}
541
542}
543
544#endif
Authority_Information_Access(std::string_view ocsp, const std::vector< std::string > &ca_issuers=std::vector< std::string >())
Definition: x509_ext.h:300
std::unique_ptr< Certificate_Extension > copy() const override
Definition: x509_ext.h:295
const std::vector< std::string > ca_issuers() const
Definition: x509_ext.h:307
Authority_Key_ID(const std::vector< uint8_t > &k)
Definition: x509_ext.h:125
std::unique_ptr< Certificate_Extension > copy() const override
Definition: x509_ext.h:121
const std::vector< uint8_t > & get_key_id() const
Definition: x509_ext.h:127
std::unique_ptr< Certificate_Extension > copy() const override
Definition: x509_ext.h:28
Basic_Constraints(bool ca=false, size_t limit=0)
Definition: x509_ext.h:31
CRL_Distribution_Points(const std::vector< Distribution_Point > &points)
Definition: x509_ext.h:399
std::unique_ptr< Certificate_Extension > copy() const override
Definition: x509_ext.h:394
const std::vector< std::string > & crl_distribution_urls() const
Definition: x509_ext.h:405
const std::vector< Distribution_Point > & distribution_points() const
Definition: x509_ext.h:402
const AlternativeName & get_point() const
Definition: x509_ext.h:440
std::unique_ptr< Certificate_Extension > copy() const override
Definition: x509_ext.h:437
CRL_Issuing_Distribution_Point(const CRL_Distribution_Points::Distribution_Point &distribution_point)
Definition: x509_ext.h:434
OID oid_of() const override
Definition: x509_ext.h:337
std::unique_ptr< Certificate_Extension > copy() const override
Definition: x509_ext.h:356
CRL_ReasonCode(CRL_Code r=CRL_Code::Unspecified)
Definition: x509_ext.h:359
const std::vector< OID > & get_policy_oids() const
Definition: x509_ext.h:269
std::unique_ptr< Certificate_Extension > copy() const override
Definition: x509_ext.h:263
Certificate_Policies(const std::vector< OID > &o)
Definition: x509_ext.h:267
const std::vector< OID > & object_identifiers() const
Definition: x509_ext.h:209
std::unique_ptr< Certificate_Extension > copy() const override
Definition: x509_ext.h:203
Extended_Key_Usage(const std::vector< OID > &o)
Definition: x509_ext.h:207
std::unique_ptr< Certificate_Extension > copy() const override
Definition: x509_ext.h:181
const AlternativeName & get_alt_name() const
Definition: x509_ext.h:176
Issuer_Alternative_Name(const AlternativeName &name=AlternativeName())
Definition: x509_ext.h:184
std::unique_ptr< Certificate_Extension > copy() const override
Definition: x509_ext.h:57
OID oid_of() const override
Definition: x509_ext.h:69
Key_Usage(Key_Constraints c)
Definition: x509_ext.h:62
Key_Constraints get_constraints() const
Definition: x509_ext.h:66
Name_Constraints(const NameConstraints &nc)
Definition: x509_ext.h:234
const NameConstraints & get_name_constraints() const
Definition: x509_ext.h:241
std::unique_ptr< Certificate_Extension > copy() const override
Definition: x509_ext.h:230
std::unique_ptr< Certificate_Extension > copy() const override
Definition: x509_ext.h:473
OID oid_of() const override
Definition: x509_ext.h:475
const AlternativeName & get_alt_name() const
Definition: x509_ext.h:149
Subject_Alternative_Name(const AlternativeName &name=AlternativeName())
Definition: x509_ext.h:157
std::unique_ptr< Certificate_Extension > copy() const override
Definition: x509_ext.h:154
Subject_Key_ID(const std::vector< uint8_t > &k)
Definition: x509_ext.h:90
std::unique_ptr< Certificate_Extension > copy() const override
Definition: x509_ext.h:95
const std::vector< uint8_t > & get_key_id() const
Definition: x509_ext.h:98
void validate(const X509_Certificate &, const X509_Certificate &, const std::vector< X509_Certificate > &, std::vector< std::set< Certificate_Status_Code > > &cert_status, size_t pos) override
Definition: x509_ext.h:517
std::unique_ptr< Certificate_Extension > copy() const override
Definition: x509_ext.h:496
Unknown_Extension(const OID &oid, bool critical)
Definition: x509_ext.h:493
const std::vector< uint8_t > & extension_contents() const
Definition: x509_ext.h:510
Name Constraints.
Definition: pkix_types.h:310
std::string name
int(* final)(unsigned char *, CTX *)
#define BOTAN_PUBLIC_API(maj, min)
Definition: compiler.h:31
Definition: alg_id.cpp:12