2012-02-14 00:11:30 +01:00
/**
2016-01-03 17:14:14 +01:00
* \ file x509_crt . h
2012-02-14 00:11:30 +01:00
*
2013-09-16 13:49:26 +02:00
* \ brief X .509 certificate parsing and writing
2018-01-05 16:33:17 +01:00
*/
/*
2020-08-07 13:07:28 +02:00
* Copyright The Mbed TLS Contributors
2015-09-04 14:21:07 +02:00
* SPDX - License - Identifier : Apache - 2.0
2012-02-14 00:11:30 +01:00
*
2015-09-04 14:21:07 +02:00
* Licensed under the Apache License , Version 2.0 ( the " License " ) ; you may
* not use this file except in compliance with the License .
* You may obtain a copy of the License at
2012-02-14 00:11:30 +01:00
*
2015-09-04 14:21:07 +02:00
* http : //www.apache.org/licenses/LICENSE-2.0
2012-02-14 00:11:30 +01:00
*
2015-09-04 14:21:07 +02:00
* Unless required by applicable law or agreed to in writing , software
* distributed under the License is distributed on an " AS IS " BASIS , WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND , either express or implied .
* See the License for the specific language governing permissions and
* limitations under the License .
2012-02-14 00:11:30 +01:00
*/
2015-04-08 12:49:31 +02:00
# ifndef MBEDTLS_X509_CRT_H
# define MBEDTLS_X509_CRT_H
2021-05-19 19:44:07 +02:00
# include "mbedtls/private_access.h"
2012-02-14 00:11:30 +01:00
2021-05-27 11:25:03 +02:00
# include "mbedtls/build_info.h"
2013-04-19 14:51:29 +02:00
2019-07-04 21:01:14 +02:00
# include "mbedtls/x509.h"
# include "mbedtls/x509_crl.h"
# include "mbedtls/bignum.h"
2013-09-16 13:49:26 +02:00
2013-08-25 11:47:51 +02:00
/**
* \ addtogroup x509_module
* \ {
*/
2013-06-27 14:29:21 +02:00
# ifdef __cplusplus
extern " C " {
# endif
2013-08-25 11:47:51 +02:00
/**
2013-09-16 13:49:26 +02:00
* \ name Structures and functions for parsing and writing X .509 certificates
2013-08-25 11:47:51 +02:00
* \ {
*/
/**
2013-09-16 13:49:26 +02:00
* Container for an X .509 certificate . The certificate may be chained .
2021-08-04 21:56:10 +02:00
*
* Some fields of this structure are publicly readable . Do not modify
* them except via Mbed TLS library functions : the effect of modifying
* those fields or the data that those fields points to is unspecified .
2013-08-25 11:47:51 +02:00
*/
2023-01-11 14:50:10 +01:00
typedef struct mbedtls_x509_crt {
2021-05-19 19:44:07 +02:00
int MBEDTLS_PRIVATE ( own_buffer ) ; /**< Indicates if \c raw is owned
2023-01-11 14:50:10 +01:00
* by the structure or not . */
2021-08-04 21:56:10 +02:00
mbedtls_x509_buf raw ; /**< The raw certificate data (DER). */
mbedtls_x509_buf tbs ; /**< The raw certificate body (DER). The part that is To Be Signed. */
2013-09-16 13:49:26 +02:00
2021-08-04 21:56:10 +02:00
int version ; /**< The X.509 version. (1=v1, 2=v2, 3=v3) */
mbedtls_x509_buf serial ; /**< Unique id for certificate issued by a specific CA. */
mbedtls_x509_buf sig_oid ; /**< Signature algorithm, e.g. sha1RSA */
2013-09-16 13:49:26 +02:00
2021-08-04 21:56:10 +02:00
mbedtls_x509_buf issuer_raw ; /**< The raw issuer data (DER). Used for quick comparison. */
mbedtls_x509_buf subject_raw ; /**< The raw subject data (DER). Used for quick comparison. */
2013-09-16 13:49:26 +02:00
2021-08-04 21:56:10 +02:00
mbedtls_x509_name issuer ; /**< The parsed issuer data (named information object). */
mbedtls_x509_name subject ; /**< The parsed subject data (named information object). */
2013-09-16 13:49:26 +02:00
2021-08-04 21:56:10 +02:00
mbedtls_x509_time valid_from ; /**< Start time of certificate validity. */
mbedtls_x509_time valid_to ; /**< End time of certificate validity. */
2013-09-16 13:49:26 +02:00
2021-08-04 21:56:10 +02:00
mbedtls_x509_buf pk_raw ;
mbedtls_pk_context pk ; /**< Container for the public key context. */
2013-09-16 13:49:26 +02:00
2021-08-04 21:56:10 +02:00
mbedtls_x509_buf issuer_id ; /**< Optional X.509 v2/v3 issuer unique identifier. */
mbedtls_x509_buf subject_id ; /**< Optional X.509 v2/v3 subject unique identifier. */
mbedtls_x509_buf v3_ext ; /**< Optional X.509 v3 extensions. */
2023-04-30 20:11:23 +02:00
mbedtls_x509_sequence subject_alt_names ; /**< Optional list of raw entries of Subject Alternative Names extension. These can be later parsed by mbedtls_x509_parse_subject_alt_name. */
2021-02-12 16:11:17 +01:00
mbedtls_x509_buf subject_key_id ; /**< Optional X.509 v3 extension subject key identifier. */
mbedtls_x509_authority authority_key_id ; /**< Optional X.509 v3 extension authority key identifier. */
2013-09-16 13:49:26 +02:00
2021-08-04 21:56:10 +02:00
mbedtls_x509_sequence certificate_policies ; /**< Optional list of certificate policies (Only anyPolicy is printed and enforced, however the rest of the policies are still listed). */
2019-03-21 13:00:03 +01:00
2021-05-19 19:44:07 +02:00
int MBEDTLS_PRIVATE ( ext_types ) ; /**< Bit string containing detected and parsed extensions */
int MBEDTLS_PRIVATE ( ca_istrue ) ; /**< Optional Basic Constraint extension value: 1 if this certificate belongs to a CA, 0 otherwise. */
int MBEDTLS_PRIVATE ( max_pathlen ) ; /**< Optional Basic Constraint extension value: The maximum path length to the root certificate. Path length is 1 higher than RFC 5280 'meaning', so 1+ */
2013-09-16 13:49:26 +02:00
2021-05-19 19:44:07 +02:00
unsigned int MBEDTLS_PRIVATE ( key_usage ) ; /**< Optional key usage extension value: See the values in x509.h */
2013-09-16 13:49:26 +02:00
2021-08-04 21:56:10 +02:00
mbedtls_x509_sequence ext_key_usage ; /**< Optional list of extended key usage OIDs. */
2013-09-16 13:49:26 +02:00
2021-05-19 19:44:07 +02:00
unsigned char MBEDTLS_PRIVATE ( ns_cert_type ) ; /**< Optional Netscape certificate type extension value: See the values in x509.h */
2013-09-16 13:49:26 +02:00
2021-05-19 19:44:07 +02:00
mbedtls_x509_buf MBEDTLS_PRIVATE ( sig ) ; /**< Signature: hash of the tbs part signed with the private key. */
mbedtls_md_type_t MBEDTLS_PRIVATE ( sig_md ) ; /**< Internal representation of the MD algorithm of the signature algorithm, e.g. MBEDTLS_MD_SHA256 */
mbedtls_pk_type_t MBEDTLS_PRIVATE ( sig_pk ) ; /**< Internal representation of the Public Key algorithm of the signature algorithm, e.g. MBEDTLS_PK_RSA */
void * MBEDTLS_PRIVATE ( sig_opts ) ; /**< Signature options to be passed to mbedtls_pk_verify_ext(), e.g. for RSASSA-PSS */
2013-09-16 13:49:26 +02:00
2021-08-31 23:18:07 +02:00
/** Next certificate in the linked list that constitutes the CA chain.
* \ p NULL indicates the end of the list .
* Do not modify this field directly . */
struct mbedtls_x509_crt * next ;
2012-02-14 00:11:30 +01:00
}
2015-04-08 12:49:31 +02:00
mbedtls_x509_crt ;
2013-08-25 10:18:25 +02:00
2015-06-15 15:33:19 +02:00
/**
* Build flag from an algorithm / curve identifier ( pk , md , ecp )
* Since 0 is always XXX_NONE , ignore it .
*/
2023-01-11 14:50:10 +01:00
# define MBEDTLS_X509_ID_FLAG(id) (1 << ((id) - 1))
2015-06-15 15:33:19 +02:00
2015-06-15 14:34:59 +02:00
/**
* Security profile for certificate verification .
2015-06-15 10:39:46 +02:00
*
2015-06-15 15:33:19 +02:00
* All lists are bitfields , built by ORing flags from MBEDTLS_X509_ID_FLAG ( ) .
2021-06-17 10:39:39 +02:00
*
* The fields of this structure are part of the public API and can be
* manipulated directly by applications . Future versions of the library may
* add extra fields or reorder existing fields .
2021-06-18 09:48:27 +02:00
*
* You can create custom profiles by starting from a copy of
* an existing profile , such as mbedtls_x509_crt_profile_default or
* mbedtls_x509_ctr_profile_none and then tune it to your needs .
*
* For example to allow SHA - 224 in addition to the default :
*
* mbedtls_x509_crt_profile my_profile = mbedtls_x509_crt_profile_default ;
* my_profile . allowed_mds | = MBEDTLS_X509_ID_FLAG ( MBEDTLS_MD_SHA224 ) ;
*
* Or to allow only RSA - 3072 + with SHA - 256 :
*
* mbedtls_x509_crt_profile my_profile = mbedtls_x509_crt_profile_none ;
* my_profile . allowed_mds = MBEDTLS_X509_ID_FLAG ( MBEDTLS_MD_SHA256 ) ;
* my_profile . allowed_pks = MBEDTLS_X509_ID_FLAG ( MBEDTLS_PK_RSA ) ;
* my_profile . rsa_min_bitlen = 3072 ;
2015-06-15 10:39:46 +02:00
*/
2023-01-11 14:50:10 +01:00
typedef struct mbedtls_x509_crt_profile {
2021-06-17 10:32:01 +02:00
uint32_t allowed_mds ; /**< MDs for signatures */
2018-10-11 12:36:29 +02:00
uint32_t allowed_pks ; /**< PK algs for public keys;
2022-04-25 10:12:01 +02:00
* this applies to all certificates
2018-10-11 12:36:29 +02:00
* in the provided chain . */
2021-06-17 10:32:01 +02:00
uint32_t allowed_curves ; /**< Elliptic curves for ECDSA */
uint32_t rsa_min_bitlen ; /**< Minimum size for RSA keys */
2015-06-15 10:39:46 +02:00
}
mbedtls_x509_crt_profile ;
2015-04-08 12:49:31 +02:00
# define MBEDTLS_X509_CRT_VERSION_1 0
# define MBEDTLS_X509_CRT_VERSION_2 1
# define MBEDTLS_X509_CRT_VERSION_3 2
2013-09-06 09:55:26 +02:00
2023-01-05 16:46:59 +01:00
# define MBEDTLS_X509_RFC5280_MAX_SERIAL_LEN 20
2015-04-08 12:49:31 +02:00
# define MBEDTLS_X509_RFC5280_UTC_TIME_LEN 15
2012-02-14 00:11:30 +01:00
2023-01-11 14:50:10 +01:00
# if !defined(MBEDTLS_X509_MAX_FILE_PATH_LEN)
2016-09-02 15:06:04 +02:00
# define MBEDTLS_X509_MAX_FILE_PATH_LEN 512
# endif
2020-10-09 11:48:22 +02:00
/* This macro unfolds to the concatenation of macro invocations
* X509_CRT_ERROR_INFO ( error code ,
* error code as string ,
* human readable description )
* where X509_CRT_ERROR_INFO is defined by the user .
* See x509_crt . c for an example of how to use this . */
# define MBEDTLS_X509_CRT_ERROR_INFO_LIST \
2023-01-11 14:50:10 +01:00
X509_CRT_ERROR_INFO ( MBEDTLS_X509_BADCERT_EXPIRED , \
" MBEDTLS_X509_BADCERT_EXPIRED " , \
" The certificate validity has expired " ) \
X509_CRT_ERROR_INFO ( MBEDTLS_X509_BADCERT_REVOKED , \
" MBEDTLS_X509_BADCERT_REVOKED " , \
" The certificate has been revoked (is on a CRL) " ) \
X509_CRT_ERROR_INFO ( MBEDTLS_X509_BADCERT_CN_MISMATCH , \
" MBEDTLS_X509_BADCERT_CN_MISMATCH " , \
" The certificate Common Name (CN) does not match with the expected CN " ) \
X509_CRT_ERROR_INFO ( MBEDTLS_X509_BADCERT_NOT_TRUSTED , \
" MBEDTLS_X509_BADCERT_NOT_TRUSTED " , \
" The certificate is not correctly signed by the trusted CA " ) \
X509_CRT_ERROR_INFO ( MBEDTLS_X509_BADCRL_NOT_TRUSTED , \
" MBEDTLS_X509_BADCRL_NOT_TRUSTED " , \
" The CRL is not correctly signed by the trusted CA " ) \
X509_CRT_ERROR_INFO ( MBEDTLS_X509_BADCRL_EXPIRED , \
" MBEDTLS_X509_BADCRL_EXPIRED " , \
" The CRL is expired " ) \
X509_CRT_ERROR_INFO ( MBEDTLS_X509_BADCERT_MISSING , \
" MBEDTLS_X509_BADCERT_MISSING " , \
" Certificate was missing " ) \
X509_CRT_ERROR_INFO ( MBEDTLS_X509_BADCERT_SKIP_VERIFY , \
" MBEDTLS_X509_BADCERT_SKIP_VERIFY " , \
" Certificate verification was skipped " ) \
X509_CRT_ERROR_INFO ( MBEDTLS_X509_BADCERT_OTHER , \
" MBEDTLS_X509_BADCERT_OTHER " , \
" Other reason (can be used by verify callback) " ) \
X509_CRT_ERROR_INFO ( MBEDTLS_X509_BADCERT_FUTURE , \
" MBEDTLS_X509_BADCERT_FUTURE " , \
" The certificate validity starts in the future " ) \
X509_CRT_ERROR_INFO ( MBEDTLS_X509_BADCRL_FUTURE , \
" MBEDTLS_X509_BADCRL_FUTURE " , \
" The CRL is from the future " ) \
X509_CRT_ERROR_INFO ( MBEDTLS_X509_BADCERT_KEY_USAGE , \
" MBEDTLS_X509_BADCERT_KEY_USAGE " , \
" Usage does not match the keyUsage extension " ) \
X509_CRT_ERROR_INFO ( MBEDTLS_X509_BADCERT_EXT_KEY_USAGE , \
" MBEDTLS_X509_BADCERT_EXT_KEY_USAGE " , \
" Usage does not match the extendedKeyUsage extension " ) \
X509_CRT_ERROR_INFO ( MBEDTLS_X509_BADCERT_NS_CERT_TYPE , \
" MBEDTLS_X509_BADCERT_NS_CERT_TYPE " , \
" Usage does not match the nsCertType extension " ) \
X509_CRT_ERROR_INFO ( MBEDTLS_X509_BADCERT_BAD_MD , \
" MBEDTLS_X509_BADCERT_BAD_MD " , \
" The certificate is signed with an unacceptable hash. " ) \
X509_CRT_ERROR_INFO ( MBEDTLS_X509_BADCERT_BAD_PK , \
" MBEDTLS_X509_BADCERT_BAD_PK " , \
" The certificate is signed with an unacceptable PK alg (eg RSA vs ECDSA). " ) \
X509_CRT_ERROR_INFO ( MBEDTLS_X509_BADCERT_BAD_KEY , \
" MBEDTLS_X509_BADCERT_BAD_KEY " , \
" The certificate is signed with an unacceptable key (eg bad curve, RSA too short). " ) \
X509_CRT_ERROR_INFO ( MBEDTLS_X509_BADCRL_BAD_MD , \
" MBEDTLS_X509_BADCRL_BAD_MD " , \
" The CRL is signed with an unacceptable hash. " ) \
X509_CRT_ERROR_INFO ( MBEDTLS_X509_BADCRL_BAD_PK , \
" MBEDTLS_X509_BADCRL_BAD_PK " , \
" The CRL is signed with an unacceptable PK alg (eg RSA vs ECDSA). " ) \
X509_CRT_ERROR_INFO ( MBEDTLS_X509_BADCRL_BAD_KEY , \
" MBEDTLS_X509_BADCRL_BAD_KEY " , \
" The CRL is signed with an unacceptable key (eg bad curve, RSA too short). " )
2020-10-09 11:48:22 +02:00
2013-08-25 11:47:51 +02:00
/**
2013-09-06 09:55:26 +02:00
* Container for writing a certificate ( CRT )
2013-08-25 11:47:51 +02:00
*/
2023-01-11 14:50:10 +01:00
typedef struct mbedtls_x509write_cert {
2021-05-19 19:44:07 +02:00
int MBEDTLS_PRIVATE ( version ) ;
2023-01-05 16:46:59 +01:00
unsigned char MBEDTLS_PRIVATE ( serial ) [ MBEDTLS_X509_RFC5280_MAX_SERIAL_LEN ] ;
size_t MBEDTLS_PRIVATE ( serial_len ) ;
2021-05-19 19:44:07 +02:00
mbedtls_pk_context * MBEDTLS_PRIVATE ( subject_key ) ;
mbedtls_pk_context * MBEDTLS_PRIVATE ( issuer_key ) ;
mbedtls_asn1_named_data * MBEDTLS_PRIVATE ( subject ) ;
mbedtls_asn1_named_data * MBEDTLS_PRIVATE ( issuer ) ;
mbedtls_md_type_t MBEDTLS_PRIVATE ( md_alg ) ;
char MBEDTLS_PRIVATE ( not_before ) [ MBEDTLS_X509_RFC5280_UTC_TIME_LEN + 1 ] ;
char MBEDTLS_PRIVATE ( not_after ) [ MBEDTLS_X509_RFC5280_UTC_TIME_LEN + 1 ] ;
mbedtls_asn1_named_data * MBEDTLS_PRIVATE ( extensions ) ;
2013-08-25 10:18:25 +02:00
}
2015-04-08 12:49:31 +02:00
mbedtls_x509write_cert ;
2013-08-25 10:18:25 +02:00
2023-04-04 13:09:04 +02:00
/**
* \ brief Set Subject Alternative Name
*
* \ param ctx Certificate context to use
* \ param san_list List of SAN values
*
* \ return 0 if successful , or MBEDTLS_ERR_X509_ALLOC_FAILED
*
* \ note " dnsName " , " uniformResourceIdentifier " , " IP address " ,
* " otherName " , and " DirectoryName " , as defined in RFC 5280 ,
* are supported .
*/
2023-04-04 12:56:14 +02:00
int mbedtls_x509write_crt_set_subject_alternative_name ( mbedtls_x509write_cert * ctx ,
const mbedtls_x509_san_list * san_list ) ;
2017-08-14 17:17:14 +02:00
/**
* Item in a verification chain : cert and flags for it
*/
typedef struct {
2021-05-19 19:44:07 +02:00
mbedtls_x509_crt * MBEDTLS_PRIVATE ( crt ) ;
uint32_t MBEDTLS_PRIVATE ( flags ) ;
2017-08-14 17:17:14 +02:00
} mbedtls_x509_crt_verify_chain_item ;
/**
* Max size of verification chain : end - entity + intermediates + trusted root
*/
2023-01-11 14:50:10 +01:00
# define MBEDTLS_X509_MAX_VERIFY_CHAIN_SIZE (MBEDTLS_X509_MAX_INTERMEDIATE_CA + 2)
2017-08-14 17:17:14 +02:00
/**
* Verification chain as built by \ c mbedtls_crt_verify_chain ( )
*/
2023-01-11 14:50:10 +01:00
typedef struct {
2021-05-19 19:44:07 +02:00
mbedtls_x509_crt_verify_chain_item MBEDTLS_PRIVATE ( items ) [ MBEDTLS_X509_MAX_VERIFY_CHAIN_SIZE ] ;
unsigned MBEDTLS_PRIVATE ( len ) ;
2019-03-28 14:45:55 +01:00
# if defined(MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK)
/* This stores the list of potential trusted signers obtained from
* the CA callback used for the CRT verification , if configured .
* We must track it somewhere because the callback passes its
* ownership to the caller . */
2021-05-19 19:44:07 +02:00
mbedtls_x509_crt * MBEDTLS_PRIVATE ( trust_ca_cb_result ) ;
2019-03-28 14:45:55 +01:00
# endif /* MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK */
2017-08-14 17:17:14 +02:00
} mbedtls_x509_crt_verify_chain ;
2017-07-11 11:02:20 +02:00
# if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE)
/**
* \ brief Context for resuming X .509 verify operations
*/
2023-01-11 14:50:10 +01:00
typedef struct {
2017-08-14 18:04:19 +02:00
/* for check_signature() */
2021-05-19 17:32:44 +02:00
mbedtls_pk_restart_ctx MBEDTLS_PRIVATE ( pk ) ;
2017-08-14 18:04:19 +02:00
/* for find_parent_in() */
2021-05-19 17:32:44 +02:00
mbedtls_x509_crt * MBEDTLS_PRIVATE ( parent ) ; /* non-null iff parent_in in progress */
mbedtls_x509_crt * MBEDTLS_PRIVATE ( fallback_parent ) ;
int MBEDTLS_PRIVATE ( fallback_signature_is_good ) ;
2017-08-14 18:04:19 +02:00
/* for find_parent() */
2021-05-19 17:32:44 +02:00
int MBEDTLS_PRIVATE ( parent_is_trusted ) ; /* -1 if find_parent is not in progress */
2017-08-14 18:04:19 +02:00
/* for verify_chain() */
2017-08-23 12:32:19 +02:00
enum {
x509_crt_rs_none ,
x509_crt_rs_find_parent ,
2021-05-19 17:32:44 +02:00
} MBEDTLS_PRIVATE ( in_progress ) ; /* none if no operation is in progress */
int MBEDTLS_PRIVATE ( self_cnt ) ;
mbedtls_x509_crt_verify_chain MBEDTLS_PRIVATE ( ver_chain ) ;
2017-08-14 18:04:19 +02:00
2017-07-11 11:02:20 +02:00
} mbedtls_x509_crt_restart_ctx ;
# else /* MBEDTLS_ECDSA_C && MBEDTLS_ECP_RESTARTABLE */
/* Now we can declare functions that take a pointer to that */
typedef void mbedtls_x509_crt_restart_ctx ;
# endif /* MBEDTLS_ECDSA_C && MBEDTLS_ECP_RESTARTABLE */
2015-04-08 12:49:31 +02:00
# if defined(MBEDTLS_X509_CRT_PARSE_C)
2015-06-15 14:34:59 +02:00
/**
* Default security profile . Should provide a good balance between security
* and compatibility with current deployments .
2021-06-02 00:03:26 +02:00
*
* This profile permits :
* - SHA2 hashes with at least 256 bits : SHA - 256 , SHA - 384 , SHA - 512.
2021-06-17 23:17:52 +02:00
* - Elliptic curves with 255 bits and above except secp256k1 .
2021-06-02 00:03:26 +02:00
* - RSA with 2048 bits and above .
*
* New minor versions of Mbed TLS may extend this profile , for example if
2021-06-17 23:17:52 +02:00
* new algorithms are added to the library . New minor versions of Mbed TLS will
2021-06-02 00:03:26 +02:00
* not reduce this profile unless serious security concerns require it .
2015-06-15 14:34:59 +02:00
*/
extern const mbedtls_x509_crt_profile mbedtls_x509_crt_profile_default ;
/**
* Expected next default profile . Recommended for new deployments .
2021-06-02 00:03:26 +02:00
* Currently targets a 128 - bit security level , except for allowing RSA - 2048.
* This profile may change at any time .
2015-06-15 14:34:59 +02:00
*/
extern const mbedtls_x509_crt_profile mbedtls_x509_crt_profile_next ;
/**
* NSA Suite B profile .
*/
extern const mbedtls_x509_crt_profile mbedtls_x509_crt_profile_suiteb ;
2021-06-18 09:48:27 +02:00
/**
* Empty profile that allows nothing . Useful as a basis for constructing
* custom profiles .
*/
extern const mbedtls_x509_crt_profile mbedtls_x509_crt_profile_none ;
2013-08-25 11:47:51 +02:00
/**
2013-09-16 13:49:26 +02:00
* \ brief Parse a single DER formatted certificate and add it
2019-01-31 09:57:44 +01:00
* to the end of the provided chained list .
2013-09-16 13:49:26 +02:00
*
2022-08-04 23:44:59 +02:00
* \ note If # MBEDTLS_USE_PSA_CRYPTO is enabled , the PSA crypto
* subsystem must have been initialized by calling
* psa_crypto_init ( ) before calling this function .
*
2019-01-31 09:57:44 +01:00
* \ param chain The pointer to the start of the CRT chain to attach to .
* When parsing the first CRT in a chain , this should point
* to an instance of : : mbedtls_x509_crt initialized through
* mbedtls_x509_crt_init ( ) .
* \ param buf The buffer holding the DER encoded certificate .
* \ param buflen The size in Bytes of \ p buf .
2013-08-25 11:47:51 +02:00
*
2019-01-31 09:57:44 +01:00
* \ note This function makes an internal copy of the CRT buffer
* \ p buf . In particular , \ p buf may be destroyed or reused
* after this call returns . To avoid duplicating the CRT
* buffer ( at the cost of stricter lifetime constraints ) ,
* use mbedtls_x509_crt_parse_der_nocopy ( ) instead .
*
* \ return \ c 0 if successful .
* \ return A negative error code on failure .
*/
2023-01-11 14:50:10 +01:00
int mbedtls_x509_crt_parse_der ( mbedtls_x509_crt * chain ,
const unsigned char * buf ,
size_t buflen ) ;
2019-01-31 09:57:44 +01:00
2020-04-25 14:41:25 +02:00
/**
* \ brief The type of certificate extension callbacks .
*
* Callbacks of this type are passed to and used by the
2020-05-28 08:34:33 +02:00
* mbedtls_x509_crt_parse_der_with_ext_cb ( ) routine when
2020-06-13 11:08:16 +02:00
* it encounters either an unsupported extension or a
* " certificate policies " extension containing any
* unsupported certificate policies .
2020-06-23 00:15:28 +02:00
* Future versions of the library may invoke the callback
* in other cases , if and when the need arises .
2020-04-25 14:41:25 +02:00
*
2020-05-28 23:41:38 +02:00
* \ param p_ctx An opaque context passed to the callback .
2020-05-28 08:17:38 +02:00
* \ param crt The certificate being parsed .
* \ param oid The OID of the extension .
* \ param critical Whether the extension is critical .
2020-05-28 08:55:08 +02:00
* \ param p Pointer to the start of the extension value
2020-05-28 08:17:38 +02:00
* ( the content of the OCTET STRING ) .
* \ param end End of extension value .
2020-05-29 22:46:56 +02:00
*
* \ note The callback must fail and return a negative error code
* if it can not parse or does not support the extension .
* When the callback fails to parse a critical extension
* mbedtls_x509_crt_parse_der_with_ext_cb ( ) also fails .
* When the callback fails to parse a non critical extension
* mbedtls_x509_crt_parse_der_with_ext_cb ( ) simply skips
* the extension and continues parsing .
2020-04-25 14:41:25 +02:00
*
* \ return \ c 0 on success .
* \ return A negative error code on failure .
*/
2023-01-11 14:50:10 +01:00
typedef int ( * mbedtls_x509_crt_ext_cb_t ) ( void * p_ctx ,
mbedtls_x509_crt const * crt ,
mbedtls_x509_buf const * oid ,
int critical ,
const unsigned char * p ,
const unsigned char * end ) ;
2020-04-25 14:41:25 +02:00
/**
2020-05-28 09:18:42 +02:00
* \ brief Parse a single DER formatted certificate and add it
* to the end of the provided chained list .
2020-04-25 14:41:25 +02:00
*
2022-08-04 23:44:59 +02:00
* \ note If # MBEDTLS_USE_PSA_CRYPTO is enabled , the PSA crypto
* subsystem must have been initialized by calling
* psa_crypto_init ( ) before calling this function .
*
2020-05-28 09:18:42 +02:00
* \ param chain The pointer to the start of the CRT chain to attach to .
* When parsing the first CRT in a chain , this should point
* to an instance of : : mbedtls_x509_crt initialized through
* mbedtls_x509_crt_init ( ) .
* \ param buf The buffer holding the DER encoded certificate .
* \ param buflen The size in Bytes of \ p buf .
* \ param make_copy When not zero this function makes an internal copy of the
* CRT buffer \ p buf . In particular , \ p buf may be destroyed
* or reused after this call returns .
* When zero this function avoids duplicating the CRT buffer
* by taking temporary ownership thereof until the CRT
* is destroyed ( like mbedtls_x509_crt_parse_der_nocopy ( ) )
* \ param cb A callback invoked for every unsupported certificate
* extension .
2020-05-28 23:41:38 +02:00
* \ param p_ctx An opaque context passed to the callback .
2020-04-25 14:41:25 +02:00
*
2020-05-28 09:18:42 +02:00
* \ note This call is functionally equivalent to
* mbedtls_x509_crt_parse_der ( ) , and / or
* mbedtls_x509_crt_parse_der_nocopy ( )
* but it calls the callback with every unsupported
2020-06-13 11:08:16 +02:00
* certificate extension and additionally the
* " certificate policies " extension if it contains any
* unsupported certificate policies .
2020-05-28 09:18:42 +02:00
* The callback must return a negative error code if it
* does not know how to handle such an extension .
2020-05-29 22:46:56 +02:00
* When the callback fails to parse a critical extension
* mbedtls_x509_crt_parse_der_with_ext_cb ( ) also fails .
* When the callback fails to parse a non critical extension
* mbedtls_x509_crt_parse_der_with_ext_cb ( ) simply skips
* the extension and continues parsing .
2020-06-23 00:15:28 +02:00
* Future versions of the library may invoke the callback
* in other cases , if and when the need arises .
2020-04-25 14:41:25 +02:00
*
2020-05-28 09:18:42 +02:00
* \ return \ c 0 if successful .
* \ return A negative error code on failure .
2020-04-25 14:41:25 +02:00
*/
2023-01-11 14:50:10 +01:00
int mbedtls_x509_crt_parse_der_with_ext_cb ( mbedtls_x509_crt * chain ,
const unsigned char * buf ,
size_t buflen ,
int make_copy ,
mbedtls_x509_crt_ext_cb_t cb ,
void * p_ctx ) ;
2020-04-25 14:41:25 +02:00
2019-01-31 09:57:44 +01:00
/**
* \ brief Parse a single DER formatted certificate and add it
* to the end of the provided chained list . This is a
* variant of mbedtls_x509_crt_parse_der ( ) which takes
* temporary ownership of the CRT buffer until the CRT
* is destroyed .
*
2022-08-04 23:44:59 +02:00
* \ note If # MBEDTLS_USE_PSA_CRYPTO is enabled , the PSA crypto
* subsystem must have been initialized by calling
* psa_crypto_init ( ) before calling this function .
*
2019-01-31 09:57:44 +01:00
* \ param chain The pointer to the start of the CRT chain to attach to .
* When parsing the first CRT in a chain , this should point
* to an instance of : : mbedtls_x509_crt initialized through
* mbedtls_x509_crt_init ( ) .
* \ param buf The address of the readable buffer holding the DER encoded
* certificate to use . On success , this buffer must be
2022-10-06 11:23:49 +02:00
* retained and not be changed for the lifetime of the
2019-01-31 09:57:44 +01:00
* CRT chain \ p chain , that is , until \ p chain is destroyed
* through a call to mbedtls_x509_crt_free ( ) .
* \ param buflen The size in Bytes of \ p buf .
*
* \ note This call is functionally equivalent to
* mbedtls_x509_crt_parse_der ( ) , but it avoids creating a
* copy of the input buffer at the cost of stronger lifetime
* constraints . This is useful in constrained environments
* where duplication of the CRT cannot be tolerated .
*
* \ return \ c 0 if successful .
* \ return A negative error code on failure .
2013-08-25 11:47:51 +02:00
*/
2023-01-11 14:50:10 +01:00
int mbedtls_x509_crt_parse_der_nocopy ( mbedtls_x509_crt * chain ,
const unsigned char * buf ,
size_t buflen ) ;
2013-08-25 11:47:51 +02:00
/**
2018-08-23 17:14:00 +02:00
* \ brief Parse one DER - encoded or one or more concatenated PEM - encoded
2018-08-23 16:46:33 +02:00
* certificates and add them to the chained list .
2013-08-25 11:47:51 +02:00
*
2018-08-24 11:01:17 +02:00
* For CRTs in PEM encoding , the function parses permissively :
* if at least one certificate can be parsed , the function
2018-08-23 16:46:33 +02:00
* returns the number of certificates for which parsing failed
* ( hence \ c 0 if all certificates were parsed successfully ) .
* If no certificate could be parsed , the function returns
* the first ( negative ) error encountered during parsing .
*
* PEM encoded certificates may be interleaved by other data
* such as human readable descriptions of their content , as
* long as the certificates are enclosed in the PEM specific
* ' - - - - - { BEGIN / END } CERTIFICATE - - - - - ' delimiters .
*
2022-08-04 23:44:59 +02:00
* \ note If # MBEDTLS_USE_PSA_CRYPTO is enabled , the PSA crypto
* subsystem must have been initialized by calling
* psa_crypto_init ( ) before calling this function .
*
2018-08-23 16:46:33 +02:00
* \ param chain The chain to which to add the parsed certificates .
* \ param buf The buffer holding the certificate data in PEM or DER format .
* For certificates in PEM encoding , this may be a concatenation
* of multiple certificates ; for DER encoding , the buffer must
* comprise exactly one certificate .
* \ param buflen The size of \ p buf , including the terminating \ c NULL byte
* in case of PEM encoded data .
*
* \ return \ c 0 if all certificates were parsed successfully .
* \ return The ( positive ) number of certificates that couldn ' t
* be parsed if parsing was partly successful ( see above ) .
2018-08-23 17:14:00 +02:00
* \ return A negative X509 or PEM error code otherwise .
2013-08-25 11:47:51 +02:00
*
*/
2023-01-11 14:50:10 +01:00
int mbedtls_x509_crt_parse ( mbedtls_x509_crt * chain , const unsigned char * buf , size_t buflen ) ;
2013-08-25 11:47:51 +02:00
2015-04-08 12:49:31 +02:00
# if defined(MBEDTLS_FS_IO)
2013-08-25 11:47:51 +02:00
/**
2013-09-16 13:49:26 +02:00
* \ brief Load one or more certificates and add them
* to the chained list . Parses permissively . If some
* certificates can be parsed , the result is the number
* of failed certificates it encountered . If none complete
* correctly , the first error is returned .
*
2022-08-04 23:44:59 +02:00
* \ note If # MBEDTLS_USE_PSA_CRYPTO is enabled , the PSA crypto
* subsystem must have been initialized by calling
* psa_crypto_init ( ) before calling this function .
*
2013-09-16 13:49:26 +02:00
* \ param chain points to the start of the chain
* \ param path filename to read the certificates from
2013-08-25 11:47:51 +02:00
*
2013-09-16 13:49:26 +02:00
* \ return 0 if all certificates parsed successfully , a positive number
* if partly successful or a specific X509 or PEM error code
2013-08-25 11:47:51 +02:00
*/
2023-01-11 14:50:10 +01:00
int mbedtls_x509_crt_parse_file ( mbedtls_x509_crt * chain , const char * path ) ;
2013-08-25 11:47:51 +02:00
/**
2013-09-16 13:49:26 +02:00
* \ brief Load one or more certificate files from a path and add them
* to the chained list . Parses permissively . If some
* certificates can be parsed , the result is the number
* of failed certificates it encountered . If none complete
* correctly , the first error is returned .
*
* \ param chain points to the start of the chain
* \ param path directory / folder to read the certificate files from
2013-08-25 11:47:51 +02:00
*
2013-09-16 13:49:26 +02:00
* \ return 0 if all certificates parsed successfully , a positive number
* if partly successful or a specific X509 or PEM error code
2013-08-25 11:47:51 +02:00
*/
2023-01-11 14:50:10 +01:00
int mbedtls_x509_crt_parse_path ( mbedtls_x509_crt * chain , const char * path ) ;
2019-05-08 16:26:49 +02:00
2015-04-08 12:49:31 +02:00
# endif /* MBEDTLS_FS_IO */
2021-05-10 15:16:33 +02:00
2020-10-09 10:19:39 +02:00
# if !defined(MBEDTLS_X509_REMOVE_INFO)
2013-08-25 14:47:27 +02:00
/**
2013-09-16 13:49:26 +02:00
* \ brief Returns an informational string about the
* certificate .
2013-08-25 14:47:27 +02:00
*
2013-09-16 13:49:26 +02:00
* \ param buf Buffer to write to
* \ param size Maximum size of buffer
* \ param prefix A line prefix
* \ param crt The X509 certificate to represent
2013-08-26 12:05:14 +02:00
*
2015-06-23 12:10:45 +02:00
* \ return The length of the string written ( not including the
* terminated nul byte ) , or a negative error code .
2013-08-25 14:47:27 +02:00
*/
2023-01-11 14:50:10 +01:00
int mbedtls_x509_crt_info ( char * buf , size_t size , const char * prefix ,
const mbedtls_x509_crt * crt ) ;
2013-08-25 14:47:27 +02:00
2015-04-20 11:38:13 +02:00
/**
* \ brief Returns an informational string about the
* verification status of a certificate .
*
* \ param buf Buffer to write to
* \ param size Maximum size of buffer
* \ param prefix A line prefix
* \ param flags Verification flags created by mbedtls_x509_crt_verify ( )
*
2015-06-23 12:10:45 +02:00
* \ return The length of the string written ( not including the
* terminated nul byte ) , or a negative error code .
2015-04-20 11:38:13 +02:00
*/
2023-01-11 14:50:10 +01:00
int mbedtls_x509_crt_verify_info ( char * buf , size_t size , const char * prefix ,
uint32_t flags ) ;
2019-06-14 18:21:24 +02:00
# endif /* !MBEDTLS_X509_REMOVE_INFO */
2015-04-17 16:14:32 +02:00
2013-08-26 13:41:01 +02:00
/**
2019-03-27 12:48:40 +01:00
* \ brief Verify a chain of certificates .
2013-08-26 13:41:01 +02:00
*
2013-09-16 13:49:26 +02:00
* The verify callback is a user - supplied callback that
* can clear / modify / add flags for a certificate . If set ,
* the verification callback is called for each
* certificate in the chain ( from the trust - ca down to the
* presented crt ) . The parameters for the callback are :
2015-04-08 12:49:31 +02:00
* ( void * parameter , mbedtls_x509_crt * crt , int certificate_depth ,
2013-09-16 13:49:26 +02:00
* int * flags ) . With the flags representing current flags for
* that specific certificate and the certificate depth from
* the bottom ( Peer cert depth = 0 ) .
2013-08-26 13:41:01 +02:00
*
2013-09-16 13:49:26 +02:00
* All flags left after returning from the callback
* are also returned to the application . The function should
2017-06-26 10:11:49 +02:00
* return 0 for anything ( including invalid certificates )
* other than fatal error , as a non - zero return code
* immediately aborts the verification process . For fatal
* errors , a specific error code should be used ( different
* from MBEDTLS_ERR_X509_CERT_VERIFY_FAILED which should not
* be returned at this point ) , or MBEDTLS_ERR_X509_FATAL_ERROR
* can be used if no better code is available .
2013-09-16 13:49:26 +02:00
*
2015-04-20 11:38:13 +02:00
* \ note In case verification failed , the results can be displayed
* using \ c mbedtls_x509_crt_verify_info ( )
*
2015-06-15 10:39:46 +02:00
* \ note Same as \ c mbedtls_x509_crt_verify_with_profile ( ) with the
* default security profile .
*
2016-02-22 11:36:55 +01:00
* \ note It is your responsibility to provide up - to - date CRLs for
* all trusted CAs . If no CRL is provided for the CA that was
* used to sign the certificate , CRL verification is skipped
* silently , that is * without * setting any flag .
*
2017-10-18 14:20:24 +02:00
* \ note The \ c trust_ca list can contain two types of certificates :
2017-06-21 09:35:44 +02:00
* ( 1 ) those of trusted root CAs , so that certificates
* chaining up to those CAs will be trusted , and ( 2 )
* self - signed end - entity certificates to be trusted ( for
* specific peers you know ) - in that case , the self - signed
2017-08-08 18:09:14 +02:00
* certificate doesn ' t need to have the CA bit set .
2017-06-21 09:35:44 +02:00
*
2019-03-27 12:48:40 +01:00
* \ param crt The certificate chain to be verified .
* \ param trust_ca The list of trusted CAs .
* \ param ca_crl The list of CRLs for trusted CAs .
2020-07-24 10:31:37 +02:00
* \ param cn The expected Common Name . This will be checked to be
* present in the certificate ' s subjectAltNames extension or ,
* if this extension is absent , as a CN component in its
2023-05-10 15:57:19 +02:00
* Subject name . DNS names and IP addresses are fully
* supported , while the URI subtype is partially supported :
* only exact matching , without any normalization procedures
* described in 7.4 of RFC5280 , will result in a positive
* URI verification .
* This may be \ c NULL if the CN need not be verified .
2019-03-27 12:48:40 +01:00
* \ param flags The address at which to store the result of the verification .
2019-04-05 17:45:01 +02:00
* If the verification couldn ' t be completed , the flag value is
* set to ( uint32_t ) - 1.
2019-03-27 12:48:40 +01:00
* \ param f_vrfy The verification callback to use . See the documentation
* of mbedtls_x509_crt_verify ( ) for more information .
* \ param p_vrfy The context to be passed to \ p f_vrfy .
*
* \ return \ c 0 if the chain is valid with respect to the
* passed CN , CAs , CRLs and security profile .
* \ return # MBEDTLS_ERR_X509_CERT_VERIFY_FAILED in case the
* certificate chain verification failed . In this case ,
* \ c * flags will have one or more
* \ c MBEDTLS_X509_BADCERT_XXX or \ c MBEDTLS_X509_BADCRL_XXX
* flags set .
* \ return Another negative error code in case of a fatal error
* encountered during the verification process .
2013-08-26 13:41:01 +02:00
*/
2023-01-11 14:50:10 +01:00
int mbedtls_x509_crt_verify ( mbedtls_x509_crt * crt ,
mbedtls_x509_crt * trust_ca ,
mbedtls_x509_crl * ca_crl ,
const char * cn , uint32_t * flags ,
int ( * f_vrfy ) ( void * , mbedtls_x509_crt * , int , uint32_t * ) ,
void * p_vrfy ) ;
2013-08-26 13:41:01 +02:00
2015-06-15 10:39:46 +02:00
/**
2019-03-27 12:48:40 +01:00
* \ brief Verify a chain of certificates with respect to
* a configurable security profile .
2015-06-15 10:39:46 +02:00
*
* \ note Same as \ c mbedtls_x509_crt_verify ( ) , but with explicit
* security profile .
*
2015-06-17 11:49:39 +02:00
* \ note The restrictions on keys ( RSA minimum size , allowed curves
2015-10-23 14:08:48 +02:00
* for ECDSA ) apply to all certificates : trusted root ,
* intermediate CAs if any , and end entity certificate .
2015-06-17 11:49:39 +02:00
*
2019-03-27 12:48:40 +01:00
* \ param crt The certificate chain to be verified .
* \ param trust_ca The list of trusted CAs .
* \ param ca_crl The list of CRLs for trusted CAs .
* \ param profile The security profile to use for the verification .
* \ param cn The expected Common Name . This may be \ c NULL if the
* CN need not be verified .
* \ param flags The address at which to store the result of the verification .
2019-04-05 17:45:01 +02:00
* If the verification couldn ' t be completed , the flag value is
* set to ( uint32_t ) - 1.
2019-03-27 12:48:40 +01:00
* \ param f_vrfy The verification callback to use . See the documentation
* of mbedtls_x509_crt_verify ( ) for more information .
* \ param p_vrfy The context to be passed to \ p f_vrfy .
*
* \ return \ c 0 if the chain is valid with respect to the
* passed CN , CAs , CRLs and security profile .
* \ return # MBEDTLS_ERR_X509_CERT_VERIFY_FAILED in case the
* certificate chain verification failed . In this case ,
* \ c * flags will have one or more
* \ c MBEDTLS_X509_BADCERT_XXX or \ c MBEDTLS_X509_BADCRL_XXX
* flags set .
* \ return Another negative error code in case of a fatal error
* encountered during the verification process .
2015-06-15 10:39:46 +02:00
*/
2023-01-11 14:50:10 +01:00
int mbedtls_x509_crt_verify_with_profile ( mbedtls_x509_crt * crt ,
mbedtls_x509_crt * trust_ca ,
mbedtls_x509_crl * ca_crl ,
const mbedtls_x509_crt_profile * profile ,
const char * cn , uint32_t * flags ,
int ( * f_vrfy ) ( void * , mbedtls_x509_crt * , int , uint32_t * ) ,
void * p_vrfy ) ;
2015-06-15 10:39:46 +02:00
2017-07-11 11:02:20 +02:00
/**
* \ brief Restartable version of \ c mbedtls_crt_verify_with_profile ( )
*
* \ note Performs the same job as \ c mbedtls_crt_verify_with_profile ( )
* but can return early and restart according to the limit
* set with \ c mbedtls_ecp_set_max_ops ( ) to reduce blocking .
*
2019-03-27 12:48:40 +01:00
* \ param crt The certificate chain to be verified .
* \ param trust_ca The list of trusted CAs .
* \ param ca_crl The list of CRLs for trusted CAs .
* \ param profile The security profile to use for the verification .
* \ param cn The expected Common Name . This may be \ c NULL if the
* CN need not be verified .
* \ param flags The address at which to store the result of the verification .
2019-04-05 17:45:01 +02:00
* If the verification couldn ' t be completed , the flag value is
* set to ( uint32_t ) - 1.
2019-03-27 12:48:40 +01:00
* \ param f_vrfy The verification callback to use . See the documentation
* of mbedtls_x509_crt_verify ( ) for more information .
* \ param p_vrfy The context to be passed to \ p f_vrfy .
* \ param rs_ctx The restart context to use . This may be set to \ c NULL
* to disable restartable ECC .
2017-07-11 11:02:20 +02:00
*
* \ return See \ c mbedtls_crt_verify_with_profile ( ) , or
2018-09-12 10:55:15 +02:00
* \ return # MBEDTLS_ERR_ECP_IN_PROGRESS if maximum number of
2017-07-11 11:02:20 +02:00
* operations was reached : see \ c mbedtls_ecp_set_max_ops ( ) .
*/
2023-01-11 14:50:10 +01:00
int mbedtls_x509_crt_verify_restartable ( mbedtls_x509_crt * crt ,
mbedtls_x509_crt * trust_ca ,
mbedtls_x509_crl * ca_crl ,
const mbedtls_x509_crt_profile * profile ,
const char * cn , uint32_t * flags ,
int ( * f_vrfy ) ( void * , mbedtls_x509_crt * , int , uint32_t * ) ,
void * p_vrfy ,
mbedtls_x509_crt_restart_ctx * rs_ctx ) ;
2017-07-11 11:02:20 +02:00
2019-03-27 12:01:17 +01:00
/**
* \ brief The type of trusted certificate callbacks .
*
* Callbacks of this type are passed to and used by the CRT
2019-04-01 13:33:49 +02:00
* verification routine mbedtls_x509_crt_verify_with_ca_cb ( )
2019-03-27 12:01:17 +01:00
* when looking for trusted signers of a given certificate .
*
* On success , the callback returns a list of trusted
* certificates to be considered as potential signers
* for the input certificate .
*
* \ param p_ctx An opaque context passed to the callback .
* \ param child The certificate for which to search a potential signer .
2019-04-01 13:58:30 +02:00
* This will point to a readable certificate .
2019-03-27 12:01:17 +01:00
* \ param candidate_cas The address at which to store the address of the first
* entry in the generated linked list of candidate signers .
2019-04-01 13:58:30 +02:00
* This will not be \ c NULL .
2019-03-27 12:01:17 +01:00
*
* \ note The callback must only return a non - zero value on a
* fatal error . If , in contrast , the search for a potential
* signer completes without a single candidate , the
2019-04-01 13:58:30 +02:00
* callback must return \ c 0 and set \ c * candidate_cas
2019-03-27 12:01:17 +01:00
* to \ c NULL .
*
* \ return \ c 0 on success . In this case , \ c * candidate_cas points
* to a heap - allocated linked list of instances of
* : : mbedtls_x509_crt , and ownership of this list is passed
* to the caller .
* \ return A negative error code on failure .
*/
2023-01-11 14:50:10 +01:00
typedef int ( * mbedtls_x509_crt_ca_cb_t ) ( void * p_ctx ,
mbedtls_x509_crt const * child ,
mbedtls_x509_crt * * candidate_cas ) ;
2019-03-28 14:55:38 +01:00
# if defined(MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK)
2019-03-27 12:01:17 +01:00
/**
* \ brief Version of \ c mbedtls_x509_crt_verify_with_profile ( ) which
* uses a callback to acquire the list of trusted CA
* certificates .
*
* \ param crt The certificate chain to be verified .
* \ param f_ca_cb The callback to be used to query for potential signers
* of a given child certificate . See the documentation of
* : : mbedtls_x509_crt_ca_cb_t for more information .
* \ param p_ca_cb The opaque context to be passed to \ p f_ca_cb .
* \ param profile The security profile for the verification .
* \ param cn The expected Common Name . This may be \ c NULL if the
* CN need not be verified .
* \ param flags The address at which to store the result of the verification .
2019-04-05 17:45:01 +02:00
* If the verification couldn ' t be completed , the flag value is
* set to ( uint32_t ) - 1.
2019-03-27 12:01:17 +01:00
* \ param f_vrfy The verification callback to use . See the documentation
* of mbedtls_x509_crt_verify ( ) for more information .
* \ param p_vrfy The context to be passed to \ p f_vrfy .
*
* \ return See \ c mbedtls_crt_verify_with_profile ( ) .
*/
2023-01-11 14:50:10 +01:00
int mbedtls_x509_crt_verify_with_ca_cb ( mbedtls_x509_crt * crt ,
mbedtls_x509_crt_ca_cb_t f_ca_cb ,
void * p_ca_cb ,
const mbedtls_x509_crt_profile * profile ,
const char * cn , uint32_t * flags ,
int ( * f_vrfy ) ( void * , mbedtls_x509_crt * , int , uint32_t * ) ,
void * p_vrfy ) ;
2019-03-27 12:01:17 +01:00
# endif /* MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK */
2014-04-09 09:50:03 +02:00
/**
* \ brief Check usage of certificate against keyUsage extension .
*
* \ param crt Leaf certificate used .
2015-06-23 10:48:44 +02:00
* \ param usage Intended usage ( s ) ( eg MBEDTLS_X509_KU_KEY_ENCIPHERMENT
* before using the certificate to perform an RSA key
* exchange ) .
*
* \ note Except for decipherOnly and encipherOnly , a bit set in the
* usage argument means this bit MUST be set in the
* certificate . For decipherOnly and encipherOnly , it means
* that bit MAY be set .
2014-04-09 09:50:03 +02:00
*
* \ return 0 is these uses of the certificate are allowed ,
2015-04-08 12:49:31 +02:00
* MBEDTLS_ERR_X509_BAD_INPUT_DATA if the keyUsage extension
2015-06-23 10:48:44 +02:00
* is present but does not match the usage argument .
2014-04-09 09:50:03 +02:00
*
* \ note You should only call this function on leaf certificates , on
* ( intermediate ) CAs the keyUsage extension is automatically
2015-04-08 12:49:31 +02:00
* checked by \ c mbedtls_x509_crt_verify ( ) .
2014-04-09 09:50:03 +02:00
*/
2023-01-11 14:50:10 +01:00
int mbedtls_x509_crt_check_key_usage ( const mbedtls_x509_crt * crt ,
unsigned int usage ) ;
2014-04-09 09:50:03 +02:00
2014-04-10 17:53:56 +02:00
/**
2017-11-14 22:40:51 +01:00
* \ brief Check usage of certificate against extendedKeyUsage .
2014-04-10 17:53:56 +02:00
*
2017-11-14 22:40:51 +01:00
* \ param crt Leaf certificate used .
* \ param usage_oid Intended usage ( eg MBEDTLS_OID_SERVER_AUTH or
* MBEDTLS_OID_CLIENT_AUTH ) .
2015-04-08 12:49:31 +02:00
* \ param usage_len Length of usage_oid ( eg given by MBEDTLS_OID_SIZE ( ) ) .
2014-04-10 17:53:56 +02:00
*
2017-11-14 22:40:51 +01:00
* \ return 0 if this use of the certificate is allowed ,
* MBEDTLS_ERR_X509_BAD_INPUT_DATA if not .
2014-04-10 17:53:56 +02:00
*
2017-11-14 22:40:51 +01:00
* \ note Usually only makes sense on leaf certificates .
2014-04-10 17:53:56 +02:00
*/
2023-01-11 14:50:10 +01:00
int mbedtls_x509_crt_check_extended_key_usage ( const mbedtls_x509_crt * crt ,
const char * usage_oid ,
size_t usage_len ) ;
2014-04-10 17:53:56 +02:00
2015-04-08 12:49:31 +02:00
# if defined(MBEDTLS_X509_CRL_PARSE_C)
2013-08-26 13:41:01 +02:00
/**
2013-09-23 12:20:02 +02:00
* \ brief Verify the certificate revocation status
2013-08-26 13:41:01 +02:00
*
2013-09-16 13:49:26 +02:00
* \ param crt a certificate to be verified
* \ param crl the CRL to verify against
*
* \ return 1 if the certificate is revoked , 0 otherwise
2013-08-26 13:41:01 +02:00
*
*/
2023-01-11 14:50:10 +01:00
int mbedtls_x509_crt_is_revoked ( const mbedtls_x509_crt * crt , const mbedtls_x509_crl * crl ) ;
2015-04-08 12:49:31 +02:00
# endif /* MBEDTLS_X509_CRL_PARSE_C */
2013-08-26 13:41:01 +02:00
2013-09-18 11:58:25 +02:00
/**
* \ brief Initialize a certificate ( chain )
*
* \ param crt Certificate chain to initialize
*/
2023-01-11 14:50:10 +01:00
void mbedtls_x509_crt_init ( mbedtls_x509_crt * crt ) ;
2013-09-18 11:58:25 +02:00
2013-08-25 11:47:51 +02:00
/**
2013-09-16 13:49:26 +02:00
* \ brief Unallocate all certificate data
2013-08-25 11:47:51 +02:00
*
2013-09-16 13:49:26 +02:00
* \ param crt Certificate chain to free
2013-08-25 11:47:51 +02:00
*/
2023-01-11 14:50:10 +01:00
void mbedtls_x509_crt_free ( mbedtls_x509_crt * crt ) ;
2017-07-11 11:02:20 +02:00
# if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE)
/**
* \ brief Initialize a restart context
*/
2023-01-11 14:50:10 +01:00
void mbedtls_x509_crt_restart_init ( mbedtls_x509_crt_restart_ctx * ctx ) ;
2017-07-11 11:02:20 +02:00
/**
* \ brief Free the components of a restart context
*/
2023-01-11 14:50:10 +01:00
void mbedtls_x509_crt_restart_free ( mbedtls_x509_crt_restart_ctx * ctx ) ;
2017-07-11 11:02:20 +02:00
# endif /* MBEDTLS_ECDSA_C && MBEDTLS_ECP_RESTARTABLE */
2015-04-08 12:49:31 +02:00
# endif /* MBEDTLS_X509_CRT_PARSE_C */
2013-09-16 13:49:26 +02:00
2022-06-06 16:42:32 +02:00
/**
* \ brief Query certificate for given extension type
*
* \ param [ in ] ctx Certificate context to be queried , must not be \ c NULL
* \ param ext_type Extension type being queried for , must be a valid
* extension type . Must be one of the MBEDTLS_X509_EXT_XXX
* values
*
* \ return 0 if the given extension type is not present ,
* non - zero otherwise
*/
2023-01-11 14:50:10 +01:00
static inline int mbedtls_x509_crt_has_ext_type ( const mbedtls_x509_crt * ctx ,
int ext_type )
2022-06-06 16:42:32 +02:00
{
return ctx - > MBEDTLS_PRIVATE ( ext_types ) & ext_type ;
}
2021-12-28 16:22:52 +01:00
/** \} name Structures and functions for parsing and writing X.509 certificates */
2013-08-25 10:18:25 +02:00
2015-04-08 12:49:31 +02:00
# if defined(MBEDTLS_X509_CRT_WRITE_C)
2013-09-06 09:55:26 +02:00
/**
* \ brief Initialize a CRT writing context
*
* \ param ctx CRT context to initialize
*/
2023-01-11 14:50:10 +01:00
void mbedtls_x509write_crt_init ( mbedtls_x509write_cert * ctx ) ;
2013-09-06 09:55:26 +02:00
/**
2021-12-21 06:14:10 +01:00
* \ brief Set the version for a Certificate
2015-04-08 12:49:31 +02:00
* Default : MBEDTLS_X509_CRT_VERSION_3
2013-09-06 09:55:26 +02:00
*
* \ param ctx CRT context to use
2015-04-08 12:49:31 +02:00
* \ param version version to set ( MBEDTLS_X509_CRT_VERSION_1 , MBEDTLS_X509_CRT_VERSION_2 or
* MBEDTLS_X509_CRT_VERSION_3 )
2013-09-06 09:55:26 +02:00
*/
2023-01-11 14:50:10 +01:00
void mbedtls_x509write_crt_set_version ( mbedtls_x509write_cert * ctx , int version ) ;
2013-09-06 09:55:26 +02:00
2023-01-09 12:19:40 +01:00
# if defined(MBEDTLS_BIGNUM_C) && !defined(MBEDTLS_DEPRECATED_REMOVED)
2013-09-06 09:55:26 +02:00
/**
* \ brief Set the serial number for a Certificate .
*
2023-01-05 16:46:59 +01:00
* \ deprecated This function is deprecated and will be removed in a
* future version of the library . Please use
2023-01-26 17:43:09 +01:00
* mbedtls_x509write_crt_set_serial_raw ( ) instead .
2023-01-05 16:46:59 +01:00
*
* \ note Even though the MBEDTLS_BIGNUM_C guard looks redundant since
* X509 depends on PK and PK depends on BIGNUM , this emphasizes
* a direct dependency between X509 and BIGNUM which is going
* to be deprecated in the future .
*
2013-09-06 09:55:26 +02:00
* \ param ctx CRT context to use
* \ param serial serial number to set
*
* \ return 0 if successful
*/
2023-01-09 12:19:40 +01:00
int MBEDTLS_DEPRECATED mbedtls_x509write_crt_set_serial (
mbedtls_x509write_cert * ctx , const mbedtls_mpi * serial ) ;
# endif // MBEDTLS_BIGNUM_C && !MBEDTLS_DEPRECATED_REMOVED
2023-01-05 16:46:59 +01:00
/**
* \ brief Set the serial number for a Certificate .
*
2023-01-10 11:46:34 +01:00
* \ param ctx CRT context to use
* \ param serial A raw array of bytes containing the serial number in big
* endian format
2023-01-26 17:49:10 +01:00
* \ param serial_len Length of valid bytes ( expressed in bytes ) in \ p serial
* input buffer
2023-01-05 16:46:59 +01:00
*
* \ return 0 if successful , or
2023-01-09 17:19:26 +01:00
* MBEDTLS_ERR_X509_BAD_INPUT_DATA if the provided input buffer
* is too big ( longer than MBEDTLS_X509_RFC5280_MAX_SERIAL_LEN )
2023-01-05 16:46:59 +01:00
*/
2023-01-26 17:43:09 +01:00
int mbedtls_x509write_crt_set_serial_raw ( mbedtls_x509write_cert * ctx ,
2023-01-10 11:46:34 +01:00
unsigned char * serial , size_t serial_len ) ;
2013-09-06 09:55:26 +02:00
/**
* \ brief Set the validity period for a Certificate
* Timestamps should be in string format for UTC timezone
* i . e . " YYYYMMDDhhmmss "
* e . g . " 20131231235959 " for December 31 st 2013
* at 23 : 59 : 59
*
* \ param ctx CRT context to use
* \ param not_before not_before timestamp
* \ param not_after not_after timestamp
*
* \ return 0 if timestamp was parsed successfully , or
* a specific error code
*/
2023-01-11 14:50:10 +01:00
int mbedtls_x509write_crt_set_validity ( mbedtls_x509write_cert * ctx , const char * not_before ,
const char * not_after ) ;
2013-09-06 09:55:26 +02:00
/**
* \ brief Set the issuer name for a Certificate
* Issuer names should contain a comma - separated list
* of OID types and values :
2015-01-22 17:11:05 +01:00
* e . g . " C=UK,O=ARM,CN=mbed TLS CA "
2013-09-06 09:55:26 +02:00
*
* \ param ctx CRT context to use
* \ param issuer_name issuer name to set
*
* \ return 0 if issuer name was parsed successfully , or
* a specific error code
*/
2023-01-11 14:50:10 +01:00
int mbedtls_x509write_crt_set_issuer_name ( mbedtls_x509write_cert * ctx ,
const char * issuer_name ) ;
2013-09-06 09:55:26 +02:00
/**
* \ brief Set the subject name for a Certificate
* Subject names should contain a comma - separated list
* of OID types and values :
2015-01-22 17:11:05 +01:00
* e . g . " C=UK,O=ARM,CN=mbed TLS Server 1 "
2013-09-06 09:55:26 +02:00
*
* \ param ctx CRT context to use
* \ param subject_name subject name to set
*
* \ return 0 if subject name was parsed successfully , or
* a specific error code
*/
2023-01-11 14:50:10 +01:00
int mbedtls_x509write_crt_set_subject_name ( mbedtls_x509write_cert * ctx ,
const char * subject_name ) ;
2013-09-06 09:55:26 +02:00
/**
* \ brief Set the subject public key for the certificate
*
* \ param ctx CRT context to use
2013-09-12 05:21:54 +02:00
* \ param key public key to include
2013-09-06 09:55:26 +02:00
*/
2023-01-11 14:50:10 +01:00
void mbedtls_x509write_crt_set_subject_key ( mbedtls_x509write_cert * ctx , mbedtls_pk_context * key ) ;
2013-09-06 09:55:26 +02:00
/**
* \ brief Set the issuer key used for signing the certificate
*
* \ param ctx CRT context to use
2013-09-12 05:21:54 +02:00
* \ param key private key to sign with
2013-09-06 09:55:26 +02:00
*/
2023-01-11 14:50:10 +01:00
void mbedtls_x509write_crt_set_issuer_key ( mbedtls_x509write_cert * ctx , mbedtls_pk_context * key ) ;
2013-09-06 09:55:26 +02:00
/**
* \ brief Set the MD algorithm to use for the signature
2015-04-08 12:49:31 +02:00
* ( e . g . MBEDTLS_MD_SHA1 )
2013-09-06 09:55:26 +02:00
*
* \ param ctx CRT context to use
2013-12-30 17:57:27 +01:00
* \ param md_alg MD algorithm to use
2013-09-06 09:55:26 +02:00
*/
2023-01-11 14:50:10 +01:00
void mbedtls_x509write_crt_set_md_alg ( mbedtls_x509write_cert * ctx , mbedtls_md_type_t md_alg ) ;
2013-09-06 09:55:26 +02:00
2013-09-06 19:27:21 +02:00
/**
* \ brief Generic function to add to or replace an extension in the
* CRT
*
* \ param ctx CRT context to use
* \ param oid OID of the extension
* \ param oid_len length of the OID
* \ param critical if the extension is critical ( per the RFC ' s definition )
* \ param val value of the extension OCTET STRING
* \ param val_len length of the value data
*
2015-05-28 09:33:39 +02:00
* \ return 0 if successful , or a MBEDTLS_ERR_X509_ALLOC_FAILED
2013-09-06 19:27:21 +02:00
*/
2023-01-11 14:50:10 +01:00
int mbedtls_x509write_crt_set_extension ( mbedtls_x509write_cert * ctx ,
const char * oid , size_t oid_len ,
int critical ,
const unsigned char * val , size_t val_len ) ;
2013-09-06 19:27:21 +02:00
/**
* \ brief Set the basicConstraints extension for a CRT
*
* \ param ctx CRT context to use
* \ param is_ca is this a CA certificate
* \ param max_pathlen maximum length of certificate chains below this
* certificate ( only for CA certificates , - 1 is
2022-05-26 12:51:00 +02:00
* unlimited )
2013-09-06 19:27:21 +02:00
*
2015-05-28 09:33:39 +02:00
* \ return 0 if successful , or a MBEDTLS_ERR_X509_ALLOC_FAILED
2013-09-06 19:27:21 +02:00
*/
2023-01-11 14:50:10 +01:00
int mbedtls_x509write_crt_set_basic_constraints ( mbedtls_x509write_cert * ctx ,
int is_ca , int max_pathlen ) ;
2013-09-06 19:27:21 +02:00
2023-03-17 12:08:50 +01:00
# if defined(MBEDTLS_MD_CAN_SHA1)
2013-09-06 19:27:21 +02:00
/**
* \ brief Set the subjectKeyIdentifier extension for a CRT
2015-04-08 12:49:31 +02:00
* Requires that mbedtls_x509write_crt_set_subject_key ( ) has been
2013-09-06 19:27:21 +02:00
* called before
*
* \ param ctx CRT context to use
*
2015-05-28 09:33:39 +02:00
* \ return 0 if successful , or a MBEDTLS_ERR_X509_ALLOC_FAILED
2013-09-06 19:27:21 +02:00
*/
2023-01-11 14:50:10 +01:00
int mbedtls_x509write_crt_set_subject_key_identifier ( mbedtls_x509write_cert * ctx ) ;
2013-09-06 19:27:21 +02:00
/**
* \ brief Set the authorityKeyIdentifier extension for a CRT
2015-04-08 12:49:31 +02:00
* Requires that mbedtls_x509write_crt_set_issuer_key ( ) has been
2013-09-06 19:27:21 +02:00
* called before
*
* \ param ctx CRT context to use
*
2015-05-28 09:33:39 +02:00
* \ return 0 if successful , or a MBEDTLS_ERR_X509_ALLOC_FAILED
2013-09-06 19:27:21 +02:00
*/
2023-01-11 14:50:10 +01:00
int mbedtls_x509write_crt_set_authority_key_identifier ( mbedtls_x509write_cert * ctx ) ;
2023-03-17 12:08:50 +01:00
# endif /* MBEDTLS_MD_CAN_SHA1 */
2013-08-25 10:18:25 +02:00
2013-08-25 11:47:51 +02:00
/**
2013-09-09 12:37:54 +02:00
* \ brief Set the Key Usage Extension flags
2015-04-08 12:49:31 +02:00
* ( e . g . MBEDTLS_X509_KU_DIGITAL_SIGNATURE | MBEDTLS_X509_KU_KEY_CERT_SIGN )
2013-09-09 12:37:54 +02:00
*
* \ param ctx CRT context to use
* \ param key_usage key usage flags to set
*
2015-05-28 09:33:39 +02:00
* \ return 0 if successful , or MBEDTLS_ERR_X509_ALLOC_FAILED
2013-09-09 12:37:54 +02:00
*/
2023-01-11 14:50:10 +01:00
int mbedtls_x509write_crt_set_key_usage ( mbedtls_x509write_cert * ctx ,
unsigned int key_usage ) ;
2013-09-09 12:37:54 +02:00
2015-09-09 20:03:34 +02:00
/**
* \ brief Set the Extended Key Usage Extension
* ( e . g . MBEDTLS_OID_SERVER_AUTH )
*
* \ param ctx CRT context to use
* \ param exts extended key usage extensions to set , a sequence of
* MBEDTLS_ASN1_OID objects
*
* \ return 0 if successful , or MBEDTLS_ERR_X509_ALLOC_FAILED
*/
2023-01-11 14:50:10 +01:00
int mbedtls_x509write_crt_set_ext_key_usage ( mbedtls_x509write_cert * ctx ,
const mbedtls_asn1_sequence * exts ) ;
2015-09-09 20:03:34 +02:00
2013-09-09 12:37:54 +02:00
/**
* \ brief Set the Netscape Cert Type flags
2015-04-08 12:49:31 +02:00
* ( e . g . MBEDTLS_X509_NS_CERT_TYPE_SSL_CLIENT | MBEDTLS_X509_NS_CERT_TYPE_EMAIL )
2013-09-09 12:37:54 +02:00
*
* \ param ctx CRT context to use
* \ param ns_cert_type Netscape Cert Type flags to set
*
2015-05-28 09:33:39 +02:00
* \ return 0 if successful , or MBEDTLS_ERR_X509_ALLOC_FAILED
2013-09-09 12:37:54 +02:00
*/
2023-01-11 14:50:10 +01:00
int mbedtls_x509write_crt_set_ns_cert_type ( mbedtls_x509write_cert * ctx ,
unsigned char ns_cert_type ) ;
2013-09-09 12:37:54 +02:00
2013-09-06 09:55:26 +02:00
/**
* \ brief Free the contents of a CRT write context
*
* \ param ctx CRT context to free
*/
2023-01-11 14:50:10 +01:00
void mbedtls_x509write_crt_free ( mbedtls_x509write_cert * ctx ) ;
2013-09-06 09:55:26 +02:00
/**
* \ brief Write a built up certificate to a X509 DER structure
2013-08-25 11:47:51 +02:00
* Note : data is written at the end of the buffer ! Use the
* return value to determine where you should start
* using the buffer
*
2013-12-30 17:57:27 +01:00
* \ param ctx certificate to write away
2013-08-25 11:47:51 +02:00
* \ param buf buffer to write to
* \ param size size of the buffer
2021-06-15 11:29:26 +02:00
* \ param f_rng RNG function . This must not be \ c NULL .
2013-09-12 05:59:05 +02:00
* \ param p_rng RNG parameter
2013-08-25 11:47:51 +02:00
*
* \ return length of data written if successful , or a specific
* error code
2013-09-12 05:59:05 +02:00
*
2021-06-15 11:29:26 +02:00
* \ note \ p f_rng is used for the signature operation .
2013-08-25 11:47:51 +02:00
*/
2023-01-11 14:50:10 +01:00
int mbedtls_x509write_crt_der ( mbedtls_x509write_cert * ctx , unsigned char * buf , size_t size ,
int ( * f_rng ) ( void * , unsigned char * , size_t ) ,
void * p_rng ) ;
2013-08-25 11:47:51 +02:00
2015-04-08 12:49:31 +02:00
# if defined(MBEDTLS_PEM_WRITE_C)
2013-08-26 17:22:23 +02:00
/**
2013-09-06 09:55:26 +02:00
* \ brief Write a built up certificate to a X509 PEM string
*
2013-12-30 17:57:27 +01:00
* \ param ctx certificate to write away
2013-09-06 09:55:26 +02:00
* \ param buf buffer to write to
* \ param size size of the buffer
2021-06-15 11:29:26 +02:00
* \ param f_rng RNG function . This must not be \ c NULL .
2013-09-12 05:59:05 +02:00
* \ param p_rng RNG parameter
2013-09-06 09:55:26 +02:00
*
2015-05-29 12:53:47 +02:00
* \ return 0 if successful , or a specific error code
2013-09-12 05:59:05 +02:00
*
2021-06-15 11:29:26 +02:00
* \ note \ p f_rng is used for the signature operation .
2013-09-06 09:55:26 +02:00
*/
2023-01-11 14:50:10 +01:00
int mbedtls_x509write_crt_pem ( mbedtls_x509write_cert * ctx , unsigned char * buf , size_t size ,
int ( * f_rng ) ( void * , unsigned char * , size_t ) ,
void * p_rng ) ;
2015-04-08 12:49:31 +02:00
# endif /* MBEDTLS_PEM_WRITE_C */
# endif /* MBEDTLS_X509_CRT_WRITE_C */
2013-08-26 16:54:13 +02:00
2021-12-30 12:33:31 +01:00
/** \} addtogroup x509_module */
2013-06-27 14:29:21 +02:00
# ifdef __cplusplus
}
# endif
2015-04-08 12:49:31 +02:00
# endif /* mbedtls_x509_crt.h */