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