/* BEGIN_HEADER */
#include "../library/common.h"

void fill_arrays(unsigned char *a, unsigned char *b, unsigned char *r1, unsigned char *r2, size_t n)
{
    for (size_t i = 0; i < n; i++) {
        a[i]  = (unsigned char) i * 3;
        b[i]  = (unsigned char) i * 3 + 1;
        r1[i] = (unsigned char) i * 3 + 2;
        r2[i] = r1[i];
    }
}
/* END_HEADER */

/* BEGIN_CASE */
void mbedtls_xor(int len)
{
    size_t n = (size_t) len;
    unsigned char *a = NULL, *b = NULL, *r1 = NULL, *r2 = NULL;
    ASSERT_ALLOC(a, n + 1);
    ASSERT_ALLOC(b, n + 1);
    ASSERT_ALLOC(r1, n + 1);
    ASSERT_ALLOC(r2, n + 1);

    /* Test non-overlapping */
    fill_arrays(a, b, r1, r2, n);
    for (size_t i = 0; i < n; i++) {
        r1[i] = a[i] ^ b[i];
    }
    mbedtls_xor(r2, a, b, n);
    ASSERT_COMPARE(r1, n, r2, n);

    /* Test r == a */
    fill_arrays(a, b, r1, r2, n);
    for (size_t i = 0; i < n; i++) {
        r1[i] = r1[i] ^ b[i];
    }
    mbedtls_xor(r2, r2, b, n);
    ASSERT_COMPARE(r1, n, r2, n);

    /* Test r == b */
    fill_arrays(a, b, r1, r2, n);
    for (size_t i = 0; i < n; i++) {
        r1[i] = a[i] ^ r1[i];
    }
    mbedtls_xor(r2, a, r2, n);
    ASSERT_COMPARE(r1, n, r2, n);

    /* Test a == b */
    fill_arrays(a, b, r1, r2, n);
    for (size_t i = 0; i < n; i++) {
        r1[i] = a[i] ^ a[i];
    }
    mbedtls_xor(r2, a, a, n);
    ASSERT_COMPARE(r1, n, r2, n);

    /* Test a == b == r */
    fill_arrays(a, b, r1, r2, n);
    for (size_t i = 0; i < n; i++) {
        r1[i] = r1[i] ^ r1[i];
    }
    mbedtls_xor(r2, r2, r2, n);
    ASSERT_COMPARE(r1, n, r2, n);

    /* Test non-word-aligned buffers, for all combinations of alignedness */
    for (int i = 0; i < 7; i++) {
        int r_off = i & 1, a_off = (i & 2) >> 1, b_off = (i & 4) >> 2;
        fill_arrays(a, b, r1, r2, n + 1);

        for (size_t j = 0; j < n; j++) {
            r1[j + r_off] = a[j + a_off] ^ b[j + b_off];
        }
        mbedtls_xor(r2 + r_off, a + a_off, b + b_off, n);
        ASSERT_COMPARE(r1 + r_off, n, r2 + r_off, n);
    }
exit:
    mbedtls_free(a);
    mbedtls_free(b);
    mbedtls_free(r1);
    mbedtls_free(r2);
}
/* END_CASE */
