Merge pull request #5508 from SparkiDev/aes_ctr_arm32_neon_fix2

AES-CTR ARM32 ASM: Fix 128-bit counter increment
pull/5510/head
David Garske 2022-08-25 07:04:48 -07:00 committed by GitHub
commit b9cee17b01
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 680 additions and 482 deletions

View File

@ -3620,16 +3620,27 @@ static void wc_aes_ctr_encrypt_asm(Aes* aes, byte* out, const byte* in,
"AESMC.8 q0, q0\n"
"VEXT.8 q13, q13, q13, #8 \n"
"SUB r11, r11, #2 \n"
/* Comparison value to check whether carry is going to happen */
"VMOV.u32 q12, #0xffffffff \n"
"VADD.u32 q12, q14 \n"
"VADD.i32 q15, q13, q14 \n" /* add 1 to counter */
"VCEQ.i32 q13, q15, q12 \n"
"VEXT.8 q13, q14, q13, #12 \n"
"VSUB.i32 q15, q15, q13 \n"
"VADD.i32 q13, q15, q14 \n" /* add 1 to counter */
/* Carry across 32-bit lanes */
"VCEQ.i32 q12, q13, q12 \n"
"VEXT.8 q12, q14, q12, #12 \n"
"VAND.32 d25, d25, d24 \n"
"VEXT.8 q13, q14, q12, #12 \n"
"VAND.32 d27, d27, d24 \n"
"VSUB.i32 q15, q15, q13 \n"
"VMOV.u32 q12, #0xffffffff \n"
"VADD.i32 q13, q15, q14 \n" /* add 1 to counter */
/* Carry across 32-bit lanes */
"VCEQ.i32 q12, q15, q12 \n"
"VAND.32 d25, d25, d24 \n"
"VEXT.8 d25, d24, d25, #4 \n"
"VAND.32 d25, d25, d24 \n"
"VEXT.8 d24, d29, d24, #4 \n"
"VSUB.i32 q13, q13, q12 \n"
"AESE.8 q0, q3\n"
"AESMC.8 q0, q0\n"
"VEXT.8 q15, q15, q15, #8 \n"
@ -3689,8 +3700,6 @@ static void wc_aes_ctr_encrypt_asm(Aes* aes, byte* out, const byte* in,
/* single block */
"2: \n"
"VMOV.u32 q15, #0xffffffff \n"
"VADD.u32 q15, q14 \n"
"VMOV.32 q0, q13 \n"
"AESE.8 q0, q1\n"
"AESMC.8 q0, q0\n"
@ -3700,10 +3709,15 @@ static void wc_aes_ctr_encrypt_asm(Aes* aes, byte* out, const byte* in,
"VEXT.8 q13, q13, q13, #8 \n"
"AESE.8 q0, q3\n"
"AESMC.8 q0, q0\n"
"VADD.i32 q13, q13, q14 \n" /* add 1 to counter */
"VMOV.u32 q15, #0xffffffff \n"
"VCEQ.i32 q12, q13, q15 \n"
"VEXT.8 q12, q14, q12, #12 \n"
"VSUB.i32 q13, q13, q12 \n"
"VADD.i32 q13, q13, q14 \n" /* add 1 to counter */
"VAND.32 d25, d25, d24 \n"
"VEXT.8 q15, q14, q12, #12 \n"
"VAND.32 d31, d31, d24 \n"
"VSUB.i32 q13, q13, q15 \n"
"AESE.8 q0, q4\n"
"AESMC.8 q0, q0\n"
"SUB r11, r11, #1 \n"
@ -3770,16 +3784,26 @@ static void wc_aes_ctr_encrypt_asm(Aes* aes, byte* out, const byte* in,
"AESMC.8 q0, q0\n"
"VEXT.8 q13, q13, q13, #8 \n"
"SUB r11, r11, #2 \n"
"VMOV.u32 q12, #0xffffffff \n"
"VADD.u32 q12, q14 \n"
"VADD.i32 q15, q13, q14 \n" /* add 1 to counter */
"VCEQ.i32 q13, q15, q12 \n"
"VEXT.8 q13, q14, q13, #12 \n"
"VSUB.i32 q15, q15, q13 \n"
"VADD.i32 q13, q15, q14 \n" /* add 1 to counter */
/* Carry across 32-bit lanes */
"VCEQ.i32 q12, q13, q12 \n"
"VEXT.8 q12, q14, q12, #12 \n"
"VAND.32 d25, d25, d24 \n"
"VEXT.8 q13, q14, q12, #12 \n"
"VAND.32 d27, d27, d24 \n"
"VSUB.i32 q15, q15, q13 \n"
"VMOV.u32 q12, #0xffffffff \n"
"VADD.i32 q13, q15, q14 \n" /* add 1 to counter */
/* Carry across 32-bit lanes */
"VCEQ.i32 q12, q15, q12 \n"
"VAND.32 d25, d25, d24 \n"
"VEXT.8 d25, d24, d25, #4 \n"
"VAND.32 d25, d25, d24 \n"
"VEXT.8 d24, d29, d24, #4 \n"
"VSUB.i32 q13, q13, q12 \n"
"AESE.8 q0, q3\n"
"AESMC.8 q0, q0\n"
"VEXT.8 q15, q15, q15, #8 \n"
@ -3855,8 +3879,6 @@ static void wc_aes_ctr_encrypt_asm(Aes* aes, byte* out, const byte* in,
/* single block */
"2: \n"
"VMOV.u32 q15, #0xffffffff \n"
"VADD.u32 q15, q14 \n"
"VLD1.32 {q11}, [%[Key]]! \n"
"VMOV.32 q0, q13 \n"
"AESE.8 q0, q1\n"
@ -3867,10 +3889,15 @@ static void wc_aes_ctr_encrypt_asm(Aes* aes, byte* out, const byte* in,
"VEXT.8 q13, q13, q13, #8 \n"
"AESE.8 q0, q3\n"
"AESMC.8 q0, q0\n"
"VADD.i32 q13, q13, q14 \n" /* add 1 to counter */
"VMOV.u32 q15, #0xffffffff \n"
"VCEQ.i32 q12, q13, q15 \n"
"VEXT.8 q12, q14, q12, #12 \n"
"VSUB.i32 q13, q13, q12 \n"
"VADD.i32 q13, q13, q14 \n" /* add 1 to counter */
"VAND.32 d25, d25, d24 \n"
"VEXT.8 q15, q14, q12, #12 \n"
"VAND.32 d31, d31, d24 \n"
"VSUB.i32 q13, q13, q15 \n"
"AESE.8 q0, q4\n"
"AESMC.8 q0, q0\n"
"SUB r11, r11, #1 \n"
@ -3943,16 +3970,26 @@ static void wc_aes_ctr_encrypt_asm(Aes* aes, byte* out, const byte* in,
"AESMC.8 q0, q0\n"
"VEXT.8 q13, q13, q13, #8 \n"
"SUB r11, r11, #2 \n"
"VMOV.u32 q12, #0xffffffff \n"
"VADD.u32 q12, q14 \n"
"VADD.i32 q15, q13, q14 \n" /* add 1 to counter */
"VCEQ.i32 q13, q15, q12 \n"
"VEXT.8 q13, q14, q13, #12 \n"
"VSUB.i32 q15, q15, q13 \n"
"VADD.i32 q13, q15, q14 \n" /* add 1 to counter */
/* Carry across 32-bit lanes */
"VCEQ.i32 q12, q13, q12 \n"
"VEXT.8 q12, q14, q12, #12 \n"
"VAND.32 d25, d25, d24 \n"
"VEXT.8 q13, q14, q12, #12 \n"
"VAND.32 d27, d27, d24 \n"
"VSUB.i32 q15, q15, q13 \n"
"VMOV.u32 q12, #0xffffffff \n"
"VADD.i32 q13, q15, q14 \n" /* add 1 to counter */
/* Carry across 32-bit lanes */
"VCEQ.i32 q12, q15, q12 \n"
"VAND.32 d25, d25, d24 \n"
"VEXT.8 d25, d24, d25, #4 \n"
"VAND.32 d25, d25, d24 \n"
"VEXT.8 d24, d29, d24, #4 \n"
"VSUB.i32 q13, q13, q12 \n"
"AESE.8 q0, q3\n"
"AESMC.8 q0, q0\n"
"VEXT.8 q15, q15, q15, #8 \n"
@ -4040,8 +4077,6 @@ static void wc_aes_ctr_encrypt_asm(Aes* aes, byte* out, const byte* in,
"B 1b \n"
"2: \n"
"VMOV.u32 q15, #0xffffffff \n"
"VADD.u32 q15, q14 \n"
"VLD1.32 {q11}, [%[Key]]! \n"
"VMOV.32 q0, q13 \n"
"AESE.8 q0, q1\n"
@ -4052,10 +4087,15 @@ static void wc_aes_ctr_encrypt_asm(Aes* aes, byte* out, const byte* in,
"VEXT.8 q13, q13, q13, #8 \n"
"AESE.8 q0, q3\n"
"AESMC.8 q0, q0\n"
"VADD.i32 q13, q13, q14 \n" /* add 1 to counter */
"VMOV.u32 q15, #0xffffffff \n"
"VCEQ.i32 q12, q13, q15 \n"
"VEXT.8 q12, q14, q12, #12 \n"
"VSUB.i32 q13, q13, q12 \n"
"VADD.i32 q13, q13, q14 \n" /* add 1 to counter */
"VAND.32 d25, d25, d24 \n"
"VEXT.8 q15, q14, q12, #12 \n"
"VAND.32 d31, d31, d24 \n"
"VSUB.i32 q13, q13, q15 \n"
"AESE.8 q0, q4\n"
"AESMC.8 q0, q0\n"
"AESE.8 q0, q5\n"

File diff suppressed because it is too large Load Diff

View File

@ -31,6 +31,7 @@ This library provides single precision (SP) integer math functions.
#include <limits.h>
#endif
#include <wolfssl/wolfcrypt/settings.h>
#include <wolfssl/wolfcrypt/hash.h>
#ifdef __cplusplus
extern "C" {