blob: 1e41f5002dad1546c6e22185d97a7b0bcfa7ec2e [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' };
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 Cron55d97f22020-06-26 17:00:30 +020027 TEST_ASSERT( !memcmp( okm, expected_okm->x, expected_okm->len ) );
Thomas Fossati656864b2016-07-17 08:51:22 +010028}
29/* END_CASE */
Jaeden Amero36189622018-05-23 18:55:47 +010030
31/* BEGIN_CASE */
32void test_hkdf_extract( int md_alg, char *hex_ikm_string,
33 char *hex_salt_string, char *hex_prk_string )
34{
35 int ret;
36 unsigned char *ikm = NULL;
37 unsigned char *salt = NULL;
38 unsigned char *prk = NULL;
39 unsigned char *output_prk = NULL;
40 size_t ikm_len, salt_len, prk_len, 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 output_prk = mbedtls_calloc( 1, output_prk_len );
47
Ronald Crona256c702020-06-10 10:53:11 +020048 ikm = mbedtls_test_unhexify_alloc( hex_ikm_string, &ikm_len );
49 salt = mbedtls_test_unhexify_alloc( hex_salt_string, &salt_len );
50 prk = mbedtls_test_unhexify_alloc( hex_prk_string, &prk_len );
Jaeden Amero36189622018-05-23 18:55:47 +010051 TEST_ASSERT( prk_len == output_prk_len );
52
53 ret = mbedtls_hkdf_extract( md, salt, salt_len, ikm, ikm_len, output_prk );
54 TEST_ASSERT( ret == 0 );
55
56 TEST_ASSERT( !memcmp( output_prk, prk, prk_len ) );
57
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 );
92 TEST_ASSERT( !memcmp( output_okm, okm, okm_len ) );
93
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 */