blob: f307a7d3048770c33c9973cbbdd1c9cc9c7f44e3 [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 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010012void 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
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010018 const mbedtls_md_info_t *md = mbedtls_md_info_from_type(md_alg);
19 TEST_ASSERT(md != NULL);
Thomas Fossati656864b2016-07-17 08:51:22 +010020
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010021 TEST_ASSERT(expected_okm->len <= sizeof(okm));
Ronald Cron40308332020-06-25 10:26:42 +020022
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010023 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);
Thomas Fossati656864b2016-07-17 08:51:22 +010026
Tom Cosgroveba3b14d2023-09-04 11:23:02 +010027 TEST_MEMORY_COMPARE(okm, expected_okm->len,
Tom Cosgrovea240fe32023-09-04 11:29:39 +010028 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 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010033void test_hkdf_extract(int md_alg, char *hex_ikm_string,
34 char *hex_salt_string, char *hex_prk_string)
Jaeden Amero36189622018-05-23 18:55:47 +010035{
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
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010043 const mbedtls_md_info_t *md = mbedtls_md_info_from_type(md_alg);
44 TEST_ASSERT(md != NULL);
Jaeden Amero36189622018-05-23 18:55:47 +010045
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010046 output_prk_len = mbedtls_md_get_size(md);
47 output_prk = mbedtls_calloc(1, output_prk_len);
Jaeden Amero36189622018-05-23 18:55:47 +010048
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010049 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
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010053 ret = mbedtls_hkdf_extract(md, salt, salt_len, ikm, ikm_len, output_prk);
54 TEST_ASSERT(ret == 0);
Jaeden Amero36189622018-05-23 18:55:47 +010055
Tom Cosgroveba3b14d2023-09-04 11:23:02 +010056 TEST_MEMORY_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 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010067void test_hkdf_expand(int md_alg, char *hex_info_string,
68 char *hex_prk_string, char *hex_okm_string)
Jaeden Amero36189622018-05-23 18:55:47 +010069{
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
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010078 const mbedtls_md_info_t *md = mbedtls_md_info_from_type(md_alg);
79 TEST_ASSERT(md != NULL);
Jaeden Amero36189622018-05-23 18:55:47 +010080
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010081 output_okm = mbedtls_calloc(OKM_LEN, 1);
Jaeden Amero36189622018-05-23 18:55:47 +010082
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010083 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);
86 TEST_ASSERT(prk_len == mbedtls_md_get_size(md));
87 TEST_ASSERT(okm_len < OKM_LEN);
Jaeden Amero36189622018-05-23 18:55:47 +010088
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010089 ret = mbedtls_hkdf_expand(md, prk, prk_len, info, info_len,
90 output_okm, OKM_LEN);
91 TEST_ASSERT(ret == 0);
Tom Cosgroveba3b14d2023-09-04 11:23:02 +010092 TEST_MEMORY_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 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100103void test_hkdf_extract_ret(int hash_len, int ret)
Jaeden Amero10e0e4d2018-05-23 19:44:26 +0100104{
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
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100112 memset(&fake_md_info, 0, sizeof(fake_md_info));
Jaeden Amero10e0e4d2018-05-23 19:44:26 +0100113 fake_md_info.type = MBEDTLS_MD_NONE;
114 fake_md_info.size = hash_len;
115
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100116 prk = mbedtls_calloc(MBEDTLS_MD_MAX_SIZE, 1);
Jaeden Amero10e0e4d2018-05-23 19:44:26 +0100117 salt_len = 0;
118 ikm_len = 0;
119
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100120 output_ret = mbedtls_hkdf_extract(&fake_md_info, salt, salt_len,
121 ikm, ikm_len, prk);
122 TEST_ASSERT(output_ret == ret);
Jaeden Amero10e0e4d2018-05-23 19:44:26 +0100123
124exit:
125 mbedtls_free(prk);
126}
127/* END_CASE */
128
129/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100130void test_hkdf_expand_ret(int hash_len, int prk_len, int okm_len, int ret)
Jaeden Amero10e0e4d2018-05-23 19:44:26 +0100131{
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
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100139 memset(&fake_md_info, 0, sizeof(fake_md_info));
Jaeden Amero10e0e4d2018-05-23 19:44:26 +0100140 fake_md_info.type = MBEDTLS_MD_NONE;
141 fake_md_info.size = hash_len;
142
143 info_len = 0;
144
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100145 if (prk_len > 0) {
146 prk = mbedtls_calloc(prk_len, 1);
147 }
Jaeden Amero10e0e4d2018-05-23 19:44:26 +0100148
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100149 if (okm_len > 0) {
150 okm = mbedtls_calloc(okm_len, 1);
151 }
Jaeden Amero10e0e4d2018-05-23 19:44:26 +0100152
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100153 output_ret = mbedtls_hkdf_expand(&fake_md_info, prk, prk_len,
154 info, info_len, okm, okm_len);
155 TEST_ASSERT(output_ret == ret);
Jaeden Amero10e0e4d2018-05-23 19:44:26 +0100156
157exit:
158 mbedtls_free(prk);
159 mbedtls_free(okm);
160}
161/* END_CASE */