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