blob: b3ccfb030f6075868b13611245712e78d2806c72 [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
Manuel Pégourié-Gonnard0d1921c2023-03-20 10:17:41 +010018 MD_PSA_INIT();
19
Gilles Peskine449bd832023-01-11 14:50:10 +010020 const mbedtls_md_info_t *md = mbedtls_md_info_from_type(md_alg);
21 TEST_ASSERT(md != NULL);
Thomas Fossati656864b2016-07-17 08:51:22 +010022
Gilles Peskine449bd832023-01-11 14:50:10 +010023 TEST_ASSERT(expected_okm->len <= sizeof(okm));
Ronald Cron40308332020-06-25 10:26:42 +020024
Gilles Peskine449bd832023-01-11 14:50:10 +010025 ret = mbedtls_hkdf(md, salt->x, salt->len, ikm->x, ikm->len,
26 info->x, info->len, okm, expected_okm->len);
27 TEST_ASSERT(ret == 0);
Thomas Fossati656864b2016-07-17 08:51:22 +010028
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +010029 TEST_MEMORY_COMPARE(okm, expected_okm->len,
Gilles Peskine449bd832023-01-11 14:50:10 +010030 expected_okm->x, expected_okm->len);
Manuel Pégourié-Gonnard0d1921c2023-03-20 10:17:41 +010031
32exit:
33 MD_PSA_DONE();
Thomas Fossati656864b2016-07-17 08:51:22 +010034}
35/* END_CASE */
Jaeden Amero36189622018-05-23 18:55:47 +010036
37/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +010038void test_hkdf_extract(int md_alg,
39 data_t *ikm,
40 data_t *salt,
41 data_t *prk)
Jaeden Amero36189622018-05-23 18:55:47 +010042{
43 int ret;
Jaeden Amero36189622018-05-23 18:55:47 +010044 unsigned char *output_prk = NULL;
Gabor Mezei88f3b2e2022-03-16 16:53:23 +010045 size_t output_prk_len;
Jaeden Amero36189622018-05-23 18:55:47 +010046
Manuel Pégourié-Gonnard0d1921c2023-03-20 10:17:41 +010047 MD_PSA_INIT();
48
Gilles Peskine449bd832023-01-11 14:50:10 +010049 const mbedtls_md_info_t *md = mbedtls_md_info_from_type(md_alg);
50 TEST_ASSERT(md != NULL);
Jaeden Amero36189622018-05-23 18:55:47 +010051
Gilles Peskine449bd832023-01-11 14:50:10 +010052 output_prk_len = mbedtls_md_get_size(md);
Tom Cosgrove05b2a872023-07-21 11:31:13 +010053 TEST_CALLOC(output_prk, output_prk_len);
Jaeden Amero36189622018-05-23 18:55:47 +010054
Gilles Peskine449bd832023-01-11 14:50:10 +010055 ret = mbedtls_hkdf_extract(md, salt->x, salt->len,
56 ikm->x, ikm->len, output_prk);
57 TEST_ASSERT(ret == 0);
Jaeden Amero36189622018-05-23 18:55:47 +010058
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +010059 TEST_MEMORY_COMPARE(output_prk, output_prk_len, prk->x, prk->len);
Jaeden Amero36189622018-05-23 18:55:47 +010060
61exit:
Jaeden Amero36189622018-05-23 18:55:47 +010062 mbedtls_free(output_prk);
Manuel Pégourié-Gonnard0d1921c2023-03-20 10:17:41 +010063 MD_PSA_DONE();
Jaeden Amero36189622018-05-23 18:55:47 +010064}
65/* END_CASE */
66
67/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +010068void test_hkdf_expand(int md_alg,
69 data_t *info,
70 data_t *prk,
71 data_t *okm)
Jaeden Amero36189622018-05-23 18:55:47 +010072{
73 enum { OKM_LEN = 1024 };
74 int ret;
Jaeden Amero36189622018-05-23 18:55:47 +010075 unsigned char *output_okm = NULL;
Jaeden Amero36189622018-05-23 18:55:47 +010076
Manuel Pégourié-Gonnard0d1921c2023-03-20 10:17:41 +010077 MD_PSA_INIT();
78
Gilles Peskine449bd832023-01-11 14:50:10 +010079 const mbedtls_md_info_t *md = mbedtls_md_info_from_type(md_alg);
80 TEST_ASSERT(md != NULL);
Jaeden Amero36189622018-05-23 18:55:47 +010081
Tom Cosgrove05b2a872023-07-21 11:31:13 +010082 TEST_CALLOC(output_okm, OKM_LEN);
Jaeden Amero36189622018-05-23 18:55:47 +010083
Gilles Peskine449bd832023-01-11 14:50:10 +010084 TEST_ASSERT(prk->len == mbedtls_md_get_size(md));
85 TEST_ASSERT(okm->len < OKM_LEN);
Jaeden Amero36189622018-05-23 18:55:47 +010086
Gilles Peskine449bd832023-01-11 14:50:10 +010087 ret = mbedtls_hkdf_expand(md, prk->x, prk->len,
88 info->x, info->len,
89 output_okm, OKM_LEN);
90 TEST_ASSERT(ret == 0);
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +010091 TEST_MEMORY_COMPARE(output_okm, okm->len, okm->x, okm->len);
Jaeden Amero36189622018-05-23 18:55:47 +010092
93exit:
Jaeden Amero36189622018-05-23 18:55:47 +010094 mbedtls_free(output_okm);
Manuel Pégourié-Gonnard0d1921c2023-03-20 10:17:41 +010095 MD_PSA_DONE();
Jaeden Amero36189622018-05-23 18:55:47 +010096}
97/* END_CASE */
Jaeden Amero10e0e4d2018-05-23 19:44:26 +010098
99/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100100void test_hkdf_extract_ret(int hash_len, int ret)
Jaeden Amero10e0e4d2018-05-23 19:44:26 +0100101{
102 int output_ret;
103 unsigned char *salt = NULL;
104 unsigned char *ikm = NULL;
105 unsigned char *prk = NULL;
106 size_t salt_len, ikm_len;
107 struct mbedtls_md_info_t fake_md_info;
108
Gilles Peskine449bd832023-01-11 14:50:10 +0100109 memset(&fake_md_info, 0, sizeof(fake_md_info));
Jaeden Amero10e0e4d2018-05-23 19:44:26 +0100110 fake_md_info.type = MBEDTLS_MD_NONE;
111 fake_md_info.size = hash_len;
112
Tom Cosgrove05b2a872023-07-21 11:31:13 +0100113 TEST_CALLOC(prk, MBEDTLS_MD_MAX_SIZE);
Jaeden Amero10e0e4d2018-05-23 19:44:26 +0100114 salt_len = 0;
115 ikm_len = 0;
116
Gilles Peskine449bd832023-01-11 14:50:10 +0100117 output_ret = mbedtls_hkdf_extract(&fake_md_info, salt, salt_len,
118 ikm, ikm_len, prk);
119 TEST_ASSERT(output_ret == ret);
Jaeden Amero10e0e4d2018-05-23 19:44:26 +0100120
121exit:
122 mbedtls_free(prk);
123}
124/* END_CASE */
125
126/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100127void test_hkdf_expand_ret(int hash_len, int prk_len, int okm_len, int ret)
Jaeden Amero10e0e4d2018-05-23 19:44:26 +0100128{
129 int output_ret;
130 unsigned char *info = NULL;
131 unsigned char *prk = NULL;
132 unsigned char *okm = NULL;
133 size_t info_len;
134 struct mbedtls_md_info_t fake_md_info;
135
Gilles Peskine449bd832023-01-11 14:50:10 +0100136 memset(&fake_md_info, 0, sizeof(fake_md_info));
Jaeden Amero10e0e4d2018-05-23 19:44:26 +0100137 fake_md_info.type = MBEDTLS_MD_NONE;
138 fake_md_info.size = hash_len;
139
140 info_len = 0;
141
Gilles Peskine449bd832023-01-11 14:50:10 +0100142 if (prk_len > 0) {
Tom Cosgrove05b2a872023-07-21 11:31:13 +0100143 TEST_CALLOC(prk, prk_len);
Gilles Peskine449bd832023-01-11 14:50:10 +0100144 }
Jaeden Amero10e0e4d2018-05-23 19:44:26 +0100145
Gilles Peskine449bd832023-01-11 14:50:10 +0100146 if (okm_len > 0) {
Tom Cosgrove05b2a872023-07-21 11:31:13 +0100147 TEST_CALLOC(okm, okm_len);
Gilles Peskine449bd832023-01-11 14:50:10 +0100148 }
Jaeden Amero10e0e4d2018-05-23 19:44:26 +0100149
Gilles Peskine449bd832023-01-11 14:50:10 +0100150 output_ret = mbedtls_hkdf_expand(&fake_md_info, prk, prk_len,
151 info, info_len, okm, okm_len);
152 TEST_ASSERT(output_ret == ret);
Jaeden Amero10e0e4d2018-05-23 19:44:26 +0100153
154exit:
155 mbedtls_free(prk);
156 mbedtls_free(okm);
157}
158/* END_CASE */