iPXE
Data Structures | Macros | Enumerations | Functions
x509.h File Reference

X.509 certificates. More...

#include <stdint.h>
#include <stddef.h>
#include <time.h>
#include <ipxe/asn1.h>
#include <ipxe/refcnt.h>
#include <ipxe/list.h>

Go to the source code of this file.

Data Structures

struct  x509_serial
 An X.509 serial number. More...
 
struct  x509_issuer
 An X.509 issuer. More...
 
struct  x509_time
 An X.509 time. More...
 
struct  x509_validity
 An X.509 certificate validity period. More...
 
struct  x509_public_key
 An X.509 certificate public key. More...
 
struct  x509_subject
 An X.509 certificate subject. More...
 
struct  x509_signature
 An X.509 certificate signature. More...
 
struct  x509_basic_constraints
 An X.509 certificate basic constraints set. More...
 
struct  x509_key_usage
 An X.509 certificate key usage. More...
 
struct  x509_extended_key_usage
 An X.509 certificate extended key usage. More...
 
struct  x509_ocsp_responder
 X.509 certificate OCSP responder. More...
 
struct  x509_authority_info_access
 X.509 certificate authority information access. More...
 
struct  x509_subject_alt_name
 X.509 certificate subject alternative name. More...
 
struct  x509_extensions
 An X.509 certificate extensions set. More...
 
struct  x509_link
 A link in an X.509 certificate chain. More...
 
struct  x509_chain
 An X.509 certificate chain. More...
 
struct  x509_certificate
 An X.509 certificate. More...
 
struct  x509_extension
 An X.509 extension. More...
 
struct  x509_key_purpose
 An X.509 key purpose. More...
 
struct  x509_access_method
 An X.509 access method. More...
 
struct  x509_root
 An X.509 root certificate list. More...
 

Macros

#define X509_PATH_LEN_UNLIMITED   -2U
 Unlimited path length. More...
 

Enumerations

enum  x509_key_usage_bits {
  X509_DIGITAL_SIGNATURE = 0x0080, X509_NON_REPUDIATION = 0x0040, X509_KEY_ENCIPHERMENT = 0x0020, X509_DATA_ENCIPHERMENT = 0x0010,
  X509_KEY_AGREEMENT = 0x0008, X509_KEY_CERT_SIGN = 0x0004, X509_CRL_SIGN = 0x0002, X509_ENCIPHER_ONLY = 0x0001,
  X509_DECIPHER_ONLY = 0x8000
}
 X.509 certificate key usage bits. More...
 
enum  x509_extended_key_usage_bits { X509_CODE_SIGNING = 0x0001, X509_OCSP_SIGNING = 0x0002 }
 X.509 certificate extended key usage bits. More...
 
enum  x509_general_name_types { X509_GENERAL_NAME_DNS = ASN1_IMPLICIT_TAG ( 2 ), X509_GENERAL_NAME_URI = ASN1_IMPLICIT_TAG ( 6 ), X509_GENERAL_NAME_IP = ASN1_IMPLICIT_TAG ( 7 ) }
 X.509 certificate general name types. More...
 
enum  x509_link_flags { X509_LINK_FL_CROSSED = 0x0001, X509_LINK_FL_OCSPED = 0x0002 }
 X.509 certficate chain link flags. More...
 
enum  x509_flags { X509_FL_PERMANENT = 0x0001, X509_FL_EXPLICIT = 0x0002 }
 X.509 certificate flags. More...
 

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 
static struct x509_certificatex509_get (struct x509_certificate *cert)
 Get reference to X.509 certificate. More...
 
static void x509_put (struct x509_certificate *cert)
 Drop reference to X.509 certificate. More...
 
static struct x509_chainx509_chain_get (struct x509_chain *chain)
 Get reference to X.509 certificate chain. More...
 
static void x509_chain_put (struct x509_chain *chain)
 Drop reference to X.509 certificate chain. More...
 
static struct x509_certificatex509_first (struct x509_chain *chain)
 Get first certificate in X.509 certificate chain. More...
 
static struct x509_certificatex509_last (struct x509_chain *chain)
 Get last certificate in X.509 certificate chain. More...
 
static struct x509_rootx509_root_get (struct x509_root *root)
 Get reference to X.509 root certificate list. More...
 
static void x509_root_put (struct x509_root *root)
 Drop reference to X.509 root certificate list. More...
 
static int x509_is_self_signed (struct x509_certificate *cert)
 Check if X.509 certificate is self-signed. More...
 
const char * x509_name (struct x509_certificate *cert)
 Get X.509 certificate display name. More...
 
int x509_parse (struct x509_certificate *cert, const struct asn1_cursor *raw)
 Parse X.509 certificate from ASN.1 data. More...
 
int x509_certificate (const void *data, size_t len, struct x509_certificate **cert)
 Create X.509 certificate. More...
 
int x509_is_valid (struct x509_certificate *cert, struct x509_root *root)
 Check if X.509 certificate is valid. More...
 
int x509_validate (struct x509_certificate *cert, struct x509_certificate *issuer, time_t time, struct x509_root *root)
 Validate X.509 certificate. More...
 
int x509_check_name (struct x509_certificate *cert, const char *name)
 Check X.509 certificate name. More...
 
struct x509_chainx509_alloc_chain (void)
 Allocate X.509 certificate chain. More...
 
int x509_append (struct x509_chain *chain, struct x509_certificate *cert)
 Append X.509 certificate to X.509 certificate chain. More...
 
int x509_append_raw (struct x509_chain *chain, const void *data, size_t len)
 Append X.509 certificate to X.509 certificate chain. More...
 
void x509_truncate (struct x509_chain *chain, struct x509_link *link)
 Truncate X.509 certificate chain. More...
 
struct x509_certificatex509_find (struct x509_chain *store, const struct asn1_cursor *raw)
 Identify X.509 certificate by raw certificate data. More...
 
struct x509_certificatex509_find_subject (struct x509_chain *store, const struct asn1_cursor *subject)
 Identify X.509 certificate by subject. More...
 
struct x509_certificatex509_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. More...
 
struct x509_certificatex509_find_key (struct x509_chain *store, struct private_key *key)
 Identify X.509 certificate by corresponding public key. More...
 
int x509_auto_append (struct x509_chain *chain, struct x509_chain *store)
 Append X.509 certificates to X.509 certificate chain. More...
 
int x509_validate_chain (struct x509_chain *chain, time_t time, struct x509_chain *store, struct x509_root *root)
 Validate X.509 certificate chain. More...
 
int image_x509 (struct image *image, size_t offset, struct x509_certificate **cert)
 Extract X.509 certificate object from image. More...
 
int x509_check_issuer (struct x509_certificate *cert, struct x509_certificate *issuer)
 Check X.509 certificate against issuer certificate. More...
 
void x509_fingerprint (struct x509_certificate *cert, struct digest_algorithm *digest, void *fingerprint)
 Calculate X.509 certificate fingerprint. More...
 
int x509_check_root (struct x509_certificate *cert, struct x509_root *root)
 Check X.509 root certificate. More...
 
int x509_check_time (struct x509_certificate *cert, time_t time)
 Check X.509 certificate validity period. More...
 
static void x509_invalidate (struct x509_certificate *cert)
 Invalidate X.509 certificate. More...
 
static void x509_invalidate_chain (struct x509_chain *chain)
 Invalidate X.509 certificate chain. More...
 

Detailed Description

X.509 certificates.

Definition in file x509.h.

Macro Definition Documentation

◆ X509_PATH_LEN_UNLIMITED

#define X509_PATH_LEN_UNLIMITED   -2U

Unlimited path length.

We use -2U, since this quantity represents one fewer than the maximum number of remaining certificates in a chain.

Definition at line 89 of file x509.h.

Enumeration Type Documentation

◆ x509_key_usage_bits

X.509 certificate key usage bits.

Enumerator
X509_DIGITAL_SIGNATURE 
X509_NON_REPUDIATION 
X509_KEY_ENCIPHERMENT 
X509_DATA_ENCIPHERMENT 
X509_KEY_AGREEMENT 
X509_KEY_CERT_SIGN 
X509_CRL_SIGN 
X509_ENCIPHER_ONLY 
X509_DECIPHER_ONLY 

Definition at line 100 of file x509.h.

◆ x509_extended_key_usage_bits

X.509 certificate extended key usage bits.

Extended key usages are identified by OID; these bits are purely an internal definition.

Enumerator
X509_CODE_SIGNING 
X509_OCSP_SIGNING 

Definition at line 123 of file x509.h.

123  {
124  X509_CODE_SIGNING = 0x0001,
125  X509_OCSP_SIGNING = 0x0002,
126 };

◆ x509_general_name_types

X.509 certificate general name types.

Enumerator
X509_GENERAL_NAME_DNS 
X509_GENERAL_NAME_URI 
X509_GENERAL_NAME_IP 

Definition at line 149 of file x509.h.

149  {
153 };
#define ASN1_IMPLICIT_TAG(number)
ASN.1 implicit tag.
Definition: asn1.h:95

◆ x509_link_flags

X.509 certficate chain link flags.

Enumerator
X509_LINK_FL_CROSSED 

Cross-signed certificate download has been attempted.

   This indicates that a cross-signature download attempt has
   been made to find a cross-signed issuer for this link's
   certificate.
X509_LINK_FL_OCSPED 

OCSP has been attempted.

   This indicates that an OCSP attempt has been made using
   this link's certificate as an issuer.  (We record the flag
   on the issuer rather than on the issued certificate, since
   we want to retry OCSP if an issuer is replaced with a
   downloaded cross-signed certificate.)

Definition at line 180 of file x509.h.

180  {
181  /** Cross-signed certificate download has been attempted
182  *
183  * This indicates that a cross-signature download attempt has
184  * been made to find a cross-signed issuer for this link's
185  * certificate.
186  */
187  X509_LINK_FL_CROSSED = 0x0001,
188  /** OCSP has been attempted
189  *
190  * This indicates that an OCSP attempt has been made using
191  * this link's certificate as an issuer. (We record the flag
192  * on the issuer rather than on the issued certificate, since
193  * we want to retry OCSP if an issuer is replaced with a
194  * downloaded cross-signed certificate.)
195  */
196  X509_LINK_FL_OCSPED = 0x0002,
197 };
OCSP has been attempted.
Definition: x509.h:196
Cross-signed certificate download has been attempted.
Definition: x509.h:187

◆ x509_flags

enum x509_flags

X.509 certificate flags.

Enumerator
X509_FL_PERMANENT 

Certificate was added at build time.

X509_FL_EXPLICIT 

Certificate was added explicitly at run time.

Definition at line 252 of file x509.h.

252  {
253  /** Certificate was added at build time */
254  X509_FL_PERMANENT = 0x0001,
255  /** Certificate was added explicitly at run time */
256  X509_FL_EXPLICIT = 0x0002,
257 };
Certificate was added at build time.
Definition: x509.h:254
Certificate was added explicitly at run time.
Definition: x509.h:256

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )

◆ x509_get()

static struct x509_certificate* x509_get ( struct x509_certificate cert)
inlinestatic

Get reference to X.509 certificate.

Parameters
certX.509 certificate
Return values
certX.509 certificate

Definition at line 266 of file x509.h.

266  {
267  ref_get ( &cert->refcnt );
268  return cert;
269 }
struct refcnt refcnt
Reference count.
Definition: x509.h:217
#define ref_get(refcnt)
Get additional reference to object.
Definition: refcnt.h:92

References ref_get, and x509_certificate::refcnt.

Referenced by cert_exec(), certstore_add(), ocsp_check(), tls_new_certificate_request(), x509_append(), and x509_certificate().

◆ x509_put()

static void x509_put ( struct x509_certificate cert)
inlinestatic

Drop reference to X.509 certificate.

Parameters
certX.509 certificate

Definition at line 277 of file x509.h.

277  {
278  ref_put ( &cert->refcnt );
279 }
struct refcnt refcnt
Reference count.
Definition: x509.h:217
#define ref_put(refcnt)
Drop reference to object.
Definition: refcnt.h:106

References ref_put, and x509_certificate::refcnt.

Referenced by cert_exec(), certstore_apply_settings(), certstore_del(), cms_test_exec(), icert_free(), image_x509(), ocsp_free(), ocsp_parse_certs(), ocsp_response(), ocsp_test_exec(), tls_new_certificate_request(), x509_append_raw(), x509_cached_okx(), x509_certificate(), x509_test_exec(), and x509_truncate().

◆ x509_chain_get()

static struct x509_chain* x509_chain_get ( struct x509_chain chain)
inlinestatic

Get reference to X.509 certificate chain.

Parameters
chainX.509 certificate chain
Return values
chainX.509 certificate chain

Definition at line 288 of file x509.h.

288  {
289  ref_get ( &chain->refcnt );
290  return chain;
291 }
#define ref_get(refcnt)
Get additional reference to object.
Definition: refcnt.h:92
struct refcnt refcnt
Reference count.
Definition: x509.h:202

References ref_get, and x509_chain::refcnt.

Referenced by create_validator().

◆ x509_chain_put()

static void x509_chain_put ( struct x509_chain chain)
inlinestatic

Drop reference to X.509 certificate chain.

Parameters
chainX.509 certificate chain

Definition at line 299 of file x509.h.

299  {
300  ref_put ( &chain->refcnt );
301 }
struct refcnt refcnt
Reference count.
Definition: x509.h:202
#define ref_put(refcnt)
Drop reference to object.
Definition: refcnt.h:106

References ref_put, and x509_chain::refcnt.

Referenced by cms_free(), free_tls(), tls_new_certificate_request(), tls_parse_chain(), validator_append(), validator_free(), and x509_test_exec().

◆ x509_first()

static struct x509_certificate* x509_first ( struct x509_chain chain)
inlinestatic

Get first certificate in X.509 certificate chain.

Parameters
chainX.509 certificate chain
Return values
certX.509 certificate, or NULL

Definition at line 310 of file x509.h.

310  {
311  struct x509_link *link;
312 
313  link = list_first_entry ( &chain->links, struct x509_link, list );
314  return ( link ? link->cert : NULL );
315 }
struct list_head links
List of links.
Definition: x509.h:204
#define list_first_entry(list, type, member)
Get the container of the first entry in a list.
Definition: list.h:333
u32 link
Link to next descriptor.
Definition: ar9003_mac.h:68
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321

References link, x509_chain::links, x509_link::list, list_first_entry, and NULL.

Referenced by cms_recipient(), cms_verify(), cms_verify_signer(), tls_send_certificate_verify(), tls_validator_done(), validator_name(), and x509_chain_okx().

◆ x509_last()

static struct x509_certificate* x509_last ( struct x509_chain chain)
inlinestatic

Get last certificate in X.509 certificate chain.

Parameters
chainX.509 certificate chain
Return values
certX.509 certificate, or NULL

Definition at line 324 of file x509.h.

324  {
325  struct x509_link *link;
326 
327  link = list_last_entry ( &chain->links, struct x509_link, list );
328  return ( link ? link->cert : NULL );
329 }
struct list_head links
List of links.
Definition: x509.h:204
#define list_last_entry(list, type, member)
Get the container of the last entry in a list.
Definition: list.h:346
u32 link
Link to next descriptor.
Definition: ar9003_mac.h:68
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321

References link, x509_chain::links, x509_link::list, list_last_entry, and NULL.

Referenced by cms_parse_certificates(), tls_parse_chain(), validator_append(), and x509_auto_append().

◆ x509_root_get()

static struct x509_root* x509_root_get ( struct x509_root root)
inlinestatic

Get reference to X.509 root certificate list.

Parameters
rootX.509 root certificate list
Return values
rootX.509 root certificate list

Definition at line 392 of file x509.h.

392  {
393  ref_get ( &root->refcnt );
394  return root;
395 }
struct stp_switch root
Root switch.
Definition: stp.h:26
#define ref_get(refcnt)
Get additional reference to object.
Definition: refcnt.h:92

References ref_get, and root.

Referenced by add_tls(), create_validator(), tls_session(), and x509_set_valid().

◆ x509_root_put()

static void x509_root_put ( struct x509_root root)
inlinestatic

Drop reference to X.509 root certificate list.

Parameters
rootX.509 root certificate list

Definition at line 403 of file x509.h.

403  {
404  ref_put ( &root->refcnt );
405 }
struct stp_switch root
Root switch.
Definition: stp.h:26
#define ref_put(refcnt)
Drop reference to object.
Definition: refcnt.h:106

References ref_put, and root.

Referenced by free_tls(), free_tls_session(), validator_free(), x509_free(), x509_invalidate(), and x509_set_valid().

◆ x509_is_self_signed()

static int x509_is_self_signed ( struct x509_certificate cert)
inlinestatic

Check if X.509 certificate is self-signed.

Parameters
certX.509 certificate
Return values
is_self_signedX.509 certificate is self-signed

Definition at line 413 of file x509.h.

413  {
414  return ( asn1_compare ( &cert->issuer.raw, &cert->subject.raw ) == 0 );
415 }
struct asn1_cursor raw
Raw issuer.
Definition: x509.h:31
int asn1_compare(const struct asn1_cursor *cursor1, const struct asn1_cursor *cursor2)
Compare two ASN.1 objects.
Definition: asn1.c:480
struct x509_issuer issuer
Issuer.
Definition: x509.h:240
struct x509_subject subject
Subject.
Definition: x509.h:244
struct asn1_cursor raw
Raw subject.
Definition: x509.h:61

References asn1_compare(), x509_certificate::issuer, x509_subject::raw, x509_issuer::raw, and x509_certificate::subject.

Referenced by validator_step(), and x509_test_exec().

◆ x509_name()

const char* x509_name ( struct x509_certificate cert)

Get X.509 certificate display name.

Parameters
certX.509 certificate
Return values
nameDisplay name

Definition at line 146 of file x509.c.

146  {
147  struct asn1_cursor *common_name = &cert->subject.common_name;
148  struct digest_algorithm *digest = &sha1_algorithm;
149  static char buf[64];
150  uint8_t fingerprint[ digest->digestsize ];
151  size_t len;
152 
153  len = common_name->len;
154  if ( len ) {
155  /* Certificate has a commonName: use that */
156  if ( len > ( sizeof ( buf ) - 1 /* NUL */ ) )
157  len = ( sizeof ( buf ) - 1 /* NUL */ );
158  memcpy ( buf, common_name->data, len );
159  buf[len] = '\0';
160  } else {
161  /* Certificate has no commonName: use SHA-1 fingerprint */
162  x509_fingerprint ( cert, digest, fingerprint );
163  base16_encode ( fingerprint, sizeof ( fingerprint ),
164  buf, sizeof ( buf ) );
165  }
166  return buf;
167 }
const void * data
Start of data.
Definition: asn1.h:22
size_t len
Length of data.
Definition: asn1.h:24
void * memcpy(void *dest, const void *src, size_t len) __nonnull
struct x509_subject subject
Subject.
Definition: x509.h:244
unsigned char uint8_t
Definition: stdint.h:10
void x509_fingerprint(struct x509_certificate *cert, struct digest_algorithm *digest, void *fingerprint)
Calculate X.509 certificate fingerprint.
Definition: x509.c:1234
struct asn1_cursor common_name
Common name.
Definition: x509.h:63
size_t digestsize
Digest size.
Definition: crypto.h:26
A message digest algorithm.
Definition: crypto.h:18
uint32_t len
Length.
Definition: ena.h:14
An ASN.1 object cursor.
Definition: asn1.h:20
struct digest_algorithm sha1_algorithm
SHA-1 algorithm.
Definition: sha1.c:257

References x509_subject::common_name, asn1_cursor::data, digest_algorithm::digestsize, len, asn1_cursor::len, memcpy(), sha1_algorithm, x509_certificate::subject, and x509_fingerprint().

Referenced by certstat(), certstore_add(), certstore_apply_settings(), certstore_del(), certstore_found(), certstore_init(), cms_parse_certificates(), icert_encode(), ocsp_check_signature(), ocsp_parse_basic_response(), ocsp_parse_cert_id(), ocsp_parse_certs(), ocsp_parse_responder_id(), ocsp_parse_response_status(), ocsp_parse_response_type(), ocsp_parse_responses(), ocsp_request(), ocsp_uri_string(), ocsp_validate(), tls_new_certificate_request(), tls_parse_chain(), tls_send_certificate(), validator_append(), validator_name(), validator_ocsp_validate(), validator_progress(), validator_start_download(), validator_start_ocsp(), validator_step(), x509_append(), x509_check_alt_name(), x509_check_dnsname(), x509_check_ipaddress(), x509_check_issuer(), x509_check_name(), x509_check_root(), x509_check_signature(), x509_check_time(), x509_parse_subject(), and x509_validate().

◆ x509_parse()

int x509_parse ( struct x509_certificate cert,
const struct asn1_cursor raw 
)

Parse X.509 certificate from ASN.1 data.

Parameters
certX.509 certificate
rawASN.1 cursor
Return values
rcReturn status code

Definition at line 1004 of file x509.c.

1005  {
1006  struct x509_signature *signature = &cert->signature;
1007  struct asn1_algorithm **signature_algorithm = &signature->algorithm;
1008  struct asn1_bit_string *signature_value = &signature->value;
1009  struct asn1_cursor cursor;
1010  int rc;
1011 
1012  /* Record raw certificate */
1013  memcpy ( &cursor, raw, sizeof ( cursor ) );
1014  memcpy ( &cert->raw, &cursor, sizeof ( cert->raw ) );
1015 
1016  /* Enter certificate */
1017  asn1_enter ( &cursor, ASN1_SEQUENCE );
1018 
1019  /* Parse tbsCertificate */
1020  if ( ( rc = x509_parse_tbscertificate ( cert, &cursor ) ) != 0 )
1021  return rc;
1022  asn1_skip_any ( &cursor );
1023 
1024  /* Parse signatureAlgorithm */
1025  if ( ( rc = asn1_signature_algorithm ( &cursor,
1026  signature_algorithm ) ) != 0 ) {
1027  DBGC ( cert, "X509 %p could not parse signature algorithm: "
1028  "%s\n", cert, strerror ( rc ) );
1029  return rc;
1030  }
1031  DBGC2 ( cert, "X509 %p signatureAlgorithm is %s\n",
1032  cert, (*signature_algorithm)->name );
1033  asn1_skip_any ( &cursor );
1034 
1035  /* Parse signatureValue */
1036  if ( ( rc = asn1_integral_bit_string ( &cursor,
1037  signature_value ) ) != 0 ) {
1038  DBGC ( cert, "X509 %p could not parse signature value: %s\n",
1039  cert, strerror ( rc ) );
1040  return rc;
1041  }
1042  DBGC2 ( cert, "X509 %p signatureValue is:\n", cert );
1043  DBGC2_HDA ( cert, 0, signature_value->data, signature_value->len );
1044 
1045  /* Check that algorithm in tbsCertificate matches algorithm in
1046  * signature
1047  */
1048  if ( signature->algorithm != (*signature_algorithm) ) {
1049  DBGC ( cert, "X509 %p signature algorithm %s does not match "
1050  "signatureAlgorithm %s\n",
1051  cert, signature->algorithm->name,
1052  (*signature_algorithm)->name );
1053  return -EINVAL_ALGORITHM_MISMATCH;
1054  }
1055 
1056  return 0;
1057 }
const void * data
Data.
Definition: asn1.h:433
An ASN.1 OID-identified algorithm.
Definition: asn1.h:377
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
int asn1_enter(struct asn1_cursor *cursor, unsigned int type)
Enter ASN.1 object.
Definition: asn1.c:205
#define DBGC(...)
Definition: compiler.h:505
int asn1_skip_any(struct asn1_cursor *cursor)
Skip ASN.1 object of any type.
Definition: asn1.c:313
int asn1_signature_algorithm(const struct asn1_cursor *cursor, struct asn1_algorithm **algorithm)
Parse ASN.1 OID-identified signature algorithm.
Definition: asn1.c:646
void * memcpy(void *dest, const void *src, size_t len) __nonnull
struct x509_signature signature
Signature.
Definition: x509.h:246
#define DBGC2_HDA(...)
Definition: compiler.h:523
int asn1_integral_bit_string(const struct asn1_cursor *cursor, struct asn1_bit_string *bits)
Parse ASN.1 bit string that must be an integral number of bytes.
Definition: asn1.c:451
static int x509_parse_tbscertificate(struct x509_certificate *cert, const struct asn1_cursor *raw)
Parse X.509 certificate tbsCertificate.
Definition: x509.c:934
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
size_t len
Length.
Definition: asn1.h:435
#define ASN1_SEQUENCE
ASN.1 sequence.
Definition: asn1.h:89
#define DBGC2(...)
Definition: compiler.h:522
#define EINVAL_ALGORITHM_MISMATCH
Definition: x509.c:70
__be32 raw[7]
Definition: CIB_PRM.h:28
struct asn1_cursor raw
Raw certificate.
Definition: x509.h:230
u8 signature
CPU signature.
Definition: CIB_PRM.h:35
An ASN.1 object cursor.
Definition: asn1.h:20
An ASN.1 bit string.
Definition: asn1.h:431
An X.509 certificate signature.
Definition: x509.h:69

References asn1_enter(), asn1_integral_bit_string(), ASN1_SEQUENCE, asn1_signature_algorithm(), asn1_skip_any(), asn1_bit_string::data, DBGC, DBGC2, DBGC2_HDA, EINVAL_ALGORITHM_MISMATCH, asn1_bit_string::len, memcpy(), raw, x509_certificate::raw, rc, signature, x509_certificate::signature, strerror(), and x509_parse_tbscertificate().

Referenced by certstore_init(), and x509_certificate().

◆ x509_certificate()

int x509_certificate ( const void *  data,
size_t  len,
struct x509_certificate **  cert 
)

Create X.509 certificate.

Parameters
dataRaw certificate data
lenLength of raw data
Return values
certX.509 certificate
rcReturn status code

On success, the caller holds a reference to the X.509 certificate, and is responsible for ultimately calling x509_put().

Definition at line 1070 of file x509.c.

1071  {
1072  struct asn1_cursor cursor;
1073  void *raw;
1074  int rc;
1075 
1076  /* Initialise cursor */
1077  cursor.data = data;
1078  cursor.len = len;
1079  asn1_shrink_any ( &cursor );
1080 
1081  /* Return stored certificate, if present */
1082  if ( ( *cert = x509_find ( NULL, &cursor ) ) != NULL ) {
1083 
1084  /* Add caller's reference */
1085  x509_get ( *cert );
1086  return 0;
1087  }
1088 
1089  /* Allocate and initialise certificate */
1090  *cert = zalloc ( sizeof ( **cert ) + cursor.len );
1091  if ( ! *cert )
1092  return -ENOMEM;
1093  ref_init ( &(*cert)->refcnt, x509_free );
1094  raw = ( *cert + 1 );
1095 
1096  /* Copy raw data */
1097  memcpy ( raw, cursor.data, cursor.len );
1098  cursor.data = raw;
1099 
1100  /* Parse certificate */
1101  if ( ( rc = x509_parse ( *cert, &cursor ) ) != 0 ) {
1102  x509_put ( *cert );
1103  *cert = NULL;
1104  return rc;
1105  }
1106 
1107  /* Add certificate to store */
1108  certstore_add ( *cert );
1109 
1110  return 0;
1111 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
static struct x509_certificate * x509_get(struct x509_certificate *cert)
Get reference to X.509 certificate.
Definition: x509.h:266
static void x509_free(struct refcnt *refcnt)
Free X.509 certificate.
Definition: x509.c:132
#define ref_init(refcnt, free)
Initialise a reference counter.
Definition: refcnt.h:64
void certstore_add(struct x509_certificate *cert)
Add certificate to store.
Definition: certstore.c:100
#define ENOMEM
Not enough space.
Definition: errno.h:534
void * memcpy(void *dest, const void *src, size_t len) __nonnull
void * zalloc(size_t size)
Allocate cleared memory.
Definition: malloc.c:640
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:1732
int asn1_shrink_any(struct asn1_cursor *cursor)
Shrink ASN.1 object of any type.
Definition: asn1.c:323
static void x509_put(struct x509_certificate *cert)
Drop reference to X.509 certificate.
Definition: x509.h:277
uint8_t data[48]
Additional event data.
Definition: ena.h:22
__be32 raw[7]
Definition: CIB_PRM.h:28
struct arbelprm_wqe_segment_data_ptr data[ARBEL_MAX_GATHER]
Definition: arbel.h:237
uint32_t len
Length.
Definition: ena.h:14
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
An ASN.1 object cursor.
Definition: asn1.h:20
int x509_parse(struct x509_certificate *cert, const struct asn1_cursor *raw)
Parse X.509 certificate from ASN.1 data.
Definition: x509.c:1004

References asn1_shrink_any(), certstore_add(), data, asn1_cursor::data, ENOMEM, len, asn1_cursor::len, memcpy(), NULL, raw, rc, ref_init, x509_find(), x509_free(), x509_get(), x509_parse(), x509_put(), and zalloc().

◆ x509_is_valid()

int x509_is_valid ( struct x509_certificate cert,
struct x509_root root 
)

Check if X.509 certificate is valid.

Parameters
certX.509 certificate
rootRoot certificate list, or NULL to use default

Definition at line 1310 of file x509.c.

1310  {
1311 
1312  /* Use default root certificate store if none specified */
1313  if ( ! root )
1315 
1316  return ( cert->root == root );
1317 }
struct stp_switch root
Root switch.
Definition: stp.h:26
struct x509_root root_certificates
Root certificates.
Definition: rootcert.c:73
struct x509_root * root
Root against which certificate has been validated (if any)
Definition: x509.h:225

References root, x509_certificate::root, and root_certificates.

Referenced by certstat(), ipair_window_changed(), validator_step(), x509_validate(), and x509_validate_chain_okx().

◆ x509_validate()

int x509_validate ( struct x509_certificate cert,
struct x509_certificate issuer,
time_t  time,
struct x509_root root 
)

Validate X.509 certificate.

Parameters
certX.509 certificate
issuerIssuing X.509 certificate (or NULL)
timeTime at which to validate certificate
rootRoot certificate list, or NULL to use default
Return values
rcReturn status code

The issuing certificate must have already been validated.

Validation results are cached: if a certificate has already been successfully validated then issuer, time, and root will be ignored.

Definition at line 1363 of file x509.c.

1365  {
1366  int rc;
1367 
1368  /* Use default root certificate store if none specified */
1369  if ( ! root )
1371 
1372  /* Return success if certificate has already been validated */
1373  if ( x509_is_valid ( cert, root ) )
1374  return 0;
1375 
1376  /* Fail if certificate is invalid at specified time */
1377  if ( ( rc = x509_check_time ( cert, time ) ) != 0 )
1378  return rc;
1379 
1380  /* Succeed if certificate is a trusted root certificate */
1381  if ( x509_check_root ( cert, root ) == 0 ) {
1382  x509_set_valid ( cert, NULL, root );
1383  return 0;
1384  }
1385 
1386  /* Fail unless we have an issuer */
1387  if ( ! issuer ) {
1388  DBGC2 ( cert, "X509 %p \"%s\" has no trusted issuer\n",
1389  cert, x509_name ( cert ) );
1390  return -EACCES_UNTRUSTED;
1391  }
1392 
1393  /* Fail unless issuer has already been validated */
1394  if ( ! x509_is_valid ( issuer, root ) ) {
1395  DBGC ( cert, "X509 %p \"%s\" ", cert, x509_name ( cert ) );
1396  DBGC ( cert, "issuer %p \"%s\" has not yet been validated\n",
1397  issuer, x509_name ( issuer ) );
1398  return -EACCES_OUT_OF_ORDER;
1399  }
1400 
1401  /* Fail if issuing certificate cannot validate this certificate */
1402  if ( ( rc = x509_check_issuer ( cert, issuer ) ) != 0 )
1403  return rc;
1404 
1405  /* Fail if path length constraint is violated */
1406  if ( issuer->path_remaining == 0 ) {
1407  DBGC ( cert, "X509 %p \"%s\" ", cert, x509_name ( cert ) );
1408  DBGC ( cert, "issuer %p \"%s\" path length exceeded\n",
1409  issuer, x509_name ( issuer ) );
1410  return -EACCES_PATH_LEN;
1411  }
1412 
1413  /* Fail if OCSP is required */
1414  if ( ocsp_required ( cert ) ) {
1415  DBGC ( cert, "X509 %p \"%s\" requires an OCSP check\n",
1416  cert, x509_name ( cert ) );
1417  return -EACCES_OCSP_REQUIRED;
1418  }
1419 
1420  /* Mark certificate as valid */
1421  x509_set_valid ( cert, issuer, root );
1422 
1423  DBGC ( cert, "X509 %p \"%s\" successfully validated using ",
1424  cert, x509_name ( cert ) );
1425  DBGC ( cert, "issuer %p \"%s\"\n", issuer, x509_name ( issuer ) );
1426  return 0;
1427 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
unsigned int path_remaining
Maximum number of subsequent certificates in chain.
Definition: x509.h:227
struct stp_switch root
Root switch.
Definition: stp.h:26
static 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:1326
struct x509_root root_certificates
Root certificates.
Definition: rootcert.c:73
#define DBGC(...)
Definition: compiler.h:505
int x509_is_valid(struct x509_certificate *cert, struct x509_root *root)
Check if X.509 certificate is valid.
Definition: x509.c:1310
static int ocsp_required(struct x509_certificate *cert)
Check if X.509 certificate requires an OCSP check.
Definition: ocsp.h:128
#define EACCES_OCSP_REQUIRED
Definition: x509.c:114
#define EACCES_OUT_OF_ORDER
Definition: x509.c:106
#define EACCES_PATH_LEN
Definition: x509.c:98
int x509_check_root(struct x509_certificate *cert, struct x509_root *root)
Check X.509 root certificate.
Definition: x509.c:1252
const char * x509_name(struct x509_certificate *cert)
Get X.509 certificate display name.
Definition: x509.c:146
#define DBGC2(...)
Definition: compiler.h:522
int x509_check_issuer(struct x509_certificate *cert, struct x509_certificate *issuer)
Check X.509 certificate against issuer certificate.
Definition: x509.c:1174
#define EACCES_UNTRUSTED
Definition: x509.c:102
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
int x509_check_time(struct x509_certificate *cert, time_t time)
Check X.509 certificate validity period.
Definition: x509.c:1284

References DBGC, DBGC2, EACCES_OCSP_REQUIRED, EACCES_OUT_OF_ORDER, EACCES_PATH_LEN, EACCES_UNTRUSTED, NULL, ocsp_required(), x509_certificate::path_remaining, rc, root, root_certificates, x509_check_issuer(), x509_check_root(), x509_check_time(), x509_is_valid(), x509_name(), and x509_set_valid().

Referenced by ocsp_validate(), and x509_validate_chain().

◆ x509_check_name()

int x509_check_name ( struct x509_certificate cert,
const char *  name 
)

Check X.509 certificate name.

Parameters
certX.509 certificate
nameName
Return values
rcReturn status code

Definition at line 1561 of file x509.c.

1561  {
1562  struct asn1_cursor *common_name = &cert->subject.common_name;
1563  struct asn1_cursor alt_name;
1564  int rc;
1565 
1566  /* Check commonName */
1567  if ( x509_check_dnsname ( cert, common_name, name ) == 0 ) {
1568  DBGC2 ( cert, "X509 %p \"%s\" commonName matches \"%s\"\n",
1569  cert, x509_name ( cert ), name );
1570  return 0;
1571  }
1572 
1573  /* Check any subjectAlternativeNames */
1574  memcpy ( &alt_name, &cert->extensions.alt_name.names,
1575  sizeof ( alt_name ) );
1576  for ( ; alt_name.len ; asn1_skip_any ( &alt_name ) ) {
1577  if ( ( rc = x509_check_alt_name ( cert, &alt_name,
1578  name ) ) == 0 ) {
1579  DBGC2 ( cert, "X509 %p \"%s\" subjectAltName matches "
1580  "\"%s\"\n", cert, x509_name ( cert ), name );
1581  return 0;
1582  }
1583  }
1584 
1585  DBGC ( cert, "X509 %p \"%s\" does not match name \"%s\"\n",
1586  cert, x509_name ( cert ), name );
1587  return -EACCES_WRONG_NAME;
1588 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
const char * name
Definition: ath9k_hw.c:1984
struct asn1_cursor names
Names.
Definition: x509.h:145
static int x509_check_alt_name(struct x509_certificate *cert, const struct asn1_cursor *raw, const char *name)
Check X.509 certificate alternative name.
Definition: x509.c:1529
#define DBGC(...)
Definition: compiler.h:505
int asn1_skip_any(struct asn1_cursor *cursor)
Skip ASN.1 object of any type.
Definition: asn1.c:313
void * memcpy(void *dest, const void *src, size_t len) __nonnull
#define EACCES_WRONG_NAME
Definition: x509.c:118
static int x509_check_dnsname(struct x509_certificate *cert, const struct asn1_cursor *raw, const char *name)
Check X.509 certificate alternative dNSName.
Definition: x509.c:1437
struct x509_subject subject
Subject.
Definition: x509.h:244
struct asn1_cursor common_name
Common name.
Definition: x509.h:63
const char * x509_name(struct x509_certificate *cert)
Get X.509 certificate display name.
Definition: x509.c:146
struct x509_subject_alt_name alt_name
Subject alternative name.
Definition: x509.h:166
#define DBGC2(...)
Definition: compiler.h:522
An ASN.1 object cursor.
Definition: asn1.h:20
struct x509_extensions extensions
Extensions.
Definition: x509.h:248

References x509_extensions::alt_name, asn1_skip_any(), x509_subject::common_name, DBGC, DBGC2, EACCES_WRONG_NAME, x509_certificate::extensions, asn1_cursor::len, memcpy(), name, x509_subject_alt_name::names, rc, x509_certificate::subject, x509_check_alt_name(), x509_check_dnsname(), and x509_name().

Referenced by cert_exec(), cms_verify(), tls_validator_done(), x509_check_name_fail_okx(), and x509_check_name_okx().

◆ x509_alloc_chain()

struct x509_chain* x509_alloc_chain ( void  )

Allocate X.509 certificate chain.

Return values
chainX.509 certificate chain, or NULL

Definition at line 1612 of file x509.c.

1612  {
1613  struct x509_chain *chain;
1614 
1615  /* Allocate chain */
1616  chain = zalloc ( sizeof ( *chain ) );
1617  if ( ! chain )
1618  return NULL;
1619 
1620  /* Initialise chain */
1621  ref_init ( &chain->refcnt, x509_free_chain );
1622  INIT_LIST_HEAD ( &chain->links );
1623 
1624  DBGC2 ( chain, "X509 chain %p allocated\n", chain );
1625  return chain;
1626 }
struct list_head links
List of links.
Definition: x509.h:204
#define ref_init(refcnt, free)
Initialise a reference counter.
Definition: refcnt.h:64
static void x509_free_chain(struct refcnt *refcnt)
Free X.509 certificate chain.
Definition: x509.c:1595
An X.509 certificate chain.
Definition: x509.h:200
void * zalloc(size_t size)
Allocate cleared memory.
Definition: malloc.c:640
#define INIT_LIST_HEAD(list)
Initialise a list head.
Definition: list.h:45
#define DBGC2(...)
Definition: compiler.h:522
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
struct refcnt refcnt
Reference count.
Definition: x509.h:202

References DBGC2, INIT_LIST_HEAD, x509_chain::links, NULL, ref_init, x509_chain::refcnt, x509_free_chain(), and zalloc().

Referenced by cms_parse_participants(), cms_parse_signed(), tls_new_certificate_request(), tls_parse_chain(), validator_append(), and x509_chain_okx().

◆ x509_append()

int x509_append ( struct x509_chain chain,
struct x509_certificate cert 
)

Append X.509 certificate to X.509 certificate chain.

Parameters
chainX.509 certificate chain
certX.509 certificate
Return values
rcReturn status code

Definition at line 1635 of file x509.c.

1635  {
1636  struct x509_link *link;
1637 
1638  /* Allocate link */
1639  link = zalloc ( sizeof ( *link ) );
1640  if ( ! link )
1641  return -ENOMEM;
1642 
1643  /* Add link to chain */
1644  link->cert = x509_get ( cert );
1645  list_add_tail ( &link->list, &chain->links );
1646  DBGC ( chain, "X509 chain %p added X509 %p \"%s\"\n",
1647  chain, cert, x509_name ( cert ) );
1648 
1649  return 0;
1650 }
static struct x509_certificate * x509_get(struct x509_certificate *cert)
Get reference to X.509 certificate.
Definition: x509.h:266
struct list_head links
List of links.
Definition: x509.h:204
#define DBGC(...)
Definition: compiler.h:505
#define ENOMEM
Not enough space.
Definition: errno.h:534
#define list_add_tail(new, head)
Add a new entry to the tail of a list.
Definition: list.h:93
u32 link
Link to next descriptor.
Definition: ar9003_mac.h:68
void * zalloc(size_t size)
Allocate cleared memory.
Definition: malloc.c:640
const char * x509_name(struct x509_certificate *cert)
Get X.509 certificate display name.
Definition: x509.c:146

References x509_link::cert, DBGC, ENOMEM, link, x509_chain::links, list_add_tail, x509_get(), x509_name(), and zalloc().

Referenced by cms_parse_identifier(), tls_new_certificate_request(), x509_append_raw(), x509_auto_append(), and x509_chain_okx().

◆ x509_append_raw()

int x509_append_raw ( struct x509_chain chain,
const void *  data,
size_t  len 
)

Append X.509 certificate to X.509 certificate chain.

Parameters
chainX.509 certificate chain
dataRaw certificate data
lenLength of raw data
Return values
rcReturn status code

Definition at line 1660 of file x509.c.

1661  {
1662  struct x509_certificate *cert;
1663  int rc;
1664 
1665  /* Parse certificate */
1666  if ( ( rc = x509_certificate ( data, len, &cert ) ) != 0 )
1667  goto err_parse;
1668 
1669  /* Append certificate to chain */
1670  if ( ( rc = x509_append ( chain, cert ) ) != 0 )
1671  goto err_append;
1672 
1673  /* Drop reference to certificate */
1674  x509_put ( cert );
1675 
1676  return 0;
1677 
1678  err_append:
1679  x509_put ( cert );
1680  err_parse:
1681  return rc;
1682 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
int x509_append(struct x509_chain *chain, struct x509_certificate *cert)
Append X.509 certificate to X.509 certificate chain.
Definition: x509.c:1635
An X.509 certificate.
Definition: x509.h:215
static void x509_put(struct x509_certificate *cert)
Drop reference to X.509 certificate.
Definition: x509.h:277
uint8_t data[48]
Additional event data.
Definition: ena.h:22
uint32_t len
Length.
Definition: ena.h:14

References data, len, rc, x509_append(), and x509_put().

Referenced by cms_parse_certificates(), tls_parse_chain(), and validator_append().

◆ x509_truncate()

void x509_truncate ( struct x509_chain chain,
struct x509_link link 
)

Truncate X.509 certificate chain.

Parameters
chainX.509 certificate chain
linkLink after which to truncate chain, or NULL

Definition at line 1690 of file x509.c.

1690  {
1691  struct x509_link *tmp;
1692 
1693  /* Truncate entire chain if no link is specified */
1694  if ( ! link )
1695  link = list_entry ( &chain->links, struct x509_link, list );
1696 
1697  /* Free each link in the chain */
1699  x509_put ( link->cert );
1700  list_del ( &link->list );
1701  free ( link );
1702  }
1703 }
struct list_head links
List of links.
Definition: x509.h:204
unsigned long tmp
Definition: linux_pci.h:63
#define list_del(list)
Delete an entry from a list.
Definition: list.h:119
#define list_for_each_entry_safe_continue(pos, tmp, head, member)
Iterate over subsequent entries in a list, safe against deletion.
Definition: list.h:500
u32 link
Link to next descriptor.
Definition: ar9003_mac.h:68
static void(* free)(struct refcnt *refcnt))
Definition: refcnt.h:54
static void x509_put(struct x509_certificate *cert)
Drop reference to X.509 certificate.
Definition: x509.h:277
#define list_entry(list, type, member)
Get the container of a list entry.
Definition: list.h:321

References free, link, x509_chain::links, x509_link::list, list_del, list_entry, list_for_each_entry_safe_continue, tmp, and x509_put().

Referenced by validator_append(), x509_free_chain(), and x509_test_exec().

◆ x509_find()

struct x509_certificate* x509_find ( struct x509_chain store,
const struct asn1_cursor raw 
)

Identify X.509 certificate by raw certificate data.

Parameters
storeCertificate store, or NULL to use default
rawRaw certificate data
Return values
certX.509 certificate, or NULL if not found

Definition at line 1732 of file x509.c.

1733  {
1734  struct x509_link *link;
1735  struct x509_certificate *cert;
1736 
1737  /* Use default certificate store if none specified */
1738  if ( ! store )
1739  store = &certstore;
1740 
1741  /* Search for certificate within store */
1742  list_for_each_entry ( link, &store->links, list ) {
1743 
1744  /* Check raw certificate data */
1745  cert = link->cert;
1746  if ( asn1_compare ( raw, &cert->raw ) == 0 )
1747  return x509_found ( store, cert );
1748  }
1749 
1750  return NULL;
1751 }
int asn1_compare(const struct asn1_cursor *cursor1, const struct asn1_cursor *cursor2)
Compare two ASN.1 objects.
Definition: asn1.c:480
struct x509_chain certstore
Certificate store.
Definition: certstore.c:89
#define list_for_each_entry(pos, head, member)
Iterate over entries in a list.
Definition: list.h:431
u32 link
Link to next descriptor.
Definition: ar9003_mac.h:68
An X.509 certificate.
Definition: x509.h:215
struct x509_link store
Link in certificate store.
Definition: x509.h:220
__be32 raw[7]
Definition: CIB_PRM.h:28
static struct x509_certificate * x509_found(struct x509_chain *store, struct x509_certificate *cert)
Mark X.509 certificate as found.
Definition: x509.c:1712
struct asn1_cursor raw
Raw certificate.
Definition: x509.h:230
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321

References asn1_compare(), certstore, link, list_for_each_entry, NULL, raw, x509_certificate::raw, x509_certificate::store, and x509_found().

Referenced by certstore_init(), and x509_certificate().

◆ x509_find_subject()

struct x509_certificate* x509_find_subject ( struct x509_chain store,
const struct asn1_cursor subject 
)

Identify X.509 certificate by subject.

Parameters
storeCertificate store, or NULL to use default
subjectSubject
Return values
certX.509 certificate, or NULL if not found

Definition at line 1761 of file x509.c.

1762  {
1763  struct x509_link *link;
1764  struct x509_certificate *cert;
1765 
1766  /* Use default certificate store if none specified */
1767  if ( ! store )
1768  store = &certstore;
1769 
1770  /* Scan through certificate list */
1771  list_for_each_entry ( link, &store->links, list ) {
1772 
1773  /* Check subject */
1774  cert = link->cert;
1775  if ( asn1_compare ( subject, &cert->subject.raw ) == 0 )
1776  return x509_found ( store, cert );
1777  }
1778 
1779  return NULL;
1780 }
int asn1_compare(const struct asn1_cursor *cursor1, const struct asn1_cursor *cursor2)
Compare two ASN.1 objects.
Definition: asn1.c:480
struct x509_chain certstore
Certificate store.
Definition: certstore.c:89
#define list_for_each_entry(pos, head, member)
Iterate over entries in a list.
Definition: list.h:431
u32 link
Link to next descriptor.
Definition: ar9003_mac.h:68
An X.509 certificate.
Definition: x509.h:215
struct x509_subject subject
Subject.
Definition: x509.h:244
struct asn1_cursor raw
Raw subject.
Definition: x509.h:61
struct x509_link store
Link in certificate store.
Definition: x509.h:220
static struct x509_certificate * x509_found(struct x509_chain *store, struct x509_certificate *cert)
Mark X.509 certificate as found.
Definition: x509.c:1712
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321

References asn1_compare(), certstore, link, list_for_each_entry, NULL, x509_subject::raw, x509_certificate::store, x509_certificate::subject, and x509_found().

Referenced by x509_auto_append().

◆ x509_find_issuer_serial()

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.

Parameters
storeCertificate store, or NULL to use default
issuerIssuer
serialSerial number
Return values
certX.509 certificate, or NULL if not found

Definition at line 1791 of file x509.c.

1793  {
1794  struct x509_link *link;
1795  struct x509_certificate *cert;
1796 
1797  /* Use default certificate store if none specified */
1798  if ( ! store )
1799  store = &certstore;
1800 
1801  /* Scan through certificate list */
1802  list_for_each_entry ( link, &store->links, list ) {
1803 
1804  /* Check issuer and serial number */
1805  cert = link->cert;
1806  if ( ( asn1_compare ( issuer, &cert->issuer.raw ) == 0 ) &&
1807  ( asn1_compare ( serial, &cert->serial.raw ) == 0 ) )
1808  return x509_found ( store, cert );
1809  }
1810 
1811  return NULL;
1812 }
struct asn1_cursor raw
Raw issuer.
Definition: x509.h:31
int asn1_compare(const struct asn1_cursor *cursor1, const struct asn1_cursor *cursor2)
Compare two ASN.1 objects.
Definition: asn1.c:480
struct x509_chain certstore
Certificate store.
Definition: certstore.c:89
struct x509_issuer issuer
Issuer.
Definition: x509.h:240
struct asn1_cursor raw
Raw serial number.
Definition: x509.h:25
#define list_for_each_entry(pos, head, member)
Iterate over entries in a list.
Definition: list.h:431
u32 link
Link to next descriptor.
Definition: ar9003_mac.h:68
An X.509 certificate.
Definition: x509.h:215
struct x509_serial serial
Serial number.
Definition: x509.h:234
uint64_t serial
Serial number.
Definition: edd.h:30
struct x509_link store
Link in certificate store.
Definition: x509.h:220
static struct x509_certificate * x509_found(struct x509_chain *store, struct x509_certificate *cert)
Mark X.509 certificate as found.
Definition: x509.c:1712
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321

References asn1_compare(), certstore, x509_certificate::issuer, link, list_for_each_entry, NULL, x509_issuer::raw, x509_serial::raw, serial, x509_certificate::serial, x509_certificate::store, and x509_found().

Referenced by cms_parse_identifier().

◆ x509_find_key()

struct x509_certificate* x509_find_key ( struct x509_chain store,
struct private_key key 
)

Identify X.509 certificate by corresponding public key.

Parameters
storeCertificate store, or NULL to use default
keyPrivate key
Return values
certX.509 certificate, or NULL if not found

Definition at line 1821 of file x509.c.

1822  {
1823  struct x509_link *link;
1824  struct x509_certificate *cert;
1825 
1826  /* Use default certificate store if none specified */
1827  if ( ! store )
1828  store = &certstore;
1829 
1830  /* Scan through certificate list */
1831  list_for_each_entry ( link, &store->links, list ) {
1832 
1833  /* Check public key */
1834  cert = link->cert;
1835  if ( pubkey_match ( cert->signature_algorithm->pubkey,
1836  privkey_cursor ( key ),
1837  &cert->subject.public_key.raw ) == 0 )
1838  return x509_found ( store, cert );
1839  }
1840 
1841  return NULL;
1842 }
struct asn1_cursor raw
Raw public key information.
Definition: x509.h:51
struct x509_chain certstore
Certificate store.
Definition: certstore.c:89
struct asn1_algorithm * signature_algorithm
Signature algorithm.
Definition: x509.h:238
static int pubkey_match(struct pubkey_algorithm *pubkey, const struct asn1_cursor *private_key, const struct asn1_cursor *public_key)
Definition: crypto.h:303
static struct asn1_cursor * privkey_cursor(struct private_key *key)
Get private key ASN.1 cursor.
Definition: privkey.h:52
struct pubkey_algorithm * pubkey
Public-key algorithm (if applicable)
Definition: asn1.h:383
#define list_for_each_entry(pos, head, member)
Iterate over entries in a list.
Definition: list.h:431
u32 link
Link to next descriptor.
Definition: ar9003_mac.h:68
struct x509_public_key public_key
Public key information.
Definition: x509.h:65
An X.509 certificate.
Definition: x509.h:215
struct x509_subject subject
Subject.
Definition: x509.h:244
struct x509_link store
Link in certificate store.
Definition: x509.h:220
static struct x509_certificate * x509_found(struct x509_chain *store, struct x509_certificate *cert)
Mark X.509 certificate as found.
Definition: x509.c:1712
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
union @383 key
Sense key.
Definition: scsi.h:18

References certstore, key, link, list_for_each_entry, NULL, privkey_cursor(), asn1_algorithm::pubkey, pubkey_match(), x509_subject::public_key, x509_public_key::raw, x509_certificate::signature_algorithm, x509_certificate::store, x509_certificate::subject, and x509_found().

Referenced by cms_keypair_okx(), cms_recipient(), and tls_new_certificate_request().

◆ x509_auto_append()

int x509_auto_append ( struct x509_chain chain,
struct x509_chain store 
)

Append X.509 certificates to X.509 certificate chain.

Parameters
chainX.509 certificate chain
storeCertificate store, or NULL to use default
Return values
rcReturn status code

Certificates will be automatically appended to the chain based upon the subject and issuer names.

Definition at line 1854 of file x509.c.

1854  {
1855  struct x509_certificate *cert;
1856  struct x509_certificate *previous;
1857  int rc;
1858 
1859  /* Get current certificate */
1860  cert = x509_last ( chain );
1861  if ( ! cert ) {
1862  DBGC ( chain, "X509 chain %p has no certificates\n", chain );
1863  return -EACCES_EMPTY;
1864  }
1865 
1866  /* Append certificates, in order */
1867  while ( 1 ) {
1868 
1869  /* Find issuing certificate */
1870  previous = cert;
1871  cert = x509_find_subject ( store, &cert->issuer.raw );
1872  if ( ! cert )
1873  break;
1874  if ( cert == previous )
1875  break;
1876 
1877  /* Append certificate to chain */
1878  if ( ( rc = x509_append ( chain, cert ) ) != 0 )
1879  return rc;
1880  }
1881 
1882  return 0;
1883 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
struct asn1_cursor raw
Raw issuer.
Definition: x509.h:31
#define EACCES_EMPTY
Definition: x509.c:110
struct x509_issuer issuer
Issuer.
Definition: x509.h:240
#define DBGC(...)
Definition: compiler.h:505
int x509_append(struct x509_chain *chain, struct x509_certificate *cert)
Append X.509 certificate to X.509 certificate chain.
Definition: x509.c:1635
static struct x509_certificate * x509_last(struct x509_chain *chain)
Get last certificate in X.509 certificate chain.
Definition: x509.h:324
An X.509 certificate.
Definition: x509.h:215
struct x509_certificate * x509_find_subject(struct x509_chain *store, const struct asn1_cursor *subject)
Identify X.509 certificate by subject.
Definition: x509.c:1761
struct x509_link store
Link in certificate store.
Definition: x509.h:220

References DBGC, EACCES_EMPTY, x509_certificate::issuer, x509_issuer::raw, rc, x509_certificate::store, x509_append(), x509_find_subject(), and x509_last().

Referenced by cms_parse_identifier(), tls_new_certificate_request(), validator_append(), and x509_validate_chain().

◆ x509_validate_chain()

int x509_validate_chain ( struct x509_chain chain,
time_t  time,
struct x509_chain store,
struct x509_root root 
)

Validate X.509 certificate chain.

Parameters
chainX.509 certificate chain
timeTime at which to validate certificates
storeCertificate store, or NULL to use default
rootRoot certificate list, or NULL to use default
Return values
rcReturn status code

Definition at line 1894 of file x509.c.

1895  {
1896  struct x509_certificate *issuer = NULL;
1897  struct x509_link *link;
1898  int rc;
1899 
1900  /* Append any applicable certificates from the certificate store */
1901  if ( ( rc = x509_auto_append ( chain, store ) ) != 0 )
1902  return rc;
1903 
1904  /* Find first certificate that can be validated as a
1905  * standalone (i.e. is already valid, or can be validated as
1906  * a trusted root certificate).
1907  */
1908  list_for_each_entry ( link, &chain->links, list ) {
1909 
1910  /* Try validating this certificate as a standalone */
1911  if ( ( rc = x509_validate ( link->cert, NULL, time,
1912  root ) ) != 0 )
1913  continue;
1914 
1915  /* Work back up to start of chain, performing pairwise
1916  * validation.
1917  */
1918  issuer = link->cert;
1920  list ) {
1921 
1922  /* Validate this certificate against its issuer */
1923  if ( ( rc = x509_validate ( link->cert, issuer, time,
1924  root ) ) != 0 )
1925  return rc;
1926  issuer = link->cert;
1927  }
1928 
1929  return 0;
1930  }
1931 
1932  DBGC ( chain, "X509 chain %p found no usable certificates\n", chain );
1933  return -EACCES_USELESS;
1934 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
struct stp_switch root
Root switch.
Definition: stp.h:26
struct list_head links
List of links.
Definition: x509.h:204
struct x509_issuer issuer
Issuer.
Definition: x509.h:240
#define DBGC(...)
Definition: compiler.h:505
#define list_for_each_entry(pos, head, member)
Iterate over entries in a list.
Definition: list.h:431
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:1363
u32 link
Link to next descriptor.
Definition: ar9003_mac.h:68
int x509_auto_append(struct x509_chain *chain, struct x509_chain *store)
Append X.509 certificates to X.509 certificate chain.
Definition: x509.c:1854
An X.509 certificate.
Definition: x509.h:215
#define list_for_each_entry_continue_reverse(pos, head, member)
Iterate over entries in a list in reverse, starting after current position.
Definition: list.h:486
#define EACCES_USELESS
Definition: x509.c:122
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321

References DBGC, EACCES_USELESS, x509_certificate::issuer, link, x509_chain::links, x509_link::list, list_for_each_entry, list_for_each_entry_continue_reverse, NULL, rc, root, x509_auto_append(), and x509_validate().

Referenced by cms_verify_signer(), validator_step(), x509_validate_chain_fail_okx(), and x509_validate_chain_okx().

◆ image_x509()

int image_x509 ( struct image image,
size_t  offset,
struct x509_certificate **  cert 
)

Extract X.509 certificate object from image.

Parameters
imageImage
offsetOffset within image
Return values
certX.509 certificate
nextOffset to next image, or negative error

On success, the caller holds a reference to the X.509 certificate, and is responsible for ultimately calling x509_put().

Definition at line 1947 of file x509.c.

1948  {
1949  struct asn1_cursor *cursor;
1950  int next;
1951  int rc;
1952 
1953  /* Get ASN.1 object */
1954  next = image_asn1 ( image, offset, &cursor );
1955  if ( next < 0 ) {
1956  rc = next;
1957  goto err_asn1;
1958  }
1959 
1960  /* Parse certificate */
1961  if ( ( rc = x509_certificate ( cursor->data, cursor->len,
1962  cert ) ) != 0 )
1963  goto err_certificate;
1964 
1965  /* Free ASN.1 object */
1966  free ( cursor );
1967 
1968  return next;
1969 
1970  x509_put ( *cert );
1971  err_certificate:
1972  free ( cursor );
1973  err_asn1:
1974  return rc;
1975 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
uint32_t next
Next descriptor address.
Definition: myson.h:18
const void * data
Start of data.
Definition: asn1.h:22
int image_asn1(struct image *image, size_t offset, struct asn1_cursor **cursor)
Extract ASN.1 object from image.
Definition: asn1.c:1002
An executable image.
Definition: image.h:24
size_t len
Length of data.
Definition: asn1.h:24
An X.509 certificate.
Definition: x509.h:215
static void(* free)(struct refcnt *refcnt))
Definition: refcnt.h:54
static void x509_put(struct x509_certificate *cert)
Drop reference to X.509 certificate.
Definition: x509.h:277
uint16_t offset
Offset to command line.
Definition: bzimage.h:8
An ASN.1 object cursor.
Definition: asn1.h:20

References asn1_cursor::data, free, image_asn1(), asn1_cursor::len, next, offset, rc, and x509_put().

Referenced by cert_exec().

◆ x509_check_issuer()

int x509_check_issuer ( struct x509_certificate cert,
struct x509_certificate issuer 
)

Check X.509 certificate against issuer certificate.

Parameters
certX.509 certificate
issuerX.509 issuer certificate
Return values
rcReturn status code

Definition at line 1174 of file x509.c.

1175  {
1176  struct x509_public_key *public_key = &issuer->subject.public_key;
1177  int rc;
1178 
1179  /* Check issuer. In theory, this should be a full X.500 DN
1180  * comparison, which would require support for a plethora of
1181  * abominations such as TeletexString (which allows the
1182  * character set to be changed mid-string using escape codes).
1183  * In practice, we assume that anyone who deliberately changes
1184  * the encoding of the issuer DN is probably a masochist who
1185  * will rather enjoy the process of figuring out exactly why
1186  * their certificate doesn't work.
1187  *
1188  * See http://www.cs.auckland.ac.nz/~pgut001/pubs/x509guide.txt
1189  * for some enjoyable ranting on this subject.
1190  */
1191  if ( asn1_compare ( &cert->issuer.raw, &issuer->subject.raw ) != 0 ) {
1192  DBGC ( cert, "X509 %p \"%s\" issuer does not match ",
1193  cert, x509_name ( cert ) );
1194  DBGC ( cert, "X509 %p \"%s\" subject\n",
1195  issuer, x509_name ( issuer ) );
1196  DBGC_HDA ( cert, 0, cert->issuer.raw.data,
1197  cert->issuer.raw.len );
1198  DBGC_HDA ( issuer, 0, issuer->subject.raw.data,
1199  issuer->subject.raw.len );
1200  return -EACCES_WRONG_ISSUER;
1201  }
1202 
1203  /* Check that issuer is allowed to sign certificates */
1204  if ( ! issuer->extensions.basic.ca ) {
1205  DBGC ( issuer, "X509 %p \"%s\" cannot sign ",
1206  issuer, x509_name ( issuer ) );
1207  DBGC ( issuer, "X509 %p \"%s\": not a CA certificate\n",
1208  cert, x509_name ( cert ) );
1209  return -EACCES_NOT_CA;
1210  }
1211  if ( issuer->extensions.usage.present &&
1212  ( ! ( issuer->extensions.usage.bits & X509_KEY_CERT_SIGN ) ) ) {
1213  DBGC ( issuer, "X509 %p \"%s\" cannot sign ",
1214  issuer, x509_name ( issuer ) );
1215  DBGC ( issuer, "X509 %p \"%s\": no keyCertSign usage\n",
1216  cert, x509_name ( cert ) );
1217  return -EACCES_KEY_USAGE;
1218  }
1219 
1220  /* Check signature */
1221  if ( ( rc = x509_check_signature ( cert, public_key ) ) != 0 )
1222  return rc;
1223 
1224  return 0;
1225 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
struct asn1_cursor raw
Raw issuer.
Definition: x509.h:31
int asn1_compare(const struct asn1_cursor *cursor1, const struct asn1_cursor *cursor2)
Compare two ASN.1 objects.
Definition: asn1.c:480
struct x509_issuer issuer
Issuer.
Definition: x509.h:240
const void * data
Start of data.
Definition: asn1.h:22
#define DBGC(...)
Definition: compiler.h:505
int present
Key usage extension is present.
Definition: x509.h:94
size_t len
Length of data.
Definition: asn1.h:24
#define EACCES_KEY_USAGE
Definition: x509.c:90
#define DBGC_HDA(...)
Definition: compiler.h:506
An X.509 certificate public key.
Definition: x509.h:49
struct x509_public_key public_key
Public key information.
Definition: x509.h:65
struct x509_subject subject
Subject.
Definition: x509.h:244
int ca
Subject is a CA.
Definition: x509.h:79
#define EACCES_NOT_CA
Definition: x509.c:86
struct asn1_cursor raw
Raw subject.
Definition: x509.h:61
const char * x509_name(struct x509_certificate *cert)
Get X.509 certificate display name.
Definition: x509.c:146
static int x509_check_signature(struct x509_certificate *cert, struct x509_public_key *public_key)
Check X.509 certificate signature.
Definition: x509.c:1120
unsigned int bits
Usage bits.
Definition: x509.h:96
struct x509_key_usage usage
Key usage.
Definition: x509.h:160
#define EACCES_WRONG_ISSUER
Definition: x509.c:82
struct x509_basic_constraints basic
Basic constraints.
Definition: x509.h:158
struct x509_extensions extensions
Extensions.
Definition: x509.h:248

References asn1_compare(), x509_extensions::basic, x509_key_usage::bits, x509_basic_constraints::ca, asn1_cursor::data, DBGC, DBGC_HDA, EACCES_KEY_USAGE, EACCES_NOT_CA, EACCES_WRONG_ISSUER, x509_certificate::extensions, x509_certificate::issuer, asn1_cursor::len, x509_key_usage::present, x509_subject::public_key, x509_subject::raw, x509_issuer::raw, rc, x509_certificate::subject, x509_extensions::usage, x509_check_signature(), X509_KEY_CERT_SIGN, and x509_name().

Referenced by x509_check_issuer_fail_okx(), x509_check_issuer_okx(), and x509_validate().

◆ x509_fingerprint()

void x509_fingerprint ( struct x509_certificate cert,
struct digest_algorithm digest,
void *  fingerprint 
)

Calculate X.509 certificate fingerprint.

Parameters
certX.509 certificate
digestDigest algorithm
fingerprintFingerprint buffer

Definition at line 1234 of file x509.c.

1236  {
1237  uint8_t ctx[ digest->ctxsize ];
1238 
1239  /* Calculate fingerprint */
1240  digest_init ( digest, ctx );
1241  digest_update ( digest, ctx, cert->raw.data, cert->raw.len );
1242  digest_final ( digest, ctx, fingerprint );
1243 }
static void digest_update(struct digest_algorithm *digest, void *ctx, const void *data, size_t len)
Definition: crypto.h:208
static void digest_final(struct digest_algorithm *digest, void *ctx, void *out)
Definition: crypto.h:214
const void * data
Start of data.
Definition: asn1.h:22
struct golan_eq_context ctx
Definition: CIB_PRM.h:28
size_t len
Length of data.
Definition: asn1.h:24
static void digest_init(struct digest_algorithm *digest, void *ctx)
Definition: crypto.h:203
unsigned char uint8_t
Definition: stdint.h:10
size_t ctxsize
Context size.
Definition: crypto.h:22
struct asn1_cursor raw
Raw certificate.
Definition: x509.h:230

References ctx, digest_algorithm::ctxsize, asn1_cursor::data, digest_final(), digest_init(), digest_update(), asn1_cursor::len, and x509_certificate::raw.

Referenced by certstat(), icert_certs(), x509_check_root(), x509_fingerprint_okx(), and x509_name().

◆ x509_check_root()

int x509_check_root ( struct x509_certificate cert,
struct x509_root root 
)

Check X.509 root certificate.

Parameters
certX.509 certificate
rootX.509 root certificate list
Return values
rcReturn status code

Definition at line 1252 of file x509.c.

1252  {
1253  struct digest_algorithm *digest = root->digest;
1254  uint8_t fingerprint[ digest->digestsize ];
1255  const uint8_t *root_fingerprint = root->fingerprints;
1256  unsigned int i;
1257 
1258  /* Calculate certificate fingerprint */
1259  x509_fingerprint ( cert, digest, fingerprint );
1260 
1261  /* Check fingerprint against all root certificates */
1262  for ( i = 0 ; i < root->count ; i++ ) {
1263  if ( memcmp ( fingerprint, root_fingerprint,
1264  sizeof ( fingerprint ) ) == 0 ) {
1265  DBGC ( cert, "X509 %p \"%s\" is a root certificate\n",
1266  cert, x509_name ( cert ) );
1267  return 0;
1268  }
1269  root_fingerprint += sizeof ( fingerprint );
1270  }
1271 
1272  DBGC2 ( cert, "X509 %p \"%s\" is not a root certificate\n",
1273  cert, x509_name ( cert ) );
1274  return -ENOENT;
1275 }
struct stp_switch root
Root switch.
Definition: stp.h:26
#define DBGC(...)
Definition: compiler.h:505
#define ENOENT
No such file or directory.
Definition: errno.h:514
unsigned char uint8_t
Definition: stdint.h:10
void x509_fingerprint(struct x509_certificate *cert, struct digest_algorithm *digest, void *fingerprint)
Calculate X.509 certificate fingerprint.
Definition: x509.c:1234
const char * x509_name(struct x509_certificate *cert)
Get X.509 certificate display name.
Definition: x509.c:146
#define DBGC2(...)
Definition: compiler.h:522
size_t digestsize
Digest size.
Definition: crypto.h:26
A message digest algorithm.
Definition: crypto.h:18
int memcmp(const void *first, const void *second, size_t len)
Compare memory regions.
Definition: string.c:114

References DBGC, DBGC2, digest_algorithm::digestsize, ENOENT, memcmp(), root, x509_fingerprint(), and x509_name().

Referenced by x509_check_root_fail_okx(), x509_check_root_okx(), and x509_validate().

◆ x509_check_time()

int x509_check_time ( struct x509_certificate cert,
time_t  time 
)

Check X.509 certificate validity period.

Parameters
certX.509 certificate
timeTime at which to check certificate
Return values
rcReturn status code

Definition at line 1284 of file x509.c.

1284  {
1285  struct x509_validity *validity = &cert->validity;
1286 
1287  /* Check validity period */
1288  if ( validity->not_before.time > ( time + TIMESTAMP_ERROR_MARGIN ) ) {
1289  DBGC ( cert, "X509 %p \"%s\" is not yet valid (at time %lld)\n",
1290  cert, x509_name ( cert ), time );
1291  return -EACCES_EXPIRED;
1292  }
1293  if ( validity->not_after.time < ( time - TIMESTAMP_ERROR_MARGIN ) ) {
1294  DBGC ( cert, "X509 %p \"%s\" has expired (at time %lld)\n",
1295  cert, x509_name ( cert ), time );
1296  return -EACCES_EXPIRED;
1297  }
1298 
1299  DBGC2 ( cert, "X509 %p \"%s\" is valid (at time %lld)\n",
1300  cert, x509_name ( cert ), time );
1301  return 0;
1302 }
#define DBGC(...)
Definition: compiler.h:505
time_t time
Seconds since the Epoch.
Definition: x509.h:37
struct x509_time not_before
Not valid before.
Definition: x509.h:43
#define EACCES_EXPIRED
Definition: x509.c:94
An X.509 certificate validity period.
Definition: x509.h:41
struct x509_validity validity
Validity.
Definition: x509.h:242
const char * x509_name(struct x509_certificate *cert)
Get X.509 certificate display name.
Definition: x509.c:146
#define TIMESTAMP_ERROR_MARGIN
Margin of error (in seconds) allowed in signed timestamps.
Definition: crypto.h:75
#define DBGC2(...)
Definition: compiler.h:522
struct x509_time not_after
Not valid after.
Definition: x509.h:45

References DBGC, DBGC2, EACCES_EXPIRED, x509_validity::not_after, x509_validity::not_before, x509_time::time, TIMESTAMP_ERROR_MARGIN, x509_certificate::validity, and x509_name().

Referenced by x509_check_time_fail_okx(), x509_check_time_okx(), and x509_validate().

◆ x509_invalidate()

static void x509_invalidate ( struct x509_certificate cert)
inlinestatic

Invalidate X.509 certificate.

Parameters
certX.509 certificate

Definition at line 469 of file x509.h.

469  {
470  x509_root_put ( cert->root );
471  cert->root = NULL;
472  cert->path_remaining = 0;
473 }
unsigned int path_remaining
Maximum number of subsequent certificates in chain.
Definition: x509.h:227
static void x509_root_put(struct x509_root *root)
Drop reference to X.509 root certificate list.
Definition: x509.h:403
struct x509_root * root
Root against which certificate has been validated (if any)
Definition: x509.h:225
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321

References NULL, x509_certificate::path_remaining, x509_certificate::root, and x509_root_put().

Referenced by ocsp_prepare_test(), ocsp_validate(), and x509_invalidate_chain().

◆ x509_invalidate_chain()

static void x509_invalidate_chain ( struct x509_chain chain)
inlinestatic

Invalidate X.509 certificate chain.

Parameters
chainX.509 certificate chain

Definition at line 480 of file x509.h.

480  {
481  struct x509_link *link;
482 
483  list_for_each_entry ( link, &chain->links, list )
484  x509_invalidate ( link->cert );
485 }
struct list_head links
List of links.
Definition: x509.h:204
#define list_for_each_entry(pos, head, member)
Iterate over entries in a list.
Definition: list.h:431
u32 link
Link to next descriptor.
Definition: ar9003_mac.h:68
static void x509_invalidate(struct x509_certificate *cert)
Invalidate X.509 certificate.
Definition: x509.h:469

References link, x509_chain::links, x509_link::list, list_for_each_entry, and x509_invalidate().

Referenced by cms_verify_fail_okx(), cms_verify_okx(), x509_validate_chain_fail_okx(), and x509_validate_chain_okx().