iPXE
x509.h
Go to the documentation of this file.
1#ifndef _IPXE_X509_H
2#define _IPXE_X509_H
3
4/** @file
5 *
6 * X.509 certificates
7 *
8 */
9
10FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
11FILE_SECBOOT ( PERMITTED );
12
13#include <stdint.h>
14#include <stddef.h>
15#include <time.h>
16#include <ipxe/asn1.h>
17#include <ipxe/refcnt.h>
18#include <ipxe/list.h>
19
20struct image;
21struct private_key;
22
23/** An X.509 serial number */
25 /** Raw serial number */
27};
28
29/** An X.509 issuer */
31 /** Raw issuer */
33};
34
35/** An X.509 time */
36struct x509_time {
37 /** Seconds since the Epoch */
39};
40
41/** An X.509 certificate validity period */
43 /** Not valid before */
45 /** Not valid after */
47};
48
49/** An X.509 certificate public key */
51 /** Raw public key information */
53 /** Public key algorithm */
55 /** Public key value */
57};
58
59/** An X.509 certificate subject */
61 /** Raw subject */
63 /** Common name */
65 /** Public key information */
67};
68
69/** An X.509 certificate signature */
71 /** Signature algorithm */
73 /** Signature value */
75};
76
77/** An X.509 certificate basic constraints set */
79 /** Subject is a CA */
80 int ca;
81 /** Path length */
82 unsigned int path_len;
83};
84
85/** Unlimited path length
86 *
87 * We use -2U, since this quantity represents one *fewer* than the
88 * maximum number of remaining certificates in a chain.
89 */
90#define X509_PATH_LEN_UNLIMITED -2U
91
92/** An X.509 certificate key usage */
94 /** Key usage extension is present */
96 /** Usage bits */
97 unsigned int bits;
98};
99
100/** X.509 certificate key usage bits */
112
113/** An X.509 certificate extended key usage */
115 /** Usage bits */
116 unsigned int bits;
117};
118
119/** X.509 certificate extended key usage bits
120 *
121 * Extended key usages are identified by OID; these bits are purely an
122 * internal definition.
123 */
128
129/** X.509 certificate OCSP responder */
131 /** URI */
133 /** OCSP status is good */
134 int good;
135};
136
137/** X.509 certificate authority information access */
139 /** OCSP responder */
141};
142
143/** X.509 certificate subject alternative name */
145 /** Names */
147};
148
149/** X.509 certificate general name types */
155
156/** An X.509 certificate extensions set */
158 /** Basic constraints */
160 /** Key usage */
162 /** Extended key usage */
164 /** Authority information access */
166 /** Subject alternative name */
168};
169
170/** A link in an X.509 certificate chain */
171struct x509_link {
172 /** List of links */
174 /** Certificate */
176 /** Flags */
177 unsigned int flags;
178};
179
180/** X.509 certficate chain link flags */
182 /** Cross-signed certificate download has been attempted
183 *
184 * This indicates that a cross-signature download attempt has
185 * been made to find a cross-signed issuer for this link's
186 * certificate.
187 */
189 /** OCSP has been attempted
190 *
191 * This indicates that an OCSP attempt has been made using
192 * this link's certificate as an issuer. (We record the flag
193 * on the issuer rather than on the issued certificate, since
194 * we want to retry OCSP if an issuer is replaced with a
195 * downloaded cross-signed certificate.)
196 */
198};
199
200/** An X.509 certificate chain */
202 /** Reference count */
204 /** List of links */
206 /** Mark certificate as found
207 *
208 * @v store Certificate store
209 * @v cert X.509 certificate
210 */
211 void ( * found ) ( struct x509_chain *store,
212 struct x509_certificate *cert );
213};
214
215/** An X.509 certificate */
217 /** Reference count */
219
220 /** Link in certificate store */
222
223 /** Flags */
224 unsigned int flags;
225 /** Root against which certificate has been validated (if any) */
227 /** Maximum number of subsequent certificates in chain */
228 unsigned int path_remaining;
229
230 /** Raw certificate */
232 /** Version */
233 unsigned int version;
234 /** Serial number */
236 /** Raw tbsCertificate */
238 /** Signature algorithm */
240 /** Issuer */
242 /** Validity */
244 /** Subject */
246 /** Signature */
248 /** Extensions */
250};
251
252/** X.509 certificate flags */
254 /** Certificate was added at build time */
256 /** Certificate was added explicitly at run time */
258};
259
260/**
261 * Get reference to X.509 certificate
262 *
263 * @v cert X.509 certificate
264 * @ret cert X.509 certificate
265 */
266static inline __attribute__ (( always_inline )) struct x509_certificate *
267x509_get ( struct x509_certificate *cert ) {
268 ref_get ( &cert->refcnt );
269 return cert;
270}
271
272/**
273 * Drop reference to X.509 certificate
274 *
275 * @v cert X.509 certificate
276 */
277static inline __attribute__ (( always_inline )) void
278x509_put ( struct x509_certificate *cert ) {
279 ref_put ( &cert->refcnt );
280}
281
282/**
283 * Get reference to X.509 certificate chain
284 *
285 * @v chain X.509 certificate chain
286 * @ret chain X.509 certificate chain
287 */
288static inline __attribute__ (( always_inline )) struct x509_chain *
289x509_chain_get ( struct x509_chain *chain ) {
290 ref_get ( &chain->refcnt );
291 return chain;
292}
293
294/**
295 * Drop reference to X.509 certificate chain
296 *
297 * @v chain X.509 certificate chain
298 */
299static inline __attribute__ (( always_inline )) void
300x509_chain_put ( struct x509_chain *chain ) {
301 ref_put ( &chain->refcnt );
302}
303
304/**
305 * Get first certificate in X.509 certificate chain
306 *
307 * @v chain X.509 certificate chain
308 * @ret cert X.509 certificate, or NULL
309 */
310static inline __attribute__ (( always_inline )) struct x509_certificate *
311x509_first ( struct x509_chain *chain ) {
312 struct x509_link *link;
313
314 link = list_first_entry ( &chain->links, struct x509_link, list );
315 return ( link ? link->cert : NULL );
316}
317
318/**
319 * Get last certificate in X.509 certificate chain
320 *
321 * @v chain X.509 certificate chain
322 * @ret cert X.509 certificate, or NULL
323 */
324static inline __attribute__ (( always_inline )) struct x509_certificate *
325x509_last ( struct x509_chain *chain ) {
326 struct x509_link *link;
327
328 link = list_last_entry ( &chain->links, struct x509_link, list );
329 return ( link ? link->cert : NULL );
330}
331
332/** An X.509 extension */
334 /** Name */
335 const char *name;
336 /** Object identifier */
338 /** Parse extension
339 *
340 * @v cert X.509 certificate
341 * @v raw ASN.1 cursor
342 * @ret rc Return status code
343 */
344 int ( * parse ) ( struct x509_certificate *cert,
345 const struct asn1_cursor *raw );
346};
347
348/** An X.509 key purpose */
350 /** Name */
351 const char *name;
352 /** Object identifier */
354 /** Extended key usage bits */
355 unsigned int bits;
356};
357
358/** An X.509 access method */
360 /** Name */
361 const char *name;
362 /** Object identifier */
364 /** Parse access method
365 *
366 * @v cert X.509 certificate
367 * @v raw ASN.1 cursor
368 * @ret rc Return status code
369 */
370 int ( * parse ) ( struct x509_certificate *cert,
371 const struct asn1_cursor *raw );
372};
373
374/** An X.509 root certificate list */
375struct x509_root {
376 /** Reference count */
378 /** Fingerprint digest algorithm */
380 /** Number of certificates */
381 unsigned int count;
382 /** Certificate fingerprints */
383 const void *fingerprints;
384};
385
386/**
387 * Get reference to X.509 root certificate list
388 *
389 * @v root X.509 root certificate list
390 * @ret root X.509 root certificate list
391 */
392static inline __attribute__ (( always_inline )) struct x509_root *
394 ref_get ( &root->refcnt );
395 return root;
396}
397
398/**
399 * Drop reference to X.509 root certificate list
400 *
401 * @v root X.509 root certificate list
402 */
403static inline __attribute__ (( always_inline )) void
405 ref_put ( &root->refcnt );
406}
407
408/**
409 * Check if X.509 certificate is self-signed
410 *
411 * @v cert X.509 certificate
412 * @ret is_self_signed X.509 certificate is self-signed
413 */
414static inline int x509_is_self_signed ( struct x509_certificate *cert ) {
415 return ( asn1_compare ( &cert->issuer.raw, &cert->subject.raw ) == 0 );
416}
417
418extern const char * x509_name ( struct x509_certificate *cert );
419extern int x509_parse ( struct x509_certificate *cert,
420 const struct asn1_cursor *raw );
421extern int x509_certificate ( const void *data, size_t len,
422 struct x509_certificate **cert );
423extern int x509_is_valid ( struct x509_certificate *cert,
424 struct x509_root *root );
425extern void x509_set_valid ( struct x509_certificate *cert,
426 struct x509_certificate *issuer,
427 struct x509_root *root );
428extern int x509_validate ( struct x509_certificate *cert,
429 struct x509_certificate *issuer,
430 time_t time, struct x509_root *root );
431extern int x509_check_name ( struct x509_certificate *cert, const char *name );
432
433extern struct x509_chain * x509_alloc_chain ( void );
434extern int x509_append ( struct x509_chain *chain,
435 struct x509_certificate *cert );
436extern int x509_append_raw ( struct x509_chain *chain, const void *data,
437 size_t len );
438extern void x509_truncate ( struct x509_chain *chain, struct x509_link *link );
439extern struct x509_certificate * x509_find ( struct x509_chain *store,
440 const struct asn1_cursor *raw );
441extern struct x509_certificate *
443 const struct asn1_cursor *subject );
444extern struct x509_certificate *
446 const struct asn1_cursor *issuer,
447 const struct asn1_cursor *serial );
448extern struct x509_certificate * x509_find_key ( struct x509_chain *store,
449 struct private_key *key );
450extern int x509_auto_append ( struct x509_chain *chain,
451 struct x509_chain *store );
452extern int x509_validate_chain ( struct x509_chain *chain, time_t time,
453 struct x509_chain *store,
454 struct x509_root *root );
455extern int image_x509 ( struct image *image, size_t offset,
456 struct x509_certificate **cert );
457
458/* Functions exposed only for unit testing */
459extern int x509_check_issuer ( struct x509_certificate *cert,
460 struct x509_certificate *issuer );
461extern void x509_fingerprint ( struct x509_certificate *cert,
462 struct digest_algorithm *digest,
463 void *fingerprint );
464extern int x509_check_root ( struct x509_certificate *cert,
465 struct x509_root *root );
466extern int x509_check_time ( struct x509_certificate *cert, time_t time );
467
468/**
469 * Invalidate X.509 certificate
470 *
471 * @v cert X.509 certificate
472 */
473static inline void x509_invalidate ( struct x509_certificate *cert ) {
474 x509_root_put ( cert->root );
475 cert->root = NULL;
476 cert->path_remaining = 0;
477}
478
479/**
480 * Invalidate X.509 certificate chain
481 *
482 * @v chain X.509 certificate chain
483 */
484static inline void x509_invalidate_chain ( struct x509_chain *chain ) {
485 struct x509_link *link;
486
487 list_for_each_entry ( link, &chain->links, list )
488 x509_invalidate ( link->cert );
489}
490
491#endif /* _IPXE_X509_H */
#define NULL
NULL pointer (VOID *)
Definition Base.h:322
union @162305117151260234136356364136041353210355154177 key
Sense key.
Definition scsi.h:3
__be32 raw[7]
Definition CIB_PRM.h:0
u32 link
Link to next descriptor.
Definition ar9003_mac.h:1
int asn1_compare(const struct asn1_cursor *cursor1, const struct asn1_cursor *cursor2)
Compare two ASN.1 objects.
Definition asn1.c:458
ASN.1 encoding.
#define ASN1_IMPLICIT_TAG(number)
ASN.1 implicit tag.
Definition asn1.h:96
const char * name
Definition ath9k_hw.c:1986
uint16_t offset
Offset to command line.
Definition bzimage.h:3
ring len
Length.
Definition dwmac.h:226
uint64_t serial
Serial number.
Definition edd.h:1
uint8_t data[48]
Additional event data.
Definition ena.h:11
#define FILE_LICENCE(_licence)
Declare a particular licence as applying to a file.
Definition compiler.h:896
#define FILE_SECBOOT(_status)
Declare a file's UEFI Secure Boot permission status.
Definition compiler.h:926
#define __attribute__(x)
Definition compiler.h:10
Time source.
int64_t time_t
Seconds since the Epoch.
Definition time.h:19
Linked lists.
#define list_first_entry(list, type, member)
Get the container of the first entry in a list.
Definition list.h:334
#define list_last_entry(list, type, member)
Get the container of the last entry in a list.
Definition list.h:347
#define list_for_each_entry(pos, head, member)
Iterate over entries in a list.
Definition list.h:432
Reference counting.
#define ref_get(refcnt)
Get additional reference to object.
Definition refcnt.h:93
#define ref_put(refcnt)
Drop reference to object.
Definition refcnt.h:107
struct stp_switch root
Root switch.
Definition stp.h:15
An ASN.1 OID-identified algorithm.
Definition asn1.h:408
An ASN.1 object cursor.
Definition asn1.h:21
A message digest algorithm.
Definition crypto.h:19
An executable image.
Definition image.h:24
A doubly-linked list entry (or list head)
Definition list.h:19
A private key.
Definition privkey.h:17
An X.509 access method.
Definition x509.h:359
int(* parse)(struct x509_certificate *cert, const struct asn1_cursor *raw)
Parse access method.
Definition x509.h:370
const char * name
Name.
Definition x509.h:361
struct asn1_cursor oid
Object identifier.
Definition x509.h:363
X.509 certificate authority information access.
Definition x509.h:138
struct x509_ocsp_responder ocsp
OCSP responder.
Definition x509.h:140
An X.509 certificate basic constraints set.
Definition x509.h:78
int ca
Subject is a CA.
Definition x509.h:80
unsigned int path_len
Path length.
Definition x509.h:82
An X.509 certificate.
Definition x509.h:216
struct x509_serial serial
Serial number.
Definition x509.h:235
struct x509_subject subject
Subject.
Definition x509.h:245
struct x509_extensions extensions
Extensions.
Definition x509.h:249
unsigned int flags
Flags.
Definition x509.h:224
struct refcnt refcnt
Reference count.
Definition x509.h:218
struct x509_link store
Link in certificate store.
Definition x509.h:221
struct x509_root * root
Root against which certificate has been validated (if any)
Definition x509.h:226
struct x509_signature signature
Signature.
Definition x509.h:247
struct asn1_cursor raw
Raw certificate.
Definition x509.h:231
struct asn1_cursor tbs
Raw tbsCertificate.
Definition x509.h:237
struct asn1_algorithm * signature_algorithm
Signature algorithm.
Definition x509.h:239
unsigned int path_remaining
Maximum number of subsequent certificates in chain.
Definition x509.h:228
struct x509_validity validity
Validity.
Definition x509.h:243
struct x509_issuer issuer
Issuer.
Definition x509.h:241
unsigned int version
Version.
Definition x509.h:233
An X.509 certificate chain.
Definition x509.h:201
void(* found)(struct x509_chain *store, struct x509_certificate *cert)
Mark certificate as found.
Definition x509.h:211
struct refcnt refcnt
Reference count.
Definition x509.h:203
struct list_head links
List of links.
Definition x509.h:205
An X.509 certificate extended key usage.
Definition x509.h:114
unsigned int bits
Usage bits.
Definition x509.h:116
An X.509 extension.
Definition x509.h:333
struct asn1_cursor oid
Object identifier.
Definition x509.h:337
int(* parse)(struct x509_certificate *cert, const struct asn1_cursor *raw)
Parse extension.
Definition x509.h:344
const char * name
Name.
Definition x509.h:335
An X.509 certificate extensions set.
Definition x509.h:157
struct x509_subject_alt_name alt_name
Subject alternative name.
Definition x509.h:167
struct x509_basic_constraints basic
Basic constraints.
Definition x509.h:159
struct x509_authority_info_access auth_info
Authority information access.
Definition x509.h:165
struct x509_key_usage usage
Key usage.
Definition x509.h:161
struct x509_extended_key_usage ext_usage
Extended key usage.
Definition x509.h:163
An X.509 issuer.
Definition x509.h:30
struct asn1_cursor raw
Raw issuer.
Definition x509.h:32
An X.509 key purpose.
Definition x509.h:349
struct asn1_cursor oid
Object identifier.
Definition x509.h:353
const char * name
Name.
Definition x509.h:351
unsigned int bits
Extended key usage bits.
Definition x509.h:355
An X.509 certificate key usage.
Definition x509.h:93
int present
Key usage extension is present.
Definition x509.h:95
unsigned int bits
Usage bits.
Definition x509.h:97
X.509 certificate OCSP responder.
Definition x509.h:130
int good
OCSP status is good.
Definition x509.h:134
struct asn1_cursor uri
URI.
Definition x509.h:132
An X.509 certificate public key.
Definition x509.h:50
struct asn1_algorithm * algorithm
Public key algorithm.
Definition x509.h:54
struct asn1_cursor value
Public key value.
Definition x509.h:56
struct asn1_cursor raw
Raw public key information.
Definition x509.h:52
An X.509 root certificate list.
Definition x509.h:375
unsigned int count
Number of certificates.
Definition x509.h:381
const void * fingerprints
Certificate fingerprints.
Definition x509.h:383
struct digest_algorithm * digest
Fingerprint digest algorithm.
Definition x509.h:379
struct refcnt refcnt
Reference count.
Definition x509.h:377
An X.509 serial number.
Definition x509.h:24
struct asn1_cursor raw
Raw serial number.
Definition x509.h:26
An X.509 certificate signature.
Definition x509.h:70
struct asn1_algorithm * algorithm
Signature algorithm.
Definition x509.h:72
struct asn1_cursor value
Signature value.
Definition x509.h:74
X.509 certificate subject alternative name.
Definition x509.h:144
struct asn1_cursor names
Names.
Definition x509.h:146
An X.509 certificate subject.
Definition x509.h:60
struct asn1_cursor common_name
Common name.
Definition x509.h:64
struct asn1_cursor raw
Raw subject.
Definition x509.h:62
struct x509_public_key public_key
Public key information.
Definition x509.h:66
An X.509 time.
Definition x509.h:36
time_t time
Seconds since the Epoch.
Definition x509.h:38
An X.509 certificate validity period.
Definition x509.h:42
struct x509_time not_before
Not valid before.
Definition x509.h:44
struct x509_time not_after
Not valid after.
Definition x509.h:46
int image_x509(struct image *image, size_t offset, struct x509_certificate **cert)
Extract X.509 certificate object from image.
Definition x509.c:1961
int x509_validate(struct x509_certificate *cert, struct x509_certificate *issuer, time_t time, struct x509_root *root)
Validate X.509 certificate.
Definition x509.c:1366
static struct x509_certificate * x509_first(struct x509_chain *chain)
Get first certificate in X.509 certificate chain.
Definition x509.h:311
struct x509_certificate * x509_find_subject(struct x509_chain *store, const struct asn1_cursor *subject)
Identify X.509 certificate by subject.
Definition x509.c:1775
static struct x509_chain * x509_chain_get(struct x509_chain *chain)
Get reference to X.509 certificate chain.
Definition x509.h:289
int x509_parse(struct x509_certificate *cert, const struct asn1_cursor *raw)
Parse X.509 certificate from ASN.1 data.
Definition x509.c:1008
int x509_check_root(struct x509_certificate *cert, struct x509_root *root)
Check X.509 root certificate.
Definition x509.c:1255
static struct x509_root * x509_root_get(struct x509_root *root)
Get reference to X.509 root certificate list.
Definition x509.h:393
int x509_check_issuer(struct x509_certificate *cert, struct x509_certificate *issuer)
Check X.509 certificate against issuer certificate.
Definition x509.c:1177
static struct x509_certificate * x509_get(struct x509_certificate *cert)
Get reference to X.509 certificate.
Definition x509.h:267
int x509_auto_append(struct x509_chain *chain, struct x509_chain *store)
Append X.509 certificates to X.509 certificate chain.
Definition x509.c:1868
int x509_is_valid(struct x509_certificate *cert, struct x509_root *root)
Check if X.509 certificate is valid.
Definition x509.c:1313
static int x509_is_self_signed(struct x509_certificate *cert)
Check if X.509 certificate is self-signed.
Definition x509.h:414
x509_extended_key_usage_bits
X.509 certificate extended key usage bits.
Definition x509.h:124
@ X509_CODE_SIGNING
Definition x509.h:125
@ X509_OCSP_SIGNING
Definition x509.h:126
int x509_check_name(struct x509_certificate *cert, const char *name)
Check X.509 certificate name.
Definition x509.c:1564
x509_general_name_types
X.509 certificate general name types.
Definition x509.h:150
@ X509_GENERAL_NAME_URI
Definition x509.h:152
@ X509_GENERAL_NAME_DNS
Definition x509.h:151
@ X509_GENERAL_NAME_IP
Definition x509.h:153
int x509_validate_chain(struct x509_chain *chain, time_t time, struct x509_chain *store, struct x509_root *root)
Validate X.509 certificate chain.
Definition x509.c:1908
static void x509_invalidate(struct x509_certificate *cert)
Invalidate X.509 certificate.
Definition x509.h:473
x509_link_flags
X.509 certficate chain link flags.
Definition x509.h:181
@ X509_LINK_FL_OCSPED
OCSP has been attempted.
Definition x509.h:197
@ X509_LINK_FL_CROSSED
Cross-signed certificate download has been attempted.
Definition x509.h:188
void x509_truncate(struct x509_chain *chain, struct x509_link *link)
Truncate X.509 certificate chain.
Definition x509.c:1704
struct x509_chain * x509_alloc_chain(void)
Allocate X.509 certificate chain.
Definition x509.c:1615
struct x509_certificate * x509_find(struct x509_chain *store, const struct asn1_cursor *raw)
Identify X.509 certificate by raw certificate data.
Definition x509.c:1746
static void x509_put(struct x509_certificate *cert)
Drop reference to X.509 certificate.
Definition x509.h:278
const char * x509_name(struct x509_certificate *cert)
Get X.509 certificate display name.
Definition x509.c:147
x509_flags
X.509 certificate flags.
Definition x509.h:253
@ X509_FL_EXPLICIT
Certificate was added explicitly at run time.
Definition x509.h:257
@ X509_FL_PERMANENT
Certificate was added at build time.
Definition x509.h:255
static struct x509_certificate * x509_last(struct x509_chain *chain)
Get last certificate in X.509 certificate chain.
Definition x509.h:325
void x509_fingerprint(struct x509_certificate *cert, struct digest_algorithm *digest, void *fingerprint)
Calculate X.509 certificate fingerprint.
Definition x509.c:1237
struct x509_certificate * x509_find_key(struct x509_chain *store, struct private_key *key)
Identify X.509 certificate by corresponding public key.
Definition x509.c:1835
int x509_certificate(const void *data, size_t len, struct x509_certificate **cert)
Create X.509 certificate.
Definition x509.c:1074
static void x509_invalidate_chain(struct x509_chain *chain)
Invalidate X.509 certificate chain.
Definition x509.h:484
static void x509_root_put(struct x509_root *root)
Drop reference to X.509 root certificate list.
Definition x509.h:404
int x509_check_time(struct x509_certificate *cert, time_t time)
Check X.509 certificate validity period.
Definition x509.c:1287
int x509_append_raw(struct x509_chain *chain, const void *data, size_t len)
Append X.509 certificate to X.509 certificate chain.
Definition x509.c:1674
struct x509_certificate * x509_find_issuer_serial(struct x509_chain *store, const struct asn1_cursor *issuer, const struct asn1_cursor *serial)
Identify X.509 certificate by issuer and serial number.
Definition x509.c:1805
static void x509_chain_put(struct x509_chain *chain)
Drop reference to X.509 certificate chain.
Definition x509.h:300
int x509_append(struct x509_chain *chain, struct x509_certificate *cert)
Append X.509 certificate to X.509 certificate chain.
Definition x509.c:1638
void x509_set_valid(struct x509_certificate *cert, struct x509_certificate *issuer, struct x509_root *root)
Set X.509 certificate as validated.
Definition x509.c:1329
x509_key_usage_bits
X.509 certificate key usage bits.
Definition x509.h:101
@ X509_CRL_SIGN
Definition x509.h:108
@ X509_KEY_CERT_SIGN
Definition x509.h:107
@ X509_DIGITAL_SIGNATURE
Definition x509.h:102
@ X509_KEY_AGREEMENT
Definition x509.h:106
@ X509_ENCIPHER_ONLY
Definition x509.h:109
@ X509_NON_REPUDIATION
Definition x509.h:103
@ X509_DECIPHER_ONLY
Definition x509.h:110
@ X509_DATA_ENCIPHERMENT
Definition x509.h:105
@ X509_KEY_ENCIPHERMENT
Definition x509.h:104