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