1 /**
2  * \file x509_csr.h
3  *
4  * \brief X.509 certificate signing request parsing and writing
5  */
6 /*
7  *  Copyright The Mbed TLS Contributors
8  *  SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
9  */
10 #ifndef MBEDTLS_X509_CSR_H
11 #define MBEDTLS_X509_CSR_H
12 #include "mbedtls/private_access.h"
13 
14 #include "mbedtls/build_info.h"
15 
16 #include "mbedtls/x509.h"
17 
18 #ifdef __cplusplus
19 extern "C" {
20 #endif
21 
22 /**
23  * \addtogroup x509_module
24  * \{ */
25 
26 /**
27  * \name Structures and functions for X.509 Certificate Signing Requests (CSR)
28  * \{
29  */
30 
31 /**
32  * Certificate Signing Request (CSR) structure.
33  *
34  * Some fields of this structure are publicly readable. Do not modify
35  * them except via Mbed TLS library functions: the effect of modifying
36  * those fields or the data that those fields point to is unspecified.
37  */
38 typedef struct mbedtls_x509_csr {
39     mbedtls_x509_buf raw;           /**< The raw CSR data (DER). */
40     mbedtls_x509_buf cri;           /**< The raw CertificateRequestInfo body (DER). */
41 
42     int version;            /**< CSR version (1=v1). */
43 
44     mbedtls_x509_buf  subject_raw;  /**< The raw subject data (DER). */
45     mbedtls_x509_name subject;      /**< The parsed subject data (named information object). */
46 
47     mbedtls_pk_context pk;          /**< Container for the public key context. */
48 
49     unsigned int key_usage;     /**< Optional key usage extension value: See the values in x509.h */
50     unsigned char ns_cert_type; /**< Optional Netscape certificate type extension value: See the values in x509.h */
51     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. */
52 
53     int MBEDTLS_PRIVATE(ext_types);              /**< Bit string containing detected and parsed extensions */
54 
55     mbedtls_x509_buf sig_oid;
56     mbedtls_x509_buf MBEDTLS_PRIVATE(sig);
57     mbedtls_md_type_t MBEDTLS_PRIVATE(sig_md);       /**< Internal representation of the MD algorithm of the signature algorithm, e.g. MBEDTLS_MD_SHA256 */
58     mbedtls_pk_type_t MBEDTLS_PRIVATE(sig_pk);       /**< Internal representation of the Public Key algorithm of the signature algorithm, e.g. MBEDTLS_PK_RSA */
59     void *MBEDTLS_PRIVATE(sig_opts);         /**< Signature options to be passed to mbedtls_pk_verify_ext(), e.g. for RSASSA-PSS */
60 }
61 mbedtls_x509_csr;
62 
63 /**
64  * Container for writing a CSR
65  */
66 typedef struct mbedtls_x509write_csr {
67     mbedtls_pk_context *MBEDTLS_PRIVATE(key);
68     mbedtls_asn1_named_data *MBEDTLS_PRIVATE(subject);
69     mbedtls_md_type_t MBEDTLS_PRIVATE(md_alg);
70     mbedtls_asn1_named_data *MBEDTLS_PRIVATE(extensions);
71 }
72 mbedtls_x509write_csr;
73 
74 #if defined(MBEDTLS_X509_CSR_PARSE_C)
75 /**
76  * \brief          Load a Certificate Signing Request (CSR) in DER format
77  *
78  * \note           Any unsupported requested extensions are silently
79  *                 ignored, unless the critical flag is set, in which case
80  *                 the CSR is rejected.
81  *
82  * \note           If #MBEDTLS_USE_PSA_CRYPTO is enabled, the PSA crypto
83  *                 subsystem must have been initialized by calling
84  *                 psa_crypto_init() before calling this function.
85  *
86  * \param csr      CSR context to fill
87  * \param buf      buffer holding the CRL data
88  * \param buflen   size of the buffer
89  *
90  * \return         0 if successful, or a specific X509 error code
91  */
92 int mbedtls_x509_csr_parse_der(mbedtls_x509_csr *csr,
93                                const unsigned char *buf, size_t buflen);
94 
95 /**
96  * \brief          The type of certificate extension callbacks.
97  *
98  *                 Callbacks of this type are passed to and used by the
99  *                 mbedtls_x509_csr_parse_der_with_ext_cb() routine when
100  *                 it encounters either an unsupported extension.
101  *                 Future versions of the library may invoke the callback
102  *                 in other cases, if and when the need arises.
103  *
104  * \param p_ctx    An opaque context passed to the callback.
105  * \param csr      The CSR being parsed.
106  * \param oid      The OID of the extension.
107  * \param critical Whether the extension is critical.
108  * \param p        Pointer to the start of the extension value
109  *                 (the content of the OCTET STRING).
110  * \param end      End of extension value.
111  *
112  * \note           The callback must fail and return a negative error code
113  *                 if it can not parse or does not support the extension.
114  *                 When the callback fails to parse a critical extension
115  *                 mbedtls_x509_csr_parse_der_with_ext_cb() also fails.
116  *                 When the callback fails to parse a non critical extension
117  *                 mbedtls_x509_csr_parse_der_with_ext_cb() simply skips
118  *                 the extension and continues parsing.
119  *
120  * \return         \c 0 on success.
121  * \return         A negative error code on failure.
122  */
123 typedef int (*mbedtls_x509_csr_ext_cb_t)(void *p_ctx,
124                                          mbedtls_x509_csr const *csr,
125                                          mbedtls_x509_buf const *oid,
126                                          int critical,
127                                          const unsigned char *p,
128                                          const unsigned char *end);
129 
130 /**
131  * \brief          Load a Certificate Signing Request (CSR) in DER format
132  *
133  * \note           Any unsupported requested extensions are silently
134  *                 ignored, unless the critical flag is set, in which case
135  *                 the result of the callback function decides whether
136  *                 CSR is rejected.
137  *
138  * \note           If #MBEDTLS_USE_PSA_CRYPTO is enabled, the PSA crypto
139  *                 subsystem must have been initialized by calling
140  *                 psa_crypto_init() before calling this function.
141  *
142  * \param csr      CSR context to fill
143  * \param buf      buffer holding the CRL data
144  * \param buflen   size of the buffer
145  * \param cb       A callback invoked for every unsupported certificate
146  *                 extension.
147  * \param p_ctx    An opaque context passed to the callback.
148  *
149  * \return         0 if successful, or a specific X509 error code
150  */
151 int mbedtls_x509_csr_parse_der_with_ext_cb(mbedtls_x509_csr *csr,
152                                            const unsigned char *buf, size_t buflen,
153                                            mbedtls_x509_csr_ext_cb_t cb,
154                                            void *p_ctx);
155 
156 /**
157  * \brief          Load a Certificate Signing Request (CSR), DER or PEM format
158  *
159  * \note           See notes for \c mbedtls_x509_csr_parse_der()
160  *
161  * \note           If #MBEDTLS_USE_PSA_CRYPTO is enabled, the PSA crypto
162  *                 subsystem must have been initialized by calling
163  *                 psa_crypto_init() before calling this function.
164  *
165  * \param csr      CSR context to fill
166  * \param buf      buffer holding the CRL data
167  * \param buflen   size of the buffer
168  *                 (including the terminating null byte for PEM data)
169  *
170  * \return         0 if successful, or a specific X509 or PEM error code
171  */
172 int mbedtls_x509_csr_parse(mbedtls_x509_csr *csr, const unsigned char *buf, size_t buflen);
173 
174 #if defined(MBEDTLS_FS_IO)
175 /**
176  * \brief          Load a Certificate Signing Request (CSR)
177  *
178  * \note           See notes for \c mbedtls_x509_csr_parse()
179  *
180  * \param csr      CSR context to fill
181  * \param path     filename to read the CSR from
182  *
183  * \return         0 if successful, or a specific X509 or PEM error code
184  */
185 int mbedtls_x509_csr_parse_file(mbedtls_x509_csr *csr, const char *path);
186 #endif /* MBEDTLS_FS_IO */
187 
188 #if !defined(MBEDTLS_X509_REMOVE_INFO)
189 /**
190  * \brief          Returns an informational string about the
191  *                 CSR.
192  *
193  * \param buf      Buffer to write to
194  * \param size     Maximum size of buffer
195  * \param prefix   A line prefix
196  * \param csr      The X509 CSR to represent
197  *
198  * \return         The length of the string written (not including the
199  *                 terminated nul byte), or a negative error code.
200  */
201 int mbedtls_x509_csr_info(char *buf, size_t size, const char *prefix,
202                           const mbedtls_x509_csr *csr);
203 #endif /* !MBEDTLS_X509_REMOVE_INFO */
204 
205 /**
206  * \brief          Initialize a CSR
207  *
208  * \param csr      CSR to initialize
209  */
210 void mbedtls_x509_csr_init(mbedtls_x509_csr *csr);
211 
212 /**
213  * \brief          Unallocate all CSR data
214  *
215  * \param csr      CSR to free
216  */
217 void mbedtls_x509_csr_free(mbedtls_x509_csr *csr);
218 #endif /* MBEDTLS_X509_CSR_PARSE_C */
219 
220 /** \} name Structures and functions for X.509 Certificate Signing Requests (CSR) */
221 
222 #if defined(MBEDTLS_X509_CSR_WRITE_C)
223 /**
224  * \brief           Initialize a CSR context
225  *
226  * \param ctx       CSR context to initialize
227  */
228 void mbedtls_x509write_csr_init(mbedtls_x509write_csr *ctx);
229 
230 /**
231  * \brief           Set the subject name for a CSR
232  *                  Subject names should contain a comma-separated list
233  *                  of OID types and values:
234  *                  e.g. "C=UK,O=ARM,CN=Mbed TLS Server 1"
235  *
236  * \param ctx           CSR context to use
237  * \param subject_name  subject name to set
238  *
239  * \return          0 if subject name was parsed successfully, or
240  *                  a specific error code
241  */
242 int mbedtls_x509write_csr_set_subject_name(mbedtls_x509write_csr *ctx,
243                                            const char *subject_name);
244 
245 /**
246  * \brief           Set the key for a CSR (public key will be included,
247  *                  private key used to sign the CSR when writing it)
248  *
249  * \param ctx       CSR context to use
250  * \param key       Asymmetric key to include
251  */
252 void mbedtls_x509write_csr_set_key(mbedtls_x509write_csr *ctx, mbedtls_pk_context *key);
253 
254 /**
255  * \brief           Set the MD algorithm to use for the signature
256  *                  (e.g. MBEDTLS_MD_SHA1)
257  *
258  * \param ctx       CSR context to use
259  * \param md_alg    MD algorithm to use
260  */
261 void mbedtls_x509write_csr_set_md_alg(mbedtls_x509write_csr *ctx, mbedtls_md_type_t md_alg);
262 
263 /**
264  * \brief           Set the Key Usage Extension flags
265  *                  (e.g. MBEDTLS_X509_KU_DIGITAL_SIGNATURE | MBEDTLS_X509_KU_KEY_CERT_SIGN)
266  *
267  * \param ctx       CSR context to use
268  * \param key_usage key usage flags to set
269  *
270  * \return          0 if successful, or MBEDTLS_ERR_X509_ALLOC_FAILED
271  *
272  * \note            The <code>decipherOnly</code> flag from the Key Usage
273  *                  extension is represented by bit 8 (i.e.
274  *                  <code>0x8000</code>), which cannot typically be represented
275  *                  in an unsigned char. Therefore, the flag
276  *                  <code>decipherOnly</code> (i.e.
277  *                  #MBEDTLS_X509_KU_DECIPHER_ONLY) cannot be set using this
278  *                  function.
279  */
280 int mbedtls_x509write_csr_set_key_usage(mbedtls_x509write_csr *ctx, unsigned char key_usage);
281 
282 /**
283  * \brief           Set Subject Alternative Name
284  *
285  * \param ctx       CSR context to use
286  * \param san_list  List of SAN values
287  *
288  * \return          0 if successful, or MBEDTLS_ERR_X509_ALLOC_FAILED
289  *
290  * \note            Only "dnsName", "uniformResourceIdentifier" and "otherName",
291  *                  as defined in RFC 5280, are supported.
292  */
293 int mbedtls_x509write_csr_set_subject_alternative_name(mbedtls_x509write_csr *ctx,
294                                                        const mbedtls_x509_san_list *san_list);
295 
296 /**
297  * \brief           Set the Netscape Cert Type flags
298  *                  (e.g. MBEDTLS_X509_NS_CERT_TYPE_SSL_CLIENT | MBEDTLS_X509_NS_CERT_TYPE_EMAIL)
299  *
300  * \param ctx           CSR context to use
301  * \param ns_cert_type  Netscape Cert Type flags to set
302  *
303  * \return          0 if successful, or MBEDTLS_ERR_X509_ALLOC_FAILED
304  */
305 int mbedtls_x509write_csr_set_ns_cert_type(mbedtls_x509write_csr *ctx,
306                                            unsigned char ns_cert_type);
307 
308 /**
309  * \brief           Generic function to add to or replace an extension in the
310  *                  CSR
311  *
312  * \param ctx       CSR context to use
313  * \param oid       OID of the extension
314  * \param oid_len   length of the OID
315  * \param critical  Set to 1 to mark the extension as critical, 0 otherwise.
316  * \param val       value of the extension OCTET STRING
317  * \param val_len   length of the value data
318  *
319  * \return          0 if successful, or a MBEDTLS_ERR_X509_ALLOC_FAILED
320  */
321 int mbedtls_x509write_csr_set_extension(mbedtls_x509write_csr *ctx,
322                                         const char *oid, size_t oid_len,
323                                         int critical,
324                                         const unsigned char *val, size_t val_len);
325 
326 /**
327  * \brief           Free the contents of a CSR context
328  *
329  * \param ctx       CSR context to free
330  */
331 void mbedtls_x509write_csr_free(mbedtls_x509write_csr *ctx);
332 
333 /**
334  * \brief           Write a CSR (Certificate Signing Request) to a
335  *                  DER structure
336  *                  Note: data is written at the end of the buffer! Use the
337  *                        return value to determine where you should start
338  *                        using the buffer
339  *
340  * \param ctx       CSR to write away
341  * \param buf       buffer to write to
342  * \param size      size of the buffer
343  * \param f_rng     RNG function. This must not be \c NULL.
344  * \param p_rng     RNG parameter
345  *
346  * \return          length of data written if successful, or a specific
347  *                  error code
348  *
349  * \note            \p f_rng is used for the signature operation.
350  */
351 int mbedtls_x509write_csr_der(mbedtls_x509write_csr *ctx, unsigned char *buf, size_t size,
352                               int (*f_rng)(void *, unsigned char *, size_t),
353                               void *p_rng);
354 
355 #if defined(MBEDTLS_PEM_WRITE_C)
356 /**
357  * \brief           Write a CSR (Certificate Signing Request) to a
358  *                  PEM string
359  *
360  * \param ctx       CSR to write away
361  * \param buf       buffer to write to
362  * \param size      size of the buffer
363  * \param f_rng     RNG function. This must not be \c NULL.
364  * \param p_rng     RNG parameter
365  *
366  * \return          0 if successful, or a specific error code
367  *
368  * \note            \p f_rng is used for the signature operation.
369  */
370 int mbedtls_x509write_csr_pem(mbedtls_x509write_csr *ctx, unsigned char *buf, size_t size,
371                               int (*f_rng)(void *, unsigned char *, size_t),
372                               void *p_rng);
373 #endif /* MBEDTLS_PEM_WRITE_C */
374 #endif /* MBEDTLS_X509_CSR_WRITE_C */
375 
376 /** \} addtogroup x509_module */
377 
378 #ifdef __cplusplus
379 }
380 #endif
381 
382 #endif /* mbedtls_x509_csr.h */
383