blob: 967df3690daaf5ff8fd15f21e789f3f2225b6455 [file] [log] [blame]
Thomas Fossati656864b2016-07-17 08:51:22 +01001/* BEGIN_HEADER */
2#include "mbedtls/hkdf.h"
Jaeden Amero10e0e4d2018-05-23 19:44:26 +01003#include "mbedtls/md_internal.h"
Thomas Fossati656864b2016-07-17 08:51:22 +01004/* END_HEADER */
5
6/* BEGIN_DEPENDENCIES
7 * depends_on:MBEDTLS_HKDF_C
8 * END_DEPENDENCIES
9 */
10
11/* BEGIN_CASE */
Ronald Cron9ed40732020-06-25 09:03:34 +020012void test_hkdf( int md_alg, data_t *ikm, data_t *salt, data_t *info,
13 data_t *expected_okm )
Thomas Fossati656864b2016-07-17 08:51:22 +010014{
15 int ret;
Ron Eldorae3a6312018-11-14 20:22:03 +020016 unsigned char okm[128] = { '\0' };
Ron Eldor1a3a7e52019-01-28 15:01:53 +020017 /*
Ronald Cron9ed40732020-06-25 09:03:34 +020018 * okm_string and expected_okm_string are the ASCII string representations
19 * of km and expected_okm, so their size should be twice the size of
20 * okm and expected_okm, and an extra null-termination.
Ron Eldor1a3a7e52019-01-28 15:01:53 +020021 */
Ronald Cron40308332020-06-25 10:26:42 +020022 unsigned char okm_string[257] = { '\0' };
Ronald Cron9ed40732020-06-25 09:03:34 +020023 unsigned char expected_okm_string[257] = { '\0' };
Thomas Fossati656864b2016-07-17 08:51:22 +010024
25 const mbedtls_md_info_t *md = mbedtls_md_info_from_type( md_alg );
26 TEST_ASSERT( md != NULL );
27
Ronald Cron9ed40732020-06-25 09:03:34 +020028 TEST_ASSERT( expected_okm->len <= sizeof( okm ) );
Ronald Cron40308332020-06-25 10:26:42 +020029
Ronald Cron9ed40732020-06-25 09:03:34 +020030 ret = mbedtls_hkdf( md, salt->x, salt->len, ikm->x, ikm->len,
31 info->x, info->len, okm, expected_okm->len );
Thomas Fossati656864b2016-07-17 08:51:22 +010032 TEST_ASSERT( ret == 0 );
33
Ronald Cronff31eab2020-06-08 17:20:59 +020034 /*
Ronald Cron9ed40732020-06-25 09:03:34 +020035 * Run mbedtls_test_hexify on okm and expected_okm so that it looks nicer
36 * if the assertion fails.
Ronald Cronff31eab2020-06-08 17:20:59 +020037 */
Ronald Cron9ed40732020-06-25 09:03:34 +020038 mbedtls_test_hexify( okm_string, okm, expected_okm->len );
39 mbedtls_test_hexify( expected_okm_string,
40 expected_okm->x, expected_okm->len );
41 TEST_ASSERT( !strcmp( (char *)okm_string, (char *)expected_okm_string ) );
Thomas Fossati656864b2016-07-17 08:51:22 +010042}
43/* END_CASE */
Jaeden Amero36189622018-05-23 18:55:47 +010044
45/* BEGIN_CASE */
46void test_hkdf_extract( int md_alg, char *hex_ikm_string,
47 char *hex_salt_string, char *hex_prk_string )
48{
49 int ret;
50 unsigned char *ikm = NULL;
51 unsigned char *salt = NULL;
52 unsigned char *prk = NULL;
53 unsigned char *output_prk = NULL;
54 size_t ikm_len, salt_len, prk_len, output_prk_len;
55
56 const mbedtls_md_info_t *md = mbedtls_md_info_from_type( md_alg );
57 TEST_ASSERT( md != NULL );
58
59 output_prk_len = mbedtls_md_get_size( md );
60 output_prk = mbedtls_calloc( 1, output_prk_len );
61
Ronald Crona256c702020-06-10 10:53:11 +020062 ikm = mbedtls_test_unhexify_alloc( hex_ikm_string, &ikm_len );
63 salt = mbedtls_test_unhexify_alloc( hex_salt_string, &salt_len );
64 prk = mbedtls_test_unhexify_alloc( hex_prk_string, &prk_len );
Jaeden Amero36189622018-05-23 18:55:47 +010065 TEST_ASSERT( prk_len == output_prk_len );
66
67 ret = mbedtls_hkdf_extract( md, salt, salt_len, ikm, ikm_len, output_prk );
68 TEST_ASSERT( ret == 0 );
69
70 TEST_ASSERT( !memcmp( output_prk, prk, prk_len ) );
71
72exit:
73 mbedtls_free(ikm);
74 mbedtls_free(salt);
75 mbedtls_free(prk);
76 mbedtls_free(output_prk);
77}
78/* END_CASE */
79
80/* BEGIN_CASE */
81void test_hkdf_expand( int md_alg, char *hex_info_string,
82 char *hex_prk_string, char *hex_okm_string )
83{
84 enum { OKM_LEN = 1024 };
85 int ret;
86 unsigned char *info = NULL;
87 unsigned char *prk = NULL;
88 unsigned char *okm = NULL;
89 unsigned char *output_okm = NULL;
90 size_t info_len, prk_len, okm_len;
91
92 const mbedtls_md_info_t *md = mbedtls_md_info_from_type( md_alg );
93 TEST_ASSERT( md != NULL );
94
95 output_okm = mbedtls_calloc( OKM_LEN, 1 );
96
Ronald Crona256c702020-06-10 10:53:11 +020097 prk = mbedtls_test_unhexify_alloc( hex_prk_string, &prk_len );
98 info = mbedtls_test_unhexify_alloc( hex_info_string, &info_len );
99 okm = mbedtls_test_unhexify_alloc( hex_okm_string, &okm_len );
Jaeden Amero36189622018-05-23 18:55:47 +0100100 TEST_ASSERT( prk_len == mbedtls_md_get_size( md ) );
101 TEST_ASSERT( okm_len < OKM_LEN );
102
103 ret = mbedtls_hkdf_expand( md, prk, prk_len, info, info_len,
104 output_okm, OKM_LEN );
105 TEST_ASSERT( ret == 0 );
106 TEST_ASSERT( !memcmp( output_okm, okm, okm_len ) );
107
108exit:
109 mbedtls_free(info);
110 mbedtls_free(prk);
111 mbedtls_free(okm);
112 mbedtls_free(output_okm);
113}
114/* END_CASE */
Jaeden Amero10e0e4d2018-05-23 19:44:26 +0100115
116/* BEGIN_CASE */
117void test_hkdf_extract_ret( int hash_len, int ret )
118{
119 int output_ret;
120 unsigned char *salt = NULL;
121 unsigned char *ikm = NULL;
122 unsigned char *prk = NULL;
123 size_t salt_len, ikm_len;
124 struct mbedtls_md_info_t fake_md_info;
125
126 memset( &fake_md_info, 0, sizeof( fake_md_info ) );
127 fake_md_info.type = MBEDTLS_MD_NONE;
128 fake_md_info.size = hash_len;
129
130 prk = mbedtls_calloc( MBEDTLS_MD_MAX_SIZE, 1 );
131 salt_len = 0;
132 ikm_len = 0;
133
134 output_ret = mbedtls_hkdf_extract( &fake_md_info, salt, salt_len,
135 ikm, ikm_len, prk );
136 TEST_ASSERT( output_ret == ret );
137
138exit:
139 mbedtls_free(prk);
140}
141/* END_CASE */
142
143/* BEGIN_CASE */
144void test_hkdf_expand_ret( int hash_len, int prk_len, int okm_len, int ret )
145{
146 int output_ret;
147 unsigned char *info = NULL;
148 unsigned char *prk = NULL;
149 unsigned char *okm = NULL;
150 size_t info_len;
151 struct mbedtls_md_info_t fake_md_info;
152
153 memset( &fake_md_info, 0, sizeof( fake_md_info ) );
154 fake_md_info.type = MBEDTLS_MD_NONE;
155 fake_md_info.size = hash_len;
156
157 info_len = 0;
158
159 if (prk_len > 0)
160 prk = mbedtls_calloc( prk_len, 1 );
161
162 if (okm_len > 0)
163 okm = mbedtls_calloc( okm_len, 1 );
164
165 output_ret = mbedtls_hkdf_expand( &fake_md_info, prk, prk_len,
166 info, info_len, okm, okm_len );
167 TEST_ASSERT( output_ret == ret );
168
169exit:
170 mbedtls_free(prk);
171 mbedtls_free(okm);
172}
173/* END_CASE */