2013-09-16 13:49:26 +02:00
/**
2016-01-03 17:14:14 +01:00
* \ file x509_csr . h
2013-09-16 13:49:26 +02:00
*
* \ brief X .509 certificate signing request 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
2013-09-16 13:49:26 +02: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
2013-09-16 13:49:26 +02:00
*
2015-09-04 14:21:07 +02:00
* http : //www.apache.org/licenses/LICENSE-2.0
2013-09-16 13:49:26 +02: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 .
2013-09-16 13:49:26 +02:00
*/
2015-04-08 12:49:31 +02:00
# ifndef MBEDTLS_X509_CSR_H
# define MBEDTLS_X509_CSR_H
2021-05-19 19:44:07 +02:00
# include "mbedtls/private_access.h"
2013-09-16 13:49:26 +02:00
2021-05-27 11:25:03 +02:00
# include "mbedtls/build_info.h"
2013-09-16 13:49:26 +02:00
2019-07-04 21:01:14 +02:00
# include "mbedtls/x509.h"
2013-09-16 13:49:26 +02:00
# ifdef __cplusplus
extern " C " {
# endif
/**
* \ addtogroup x509_module
* \ { */
/**
* \ name Structures and functions for X .509 Certificate Signing Requests ( CSR )
* \ {
*/
/**
* Certificate Signing Request ( CSR ) structure .
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
2021-08-31 22:59:35 +02:00
* those fields or the data that those fields point to is unspecified .
2013-09-16 13:49:26 +02:00
*/
2023-01-11 14:50:10 +01:00
typedef struct mbedtls_x509_csr {
2021-08-04 21:56:10 +02:00
mbedtls_x509_buf raw ; /**< The raw CSR data (DER). */
mbedtls_x509_buf cri ; /**< The raw CertificateRequestInfo body (DER). */
2013-09-16 13:49:26 +02:00
2021-08-04 21:56:10 +02:00
int version ; /**< CSR version (1=v1). */
2013-09-16 13:49:26 +02:00
2021-08-04 21:56:10 +02:00
mbedtls_x509_buf subject_raw ; /**< The raw subject data (DER). */
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_pk_context pk ; /**< Container for the public key context. */
2013-09-16 13:49:26 +02:00
2019-10-29 23:03:37 +01:00
unsigned int key_usage ; /**< Optional key usage extension value: See the values in x509.h */
unsigned char ns_cert_type ; /**< Optional Netscape certificate type extension value: See the values in x509.h */
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. */
2019-10-29 23:03:37 +01:00
2023-01-12 12:58:02 +01:00
int MBEDTLS_PRIVATE ( ext_types ) ; /**< Bit string containing detected and parsed extensions */
2021-08-04 21:56:10 +02:00
mbedtls_x509_buf sig_oid ;
2021-05-19 19:44:07 +02:00
mbedtls_x509_buf MBEDTLS_PRIVATE ( sig ) ;
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
}
2015-04-08 12:49:31 +02:00
mbedtls_x509_csr ;
2013-09-16 13:49:26 +02:00
/**
* Container for writing a CSR
*/
2023-01-11 14:50:10 +01:00
typedef struct mbedtls_x509write_csr {
2021-05-19 19:44:07 +02:00
mbedtls_pk_context * MBEDTLS_PRIVATE ( key ) ;
mbedtls_asn1_named_data * MBEDTLS_PRIVATE ( subject ) ;
mbedtls_md_type_t MBEDTLS_PRIVATE ( md_alg ) ;
mbedtls_asn1_named_data * MBEDTLS_PRIVATE ( extensions ) ;
2013-09-16 13:49:26 +02:00
}
2015-04-08 12:49:31 +02:00
mbedtls_x509write_csr ;
2013-09-16 13:49:26 +02:00
2015-04-08 12:49:31 +02:00
# if defined(MBEDTLS_X509_CSR_PARSE_C)
2013-09-16 13:49:26 +02:00
/**
2014-06-16 18:06:48 +02:00
* \ brief Load a Certificate Signing Request ( CSR ) in DER format
*
2016-02-24 15:36:05 +01:00
* \ note CSR attributes ( if any ) are currently silently ignored .
*
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 .
*
2014-06-16 18:06:48 +02:00
* \ param csr CSR context to fill
* \ param buf buffer holding the CRL data
* \ param buflen size of the buffer
*
* \ return 0 if successful , or a specific X509 error code
*/
2023-01-11 14:50:10 +01:00
int mbedtls_x509_csr_parse_der ( mbedtls_x509_csr * csr ,
const unsigned char * buf , size_t buflen ) ;
2014-06-16 18:06:48 +02:00
2023-10-18 13:20:59 +02:00
/**
* \ brief The type of certificate extension callbacks .
*
* Callbacks of this type are passed to and used by the
* mbedtls_x509_csr_parse_der_with_ext_cb ( ) routine when
* it encounters either an unsupported extension .
* Future versions of the library may invoke the callback
* in other cases , if and when the need arises .
*
* \ param p_ctx An opaque context passed to the callback .
* \ param csr The CSR being parsed .
* \ param oid The OID of the extension .
* \ param critical Whether the extension is critical .
* \ param p Pointer to the start of the extension value
* ( the content of the OCTET STRING ) .
* \ param end End of extension value .
*
* \ 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_csr_parse_der_with_ext_cb ( ) also fails .
* When the callback fails to parse a non critical extension
* mbedtls_x509_csr_parse_der_with_ext_cb ( ) simply skips
* the extension and continues parsing .
*
* \ return \ c 0 on success .
* \ return A negative error code on failure .
*/
typedef int ( * mbedtls_x509_csr_ext_cb_t ) ( void * p_ctx ,
mbedtls_x509_csr const * csr ,
mbedtls_x509_buf const * oid ,
int critical ,
const unsigned char * p ,
const unsigned char * end ) ;
/**
* \ brief Load a Certificate Signing Request ( CSR ) in DER format
*
* \ note CSR attributes ( if any ) are currently silently ignored .
*
* \ 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 .
*
* \ param csr CSR context to fill
* \ param buf buffer holding the CRL data
* \ param buflen size of the buffer
* \ param cb A callback invoked for every unsupported certificate
* extension .
* \ param p_ctx An opaque context passed to the callback .
*
* \ return 0 if successful , or a specific X509 error code
*/
int mbedtls_x509_csr_parse_der_with_ext_cb ( mbedtls_x509_csr * csr ,
const unsigned char * buf , size_t buflen ,
mbedtls_x509_csr_ext_cb_t cb ,
void * p_ctx ) ;
2014-06-16 18:06:48 +02:00
/**
* \ brief Load a Certificate Signing Request ( CSR ) , DER or PEM format
2013-09-16 13:49:26 +02:00
*
2016-02-24 15:36:05 +01:00
* \ note See notes for \ c mbedtls_x509_csr_parse_der ( )
*
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 csr CSR context to fill
* \ param buf buffer holding the CRL data
* \ param buflen size of the buffer
2015-05-12 11:20:10 +02:00
* ( including the terminating null byte for PEM data )
2013-09-16 13:49:26 +02:00
*
* \ return 0 if successful , or a specific X509 or PEM error code
*/
2023-01-11 14:50:10 +01:00
int mbedtls_x509_csr_parse ( mbedtls_x509_csr * csr , const unsigned char * buf , size_t buflen ) ;
2013-09-16 13:49:26 +02:00
2015-04-08 12:49:31 +02:00
# if defined(MBEDTLS_FS_IO)
2013-09-16 13:49:26 +02:00
/**
* \ brief Load a Certificate Signing Request ( CSR )
*
2016-02-24 15:36:05 +01:00
* \ note See notes for \ c mbedtls_x509_csr_parse ( )
*
2013-09-16 13:49:26 +02:00
* \ param csr CSR context to fill
* \ param path filename to read the CSR from
*
* \ return 0 if successful , or a specific X509 or PEM error code
*/
2023-01-11 14:50:10 +01:00
int mbedtls_x509_csr_parse_file ( mbedtls_x509_csr * csr , const char * path ) ;
2015-04-08 12:49:31 +02:00
# endif /* MBEDTLS_FS_IO */
2013-09-16 13:49:26 +02:00
2020-10-09 10:19:39 +02:00
# if !defined(MBEDTLS_X509_REMOVE_INFO)
2013-09-16 13:49:26 +02:00
/**
* \ brief Returns an informational string about the
* CSR .
*
* \ param buf Buffer to write to
* \ param size Maximum size of buffer
* \ param prefix A line prefix
* \ param csr The X509 CSR to represent
*
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-09-16 13:49:26 +02:00
*/
2023-01-11 14:50:10 +01:00
int mbedtls_x509_csr_info ( char * buf , size_t size , const char * prefix ,
const mbedtls_x509_csr * csr ) ;
2019-06-14 18:21:24 +02:00
# endif /* !MBEDTLS_X509_REMOVE_INFO */
2013-09-16 13:49:26 +02:00
2013-09-18 11:58:25 +02:00
/**
* \ brief Initialize a CSR
*
* \ param csr CSR to initialize
*/
2023-01-11 14:50:10 +01:00
void mbedtls_x509_csr_init ( mbedtls_x509_csr * csr ) ;
2013-09-18 11:58:25 +02:00
2013-09-16 13:49:26 +02:00
/**
* \ brief Unallocate all CSR data
*
* \ param csr CSR to free
*/
2023-01-11 14:50:10 +01:00
void mbedtls_x509_csr_free ( mbedtls_x509_csr * csr ) ;
2015-04-08 12:49:31 +02:00
# endif /* MBEDTLS_X509_CSR_PARSE_C */
2013-09-16 13:49:26 +02:00
2021-12-28 16:22:52 +01:00
/** \} name Structures and functions for X.509 Certificate Signing Requests (CSR) */
2013-09-16 13:49:26 +02:00
2015-04-08 12:49:31 +02:00
# if defined(MBEDTLS_X509_CSR_WRITE_C)
2013-09-16 13:49:26 +02:00
/**
* \ brief Initialize a CSR context
*
* \ param ctx CSR context to initialize
*/
2023-01-11 14:50:10 +01:00
void mbedtls_x509write_csr_init ( mbedtls_x509write_csr * ctx ) ;
2013-09-16 13:49:26 +02:00
/**
* \ brief Set the subject name for a CSR
* Subject names should contain a comma - separated list
* of OID types and values :
2023-08-03 17:45:20 +02:00
* e . g . " C=UK,O=ARM,CN=Mbed TLS Server 1 "
2013-09-16 13:49:26 +02:00
*
* \ param ctx CSR 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_csr_set_subject_name ( mbedtls_x509write_csr * ctx ,
const char * subject_name ) ;
2013-09-16 13:49:26 +02:00
/**
* \ brief Set the key for a CSR ( public key will be included ,
* private key used to sign the CSR when writing it )
*
* \ param ctx CSR context to use
2021-12-21 06:14:10 +01:00
* \ param key Asymmetric key to include
2013-09-16 13:49:26 +02:00
*/
2023-01-11 14:50:10 +01:00
void mbedtls_x509write_csr_set_key ( mbedtls_x509write_csr * ctx , mbedtls_pk_context * key ) ;
2013-09-16 13:49: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-16 13:49:26 +02:00
*
* \ param ctx CSR context to use
* \ param md_alg MD algorithm to use
*/
2023-01-11 14:50:10 +01:00
void mbedtls_x509write_csr_set_md_alg ( mbedtls_x509write_csr * ctx , mbedtls_md_type_t md_alg ) ;
2013-09-16 13:49:26 +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-16 13:49:26 +02:00
*
* \ param ctx CSR 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
2018-10-08 20:44:55 +02:00
*
* \ note The < code > decipherOnly < / code > flag from the Key Usage
* extension is represented by bit 8 ( i . e .
* < code > 0x8000 < / code > ) , which cannot typically be represented
* in an unsigned char . Therefore , the flag
* < code > decipherOnly < / code > ( i . e .
* # MBEDTLS_X509_KU_DECIPHER_ONLY ) cannot be set using this
* function .
2013-09-16 13:49:26 +02:00
*/
2023-01-11 14:50:10 +01:00
int mbedtls_x509write_csr_set_key_usage ( mbedtls_x509write_csr * ctx , unsigned char key_usage ) ;
2013-09-16 13:49:26 +02:00
2022-12-28 18:38:53 +01:00
/**
* \ brief Set Subject Alternative Name
*
* \ param ctx CSR context to use
* \ param san_list List of SAN values
*
* \ return 0 if successful , or MBEDTLS_ERR_X509_ALLOC_FAILED
*
* \ note Only " dnsName " , " uniformResourceIdentifier " and " otherName " ,
* as defined in RFC 5280 , are supported .
*/
int mbedtls_x509write_csr_set_subject_alternative_name ( mbedtls_x509write_csr * ctx ,
const mbedtls_x509_san_list * san_list ) ;
2013-09-16 13:49:26 +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-16 13:49:26 +02:00
*
* \ param ctx CSR 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-16 13:49:26 +02:00
*/
2023-01-11 14:50:10 +01:00
int mbedtls_x509write_csr_set_ns_cert_type ( mbedtls_x509write_csr * ctx ,
unsigned char ns_cert_type ) ;
2013-09-16 13:49:26 +02:00
/**
2014-05-01 14:18:25 +02:00
* \ brief Generic function to add to or replace an extension in the
* CSR
2013-09-16 13:49:26 +02:00
*
* \ param ctx CSR context to use
* \ param oid OID of the extension
* \ param oid_len length of the OID
2021-01-21 13:31:23 +01:00
* \ param critical Set to 1 to mark the extension as critical , 0 otherwise .
2013-09-16 13:49:26 +02:00
* \ 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-16 13:49:26 +02:00
*/
2023-01-11 14:50:10 +01:00
int mbedtls_x509write_csr_set_extension ( mbedtls_x509write_csr * ctx ,
const char * oid , size_t oid_len ,
int critical ,
const unsigned char * val , size_t val_len ) ;
2013-09-16 13:49:26 +02:00
/**
* \ brief Free the contents of a CSR context
*
* \ param ctx CSR context to free
*/
2023-01-11 14:50:10 +01:00
void mbedtls_x509write_csr_free ( mbedtls_x509write_csr * ctx ) ;
2013-09-16 13:49:26 +02:00
/**
* \ brief Write a CSR ( Certificate Signing Request ) to a
* DER structure
* Note : data is written at the end of the buffer ! Use the
* return value to determine where you should start
* using the buffer
*
* \ param ctx CSR to write away
* \ 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-16 13:49:26 +02:00
* \ param p_rng RNG parameter
*
* \ return length of data written if successful , or a specific
* error code
*
2021-06-15 11:29:26 +02:00
* \ note \ p f_rng is used for the signature operation .
2013-09-16 13:49:26 +02:00
*/
2023-01-11 14:50:10 +01:00
int mbedtls_x509write_csr_der ( mbedtls_x509write_csr * ctx , unsigned char * buf , size_t size ,
int ( * f_rng ) ( void * , unsigned char * , size_t ) ,
void * p_rng ) ;
2013-09-16 13:49:26 +02:00
2015-04-08 12:49:31 +02:00
# if defined(MBEDTLS_PEM_WRITE_C)
2013-09-16 13:49:26 +02:00
/**
* \ brief Write a CSR ( Certificate Signing Request ) to a
* PEM string
*
* \ param ctx CSR to write away
* \ 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-16 13:49:26 +02:00
* \ param p_rng RNG parameter
*
2015-05-29 12:53:47 +02:00
* \ return 0 if successful , or a specific error code
2013-09-16 13:49:26 +02:00
*
2021-06-15 11:29:26 +02:00
* \ note \ p f_rng is used for the signature operation .
2013-09-16 13:49:26 +02:00
*/
2023-01-11 14:50:10 +01:00
int mbedtls_x509write_csr_pem ( mbedtls_x509write_csr * 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_CSR_WRITE_C */
2013-09-16 13:49:26 +02:00
2021-12-30 12:33:31 +01:00
/** \} addtogroup x509_module */
2013-09-16 13:49:26 +02:00
# ifdef __cplusplus
}
# endif
2015-04-08 12:49:31 +02:00
# endif /* mbedtls_x509_csr.h */