blob: 77f0d5d54d1973ed304dab55a614a65525de70fd [file] [log] [blame]
Thomas Fossati656864b2016-07-17 08:51:22 +01001/* BEGIN_HEADER */
2#include "mbedtls/hkdf.h"
3/* END_HEADER */
4
5/* BEGIN_DEPENDENCIES
6 * depends_on:MBEDTLS_HKDF_C
7 * END_DEPENDENCIES
8 */
9
10/* BEGIN_CASE */
11void test_hkdf( int md_alg, char *hex_ikm_string, char *hex_salt_string,
12 char *hex_info_string, char *hex_okm_string )
13{
14 int ret;
15 size_t ikm_len, salt_len, info_len, okm_len;
Ron Eldor45154eb2018-11-13 18:59:17 +020016 unsigned char ikm[128] = { '\0' };
17 unsigned char salt[128] = { '\0' };
18 unsigned char info[128] = { '\0' };
Ron Eldord9ad0842018-11-14 20:22:03 +020019 unsigned char expected_okm[128] = { '\0' };
20 unsigned char okm[128] = { '\0' };
Ron Eldor6fce8162019-01-28 15:01:53 +020021 /*
Ron Eldor57c2a302019-01-28 15:07:55 +020022 * okm_hex is the string representation of okm,
Ron Eldorda04b3b2019-01-28 15:18:15 +020023 * so its size is twice the size of okm, and an extra null-termination.
Ron Eldor6fce8162019-01-28 15:01:53 +020024 */
Ron Eldorda04b3b2019-01-28 15:18:15 +020025 unsigned char okm_hex[257] = { '\0' };
Thomas Fossati656864b2016-07-17 08:51:22 +010026
Hanno Beckera5cedbc2019-07-17 11:21:02 +010027 mbedtls_md_handle_t md = mbedtls_md_info_from_type( md_alg );
28 TEST_ASSERT( md != MBEDTLS_MD_INVALID_HANDLE );
Thomas Fossati656864b2016-07-17 08:51:22 +010029
30 ikm_len = unhexify( ikm, hex_ikm_string );
31 salt_len = unhexify( salt, hex_salt_string );
32 info_len = unhexify( info, hex_info_string );
33 okm_len = unhexify( expected_okm, hex_okm_string );
34
35 ret = mbedtls_hkdf( md, salt, salt_len, ikm, ikm_len, info, info_len, okm,
36 okm_len);
37 TEST_ASSERT( ret == 0 );
38
39 // Run hexify on it so that it looks nicer if the assertion fails
Ron Eldor57c2a302019-01-28 15:07:55 +020040 hexify( okm_hex, okm, okm_len );
41 TEST_ASSERT( !strcmp( (char *)okm_hex, hex_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
Hanno Beckera5cedbc2019-07-17 11:21:02 +010056 mbedtls_md_handle_t md = mbedtls_md_info_from_type( md_alg );
57 TEST_ASSERT( md != MBEDTLS_MD_INVALID_HANDLE );
Jaeden Amero36189622018-05-23 18:55:47 +010058
59 output_prk_len = mbedtls_md_get_size( md );
60 output_prk = mbedtls_calloc( 1, output_prk_len );
61
62 ikm = unhexify_alloc( hex_ikm_string, &ikm_len );
63 salt = unhexify_alloc( hex_salt_string, &salt_len );
64 prk = unhexify_alloc( hex_prk_string, &prk_len );
65 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
Hanno Beckera5cedbc2019-07-17 11:21:02 +010092 mbedtls_md_handle_t md = mbedtls_md_info_from_type( md_alg );
93 TEST_ASSERT( md != MBEDTLS_MD_INVALID_HANDLE );
Jaeden Amero36189622018-05-23 18:55:47 +010094
95 output_okm = mbedtls_calloc( OKM_LEN, 1 );
96
97 prk = unhexify_alloc( hex_prk_string, &prk_len );
98 info = unhexify_alloc( hex_info_string, &info_len );
99 okm = unhexify_alloc( hex_okm_string, &okm_len );
100 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
Hanno Becker530387e2019-07-17 14:10:26 +0100116/* BEGIN_CASE depends_on:!MBEDTLS_MD_SINGLE_HASH */
Jaeden Amero10e0e4d2018-05-23 19:44:26 +0100117void 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
Hanno Becker530387e2019-07-17 14:10:26 +0100143/* BEGIN_CASE depends_on:!MBEDTLS_MD_SINGLE_HASH */
Jaeden Amero10e0e4d2018-05-23 19:44:26 +0100144void 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 */