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