X.509 module#

The X.509 module provides X.509 support for reading, writing and verification of certificates.

In summary:

  • X.509 certificate (CRT) reading (see mbedtls_x509_crt_parse(), mbedtls_x509_crt_parse_der(), mbedtls_x509_crt_parse_file()).

  • X.509 certificate revocation list (CRL) reading (see mbedtls_x509_crl_parse(), mbedtls_x509_crl_parse_der(), and mbedtls_x509_crl_parse_file()).

  • X.509 certificate signature verification (see mbedtls_x509_crt_verify() and mbedtls_x509_crt_verify_with_profile().

  • X.509 certificate writing and certificate request writing (see mbedtls_x509write_crt_der() and mbedtls_x509write_csr_der()).

This module can be used to build a certificate authority (CA) chain and verify its signature. It is also used to generate Certificate Signing Requests and X.509 certificates just as a CA would do.

Modules#

mbedtls_x509_csr

mbedtls_x509write_csr

mbedtls_x509_crl_entry

mbedtls_x509_crl

mbedtls_x509_time

mbedtls_x509_crt

mbedtls_x509_san_other_name

mbedtls_x509_subject_alternative_name

mbedtls_x509_crt_profile

mbedtls_x509write_cert

mbedtls_x509_crt_verify_chain_item

mbedtls_x509_crt_verify_chain

Structures for parsing X.509 certificates, CRLs and CSRs#

Type-length-value structure that allows for ASN1 using DER.

Container for ASN1 bit strings.

Container for ASN1 named information objects.

Container for a sequence of ASN.1 items.

Structures and functions for parsing and writing X.509 certificates#

int
mbedtls_x509_crt_has_ext_type(const mbedtls_x509_crt *ctx, int ext_type)

Query certificate for given extension type.

#define
MBEDTLS_X509_ID_FLAG (id)

Build flag from an algorithm/curve identifier (pk, md, ecp) Since 0 is always XXX_NONE, ignore it.

#define
MBEDTLS_X509_CRT_VERSION_1 0
#define
MBEDTLS_X509_CRT_VERSION_2 1
#define
MBEDTLS_X509_CRT_VERSION_3 2
#define
MBEDTLS_X509_RFC5280_MAX_SERIAL_LEN 32
#define
MBEDTLS_X509_RFC5280_UTC_TIME_LEN 15
#define
MBEDTLS_X509_MAX_FILE_PATH_LEN 512
#define
MBEDTLS_X509_CRT_ERROR_INFO_LIST
#define
MBEDTLS_X509_MAX_VERIFY_CHAIN_SIZE ( MBEDTLS_X509_MAX_INTERMEDIATE_CA + 2 )

Max size of verification chain: end-entity + intermediates + trusted root.

Structures and functions for parsing CRLs#

int
mbedtls_x509_crl_parse_der(mbedtls_x509_crl *chain, const unsigned char *buf, size_t buflen)

Parse a DER-encoded CRL and append it to the chained list.

int
mbedtls_x509_crl_parse(mbedtls_x509_crl *chain, const unsigned char *buf, size_t buflen)

Parse one or more CRLs and append them to the chained list.

int
mbedtls_x509_crl_info(char *buf, size_t size, const char *prefix, const mbedtls_x509_crl *crl)

Returns an informational string about the CRL.

void
mbedtls_x509_crl_init(mbedtls_x509_crl *crl)

Initialize a CRL (chain)

void
mbedtls_x509_crl_free(mbedtls_x509_crl *crl)

Unallocate all CRL data.

X509 Error codes#

#define
MBEDTLS_ERR_X509_FEATURE_UNAVAILABLE -0x2080

Unavailable feature, e.g.

#define
MBEDTLS_ERR_X509_UNKNOWN_OID -0x2100

Requested OID is unknown.

#define
MBEDTLS_ERR_X509_INVALID_FORMAT -0x2180

The CRT/CRL/CSR format is invalid, e.g.

#define
MBEDTLS_ERR_X509_INVALID_VERSION -0x2200

The CRT/CRL/CSR version element is invalid.

#define
MBEDTLS_ERR_X509_INVALID_SERIAL -0x2280

The serial tag or value is invalid.

#define
MBEDTLS_ERR_X509_INVALID_ALG -0x2300

The algorithm tag or value is invalid.

#define
MBEDTLS_ERR_X509_INVALID_NAME -0x2380

The name tag or value is invalid.

#define
MBEDTLS_ERR_X509_INVALID_DATE -0x2400

The date tag or value is invalid.

#define
MBEDTLS_ERR_X509_INVALID_SIGNATURE -0x2480

The signature tag or value invalid.

#define
MBEDTLS_ERR_X509_INVALID_EXTENSIONS -0x2500

The extension tag or value is invalid.

#define
MBEDTLS_ERR_X509_UNKNOWN_VERSION -0x2580

CRT/CRL/CSR has an unsupported version number.

#define
MBEDTLS_ERR_X509_UNKNOWN_SIG_ALG -0x2600

Signature algorithm (oid) is unsupported.

#define
MBEDTLS_ERR_X509_SIG_MISMATCH -0x2680

Signature algorithms do not match.

#define
MBEDTLS_ERR_X509_CERT_VERIFY_FAILED -0x2700

Certificate verification failed, e.g.

#define
MBEDTLS_ERR_X509_CERT_UNKNOWN_FORMAT -0x2780

Format not recognized as DER or PEM.

#define
MBEDTLS_ERR_X509_BAD_INPUT_DATA -0x2800

Input invalid.

#define
MBEDTLS_ERR_X509_ALLOC_FAILED -0x2880

Allocation of memory failed.

#define
MBEDTLS_ERR_X509_FILE_IO_ERROR -0x2900

Read/write of file failed.

#define
MBEDTLS_ERR_X509_BUFFER_TOO_SMALL -0x2980

Destination buffer is too small.

#define
MBEDTLS_ERR_X509_FATAL_ERROR -0x3000

A fatal error occurred, eg the chain is too long or the vrfy callback failed.

X509 Verify codes#

#define
MBEDTLS_X509_BADCERT_EXPIRED 0x01

The certificate validity has expired.

#define
MBEDTLS_X509_BADCERT_REVOKED 0x02

The certificate has been revoked (is on a CRL).

#define
MBEDTLS_X509_BADCERT_CN_MISMATCH 0x04

The certificate Common Name (CN) does not match with the expected CN.

#define
MBEDTLS_X509_BADCERT_NOT_TRUSTED 0x08

The certificate is not correctly signed by the trusted CA.

#define
MBEDTLS_X509_BADCRL_NOT_TRUSTED 0x10

The CRL is not correctly signed by the trusted CA.

#define
MBEDTLS_X509_BADCRL_EXPIRED 0x20

The CRL is expired.

#define
MBEDTLS_X509_BADCERT_MISSING 0x40

Certificate was missing.

#define
MBEDTLS_X509_BADCERT_SKIP_VERIFY 0x80

Certificate verification was skipped.

#define
MBEDTLS_X509_BADCERT_OTHER 0x0100

Other reason (can be used by verify callback)

#define
MBEDTLS_X509_BADCERT_FUTURE 0x0200

The certificate validity starts in the future.

#define
MBEDTLS_X509_BADCRL_FUTURE 0x0400

The CRL is from the future.

#define
MBEDTLS_X509_BADCERT_KEY_USAGE 0x0800

Usage does not match the keyUsage extension.

#define
MBEDTLS_X509_BADCERT_EXT_KEY_USAGE 0x1000

Usage does not match the extendedKeyUsage extension.

#define
MBEDTLS_X509_BADCERT_NS_CERT_TYPE 0x2000

Usage does not match the nsCertType extension.

#define
MBEDTLS_X509_BADCERT_BAD_MD 0x4000

The certificate is signed with an unacceptable hash.

#define
MBEDTLS_X509_BADCERT_BAD_PK 0x8000

The certificate is signed with an unacceptable PK alg (eg RSA vs ECDSA).

#define
MBEDTLS_X509_BADCERT_BAD_KEY 0x010000

The certificate is signed with an unacceptable key (eg bad curve, RSA too short).

#define
MBEDTLS_X509_BADCRL_BAD_MD 0x020000

The CRL is signed with an unacceptable hash.

#define
MBEDTLS_X509_BADCRL_BAD_PK 0x040000

The CRL is signed with an unacceptable PK alg (eg RSA vs ECDSA).

#define
MBEDTLS_X509_BADCRL_BAD_KEY 0x080000

The CRL is signed with an unacceptable key (eg bad curve, RSA too short).

Functions#

int
mbedtls_x509_dn_gets(char *buf, size_t size, const mbedtls_x509_name *dn)

Store the certificate DN in printable form into buf; no more than size characters will be written.

mbedtls_x509_dn_get_next(mbedtls_x509_name *dn)

Return the next relative DN in an X509 name.

int
mbedtls_x509_serial_gets(char *buf, size_t size, const mbedtls_x509_buf *serial)

Store the certificate serial in printable form into buf; no more than size characters will be written.

int
mbedtls_x509_time_is_past(const mbedtls_x509_time *to)

Check a given mbedtls_x509_time against the system time and tell if it's in the past.

int
mbedtls_x509_time_is_future(const mbedtls_x509_time *from)

Check a given mbedtls_x509_time against the system time and tell if it's in the future.

Macros#

#define
MBEDTLS_X509_MAX_INTERMEDIATE_CA 8

Maximum number of intermediate CAs in a verification chain.

Structures for parsing X.509 certificates, CRLs and CSRs Documentation#

mbedtls_x509_buf#

typedef mbedtls_asn1_buf mbedtls_x509_buf

Type-length-value structure that allows for ASN1 using DER.


mbedtls_x509_bitstring#

typedef mbedtls_asn1_bitstring mbedtls_x509_bitstring

Container for ASN1 bit strings.


mbedtls_x509_name#

typedef mbedtls_asn1_named_data mbedtls_x509_name

Container for ASN1 named information objects.

It allows for Relative Distinguished Names (e.g. cn=localhost,ou=code,etc.).


mbedtls_x509_sequence#

typedef mbedtls_asn1_sequence mbedtls_x509_sequence

Container for a sequence of ASN.1 items.


Structures and functions for parsing and writing X.509 certificates Documentation#

mbedtls_x509_crt_restart_ctx#

typedef void mbedtls_x509_crt_restart_ctx

mbedtls_x509_crt_has_ext_type#

static int mbedtls_x509_crt_has_ext_type (const mbedtls_x509_crt * ctx, int ext_type)

Query certificate for given extension type.

Parameters
TypeDirectionArgument NameDescription
const mbedtls_x509_crt *[in]ctx

Certificate context to be queried, must not be NULL

intN/Aext_type

Extension type being queried for, must be a valid extension type. Must be one of the MBEDTLS_X509_EXT_XXX values

Returns

  • 0 if the given extension type is not present, non-zero otherwise


Structures and functions for parsing CRLs Documentation#

mbedtls_x509_crl_parse_der#

int mbedtls_x509_crl_parse_der (mbedtls_x509_crl * chain, const unsigned char * buf, size_t buflen)

Parse a DER-encoded CRL and append it to the chained list.

Parameters
TypeDirectionArgument NameDescription
mbedtls_x509_crl *N/Achain

points to the start of the chain

const unsigned char *N/Abuf

buffer holding the CRL data in DER format

size_tN/Abuflen

size of the buffer (including the terminating null byte for PEM data)

Returns

  • 0 if successful, or a specific X509 or PEM error code


mbedtls_x509_crl_parse#

int mbedtls_x509_crl_parse (mbedtls_x509_crl * chain, const unsigned char * buf, size_t buflen)

Parse one or more CRLs and append them to the chained list.

Parameters
TypeDirectionArgument NameDescription
mbedtls_x509_crl *N/Achain

points to the start of the chain

const unsigned char *N/Abuf

buffer holding the CRL data in PEM or DER format

size_tN/Abuflen

size of the buffer (including the terminating null byte for PEM data)

Note

  • Multiple CRLs are accepted only if using PEM format

Returns

  • 0 if successful, or a specific X509 or PEM error code


mbedtls_x509_crl_info#

int mbedtls_x509_crl_info (char * buf, size_t size, const char * prefix, const mbedtls_x509_crl * crl)

Returns an informational string about the CRL.

Parameters
TypeDirectionArgument NameDescription
char *N/Abuf

Buffer to write to

size_tN/Asize

Maximum size of buffer

const char *N/Aprefix

A line prefix

const mbedtls_x509_crl *N/Acrl

The X509 CRL to represent

Returns

  • The length of the string written (not including the terminated nul byte), or a negative error code.


mbedtls_x509_crl_init#

void mbedtls_x509_crl_init (mbedtls_x509_crl * crl)

Initialize a CRL (chain)

Parameters
TypeDirectionArgument NameDescription
mbedtls_x509_crl *N/Acrl

CRL chain to initialize


mbedtls_x509_crl_free#

void mbedtls_x509_crl_free (mbedtls_x509_crl * crl)

Unallocate all CRL data.

Parameters
TypeDirectionArgument NameDescription
mbedtls_x509_crl *N/Acrl

CRL chain to free


X509 Error codes Documentation#

X509 Verify codes Documentation#

Function Documentation#

mbedtls_x509_dn_gets#

int mbedtls_x509_dn_gets (char * buf, size_t size, const mbedtls_x509_name * dn)

Store the certificate DN in printable form into buf; no more than size characters will be written.

Parameters
TypeDirectionArgument NameDescription
char *N/Abuf

Buffer to write to

size_tN/Asize

Maximum size of buffer

const mbedtls_x509_name *N/Adn

The X509 name to represent

Returns

  • The length of the string written (not including the terminated nul byte), or a negative error code.


mbedtls_x509_dn_get_next#

static mbedtls_x509_name * mbedtls_x509_dn_get_next (mbedtls_x509_name * dn)

Return the next relative DN in an X509 name.

Parameters
TypeDirectionArgument NameDescription
mbedtls_x509_name *N/Adn

Current node in the X509 name

Note

  • Intended use is to compare function result to dn->next in order to detect boundaries of multi-valued RDNs.

Returns

  • Pointer to the first attribute-value pair of the next RDN in sequence, or NULL if end is reached.


mbedtls_x509_serial_gets#

int mbedtls_x509_serial_gets (char * buf, size_t size, const mbedtls_x509_buf * serial)

Store the certificate serial in printable form into buf; no more than size characters will be written.

Parameters
TypeDirectionArgument NameDescription
char *N/Abuf

Buffer to write to

size_tN/Asize

Maximum size of buffer

const mbedtls_x509_buf *N/Aserial

The X509 serial to represent

Returns

  • The length of the string written (not including the terminated nul byte), or a negative error code.


mbedtls_x509_time_is_past#

int mbedtls_x509_time_is_past (const mbedtls_x509_time * to)

Check a given mbedtls_x509_time against the system time and tell if it's in the past.

Parameters
TypeDirectionArgument NameDescription
const mbedtls_x509_time *N/Ato

mbedtls_x509_time to check

Note

  • Intended usage is "if( is_past( valid_to ) ) ERROR". Hence the return value of 1 if on internal errors.

Returns

  • 1 if the given time is in the past or an error occurred, 0 otherwise.


mbedtls_x509_time_is_future#

int mbedtls_x509_time_is_future (const mbedtls_x509_time * from)

Check a given mbedtls_x509_time against the system time and tell if it's in the future.

Parameters
TypeDirectionArgument NameDescription
const mbedtls_x509_time *N/Afrom

mbedtls_x509_time to check

Note

  • Intended usage is "if( is_future( valid_from ) ) ERROR". Hence the return value of 1 if on internal errors.

Returns

  • 1 if the given time is in the future or an error occurred, 0 otherwise.