blob: 8626a0ba4cf71e3fa4785eeb5487a72ffeb7e824 [file] [log] [blame]
Dave Rodgman4413b662022-11-22 17:31:50 +00001/* BEGIN_HEADER */
David Horstmann22ec2ae2023-08-30 15:34:34 +01002#include "common.h"
Dave Rodgman4413b662022-11-22 17:31:50 +00003
Michael Schuster6a3573a2024-06-07 06:47:31 +02004static void fill_arrays(unsigned char *a,
5 unsigned char *b,
6 unsigned char *r1,
7 unsigned char *r2,
8 size_t n)
Dave Rodgman4413b662022-11-22 17:31:50 +00009{
Gilles Peskine449bd832023-01-11 14:50:10 +010010 for (size_t i = 0; i < n; i++) {
Dave Rodgman4413b662022-11-22 17:31:50 +000011 a[i] = (unsigned char) i * 3;
12 b[i] = (unsigned char) i * 3 + 1;
13 r1[i] = (unsigned char) i * 3 + 2;
14 r2[i] = r1[i];
15 }
16}
17/* END_HEADER */
18
19/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +010020void mbedtls_xor(int len)
Dave Rodgman4413b662022-11-22 17:31:50 +000021{
22 size_t n = (size_t) len;
23 unsigned char *a = NULL, *b = NULL, *r1 = NULL, *r2 = NULL;
Tom Cosgrove05b2a872023-07-21 11:31:13 +010024 TEST_CALLOC(a, n + 1);
25 TEST_CALLOC(b, n + 1);
26 TEST_CALLOC(r1, n + 1);
27 TEST_CALLOC(r2, n + 1);
Dave Rodgman4413b662022-11-22 17:31:50 +000028
29 /* Test non-overlapping */
Gilles Peskine449bd832023-01-11 14:50:10 +010030 fill_arrays(a, b, r1, r2, n);
31 for (size_t i = 0; i < n; i++) {
Dave Rodgman4413b662022-11-22 17:31:50 +000032 r1[i] = a[i] ^ b[i];
33 }
Gilles Peskine449bd832023-01-11 14:50:10 +010034 mbedtls_xor(r2, a, b, n);
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +010035 TEST_MEMORY_COMPARE(r1, n, r2, n);
Dave Rodgman4413b662022-11-22 17:31:50 +000036
37 /* Test r == a */
Gilles Peskine449bd832023-01-11 14:50:10 +010038 fill_arrays(a, b, r1, r2, n);
39 for (size_t i = 0; i < n; i++) {
Dave Rodgman4413b662022-11-22 17:31:50 +000040 r1[i] = r1[i] ^ b[i];
41 }
Gilles Peskine449bd832023-01-11 14:50:10 +010042 mbedtls_xor(r2, r2, b, n);
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +010043 TEST_MEMORY_COMPARE(r1, n, r2, n);
Dave Rodgman4413b662022-11-22 17:31:50 +000044
45 /* Test r == b */
Gilles Peskine449bd832023-01-11 14:50:10 +010046 fill_arrays(a, b, r1, r2, n);
47 for (size_t i = 0; i < n; i++) {
Dave Rodgman4413b662022-11-22 17:31:50 +000048 r1[i] = a[i] ^ r1[i];
49 }
Gilles Peskine449bd832023-01-11 14:50:10 +010050 mbedtls_xor(r2, a, r2, n);
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +010051 TEST_MEMORY_COMPARE(r1, n, r2, n);
Dave Rodgman4413b662022-11-22 17:31:50 +000052
53 /* Test a == b */
Gilles Peskine449bd832023-01-11 14:50:10 +010054 fill_arrays(a, b, r1, r2, n);
55 for (size_t i = 0; i < n; i++) {
Dave Rodgman4413b662022-11-22 17:31:50 +000056 r1[i] = a[i] ^ a[i];
57 }
Gilles Peskine449bd832023-01-11 14:50:10 +010058 mbedtls_xor(r2, a, a, n);
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +010059 TEST_MEMORY_COMPARE(r1, n, r2, n);
Dave Rodgman4413b662022-11-22 17:31:50 +000060
61 /* Test a == b == r */
Gilles Peskine449bd832023-01-11 14:50:10 +010062 fill_arrays(a, b, r1, r2, n);
63 for (size_t i = 0; i < n; i++) {
Dave Rodgman4413b662022-11-22 17:31:50 +000064 r1[i] = r1[i] ^ r1[i];
65 }
Gilles Peskine449bd832023-01-11 14:50:10 +010066 mbedtls_xor(r2, r2, r2, n);
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +010067 TEST_MEMORY_COMPARE(r1, n, r2, n);
Dave Rodgman8c18baf2022-11-22 18:15:55 +000068
Dave Rodgman15531bc2022-11-23 16:11:04 +000069 /* Test non-word-aligned buffers, for all combinations of alignedness */
Gilles Peskine449bd832023-01-11 14:50:10 +010070 for (int i = 0; i < 7; i++) {
Dave Rodgman15531bc2022-11-23 16:11:04 +000071 int r_off = i & 1, a_off = (i & 2) >> 1, b_off = (i & 4) >> 2;
Gilles Peskine449bd832023-01-11 14:50:10 +010072 fill_arrays(a, b, r1, r2, n + 1);
Dave Rodgman15531bc2022-11-23 16:11:04 +000073
Gilles Peskine449bd832023-01-11 14:50:10 +010074 for (size_t j = 0; j < n; j++) {
Dave Rodgman3172e4e2022-11-23 19:38:13 +000075 r1[j + r_off] = a[j + a_off] ^ b[j + b_off];
Dave Rodgman15531bc2022-11-23 16:11:04 +000076 }
Gilles Peskine449bd832023-01-11 14:50:10 +010077 mbedtls_xor(r2 + r_off, a + a_off, b + b_off, n);
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +010078 TEST_MEMORY_COMPARE(r1 + r_off, n, r2 + r_off, n);
Dave Rodgman8c18baf2022-11-22 18:15:55 +000079 }
Dave Rodgman4413b662022-11-22 17:31:50 +000080exit:
Gilles Peskine449bd832023-01-11 14:50:10 +010081 mbedtls_free(a);
82 mbedtls_free(b);
83 mbedtls_free(r1);
84 mbedtls_free(r2);
Dave Rodgman4413b662022-11-22 17:31:50 +000085}
86/* END_CASE */