1a8e1175bSopenharmony_ci/* BEGIN_HEADER */
2a8e1175bSopenharmony_ci#include "mbedtls/chachapoly.h"
3a8e1175bSopenharmony_ci/* END_HEADER */
4a8e1175bSopenharmony_ci
5a8e1175bSopenharmony_ci/* BEGIN_DEPENDENCIES
6a8e1175bSopenharmony_ci * depends_on:MBEDTLS_CHACHAPOLY_C
7a8e1175bSopenharmony_ci * END_DEPENDENCIES
8a8e1175bSopenharmony_ci */
9a8e1175bSopenharmony_ci
10a8e1175bSopenharmony_ci/* BEGIN_CASE */
11a8e1175bSopenharmony_civoid mbedtls_chachapoly_enc(data_t *key_str,
12a8e1175bSopenharmony_ci                            data_t *nonce_str,
13a8e1175bSopenharmony_ci                            data_t *aad_str,
14a8e1175bSopenharmony_ci                            data_t *input_str,
15a8e1175bSopenharmony_ci                            data_t *output_str,
16a8e1175bSopenharmony_ci                            data_t *mac_str)
17a8e1175bSopenharmony_ci{
18a8e1175bSopenharmony_ci    unsigned char output[265];
19a8e1175bSopenharmony_ci    unsigned char mac[16]; /* size set by the standard */
20a8e1175bSopenharmony_ci    mbedtls_chachapoly_context ctx;
21a8e1175bSopenharmony_ci
22a8e1175bSopenharmony_ci    TEST_ASSERT(key_str->len   == 32);
23a8e1175bSopenharmony_ci    TEST_ASSERT(nonce_str->len == 12);
24a8e1175bSopenharmony_ci    TEST_ASSERT(mac_str->len   == 16);
25a8e1175bSopenharmony_ci
26a8e1175bSopenharmony_ci    mbedtls_chachapoly_init(&ctx);
27a8e1175bSopenharmony_ci
28a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_chachapoly_setkey(&ctx, key_str->x) == 0);
29a8e1175bSopenharmony_ci
30a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_chachapoly_encrypt_and_tag(&ctx,
31a8e1175bSopenharmony_ci                                                   input_str->len, nonce_str->x,
32a8e1175bSopenharmony_ci                                                   aad_str->x, aad_str->len,
33a8e1175bSopenharmony_ci                                                   input_str->x, output, mac) == 0);
34a8e1175bSopenharmony_ci
35a8e1175bSopenharmony_ci    TEST_ASSERT(memcmp(output_str->x, output, output_str->len) == 0);
36a8e1175bSopenharmony_ci    TEST_ASSERT(memcmp(mac_str->x, mac, 16U) == 0);
37a8e1175bSopenharmony_ci
38a8e1175bSopenharmony_ciexit:
39a8e1175bSopenharmony_ci    mbedtls_chachapoly_free(&ctx);
40a8e1175bSopenharmony_ci}
41a8e1175bSopenharmony_ci/* END_CASE */
42a8e1175bSopenharmony_ci
43a8e1175bSopenharmony_ci/* BEGIN_CASE */
44a8e1175bSopenharmony_civoid mbedtls_chachapoly_dec(data_t *key_str,
45a8e1175bSopenharmony_ci                            data_t *nonce_str,
46a8e1175bSopenharmony_ci                            data_t *aad_str,
47a8e1175bSopenharmony_ci                            data_t *input_str,
48a8e1175bSopenharmony_ci                            data_t *output_str,
49a8e1175bSopenharmony_ci                            data_t *mac_str,
50a8e1175bSopenharmony_ci                            int ret_exp)
51a8e1175bSopenharmony_ci{
52a8e1175bSopenharmony_ci    unsigned char output[265];
53a8e1175bSopenharmony_ci    int ret;
54a8e1175bSopenharmony_ci    mbedtls_chachapoly_context ctx;
55a8e1175bSopenharmony_ci
56a8e1175bSopenharmony_ci    TEST_ASSERT(key_str->len   == 32);
57a8e1175bSopenharmony_ci    TEST_ASSERT(nonce_str->len == 12);
58a8e1175bSopenharmony_ci    TEST_ASSERT(mac_str->len   == 16);
59a8e1175bSopenharmony_ci
60a8e1175bSopenharmony_ci    mbedtls_chachapoly_init(&ctx);
61a8e1175bSopenharmony_ci
62a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_chachapoly_setkey(&ctx, key_str->x) == 0);
63a8e1175bSopenharmony_ci
64a8e1175bSopenharmony_ci    ret = mbedtls_chachapoly_auth_decrypt(&ctx,
65a8e1175bSopenharmony_ci                                          input_str->len, nonce_str->x,
66a8e1175bSopenharmony_ci                                          aad_str->x, aad_str->len,
67a8e1175bSopenharmony_ci                                          mac_str->x, input_str->x, output);
68a8e1175bSopenharmony_ci
69a8e1175bSopenharmony_ci    TEST_ASSERT(ret == ret_exp);
70a8e1175bSopenharmony_ci    if (ret_exp == 0) {
71a8e1175bSopenharmony_ci        TEST_ASSERT(memcmp(output_str->x, output, output_str->len) == 0);
72a8e1175bSopenharmony_ci    }
73a8e1175bSopenharmony_ci
74a8e1175bSopenharmony_ciexit:
75a8e1175bSopenharmony_ci    mbedtls_chachapoly_free(&ctx);
76a8e1175bSopenharmony_ci}
77a8e1175bSopenharmony_ci/* END_CASE */
78a8e1175bSopenharmony_ci
79a8e1175bSopenharmony_ci/* BEGIN_CASE */
80a8e1175bSopenharmony_civoid chachapoly_state()
81a8e1175bSopenharmony_ci{
82a8e1175bSopenharmony_ci    unsigned char key[32];
83a8e1175bSopenharmony_ci    unsigned char nonce[12];
84a8e1175bSopenharmony_ci    unsigned char aad[1];
85a8e1175bSopenharmony_ci    unsigned char input[1];
86a8e1175bSopenharmony_ci    unsigned char output[1];
87a8e1175bSopenharmony_ci    unsigned char mac[16];
88a8e1175bSopenharmony_ci    size_t input_len = sizeof(input);
89a8e1175bSopenharmony_ci    size_t aad_len = sizeof(aad);
90a8e1175bSopenharmony_ci    mbedtls_chachapoly_context ctx;
91a8e1175bSopenharmony_ci
92a8e1175bSopenharmony_ci    memset(key,    0x00, sizeof(key));
93a8e1175bSopenharmony_ci    memset(nonce,  0x00, sizeof(nonce));
94a8e1175bSopenharmony_ci    memset(aad,    0x00, sizeof(aad));
95a8e1175bSopenharmony_ci    memset(input,  0x00, sizeof(input));
96a8e1175bSopenharmony_ci    memset(output, 0x00, sizeof(output));
97a8e1175bSopenharmony_ci    memset(mac,    0x00, sizeof(mac));
98a8e1175bSopenharmony_ci
99a8e1175bSopenharmony_ci    /* Initial state: finish, update, update_aad forbidden */
100a8e1175bSopenharmony_ci    mbedtls_chachapoly_init(&ctx);
101a8e1175bSopenharmony_ci
102a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_chachapoly_finish(&ctx, mac)
103a8e1175bSopenharmony_ci                == MBEDTLS_ERR_CHACHAPOLY_BAD_STATE);
104a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_chachapoly_update(&ctx, input_len, input, output)
105a8e1175bSopenharmony_ci                == MBEDTLS_ERR_CHACHAPOLY_BAD_STATE);
106a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_chachapoly_update_aad(&ctx, aad, aad_len)
107a8e1175bSopenharmony_ci                == MBEDTLS_ERR_CHACHAPOLY_BAD_STATE);
108a8e1175bSopenharmony_ci
109a8e1175bSopenharmony_ci    /* Still initial state: finish, update, update_aad forbidden */
110a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_chachapoly_setkey(&ctx, key)
111a8e1175bSopenharmony_ci                == 0);
112a8e1175bSopenharmony_ci
113a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_chachapoly_finish(&ctx, mac)
114a8e1175bSopenharmony_ci                == MBEDTLS_ERR_CHACHAPOLY_BAD_STATE);
115a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_chachapoly_update(&ctx, input_len, input, output)
116a8e1175bSopenharmony_ci                == MBEDTLS_ERR_CHACHAPOLY_BAD_STATE);
117a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_chachapoly_update_aad(&ctx, aad, aad_len)
118a8e1175bSopenharmony_ci                == MBEDTLS_ERR_CHACHAPOLY_BAD_STATE);
119a8e1175bSopenharmony_ci
120a8e1175bSopenharmony_ci    /* Starts -> finish OK */
121a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_chachapoly_starts(&ctx, nonce, MBEDTLS_CHACHAPOLY_ENCRYPT)
122a8e1175bSopenharmony_ci                == 0);
123a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_chachapoly_finish(&ctx, mac)
124a8e1175bSopenharmony_ci                == 0);
125a8e1175bSopenharmony_ci
126a8e1175bSopenharmony_ci    /* After finish: update, update_aad forbidden */
127a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_chachapoly_update(&ctx, input_len, input, output)
128a8e1175bSopenharmony_ci                == MBEDTLS_ERR_CHACHAPOLY_BAD_STATE);
129a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_chachapoly_update_aad(&ctx, aad, aad_len)
130a8e1175bSopenharmony_ci                == MBEDTLS_ERR_CHACHAPOLY_BAD_STATE);
131a8e1175bSopenharmony_ci
132a8e1175bSopenharmony_ci    /* Starts -> update* OK */
133a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_chachapoly_starts(&ctx, nonce, MBEDTLS_CHACHAPOLY_ENCRYPT)
134a8e1175bSopenharmony_ci                == 0);
135a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_chachapoly_update(&ctx, input_len, input, output)
136a8e1175bSopenharmony_ci                == 0);
137a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_chachapoly_update(&ctx, input_len, input, output)
138a8e1175bSopenharmony_ci                == 0);
139a8e1175bSopenharmony_ci
140a8e1175bSopenharmony_ci    /* After update: update_aad forbidden */
141a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_chachapoly_update_aad(&ctx, aad, aad_len)
142a8e1175bSopenharmony_ci                == MBEDTLS_ERR_CHACHAPOLY_BAD_STATE);
143a8e1175bSopenharmony_ci
144a8e1175bSopenharmony_ci    /* Starts -> update_aad* -> finish OK */
145a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_chachapoly_starts(&ctx, nonce, MBEDTLS_CHACHAPOLY_ENCRYPT)
146a8e1175bSopenharmony_ci                == 0);
147a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_chachapoly_update_aad(&ctx, aad, aad_len)
148a8e1175bSopenharmony_ci                == 0);
149a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_chachapoly_update_aad(&ctx, aad, aad_len)
150a8e1175bSopenharmony_ci                == 0);
151a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_chachapoly_finish(&ctx, mac)
152a8e1175bSopenharmony_ci                == 0);
153a8e1175bSopenharmony_ci
154a8e1175bSopenharmony_ciexit:
155a8e1175bSopenharmony_ci    mbedtls_chachapoly_free(&ctx);
156a8e1175bSopenharmony_ci}
157a8e1175bSopenharmony_ci/* END_CASE */
158a8e1175bSopenharmony_ci
159a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SELF_TEST */
160a8e1175bSopenharmony_civoid chachapoly_selftest()
161a8e1175bSopenharmony_ci{
162a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_chachapoly_self_test(1) == 0);
163a8e1175bSopenharmony_ci}
164a8e1175bSopenharmony_ci/* END_CASE */
165