blob: 1ad6f3d4f31c285db6199528b7180c671d740597 [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 */
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 Crond8902b62020-07-30 14:18:02 +020027 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 */
Gabor Mezei88f3b2e2022-03-16 16:53:23 +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
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 );
Gabor Mezei298a2d62022-02-07 18:21:39 +010046 ASSERT_ALLOC( output_prk, output_prk_len );
Jaeden Amero36189622018-05-23 18:55:47 +010047
Gabor Mezei88f3b2e2022-03-16 16:53:23 +010048 ret = mbedtls_hkdf_extract( md, salt->x, salt->len,
49 ikm->x, ikm->len, output_prk );
Jaeden Amero36189622018-05-23 18:55:47 +010050 TEST_ASSERT( ret == 0 );
51
Gabor Mezei88f3b2e2022-03-16 16:53:23 +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 */
Gabor Mezei88f3b2e2022-03-16 16:53:23 +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
69 const mbedtls_md_info_t *md = mbedtls_md_info_from_type( md_alg );
70 TEST_ASSERT( md != NULL );
71
Gabor Mezei748ab4a2022-02-09 16:31:48 +010072 ASSERT_ALLOC( output_okm, OKM_LEN );
Jaeden Amero36189622018-05-23 18:55:47 +010073
Gabor Mezei88f3b2e2022-03-16 16:53:23 +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
Gabor Mezei88f3b2e2022-03-16 16:53:23 +010077 ret = mbedtls_hkdf_expand( md, prk->x, prk->len,
78 info->x, info->len,
Jaeden Amero36189622018-05-23 18:55:47 +010079 output_okm, OKM_LEN );
80 TEST_ASSERT( ret == 0 );
Gabor Mezei88f3b2e2022-03-16 16:53:23 +010081 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 */
89void test_hkdf_extract_ret( int hash_len, int ret )
90{
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
98 memset( &fake_md_info, 0, sizeof( fake_md_info ) );
99 fake_md_info.type = MBEDTLS_MD_NONE;
100 fake_md_info.size = hash_len;
101
Gabor Mezei298a2d62022-02-07 18:21:39 +0100102 ASSERT_ALLOC( prk, MBEDTLS_MD_MAX_SIZE);
Jaeden Amero10e0e4d2018-05-23 19:44:26 +0100103 salt_len = 0;
104 ikm_len = 0;
105
106 output_ret = mbedtls_hkdf_extract( &fake_md_info, salt, salt_len,
107 ikm, ikm_len, prk );
108 TEST_ASSERT( output_ret == ret );
109
110exit:
111 mbedtls_free(prk);
112}
113/* END_CASE */
114
115/* BEGIN_CASE */
116void test_hkdf_expand_ret( int hash_len, int prk_len, int okm_len, int ret )
117{
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
125 memset( &fake_md_info, 0, sizeof( fake_md_info ) );
126 fake_md_info.type = MBEDTLS_MD_NONE;
127 fake_md_info.size = hash_len;
128
129 info_len = 0;
130
131 if (prk_len > 0)
Gabor Mezei748ab4a2022-02-09 16:31:48 +0100132 ASSERT_ALLOC( prk, prk_len );
Jaeden Amero10e0e4d2018-05-23 19:44:26 +0100133
134 if (okm_len > 0)
Gabor Mezei748ab4a2022-02-09 16:31:48 +0100135 ASSERT_ALLOC( okm, okm_len );
Jaeden Amero10e0e4d2018-05-23 19:44:26 +0100136
137 output_ret = mbedtls_hkdf_expand( &fake_md_info, prk, prk_len,
138 info, info_len, okm, okm_len );
139 TEST_ASSERT( output_ret == ret );
140
141exit:
142 mbedtls_free(prk);
143 mbedtls_free(okm);
144}
145/* END_CASE */