blob: 6cb111830e68677eb331ef0b798ca03403a3e0f1 [file] [log] [blame]
Thomas Fossati656864b2016-07-17 08:51:22 +01001/* BEGIN_HEADER */
2#include "mbedtls/hkdf.h"
Chris Jonesdaacb592021-03-09 17:03:29 +00003#include "md_wrap.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' };
Thomas Fossati656864b2016-07-17 08:51:22 +010017
18 const mbedtls_md_info_t *md = mbedtls_md_info_from_type( md_alg );
19 TEST_ASSERT( md != NULL );
20
Ronald Cron9ed40732020-06-25 09:03:34 +020021 TEST_ASSERT( expected_okm->len <= sizeof( okm ) );
Ronald Cron40308332020-06-25 10:26:42 +020022
Ronald Cron9ed40732020-06-25 09:03:34 +020023 ret = mbedtls_hkdf( md, salt->x, salt->len, ikm->x, ikm->len,
24 info->x, info->len, okm, expected_okm->len );
Thomas Fossati656864b2016-07-17 08:51:22 +010025 TEST_ASSERT( ret == 0 );
26
Ronald Crond8902b62020-07-30 14:18:02 +020027 ASSERT_COMPARE( okm , expected_okm->len,
28 expected_okm->x, expected_okm->len );
Thomas Fossati656864b2016-07-17 08:51:22 +010029}
30/* END_CASE */
Jaeden Amero36189622018-05-23 18:55:47 +010031
32/* BEGIN_CASE */
33void test_hkdf_extract( int md_alg, char *hex_ikm_string,
34 char *hex_salt_string, char *hex_prk_string )
35{
36 int ret;
37 unsigned char *ikm = NULL;
38 unsigned char *salt = NULL;
39 unsigned char *prk = NULL;
40 unsigned char *output_prk = NULL;
41 size_t ikm_len, salt_len, prk_len, output_prk_len;
42
43 const mbedtls_md_info_t *md = mbedtls_md_info_from_type( md_alg );
44 TEST_ASSERT( md != NULL );
45
46 output_prk_len = mbedtls_md_get_size( md );
47 output_prk = mbedtls_calloc( 1, output_prk_len );
48
Ronald Crona256c702020-06-10 10:53:11 +020049 ikm = mbedtls_test_unhexify_alloc( hex_ikm_string, &ikm_len );
50 salt = mbedtls_test_unhexify_alloc( hex_salt_string, &salt_len );
51 prk = mbedtls_test_unhexify_alloc( hex_prk_string, &prk_len );
Jaeden Amero36189622018-05-23 18:55:47 +010052
53 ret = mbedtls_hkdf_extract( md, salt, salt_len, ikm, ikm_len, output_prk );
54 TEST_ASSERT( ret == 0 );
55
Ronald Crond8902b62020-07-30 14:18:02 +020056 ASSERT_COMPARE( output_prk, output_prk_len, prk, prk_len );
Jaeden Amero36189622018-05-23 18:55:47 +010057
58exit:
59 mbedtls_free(ikm);
60 mbedtls_free(salt);
61 mbedtls_free(prk);
62 mbedtls_free(output_prk);
63}
64/* END_CASE */
65
66/* BEGIN_CASE */
67void test_hkdf_expand( int md_alg, char *hex_info_string,
68 char *hex_prk_string, char *hex_okm_string )
69{
70 enum { OKM_LEN = 1024 };
71 int ret;
72 unsigned char *info = NULL;
73 unsigned char *prk = NULL;
74 unsigned char *okm = NULL;
75 unsigned char *output_okm = NULL;
76 size_t info_len, prk_len, okm_len;
77
78 const mbedtls_md_info_t *md = mbedtls_md_info_from_type( md_alg );
79 TEST_ASSERT( md != NULL );
80
81 output_okm = mbedtls_calloc( OKM_LEN, 1 );
82
Ronald Crona256c702020-06-10 10:53:11 +020083 prk = mbedtls_test_unhexify_alloc( hex_prk_string, &prk_len );
84 info = mbedtls_test_unhexify_alloc( hex_info_string, &info_len );
85 okm = mbedtls_test_unhexify_alloc( hex_okm_string, &okm_len );
Jaeden Amero36189622018-05-23 18:55:47 +010086 TEST_ASSERT( prk_len == mbedtls_md_get_size( md ) );
87 TEST_ASSERT( okm_len < OKM_LEN );
88
89 ret = mbedtls_hkdf_expand( md, prk, prk_len, info, info_len,
90 output_okm, OKM_LEN );
91 TEST_ASSERT( ret == 0 );
Ronald Crond8902b62020-07-30 14:18:02 +020092 ASSERT_COMPARE( output_okm, okm_len, okm, okm_len );
Jaeden Amero36189622018-05-23 18:55:47 +010093
94exit:
95 mbedtls_free(info);
96 mbedtls_free(prk);
97 mbedtls_free(okm);
98 mbedtls_free(output_okm);
99}
100/* END_CASE */
Jaeden Amero10e0e4d2018-05-23 19:44:26 +0100101
102/* BEGIN_CASE */
103void test_hkdf_extract_ret( int hash_len, int ret )
104{
105 int output_ret;
106 unsigned char *salt = NULL;
107 unsigned char *ikm = NULL;
108 unsigned char *prk = NULL;
109 size_t salt_len, ikm_len;
110 struct mbedtls_md_info_t fake_md_info;
111
112 memset( &fake_md_info, 0, sizeof( fake_md_info ) );
113 fake_md_info.type = MBEDTLS_MD_NONE;
114 fake_md_info.size = hash_len;
115
116 prk = mbedtls_calloc( MBEDTLS_MD_MAX_SIZE, 1 );
117 salt_len = 0;
118 ikm_len = 0;
119
120 output_ret = mbedtls_hkdf_extract( &fake_md_info, salt, salt_len,
121 ikm, ikm_len, prk );
122 TEST_ASSERT( output_ret == ret );
123
124exit:
125 mbedtls_free(prk);
126}
127/* END_CASE */
128
129/* BEGIN_CASE */
130void test_hkdf_expand_ret( int hash_len, int prk_len, int okm_len, int ret )
131{
132 int output_ret;
133 unsigned char *info = NULL;
134 unsigned char *prk = NULL;
135 unsigned char *okm = NULL;
136 size_t info_len;
137 struct mbedtls_md_info_t fake_md_info;
138
139 memset( &fake_md_info, 0, sizeof( fake_md_info ) );
140 fake_md_info.type = MBEDTLS_MD_NONE;
141 fake_md_info.size = hash_len;
142
143 info_len = 0;
144
145 if (prk_len > 0)
146 prk = mbedtls_calloc( prk_len, 1 );
147
148 if (okm_len > 0)
149 okm = mbedtls_calloc( okm_len, 1 );
150
151 output_ret = mbedtls_hkdf_expand( &fake_md_info, prk, prk_len,
152 info, info_len, okm, okm_len );
153 TEST_ASSERT( output_ret == ret );
154
155exit:
156 mbedtls_free(prk);
157 mbedtls_free(okm);
158}
159/* END_CASE */