1a8e1175bSopenharmony_ci/* BEGIN_HEADER */
2a8e1175bSopenharmony_ci#include "mbedtls/hkdf.h"
3a8e1175bSopenharmony_ci#include "md_wrap.h"
4a8e1175bSopenharmony_ci/* END_HEADER */
5a8e1175bSopenharmony_ci
6a8e1175bSopenharmony_ci/* BEGIN_DEPENDENCIES
7a8e1175bSopenharmony_ci * depends_on:MBEDTLS_HKDF_C
8a8e1175bSopenharmony_ci * END_DEPENDENCIES
9a8e1175bSopenharmony_ci */
10a8e1175bSopenharmony_ci
11a8e1175bSopenharmony_ci/* BEGIN_CASE */
12a8e1175bSopenharmony_civoid test_hkdf(int md_alg, data_t *ikm, data_t *salt, data_t *info,
13a8e1175bSopenharmony_ci               data_t *expected_okm)
14a8e1175bSopenharmony_ci{
15a8e1175bSopenharmony_ci    int ret;
16a8e1175bSopenharmony_ci    unsigned char okm[128] = { '\0' };
17a8e1175bSopenharmony_ci
18a8e1175bSopenharmony_ci    MD_PSA_INIT();
19a8e1175bSopenharmony_ci
20a8e1175bSopenharmony_ci    const mbedtls_md_info_t *md = mbedtls_md_info_from_type(md_alg);
21a8e1175bSopenharmony_ci    TEST_ASSERT(md != NULL);
22a8e1175bSopenharmony_ci
23a8e1175bSopenharmony_ci    TEST_ASSERT(expected_okm->len <= sizeof(okm));
24a8e1175bSopenharmony_ci
25a8e1175bSopenharmony_ci    ret = mbedtls_hkdf(md, salt->x, salt->len, ikm->x, ikm->len,
26a8e1175bSopenharmony_ci                       info->x, info->len, okm, expected_okm->len);
27a8e1175bSopenharmony_ci    TEST_ASSERT(ret == 0);
28a8e1175bSopenharmony_ci
29a8e1175bSopenharmony_ci    TEST_MEMORY_COMPARE(okm, expected_okm->len,
30a8e1175bSopenharmony_ci                        expected_okm->x, expected_okm->len);
31a8e1175bSopenharmony_ci
32a8e1175bSopenharmony_ciexit:
33a8e1175bSopenharmony_ci    MD_PSA_DONE();
34a8e1175bSopenharmony_ci}
35a8e1175bSopenharmony_ci/* END_CASE */
36a8e1175bSopenharmony_ci
37a8e1175bSopenharmony_ci/* BEGIN_CASE */
38a8e1175bSopenharmony_civoid test_hkdf_extract(int md_alg,
39a8e1175bSopenharmony_ci                       data_t *ikm,
40a8e1175bSopenharmony_ci                       data_t *salt,
41a8e1175bSopenharmony_ci                       data_t *prk)
42a8e1175bSopenharmony_ci{
43a8e1175bSopenharmony_ci    int ret;
44a8e1175bSopenharmony_ci    unsigned char *output_prk = NULL;
45a8e1175bSopenharmony_ci    size_t output_prk_len;
46a8e1175bSopenharmony_ci
47a8e1175bSopenharmony_ci    MD_PSA_INIT();
48a8e1175bSopenharmony_ci
49a8e1175bSopenharmony_ci    const mbedtls_md_info_t *md = mbedtls_md_info_from_type(md_alg);
50a8e1175bSopenharmony_ci    TEST_ASSERT(md != NULL);
51a8e1175bSopenharmony_ci
52a8e1175bSopenharmony_ci    output_prk_len = mbedtls_md_get_size(md);
53a8e1175bSopenharmony_ci    TEST_CALLOC(output_prk, output_prk_len);
54a8e1175bSopenharmony_ci
55a8e1175bSopenharmony_ci    ret = mbedtls_hkdf_extract(md, salt->x, salt->len,
56a8e1175bSopenharmony_ci                               ikm->x, ikm->len, output_prk);
57a8e1175bSopenharmony_ci    TEST_ASSERT(ret == 0);
58a8e1175bSopenharmony_ci
59a8e1175bSopenharmony_ci    TEST_MEMORY_COMPARE(output_prk, output_prk_len, prk->x, prk->len);
60a8e1175bSopenharmony_ci
61a8e1175bSopenharmony_ciexit:
62a8e1175bSopenharmony_ci    mbedtls_free(output_prk);
63a8e1175bSopenharmony_ci    MD_PSA_DONE();
64a8e1175bSopenharmony_ci}
65a8e1175bSopenharmony_ci/* END_CASE */
66a8e1175bSopenharmony_ci
67a8e1175bSopenharmony_ci/* BEGIN_CASE */
68a8e1175bSopenharmony_civoid test_hkdf_expand(int md_alg,
69a8e1175bSopenharmony_ci                      data_t *info,
70a8e1175bSopenharmony_ci                      data_t *prk,
71a8e1175bSopenharmony_ci                      data_t *okm)
72a8e1175bSopenharmony_ci{
73a8e1175bSopenharmony_ci    enum { OKM_LEN  = 1024 };
74a8e1175bSopenharmony_ci    int ret;
75a8e1175bSopenharmony_ci    unsigned char *output_okm = NULL;
76a8e1175bSopenharmony_ci
77a8e1175bSopenharmony_ci    MD_PSA_INIT();
78a8e1175bSopenharmony_ci
79a8e1175bSopenharmony_ci    const mbedtls_md_info_t *md = mbedtls_md_info_from_type(md_alg);
80a8e1175bSopenharmony_ci    TEST_ASSERT(md != NULL);
81a8e1175bSopenharmony_ci
82a8e1175bSopenharmony_ci    TEST_CALLOC(output_okm, OKM_LEN);
83a8e1175bSopenharmony_ci
84a8e1175bSopenharmony_ci    TEST_ASSERT(prk->len == mbedtls_md_get_size(md));
85a8e1175bSopenharmony_ci    TEST_ASSERT(okm->len < OKM_LEN);
86a8e1175bSopenharmony_ci
87a8e1175bSopenharmony_ci    ret = mbedtls_hkdf_expand(md, prk->x, prk->len,
88a8e1175bSopenharmony_ci                              info->x, info->len,
89a8e1175bSopenharmony_ci                              output_okm, OKM_LEN);
90a8e1175bSopenharmony_ci    TEST_ASSERT(ret == 0);
91a8e1175bSopenharmony_ci    TEST_MEMORY_COMPARE(output_okm, okm->len, okm->x, okm->len);
92a8e1175bSopenharmony_ci
93a8e1175bSopenharmony_ciexit:
94a8e1175bSopenharmony_ci    mbedtls_free(output_okm);
95a8e1175bSopenharmony_ci    MD_PSA_DONE();
96a8e1175bSopenharmony_ci}
97a8e1175bSopenharmony_ci/* END_CASE */
98a8e1175bSopenharmony_ci
99a8e1175bSopenharmony_ci/* BEGIN_CASE */
100a8e1175bSopenharmony_civoid test_hkdf_extract_ret(int hash_len, int ret)
101a8e1175bSopenharmony_ci{
102a8e1175bSopenharmony_ci    int output_ret;
103a8e1175bSopenharmony_ci    unsigned char *salt = NULL;
104a8e1175bSopenharmony_ci    unsigned char *ikm = NULL;
105a8e1175bSopenharmony_ci    unsigned char *prk = NULL;
106a8e1175bSopenharmony_ci    size_t salt_len, ikm_len;
107a8e1175bSopenharmony_ci    struct mbedtls_md_info_t fake_md_info;
108a8e1175bSopenharmony_ci
109a8e1175bSopenharmony_ci    memset(&fake_md_info, 0, sizeof(fake_md_info));
110a8e1175bSopenharmony_ci    fake_md_info.type = MBEDTLS_MD_NONE;
111a8e1175bSopenharmony_ci    fake_md_info.size = hash_len;
112a8e1175bSopenharmony_ci
113a8e1175bSopenharmony_ci    TEST_CALLOC(prk, MBEDTLS_MD_MAX_SIZE);
114a8e1175bSopenharmony_ci    salt_len = 0;
115a8e1175bSopenharmony_ci    ikm_len = 0;
116a8e1175bSopenharmony_ci
117a8e1175bSopenharmony_ci    output_ret = mbedtls_hkdf_extract(&fake_md_info, salt, salt_len,
118a8e1175bSopenharmony_ci                                      ikm, ikm_len, prk);
119a8e1175bSopenharmony_ci    TEST_ASSERT(output_ret == ret);
120a8e1175bSopenharmony_ci
121a8e1175bSopenharmony_ciexit:
122a8e1175bSopenharmony_ci    mbedtls_free(prk);
123a8e1175bSopenharmony_ci}
124a8e1175bSopenharmony_ci/* END_CASE */
125a8e1175bSopenharmony_ci
126a8e1175bSopenharmony_ci/* BEGIN_CASE */
127a8e1175bSopenharmony_civoid test_hkdf_expand_ret(int hash_len, int prk_len, int okm_len, int ret)
128a8e1175bSopenharmony_ci{
129a8e1175bSopenharmony_ci    int output_ret;
130a8e1175bSopenharmony_ci    unsigned char *info = NULL;
131a8e1175bSopenharmony_ci    unsigned char *prk = NULL;
132a8e1175bSopenharmony_ci    unsigned char *okm = NULL;
133a8e1175bSopenharmony_ci    size_t info_len;
134a8e1175bSopenharmony_ci    struct mbedtls_md_info_t fake_md_info;
135a8e1175bSopenharmony_ci
136a8e1175bSopenharmony_ci    memset(&fake_md_info, 0, sizeof(fake_md_info));
137a8e1175bSopenharmony_ci    fake_md_info.type = MBEDTLS_MD_NONE;
138a8e1175bSopenharmony_ci    fake_md_info.size = hash_len;
139a8e1175bSopenharmony_ci
140a8e1175bSopenharmony_ci    info_len = 0;
141a8e1175bSopenharmony_ci
142a8e1175bSopenharmony_ci    if (prk_len > 0) {
143a8e1175bSopenharmony_ci        TEST_CALLOC(prk, prk_len);
144a8e1175bSopenharmony_ci    }
145a8e1175bSopenharmony_ci
146a8e1175bSopenharmony_ci    if (okm_len > 0) {
147a8e1175bSopenharmony_ci        TEST_CALLOC(okm, okm_len);
148a8e1175bSopenharmony_ci    }
149a8e1175bSopenharmony_ci
150a8e1175bSopenharmony_ci    output_ret = mbedtls_hkdf_expand(&fake_md_info, prk, prk_len,
151a8e1175bSopenharmony_ci                                     info, info_len, okm, okm_len);
152a8e1175bSopenharmony_ci    TEST_ASSERT(output_ret == ret);
153a8e1175bSopenharmony_ci
154a8e1175bSopenharmony_ciexit:
155a8e1175bSopenharmony_ci    mbedtls_free(prk);
156a8e1175bSopenharmony_ci    mbedtls_free(okm);
157a8e1175bSopenharmony_ci}
158a8e1175bSopenharmony_ci/* END_CASE */
159