blob: fb652095ab5d9502570ff762bb9dbac298a42b1e [file] [log] [blame]
Paul Bakker7c6b2c32013-09-16 13:49:26 +02001/*
2 * X.509 Certificate Signing Request writing
3 *
Bence Szépkúti1e148272020-08-07 13:07:28 +02004 * Copyright The Mbed TLS Contributors
Manuel Pégourié-Gonnard37ff1402015-09-04 14:21:07 +02005 * SPDX-License-Identifier: Apache-2.0
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License"); you may
8 * not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
15 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
Paul Bakker7c6b2c32013-09-16 13:49:26 +020018 */
19/*
20 * References:
21 * - CSRs: PKCS#10 v1.7 aka RFC 2986
22 * - attributes: PKCS#9 v2.0 aka RFC 2985
23 */
24
Gilles Peskinedb09ef62020-06-03 01:43:33 +020025#include "common.h"
Paul Bakker7c6b2c32013-09-16 13:49:26 +020026
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020027#if defined(MBEDTLS_X509_CSR_WRITE_C)
Paul Bakker7c6b2c32013-09-16 13:49:26 +020028
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020029# include "mbedtls/x509_csr.h"
30# include "mbedtls/asn1write.h"
31# include "mbedtls/error.h"
32# include "mbedtls/oid.h"
33# include "mbedtls/platform_util.h"
Paul Bakker7c6b2c32013-09-16 13:49:26 +020034
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020035# if defined(MBEDTLS_USE_PSA_CRYPTO)
36# include "psa/crypto.h"
37# include "mbedtls/psa_util.h"
38# endif
Andrzej Kurekd4a65532018-10-31 06:18:39 -040039
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020040# include <string.h>
41# include <stdlib.h>
Rich Evans00ab4702015-02-06 13:43:58 +000042
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020043# if defined(MBEDTLS_PEM_WRITE_C)
44# include "mbedtls/pem.h"
45# endif
Paul Bakker7c6b2c32013-09-16 13:49:26 +020046
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020047# if defined(MBEDTLS_PLATFORM_C)
48# include "mbedtls/platform.h"
49# else
50# include <stdlib.h>
51# define mbedtls_calloc calloc
52# define mbedtls_free free
53# endif
Doru Gucea2957b352018-12-14 21:08:35 +020054
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020055void mbedtls_x509write_csr_init(mbedtls_x509write_csr *ctx)
Paul Bakker7c6b2c32013-09-16 13:49:26 +020056{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020057 memset(ctx, 0, sizeof(mbedtls_x509write_csr));
Paul Bakker7c6b2c32013-09-16 13:49:26 +020058}
59
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020060void mbedtls_x509write_csr_free(mbedtls_x509write_csr *ctx)
Paul Bakker7c6b2c32013-09-16 13:49:26 +020061{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020062 mbedtls_asn1_free_named_data_list(&ctx->subject);
63 mbedtls_asn1_free_named_data_list(&ctx->extensions);
Paul Bakker7c6b2c32013-09-16 13:49:26 +020064
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020065 mbedtls_platform_zeroize(ctx, sizeof(mbedtls_x509write_csr));
Paul Bakker7c6b2c32013-09-16 13:49:26 +020066}
67
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020068void mbedtls_x509write_csr_set_md_alg(mbedtls_x509write_csr *ctx,
69 mbedtls_md_type_t md_alg)
Paul Bakker7c6b2c32013-09-16 13:49:26 +020070{
71 ctx->md_alg = md_alg;
72}
73
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020074void mbedtls_x509write_csr_set_key(mbedtls_x509write_csr *ctx,
75 mbedtls_pk_context *key)
Paul Bakker7c6b2c32013-09-16 13:49:26 +020076{
77 ctx->key = key;
78}
79
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020080int mbedtls_x509write_csr_set_subject_name(mbedtls_x509write_csr *ctx,
81 const char *subject_name)
Paul Bakker7c6b2c32013-09-16 13:49:26 +020082{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020083 return mbedtls_x509_string_to_names(&ctx->subject, subject_name);
Paul Bakker7c6b2c32013-09-16 13:49:26 +020084}
85
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020086int mbedtls_x509write_csr_set_extension(mbedtls_x509write_csr *ctx,
87 const char *oid,
88 size_t oid_len,
89 int critical,
90 const unsigned char *val,
91 size_t val_len)
Paul Bakker7c6b2c32013-09-16 13:49:26 +020092{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020093 return mbedtls_x509_set_extension(&ctx->extensions, oid, oid_len, critical,
94 val, val_len);
Paul Bakker7c6b2c32013-09-16 13:49:26 +020095}
96
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020097int mbedtls_x509write_csr_set_key_usage(mbedtls_x509write_csr *ctx,
98 unsigned char key_usage)
Paul Bakker7c6b2c32013-09-16 13:49:26 +020099{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200100 unsigned char buf[4] = { 0 };
Paul Bakker7c6b2c32013-09-16 13:49:26 +0200101 unsigned char *c;
Janos Follath865b3eb2019-12-16 11:46:15 +0000102 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker7c6b2c32013-09-16 13:49:26 +0200103
104 c = buf + 4;
105
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200106 ret = mbedtls_asn1_write_named_bitstring(&c, buf, &key_usage, 8);
107 if (ret < 3 || ret > 4)
108 return ret;
Paul Bakker7c6b2c32013-09-16 13:49:26 +0200109
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200110 ret = mbedtls_x509write_csr_set_extension(
111 ctx, MBEDTLS_OID_KEY_USAGE, MBEDTLS_OID_SIZE(MBEDTLS_OID_KEY_USAGE), 0,
112 c, (size_t)ret);
113 if (ret != 0)
114 return ret;
Paul Bakker7c6b2c32013-09-16 13:49:26 +0200115
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200116 return 0;
Paul Bakker7c6b2c32013-09-16 13:49:26 +0200117}
118
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200119int mbedtls_x509write_csr_set_ns_cert_type(mbedtls_x509write_csr *ctx,
120 unsigned char ns_cert_type)
Paul Bakker7c6b2c32013-09-16 13:49:26 +0200121{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200122 unsigned char buf[4] = { 0 };
Paul Bakker7c6b2c32013-09-16 13:49:26 +0200123 unsigned char *c;
Janos Follath865b3eb2019-12-16 11:46:15 +0000124 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker7c6b2c32013-09-16 13:49:26 +0200125
126 c = buf + 4;
127
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200128 ret = mbedtls_asn1_write_named_bitstring(&c, buf, &ns_cert_type, 8);
129 if (ret < 3 || ret > 4)
130 return ret;
Paul Bakker7c6b2c32013-09-16 13:49:26 +0200131
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200132 ret = mbedtls_x509write_csr_set_extension(
133 ctx, MBEDTLS_OID_NS_CERT_TYPE,
134 MBEDTLS_OID_SIZE(MBEDTLS_OID_NS_CERT_TYPE), 0, c, (size_t)ret);
135 if (ret != 0)
136 return ret;
Paul Bakker7c6b2c32013-09-16 13:49:26 +0200137
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200138 return 0;
Paul Bakker7c6b2c32013-09-16 13:49:26 +0200139}
140
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200141static int
142x509write_csr_der_internal(mbedtls_x509write_csr *ctx,
143 unsigned char *buf,
144 size_t size,
145 unsigned char *sig,
146 size_t sig_size,
147 int (*f_rng)(void *, unsigned char *, size_t),
148 void *p_rng)
Paul Bakker7c6b2c32013-09-16 13:49:26 +0200149{
Janos Follath865b3eb2019-12-16 11:46:15 +0000150 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker7c6b2c32013-09-16 13:49:26 +0200151 const char *sig_oid;
152 size_t sig_oid_len = 0;
153 unsigned char *c, *c2;
154 unsigned char hash[64];
Paul Bakker7c6b2c32013-09-16 13:49:26 +0200155 size_t pub_len = 0, sig_and_oid_len = 0, sig_len;
156 size_t len = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200157 mbedtls_pk_type_t pk_alg;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200158# if defined(MBEDTLS_USE_PSA_CRYPTO)
Jaeden Amero34973232019-02-20 10:32:28 +0000159 psa_hash_operation_t hash_operation = PSA_HASH_OPERATION_INIT;
Andrzej Kurekd4a65532018-10-31 06:18:39 -0400160 size_t hash_len;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200161 psa_algorithm_t hash_alg = mbedtls_psa_translate_md(ctx->md_alg);
162# endif /* MBEDTLS_USE_PSA_CRYPTO */
Paul Bakker7c6b2c32013-09-16 13:49:26 +0200163
Simon Leet40ca54a2020-06-26 21:23:32 +0000164 /* Write the CSR backwards starting from the end of buf */
Doru Gucea2957b352018-12-14 21:08:35 +0200165 c = buf + size;
Paul Bakker7c6b2c32013-09-16 13:49:26 +0200166
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200167 MBEDTLS_ASN1_CHK_ADD(len, mbedtls_x509_write_extensions(&c, buf,
168 ctx->extensions));
Paul Bakker7c6b2c32013-09-16 13:49:26 +0200169
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200170 if (len) {
171 MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_len(&c, buf, len));
172 MBEDTLS_ASN1_CHK_ADD(len,
173 mbedtls_asn1_write_tag(&c, buf,
174 MBEDTLS_ASN1_CONSTRUCTED |
175 MBEDTLS_ASN1_SEQUENCE));
Paul Bakker7c6b2c32013-09-16 13:49:26 +0200176
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200177 MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_len(&c, buf, len));
178 MBEDTLS_ASN1_CHK_ADD(
179 len, mbedtls_asn1_write_tag(
180 &c, buf, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SET));
Paul Bakker7c6b2c32013-09-16 13:49:26 +0200181
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200182 MBEDTLS_ASN1_CHK_ADD(
183 len, mbedtls_asn1_write_oid(
184 &c, buf, MBEDTLS_OID_PKCS9_CSR_EXT_REQ,
185 MBEDTLS_OID_SIZE(MBEDTLS_OID_PKCS9_CSR_EXT_REQ)));
Paul Bakker7c6b2c32013-09-16 13:49:26 +0200186
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200187 MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_len(&c, buf, len));
188 MBEDTLS_ASN1_CHK_ADD(len,
189 mbedtls_asn1_write_tag(&c, buf,
190 MBEDTLS_ASN1_CONSTRUCTED |
191 MBEDTLS_ASN1_SEQUENCE));
Paul Bakker7c6b2c32013-09-16 13:49:26 +0200192 }
193
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200194 MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_len(&c, buf, len));
195 MBEDTLS_ASN1_CHK_ADD(
196 len, mbedtls_asn1_write_tag(&c, buf,
197 MBEDTLS_ASN1_CONSTRUCTED |
198 MBEDTLS_ASN1_CONTEXT_SPECIFIC));
Paul Bakker7c6b2c32013-09-16 13:49:26 +0200199
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200200 MBEDTLS_ASN1_CHK_ADD(pub_len,
201 mbedtls_pk_write_pubkey_der(ctx->key, buf, c - buf));
Paul Bakker7c6b2c32013-09-16 13:49:26 +0200202 c -= pub_len;
203 len += pub_len;
204
205 /*
206 * Subject ::= Name
207 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200208 MBEDTLS_ASN1_CHK_ADD(len, mbedtls_x509_write_names(&c, buf, ctx->subject));
Paul Bakker7c6b2c32013-09-16 13:49:26 +0200209
210 /*
211 * Version ::= INTEGER { v1(0), v2(1), v3(2) }
212 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200213 MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_int(&c, buf, 0));
Paul Bakker7c6b2c32013-09-16 13:49:26 +0200214
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200215 MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_len(&c, buf, len));
216 MBEDTLS_ASN1_CHK_ADD(
217 len, mbedtls_asn1_write_tag(
218 &c, buf, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE));
Paul Bakker7c6b2c32013-09-16 13:49:26 +0200219
220 /*
Simon Leet40ca54a2020-06-26 21:23:32 +0000221 * Sign the written CSR data into the sig buffer
Andrzej Kurekd4a65532018-10-31 06:18:39 -0400222 * Note: hash errors can happen only after an internal error
Paul Bakker7c6b2c32013-09-16 13:49:26 +0200223 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200224# if defined(MBEDTLS_USE_PSA_CRYPTO)
225 if (psa_hash_setup(&hash_operation, hash_alg) != PSA_SUCCESS)
226 return MBEDTLS_ERR_X509_FATAL_ERROR;
Paul Bakker7c6b2c32013-09-16 13:49:26 +0200227
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200228 if (psa_hash_update(&hash_operation, c, len) != PSA_SUCCESS)
229 return MBEDTLS_ERR_X509_FATAL_ERROR;
Andrzej Kureka6093372018-11-19 13:57:58 -0500230
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200231 if (psa_hash_finish(&hash_operation, hash, sizeof(hash), &hash_len) !=
232 PSA_SUCCESS) {
233 return MBEDTLS_ERR_X509_FATAL_ERROR;
Andrzej Kurekd4a65532018-10-31 06:18:39 -0400234 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200235# else /* MBEDTLS_USE_PSA_CRYPTO */
236 ret = mbedtls_md(mbedtls_md_info_from_type(ctx->md_alg), c, len, hash);
237 if (ret != 0)
238 return ret;
239# endif
240 if ((ret = mbedtls_pk_sign(ctx->key, ctx->md_alg, hash, 0, sig, sig_size,
241 &sig_len, f_rng, p_rng)) != 0) {
242 return ret;
Hanno Beckerfc771442017-09-13 08:45:48 +0100243 }
244
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200245 if (mbedtls_pk_can_do(ctx->key, MBEDTLS_PK_RSA))
Hanno Beckerfc771442017-09-13 08:45:48 +0100246 pk_alg = MBEDTLS_PK_RSA;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200247 else if (mbedtls_pk_can_do(ctx->key, MBEDTLS_PK_ECDSA))
Hanno Beckerfc771442017-09-13 08:45:48 +0100248 pk_alg = MBEDTLS_PK_ECDSA;
249 else
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200250 return MBEDTLS_ERR_X509_INVALID_ALG;
Hanno Beckerfc771442017-09-13 08:45:48 +0100251
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200252 if ((ret = mbedtls_oid_get_oid_by_sig_alg(pk_alg, ctx->md_alg, &sig_oid,
253 &sig_oid_len)) != 0) {
254 return ret;
Paul Bakker7c6b2c32013-09-16 13:49:26 +0200255 }
256
257 /*
Simon Leet40ca54a2020-06-26 21:23:32 +0000258 * Move the written CSR data to the start of buf to create space for
259 * writing the signature into buf.
260 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200261 memmove(buf, c, len);
Doru Gucea2957b352018-12-14 21:08:35 +0200262
Simon Leet40ca54a2020-06-26 21:23:32 +0000263 /*
264 * Write sig and its OID into buf backwards from the end of buf.
265 * Note: mbedtls_x509_write_sig will check for c2 - ( buf + len ) < sig_len
266 * and return MBEDTLS_ERR_ASN1_BUF_TOO_SMALL if needed.
Paul Bakker7c6b2c32013-09-16 13:49:26 +0200267 */
268 c2 = buf + size;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200269 MBEDTLS_ASN1_CHK_ADD(sig_and_oid_len,
270 mbedtls_x509_write_sig(&c2, buf + len, sig_oid,
271 sig_oid_len, sig, sig_len));
Paul Bakker7c6b2c32013-09-16 13:49:26 +0200272
Simon Leet40ca54a2020-06-26 21:23:32 +0000273 /*
274 * Compact the space between the CSR data and signature by moving the
275 * CSR data to the start of the signature.
276 */
Paul Bakker7c6b2c32013-09-16 13:49:26 +0200277 c2 -= len;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200278 memmove(c2, buf, len);
Paul Bakker7c6b2c32013-09-16 13:49:26 +0200279
Simon Leet40ca54a2020-06-26 21:23:32 +0000280 /* ASN encode the total size and tag the CSR data with it. */
Paul Bakker7c6b2c32013-09-16 13:49:26 +0200281 len += sig_and_oid_len;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200282 MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_len(&c2, buf, len));
283 MBEDTLS_ASN1_CHK_ADD(
284 len, mbedtls_asn1_write_tag(
285 &c2, buf, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE));
Simon Leet40ca54a2020-06-26 21:23:32 +0000286
287 /* Zero the unused bytes at the start of buf */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200288 memset(buf, 0, c2 - buf);
Paul Bakker7c6b2c32013-09-16 13:49:26 +0200289
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200290 return (int)len;
Paul Bakker7c6b2c32013-09-16 13:49:26 +0200291}
292
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200293int mbedtls_x509write_csr_der(mbedtls_x509write_csr *ctx,
294 unsigned char *buf,
295 size_t size,
296 int (*f_rng)(void *, unsigned char *, size_t),
297 void *p_rng)
Doru Gucea2957b352018-12-14 21:08:35 +0200298{
299 int ret;
300 unsigned char *sig;
301
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200302 if ((sig = mbedtls_calloc(1, MBEDTLS_PK_SIGNATURE_MAX_SIZE)) == NULL) {
303 return MBEDTLS_ERR_X509_ALLOC_FAILED;
Doru Gucea2957b352018-12-14 21:08:35 +0200304 }
305
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200306 ret = x509write_csr_der_internal(
307 ctx, buf, size, sig, MBEDTLS_PK_SIGNATURE_MAX_SIZE, f_rng, p_rng);
Doru Gucea2957b352018-12-14 21:08:35 +0200308
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200309 mbedtls_free(sig);
Doru Gucea2957b352018-12-14 21:08:35 +0200310
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200311 return ret;
Doru Gucea2957b352018-12-14 21:08:35 +0200312}
313
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200314# define PEM_BEGIN_CSR "-----BEGIN CERTIFICATE REQUEST-----\n"
315# define PEM_END_CSR "-----END CERTIFICATE REQUEST-----\n"
Paul Bakker7c6b2c32013-09-16 13:49:26 +0200316
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200317# if defined(MBEDTLS_PEM_WRITE_C)
318int mbedtls_x509write_csr_pem(mbedtls_x509write_csr *ctx,
319 unsigned char *buf,
320 size_t size,
321 int (*f_rng)(void *, unsigned char *, size_t),
322 void *p_rng)
Paul Bakker7c6b2c32013-09-16 13:49:26 +0200323{
Janos Follath865b3eb2019-12-16 11:46:15 +0000324 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker7c6b2c32013-09-16 13:49:26 +0200325 size_t olen = 0;
326
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200327 if ((ret = mbedtls_x509write_csr_der(ctx, buf, size, f_rng, p_rng)) < 0) {
328 return ret;
Paul Bakker7c6b2c32013-09-16 13:49:26 +0200329 }
330
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200331 if ((ret = mbedtls_pem_write_buffer(PEM_BEGIN_CSR, PEM_END_CSR,
332 buf + size - ret, ret, buf, size,
333 &olen)) != 0) {
334 return ret;
Paul Bakker7c6b2c32013-09-16 13:49:26 +0200335 }
336
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200337 return 0;
Paul Bakker7c6b2c32013-09-16 13:49:26 +0200338}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200339# endif /* MBEDTLS_PEM_WRITE_C */
Paul Bakker7c6b2c32013-09-16 13:49:26 +0200340
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200341#endif /* MBEDTLS_X509_CSR_WRITE_C */