blob: 747def345af10b83d1b40cd814e079ff2b32206b [file] [log] [blame]
Dave Rodgman4413b662022-11-22 17:31:50 +00001/* BEGIN_HEADER */
2#include "../library/common.h"
3
Gilles Peskine449bd832023-01-11 14:50:10 +01004void fill_arrays(unsigned char *a, unsigned char *b, unsigned char *r1, unsigned char *r2, size_t n)
Dave Rodgman4413b662022-11-22 17:31:50 +00005{
Gilles Peskine449bd832023-01-11 14:50:10 +01006 for (size_t i = 0; i < n; i++) {
Dave Rodgman4413b662022-11-22 17:31:50 +00007 a[i] = (unsigned char) i * 3;
8 b[i] = (unsigned char) i * 3 + 1;
9 r1[i] = (unsigned char) i * 3 + 2;
10 r2[i] = r1[i];
11 }
12}
13/* END_HEADER */
14
15/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +010016void mbedtls_xor(int len)
Dave Rodgman4413b662022-11-22 17:31:50 +000017{
18 size_t n = (size_t) len;
19 unsigned char *a = NULL, *b = NULL, *r1 = NULL, *r2 = NULL;
Tom Cosgrove05b2a872023-07-21 11:31:13 +010020 TEST_CALLOC(a, n + 1);
21 TEST_CALLOC(b, n + 1);
22 TEST_CALLOC(r1, n + 1);
23 TEST_CALLOC(r2, n + 1);
Dave Rodgman4413b662022-11-22 17:31:50 +000024
25 /* Test non-overlapping */
Gilles Peskine449bd832023-01-11 14:50:10 +010026 fill_arrays(a, b, r1, r2, n);
27 for (size_t i = 0; i < n; i++) {
Dave Rodgman4413b662022-11-22 17:31:50 +000028 r1[i] = a[i] ^ b[i];
29 }
Gilles Peskine449bd832023-01-11 14:50:10 +010030 mbedtls_xor(r2, a, b, n);
Tom Cosgrove65cd8512023-07-20 16:46:01 +010031 TEST_BUFFERS_EQUAL(r1, n, r2, n);
Dave Rodgman4413b662022-11-22 17:31:50 +000032
33 /* Test r == a */
Gilles Peskine449bd832023-01-11 14:50:10 +010034 fill_arrays(a, b, r1, r2, n);
35 for (size_t i = 0; i < n; i++) {
Dave Rodgman4413b662022-11-22 17:31:50 +000036 r1[i] = r1[i] ^ b[i];
37 }
Gilles Peskine449bd832023-01-11 14:50:10 +010038 mbedtls_xor(r2, r2, b, n);
Tom Cosgrove65cd8512023-07-20 16:46:01 +010039 TEST_BUFFERS_EQUAL(r1, n, r2, n);
Dave Rodgman4413b662022-11-22 17:31:50 +000040
41 /* Test r == b */
Gilles Peskine449bd832023-01-11 14:50:10 +010042 fill_arrays(a, b, r1, r2, n);
43 for (size_t i = 0; i < n; i++) {
Dave Rodgman4413b662022-11-22 17:31:50 +000044 r1[i] = a[i] ^ r1[i];
45 }
Gilles Peskine449bd832023-01-11 14:50:10 +010046 mbedtls_xor(r2, a, r2, n);
Tom Cosgrove65cd8512023-07-20 16:46:01 +010047 TEST_BUFFERS_EQUAL(r1, n, r2, n);
Dave Rodgman4413b662022-11-22 17:31:50 +000048
49 /* Test a == b */
Gilles Peskine449bd832023-01-11 14:50:10 +010050 fill_arrays(a, b, r1, r2, n);
51 for (size_t i = 0; i < n; i++) {
Dave Rodgman4413b662022-11-22 17:31:50 +000052 r1[i] = a[i] ^ a[i];
53 }
Gilles Peskine449bd832023-01-11 14:50:10 +010054 mbedtls_xor(r2, a, a, n);
Tom Cosgrove65cd8512023-07-20 16:46:01 +010055 TEST_BUFFERS_EQUAL(r1, n, r2, n);
Dave Rodgman4413b662022-11-22 17:31:50 +000056
57 /* Test a == b == r */
Gilles Peskine449bd832023-01-11 14:50:10 +010058 fill_arrays(a, b, r1, r2, n);
59 for (size_t i = 0; i < n; i++) {
Dave Rodgman4413b662022-11-22 17:31:50 +000060 r1[i] = r1[i] ^ r1[i];
61 }
Gilles Peskine449bd832023-01-11 14:50:10 +010062 mbedtls_xor(r2, r2, r2, n);
Tom Cosgrove65cd8512023-07-20 16:46:01 +010063 TEST_BUFFERS_EQUAL(r1, n, r2, n);
Dave Rodgman8c18baf2022-11-22 18:15:55 +000064
Dave Rodgman15531bc2022-11-23 16:11:04 +000065 /* Test non-word-aligned buffers, for all combinations of alignedness */
Gilles Peskine449bd832023-01-11 14:50:10 +010066 for (int i = 0; i < 7; i++) {
Dave Rodgman15531bc2022-11-23 16:11:04 +000067 int r_off = i & 1, a_off = (i & 2) >> 1, b_off = (i & 4) >> 2;
Gilles Peskine449bd832023-01-11 14:50:10 +010068 fill_arrays(a, b, r1, r2, n + 1);
Dave Rodgman15531bc2022-11-23 16:11:04 +000069
Gilles Peskine449bd832023-01-11 14:50:10 +010070 for (size_t j = 0; j < n; j++) {
Dave Rodgman3172e4e2022-11-23 19:38:13 +000071 r1[j + r_off] = a[j + a_off] ^ b[j + b_off];
Dave Rodgman15531bc2022-11-23 16:11:04 +000072 }
Gilles Peskine449bd832023-01-11 14:50:10 +010073 mbedtls_xor(r2 + r_off, a + a_off, b + b_off, n);
Tom Cosgrove65cd8512023-07-20 16:46:01 +010074 TEST_BUFFERS_EQUAL(r1 + r_off, n, r2 + r_off, n);
Dave Rodgman8c18baf2022-11-22 18:15:55 +000075 }
Dave Rodgman4413b662022-11-22 17:31:50 +000076exit:
Gilles Peskine449bd832023-01-11 14:50:10 +010077 mbedtls_free(a);
78 mbedtls_free(b);
79 mbedtls_free(r1);
80 mbedtls_free(r2);
Dave Rodgman4413b662022-11-22 17:31:50 +000081}
82/* END_CASE */