blob: 4444a52ce6ad62f68c7affb36a78e71a45a2ed94 [file] [log] [blame]
Dave Rodgman4413b662022-11-22 17:31:50 +00001/* BEGIN_HEADER */
2#include "../library/common.h"
3
4void fill_arrays( unsigned char *a, unsigned char *b, unsigned char *r1, unsigned char *r2, size_t n )
5{
6 for ( size_t i = 0; i < n; i++ )
7 {
8 a[i] = (unsigned char) i * 3;
9 b[i] = (unsigned char) i * 3 + 1;
10 r1[i] = (unsigned char) i * 3 + 2;
11 r2[i] = r1[i];
12 }
13}
14/* END_HEADER */
15
16/* BEGIN_CASE */
17void mbedtls_xor( int len )
18{
19 size_t n = (size_t) len;
20 unsigned char *a = NULL, *b = NULL, *r1 = NULL, *r2 = NULL;
Dave Rodgman8c18baf2022-11-22 18:15:55 +000021 ASSERT_ALLOC( a, n + 1 );
22 ASSERT_ALLOC( b, n + 1 );
23 ASSERT_ALLOC( r1, n + 1 );
24 ASSERT_ALLOC( r2, n + 1 );
Dave Rodgman4413b662022-11-22 17:31:50 +000025
26 /* Test non-overlapping */
27 fill_arrays( a, b, r1, r2, n );
28 for ( size_t i = 0; i < n; i++ )
29 {
30 r1[i] = a[i] ^ b[i];
31 }
32 mbedtls_xor( r2, a, b, n );
33 ASSERT_COMPARE( r1, n, r2, n );
34
35 /* Test r == a */
36 fill_arrays( a, b, r1, r2, n );
37 for ( size_t i = 0; i < n; i++ )
38 {
39 r1[i] = r1[i] ^ b[i];
40 }
41 mbedtls_xor( r2, r2, b, n );
42 ASSERT_COMPARE( r1, n, r2, n );
43
44 /* Test r == b */
45 fill_arrays( a, b, r1, r2, n );
46 for ( size_t i = 0; i < n; i++ )
47 {
48 r1[i] = a[i] ^ r1[i];
49 }
50 mbedtls_xor( r2, a, r2, n );
51 ASSERT_COMPARE( r1, n, r2, n );
52
53 /* Test a == b */
54 fill_arrays( a, b, r1, r2, n );
55 for ( size_t i = 0; i < n; i++ )
56 {
57 r1[i] = a[i] ^ a[i];
58 }
59 mbedtls_xor( r2, a, a, n );
60 ASSERT_COMPARE( r1, n, r2, n );
61
62 /* Test a == b == r */
63 fill_arrays( a, b, r1, r2, n );
64 for ( size_t i = 0; i < n; i++ )
65 {
66 r1[i] = r1[i] ^ r1[i];
67 }
68 mbedtls_xor( r2, r2, r2, n );
69 ASSERT_COMPARE( r1, n, r2, n );
Dave Rodgman8c18baf2022-11-22 18:15:55 +000070
Dave Rodgman15531bc2022-11-23 16:11:04 +000071 /* Test non-word-aligned buffers, for all combinations of alignedness */
72 for ( int i = 0; i < 7; i++ )
Dave Rodgman8c18baf2022-11-22 18:15:55 +000073 {
Dave Rodgman15531bc2022-11-23 16:11:04 +000074 int r_off = i & 1, a_off = (i & 2) >> 1, b_off = (i & 4) >> 2;
75 fill_arrays( a, b, r1, r2, n + 1 );
76
Dave Rodgman3172e4e2022-11-23 19:38:13 +000077 for ( size_t j = 0; j < n; j++ )
Dave Rodgman15531bc2022-11-23 16:11:04 +000078 {
Dave Rodgman3172e4e2022-11-23 19:38:13 +000079 r1[j + r_off] = a[j + a_off] ^ b[j + b_off];
Dave Rodgman15531bc2022-11-23 16:11:04 +000080 }
81 mbedtls_xor( r2 + r_off, a + a_off, b + b_off, n );
82 ASSERT_COMPARE( r1 + r_off, n, r2 + r_off, n );
Dave Rodgman8c18baf2022-11-22 18:15:55 +000083 }
Dave Rodgman4413b662022-11-22 17:31:50 +000084exit:
Dave Rodgman7a910a82022-11-24 21:17:40 +000085 mbedtls_free( a );
86 mbedtls_free( b );
87 mbedtls_free( r1 );
88 mbedtls_free( r2 );
Dave Rodgman4413b662022-11-22 17:31:50 +000089}
90/* END_CASE */