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