1a8e1175bSopenharmony_ci/* BEGIN_HEADER */
2a8e1175bSopenharmony_ci#include "common.h"
3a8e1175bSopenharmony_ci
4a8e1175bSopenharmony_civoid fill_arrays(unsigned char *a, unsigned char *b, unsigned char *r1, unsigned char *r2, size_t n)
5a8e1175bSopenharmony_ci{
6a8e1175bSopenharmony_ci    for (size_t i = 0; i < n; i++) {
7a8e1175bSopenharmony_ci        a[i]  = (unsigned char) i * 3;
8a8e1175bSopenharmony_ci        b[i]  = (unsigned char) i * 3 + 1;
9a8e1175bSopenharmony_ci        r1[i] = (unsigned char) i * 3 + 2;
10a8e1175bSopenharmony_ci        r2[i] = r1[i];
11a8e1175bSopenharmony_ci    }
12a8e1175bSopenharmony_ci}
13a8e1175bSopenharmony_ci/* END_HEADER */
14a8e1175bSopenharmony_ci
15a8e1175bSopenharmony_ci/* BEGIN_CASE */
16a8e1175bSopenharmony_civoid mbedtls_xor(int len)
17a8e1175bSopenharmony_ci{
18a8e1175bSopenharmony_ci    size_t n = (size_t) len;
19a8e1175bSopenharmony_ci    unsigned char *a = NULL, *b = NULL, *r1 = NULL, *r2 = NULL;
20a8e1175bSopenharmony_ci    TEST_CALLOC(a, n + 1);
21a8e1175bSopenharmony_ci    TEST_CALLOC(b, n + 1);
22a8e1175bSopenharmony_ci    TEST_CALLOC(r1, n + 1);
23a8e1175bSopenharmony_ci    TEST_CALLOC(r2, n + 1);
24a8e1175bSopenharmony_ci
25a8e1175bSopenharmony_ci    /* Test non-overlapping */
26a8e1175bSopenharmony_ci    fill_arrays(a, b, r1, r2, n);
27a8e1175bSopenharmony_ci    for (size_t i = 0; i < n; i++) {
28a8e1175bSopenharmony_ci        r1[i] = a[i] ^ b[i];
29a8e1175bSopenharmony_ci    }
30a8e1175bSopenharmony_ci    mbedtls_xor(r2, a, b, n);
31a8e1175bSopenharmony_ci    TEST_MEMORY_COMPARE(r1, n, r2, n);
32a8e1175bSopenharmony_ci
33a8e1175bSopenharmony_ci    /* Test r == a */
34a8e1175bSopenharmony_ci    fill_arrays(a, b, r1, r2, n);
35a8e1175bSopenharmony_ci    for (size_t i = 0; i < n; i++) {
36a8e1175bSopenharmony_ci        r1[i] = r1[i] ^ b[i];
37a8e1175bSopenharmony_ci    }
38a8e1175bSopenharmony_ci    mbedtls_xor(r2, r2, b, n);
39a8e1175bSopenharmony_ci    TEST_MEMORY_COMPARE(r1, n, r2, n);
40a8e1175bSopenharmony_ci
41a8e1175bSopenharmony_ci    /* Test r == b */
42a8e1175bSopenharmony_ci    fill_arrays(a, b, r1, r2, n);
43a8e1175bSopenharmony_ci    for (size_t i = 0; i < n; i++) {
44a8e1175bSopenharmony_ci        r1[i] = a[i] ^ r1[i];
45a8e1175bSopenharmony_ci    }
46a8e1175bSopenharmony_ci    mbedtls_xor(r2, a, r2, n);
47a8e1175bSopenharmony_ci    TEST_MEMORY_COMPARE(r1, n, r2, n);
48a8e1175bSopenharmony_ci
49a8e1175bSopenharmony_ci    /* Test a == b */
50a8e1175bSopenharmony_ci    fill_arrays(a, b, r1, r2, n);
51a8e1175bSopenharmony_ci    for (size_t i = 0; i < n; i++) {
52a8e1175bSopenharmony_ci        r1[i] = a[i] ^ a[i];
53a8e1175bSopenharmony_ci    }
54a8e1175bSopenharmony_ci    mbedtls_xor(r2, a, a, n);
55a8e1175bSopenharmony_ci    TEST_MEMORY_COMPARE(r1, n, r2, n);
56a8e1175bSopenharmony_ci
57a8e1175bSopenharmony_ci    /* Test a == b == r */
58a8e1175bSopenharmony_ci    fill_arrays(a, b, r1, r2, n);
59a8e1175bSopenharmony_ci    for (size_t i = 0; i < n; i++) {
60a8e1175bSopenharmony_ci        r1[i] = r1[i] ^ r1[i];
61a8e1175bSopenharmony_ci    }
62a8e1175bSopenharmony_ci    mbedtls_xor(r2, r2, r2, n);
63a8e1175bSopenharmony_ci    TEST_MEMORY_COMPARE(r1, n, r2, n);
64a8e1175bSopenharmony_ci
65a8e1175bSopenharmony_ci    /* Test non-word-aligned buffers, for all combinations of alignedness */
66a8e1175bSopenharmony_ci    for (int i = 0; i < 7; i++) {
67a8e1175bSopenharmony_ci        int r_off = i & 1, a_off = (i & 2) >> 1, b_off = (i & 4) >> 2;
68a8e1175bSopenharmony_ci        fill_arrays(a, b, r1, r2, n + 1);
69a8e1175bSopenharmony_ci
70a8e1175bSopenharmony_ci        for (size_t j = 0; j < n; j++) {
71a8e1175bSopenharmony_ci            r1[j + r_off] = a[j + a_off] ^ b[j + b_off];
72a8e1175bSopenharmony_ci        }
73a8e1175bSopenharmony_ci        mbedtls_xor(r2 + r_off, a + a_off, b + b_off, n);
74a8e1175bSopenharmony_ci        TEST_MEMORY_COMPARE(r1 + r_off, n, r2 + r_off, n);
75a8e1175bSopenharmony_ci    }
76a8e1175bSopenharmony_ciexit:
77a8e1175bSopenharmony_ci    mbedtls_free(a);
78a8e1175bSopenharmony_ci    mbedtls_free(b);
79a8e1175bSopenharmony_ci    mbedtls_free(r1);
80a8e1175bSopenharmony_ci    mbedtls_free(r2);
81a8e1175bSopenharmony_ci}
82a8e1175bSopenharmony_ci/* END_CASE */
83