|  | /* 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 */ |