blob: 21e4439d9181e1ec66ba7bd25f47ea7ab26f3215 [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 */
Gilles Peskine449bd832023-01-11 14:50:10 +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 Peskine449bd832023-01-11 14:50:10 +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 Peskine449bd832023-01-11 14:50:10 +010021 TEST_ASSERT(expected_okm->len <= sizeof(okm));
Ronald Cron40308332020-06-25 10:26:42 +020022
Gilles Peskine449bd832023-01-11 14:50:10 +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
Gilles Peskine449bd832023-01-11 14:50:10 +010027 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 */
Gilles Peskine449bd832023-01-11 14:50:10 +010033void test_hkdf_extract(int md_alg,
34 data_t *ikm,
35 data_t *salt,
36 data_t *prk)
Jaeden Amero36189622018-05-23 18:55:47 +010037{
38 int ret;
Jaeden Amero36189622018-05-23 18:55:47 +010039 unsigned char *output_prk = NULL;
Gabor Mezei88f3b2e2022-03-16 16:53:23 +010040 size_t output_prk_len;
Jaeden Amero36189622018-05-23 18:55:47 +010041
Gilles Peskine449bd832023-01-11 14:50:10 +010042 const mbedtls_md_info_t *md = mbedtls_md_info_from_type(md_alg);
43 TEST_ASSERT(md != NULL);
Jaeden Amero36189622018-05-23 18:55:47 +010044
Gilles Peskine449bd832023-01-11 14:50:10 +010045 output_prk_len = mbedtls_md_get_size(md);
46 ASSERT_ALLOC(output_prk, output_prk_len);
Jaeden Amero36189622018-05-23 18:55:47 +010047
Gilles Peskine449bd832023-01-11 14:50:10 +010048 ret = mbedtls_hkdf_extract(md, salt->x, salt->len,
49 ikm->x, ikm->len, output_prk);
50 TEST_ASSERT(ret == 0);
Jaeden Amero36189622018-05-23 18:55:47 +010051
Gilles Peskine449bd832023-01-11 14:50:10 +010052 ASSERT_COMPARE(output_prk, output_prk_len, prk->x, prk->len);
Jaeden Amero36189622018-05-23 18:55:47 +010053
54exit:
Jaeden Amero36189622018-05-23 18:55:47 +010055 mbedtls_free(output_prk);
56}
57/* END_CASE */
58
59/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +010060void test_hkdf_expand(int md_alg,
61 data_t *info,
62 data_t *prk,
63 data_t *okm)
Jaeden Amero36189622018-05-23 18:55:47 +010064{
65 enum { OKM_LEN = 1024 };
66 int ret;
Jaeden Amero36189622018-05-23 18:55:47 +010067 unsigned char *output_okm = NULL;
Jaeden Amero36189622018-05-23 18:55:47 +010068
Gilles Peskine449bd832023-01-11 14:50:10 +010069 const mbedtls_md_info_t *md = mbedtls_md_info_from_type(md_alg);
70 TEST_ASSERT(md != NULL);
Jaeden Amero36189622018-05-23 18:55:47 +010071
Gilles Peskine449bd832023-01-11 14:50:10 +010072 ASSERT_ALLOC(output_okm, OKM_LEN);
Jaeden Amero36189622018-05-23 18:55:47 +010073
Gilles Peskine449bd832023-01-11 14:50:10 +010074 TEST_ASSERT(prk->len == mbedtls_md_get_size(md));
75 TEST_ASSERT(okm->len < OKM_LEN);
Jaeden Amero36189622018-05-23 18:55:47 +010076
Gilles Peskine449bd832023-01-11 14:50:10 +010077 ret = mbedtls_hkdf_expand(md, prk->x, prk->len,
78 info->x, info->len,
79 output_okm, OKM_LEN);
80 TEST_ASSERT(ret == 0);
81 ASSERT_COMPARE(output_okm, okm->len, okm->x, okm->len);
Jaeden Amero36189622018-05-23 18:55:47 +010082
83exit:
Jaeden Amero36189622018-05-23 18:55:47 +010084 mbedtls_free(output_okm);
85}
86/* END_CASE */
Jaeden Amero10e0e4d2018-05-23 19:44:26 +010087
88/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +010089void test_hkdf_extract_ret(int hash_len, int ret)
Jaeden Amero10e0e4d2018-05-23 19:44:26 +010090{
91 int output_ret;
92 unsigned char *salt = NULL;
93 unsigned char *ikm = NULL;
94 unsigned char *prk = NULL;
95 size_t salt_len, ikm_len;
96 struct mbedtls_md_info_t fake_md_info;
97
Gilles Peskine449bd832023-01-11 14:50:10 +010098 memset(&fake_md_info, 0, sizeof(fake_md_info));
Jaeden Amero10e0e4d2018-05-23 19:44:26 +010099 fake_md_info.type = MBEDTLS_MD_NONE;
100 fake_md_info.size = hash_len;
101
Gilles Peskine449bd832023-01-11 14:50:10 +0100102 ASSERT_ALLOC(prk, MBEDTLS_MD_MAX_SIZE);
Jaeden Amero10e0e4d2018-05-23 19:44:26 +0100103 salt_len = 0;
104 ikm_len = 0;
105
Gilles Peskine449bd832023-01-11 14:50:10 +0100106 output_ret = mbedtls_hkdf_extract(&fake_md_info, salt, salt_len,
107 ikm, ikm_len, prk);
108 TEST_ASSERT(output_ret == ret);
Jaeden Amero10e0e4d2018-05-23 19:44:26 +0100109
110exit:
111 mbedtls_free(prk);
112}
113/* END_CASE */
114
115/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100116void test_hkdf_expand_ret(int hash_len, int prk_len, int okm_len, int ret)
Jaeden Amero10e0e4d2018-05-23 19:44:26 +0100117{
118 int output_ret;
119 unsigned char *info = NULL;
120 unsigned char *prk = NULL;
121 unsigned char *okm = NULL;
122 size_t info_len;
123 struct mbedtls_md_info_t fake_md_info;
124
Gilles Peskine449bd832023-01-11 14:50:10 +0100125 memset(&fake_md_info, 0, sizeof(fake_md_info));
Jaeden Amero10e0e4d2018-05-23 19:44:26 +0100126 fake_md_info.type = MBEDTLS_MD_NONE;
127 fake_md_info.size = hash_len;
128
129 info_len = 0;
130
Gilles Peskine449bd832023-01-11 14:50:10 +0100131 if (prk_len > 0) {
132 ASSERT_ALLOC(prk, prk_len);
133 }
Jaeden Amero10e0e4d2018-05-23 19:44:26 +0100134
Gilles Peskine449bd832023-01-11 14:50:10 +0100135 if (okm_len > 0) {
136 ASSERT_ALLOC(okm, okm_len);
137 }
Jaeden Amero10e0e4d2018-05-23 19:44:26 +0100138
Gilles Peskine449bd832023-01-11 14:50:10 +0100139 output_ret = mbedtls_hkdf_expand(&fake_md_info, prk, prk_len,
140 info, info_len, okm, okm_len);
141 TEST_ASSERT(output_ret == ret);
Jaeden Amero10e0e4d2018-05-23 19:44:26 +0100142
143exit:
144 mbedtls_free(prk);
145 mbedtls_free(okm);
146}
147/* END_CASE */