xref: /aosp_15_r20/external/mbedtls/tests/suites/test_suite_x509write.function (revision 62c56f9862f102b96d72393aff6076c951fb8148)
1*62c56f98SSadaf Ebrahimi/* BEGIN_HEADER */
2*62c56f98SSadaf Ebrahimi#include "mbedtls/bignum.h"
3*62c56f98SSadaf Ebrahimi#include "mbedtls/x509_crt.h"
4*62c56f98SSadaf Ebrahimi#include "mbedtls/x509_csr.h"
5*62c56f98SSadaf Ebrahimi#include "mbedtls/pem.h"
6*62c56f98SSadaf Ebrahimi#include "mbedtls/oid.h"
7*62c56f98SSadaf Ebrahimi#include "mbedtls/rsa.h"
8*62c56f98SSadaf Ebrahimi#include "mbedtls/asn1write.h"
9*62c56f98SSadaf Ebrahimi#include "mbedtls/pk.h"
10*62c56f98SSadaf Ebrahimi#include "md_psa.h"
11*62c56f98SSadaf Ebrahimi
12*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_RSA_C)
13*62c56f98SSadaf Ebrahimiint mbedtls_rsa_decrypt_func(void *ctx, size_t *olen,
14*62c56f98SSadaf Ebrahimi                             const unsigned char *input, unsigned char *output,
15*62c56f98SSadaf Ebrahimi                             size_t output_max_len)
16*62c56f98SSadaf Ebrahimi{
17*62c56f98SSadaf Ebrahimi    return mbedtls_rsa_pkcs1_decrypt((mbedtls_rsa_context *) ctx, NULL, NULL,
18*62c56f98SSadaf Ebrahimi                                     olen, input, output, output_max_len);
19*62c56f98SSadaf Ebrahimi}
20*62c56f98SSadaf Ebrahimiint mbedtls_rsa_sign_func(void *ctx,
21*62c56f98SSadaf Ebrahimi                          int (*f_rng)(void *, unsigned char *, size_t), void *p_rng,
22*62c56f98SSadaf Ebrahimi                          mbedtls_md_type_t md_alg, unsigned int hashlen,
23*62c56f98SSadaf Ebrahimi                          const unsigned char *hash, unsigned char *sig)
24*62c56f98SSadaf Ebrahimi{
25*62c56f98SSadaf Ebrahimi    return mbedtls_rsa_pkcs1_sign((mbedtls_rsa_context *) ctx, f_rng, p_rng,
26*62c56f98SSadaf Ebrahimi                                  md_alg, hashlen, hash, sig);
27*62c56f98SSadaf Ebrahimi}
28*62c56f98SSadaf Ebrahimisize_t mbedtls_rsa_key_len_func(void *ctx)
29*62c56f98SSadaf Ebrahimi{
30*62c56f98SSadaf Ebrahimi    return ((const mbedtls_rsa_context *) ctx)->len;
31*62c56f98SSadaf Ebrahimi}
32*62c56f98SSadaf Ebrahimi#endif /* MBEDTLS_RSA_C */
33*62c56f98SSadaf Ebrahimi
34*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_USE_PSA_CRYPTO) && \
35*62c56f98SSadaf Ebrahimi    defined(MBEDTLS_PEM_WRITE_C) && defined(MBEDTLS_X509_CSR_WRITE_C)
36*62c56f98SSadaf Ebrahimistatic int x509_crt_verifycsr(const unsigned char *buf, size_t buflen)
37*62c56f98SSadaf Ebrahimi{
38*62c56f98SSadaf Ebrahimi    unsigned char hash[PSA_HASH_MAX_SIZE];
39*62c56f98SSadaf Ebrahimi    mbedtls_x509_csr csr;
40*62c56f98SSadaf Ebrahimi    int ret = 0;
41*62c56f98SSadaf Ebrahimi
42*62c56f98SSadaf Ebrahimi    mbedtls_x509_csr_init(&csr);
43*62c56f98SSadaf Ebrahimi
44*62c56f98SSadaf Ebrahimi    if (mbedtls_x509_csr_parse(&csr, buf, buflen) != 0) {
45*62c56f98SSadaf Ebrahimi        ret = MBEDTLS_ERR_X509_BAD_INPUT_DATA;
46*62c56f98SSadaf Ebrahimi        goto cleanup;
47*62c56f98SSadaf Ebrahimi    }
48*62c56f98SSadaf Ebrahimi
49*62c56f98SSadaf Ebrahimi    psa_algorithm_t psa_alg = mbedtls_md_psa_alg_from_type(csr.sig_md);
50*62c56f98SSadaf Ebrahimi    size_t hash_size = 0;
51*62c56f98SSadaf Ebrahimi    psa_status_t status = psa_hash_compute(psa_alg, csr.cri.p, csr.cri.len,
52*62c56f98SSadaf Ebrahimi                                           hash, PSA_HASH_MAX_SIZE, &hash_size);
53*62c56f98SSadaf Ebrahimi
54*62c56f98SSadaf Ebrahimi    if (status != PSA_SUCCESS) {
55*62c56f98SSadaf Ebrahimi        /* Note: this can't happen except after an internal error */
56*62c56f98SSadaf Ebrahimi        ret = MBEDTLS_ERR_X509_BAD_INPUT_DATA;
57*62c56f98SSadaf Ebrahimi        goto cleanup;
58*62c56f98SSadaf Ebrahimi    }
59*62c56f98SSadaf Ebrahimi
60*62c56f98SSadaf Ebrahimi    if (mbedtls_pk_verify_ext(csr.sig_pk, csr.sig_opts, &csr.pk,
61*62c56f98SSadaf Ebrahimi                              csr.sig_md, hash, mbedtls_md_get_size_from_type(csr.sig_md),
62*62c56f98SSadaf Ebrahimi                              csr.sig.p, csr.sig.len) != 0) {
63*62c56f98SSadaf Ebrahimi        ret = MBEDTLS_ERR_X509_CERT_VERIFY_FAILED;
64*62c56f98SSadaf Ebrahimi        goto cleanup;
65*62c56f98SSadaf Ebrahimi    }
66*62c56f98SSadaf Ebrahimi
67*62c56f98SSadaf Ebrahimicleanup:
68*62c56f98SSadaf Ebrahimi
69*62c56f98SSadaf Ebrahimi    mbedtls_x509_csr_free(&csr);
70*62c56f98SSadaf Ebrahimi    return ret;
71*62c56f98SSadaf Ebrahimi}
72*62c56f98SSadaf Ebrahimi#endif /* MBEDTLS_USE_PSA_CRYPTO && MBEDTLS_PEM_WRITE_C && MBEDTLS_X509_CSR_WRITE_C */
73*62c56f98SSadaf Ebrahimi
74*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_X509_CSR_WRITE_C)
75*62c56f98SSadaf Ebrahimi
76*62c56f98SSadaf Ebrahimi/*
77*62c56f98SSadaf Ebrahimi * The size of this temporary buffer is given by the sequence of functions
78*62c56f98SSadaf Ebrahimi * called hereinafter:
79*62c56f98SSadaf Ebrahimi * - mbedtls_asn1_write_oid()
80*62c56f98SSadaf Ebrahimi *     - 8 bytes for MBEDTLS_OID_EXTENDED_KEY_USAGE raw value
81*62c56f98SSadaf Ebrahimi *     - 1 byte for MBEDTLS_OID_EXTENDED_KEY_USAGE length
82*62c56f98SSadaf Ebrahimi *     - 1 byte for MBEDTLS_ASN1_OID tag
83*62c56f98SSadaf Ebrahimi * - mbedtls_asn1_write_len()
84*62c56f98SSadaf Ebrahimi *     - 1 byte since we're dealing with sizes which are less than 0x80
85*62c56f98SSadaf Ebrahimi * - mbedtls_asn1_write_tag()
86*62c56f98SSadaf Ebrahimi *     - 1 byte
87*62c56f98SSadaf Ebrahimi *
88*62c56f98SSadaf Ebrahimi * This length is fine as long as this function is called using the
89*62c56f98SSadaf Ebrahimi * MBEDTLS_OID_SERVER_AUTH OID. If this is changed in the future, then this
90*62c56f98SSadaf Ebrahimi * buffer's length should be adjusted accordingly.
91*62c56f98SSadaf Ebrahimi * Unfortunately there's no predefined max size for OIDs which can be used
92*62c56f98SSadaf Ebrahimi * to set an overall upper boundary which is always guaranteed.
93*62c56f98SSadaf Ebrahimi */
94*62c56f98SSadaf Ebrahimi#define EXT_KEY_USAGE_TMP_BUF_MAX_LENGTH    12
95*62c56f98SSadaf Ebrahimi
96*62c56f98SSadaf Ebrahimistatic int csr_set_extended_key_usage(mbedtls_x509write_csr *ctx,
97*62c56f98SSadaf Ebrahimi                                      const char *oid, size_t oid_len)
98*62c56f98SSadaf Ebrahimi{
99*62c56f98SSadaf Ebrahimi    unsigned char buf[EXT_KEY_USAGE_TMP_BUF_MAX_LENGTH] = { 0 };
100*62c56f98SSadaf Ebrahimi    unsigned char *p = buf + sizeof(buf);
101*62c56f98SSadaf Ebrahimi    int ret;
102*62c56f98SSadaf Ebrahimi    size_t len = 0;
103*62c56f98SSadaf Ebrahimi
104*62c56f98SSadaf Ebrahimi    /*
105*62c56f98SSadaf Ebrahimi     * Following functions fail anyway if the temporary buffer is not large,
106*62c56f98SSadaf Ebrahimi     * but we set an extra check here to emphasize a possible source of errors
107*62c56f98SSadaf Ebrahimi     */
108*62c56f98SSadaf Ebrahimi    if (oid_len > EXT_KEY_USAGE_TMP_BUF_MAX_LENGTH) {
109*62c56f98SSadaf Ebrahimi        return MBEDTLS_ERR_X509_BAD_INPUT_DATA;
110*62c56f98SSadaf Ebrahimi    }
111*62c56f98SSadaf Ebrahimi
112*62c56f98SSadaf Ebrahimi    MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_oid(&p, buf, oid, oid_len));
113*62c56f98SSadaf Ebrahimi    MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_len(&p, buf, ret));
114*62c56f98SSadaf Ebrahimi    MBEDTLS_ASN1_CHK_ADD(len, mbedtls_asn1_write_tag(&p, buf,
115*62c56f98SSadaf Ebrahimi                                                     MBEDTLS_ASN1_CONSTRUCTED |
116*62c56f98SSadaf Ebrahimi                                                     MBEDTLS_ASN1_SEQUENCE));
117*62c56f98SSadaf Ebrahimi
118*62c56f98SSadaf Ebrahimi    ret = mbedtls_x509write_csr_set_extension(ctx,
119*62c56f98SSadaf Ebrahimi                                              MBEDTLS_OID_EXTENDED_KEY_USAGE,
120*62c56f98SSadaf Ebrahimi                                              MBEDTLS_OID_SIZE(MBEDTLS_OID_EXTENDED_KEY_USAGE),
121*62c56f98SSadaf Ebrahimi                                              0,
122*62c56f98SSadaf Ebrahimi                                              p,
123*62c56f98SSadaf Ebrahimi                                              len);
124*62c56f98SSadaf Ebrahimi
125*62c56f98SSadaf Ebrahimi    return ret;
126*62c56f98SSadaf Ebrahimi}
127*62c56f98SSadaf Ebrahimi#endif  /* MBEDTLS_X509_CSR_WRITE_C */
128*62c56f98SSadaf Ebrahimi
129*62c56f98SSadaf Ebrahimi/* Due to inconsistencies in the input size limits applied by different
130*62c56f98SSadaf Ebrahimi * library functions, some write-parse tests may fail. */
131*62c56f98SSadaf Ebrahimi#define MAY_FAIL_GET_NAME       0x0001
132*62c56f98SSadaf Ebrahimi#define MAY_FAIL_DN_GETS        0x0002
133*62c56f98SSadaf Ebrahimi
134*62c56f98SSadaf Ebrahimi/* END_HEADER */
135*62c56f98SSadaf Ebrahimi
136*62c56f98SSadaf Ebrahimi/* BEGIN_DEPENDENCIES
137*62c56f98SSadaf Ebrahimi * depends_on:MBEDTLS_FS_IO:MBEDTLS_PK_PARSE_C
138*62c56f98SSadaf Ebrahimi * END_DEPENDENCIES
139*62c56f98SSadaf Ebrahimi */
140*62c56f98SSadaf Ebrahimi
141*62c56f98SSadaf Ebrahimi/* BEGIN_CASE depends_on:MBEDTLS_PEM_WRITE_C:MBEDTLS_X509_CSR_WRITE_C */
142*62c56f98SSadaf Ebrahimivoid x509_csr_check(char *key_file, char *cert_req_check_file, int md_type,
143*62c56f98SSadaf Ebrahimi                    int key_usage, int set_key_usage, int cert_type,
144*62c56f98SSadaf Ebrahimi                    int set_cert_type, int set_extension)
145*62c56f98SSadaf Ebrahimi{
146*62c56f98SSadaf Ebrahimi    mbedtls_pk_context key;
147*62c56f98SSadaf Ebrahimi    mbedtls_x509write_csr req;
148*62c56f98SSadaf Ebrahimi    unsigned char buf[4096];
149*62c56f98SSadaf Ebrahimi    int ret;
150*62c56f98SSadaf Ebrahimi#if !defined(MBEDTLS_USE_PSA_CRYPTO)
151*62c56f98SSadaf Ebrahimi    unsigned char check_buf[4000];
152*62c56f98SSadaf Ebrahimi    FILE *f;
153*62c56f98SSadaf Ebrahimi    size_t olen = 0;
154*62c56f98SSadaf Ebrahimi#endif /* !MBEDTLS_USE_PSA_CRYPTO */
155*62c56f98SSadaf Ebrahimi    size_t pem_len = 0, buf_index;
156*62c56f98SSadaf Ebrahimi    int der_len = -1;
157*62c56f98SSadaf Ebrahimi    const char *subject_name = "C=NL,O=PolarSSL,CN=PolarSSL Server 1";
158*62c56f98SSadaf Ebrahimi    mbedtls_test_rnd_pseudo_info rnd_info;
159*62c56f98SSadaf Ebrahimi    mbedtls_x509_san_list san_ip;
160*62c56f98SSadaf Ebrahimi    mbedtls_x509_san_list san_dns;
161*62c56f98SSadaf Ebrahimi    mbedtls_x509_san_list san_uri;
162*62c56f98SSadaf Ebrahimi    mbedtls_x509_san_list san_mail;
163*62c56f98SSadaf Ebrahimi    mbedtls_x509_san_list san_dn;
164*62c56f98SSadaf Ebrahimi    mbedtls_x509_san_list *san_list = NULL;
165*62c56f98SSadaf Ebrahimi    mbedtls_asn1_named_data *ext_san_dirname = NULL;
166*62c56f98SSadaf Ebrahimi
167*62c56f98SSadaf Ebrahimi    const char san_ip_name[] = { 0x7f, 0x00, 0x00, 0x01 }; // 127.0.0.1
168*62c56f98SSadaf Ebrahimi    const char *san_dns_name = "example.com";
169*62c56f98SSadaf Ebrahimi    const char *san_dn_name = "C=UK,O=Mbed TLS,CN=Mbed TLS directoryName SAN";
170*62c56f98SSadaf Ebrahimi    const char *san_mail_name = "[email protected]";
171*62c56f98SSadaf Ebrahimi    const char *san_uri_name = "http://pki.example.com";
172*62c56f98SSadaf Ebrahimi
173*62c56f98SSadaf Ebrahimi    san_mail.node.type = MBEDTLS_X509_SAN_RFC822_NAME;
174*62c56f98SSadaf Ebrahimi    san_mail.node.san.unstructured_name.p = (unsigned char *) san_mail_name;
175*62c56f98SSadaf Ebrahimi    san_mail.node.san.unstructured_name.len = strlen(san_mail_name);
176*62c56f98SSadaf Ebrahimi    san_mail.next = NULL;
177*62c56f98SSadaf Ebrahimi
178*62c56f98SSadaf Ebrahimi    san_dns.node.type = MBEDTLS_X509_SAN_DNS_NAME;
179*62c56f98SSadaf Ebrahimi    san_dns.node.san.unstructured_name.p = (unsigned char *) san_dns_name;
180*62c56f98SSadaf Ebrahimi    san_dns.node.san.unstructured_name.len = strlen(san_dns_name);
181*62c56f98SSadaf Ebrahimi    san_dns.next = &san_mail;
182*62c56f98SSadaf Ebrahimi
183*62c56f98SSadaf Ebrahimi    san_dn.node.type = MBEDTLS_X509_SAN_DIRECTORY_NAME;
184*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_x509_string_to_names(&ext_san_dirname,
185*62c56f98SSadaf Ebrahimi                                             san_dn_name) == 0);
186*62c56f98SSadaf Ebrahimi    san_dn.node.san.directory_name = *ext_san_dirname;
187*62c56f98SSadaf Ebrahimi    san_dn.next = &san_dns;
188*62c56f98SSadaf Ebrahimi
189*62c56f98SSadaf Ebrahimi    san_ip.node.type = MBEDTLS_X509_SAN_IP_ADDRESS;
190*62c56f98SSadaf Ebrahimi    san_ip.node.san.unstructured_name.p = (unsigned char *) san_ip_name;
191*62c56f98SSadaf Ebrahimi    san_ip.node.san.unstructured_name.len = sizeof(san_ip_name);
192*62c56f98SSadaf Ebrahimi    san_ip.next = &san_dn;
193*62c56f98SSadaf Ebrahimi
194*62c56f98SSadaf Ebrahimi    san_uri.node.type = MBEDTLS_X509_SAN_UNIFORM_RESOURCE_IDENTIFIER;
195*62c56f98SSadaf Ebrahimi    san_uri.node.san.unstructured_name.p = (unsigned char *) san_uri_name;
196*62c56f98SSadaf Ebrahimi    san_uri.node.san.unstructured_name.len = strlen(san_uri_name);
197*62c56f98SSadaf Ebrahimi    san_uri.next = &san_ip;
198*62c56f98SSadaf Ebrahimi
199*62c56f98SSadaf Ebrahimi    san_list = &san_uri;
200*62c56f98SSadaf Ebrahimi
201*62c56f98SSadaf Ebrahimi    memset(&rnd_info, 0x2a, sizeof(mbedtls_test_rnd_pseudo_info));
202*62c56f98SSadaf Ebrahimi
203*62c56f98SSadaf Ebrahimi    mbedtls_x509write_csr_init(&req);
204*62c56f98SSadaf Ebrahimi    mbedtls_pk_init(&key);
205*62c56f98SSadaf Ebrahimi    MD_OR_USE_PSA_INIT();
206*62c56f98SSadaf Ebrahimi
207*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_parse_keyfile(&key, key_file, NULL,
208*62c56f98SSadaf Ebrahimi                                         mbedtls_test_rnd_std_rand, NULL) == 0);
209*62c56f98SSadaf Ebrahimi
210*62c56f98SSadaf Ebrahimi    mbedtls_x509write_csr_set_md_alg(&req, md_type);
211*62c56f98SSadaf Ebrahimi    mbedtls_x509write_csr_set_key(&req, &key);
212*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_x509write_csr_set_subject_name(&req, subject_name) == 0);
213*62c56f98SSadaf Ebrahimi    if (set_key_usage != 0) {
214*62c56f98SSadaf Ebrahimi        TEST_ASSERT(mbedtls_x509write_csr_set_key_usage(&req, key_usage) == 0);
215*62c56f98SSadaf Ebrahimi    }
216*62c56f98SSadaf Ebrahimi    if (set_cert_type != 0) {
217*62c56f98SSadaf Ebrahimi        TEST_ASSERT(mbedtls_x509write_csr_set_ns_cert_type(&req, cert_type) == 0);
218*62c56f98SSadaf Ebrahimi    }
219*62c56f98SSadaf Ebrahimi    if (set_extension != 0) {
220*62c56f98SSadaf Ebrahimi        TEST_ASSERT(csr_set_extended_key_usage(&req, MBEDTLS_OID_SERVER_AUTH,
221*62c56f98SSadaf Ebrahimi                                               MBEDTLS_OID_SIZE(MBEDTLS_OID_SERVER_AUTH)) == 0);
222*62c56f98SSadaf Ebrahimi
223*62c56f98SSadaf Ebrahimi        TEST_ASSERT(mbedtls_x509write_csr_set_subject_alternative_name(&req, san_list) == 0);
224*62c56f98SSadaf Ebrahimi    }
225*62c56f98SSadaf Ebrahimi
226*62c56f98SSadaf Ebrahimi    ret = mbedtls_x509write_csr_pem(&req, buf, sizeof(buf),
227*62c56f98SSadaf Ebrahimi                                    mbedtls_test_rnd_pseudo_rand, &rnd_info);
228*62c56f98SSadaf Ebrahimi    TEST_ASSERT(ret == 0);
229*62c56f98SSadaf Ebrahimi
230*62c56f98SSadaf Ebrahimi    pem_len = strlen((char *) buf);
231*62c56f98SSadaf Ebrahimi
232*62c56f98SSadaf Ebrahimi    for (buf_index = pem_len; buf_index < sizeof(buf); ++buf_index) {
233*62c56f98SSadaf Ebrahimi        TEST_ASSERT(buf[buf_index] == 0);
234*62c56f98SSadaf Ebrahimi    }
235*62c56f98SSadaf Ebrahimi
236*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_USE_PSA_CRYPTO)
237*62c56f98SSadaf Ebrahimi    // When using PSA crypto, RNG isn't controllable, so cert_req_check_file can't be used
238*62c56f98SSadaf Ebrahimi    (void) cert_req_check_file;
239*62c56f98SSadaf Ebrahimi    buf[pem_len] = '\0';
240*62c56f98SSadaf Ebrahimi    TEST_ASSERT(x509_crt_verifycsr(buf, pem_len + 1) == 0);
241*62c56f98SSadaf Ebrahimi#else
242*62c56f98SSadaf Ebrahimi    f = fopen(cert_req_check_file, "r");
243*62c56f98SSadaf Ebrahimi    TEST_ASSERT(f != NULL);
244*62c56f98SSadaf Ebrahimi    olen = fread(check_buf, 1, sizeof(check_buf), f);
245*62c56f98SSadaf Ebrahimi    fclose(f);
246*62c56f98SSadaf Ebrahimi
247*62c56f98SSadaf Ebrahimi    TEST_ASSERT(olen >= pem_len - 1);
248*62c56f98SSadaf Ebrahimi    TEST_ASSERT(memcmp(buf, check_buf, pem_len - 1) == 0);
249*62c56f98SSadaf Ebrahimi#endif /* MBEDTLS_USE_PSA_CRYPTO */
250*62c56f98SSadaf Ebrahimi
251*62c56f98SSadaf Ebrahimi    der_len = mbedtls_x509write_csr_der(&req, buf, sizeof(buf),
252*62c56f98SSadaf Ebrahimi                                        mbedtls_test_rnd_pseudo_rand,
253*62c56f98SSadaf Ebrahimi                                        &rnd_info);
254*62c56f98SSadaf Ebrahimi    TEST_ASSERT(der_len >= 0);
255*62c56f98SSadaf Ebrahimi
256*62c56f98SSadaf Ebrahimi    if (der_len == 0) {
257*62c56f98SSadaf Ebrahimi        goto exit;
258*62c56f98SSadaf Ebrahimi    }
259*62c56f98SSadaf Ebrahimi
260*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_USE_PSA_CRYPTO)
261*62c56f98SSadaf Ebrahimi    // When using PSA crypto, RNG isn't controllable, result length isn't
262*62c56f98SSadaf Ebrahimi    // deterministic over multiple runs, removing a single byte isn't enough to
263*62c56f98SSadaf Ebrahimi    // go into the MBEDTLS_ERR_ASN1_BUF_TOO_SMALL error case
264*62c56f98SSadaf Ebrahimi    der_len /= 2;
265*62c56f98SSadaf Ebrahimi#else
266*62c56f98SSadaf Ebrahimi    der_len -= 1;
267*62c56f98SSadaf Ebrahimi#endif
268*62c56f98SSadaf Ebrahimi    ret = mbedtls_x509write_csr_der(&req, buf, (size_t) (der_len),
269*62c56f98SSadaf Ebrahimi                                    mbedtls_test_rnd_pseudo_rand, &rnd_info);
270*62c56f98SSadaf Ebrahimi    TEST_ASSERT(ret == MBEDTLS_ERR_ASN1_BUF_TOO_SMALL);
271*62c56f98SSadaf Ebrahimi
272*62c56f98SSadaf Ebrahimiexit:
273*62c56f98SSadaf Ebrahimi    mbedtls_asn1_free_named_data_list(&ext_san_dirname);
274*62c56f98SSadaf Ebrahimi    mbedtls_x509write_csr_free(&req);
275*62c56f98SSadaf Ebrahimi    mbedtls_pk_free(&key);
276*62c56f98SSadaf Ebrahimi    MD_OR_USE_PSA_DONE();
277*62c56f98SSadaf Ebrahimi}
278*62c56f98SSadaf Ebrahimi/* END_CASE */
279*62c56f98SSadaf Ebrahimi
280*62c56f98SSadaf Ebrahimi/* BEGIN_CASE depends_on:MBEDTLS_PEM_WRITE_C:MBEDTLS_X509_CSR_WRITE_C:MBEDTLS_USE_PSA_CRYPTO */
281*62c56f98SSadaf Ebrahimivoid x509_csr_check_opaque(char *key_file, int md_type, int key_usage,
282*62c56f98SSadaf Ebrahimi                           int cert_type)
283*62c56f98SSadaf Ebrahimi{
284*62c56f98SSadaf Ebrahimi    mbedtls_pk_context key;
285*62c56f98SSadaf Ebrahimi    mbedtls_svc_key_id_t key_id = MBEDTLS_SVC_KEY_ID_INIT;
286*62c56f98SSadaf Ebrahimi    psa_algorithm_t md_alg_psa, alg_psa;
287*62c56f98SSadaf Ebrahimi    mbedtls_x509write_csr req;
288*62c56f98SSadaf Ebrahimi    unsigned char buf[4096];
289*62c56f98SSadaf Ebrahimi    int ret;
290*62c56f98SSadaf Ebrahimi    size_t pem_len = 0;
291*62c56f98SSadaf Ebrahimi    const char *subject_name = "C=NL,O=PolarSSL,CN=PolarSSL Server 1";
292*62c56f98SSadaf Ebrahimi    mbedtls_test_rnd_pseudo_info rnd_info;
293*62c56f98SSadaf Ebrahimi
294*62c56f98SSadaf Ebrahimi    mbedtls_x509write_csr_init(&req);
295*62c56f98SSadaf Ebrahimi    MD_OR_USE_PSA_INIT();
296*62c56f98SSadaf Ebrahimi
297*62c56f98SSadaf Ebrahimi    memset(&rnd_info, 0x2a, sizeof(mbedtls_test_rnd_pseudo_info));
298*62c56f98SSadaf Ebrahimi
299*62c56f98SSadaf Ebrahimi    md_alg_psa = mbedtls_md_psa_alg_from_type((mbedtls_md_type_t) md_type);
300*62c56f98SSadaf Ebrahimi    TEST_ASSERT(md_alg_psa != MBEDTLS_MD_NONE);
301*62c56f98SSadaf Ebrahimi
302*62c56f98SSadaf Ebrahimi    mbedtls_pk_init(&key);
303*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_parse_keyfile(&key, key_file, NULL,
304*62c56f98SSadaf Ebrahimi                                         mbedtls_test_rnd_std_rand, NULL) == 0);
305*62c56f98SSadaf Ebrahimi
306*62c56f98SSadaf Ebrahimi    if (mbedtls_pk_get_type(&key) == MBEDTLS_PK_ECKEY) {
307*62c56f98SSadaf Ebrahimi        alg_psa = PSA_ALG_ECDSA(md_alg_psa);
308*62c56f98SSadaf Ebrahimi    } else if (mbedtls_pk_get_type(&key) == MBEDTLS_PK_RSA) {
309*62c56f98SSadaf Ebrahimi        alg_psa = PSA_ALG_RSA_PKCS1V15_SIGN(md_alg_psa);
310*62c56f98SSadaf Ebrahimi    } else {
311*62c56f98SSadaf Ebrahimi        TEST_ASSUME(!"PK key type not supported in this configuration");
312*62c56f98SSadaf Ebrahimi    }
313*62c56f98SSadaf Ebrahimi
314*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_wrap_as_opaque(&key, &key_id, alg_psa,
315*62c56f98SSadaf Ebrahimi                                          PSA_KEY_USAGE_SIGN_HASH,
316*62c56f98SSadaf Ebrahimi                                          PSA_ALG_NONE) == 0);
317*62c56f98SSadaf Ebrahimi
318*62c56f98SSadaf Ebrahimi    mbedtls_x509write_csr_set_md_alg(&req, md_type);
319*62c56f98SSadaf Ebrahimi    mbedtls_x509write_csr_set_key(&req, &key);
320*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_x509write_csr_set_subject_name(&req, subject_name) == 0);
321*62c56f98SSadaf Ebrahimi    if (key_usage != 0) {
322*62c56f98SSadaf Ebrahimi        TEST_ASSERT(mbedtls_x509write_csr_set_key_usage(&req, key_usage) == 0);
323*62c56f98SSadaf Ebrahimi    }
324*62c56f98SSadaf Ebrahimi    if (cert_type != 0) {
325*62c56f98SSadaf Ebrahimi        TEST_ASSERT(mbedtls_x509write_csr_set_ns_cert_type(&req, cert_type) == 0);
326*62c56f98SSadaf Ebrahimi    }
327*62c56f98SSadaf Ebrahimi
328*62c56f98SSadaf Ebrahimi    ret = mbedtls_x509write_csr_pem(&req, buf, sizeof(buf) - 1,
329*62c56f98SSadaf Ebrahimi                                    mbedtls_test_rnd_pseudo_rand, &rnd_info);
330*62c56f98SSadaf Ebrahimi
331*62c56f98SSadaf Ebrahimi    TEST_ASSERT(ret == 0);
332*62c56f98SSadaf Ebrahimi
333*62c56f98SSadaf Ebrahimi    pem_len = strlen((char *) buf);
334*62c56f98SSadaf Ebrahimi    buf[pem_len] = '\0';
335*62c56f98SSadaf Ebrahimi    TEST_ASSERT(x509_crt_verifycsr(buf, pem_len + 1) == 0);
336*62c56f98SSadaf Ebrahimi
337*62c56f98SSadaf Ebrahimi
338*62c56f98SSadaf Ebrahimiexit:
339*62c56f98SSadaf Ebrahimi    mbedtls_x509write_csr_free(&req);
340*62c56f98SSadaf Ebrahimi    mbedtls_pk_free(&key);
341*62c56f98SSadaf Ebrahimi    psa_destroy_key(key_id);
342*62c56f98SSadaf Ebrahimi    MD_OR_USE_PSA_DONE();
343*62c56f98SSadaf Ebrahimi}
344*62c56f98SSadaf Ebrahimi/* END_CASE */
345*62c56f98SSadaf Ebrahimi
346*62c56f98SSadaf Ebrahimi/* BEGIN_CASE depends_on:MBEDTLS_PEM_WRITE_C:MBEDTLS_X509_CRT_WRITE_C:MBEDTLS_X509_CRT_PARSE_C:MBEDTLS_MD_CAN_SHA1 */
347*62c56f98SSadaf Ebrahimivoid x509_crt_check(char *subject_key_file, char *subject_pwd,
348*62c56f98SSadaf Ebrahimi                    char *subject_name, char *issuer_key_file,
349*62c56f98SSadaf Ebrahimi                    char *issuer_pwd, char *issuer_name,
350*62c56f98SSadaf Ebrahimi                    data_t *serial_arg, char *not_before, char *not_after,
351*62c56f98SSadaf Ebrahimi                    int md_type, int key_usage, int set_key_usage,
352*62c56f98SSadaf Ebrahimi                    char *ext_key_usage,
353*62c56f98SSadaf Ebrahimi                    int cert_type, int set_cert_type, int auth_ident,
354*62c56f98SSadaf Ebrahimi                    int ver, char *cert_check_file, int pk_wrap, int is_ca,
355*62c56f98SSadaf Ebrahimi                    char *cert_verify_file, int set_subjectAltNames)
356*62c56f98SSadaf Ebrahimi{
357*62c56f98SSadaf Ebrahimi    mbedtls_pk_context subject_key, issuer_key, issuer_key_alt;
358*62c56f98SSadaf Ebrahimi    mbedtls_pk_context *key = &issuer_key;
359*62c56f98SSadaf Ebrahimi
360*62c56f98SSadaf Ebrahimi    mbedtls_x509write_cert crt;
361*62c56f98SSadaf Ebrahimi    unsigned char buf[4096];
362*62c56f98SSadaf Ebrahimi    unsigned char check_buf[5000];
363*62c56f98SSadaf Ebrahimi    unsigned char *p, *end;
364*62c56f98SSadaf Ebrahimi    unsigned char tag, sz;
365*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_TEST_DEPRECATED) && defined(MBEDTLS_BIGNUM_C)
366*62c56f98SSadaf Ebrahimi    mbedtls_mpi serial_mpi;
367*62c56f98SSadaf Ebrahimi#endif
368*62c56f98SSadaf Ebrahimi    int ret, before_tag, after_tag;
369*62c56f98SSadaf Ebrahimi    size_t olen = 0, pem_len = 0, buf_index = 0;
370*62c56f98SSadaf Ebrahimi    int der_len = -1;
371*62c56f98SSadaf Ebrahimi    FILE *f;
372*62c56f98SSadaf Ebrahimi    mbedtls_test_rnd_pseudo_info rnd_info;
373*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_USE_PSA_CRYPTO)
374*62c56f98SSadaf Ebrahimi    mbedtls_svc_key_id_t key_id = MBEDTLS_SVC_KEY_ID_INIT;
375*62c56f98SSadaf Ebrahimi#endif
376*62c56f98SSadaf Ebrahimi    mbedtls_pk_type_t issuer_key_type;
377*62c56f98SSadaf Ebrahimi    mbedtls_x509_san_list san_ip;
378*62c56f98SSadaf Ebrahimi    mbedtls_x509_san_list san_dns;
379*62c56f98SSadaf Ebrahimi    mbedtls_x509_san_list san_uri;
380*62c56f98SSadaf Ebrahimi    mbedtls_x509_san_list san_mail;
381*62c56f98SSadaf Ebrahimi    mbedtls_x509_san_list san_dn;
382*62c56f98SSadaf Ebrahimi    mbedtls_asn1_named_data *ext_san_dirname = NULL;
383*62c56f98SSadaf Ebrahimi    const char san_ip_name[] = { 0x01, 0x02, 0x03, 0x04 };
384*62c56f98SSadaf Ebrahimi    const char *san_dns_name = "example.com";
385*62c56f98SSadaf Ebrahimi    const char *san_dn_name = "C=UK,O=Mbed TLS,CN=SubjectAltName test";
386*62c56f98SSadaf Ebrahimi    const char *san_mail_name = "[email protected]";
387*62c56f98SSadaf Ebrahimi    const char *san_uri_name = "http://pki.example.com";
388*62c56f98SSadaf Ebrahimi    mbedtls_x509_san_list *san_list = NULL;
389*62c56f98SSadaf Ebrahimi
390*62c56f98SSadaf Ebrahimi    if (set_subjectAltNames) {
391*62c56f98SSadaf Ebrahimi        san_mail.node.type = MBEDTLS_X509_SAN_RFC822_NAME;
392*62c56f98SSadaf Ebrahimi        san_mail.node.san.unstructured_name.p = (unsigned char *) san_mail_name;
393*62c56f98SSadaf Ebrahimi        san_mail.node.san.unstructured_name.len = strlen(san_mail_name);
394*62c56f98SSadaf Ebrahimi        san_mail.next = NULL;
395*62c56f98SSadaf Ebrahimi
396*62c56f98SSadaf Ebrahimi        san_dns.node.type = MBEDTLS_X509_SAN_DNS_NAME;
397*62c56f98SSadaf Ebrahimi        san_dns.node.san.unstructured_name.p = (unsigned char *) san_dns_name;
398*62c56f98SSadaf Ebrahimi        san_dns.node.san.unstructured_name.len = strlen(san_dns_name);
399*62c56f98SSadaf Ebrahimi        san_dns.next = &san_mail;
400*62c56f98SSadaf Ebrahimi
401*62c56f98SSadaf Ebrahimi        san_dn.node.type = MBEDTLS_X509_SAN_DIRECTORY_NAME;
402*62c56f98SSadaf Ebrahimi        TEST_ASSERT(mbedtls_x509_string_to_names(&ext_san_dirname,
403*62c56f98SSadaf Ebrahimi                                                 san_dn_name) == 0);
404*62c56f98SSadaf Ebrahimi        san_dn.node.san.directory_name = *ext_san_dirname;
405*62c56f98SSadaf Ebrahimi        san_dn.next = &san_dns;
406*62c56f98SSadaf Ebrahimi
407*62c56f98SSadaf Ebrahimi        san_ip.node.type = MBEDTLS_X509_SAN_IP_ADDRESS;
408*62c56f98SSadaf Ebrahimi        san_ip.node.san.unstructured_name.p = (unsigned char *) san_ip_name;
409*62c56f98SSadaf Ebrahimi        san_ip.node.san.unstructured_name.len = sizeof(san_ip_name);
410*62c56f98SSadaf Ebrahimi        san_ip.next = &san_dn;
411*62c56f98SSadaf Ebrahimi
412*62c56f98SSadaf Ebrahimi        san_uri.node.type = MBEDTLS_X509_SAN_UNIFORM_RESOURCE_IDENTIFIER;
413*62c56f98SSadaf Ebrahimi        san_uri.node.san.unstructured_name.p = (unsigned char *) san_uri_name;
414*62c56f98SSadaf Ebrahimi        san_uri.node.san.unstructured_name.len = strlen(san_uri_name);
415*62c56f98SSadaf Ebrahimi        san_uri.next = &san_ip;
416*62c56f98SSadaf Ebrahimi
417*62c56f98SSadaf Ebrahimi        san_list = &san_uri;
418*62c56f98SSadaf Ebrahimi    }
419*62c56f98SSadaf Ebrahimi
420*62c56f98SSadaf Ebrahimi    memset(&rnd_info, 0x2a, sizeof(mbedtls_test_rnd_pseudo_info));
421*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_TEST_DEPRECATED) && defined(MBEDTLS_BIGNUM_C)
422*62c56f98SSadaf Ebrahimi    mbedtls_mpi_init(&serial_mpi);
423*62c56f98SSadaf Ebrahimi#endif
424*62c56f98SSadaf Ebrahimi
425*62c56f98SSadaf Ebrahimi    mbedtls_pk_init(&subject_key);
426*62c56f98SSadaf Ebrahimi    mbedtls_pk_init(&issuer_key);
427*62c56f98SSadaf Ebrahimi    mbedtls_pk_init(&issuer_key_alt);
428*62c56f98SSadaf Ebrahimi    mbedtls_x509write_crt_init(&crt);
429*62c56f98SSadaf Ebrahimi    MD_OR_USE_PSA_INIT();
430*62c56f98SSadaf Ebrahimi
431*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_parse_keyfile(&subject_key, subject_key_file,
432*62c56f98SSadaf Ebrahimi                                         subject_pwd, mbedtls_test_rnd_std_rand, NULL) == 0);
433*62c56f98SSadaf Ebrahimi
434*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_pk_parse_keyfile(&issuer_key, issuer_key_file,
435*62c56f98SSadaf Ebrahimi                                         issuer_pwd, mbedtls_test_rnd_std_rand, NULL) == 0);
436*62c56f98SSadaf Ebrahimi
437*62c56f98SSadaf Ebrahimi    issuer_key_type = mbedtls_pk_get_type(&issuer_key);
438*62c56f98SSadaf Ebrahimi
439*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_RSA_C) && defined(MBEDTLS_PK_RSA_ALT_SUPPORT)
440*62c56f98SSadaf Ebrahimi    /* For RSA PK contexts, create a copy as an alternative RSA context. */
441*62c56f98SSadaf Ebrahimi    if (pk_wrap == 1 && issuer_key_type == MBEDTLS_PK_RSA) {
442*62c56f98SSadaf Ebrahimi        TEST_ASSERT(mbedtls_pk_setup_rsa_alt(&issuer_key_alt,
443*62c56f98SSadaf Ebrahimi                                             mbedtls_pk_rsa(issuer_key),
444*62c56f98SSadaf Ebrahimi                                             mbedtls_rsa_decrypt_func,
445*62c56f98SSadaf Ebrahimi                                             mbedtls_rsa_sign_func,
446*62c56f98SSadaf Ebrahimi                                             mbedtls_rsa_key_len_func) == 0);
447*62c56f98SSadaf Ebrahimi
448*62c56f98SSadaf Ebrahimi        key = &issuer_key_alt;
449*62c56f98SSadaf Ebrahimi    }
450*62c56f98SSadaf Ebrahimi#endif
451*62c56f98SSadaf Ebrahimi
452*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_USE_PSA_CRYPTO)
453*62c56f98SSadaf Ebrahimi    /* For Opaque PK contexts, wrap key as an Opaque RSA context. */
454*62c56f98SSadaf Ebrahimi    if (pk_wrap == 2) {
455*62c56f98SSadaf Ebrahimi        psa_algorithm_t alg_psa, md_alg_psa;
456*62c56f98SSadaf Ebrahimi
457*62c56f98SSadaf Ebrahimi        md_alg_psa = mbedtls_md_psa_alg_from_type((mbedtls_md_type_t) md_type);
458*62c56f98SSadaf Ebrahimi        TEST_ASSERT(md_alg_psa != MBEDTLS_MD_NONE);
459*62c56f98SSadaf Ebrahimi
460*62c56f98SSadaf Ebrahimi        if (mbedtls_pk_get_type(&issuer_key) == MBEDTLS_PK_ECKEY) {
461*62c56f98SSadaf Ebrahimi            alg_psa = PSA_ALG_ECDSA(md_alg_psa);
462*62c56f98SSadaf Ebrahimi        } else if (mbedtls_pk_get_type(&issuer_key) == MBEDTLS_PK_RSA) {
463*62c56f98SSadaf Ebrahimi            alg_psa = PSA_ALG_RSA_PKCS1V15_SIGN(md_alg_psa);
464*62c56f98SSadaf Ebrahimi        } else {
465*62c56f98SSadaf Ebrahimi            TEST_ASSUME(!"PK key type not supported in this configuration");
466*62c56f98SSadaf Ebrahimi        }
467*62c56f98SSadaf Ebrahimi
468*62c56f98SSadaf Ebrahimi        TEST_ASSERT(mbedtls_pk_wrap_as_opaque(&issuer_key, &key_id, alg_psa,
469*62c56f98SSadaf Ebrahimi                                              PSA_KEY_USAGE_SIGN_HASH,
470*62c56f98SSadaf Ebrahimi                                              PSA_ALG_NONE) == 0);
471*62c56f98SSadaf Ebrahimi    }
472*62c56f98SSadaf Ebrahimi#endif /* MBEDTLS_USE_PSA_CRYPTO */
473*62c56f98SSadaf Ebrahimi
474*62c56f98SSadaf Ebrahimi    if (pk_wrap == 2) {
475*62c56f98SSadaf Ebrahimi        TEST_ASSERT(mbedtls_pk_get_type(&issuer_key) == MBEDTLS_PK_OPAQUE);
476*62c56f98SSadaf Ebrahimi    }
477*62c56f98SSadaf Ebrahimi
478*62c56f98SSadaf Ebrahimi    if (ver != -1) {
479*62c56f98SSadaf Ebrahimi        mbedtls_x509write_crt_set_version(&crt, ver);
480*62c56f98SSadaf Ebrahimi    }
481*62c56f98SSadaf Ebrahimi
482*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_TEST_DEPRECATED) && defined(MBEDTLS_BIGNUM_C)
483*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_mpi_read_binary(&serial_mpi, serial_arg->x,
484*62c56f98SSadaf Ebrahimi                                        serial_arg->len) == 0);
485*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_x509write_crt_set_serial(&crt, &serial_mpi) == 0);
486*62c56f98SSadaf Ebrahimi#else
487*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_x509write_crt_set_serial_raw(&crt, serial_arg->x,
488*62c56f98SSadaf Ebrahimi                                                     serial_arg->len) == 0);
489*62c56f98SSadaf Ebrahimi#endif
490*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_x509write_crt_set_validity(&crt, not_before,
491*62c56f98SSadaf Ebrahimi                                                   not_after) == 0);
492*62c56f98SSadaf Ebrahimi    mbedtls_x509write_crt_set_md_alg(&crt, md_type);
493*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_x509write_crt_set_issuer_name(&crt, issuer_name) == 0);
494*62c56f98SSadaf Ebrahimi    TEST_ASSERT(mbedtls_x509write_crt_set_subject_name(&crt, subject_name) == 0);
495*62c56f98SSadaf Ebrahimi    mbedtls_x509write_crt_set_subject_key(&crt, &subject_key);
496*62c56f98SSadaf Ebrahimi
497*62c56f98SSadaf Ebrahimi    mbedtls_x509write_crt_set_issuer_key(&crt, key);
498*62c56f98SSadaf Ebrahimi
499*62c56f98SSadaf Ebrahimi    if (crt.version >= MBEDTLS_X509_CRT_VERSION_3) {
500*62c56f98SSadaf Ebrahimi        /* For the CA case, a path length of -1 means unlimited. */
501*62c56f98SSadaf Ebrahimi        TEST_ASSERT(mbedtls_x509write_crt_set_basic_constraints(&crt, is_ca,
502*62c56f98SSadaf Ebrahimi                                                                (is_ca ? -1 : 0)) == 0);
503*62c56f98SSadaf Ebrahimi        TEST_ASSERT(mbedtls_x509write_crt_set_subject_key_identifier(&crt) == 0);
504*62c56f98SSadaf Ebrahimi        if (auth_ident) {
505*62c56f98SSadaf Ebrahimi            TEST_ASSERT(mbedtls_x509write_crt_set_authority_key_identifier(&crt) == 0);
506*62c56f98SSadaf Ebrahimi        }
507*62c56f98SSadaf Ebrahimi        if (set_key_usage != 0) {
508*62c56f98SSadaf Ebrahimi            TEST_ASSERT(mbedtls_x509write_crt_set_key_usage(&crt, key_usage) == 0);
509*62c56f98SSadaf Ebrahimi        }
510*62c56f98SSadaf Ebrahimi        if (set_cert_type != 0) {
511*62c56f98SSadaf Ebrahimi            TEST_ASSERT(mbedtls_x509write_crt_set_ns_cert_type(&crt, cert_type) == 0);
512*62c56f98SSadaf Ebrahimi        }
513*62c56f98SSadaf Ebrahimi        if (strcmp(ext_key_usage, "NULL") != 0) {
514*62c56f98SSadaf Ebrahimi            mbedtls_asn1_sequence exts[2];
515*62c56f98SSadaf Ebrahimi            memset(exts, 0, sizeof(exts));
516*62c56f98SSadaf Ebrahimi
517*62c56f98SSadaf Ebrahimi#define SET_OID(x, oid)                \
518*62c56f98SSadaf Ebrahimi    do {                               \
519*62c56f98SSadaf Ebrahimi        x.len = MBEDTLS_OID_SIZE(oid); \
520*62c56f98SSadaf Ebrahimi        x.p   = (unsigned char *) oid;   \
521*62c56f98SSadaf Ebrahimi        x.tag = MBEDTLS_ASN1_OID;      \
522*62c56f98SSadaf Ebrahimi    }                                  \
523*62c56f98SSadaf Ebrahimi    while (0)
524*62c56f98SSadaf Ebrahimi
525*62c56f98SSadaf Ebrahimi            if (strcmp(ext_key_usage, "serverAuth") == 0) {
526*62c56f98SSadaf Ebrahimi                SET_OID(exts[0].buf, MBEDTLS_OID_SERVER_AUTH);
527*62c56f98SSadaf Ebrahimi            } else if (strcmp(ext_key_usage, "codeSigning,timeStamping") == 0) {
528*62c56f98SSadaf Ebrahimi                SET_OID(exts[0].buf, MBEDTLS_OID_CODE_SIGNING);
529*62c56f98SSadaf Ebrahimi                exts[0].next = &exts[1];
530*62c56f98SSadaf Ebrahimi                SET_OID(exts[1].buf, MBEDTLS_OID_TIME_STAMPING);
531*62c56f98SSadaf Ebrahimi            }
532*62c56f98SSadaf Ebrahimi            TEST_ASSERT(mbedtls_x509write_crt_set_ext_key_usage(&crt, exts) == 0);
533*62c56f98SSadaf Ebrahimi        }
534*62c56f98SSadaf Ebrahimi    }
535*62c56f98SSadaf Ebrahimi
536*62c56f98SSadaf Ebrahimi    if (set_subjectAltNames) {
537*62c56f98SSadaf Ebrahimi        TEST_ASSERT(mbedtls_x509write_crt_set_subject_alternative_name(&crt, san_list) == 0);
538*62c56f98SSadaf Ebrahimi    }
539*62c56f98SSadaf Ebrahimi    ret = mbedtls_x509write_crt_pem(&crt, buf, sizeof(buf),
540*62c56f98SSadaf Ebrahimi                                    mbedtls_test_rnd_pseudo_rand, &rnd_info);
541*62c56f98SSadaf Ebrahimi    TEST_ASSERT(ret == 0);
542*62c56f98SSadaf Ebrahimi
543*62c56f98SSadaf Ebrahimi    pem_len = strlen((char *) buf);
544*62c56f98SSadaf Ebrahimi
545*62c56f98SSadaf Ebrahimi    // check that the rest of the buffer remains clear
546*62c56f98SSadaf Ebrahimi    for (buf_index = pem_len; buf_index < sizeof(buf); ++buf_index) {
547*62c56f98SSadaf Ebrahimi        TEST_ASSERT(buf[buf_index] == 0);
548*62c56f98SSadaf Ebrahimi    }
549*62c56f98SSadaf Ebrahimi
550*62c56f98SSadaf Ebrahimi    if (issuer_key_type != MBEDTLS_PK_RSA) {
551*62c56f98SSadaf Ebrahimi        mbedtls_x509_crt crt_parse, trusted;
552*62c56f98SSadaf Ebrahimi        uint32_t flags;
553*62c56f98SSadaf Ebrahimi
554*62c56f98SSadaf Ebrahimi        mbedtls_x509_crt_init(&crt_parse);
555*62c56f98SSadaf Ebrahimi        mbedtls_x509_crt_init(&trusted);
556*62c56f98SSadaf Ebrahimi
557*62c56f98SSadaf Ebrahimi        TEST_ASSERT(mbedtls_x509_crt_parse_file(&trusted,
558*62c56f98SSadaf Ebrahimi                                                cert_verify_file) == 0);
559*62c56f98SSadaf Ebrahimi        TEST_ASSERT(mbedtls_x509_crt_parse(&crt_parse,
560*62c56f98SSadaf Ebrahimi                                           buf, sizeof(buf)) == 0);
561*62c56f98SSadaf Ebrahimi
562*62c56f98SSadaf Ebrahimi        ret = mbedtls_x509_crt_verify(&crt_parse, &trusted, NULL, NULL, &flags,
563*62c56f98SSadaf Ebrahimi                                      NULL, NULL);
564*62c56f98SSadaf Ebrahimi
565*62c56f98SSadaf Ebrahimi        mbedtls_x509_crt_free(&crt_parse);
566*62c56f98SSadaf Ebrahimi        mbedtls_x509_crt_free(&trusted);
567*62c56f98SSadaf Ebrahimi
568*62c56f98SSadaf Ebrahimi        TEST_EQUAL(flags, 0);
569*62c56f98SSadaf Ebrahimi        TEST_EQUAL(ret, 0);
570*62c56f98SSadaf Ebrahimi    } else if (*cert_check_file != '\0') {
571*62c56f98SSadaf Ebrahimi        f = fopen(cert_check_file, "r");
572*62c56f98SSadaf Ebrahimi        TEST_ASSERT(f != NULL);
573*62c56f98SSadaf Ebrahimi        olen = fread(check_buf, 1, sizeof(check_buf), f);
574*62c56f98SSadaf Ebrahimi        fclose(f);
575*62c56f98SSadaf Ebrahimi        TEST_ASSERT(olen < sizeof(check_buf));
576*62c56f98SSadaf Ebrahimi
577*62c56f98SSadaf Ebrahimi        TEST_EQUAL(olen, pem_len);
578*62c56f98SSadaf Ebrahimi        TEST_ASSERT(olen >= pem_len - 1);
579*62c56f98SSadaf Ebrahimi        TEST_ASSERT(memcmp(buf, check_buf, pem_len - 1) == 0);
580*62c56f98SSadaf Ebrahimi    }
581*62c56f98SSadaf Ebrahimi
582*62c56f98SSadaf Ebrahimi    der_len = mbedtls_x509write_crt_der(&crt, buf, sizeof(buf),
583*62c56f98SSadaf Ebrahimi                                        mbedtls_test_rnd_pseudo_rand,
584*62c56f98SSadaf Ebrahimi                                        &rnd_info);
585*62c56f98SSadaf Ebrahimi    TEST_ASSERT(der_len >= 0);
586*62c56f98SSadaf Ebrahimi
587*62c56f98SSadaf Ebrahimi    if (der_len == 0) {
588*62c56f98SSadaf Ebrahimi        goto exit;
589*62c56f98SSadaf Ebrahimi    }
590*62c56f98SSadaf Ebrahimi
591*62c56f98SSadaf Ebrahimi    // Not testing against file, check date format
592*62c56f98SSadaf Ebrahimi    if (*cert_check_file == '\0') {
593*62c56f98SSadaf Ebrahimi        // UTC tag if before 2050, 2 digits less for year
594*62c56f98SSadaf Ebrahimi        if (not_before[0] == '2' && (not_before[1] > '0' || not_before[2] > '4')) {
595*62c56f98SSadaf Ebrahimi            before_tag = MBEDTLS_ASN1_GENERALIZED_TIME;
596*62c56f98SSadaf Ebrahimi        } else {
597*62c56f98SSadaf Ebrahimi            before_tag = MBEDTLS_ASN1_UTC_TIME;
598*62c56f98SSadaf Ebrahimi            not_before += 2;
599*62c56f98SSadaf Ebrahimi        }
600*62c56f98SSadaf Ebrahimi        if (not_after[0] == '2' && (not_after[1] > '0' || not_after[2] > '4')) {
601*62c56f98SSadaf Ebrahimi            after_tag = MBEDTLS_ASN1_GENERALIZED_TIME;
602*62c56f98SSadaf Ebrahimi        } else {
603*62c56f98SSadaf Ebrahimi            after_tag = MBEDTLS_ASN1_UTC_TIME;
604*62c56f98SSadaf Ebrahimi            not_after += 2;
605*62c56f98SSadaf Ebrahimi        }
606*62c56f98SSadaf Ebrahimi        end = buf + sizeof(buf);
607*62c56f98SSadaf Ebrahimi        for (p = end - der_len; p < end;) {
608*62c56f98SSadaf Ebrahimi            tag = *p++;
609*62c56f98SSadaf Ebrahimi            sz = *p++;
610*62c56f98SSadaf Ebrahimi            if (tag == MBEDTLS_ASN1_UTC_TIME || tag == MBEDTLS_ASN1_GENERALIZED_TIME) {
611*62c56f98SSadaf Ebrahimi                // Check correct tag and time written
612*62c56f98SSadaf Ebrahimi                TEST_ASSERT(before_tag == tag);
613*62c56f98SSadaf Ebrahimi                TEST_ASSERT(memcmp(p, not_before, sz - 1) == 0);
614*62c56f98SSadaf Ebrahimi                p += sz;
615*62c56f98SSadaf Ebrahimi                tag = *p++;
616*62c56f98SSadaf Ebrahimi                sz = *p++;
617*62c56f98SSadaf Ebrahimi                TEST_ASSERT(after_tag == tag);
618*62c56f98SSadaf Ebrahimi                TEST_ASSERT(memcmp(p, not_after, sz - 1) == 0);
619*62c56f98SSadaf Ebrahimi                break;
620*62c56f98SSadaf Ebrahimi            }
621*62c56f98SSadaf Ebrahimi            // Increment if long form ASN1 length
622*62c56f98SSadaf Ebrahimi            if (sz & 0x80) {
623*62c56f98SSadaf Ebrahimi                p += sz & 0x0F;
624*62c56f98SSadaf Ebrahimi            }
625*62c56f98SSadaf Ebrahimi            if (tag != (MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) {
626*62c56f98SSadaf Ebrahimi                p += sz;
627*62c56f98SSadaf Ebrahimi            }
628*62c56f98SSadaf Ebrahimi        }
629*62c56f98SSadaf Ebrahimi        TEST_ASSERT(p < end);
630*62c56f98SSadaf Ebrahimi    }
631*62c56f98SSadaf Ebrahimi
632*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_USE_PSA_CRYPTO)
633*62c56f98SSadaf Ebrahimi    // When using PSA crypto, RNG isn't controllable, result length isn't
634*62c56f98SSadaf Ebrahimi    // deterministic over multiple runs, removing a single byte isn't enough to
635*62c56f98SSadaf Ebrahimi    // go into the MBEDTLS_ERR_ASN1_BUF_TOO_SMALL error case
636*62c56f98SSadaf Ebrahimi    if (issuer_key_type != MBEDTLS_PK_RSA) {
637*62c56f98SSadaf Ebrahimi        der_len /= 2;
638*62c56f98SSadaf Ebrahimi    } else
639*62c56f98SSadaf Ebrahimi#endif
640*62c56f98SSadaf Ebrahimi    der_len -= 1;
641*62c56f98SSadaf Ebrahimi
642*62c56f98SSadaf Ebrahimi    ret = mbedtls_x509write_crt_der(&crt, buf, (size_t) (der_len),
643*62c56f98SSadaf Ebrahimi                                    mbedtls_test_rnd_pseudo_rand, &rnd_info);
644*62c56f98SSadaf Ebrahimi    TEST_ASSERT(ret == MBEDTLS_ERR_ASN1_BUF_TOO_SMALL);
645*62c56f98SSadaf Ebrahimi
646*62c56f98SSadaf Ebrahimiexit:
647*62c56f98SSadaf Ebrahimi    mbedtls_asn1_free_named_data_list(&ext_san_dirname);
648*62c56f98SSadaf Ebrahimi    mbedtls_x509write_crt_free(&crt);
649*62c56f98SSadaf Ebrahimi    mbedtls_pk_free(&issuer_key_alt);
650*62c56f98SSadaf Ebrahimi    mbedtls_pk_free(&subject_key);
651*62c56f98SSadaf Ebrahimi    mbedtls_pk_free(&issuer_key);
652*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_TEST_DEPRECATED) && defined(MBEDTLS_BIGNUM_C)
653*62c56f98SSadaf Ebrahimi    mbedtls_mpi_free(&serial_mpi);
654*62c56f98SSadaf Ebrahimi#endif
655*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_USE_PSA_CRYPTO)
656*62c56f98SSadaf Ebrahimi    psa_destroy_key(key_id);
657*62c56f98SSadaf Ebrahimi#endif
658*62c56f98SSadaf Ebrahimi    MD_OR_USE_PSA_DONE();
659*62c56f98SSadaf Ebrahimi}
660*62c56f98SSadaf Ebrahimi/* END_CASE */
661*62c56f98SSadaf Ebrahimi
662*62c56f98SSadaf Ebrahimi/* BEGIN_CASE depends_on:MBEDTLS_X509_CRT_WRITE_C */
663*62c56f98SSadaf Ebrahimivoid x509_set_serial_check()
664*62c56f98SSadaf Ebrahimi{
665*62c56f98SSadaf Ebrahimi    mbedtls_x509write_cert ctx;
666*62c56f98SSadaf Ebrahimi    uint8_t invalid_serial[MBEDTLS_X509_RFC5280_MAX_SERIAL_LEN + 1];
667*62c56f98SSadaf Ebrahimi
668*62c56f98SSadaf Ebrahimi    USE_PSA_INIT();
669*62c56f98SSadaf Ebrahimi    memset(invalid_serial, 0x01, sizeof(invalid_serial));
670*62c56f98SSadaf Ebrahimi
671*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_TEST_DEPRECATED) && defined(MBEDTLS_BIGNUM_C)
672*62c56f98SSadaf Ebrahimi    mbedtls_mpi serial_mpi;
673*62c56f98SSadaf Ebrahimi
674*62c56f98SSadaf Ebrahimi    mbedtls_mpi_init(&serial_mpi);
675*62c56f98SSadaf Ebrahimi    TEST_EQUAL(mbedtls_mpi_read_binary(&serial_mpi, invalid_serial,
676*62c56f98SSadaf Ebrahimi                                       sizeof(invalid_serial)), 0);
677*62c56f98SSadaf Ebrahimi    TEST_EQUAL(mbedtls_x509write_crt_set_serial(&ctx, &serial_mpi),
678*62c56f98SSadaf Ebrahimi               MBEDTLS_ERR_X509_BAD_INPUT_DATA);
679*62c56f98SSadaf Ebrahimi#endif
680*62c56f98SSadaf Ebrahimi
681*62c56f98SSadaf Ebrahimi    TEST_EQUAL(mbedtls_x509write_crt_set_serial_raw(&ctx, invalid_serial,
682*62c56f98SSadaf Ebrahimi                                                    sizeof(invalid_serial)),
683*62c56f98SSadaf Ebrahimi               MBEDTLS_ERR_X509_BAD_INPUT_DATA);
684*62c56f98SSadaf Ebrahimi
685*62c56f98SSadaf Ebrahimiexit:
686*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_TEST_DEPRECATED) && defined(MBEDTLS_BIGNUM_C)
687*62c56f98SSadaf Ebrahimi    mbedtls_mpi_free(&serial_mpi);
688*62c56f98SSadaf Ebrahimi#else
689*62c56f98SSadaf Ebrahimi    ;
690*62c56f98SSadaf Ebrahimi#endif
691*62c56f98SSadaf Ebrahimi    USE_PSA_DONE();
692*62c56f98SSadaf Ebrahimi}
693*62c56f98SSadaf Ebrahimi/* END_CASE */
694*62c56f98SSadaf Ebrahimi
695*62c56f98SSadaf Ebrahimi/* BEGIN_CASE depends_on:MBEDTLS_X509_CREATE_C:MBEDTLS_X509_USE_C */
696*62c56f98SSadaf Ebrahimivoid mbedtls_x509_string_to_names(char *name, char *parsed_name,
697*62c56f98SSadaf Ebrahimi                                  int result, int may_fail)
698*62c56f98SSadaf Ebrahimi{
699*62c56f98SSadaf Ebrahimi    int ret;
700*62c56f98SSadaf Ebrahimi    size_t len = 0;
701*62c56f98SSadaf Ebrahimi    mbedtls_asn1_named_data *names = NULL;
702*62c56f98SSadaf Ebrahimi    mbedtls_x509_name parsed, *parsed_cur, *parsed_prv;
703*62c56f98SSadaf Ebrahimi    unsigned char buf[1024], out[1024], *c;
704*62c56f98SSadaf Ebrahimi
705*62c56f98SSadaf Ebrahimi    USE_PSA_INIT();
706*62c56f98SSadaf Ebrahimi
707*62c56f98SSadaf Ebrahimi    memset(&parsed, 0, sizeof(parsed));
708*62c56f98SSadaf Ebrahimi    memset(out, 0, sizeof(out));
709*62c56f98SSadaf Ebrahimi    memset(buf, 0, sizeof(buf));
710*62c56f98SSadaf Ebrahimi    c = buf + sizeof(buf);
711*62c56f98SSadaf Ebrahimi
712*62c56f98SSadaf Ebrahimi    ret = mbedtls_x509_string_to_names(&names, name);
713*62c56f98SSadaf Ebrahimi    TEST_EQUAL(ret, result);
714*62c56f98SSadaf Ebrahimi
715*62c56f98SSadaf Ebrahimi    if (ret != 0) {
716*62c56f98SSadaf Ebrahimi        goto exit;
717*62c56f98SSadaf Ebrahimi    }
718*62c56f98SSadaf Ebrahimi
719*62c56f98SSadaf Ebrahimi    ret = mbedtls_x509_write_names(&c, buf, names);
720*62c56f98SSadaf Ebrahimi    TEST_LE_S(1, ret);
721*62c56f98SSadaf Ebrahimi
722*62c56f98SSadaf Ebrahimi    TEST_EQUAL(mbedtls_asn1_get_tag(&c, buf + sizeof(buf), &len,
723*62c56f98SSadaf Ebrahimi                                    MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE), 0);
724*62c56f98SSadaf Ebrahimi    ret = mbedtls_x509_get_name(&c, buf + sizeof(buf), &parsed);
725*62c56f98SSadaf Ebrahimi    if ((may_fail & MAY_FAIL_GET_NAME) && ret < 0) {
726*62c56f98SSadaf Ebrahimi        /* Validation inconsistency between mbedtls_x509_string_to_names() and
727*62c56f98SSadaf Ebrahimi         * mbedtls_x509_get_name(). Accept it for now. */
728*62c56f98SSadaf Ebrahimi        goto exit;
729*62c56f98SSadaf Ebrahimi    }
730*62c56f98SSadaf Ebrahimi    TEST_EQUAL(ret, 0);
731*62c56f98SSadaf Ebrahimi
732*62c56f98SSadaf Ebrahimi    ret = mbedtls_x509_dn_gets((char *) out, sizeof(out), &parsed);
733*62c56f98SSadaf Ebrahimi    if ((may_fail & MAY_FAIL_DN_GETS) && ret < 0) {
734*62c56f98SSadaf Ebrahimi        /* Validation inconsistency between mbedtls_x509_string_to_names() and
735*62c56f98SSadaf Ebrahimi         * mbedtls_x509_dn_gets(). Accept it for now. */
736*62c56f98SSadaf Ebrahimi        goto exit;
737*62c56f98SSadaf Ebrahimi    }
738*62c56f98SSadaf Ebrahimi    TEST_LE_S(1, ret);
739*62c56f98SSadaf Ebrahimi    TEST_ASSERT(strcmp((char *) out, parsed_name) == 0);
740*62c56f98SSadaf Ebrahimi
741*62c56f98SSadaf Ebrahimiexit:
742*62c56f98SSadaf Ebrahimi    mbedtls_asn1_free_named_data_list(&names);
743*62c56f98SSadaf Ebrahimi
744*62c56f98SSadaf Ebrahimi    parsed_cur = parsed.next;
745*62c56f98SSadaf Ebrahimi    while (parsed_cur != 0) {
746*62c56f98SSadaf Ebrahimi        parsed_prv = parsed_cur;
747*62c56f98SSadaf Ebrahimi        parsed_cur = parsed_cur->next;
748*62c56f98SSadaf Ebrahimi        mbedtls_free(parsed_prv);
749*62c56f98SSadaf Ebrahimi    }
750*62c56f98SSadaf Ebrahimi    USE_PSA_DONE();
751*62c56f98SSadaf Ebrahimi}
752*62c56f98SSadaf Ebrahimi/* END_CASE */
753*62c56f98SSadaf Ebrahimi
754*62c56f98SSadaf Ebrahimi/* BEGIN_CASE depends_on:MBEDTLS_X509_CSR_WRITE_C */
755*62c56f98SSadaf Ebrahimivoid x509_set_extension_length_check()
756*62c56f98SSadaf Ebrahimi{
757*62c56f98SSadaf Ebrahimi    int ret = 0;
758*62c56f98SSadaf Ebrahimi
759*62c56f98SSadaf Ebrahimi    mbedtls_x509write_csr ctx;
760*62c56f98SSadaf Ebrahimi    mbedtls_x509write_csr_init(&ctx);
761*62c56f98SSadaf Ebrahimi
762*62c56f98SSadaf Ebrahimi    unsigned char buf[EXT_KEY_USAGE_TMP_BUF_MAX_LENGTH] = { 0 };
763*62c56f98SSadaf Ebrahimi    unsigned char *p = buf + sizeof(buf);
764*62c56f98SSadaf Ebrahimi
765*62c56f98SSadaf Ebrahimi    ret = mbedtls_x509_set_extension(&(ctx.MBEDTLS_PRIVATE(extensions)),
766*62c56f98SSadaf Ebrahimi                                     MBEDTLS_OID_EXTENDED_KEY_USAGE,
767*62c56f98SSadaf Ebrahimi                                     MBEDTLS_OID_SIZE(MBEDTLS_OID_EXTENDED_KEY_USAGE),
768*62c56f98SSadaf Ebrahimi                                     0,
769*62c56f98SSadaf Ebrahimi                                     p,
770*62c56f98SSadaf Ebrahimi                                     SIZE_MAX);
771*62c56f98SSadaf Ebrahimi    TEST_ASSERT(MBEDTLS_ERR_X509_BAD_INPUT_DATA == ret);
772*62c56f98SSadaf Ebrahimi}
773*62c56f98SSadaf Ebrahimi/* END_CASE */
774