1a8e1175bSopenharmony_ci/* BEGIN_HEADER */
2a8e1175bSopenharmony_ci#include "mbedtls/poly1305.h"
3a8e1175bSopenharmony_ci#include <stddef.h>
4a8e1175bSopenharmony_ci/* END_HEADER */
5a8e1175bSopenharmony_ci
6a8e1175bSopenharmony_ci/* BEGIN_DEPENDENCIES
7a8e1175bSopenharmony_ci * depends_on:MBEDTLS_POLY1305_C
8a8e1175bSopenharmony_ci * END_DEPENDENCIES
9a8e1175bSopenharmony_ci */
10a8e1175bSopenharmony_ci
11a8e1175bSopenharmony_ci/* BEGIN_CASE */
12a8e1175bSopenharmony_civoid mbedtls_poly1305(data_t *key, data_t *expected_mac, data_t *src_str)
13a8e1175bSopenharmony_ci{
14a8e1175bSopenharmony_ci    unsigned char mac[16]; /* size set by the standard */
15a8e1175bSopenharmony_ci    mbedtls_poly1305_context ctx;
16a8e1175bSopenharmony_ci
17a8e1175bSopenharmony_ci    memset(mac, 0x00, sizeof(mac));
18a8e1175bSopenharmony_ci
19a8e1175bSopenharmony_ci    /*
20a8e1175bSopenharmony_ci     * Test the integrated API
21a8e1175bSopenharmony_ci     */
22a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_poly1305_mac(key->x, src_str->x,
23a8e1175bSopenharmony_ci                                     src_str->len, mac) == 0);
24a8e1175bSopenharmony_ci
25a8e1175bSopenharmony_ci    TEST_MEMORY_COMPARE(mac, expected_mac->len,
26a8e1175bSopenharmony_ci                        expected_mac->x, expected_mac->len);
27a8e1175bSopenharmony_ci
28a8e1175bSopenharmony_ci    /*
29a8e1175bSopenharmony_ci     * Test the streaming API
30a8e1175bSopenharmony_ci     */
31a8e1175bSopenharmony_ci    mbedtls_poly1305_init(&ctx);
32a8e1175bSopenharmony_ci
33a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_poly1305_starts(&ctx, key->x) == 0);
34a8e1175bSopenharmony_ci
35a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_poly1305_update(&ctx, src_str->x, src_str->len) == 0);
36a8e1175bSopenharmony_ci
37a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_poly1305_finish(&ctx, mac) == 0);
38a8e1175bSopenharmony_ci
39a8e1175bSopenharmony_ci    TEST_MEMORY_COMPARE(mac, expected_mac->len,
40a8e1175bSopenharmony_ci                        expected_mac->x, expected_mac->len);
41a8e1175bSopenharmony_ci
42a8e1175bSopenharmony_ci    /*
43a8e1175bSopenharmony_ci     * Test the streaming API again, piecewise
44a8e1175bSopenharmony_ci     */
45a8e1175bSopenharmony_ci
46a8e1175bSopenharmony_ci    /* Don't free/init the context, in order to test that starts() does the
47a8e1175bSopenharmony_ci     * right thing. */
48a8e1175bSopenharmony_ci    if (src_str->len >= 1) {
49a8e1175bSopenharmony_ci        TEST_ASSERT(mbedtls_poly1305_starts(&ctx, key->x) == 0);
50a8e1175bSopenharmony_ci
51a8e1175bSopenharmony_ci        TEST_ASSERT(mbedtls_poly1305_update(&ctx, src_str->x, 1) == 0);
52a8e1175bSopenharmony_ci        TEST_ASSERT(mbedtls_poly1305_update(&ctx, src_str->x + 1, src_str->len - 1) == 0);
53a8e1175bSopenharmony_ci
54a8e1175bSopenharmony_ci        TEST_ASSERT(mbedtls_poly1305_finish(&ctx, mac) == 0);
55a8e1175bSopenharmony_ci
56a8e1175bSopenharmony_ci        TEST_MEMORY_COMPARE(mac, expected_mac->len,
57a8e1175bSopenharmony_ci                            expected_mac->x, expected_mac->len);
58a8e1175bSopenharmony_ci    }
59a8e1175bSopenharmony_ci
60a8e1175bSopenharmony_ci    /*
61a8e1175bSopenharmony_ci     * Again with more pieces
62a8e1175bSopenharmony_ci     */
63a8e1175bSopenharmony_ci    if (src_str->len >= 2) {
64a8e1175bSopenharmony_ci        TEST_ASSERT(mbedtls_poly1305_starts(&ctx, key->x) == 0);
65a8e1175bSopenharmony_ci
66a8e1175bSopenharmony_ci        TEST_ASSERT(mbedtls_poly1305_update(&ctx, src_str->x, 1) == 0);
67a8e1175bSopenharmony_ci        TEST_ASSERT(mbedtls_poly1305_update(&ctx, src_str->x + 1, 1) == 0);
68a8e1175bSopenharmony_ci        TEST_ASSERT(mbedtls_poly1305_update(&ctx, src_str->x + 2, src_str->len - 2) == 0);
69a8e1175bSopenharmony_ci
70a8e1175bSopenharmony_ci        TEST_ASSERT(mbedtls_poly1305_finish(&ctx, mac) == 0);
71a8e1175bSopenharmony_ci
72a8e1175bSopenharmony_ci        TEST_MEMORY_COMPARE(mac, expected_mac->len,
73a8e1175bSopenharmony_ci                            expected_mac->x, expected_mac->len);
74a8e1175bSopenharmony_ci    }
75a8e1175bSopenharmony_ci
76a8e1175bSopenharmony_ci    mbedtls_poly1305_free(&ctx);
77a8e1175bSopenharmony_ci}
78a8e1175bSopenharmony_ci/* END_CASE */
79a8e1175bSopenharmony_ci
80a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SELF_TEST */
81a8e1175bSopenharmony_civoid poly1305_selftest()
82a8e1175bSopenharmony_ci{
83a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_poly1305_self_test(1) == 0);
84a8e1175bSopenharmony_ci}
85a8e1175bSopenharmony_ci/* END_CASE */
86