1*62c56f98SSadaf Ebrahimi/* BEGIN_HEADER */ 2*62c56f98SSadaf Ebrahimi#include "mbedtls/pkcs12.h" 3*62c56f98SSadaf Ebrahimi#include "common.h" 4*62c56f98SSadaf Ebrahimi 5*62c56f98SSadaf Ebrahimitypedef enum { 6*62c56f98SSadaf Ebrahimi USE_NULL_INPUT = 0, 7*62c56f98SSadaf Ebrahimi USE_GIVEN_INPUT = 1, 8*62c56f98SSadaf Ebrahimi} input_usage_method_t; 9*62c56f98SSadaf Ebrahimi 10*62c56f98SSadaf Ebrahimi/* END_HEADER */ 11*62c56f98SSadaf Ebrahimi 12*62c56f98SSadaf Ebrahimi/* BEGIN_DEPENDENCIES 13*62c56f98SSadaf Ebrahimi * depends_on:MBEDTLS_PKCS12_C 14*62c56f98SSadaf Ebrahimi * END_DEPENDENCIES 15*62c56f98SSadaf Ebrahimi */ 16*62c56f98SSadaf Ebrahimi 17*62c56f98SSadaf Ebrahimi/* BEGIN_CASE */ 18*62c56f98SSadaf Ebrahimivoid pkcs12_derive_key(int md_type, int key_size_arg, 19*62c56f98SSadaf Ebrahimi data_t *password_arg, int password_usage, 20*62c56f98SSadaf Ebrahimi data_t *salt_arg, int salt_usage, 21*62c56f98SSadaf Ebrahimi int iterations, 22*62c56f98SSadaf Ebrahimi data_t *expected_output, int expected_status) 23*62c56f98SSadaf Ebrahimi 24*62c56f98SSadaf Ebrahimi{ 25*62c56f98SSadaf Ebrahimi unsigned char *output_data = NULL; 26*62c56f98SSadaf Ebrahimi 27*62c56f98SSadaf Ebrahimi unsigned char *password = NULL; 28*62c56f98SSadaf Ebrahimi size_t password_len = 0; 29*62c56f98SSadaf Ebrahimi unsigned char *salt = NULL; 30*62c56f98SSadaf Ebrahimi size_t salt_len = 0; 31*62c56f98SSadaf Ebrahimi size_t key_size = key_size_arg; 32*62c56f98SSadaf Ebrahimi 33*62c56f98SSadaf Ebrahimi MD_PSA_INIT(); 34*62c56f98SSadaf Ebrahimi 35*62c56f98SSadaf Ebrahimi if (password_usage == USE_GIVEN_INPUT) { 36*62c56f98SSadaf Ebrahimi password = password_arg->x; 37*62c56f98SSadaf Ebrahimi } 38*62c56f98SSadaf Ebrahimi 39*62c56f98SSadaf Ebrahimi password_len = password_arg->len; 40*62c56f98SSadaf Ebrahimi 41*62c56f98SSadaf Ebrahimi if (salt_usage == USE_GIVEN_INPUT) { 42*62c56f98SSadaf Ebrahimi salt = salt_arg->x; 43*62c56f98SSadaf Ebrahimi } 44*62c56f98SSadaf Ebrahimi 45*62c56f98SSadaf Ebrahimi salt_len = salt_arg->len; 46*62c56f98SSadaf Ebrahimi 47*62c56f98SSadaf Ebrahimi TEST_CALLOC(output_data, key_size); 48*62c56f98SSadaf Ebrahimi 49*62c56f98SSadaf Ebrahimi int ret = mbedtls_pkcs12_derivation(output_data, 50*62c56f98SSadaf Ebrahimi key_size, 51*62c56f98SSadaf Ebrahimi password, 52*62c56f98SSadaf Ebrahimi password_len, 53*62c56f98SSadaf Ebrahimi salt, 54*62c56f98SSadaf Ebrahimi salt_len, 55*62c56f98SSadaf Ebrahimi md_type, 56*62c56f98SSadaf Ebrahimi MBEDTLS_PKCS12_DERIVE_KEY, 57*62c56f98SSadaf Ebrahimi iterations); 58*62c56f98SSadaf Ebrahimi 59*62c56f98SSadaf Ebrahimi TEST_EQUAL(ret, expected_status); 60*62c56f98SSadaf Ebrahimi 61*62c56f98SSadaf Ebrahimi if (expected_status == 0) { 62*62c56f98SSadaf Ebrahimi TEST_MEMORY_COMPARE(expected_output->x, expected_output->len, 63*62c56f98SSadaf Ebrahimi output_data, key_size); 64*62c56f98SSadaf Ebrahimi } 65*62c56f98SSadaf Ebrahimi 66*62c56f98SSadaf Ebrahimiexit: 67*62c56f98SSadaf Ebrahimi mbedtls_free(output_data); 68*62c56f98SSadaf Ebrahimi MD_PSA_DONE(); 69*62c56f98SSadaf Ebrahimi} 70*62c56f98SSadaf Ebrahimi/* END_CASE */ 71*62c56f98SSadaf Ebrahimi 72*62c56f98SSadaf Ebrahimi/* BEGIN_CASE depends_on:MBEDTLS_ASN1_PARSE_C */ 73*62c56f98SSadaf Ebrahimivoid pkcs12_pbe_encrypt(int params_tag, int cipher, int md, data_t *params_hex, data_t *pw, 74*62c56f98SSadaf Ebrahimi data_t *data, int outsize, int ref_ret, data_t *ref_out) 75*62c56f98SSadaf Ebrahimi{ 76*62c56f98SSadaf Ebrahimi int my_ret; 77*62c56f98SSadaf Ebrahimi mbedtls_asn1_buf pbe_params; 78*62c56f98SSadaf Ebrahimi unsigned char *my_out = NULL; 79*62c56f98SSadaf Ebrahimi mbedtls_cipher_type_t cipher_alg = (mbedtls_cipher_type_t) cipher; 80*62c56f98SSadaf Ebrahimi mbedtls_md_type_t md_alg = (mbedtls_md_type_t) md; 81*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_CIPHER_PADDING_PKCS7) 82*62c56f98SSadaf Ebrahimi size_t my_out_len = 0; 83*62c56f98SSadaf Ebrahimi#endif 84*62c56f98SSadaf Ebrahimi 85*62c56f98SSadaf Ebrahimi MD_PSA_INIT(); 86*62c56f98SSadaf Ebrahimi 87*62c56f98SSadaf Ebrahimi TEST_CALLOC(my_out, outsize); 88*62c56f98SSadaf Ebrahimi 89*62c56f98SSadaf Ebrahimi pbe_params.tag = params_tag; 90*62c56f98SSadaf Ebrahimi pbe_params.len = params_hex->len; 91*62c56f98SSadaf Ebrahimi pbe_params.p = params_hex->x; 92*62c56f98SSadaf Ebrahimi 93*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_TEST_DEPRECATED) 94*62c56f98SSadaf Ebrahimi if (ref_ret != MBEDTLS_ERR_ASN1_BUF_TOO_SMALL) { 95*62c56f98SSadaf Ebrahimi my_ret = mbedtls_pkcs12_pbe(&pbe_params, MBEDTLS_PKCS12_PBE_ENCRYPT, cipher_alg, 96*62c56f98SSadaf Ebrahimi md_alg, pw->x, pw->len, data->x, data->len, my_out); 97*62c56f98SSadaf Ebrahimi TEST_EQUAL(my_ret, ref_ret); 98*62c56f98SSadaf Ebrahimi } 99*62c56f98SSadaf Ebrahimi if (ref_ret == 0) { 100*62c56f98SSadaf Ebrahimi ASSERT_COMPARE(my_out, ref_out->len, 101*62c56f98SSadaf Ebrahimi ref_out->x, ref_out->len); 102*62c56f98SSadaf Ebrahimi } 103*62c56f98SSadaf Ebrahimi#endif 104*62c56f98SSadaf Ebrahimi 105*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_CIPHER_PADDING_PKCS7) 106*62c56f98SSadaf Ebrahimi 107*62c56f98SSadaf Ebrahimi pbe_params.tag = params_tag; 108*62c56f98SSadaf Ebrahimi pbe_params.len = params_hex->len; 109*62c56f98SSadaf Ebrahimi pbe_params.p = params_hex->x; 110*62c56f98SSadaf Ebrahimi 111*62c56f98SSadaf Ebrahimi my_ret = mbedtls_pkcs12_pbe_ext(&pbe_params, MBEDTLS_PKCS12_PBE_ENCRYPT, cipher_alg, 112*62c56f98SSadaf Ebrahimi md_alg, pw->x, pw->len, data->x, data->len, my_out, 113*62c56f98SSadaf Ebrahimi outsize, &my_out_len); 114*62c56f98SSadaf Ebrahimi TEST_EQUAL(my_ret, ref_ret); 115*62c56f98SSadaf Ebrahimi if (ref_ret == 0) { 116*62c56f98SSadaf Ebrahimi ASSERT_COMPARE(my_out, my_out_len, 117*62c56f98SSadaf Ebrahimi ref_out->x, ref_out->len); 118*62c56f98SSadaf Ebrahimi } 119*62c56f98SSadaf Ebrahimi#endif 120*62c56f98SSadaf Ebrahimi 121*62c56f98SSadaf Ebrahimiexit: 122*62c56f98SSadaf Ebrahimi mbedtls_free(my_out); 123*62c56f98SSadaf Ebrahimi MD_PSA_DONE(); 124*62c56f98SSadaf Ebrahimi} 125*62c56f98SSadaf Ebrahimi/* END_CASE */ 126*62c56f98SSadaf Ebrahimi 127*62c56f98SSadaf Ebrahimi/* BEGIN_CASE depends_on:MBEDTLS_ASN1_PARSE_C */ 128*62c56f98SSadaf Ebrahimivoid pkcs12_pbe_decrypt(int params_tag, int cipher, int md, data_t *params_hex, data_t *pw, 129*62c56f98SSadaf Ebrahimi data_t *data, int outsize, int ref_ret, data_t *ref_out) 130*62c56f98SSadaf Ebrahimi{ 131*62c56f98SSadaf Ebrahimi int my_ret; 132*62c56f98SSadaf Ebrahimi mbedtls_asn1_buf pbe_params; 133*62c56f98SSadaf Ebrahimi unsigned char *my_out = NULL; 134*62c56f98SSadaf Ebrahimi mbedtls_cipher_type_t cipher_alg = (mbedtls_cipher_type_t) cipher; 135*62c56f98SSadaf Ebrahimi mbedtls_md_type_t md_alg = (mbedtls_md_type_t) md; 136*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_CIPHER_PADDING_PKCS7) 137*62c56f98SSadaf Ebrahimi size_t my_out_len = 0; 138*62c56f98SSadaf Ebrahimi#endif 139*62c56f98SSadaf Ebrahimi 140*62c56f98SSadaf Ebrahimi MD_PSA_INIT(); 141*62c56f98SSadaf Ebrahimi 142*62c56f98SSadaf Ebrahimi TEST_CALLOC(my_out, outsize); 143*62c56f98SSadaf Ebrahimi 144*62c56f98SSadaf Ebrahimi pbe_params.tag = params_tag; 145*62c56f98SSadaf Ebrahimi pbe_params.len = params_hex->len; 146*62c56f98SSadaf Ebrahimi pbe_params.p = params_hex->x; 147*62c56f98SSadaf Ebrahimi 148*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_TEST_DEPRECATED) 149*62c56f98SSadaf Ebrahimi if (ref_ret != MBEDTLS_ERR_ASN1_BUF_TOO_SMALL) { 150*62c56f98SSadaf Ebrahimi my_ret = mbedtls_pkcs12_pbe(&pbe_params, MBEDTLS_PKCS12_PBE_DECRYPT, cipher_alg, 151*62c56f98SSadaf Ebrahimi md_alg, pw->x, pw->len, data->x, data->len, my_out); 152*62c56f98SSadaf Ebrahimi TEST_EQUAL(my_ret, ref_ret); 153*62c56f98SSadaf Ebrahimi } 154*62c56f98SSadaf Ebrahimi 155*62c56f98SSadaf Ebrahimi if (ref_ret == 0) { 156*62c56f98SSadaf Ebrahimi ASSERT_COMPARE(my_out, ref_out->len, 157*62c56f98SSadaf Ebrahimi ref_out->x, ref_out->len); 158*62c56f98SSadaf Ebrahimi } 159*62c56f98SSadaf Ebrahimi#endif 160*62c56f98SSadaf Ebrahimi 161*62c56f98SSadaf Ebrahimi#if defined(MBEDTLS_CIPHER_PADDING_PKCS7) 162*62c56f98SSadaf Ebrahimi 163*62c56f98SSadaf Ebrahimi pbe_params.tag = params_tag; 164*62c56f98SSadaf Ebrahimi pbe_params.len = params_hex->len; 165*62c56f98SSadaf Ebrahimi pbe_params.p = params_hex->x; 166*62c56f98SSadaf Ebrahimi 167*62c56f98SSadaf Ebrahimi my_ret = mbedtls_pkcs12_pbe_ext(&pbe_params, MBEDTLS_PKCS12_PBE_DECRYPT, cipher_alg, 168*62c56f98SSadaf Ebrahimi md_alg, pw->x, pw->len, data->x, data->len, my_out, 169*62c56f98SSadaf Ebrahimi outsize, &my_out_len); 170*62c56f98SSadaf Ebrahimi TEST_EQUAL(my_ret, ref_ret); 171*62c56f98SSadaf Ebrahimi if (ref_ret == 0) { 172*62c56f98SSadaf Ebrahimi ASSERT_COMPARE(my_out, my_out_len, 173*62c56f98SSadaf Ebrahimi ref_out->x, ref_out->len); 174*62c56f98SSadaf Ebrahimi } 175*62c56f98SSadaf Ebrahimi#endif 176*62c56f98SSadaf Ebrahimi 177*62c56f98SSadaf Ebrahimiexit: 178*62c56f98SSadaf Ebrahimi mbedtls_free(my_out); 179*62c56f98SSadaf Ebrahimi MD_PSA_DONE(); 180*62c56f98SSadaf Ebrahimi} 181*62c56f98SSadaf Ebrahimi/* END_CASE */ 182