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