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