1a8e1175bSopenharmony_ci/* BEGIN_HEADER */
2a8e1175bSopenharmony_ci#include "mbedtls/sha1.h"
3a8e1175bSopenharmony_ci#include "mbedtls/sha256.h"
4a8e1175bSopenharmony_ci#include "mbedtls/sha512.h"
5a8e1175bSopenharmony_ci#include "mbedtls/sha3.h"
6a8e1175bSopenharmony_ci/* END_HEADER */
7a8e1175bSopenharmony_ci
8a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SHA1_C */
9a8e1175bSopenharmony_civoid mbedtls_sha1(data_t *src_str, data_t *hash)
10a8e1175bSopenharmony_ci{
11a8e1175bSopenharmony_ci    unsigned char output[41];
12a8e1175bSopenharmony_ci
13a8e1175bSopenharmony_ci    memset(output, 0x00, 41);
14a8e1175bSopenharmony_ci
15a8e1175bSopenharmony_ci
16a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_sha1(src_str->x, src_str->len, output) == 0);
17a8e1175bSopenharmony_ci
18a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_test_hexcmp(output, hash->x, 20, hash->len) == 0);
19a8e1175bSopenharmony_ci}
20a8e1175bSopenharmony_ci/* END_CASE */
21a8e1175bSopenharmony_ci
22a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SHA256_C */
23a8e1175bSopenharmony_civoid sha256_invalid_param()
24a8e1175bSopenharmony_ci{
25a8e1175bSopenharmony_ci    mbedtls_sha256_context ctx;
26a8e1175bSopenharmony_ci    unsigned char buf[64] = { 0 };
27a8e1175bSopenharmony_ci    size_t const buflen = sizeof(buf);
28a8e1175bSopenharmony_ci    int invalid_type = 42;
29a8e1175bSopenharmony_ci
30a8e1175bSopenharmony_ci    TEST_EQUAL(MBEDTLS_ERR_SHA256_BAD_INPUT_DATA,
31a8e1175bSopenharmony_ci               mbedtls_sha256_starts(&ctx, invalid_type));
32a8e1175bSopenharmony_ci
33a8e1175bSopenharmony_ci    TEST_EQUAL(MBEDTLS_ERR_SHA256_BAD_INPUT_DATA,
34a8e1175bSopenharmony_ci               mbedtls_sha256(buf, buflen,
35a8e1175bSopenharmony_ci                              buf, invalid_type));
36a8e1175bSopenharmony_ci
37a8e1175bSopenharmony_ciexit:
38a8e1175bSopenharmony_ci    return;
39a8e1175bSopenharmony_ci}
40a8e1175bSopenharmony_ci/* END_CASE */
41a8e1175bSopenharmony_ci
42a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SHA224_C */
43a8e1175bSopenharmony_civoid sha224(data_t *src_str, data_t *hash)
44a8e1175bSopenharmony_ci{
45a8e1175bSopenharmony_ci    unsigned char output[57];
46a8e1175bSopenharmony_ci
47a8e1175bSopenharmony_ci    memset(output, 0x00, 57);
48a8e1175bSopenharmony_ci
49a8e1175bSopenharmony_ci
50a8e1175bSopenharmony_ci    TEST_EQUAL(mbedtls_sha256(src_str->x, src_str->len, output, 1), 0);
51a8e1175bSopenharmony_ci
52a8e1175bSopenharmony_ci    TEST_EQUAL(mbedtls_test_hexcmp(output, hash->x, 28, hash->len), 0);
53a8e1175bSopenharmony_ci}
54a8e1175bSopenharmony_ci/* END_CASE */
55a8e1175bSopenharmony_ci
56a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SHA256_C */
57a8e1175bSopenharmony_civoid mbedtls_sha256(data_t *src_str, data_t *hash)
58a8e1175bSopenharmony_ci{
59a8e1175bSopenharmony_ci    unsigned char output[65];
60a8e1175bSopenharmony_ci
61a8e1175bSopenharmony_ci    memset(output, 0x00, 65);
62a8e1175bSopenharmony_ci
63a8e1175bSopenharmony_ci
64a8e1175bSopenharmony_ci    TEST_EQUAL(mbedtls_sha256(src_str->x, src_str->len, output, 0), 0);
65a8e1175bSopenharmony_ci
66a8e1175bSopenharmony_ci    TEST_EQUAL(mbedtls_test_hexcmp(output, hash->x, 32, hash->len), 0);
67a8e1175bSopenharmony_ci}
68a8e1175bSopenharmony_ci/* END_CASE */
69a8e1175bSopenharmony_ci
70a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SHA512_C */
71a8e1175bSopenharmony_civoid sha512_invalid_param()
72a8e1175bSopenharmony_ci{
73a8e1175bSopenharmony_ci    mbedtls_sha512_context ctx;
74a8e1175bSopenharmony_ci    unsigned char buf[64] = { 0 };
75a8e1175bSopenharmony_ci    size_t const buflen = sizeof(buf);
76a8e1175bSopenharmony_ci    int invalid_type = 42;
77a8e1175bSopenharmony_ci
78a8e1175bSopenharmony_ci    TEST_EQUAL(MBEDTLS_ERR_SHA512_BAD_INPUT_DATA,
79a8e1175bSopenharmony_ci               mbedtls_sha512_starts(&ctx, invalid_type));
80a8e1175bSopenharmony_ci
81a8e1175bSopenharmony_ci    TEST_EQUAL(MBEDTLS_ERR_SHA512_BAD_INPUT_DATA,
82a8e1175bSopenharmony_ci               mbedtls_sha512(buf, buflen,
83a8e1175bSopenharmony_ci                              buf, invalid_type));
84a8e1175bSopenharmony_ci
85a8e1175bSopenharmony_ciexit:
86a8e1175bSopenharmony_ci    return;
87a8e1175bSopenharmony_ci}
88a8e1175bSopenharmony_ci/* END_CASE */
89a8e1175bSopenharmony_ci
90a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SHA384_C */
91a8e1175bSopenharmony_civoid sha384(data_t *src_str, data_t *hash)
92a8e1175bSopenharmony_ci{
93a8e1175bSopenharmony_ci    unsigned char output[97];
94a8e1175bSopenharmony_ci
95a8e1175bSopenharmony_ci    memset(output, 0x00, 97);
96a8e1175bSopenharmony_ci
97a8e1175bSopenharmony_ci
98a8e1175bSopenharmony_ci    TEST_EQUAL(mbedtls_sha512(src_str->x, src_str->len, output, 1), 0);
99a8e1175bSopenharmony_ci
100a8e1175bSopenharmony_ci    TEST_EQUAL(mbedtls_test_hexcmp(output, hash->x, 48, hash->len), 0);
101a8e1175bSopenharmony_ci}
102a8e1175bSopenharmony_ci/* END_CASE */
103a8e1175bSopenharmony_ci
104a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SHA512_C */
105a8e1175bSopenharmony_civoid mbedtls_sha512(data_t *src_str, data_t *hash)
106a8e1175bSopenharmony_ci{
107a8e1175bSopenharmony_ci    unsigned char output[129];
108a8e1175bSopenharmony_ci
109a8e1175bSopenharmony_ci    memset(output, 0x00, 129);
110a8e1175bSopenharmony_ci
111a8e1175bSopenharmony_ci
112a8e1175bSopenharmony_ci    TEST_EQUAL(mbedtls_sha512(src_str->x, src_str->len, output, 0), 0);
113a8e1175bSopenharmony_ci
114a8e1175bSopenharmony_ci    TEST_EQUAL(mbedtls_test_hexcmp(output, hash->x, 64, hash->len), 0);
115a8e1175bSopenharmony_ci}
116a8e1175bSopenharmony_ci/* END_CASE */
117a8e1175bSopenharmony_ci
118a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SHA1_C:MBEDTLS_SELF_TEST */
119a8e1175bSopenharmony_civoid sha1_selftest()
120a8e1175bSopenharmony_ci{
121a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_sha1_self_test(1) == 0);
122a8e1175bSopenharmony_ci}
123a8e1175bSopenharmony_ci/* END_CASE */
124a8e1175bSopenharmony_ci
125a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SHA224_C:MBEDTLS_SELF_TEST */
126a8e1175bSopenharmony_civoid sha224_selftest()
127a8e1175bSopenharmony_ci{
128a8e1175bSopenharmony_ci    TEST_EQUAL(mbedtls_sha224_self_test(1), 0);
129a8e1175bSopenharmony_ci}
130a8e1175bSopenharmony_ci/* END_CASE */
131a8e1175bSopenharmony_ci
132a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SHA256_C:MBEDTLS_SELF_TEST */
133a8e1175bSopenharmony_civoid sha256_selftest()
134a8e1175bSopenharmony_ci{
135a8e1175bSopenharmony_ci    TEST_EQUAL(mbedtls_sha256_self_test(1), 0);
136a8e1175bSopenharmony_ci}
137a8e1175bSopenharmony_ci/* END_CASE */
138a8e1175bSopenharmony_ci
139a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SHA384_C:MBEDTLS_SELF_TEST */
140a8e1175bSopenharmony_civoid sha384_selftest()
141a8e1175bSopenharmony_ci{
142a8e1175bSopenharmony_ci    TEST_EQUAL(mbedtls_sha384_self_test(1), 0);
143a8e1175bSopenharmony_ci}
144a8e1175bSopenharmony_ci/* END_CASE */
145a8e1175bSopenharmony_ci
146a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SHA512_C:MBEDTLS_SELF_TEST */
147a8e1175bSopenharmony_civoid sha512_selftest()
148a8e1175bSopenharmony_ci{
149a8e1175bSopenharmony_ci    TEST_EQUAL(mbedtls_sha512_self_test(1), 0);
150a8e1175bSopenharmony_ci}
151a8e1175bSopenharmony_ci/* END_CASE */
152a8e1175bSopenharmony_ci
153a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SHA3_C */
154a8e1175bSopenharmony_civoid mbedtls_sha3(int family, data_t *in, data_t *hash)
155a8e1175bSopenharmony_ci{
156a8e1175bSopenharmony_ci    unsigned char *output = NULL;
157a8e1175bSopenharmony_ci
158a8e1175bSopenharmony_ci    TEST_CALLOC(output, hash->len);
159a8e1175bSopenharmony_ci
160a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_sha3(family, in->x, in->len, output, hash->len) == 0);
161a8e1175bSopenharmony_ci
162a8e1175bSopenharmony_ci    TEST_MEMORY_COMPARE(output, hash->len, hash->x, hash->len);
163a8e1175bSopenharmony_ci
164a8e1175bSopenharmony_ciexit:
165a8e1175bSopenharmony_ci    mbedtls_free(output);
166a8e1175bSopenharmony_ci}
167a8e1175bSopenharmony_ci/* END_CASE */
168a8e1175bSopenharmony_ci
169a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SHA3_C */
170a8e1175bSopenharmony_civoid sha3_invalid_param()
171a8e1175bSopenharmony_ci{
172a8e1175bSopenharmony_ci    unsigned char output[32];
173a8e1175bSopenharmony_ci    mbedtls_sha3_context ctx;
174a8e1175bSopenharmony_ci
175a8e1175bSopenharmony_ci    mbedtls_sha3_init(&ctx);
176a8e1175bSopenharmony_ci    TEST_EQUAL(mbedtls_sha3_starts(&ctx, MBEDTLS_SHA3_NONE), MBEDTLS_ERR_SHA3_BAD_INPUT_DATA);
177a8e1175bSopenharmony_ci
178a8e1175bSopenharmony_ci    TEST_EQUAL(mbedtls_sha3_starts(&ctx, MBEDTLS_SHA3_256), 0);
179a8e1175bSopenharmony_ci    TEST_EQUAL(mbedtls_sha3_finish(&ctx, output, 0), MBEDTLS_ERR_SHA3_BAD_INPUT_DATA);
180a8e1175bSopenharmony_ci
181a8e1175bSopenharmony_ci    TEST_EQUAL(mbedtls_sha3_starts(&ctx, MBEDTLS_SHA3_256), 0);
182a8e1175bSopenharmony_ci    TEST_EQUAL(mbedtls_sha3_finish(&ctx, output, 31), MBEDTLS_ERR_SHA3_BAD_INPUT_DATA);
183a8e1175bSopenharmony_ci
184a8e1175bSopenharmony_ci    TEST_EQUAL(mbedtls_sha3_starts(&ctx, MBEDTLS_SHA3_256), 0);
185a8e1175bSopenharmony_ci    TEST_EQUAL(mbedtls_sha3_finish(&ctx, output, 32), 0);
186a8e1175bSopenharmony_ci
187a8e1175bSopenharmony_ciexit:
188a8e1175bSopenharmony_ci    return;
189a8e1175bSopenharmony_ci}
190a8e1175bSopenharmony_ci/* END_CASE */
191a8e1175bSopenharmony_ci
192a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SHA3_C */
193a8e1175bSopenharmony_civoid mbedtls_sha3_multi(int family, data_t *in, data_t *hash)
194a8e1175bSopenharmony_ci{
195a8e1175bSopenharmony_ci    unsigned char *output = NULL;
196a8e1175bSopenharmony_ci    mbedtls_sha3_context ctx;
197a8e1175bSopenharmony_ci    const unsigned int block_size = 256;
198a8e1175bSopenharmony_ci
199a8e1175bSopenharmony_ci    TEST_CALLOC(output, hash->len);
200a8e1175bSopenharmony_ci
201a8e1175bSopenharmony_ci    mbedtls_sha3_init(&ctx);
202a8e1175bSopenharmony_ci    mbedtls_sha3_starts(&ctx, family);
203a8e1175bSopenharmony_ci
204a8e1175bSopenharmony_ci    for (size_t l = 0; l < in->len; l += block_size) {
205a8e1175bSopenharmony_ci        TEST_ASSERT(mbedtls_sha3_update(&ctx, in->x + l, MIN(in->len - l, block_size)) == 0);
206a8e1175bSopenharmony_ci    }
207a8e1175bSopenharmony_ci
208a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_sha3_finish(&ctx, output, hash->len) == 0);
209a8e1175bSopenharmony_ci
210a8e1175bSopenharmony_ci    TEST_MEMORY_COMPARE(output, hash->len, hash->x, hash->len);
211a8e1175bSopenharmony_ci
212a8e1175bSopenharmony_ciexit:
213a8e1175bSopenharmony_ci    mbedtls_free(output);
214a8e1175bSopenharmony_ci}
215a8e1175bSopenharmony_ci/* END_CASE */
216a8e1175bSopenharmony_ci
217a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SHA3_C */
218a8e1175bSopenharmony_civoid sha3_streaming(int type, data_t *input)
219a8e1175bSopenharmony_ci{
220a8e1175bSopenharmony_ci    mbedtls_sha3_context ctx;
221a8e1175bSopenharmony_ci    unsigned char reference_hash[64];
222a8e1175bSopenharmony_ci    unsigned char hash[64];
223a8e1175bSopenharmony_ci    size_t chunk_size;
224a8e1175bSopenharmony_ci    size_t hash_length = (type == MBEDTLS_SHA3_224 ? 28 :
225a8e1175bSopenharmony_ci                          type == MBEDTLS_SHA3_256 ? 32 :
226a8e1175bSopenharmony_ci                          type == MBEDTLS_SHA3_384 ? 48 :
227a8e1175bSopenharmony_ci                          type == MBEDTLS_SHA3_512 ? 64 :
228a8e1175bSopenharmony_ci                          0);
229a8e1175bSopenharmony_ci
230a8e1175bSopenharmony_ci    mbedtls_sha3_init(&ctx);
231a8e1175bSopenharmony_ci    memset(reference_hash, 0, sizeof(reference_hash));
232a8e1175bSopenharmony_ci    memset(hash, 0, sizeof(hash));
233a8e1175bSopenharmony_ci    TEST_ASSERT(hash_length != 0);
234a8e1175bSopenharmony_ci
235a8e1175bSopenharmony_ci    /* Generate a reference hash */
236a8e1175bSopenharmony_ci    mbedtls_sha3(type, input->x, input->len, reference_hash, hash_length);
237a8e1175bSopenharmony_ci
238a8e1175bSopenharmony_ci    /* Repeat each test with increasingly-sized data chunks
239a8e1175bSopenharmony_ci     * E.g. start by processing bytes individual bytes, then 2-byte chunks,
240a8e1175bSopenharmony_ci     * then 3-byte chunks, and so on...
241a8e1175bSopenharmony_ci     * At each test ensure that the same hash is generated.
242a8e1175bSopenharmony_ci     */
243a8e1175bSopenharmony_ci    for (chunk_size = 1; chunk_size < input->len; chunk_size++) {
244a8e1175bSopenharmony_ci        size_t i;
245a8e1175bSopenharmony_ci        size_t remaining = input->len;
246a8e1175bSopenharmony_ci
247a8e1175bSopenharmony_ci        mbedtls_sha3_init(&ctx);
248a8e1175bSopenharmony_ci        TEST_ASSERT(mbedtls_sha3_starts(&ctx, type) == 0);
249a8e1175bSopenharmony_ci
250a8e1175bSopenharmony_ci        for (i = 0; i < input->len; i += chunk_size) {
251a8e1175bSopenharmony_ci            size_t len = remaining >= chunk_size ? chunk_size : remaining;
252a8e1175bSopenharmony_ci            TEST_ASSERT(mbedtls_sha3_update(&ctx, input->x + i, len) == 0);
253a8e1175bSopenharmony_ci            remaining -= len;
254a8e1175bSopenharmony_ci        }
255a8e1175bSopenharmony_ci
256a8e1175bSopenharmony_ci        mbedtls_sha3_finish(&ctx, hash, hash_length);
257a8e1175bSopenharmony_ci        mbedtls_sha3_free(&ctx);
258a8e1175bSopenharmony_ci
259a8e1175bSopenharmony_ci        TEST_MEMORY_COMPARE(hash, hash_length, reference_hash, hash_length);
260a8e1175bSopenharmony_ci    }
261a8e1175bSopenharmony_ci
262a8e1175bSopenharmony_ciexit:
263a8e1175bSopenharmony_ci    mbedtls_sha3_free(&ctx);
264a8e1175bSopenharmony_ci}
265a8e1175bSopenharmony_ci/* END_CASE */
266a8e1175bSopenharmony_ci
267a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SHA3_C */
268a8e1175bSopenharmony_civoid sha3_reuse(data_t *input1, data_t *hash1,
269a8e1175bSopenharmony_ci                data_t *input2, data_t *hash2)
270a8e1175bSopenharmony_ci{
271a8e1175bSopenharmony_ci    unsigned char output[64];
272a8e1175bSopenharmony_ci    mbedtls_sha3_context ctx;
273a8e1175bSopenharmony_ci    mbedtls_sha3_id type1, type2;
274a8e1175bSopenharmony_ci
275a8e1175bSopenharmony_ci    mbedtls_sha3_init(&ctx);
276a8e1175bSopenharmony_ci    switch (hash1->len) {
277a8e1175bSopenharmony_ci        case 28: type1 = MBEDTLS_SHA3_224; break;
278a8e1175bSopenharmony_ci        case 32: type1 = MBEDTLS_SHA3_256; break;
279a8e1175bSopenharmony_ci        case 48: type1 = MBEDTLS_SHA3_384; break;
280a8e1175bSopenharmony_ci        case 64: type1 = MBEDTLS_SHA3_512; break;
281a8e1175bSopenharmony_ci        default: TEST_FAIL("hash1->len validity"); break;
282a8e1175bSopenharmony_ci    }
283a8e1175bSopenharmony_ci    switch (hash2->len) {
284a8e1175bSopenharmony_ci        case 28: type2 = MBEDTLS_SHA3_224; break;
285a8e1175bSopenharmony_ci        case 32: type2 = MBEDTLS_SHA3_256; break;
286a8e1175bSopenharmony_ci        case 48: type2 = MBEDTLS_SHA3_384; break;
287a8e1175bSopenharmony_ci        case 64: type2 = MBEDTLS_SHA3_512; break;
288a8e1175bSopenharmony_ci        default: TEST_FAIL("hash2->len validity"); break;
289a8e1175bSopenharmony_ci    }
290a8e1175bSopenharmony_ci
291a8e1175bSopenharmony_ci    /* Round 1 */
292a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_sha3_starts(&ctx, type1) == 0);
293a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_sha3_update(&ctx, input1->x, input1->len) == 0);
294a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_sha3_finish(&ctx, output, sizeof(output)) == 0);
295a8e1175bSopenharmony_ci    TEST_MEMORY_COMPARE(output, hash1->len, hash1->x, hash1->len);
296a8e1175bSopenharmony_ci
297a8e1175bSopenharmony_ci    /* Round 2 */
298a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_sha3_starts(&ctx, type2) == 0);
299a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_sha3_update(&ctx, input2->x, input2->len) == 0);
300a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_sha3_finish(&ctx, output, sizeof(output)) == 0);
301a8e1175bSopenharmony_ci    TEST_MEMORY_COMPARE(output, hash2->len, hash2->x, hash2->len);
302a8e1175bSopenharmony_ci
303a8e1175bSopenharmony_ciexit:
304a8e1175bSopenharmony_ci    mbedtls_sha3_free(&ctx);
305a8e1175bSopenharmony_ci}
306a8e1175bSopenharmony_ci/* END_CASE */
307a8e1175bSopenharmony_ci
308a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SHA3_C:MBEDTLS_SELF_TEST */
309a8e1175bSopenharmony_civoid sha3_selftest()
310a8e1175bSopenharmony_ci{
311a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_sha3_self_test(0) == 0);
312a8e1175bSopenharmony_ci}
313a8e1175bSopenharmony_ci/* END_CASE */
314