1a8e1175bSopenharmony_ci/* BEGIN_HEADER */ 2a8e1175bSopenharmony_ci#include "mbedtls/hkdf.h" 3a8e1175bSopenharmony_ci#include "md_wrap.h" 4a8e1175bSopenharmony_ci/* END_HEADER */ 5a8e1175bSopenharmony_ci 6a8e1175bSopenharmony_ci/* BEGIN_DEPENDENCIES 7a8e1175bSopenharmony_ci * depends_on:MBEDTLS_HKDF_C 8a8e1175bSopenharmony_ci * END_DEPENDENCIES 9a8e1175bSopenharmony_ci */ 10a8e1175bSopenharmony_ci 11a8e1175bSopenharmony_ci/* BEGIN_CASE */ 12a8e1175bSopenharmony_civoid test_hkdf(int md_alg, data_t *ikm, data_t *salt, data_t *info, 13a8e1175bSopenharmony_ci data_t *expected_okm) 14a8e1175bSopenharmony_ci{ 15a8e1175bSopenharmony_ci int ret; 16a8e1175bSopenharmony_ci unsigned char okm[128] = { '\0' }; 17a8e1175bSopenharmony_ci 18a8e1175bSopenharmony_ci MD_PSA_INIT(); 19a8e1175bSopenharmony_ci 20a8e1175bSopenharmony_ci const mbedtls_md_info_t *md = mbedtls_md_info_from_type(md_alg); 21a8e1175bSopenharmony_ci TEST_ASSERT(md != NULL); 22a8e1175bSopenharmony_ci 23a8e1175bSopenharmony_ci TEST_ASSERT(expected_okm->len <= sizeof(okm)); 24a8e1175bSopenharmony_ci 25a8e1175bSopenharmony_ci ret = mbedtls_hkdf(md, salt->x, salt->len, ikm->x, ikm->len, 26a8e1175bSopenharmony_ci info->x, info->len, okm, expected_okm->len); 27a8e1175bSopenharmony_ci TEST_ASSERT(ret == 0); 28a8e1175bSopenharmony_ci 29a8e1175bSopenharmony_ci TEST_MEMORY_COMPARE(okm, expected_okm->len, 30a8e1175bSopenharmony_ci expected_okm->x, expected_okm->len); 31a8e1175bSopenharmony_ci 32a8e1175bSopenharmony_ciexit: 33a8e1175bSopenharmony_ci MD_PSA_DONE(); 34a8e1175bSopenharmony_ci} 35a8e1175bSopenharmony_ci/* END_CASE */ 36a8e1175bSopenharmony_ci 37a8e1175bSopenharmony_ci/* BEGIN_CASE */ 38a8e1175bSopenharmony_civoid test_hkdf_extract(int md_alg, 39a8e1175bSopenharmony_ci data_t *ikm, 40a8e1175bSopenharmony_ci data_t *salt, 41a8e1175bSopenharmony_ci data_t *prk) 42a8e1175bSopenharmony_ci{ 43a8e1175bSopenharmony_ci int ret; 44a8e1175bSopenharmony_ci unsigned char *output_prk = NULL; 45a8e1175bSopenharmony_ci size_t output_prk_len; 46a8e1175bSopenharmony_ci 47a8e1175bSopenharmony_ci MD_PSA_INIT(); 48a8e1175bSopenharmony_ci 49a8e1175bSopenharmony_ci const mbedtls_md_info_t *md = mbedtls_md_info_from_type(md_alg); 50a8e1175bSopenharmony_ci TEST_ASSERT(md != NULL); 51a8e1175bSopenharmony_ci 52a8e1175bSopenharmony_ci output_prk_len = mbedtls_md_get_size(md); 53a8e1175bSopenharmony_ci TEST_CALLOC(output_prk, output_prk_len); 54a8e1175bSopenharmony_ci 55a8e1175bSopenharmony_ci ret = mbedtls_hkdf_extract(md, salt->x, salt->len, 56a8e1175bSopenharmony_ci ikm->x, ikm->len, output_prk); 57a8e1175bSopenharmony_ci TEST_ASSERT(ret == 0); 58a8e1175bSopenharmony_ci 59a8e1175bSopenharmony_ci TEST_MEMORY_COMPARE(output_prk, output_prk_len, prk->x, prk->len); 60a8e1175bSopenharmony_ci 61a8e1175bSopenharmony_ciexit: 62a8e1175bSopenharmony_ci mbedtls_free(output_prk); 63a8e1175bSopenharmony_ci MD_PSA_DONE(); 64a8e1175bSopenharmony_ci} 65a8e1175bSopenharmony_ci/* END_CASE */ 66a8e1175bSopenharmony_ci 67a8e1175bSopenharmony_ci/* BEGIN_CASE */ 68a8e1175bSopenharmony_civoid test_hkdf_expand(int md_alg, 69a8e1175bSopenharmony_ci data_t *info, 70a8e1175bSopenharmony_ci data_t *prk, 71a8e1175bSopenharmony_ci data_t *okm) 72a8e1175bSopenharmony_ci{ 73a8e1175bSopenharmony_ci enum { OKM_LEN = 1024 }; 74a8e1175bSopenharmony_ci int ret; 75a8e1175bSopenharmony_ci unsigned char *output_okm = NULL; 76a8e1175bSopenharmony_ci 77a8e1175bSopenharmony_ci MD_PSA_INIT(); 78a8e1175bSopenharmony_ci 79a8e1175bSopenharmony_ci const mbedtls_md_info_t *md = mbedtls_md_info_from_type(md_alg); 80a8e1175bSopenharmony_ci TEST_ASSERT(md != NULL); 81a8e1175bSopenharmony_ci 82a8e1175bSopenharmony_ci TEST_CALLOC(output_okm, OKM_LEN); 83a8e1175bSopenharmony_ci 84a8e1175bSopenharmony_ci TEST_ASSERT(prk->len == mbedtls_md_get_size(md)); 85a8e1175bSopenharmony_ci TEST_ASSERT(okm->len < OKM_LEN); 86a8e1175bSopenharmony_ci 87a8e1175bSopenharmony_ci ret = mbedtls_hkdf_expand(md, prk->x, prk->len, 88a8e1175bSopenharmony_ci info->x, info->len, 89a8e1175bSopenharmony_ci output_okm, OKM_LEN); 90a8e1175bSopenharmony_ci TEST_ASSERT(ret == 0); 91a8e1175bSopenharmony_ci TEST_MEMORY_COMPARE(output_okm, okm->len, okm->x, okm->len); 92a8e1175bSopenharmony_ci 93a8e1175bSopenharmony_ciexit: 94a8e1175bSopenharmony_ci mbedtls_free(output_okm); 95a8e1175bSopenharmony_ci MD_PSA_DONE(); 96a8e1175bSopenharmony_ci} 97a8e1175bSopenharmony_ci/* END_CASE */ 98a8e1175bSopenharmony_ci 99a8e1175bSopenharmony_ci/* BEGIN_CASE */ 100a8e1175bSopenharmony_civoid test_hkdf_extract_ret(int hash_len, int ret) 101a8e1175bSopenharmony_ci{ 102a8e1175bSopenharmony_ci int output_ret; 103a8e1175bSopenharmony_ci unsigned char *salt = NULL; 104a8e1175bSopenharmony_ci unsigned char *ikm = NULL; 105a8e1175bSopenharmony_ci unsigned char *prk = NULL; 106a8e1175bSopenharmony_ci size_t salt_len, ikm_len; 107a8e1175bSopenharmony_ci struct mbedtls_md_info_t fake_md_info; 108a8e1175bSopenharmony_ci 109a8e1175bSopenharmony_ci memset(&fake_md_info, 0, sizeof(fake_md_info)); 110a8e1175bSopenharmony_ci fake_md_info.type = MBEDTLS_MD_NONE; 111a8e1175bSopenharmony_ci fake_md_info.size = hash_len; 112a8e1175bSopenharmony_ci 113a8e1175bSopenharmony_ci TEST_CALLOC(prk, MBEDTLS_MD_MAX_SIZE); 114a8e1175bSopenharmony_ci salt_len = 0; 115a8e1175bSopenharmony_ci ikm_len = 0; 116a8e1175bSopenharmony_ci 117a8e1175bSopenharmony_ci output_ret = mbedtls_hkdf_extract(&fake_md_info, salt, salt_len, 118a8e1175bSopenharmony_ci ikm, ikm_len, prk); 119a8e1175bSopenharmony_ci TEST_ASSERT(output_ret == ret); 120a8e1175bSopenharmony_ci 121a8e1175bSopenharmony_ciexit: 122a8e1175bSopenharmony_ci mbedtls_free(prk); 123a8e1175bSopenharmony_ci} 124a8e1175bSopenharmony_ci/* END_CASE */ 125a8e1175bSopenharmony_ci 126a8e1175bSopenharmony_ci/* BEGIN_CASE */ 127a8e1175bSopenharmony_civoid test_hkdf_expand_ret(int hash_len, int prk_len, int okm_len, int ret) 128a8e1175bSopenharmony_ci{ 129a8e1175bSopenharmony_ci int output_ret; 130a8e1175bSopenharmony_ci unsigned char *info = NULL; 131a8e1175bSopenharmony_ci unsigned char *prk = NULL; 132a8e1175bSopenharmony_ci unsigned char *okm = NULL; 133a8e1175bSopenharmony_ci size_t info_len; 134a8e1175bSopenharmony_ci struct mbedtls_md_info_t fake_md_info; 135a8e1175bSopenharmony_ci 136a8e1175bSopenharmony_ci memset(&fake_md_info, 0, sizeof(fake_md_info)); 137a8e1175bSopenharmony_ci fake_md_info.type = MBEDTLS_MD_NONE; 138a8e1175bSopenharmony_ci fake_md_info.size = hash_len; 139a8e1175bSopenharmony_ci 140a8e1175bSopenharmony_ci info_len = 0; 141a8e1175bSopenharmony_ci 142a8e1175bSopenharmony_ci if (prk_len > 0) { 143a8e1175bSopenharmony_ci TEST_CALLOC(prk, prk_len); 144a8e1175bSopenharmony_ci } 145a8e1175bSopenharmony_ci 146a8e1175bSopenharmony_ci if (okm_len > 0) { 147a8e1175bSopenharmony_ci TEST_CALLOC(okm, okm_len); 148a8e1175bSopenharmony_ci } 149a8e1175bSopenharmony_ci 150a8e1175bSopenharmony_ci output_ret = mbedtls_hkdf_expand(&fake_md_info, prk, prk_len, 151a8e1175bSopenharmony_ci info, info_len, okm, okm_len); 152a8e1175bSopenharmony_ci TEST_ASSERT(output_ret == ret); 153a8e1175bSopenharmony_ci 154a8e1175bSopenharmony_ciexit: 155a8e1175bSopenharmony_ci mbedtls_free(prk); 156a8e1175bSopenharmony_ci mbedtls_free(okm); 157a8e1175bSopenharmony_ci} 158a8e1175bSopenharmony_ci/* END_CASE */ 159