/* BEGIN_HEADER */ #include "mbedtls/hkdf.h" #include "md_wrap.h" /* END_HEADER */ /* BEGIN_DEPENDENCIES * depends_on:MBEDTLS_HKDF_C * END_DEPENDENCIES */ /* BEGIN_CASE */ void test_hkdf(int md_alg, data_t *ikm, data_t *salt, data_t *info, data_t *expected_okm) { int ret; unsigned char okm[128] = { '\0' }; const mbedtls_md_info_t *md = mbedtls_md_info_from_type(md_alg); TEST_ASSERT(md != NULL); TEST_ASSERT(expected_okm->len <= sizeof(okm)); ret = mbedtls_hkdf(md, salt->x, salt->len, ikm->x, ikm->len, info->x, info->len, okm, expected_okm->len); TEST_ASSERT(ret == 0); ASSERT_COMPARE(okm, expected_okm->len, expected_okm->x, expected_okm->len); } /* END_CASE */ /* BEGIN_CASE */ void test_hkdf_extract(int md_alg, data_t *ikm, data_t *salt, data_t *prk) { int ret; unsigned char *output_prk = NULL; size_t output_prk_len; const mbedtls_md_info_t *md = mbedtls_md_info_from_type(md_alg); TEST_ASSERT(md != NULL); output_prk_len = mbedtls_md_get_size(md); ASSERT_ALLOC(output_prk, output_prk_len); ret = mbedtls_hkdf_extract(md, salt->x, salt->len, ikm->x, ikm->len, output_prk); TEST_ASSERT(ret == 0); ASSERT_COMPARE(output_prk, output_prk_len, prk->x, prk->len); exit: mbedtls_free(output_prk); } /* END_CASE */ /* BEGIN_CASE */ void test_hkdf_expand(int md_alg, data_t *info, data_t *prk, data_t *okm) { enum { OKM_LEN = 1024 }; int ret; unsigned char *output_okm = NULL; const mbedtls_md_info_t *md = mbedtls_md_info_from_type(md_alg); TEST_ASSERT(md != NULL); ASSERT_ALLOC(output_okm, OKM_LEN); TEST_ASSERT(prk->len == mbedtls_md_get_size(md)); TEST_ASSERT(okm->len < OKM_LEN); ret = mbedtls_hkdf_expand(md, prk->x, prk->len, info->x, info->len, output_okm, OKM_LEN); TEST_ASSERT(ret == 0); ASSERT_COMPARE(output_okm, okm->len, okm->x, okm->len); exit: mbedtls_free(output_okm); } /* END_CASE */ /* BEGIN_CASE */ void test_hkdf_extract_ret(int hash_len, int ret) { int output_ret; unsigned char *salt = NULL; unsigned char *ikm = NULL; unsigned char *prk = NULL; size_t salt_len, ikm_len; struct mbedtls_md_info_t fake_md_info; memset(&fake_md_info, 0, sizeof(fake_md_info)); fake_md_info.type = MBEDTLS_MD_NONE; fake_md_info.size = hash_len; ASSERT_ALLOC(prk, MBEDTLS_MD_MAX_SIZE); salt_len = 0; ikm_len = 0; output_ret = mbedtls_hkdf_extract(&fake_md_info, salt, salt_len, ikm, ikm_len, prk); TEST_ASSERT(output_ret == ret); exit: mbedtls_free(prk); } /* END_CASE */ /* BEGIN_CASE */ void test_hkdf_expand_ret(int hash_len, int prk_len, int okm_len, int ret) { int output_ret; unsigned char *info = NULL; unsigned char *prk = NULL; unsigned char *okm = NULL; size_t info_len; struct mbedtls_md_info_t fake_md_info; memset(&fake_md_info, 0, sizeof(fake_md_info)); fake_md_info.type = MBEDTLS_MD_NONE; fake_md_info.size = hash_len; info_len = 0; if (prk_len > 0) { ASSERT_ALLOC(prk, prk_len); } if (okm_len > 0) { ASSERT_ALLOC(okm, okm_len); } output_ret = mbedtls_hkdf_expand(&fake_md_info, prk, prk_len, info, info_len, okm, okm_len); TEST_ASSERT(output_ret == ret); exit: mbedtls_free(prk); mbedtls_free(okm); } /* END_CASE */