1
0
mirror of https://github.com/Mbed-TLS/mbedtls.git synced 2025-08-08 17:42:09 +03:00

Merge remote-tracking branch 'dave/fast_xor' into fast_unaligned

This commit is contained in:
Dave Rodgman
2022-11-28 15:06:25 +00:00
17 changed files with 569 additions and 440 deletions

View File

@@ -0,0 +1,20 @@
Block xor, length 0
mbedtls_xor:0
Block xor, length 1
mbedtls_xor:1
Block xor, length 3
mbedtls_xor:3
Block xor, length 4
mbedtls_xor:4
Block xor, length 7
mbedtls_xor:7
Block xor, length 8
mbedtls_xor:8
Block xor, length 16
mbedtls_xor:16

View File

@@ -0,0 +1,90 @@
/* BEGIN_HEADER */
#include "../library/common.h"
void fill_arrays( unsigned char *a, unsigned char *b, unsigned char *r1, unsigned char *r2, size_t n )
{
for ( size_t i = 0; i < n; i++ )
{
a[i] = (unsigned char) i * 3;
b[i] = (unsigned char) i * 3 + 1;
r1[i] = (unsigned char) i * 3 + 2;
r2[i] = r1[i];
}
}
/* END_HEADER */
/* BEGIN_CASE */
void mbedtls_xor( int len )
{
size_t n = (size_t) len;
unsigned char *a = NULL, *b = NULL, *r1 = NULL, *r2 = NULL;
ASSERT_ALLOC( a, n + 1 );
ASSERT_ALLOC( b, n + 1 );
ASSERT_ALLOC( r1, n + 1 );
ASSERT_ALLOC( r2, n + 1 );
/* Test non-overlapping */
fill_arrays( a, b, r1, r2, n );
for ( size_t i = 0; i < n; i++ )
{
r1[i] = a[i] ^ b[i];
}
mbedtls_xor( r2, a, b, n );
ASSERT_COMPARE( r1, n, r2, n );
/* Test r == a */
fill_arrays( a, b, r1, r2, n );
for ( size_t i = 0; i < n; i++ )
{
r1[i] = r1[i] ^ b[i];
}
mbedtls_xor( r2, r2, b, n );
ASSERT_COMPARE( r1, n, r2, n );
/* Test r == b */
fill_arrays( a, b, r1, r2, n );
for ( size_t i = 0; i < n; i++ )
{
r1[i] = a[i] ^ r1[i];
}
mbedtls_xor( r2, a, r2, n );
ASSERT_COMPARE( r1, n, r2, n );
/* Test a == b */
fill_arrays( a, b, r1, r2, n );
for ( size_t i = 0; i < n; i++ )
{
r1[i] = a[i] ^ a[i];
}
mbedtls_xor( r2, a, a, n );
ASSERT_COMPARE( r1, n, r2, n );
/* Test a == b == r */
fill_arrays( a, b, r1, r2, n );
for ( size_t i = 0; i < n; i++ )
{
r1[i] = r1[i] ^ r1[i];
}
mbedtls_xor( r2, r2, r2, n );
ASSERT_COMPARE( r1, n, r2, n );
/* Test non-word-aligned buffers, for all combinations of alignedness */
for ( int i = 0; i < 7; i++ )
{
int r_off = i & 1, a_off = (i & 2) >> 1, b_off = (i & 4) >> 2;
fill_arrays( a, b, r1, r2, n + 1 );
for ( size_t j = 0; j < n; j++ )
{
r1[j + r_off] = a[j + a_off] ^ b[j + b_off];
}
mbedtls_xor( r2 + r_off, a + a_off, b + b_off, n );
ASSERT_COMPARE( r1 + r_off, n, r2 + r_off, n );
}
exit:
mbedtls_free( a );
mbedtls_free( b );
mbedtls_free( r1 );
mbedtls_free( r2 );
}
/* END_CASE */