From 8fe321d5be965419fc2bfe652f35f5363a27a992 Mon Sep 17 00:00:00 2001 From: Juliusz Sosinowicz Date: Thu, 23 Mar 2023 10:46:09 +0100 Subject: [PATCH] Try to XOR as many words as possible in xorbuf APIs --- wolfcrypt/src/misc.c | 62 ++++++++++++++++++++++++---------------- wolfssl/wolfcrypt/misc.h | 6 ++-- 2 files changed, 41 insertions(+), 27 deletions(-) diff --git a/wolfcrypt/src/misc.c b/wolfcrypt/src/misc.c index 3c47e517c..d0045a0e5 100644 --- a/wolfcrypt/src/misc.c +++ b/wolfcrypt/src/misc.c @@ -256,42 +256,50 @@ WC_MISC_STATIC WC_INLINE void ByteReverseWords64(word64* out, const word64* in, #ifndef WOLFSSL_NO_XOR_OPS /* This routine performs a bitwise XOR operation of <*r> and <*a> for number of wolfssl_words, placing the result in <*r>. */ -WC_MISC_STATIC WC_INLINE void XorWordsOut(wolfssl_word* r, - const wolfssl_word* a, const wolfssl_word* b, word32 n) +WC_MISC_STATIC WC_INLINE void XorWordsOut(wolfssl_word** r, + const wolfssl_word** a, const wolfssl_word** b, word32 n) { word32 i; - for (i = 0; i < n; i++) r[i] = a[i] ^ b[i]; + for (i = 0; i < n; i++) + *(*r)++ = *(*a)++ ^ *(*b)++; } /* This routine performs a bitwise XOR operation of <*buf> and <*mask> of n counts, placing the result in <*buf>. */ -WC_MISC_STATIC WC_INLINE void xorbufout(void*out, const void* buf, +WC_MISC_STATIC WC_INLINE void xorbufout(void* out, const void* buf, const void* mask, word32 count) { - if (((wc_ptr_t)out | (wc_ptr_t)buf | (wc_ptr_t)mask | count) % - WOLFSSL_WORD_SIZE == 0) - XorWordsOut( (wolfssl_word*)out, (wolfssl_word*)buf, - (const wolfssl_word*)mask, count / WOLFSSL_WORD_SIZE); - else { - word32 i; - byte* o = (byte*)out; - byte* b = (byte*)buf; - const byte* m = (const byte*)mask; + word32 i; + byte* o; + byte* b; + const byte* m; - for (i = 0; i < count; i++) o[i] = b[i] ^ m[i]; + if (((wc_ptr_t)buf | (wc_ptr_t)mask) % WOLFSSL_WORD_SIZE == 0) { + /* Alignment checks out. Possible to XOR words. */ + XorWordsOut( (wolfssl_word**)&out, (const wolfssl_word**)&buf, + (const wolfssl_word**)&mask, count / WOLFSSL_WORD_SIZE); + count %= WOLFSSL_WORD_SIZE; } + + o = (byte*)out; + b = (byte*)buf; + m = (const byte*)mask; + + for (i = 0; i < count; i++) + o[i] = b[i] ^ m[i]; } /* This routine performs a bitwise XOR operation of <*r> and <*a> for number of wolfssl_words, placing the result in <*r>. */ -WC_MISC_STATIC WC_INLINE void XorWords(wolfssl_word* r, const wolfssl_word* a, +WC_MISC_STATIC WC_INLINE void XorWords(wolfssl_word** r, const wolfssl_word** a, word32 n) { word32 i; - for (i = 0; i < n; i++) r[i] ^= a[i]; + for (i = 0; i < n; i++) + *(*r)++ ^= *(*a)++; } /* This routine performs a bitwise XOR operation of <*buf> and <*mask> of n @@ -299,16 +307,22 @@ counts, placing the result in <*buf>. */ WC_MISC_STATIC WC_INLINE void xorbuf(void* buf, const void* mask, word32 count) { - if (((wc_ptr_t)buf | (wc_ptr_t)mask | count) % WOLFSSL_WORD_SIZE == 0) - XorWords( (wolfssl_word*)buf, - (const wolfssl_word*)mask, count / WOLFSSL_WORD_SIZE); - else { - word32 i; - byte* b = (byte*)buf; - const byte* m = (const byte*)mask; + word32 i; + byte* b; + const byte* m; - for (i = 0; i < count; i++) b[i] ^= m[i]; + if (((wc_ptr_t)buf | (wc_ptr_t)mask) % WOLFSSL_WORD_SIZE == 0) { + /* Alignment checks out. Possible to XOR words. */ + XorWords( (wolfssl_word**)&buf, + (const wolfssl_word**)&mask, count / WOLFSSL_WORD_SIZE); + count %= WOLFSSL_WORD_SIZE; } + + b = (byte*)buf; + m = (const byte*)mask; + + for (i = 0; i < count; i++) + b[i] ^= m[i]; } #endif diff --git a/wolfssl/wolfcrypt/misc.h b/wolfssl/wolfcrypt/misc.h index 418246787..e433a1a3c 100644 --- a/wolfssl/wolfcrypt/misc.h +++ b/wolfssl/wolfcrypt/misc.h @@ -59,12 +59,12 @@ WOLFSSL_LOCAL void ByteReverseWords(word32* out, const word32* in, word32 byteCount); WOLFSSL_LOCAL -void XorWordsOut(wolfssl_word* r, const wolfssl_word* a, const wolfssl_word* b, - word32 n); +void XorWordsOut(wolfssl_word** r, const wolfssl_word** a, + const wolfssl_word** b, word32 n); WOLFSSL_LOCAL void xorbufout(void* out, const void* buf, const void* mask, word32 count); WOLFSSL_LOCAL -void XorWords(wolfssl_word* r, const wolfssl_word* a, word32 n); +void XorWords(wolfssl_word** r, const wolfssl_word** a, word32 n); WOLFSSL_LOCAL void xorbuf(void* buf, const void* mask, word32 count);