| Dave Rodgman | 4413b66 | 2022-11-22 17:31:50 +0000 | [diff] [blame] | 1 | /* BEGIN_HEADER */ | 
| David Horstmann | 22ec2ae | 2023-08-30 15:34:34 +0100 | [diff] [blame] | 2 | #include "common.h" | 
| Dave Rodgman | 4413b66 | 2022-11-22 17:31:50 +0000 | [diff] [blame] | 3 |  | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 4 | void fill_arrays(unsigned char *a, unsigned char *b, unsigned char *r1, unsigned char *r2, size_t n) | 
| Dave Rodgman | 4413b66 | 2022-11-22 17:31:50 +0000 | [diff] [blame] | 5 | { | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 6 | for (size_t i = 0; i < n; i++) { | 
| Dave Rodgman | 4413b66 | 2022-11-22 17:31:50 +0000 | [diff] [blame] | 7 | 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 Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 16 | void mbedtls_xor(int len) | 
| Dave Rodgman | 4413b66 | 2022-11-22 17:31:50 +0000 | [diff] [blame] | 17 | { | 
|  | 18 | size_t n = (size_t) len; | 
|  | 19 | unsigned char *a = NULL, *b = NULL, *r1 = NULL, *r2 = NULL; | 
| Tom Cosgrove | 05b2a87 | 2023-07-21 11:31:13 +0100 | [diff] [blame] | 20 | TEST_CALLOC(a, n + 1); | 
|  | 21 | TEST_CALLOC(b, n + 1); | 
|  | 22 | TEST_CALLOC(r1, n + 1); | 
|  | 23 | TEST_CALLOC(r2, n + 1); | 
| Dave Rodgman | 4413b66 | 2022-11-22 17:31:50 +0000 | [diff] [blame] | 24 |  | 
|  | 25 | /* Test non-overlapping */ | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 26 | fill_arrays(a, b, r1, r2, n); | 
|  | 27 | for (size_t i = 0; i < n; i++) { | 
| Dave Rodgman | 4413b66 | 2022-11-22 17:31:50 +0000 | [diff] [blame] | 28 | r1[i] = a[i] ^ b[i]; | 
|  | 29 | } | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 30 | mbedtls_xor(r2, a, b, n); | 
| Tom Cosgrove | e4e9e7d | 2023-07-21 11:40:20 +0100 | [diff] [blame] | 31 | TEST_MEMORY_COMPARE(r1, n, r2, n); | 
| Dave Rodgman | 4413b66 | 2022-11-22 17:31:50 +0000 | [diff] [blame] | 32 |  | 
|  | 33 | /* Test r == a */ | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 34 | fill_arrays(a, b, r1, r2, n); | 
|  | 35 | for (size_t i = 0; i < n; i++) { | 
| Dave Rodgman | 4413b66 | 2022-11-22 17:31:50 +0000 | [diff] [blame] | 36 | r1[i] = r1[i] ^ b[i]; | 
|  | 37 | } | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 38 | mbedtls_xor(r2, r2, b, n); | 
| Tom Cosgrove | e4e9e7d | 2023-07-21 11:40:20 +0100 | [diff] [blame] | 39 | TEST_MEMORY_COMPARE(r1, n, r2, n); | 
| Dave Rodgman | 4413b66 | 2022-11-22 17:31:50 +0000 | [diff] [blame] | 40 |  | 
|  | 41 | /* Test r == b */ | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 42 | fill_arrays(a, b, r1, r2, n); | 
|  | 43 | for (size_t i = 0; i < n; i++) { | 
| Dave Rodgman | 4413b66 | 2022-11-22 17:31:50 +0000 | [diff] [blame] | 44 | r1[i] = a[i] ^ r1[i]; | 
|  | 45 | } | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 46 | mbedtls_xor(r2, a, r2, n); | 
| Tom Cosgrove | e4e9e7d | 2023-07-21 11:40:20 +0100 | [diff] [blame] | 47 | TEST_MEMORY_COMPARE(r1, n, r2, n); | 
| Dave Rodgman | 4413b66 | 2022-11-22 17:31:50 +0000 | [diff] [blame] | 48 |  | 
|  | 49 | /* Test a == b */ | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 50 | fill_arrays(a, b, r1, r2, n); | 
|  | 51 | for (size_t i = 0; i < n; i++) { | 
| Dave Rodgman | 4413b66 | 2022-11-22 17:31:50 +0000 | [diff] [blame] | 52 | r1[i] = a[i] ^ a[i]; | 
|  | 53 | } | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 54 | mbedtls_xor(r2, a, a, n); | 
| Tom Cosgrove | e4e9e7d | 2023-07-21 11:40:20 +0100 | [diff] [blame] | 55 | TEST_MEMORY_COMPARE(r1, n, r2, n); | 
| Dave Rodgman | 4413b66 | 2022-11-22 17:31:50 +0000 | [diff] [blame] | 56 |  | 
|  | 57 | /* Test a == b == r */ | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 58 | fill_arrays(a, b, r1, r2, n); | 
|  | 59 | for (size_t i = 0; i < n; i++) { | 
| Dave Rodgman | 4413b66 | 2022-11-22 17:31:50 +0000 | [diff] [blame] | 60 | r1[i] = r1[i] ^ r1[i]; | 
|  | 61 | } | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 62 | mbedtls_xor(r2, r2, r2, n); | 
| Tom Cosgrove | e4e9e7d | 2023-07-21 11:40:20 +0100 | [diff] [blame] | 63 | TEST_MEMORY_COMPARE(r1, n, r2, n); | 
| Dave Rodgman | 8c18baf | 2022-11-22 18:15:55 +0000 | [diff] [blame] | 64 |  | 
| Dave Rodgman | 15531bc | 2022-11-23 16:11:04 +0000 | [diff] [blame] | 65 | /* Test non-word-aligned buffers, for all combinations of alignedness */ | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 66 | for (int i = 0; i < 7; i++) { | 
| Dave Rodgman | 15531bc | 2022-11-23 16:11:04 +0000 | [diff] [blame] | 67 | int r_off = i & 1, a_off = (i & 2) >> 1, b_off = (i & 4) >> 2; | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 68 | fill_arrays(a, b, r1, r2, n + 1); | 
| Dave Rodgman | 15531bc | 2022-11-23 16:11:04 +0000 | [diff] [blame] | 69 |  | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 70 | for (size_t j = 0; j < n; j++) { | 
| Dave Rodgman | 3172e4e | 2022-11-23 19:38:13 +0000 | [diff] [blame] | 71 | r1[j + r_off] = a[j + a_off] ^ b[j + b_off]; | 
| Dave Rodgman | 15531bc | 2022-11-23 16:11:04 +0000 | [diff] [blame] | 72 | } | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 73 | mbedtls_xor(r2 + r_off, a + a_off, b + b_off, n); | 
| Tom Cosgrove | e4e9e7d | 2023-07-21 11:40:20 +0100 | [diff] [blame] | 74 | TEST_MEMORY_COMPARE(r1 + r_off, n, r2 + r_off, n); | 
| Dave Rodgman | 8c18baf | 2022-11-22 18:15:55 +0000 | [diff] [blame] | 75 | } | 
| Dave Rodgman | 4413b66 | 2022-11-22 17:31:50 +0000 | [diff] [blame] | 76 | exit: | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 77 | mbedtls_free(a); | 
|  | 78 | mbedtls_free(b); | 
|  | 79 | mbedtls_free(r1); | 
|  | 80 | mbedtls_free(r2); | 
| Dave Rodgman | 4413b66 | 2022-11-22 17:31:50 +0000 | [diff] [blame] | 81 | } | 
|  | 82 | /* END_CASE */ |