Merge pull request #5152 from SparkiDev/armv7a_neon_asm

ARM ASM: ARMv7a with NEON instructions
This commit is contained in:
David Garske
2022-09-23 08:46:03 -07:00
committed by GitHub
15 changed files with 8702 additions and 2900 deletions

View File

@ -2163,6 +2163,7 @@ then
esac
# Include options.h
AM_CCASFLAGS="$AM_CCASFLAGS -DEXTERNAL_OPTS_OPENVPN"
ENABLED_ARMASM_CRYPTO=yes
# Check for and set -mstrict-align compiler flag
# Used to set assumption that Aarch64 systems will not handle
@ -2179,12 +2180,22 @@ then
AM_CPPFLAGS="$AM_CPPFLAGS -mstrict-align"
AC_MSG_NOTICE([64bit ARMv8, setting -mstrict-align]);;
esac
AC_MSG_NOTICE([64bit ARMv8 found, setting mcpu to generic+crypto]);;
AC_MSG_NOTICE([64bit ARMv8 found, setting mcpu to generic+crypto])
;;
armv7a)
AM_CPPFLAGS="$AM_CPPFLAGS -march=armv7-a -mfpu=neon -DWOLFSSL_ARMASM_NO_HW_CRYPTO -DWOLFSSL_ARM_ARCH=7"
# Include options.h
AM_CCASFLAGS="$AM_CCASFLAGS -DEXTERNAL_OPTS_OPENVPN"
ENABLED_ARMASM_CRYPTO=no
AC_MSG_NOTICE([32bit ARMv7-a found, setting mfpu to neon])
;;
*)
AM_CPPFLAGS="$AM_CPPFLAGS -mfpu=crypto-neon-fp-armv8"
# Include options.h
AM_CCASFLAGS="$AM_CCASFLAGS -DEXTERNAL_OPTS_OPENVPN"
AC_MSG_NOTICE([32bit ARMv8 found, setting mfpu to crypto-neon-fp-armv8]);;
ENABLED_ARMASM_CRYPTO=yes
AC_MSG_NOTICE([32bit ARMv8 found, setting mfpu to crypto-neon-fp-armv8])
;;
esac
esac
fi
@ -8071,6 +8082,7 @@ AM_CONDITIONAL([BUILD_AESGCM],[test "x$ENABLED_AESGCM" = "xyes" || test "x$ENABL
AM_CONDITIONAL([BUILD_AESCCM],[test "x$ENABLED_AESCCM" = "xyes" || test "x$ENABLED_USERSETTINGS" = "xyes"])
AM_CONDITIONAL([BUILD_ARMASM],[test "x$ENABLED_ARMASM" = "xyes"])
AM_CONDITIONAL([BUILD_ARMASM_INLINE],[test "x$ENABLED_ARMASM_INLINE" = "xyes"])
AM_CONDITIONAL([BUILD_ARMASM_CRYPTO],[test "x$ENABLED_ARMASM_CRYPTO" = "xyes"])
AM_CONDITIONAL([BUILD_XILINX],[test "x$ENABLED_XILINX" = "xyes"])
AM_CONDITIONAL([BUILD_AESNI],[test "x$ENABLED_AESNI" = "xyes"])
AM_CONDITIONAL([BUILD_INTELASM],[test "x$ENABLED_INTELASM" = "xyes"])

View File

@ -203,7 +203,7 @@ endif
if BUILD_AES
src_libwolfssl_la_SOURCES += wolfcrypt/src/aes.c
if BUILD_ARMASM
if BUILD_ARMASM_CRYPTO
src_libwolfssl_la_SOURCES += wolfcrypt/src/port/arm/armv8-aes.c
endif
endif
@ -219,6 +219,11 @@ endif
if BUILD_ARMASM
src_libwolfssl_la_SOURCES += wolfcrypt/src/port/arm/armv8-sha256.c
if BUILD_ARMASM_INLINE
src_libwolfssl_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-sha256-asm_c.c
else
src_libwolfssl_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-sha256-asm.S
endif
else
src_libwolfssl_la_SOURCES += wolfcrypt/src/sha256.c
if BUILD_INTELASM
@ -316,10 +321,15 @@ endif
endif !BUILD_FIPS_CURRENT
if !BUILD_FIPS_CURRENT
src_libwolfssl_la_SOURCES += wolfcrypt/src/sha256.c
if BUILD_ARMASM
src_libwolfssl_la_SOURCES += wolfcrypt/src/port/arm/armv8-sha256.c
if BUILD_ARMASM_INLINE
src_libwolfssl_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-sha256-asm_c.c
else
src_libwolfssl_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-sha256-asm.S
endif
else
src_libwolfssl_la_SOURCES += wolfcrypt/src/sha256.c
if BUILD_INTELASM
src_libwolfssl_la_SOURCES += wolfcrypt/src/sha256_asm.S
endif
@ -399,7 +409,7 @@ endif
if !BUILD_FIPS_CURRENT
if BUILD_AES
src_libwolfssl_la_SOURCES += wolfcrypt/src/aes.c
if BUILD_ARMASM
if BUILD_ARMASM_CRYPTO
src_libwolfssl_la_SOURCES += wolfcrypt/src/port/arm/armv8-aes.c
endif
if BUILD_AFALG

View File

@ -306,7 +306,7 @@ block cipher mechanism that uses n-bit binary string parameter key with 128-bits
#include <wolfcrypt/src/misc.c>
#endif
#if !defined(WOLFSSL_ARMASM)
#if !defined(WOLFSSL_ARMASM) || defined(WOLFSSL_ARMASM_NO_HW_CRYPTO)
#ifdef WOLFSSL_IMX6_CAAM_BLOB
/* case of possibly not using hardware acceleration for AES but using key
@ -4601,7 +4601,7 @@ static WC_INLINE void IncCtr(byte* ctr, word32 ctrSz)
#endif
#ifdef WOLFSSL_ARMASM
#if defined(WOLFSSL_ARMASM) && !defined(WOLFSSL_ARMASM_NO_HW_CRYPTO)
/* implementation is located in wolfcrypt/src/port/arm/armv8-aes.c */
#elif defined(WOLFSSL_AFALG)
@ -9933,7 +9933,7 @@ int wc_AesCcmCheckTagSize(int sz)
return 0;
}
#ifdef WOLFSSL_ARMASM
#if defined(WOLFSSL_ARMASM) && !defined(WOLFSSL_ARMASM_NO_HW_CRYPTO)
/* implementation located in wolfcrypt/src/port/arm/armv8-aes.c */
#elif defined(HAVE_COLDFIRE_SEC)

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -225,7 +225,7 @@ Transform_Sha512_Len:
strd r6, r7, [sp, #176]
strd r8, r9, [sp, #184]
# Start of loop processing a block
L_sha512_len_neon_begin:
L_SHA512_transform_len_begin:
# Load, Reverse and Store W
ldr r12, [r1]
ldr lr, [r1, #4]
@ -319,7 +319,7 @@ L_sha512_len_neon_begin:
eor r9, r9, lr
mov r10, #4
# Start of 16 rounds
L_sha512_len_neon_start:
L_SHA512_transform_len_start:
# Round 0
ldr r12, [r0, #32]
ldr lr, [r0, #36]
@ -2546,7 +2546,7 @@ L_sha512_len_neon_start:
str lr, [sp, #124]
add r3, r3, #0x80
subs r10, r10, #1
bne L_sha512_len_neon_start
bne L_SHA512_transform_len_start
# Round 0
ldr r12, [r0, #32]
ldr lr, [r0, #36]
@ -4035,7 +4035,7 @@ L_sha512_len_neon_start:
subs r2, r2, #0x80
sub r3, r3, #0x200
add r1, r1, #0x80
bne L_sha512_len_neon_begin
bne L_SHA512_transform_len_begin
eor r0, r0, r0
add sp, sp, #0xc0
pop {r4, r5, r6, r7, r8, r9, r10, pc}
@ -4209,6 +4209,7 @@ L_SHA512_transform_neon_len_k:
.word 0x6c44198c
.text
.align 2
.fpu neon
.globl Transform_Sha512_Len
.type Transform_Sha512_Len, %function
Transform_Sha512_Len:
@ -4216,9 +4217,13 @@ Transform_Sha512_Len:
# Load digest into working vars
vldm.64 r0, {d0-d7}
# Start of loop processing a block
L_sha512_len_neon_begin:
L_SHA512_transform_neon_len_begin:
# Load W
vldm.64 r1!, {d16-d31}
vld1.8 {q8, q9}, [r1]!
vld1.8 {q10, q11}, [r1]!
vld1.8 {q12, q13}, [r1]!
vld1.8 {q14, q15}, [r1]!
#ifndef WOLFSSL_ARM_ARCH_NEON_64BIT
vrev64.8 q8, q8
vrev64.8 q9, q9
vrev64.8 q10, q10
@ -4227,10 +4232,28 @@ L_sha512_len_neon_begin:
vrev64.8 q13, q13
vrev64.8 q14, q14
vrev64.8 q15, q15
#else
vrev64.8 d16, d16
vrev64.8 d17, d17
vrev64.8 d18, d18
vrev64.8 d19, d19
vrev64.8 d20, d20
vrev64.8 d21, d21
vrev64.8 d22, d22
vrev64.8 d23, d23
vrev64.8 d24, d24
vrev64.8 d25, d25
vrev64.8 d26, d26
vrev64.8 d27, d27
vrev64.8 d28, d28
vrev64.8 d29, d29
vrev64.8 d30, d30
vrev64.8 d31, d31
#endif /* WOLFSSL_ARM_ARCH_NEON_64BIT */
adr r3, L_SHA512_transform_neon_len_k
mov r12, #4
# Start of 16 rounds
L_sha512_len_neon_start:
L_SHA512_transform_neon_len_start:
# Round 0
vld1.64 {d12}, [r3:64]!
vshl.u64 d8, d4, #50
@ -4289,6 +4312,7 @@ L_sha512_len_neon_start:
vadd.i64 d10, d9
vadd.i64 d2, d6
vadd.i64 d6, d10
#ifndef WOLFSSL_ARM_ARCH_NEON_64BIT
# Calc new W[0]-W[1]
vext.8 q6, q8, q9, #8
vshl.u64 q4, q15, #45
@ -4309,6 +4333,47 @@ L_sha512_len_neon_start:
vshr.u64 q6, #7
veor q5, q6
vadd.i64 q8, q5
#else
# Calc new W[0]-W[1]
vmov d12, d17
vmov d13, d18
vshl.u64 d8, d30, #45
vshl.u64 d9, d31, #45
vsri.u64 d8, d30, #19
vsri.u64 d9, d31, #19
vshl.u64 d10, d30, #3
vshl.u64 d11, d31, #3
vsri.u64 d10, d30, #61
vsri.u64 d11, d31, #61
veor d10, d8
veor d11, d9
vshr.u64 d8, d30, #6
vshr.u64 d9, d31, #6
veor d10, d8
veor d11, d9
vadd.i64 d16, d10
vadd.i64 d17, d11
vmov d14, d25
vmov d15, d26
vadd.i64 d16, d14
vadd.i64 d17, d15
vshl.u64 d8, d12, #63
vshl.u64 d9, d13, #63
vsri.u64 d8, d12, #1
vsri.u64 d9, d13, #1
vshl.u64 d10, d12, #56
vshl.u64 d11, d13, #56
vsri.u64 d10, d12, #8
vsri.u64 d11, d13, #8
veor d10, d8
veor d11, d9
vshr.u64 d12, #7
vshr.u64 d13, #7
veor d10, d12
veor d11, d13
vadd.i64 d16, d10
vadd.i64 d17, d11
#endif /* WOLFSSL_ARM_ARCH_NEON_64BIT */
# Round 2
vld1.64 {d12}, [r3:64]!
vshl.u64 d8, d2, #50
@ -4367,6 +4432,7 @@ L_sha512_len_neon_start:
vadd.i64 d10, d9
vadd.i64 d0, d4
vadd.i64 d4, d10
#ifndef WOLFSSL_ARM_ARCH_NEON_64BIT
# Calc new W[2]-W[3]
vext.8 q6, q9, q10, #8
vshl.u64 q4, q8, #45
@ -4387,6 +4453,47 @@ L_sha512_len_neon_start:
vshr.u64 q6, #7
veor q5, q6
vadd.i64 q9, q5
#else
# Calc new W[2]-W[3]
vmov d12, d19
vmov d13, d20
vshl.u64 d8, d16, #45
vshl.u64 d9, d17, #45
vsri.u64 d8, d16, #19
vsri.u64 d9, d17, #19
vshl.u64 d10, d16, #3
vshl.u64 d11, d17, #3
vsri.u64 d10, d16, #61
vsri.u64 d11, d17, #61
veor d10, d8
veor d11, d9
vshr.u64 d8, d16, #6
vshr.u64 d9, d17, #6
veor d10, d8
veor d11, d9
vadd.i64 d18, d10
vadd.i64 d19, d11
vmov d14, d27
vmov d15, d28
vadd.i64 d18, d14
vadd.i64 d19, d15
vshl.u64 d8, d12, #63
vshl.u64 d9, d13, #63
vsri.u64 d8, d12, #1
vsri.u64 d9, d13, #1
vshl.u64 d10, d12, #56
vshl.u64 d11, d13, #56
vsri.u64 d10, d12, #8
vsri.u64 d11, d13, #8
veor d10, d8
veor d11, d9
vshr.u64 d12, #7
vshr.u64 d13, #7
veor d10, d12
veor d11, d13
vadd.i64 d18, d10
vadd.i64 d19, d11
#endif /* WOLFSSL_ARM_ARCH_NEON_64BIT */
# Round 4
vld1.64 {d12}, [r3:64]!
vshl.u64 d8, d0, #50
@ -4445,6 +4552,7 @@ L_sha512_len_neon_start:
vadd.i64 d10, d9
vadd.i64 d6, d2
vadd.i64 d2, d10
#ifndef WOLFSSL_ARM_ARCH_NEON_64BIT
# Calc new W[4]-W[5]
vext.8 q6, q10, q11, #8
vshl.u64 q4, q9, #45
@ -4465,6 +4573,47 @@ L_sha512_len_neon_start:
vshr.u64 q6, #7
veor q5, q6
vadd.i64 q10, q5
#else
# Calc new W[4]-W[5]
vmov d12, d21
vmov d13, d22
vshl.u64 d8, d18, #45
vshl.u64 d9, d19, #45
vsri.u64 d8, d18, #19
vsri.u64 d9, d19, #19
vshl.u64 d10, d18, #3
vshl.u64 d11, d19, #3
vsri.u64 d10, d18, #61
vsri.u64 d11, d19, #61
veor d10, d8
veor d11, d9
vshr.u64 d8, d18, #6
vshr.u64 d9, d19, #6
veor d10, d8
veor d11, d9
vadd.i64 d20, d10
vadd.i64 d21, d11
vmov d14, d29
vmov d15, d30
vadd.i64 d20, d14
vadd.i64 d21, d15
vshl.u64 d8, d12, #63
vshl.u64 d9, d13, #63
vsri.u64 d8, d12, #1
vsri.u64 d9, d13, #1
vshl.u64 d10, d12, #56
vshl.u64 d11, d13, #56
vsri.u64 d10, d12, #8
vsri.u64 d11, d13, #8
veor d10, d8
veor d11, d9
vshr.u64 d12, #7
vshr.u64 d13, #7
veor d10, d12
veor d11, d13
vadd.i64 d20, d10
vadd.i64 d21, d11
#endif /* WOLFSSL_ARM_ARCH_NEON_64BIT */
# Round 6
vld1.64 {d12}, [r3:64]!
vshl.u64 d8, d6, #50
@ -4523,6 +4672,7 @@ L_sha512_len_neon_start:
vadd.i64 d10, d9
vadd.i64 d4, d0
vadd.i64 d0, d10
#ifndef WOLFSSL_ARM_ARCH_NEON_64BIT
# Calc new W[6]-W[7]
vext.8 q6, q11, q12, #8
vshl.u64 q4, q10, #45
@ -4543,6 +4693,47 @@ L_sha512_len_neon_start:
vshr.u64 q6, #7
veor q5, q6
vadd.i64 q11, q5
#else
# Calc new W[6]-W[7]
vmov d12, d23
vmov d13, d24
vshl.u64 d8, d20, #45
vshl.u64 d9, d21, #45
vsri.u64 d8, d20, #19
vsri.u64 d9, d21, #19
vshl.u64 d10, d20, #3
vshl.u64 d11, d21, #3
vsri.u64 d10, d20, #61
vsri.u64 d11, d21, #61
veor d10, d8
veor d11, d9
vshr.u64 d8, d20, #6
vshr.u64 d9, d21, #6
veor d10, d8
veor d11, d9
vadd.i64 d22, d10
vadd.i64 d23, d11
vmov d14, d31
vmov d15, d16
vadd.i64 d22, d14
vadd.i64 d23, d15
vshl.u64 d8, d12, #63
vshl.u64 d9, d13, #63
vsri.u64 d8, d12, #1
vsri.u64 d9, d13, #1
vshl.u64 d10, d12, #56
vshl.u64 d11, d13, #56
vsri.u64 d10, d12, #8
vsri.u64 d11, d13, #8
veor d10, d8
veor d11, d9
vshr.u64 d12, #7
vshr.u64 d13, #7
veor d10, d12
veor d11, d13
vadd.i64 d22, d10
vadd.i64 d23, d11
#endif /* WOLFSSL_ARM_ARCH_NEON_64BIT */
# Round 8
vld1.64 {d12}, [r3:64]!
vshl.u64 d8, d4, #50
@ -4601,6 +4792,7 @@ L_sha512_len_neon_start:
vadd.i64 d10, d9
vadd.i64 d2, d6
vadd.i64 d6, d10
#ifndef WOLFSSL_ARM_ARCH_NEON_64BIT
# Calc new W[8]-W[9]
vext.8 q6, q12, q13, #8
vshl.u64 q4, q11, #45
@ -4621,6 +4813,47 @@ L_sha512_len_neon_start:
vshr.u64 q6, #7
veor q5, q6
vadd.i64 q12, q5
#else
# Calc new W[8]-W[9]
vmov d12, d25
vmov d13, d26
vshl.u64 d8, d22, #45
vshl.u64 d9, d23, #45
vsri.u64 d8, d22, #19
vsri.u64 d9, d23, #19
vshl.u64 d10, d22, #3
vshl.u64 d11, d23, #3
vsri.u64 d10, d22, #61
vsri.u64 d11, d23, #61
veor d10, d8
veor d11, d9
vshr.u64 d8, d22, #6
vshr.u64 d9, d23, #6
veor d10, d8
veor d11, d9
vadd.i64 d24, d10
vadd.i64 d25, d11
vmov d14, d17
vmov d15, d18
vadd.i64 d24, d14
vadd.i64 d25, d15
vshl.u64 d8, d12, #63
vshl.u64 d9, d13, #63
vsri.u64 d8, d12, #1
vsri.u64 d9, d13, #1
vshl.u64 d10, d12, #56
vshl.u64 d11, d13, #56
vsri.u64 d10, d12, #8
vsri.u64 d11, d13, #8
veor d10, d8
veor d11, d9
vshr.u64 d12, #7
vshr.u64 d13, #7
veor d10, d12
veor d11, d13
vadd.i64 d24, d10
vadd.i64 d25, d11
#endif /* WOLFSSL_ARM_ARCH_NEON_64BIT */
# Round 10
vld1.64 {d12}, [r3:64]!
vshl.u64 d8, d2, #50
@ -4679,6 +4912,7 @@ L_sha512_len_neon_start:
vadd.i64 d10, d9
vadd.i64 d0, d4
vadd.i64 d4, d10
#ifndef WOLFSSL_ARM_ARCH_NEON_64BIT
# Calc new W[10]-W[11]
vext.8 q6, q13, q14, #8
vshl.u64 q4, q12, #45
@ -4699,6 +4933,47 @@ L_sha512_len_neon_start:
vshr.u64 q6, #7
veor q5, q6
vadd.i64 q13, q5
#else
# Calc new W[10]-W[11]
vmov d12, d27
vmov d13, d28
vshl.u64 d8, d24, #45
vshl.u64 d9, d25, #45
vsri.u64 d8, d24, #19
vsri.u64 d9, d25, #19
vshl.u64 d10, d24, #3
vshl.u64 d11, d25, #3
vsri.u64 d10, d24, #61
vsri.u64 d11, d25, #61
veor d10, d8
veor d11, d9
vshr.u64 d8, d24, #6
vshr.u64 d9, d25, #6
veor d10, d8
veor d11, d9
vadd.i64 d26, d10
vadd.i64 d27, d11
vmov d14, d19
vmov d15, d20
vadd.i64 d26, d14
vadd.i64 d27, d15
vshl.u64 d8, d12, #63
vshl.u64 d9, d13, #63
vsri.u64 d8, d12, #1
vsri.u64 d9, d13, #1
vshl.u64 d10, d12, #56
vshl.u64 d11, d13, #56
vsri.u64 d10, d12, #8
vsri.u64 d11, d13, #8
veor d10, d8
veor d11, d9
vshr.u64 d12, #7
vshr.u64 d13, #7
veor d10, d12
veor d11, d13
vadd.i64 d26, d10
vadd.i64 d27, d11
#endif /* WOLFSSL_ARM_ARCH_NEON_64BIT */
# Round 12
vld1.64 {d12}, [r3:64]!
vshl.u64 d8, d0, #50
@ -4757,6 +5032,7 @@ L_sha512_len_neon_start:
vadd.i64 d10, d9
vadd.i64 d6, d2
vadd.i64 d2, d10
#ifndef WOLFSSL_ARM_ARCH_NEON_64BIT
# Calc new W[12]-W[13]
vext.8 q6, q14, q15, #8
vshl.u64 q4, q13, #45
@ -4777,6 +5053,47 @@ L_sha512_len_neon_start:
vshr.u64 q6, #7
veor q5, q6
vadd.i64 q14, q5
#else
# Calc new W[12]-W[13]
vmov d12, d29
vmov d13, d30
vshl.u64 d8, d26, #45
vshl.u64 d9, d27, #45
vsri.u64 d8, d26, #19
vsri.u64 d9, d27, #19
vshl.u64 d10, d26, #3
vshl.u64 d11, d27, #3
vsri.u64 d10, d26, #61
vsri.u64 d11, d27, #61
veor d10, d8
veor d11, d9
vshr.u64 d8, d26, #6
vshr.u64 d9, d27, #6
veor d10, d8
veor d11, d9
vadd.i64 d28, d10
vadd.i64 d29, d11
vmov d14, d21
vmov d15, d22
vadd.i64 d28, d14
vadd.i64 d29, d15
vshl.u64 d8, d12, #63
vshl.u64 d9, d13, #63
vsri.u64 d8, d12, #1
vsri.u64 d9, d13, #1
vshl.u64 d10, d12, #56
vshl.u64 d11, d13, #56
vsri.u64 d10, d12, #8
vsri.u64 d11, d13, #8
veor d10, d8
veor d11, d9
vshr.u64 d12, #7
vshr.u64 d13, #7
veor d10, d12
veor d11, d13
vadd.i64 d28, d10
vadd.i64 d29, d11
#endif /* WOLFSSL_ARM_ARCH_NEON_64BIT */
# Round 14
vld1.64 {d12}, [r3:64]!
vshl.u64 d8, d6, #50
@ -4835,6 +5152,7 @@ L_sha512_len_neon_start:
vadd.i64 d10, d9
vadd.i64 d4, d0
vadd.i64 d0, d10
#ifndef WOLFSSL_ARM_ARCH_NEON_64BIT
# Calc new W[14]-W[15]
vext.8 q6, q15, q8, #8
vshl.u64 q4, q14, #45
@ -4855,8 +5173,49 @@ L_sha512_len_neon_start:
vshr.u64 q6, #7
veor q5, q6
vadd.i64 q15, q5
#else
# Calc new W[14]-W[15]
vmov d12, d31
vmov d13, d16
vshl.u64 d8, d28, #45
vshl.u64 d9, d29, #45
vsri.u64 d8, d28, #19
vsri.u64 d9, d29, #19
vshl.u64 d10, d28, #3
vshl.u64 d11, d29, #3
vsri.u64 d10, d28, #61
vsri.u64 d11, d29, #61
veor d10, d8
veor d11, d9
vshr.u64 d8, d28, #6
vshr.u64 d9, d29, #6
veor d10, d8
veor d11, d9
vadd.i64 d30, d10
vadd.i64 d31, d11
vmov d14, d23
vmov d15, d24
vadd.i64 d30, d14
vadd.i64 d31, d15
vshl.u64 d8, d12, #63
vshl.u64 d9, d13, #63
vsri.u64 d8, d12, #1
vsri.u64 d9, d13, #1
vshl.u64 d10, d12, #56
vshl.u64 d11, d13, #56
vsri.u64 d10, d12, #8
vsri.u64 d11, d13, #8
veor d10, d8
veor d11, d9
vshr.u64 d12, #7
vshr.u64 d13, #7
veor d10, d12
veor d11, d13
vadd.i64 d30, d10
vadd.i64 d31, d11
#endif /* WOLFSSL_ARM_ARCH_NEON_64BIT */
subs r12, r12, #1
bne L_sha512_len_neon_start
bne L_SHA512_transform_neon_len_start
# Round 0
vld1.64 {d12}, [r3:64]!
vshl.u64 d8, d4, #50
@ -5323,13 +5682,24 @@ L_sha512_len_neon_start:
vadd.i64 d0, d10
# Add in digest from start
vldm.64 r0, {d8-d15}
#ifndef WOLFSSL_ARM_ARCH_NEON_64BIT
vadd.i64 q0, q0, q4
vadd.i64 q1, q1, q5
vadd.i64 q2, q2, q6
vadd.i64 q3, q3, q7
#else
vadd.i64 d0, d0, d8
vadd.i64 d1, d1, d9
vadd.i64 d2, d2, d10
vadd.i64 d3, d3, d11
vadd.i64 d4, d4, d12
vadd.i64 d5, d5, d13
vadd.i64 d6, d6, d14
vadd.i64 d7, d7, d15
#endif /* WOLFSSL_ARM_ARCH_NEON_64BIT */
vstm.64 r0, {d0-d7}
subs r2, r2, #0x80
bne L_sha512_len_neon_begin
bne L_SHA512_transform_neon_len_begin
vpop {d8-d15}
bx lr
.size Transform_Sha512_Len,.-Transform_Sha512_Len

File diff suppressed because it is too large Load Diff

View File

@ -32,7 +32,8 @@
#include <wolfssl/wolfcrypt/settings.h>
#if !defined(NO_AES) && defined(WOLFSSL_ARMASM)
#if !defined(NO_AES) && defined(WOLFSSL_ARMASM) && \
!defined(WOLFSSL_ARMASM_NO_HW_CRYPTO)
#ifdef HAVE_FIPS
#undef HAVE_FIPS

View File

@ -968,14 +968,16 @@ static WC_INLINE int wc_Chacha_encrypt_256(const word32 input[CHACHA_CHUNK_WORDS
"v21", "v22", "v23"
);
#else
word32 x[CHACHA_CHUNK_WORDS];
word32* x_addr = x;
__asm__ __volatile__ (
// The paper NEON crypto by Daniel J. Bernstein and Peter Schwabe was used to optimize for ARM
// https://cryptojedi.org/papers/neoncrypto-20120320.pdf
".align 2 \n\t"
"LDR r14, %[input] \n\t" // load input address
#ifndef NDEBUG
"PUSH { r7 } \n\t"
#endif
"SUB sp, sp, #16*4 \n\t"
"LDM r14, { r0-r12 } \n\t"
// r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12
@ -985,9 +987,14 @@ static WC_INLINE int wc_Chacha_encrypt_256(const word32 input[CHACHA_CHUNK_WORDS
"VMOV d2, r4, r5 \n\t"
"VMOV d3, r6, r7 \n\t"
"VMOV d4, r8, r9 \n\t"
"STRD r10, r11, %[x_10] \n\t"
"STRD r10, r11, [sp, #4*10] \n\t"
"VMOV d5, r10, r11 \n\t"
#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 8)
"LDR r11, [r14, #4*14] \n\t"
"LDR r10, [r14, #4*15] \n\t"
#else
"LDRD r11, r10, [r14, #4*14] \n\t"
#endif
"VMOV q4, q0 \n\t"
"VMOV q5, q1 \n\t"
"VMOV q6, q2 \n\t"
@ -997,7 +1004,7 @@ static WC_INLINE int wc_Chacha_encrypt_256(const word32 input[CHACHA_CHUNK_WORDS
// r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12
// 0 1 2 3 4 5 6 7 8 9 15 14 12
"VMOV d7, r11, r10 \n\t"
"STR r10, %[x_15] \n\t"
"STR r10, [sp, #4*15] \n\t"
"VMOV d15, r11, r10 \n\t"
"VMOV d23, r11, r10 \n\t"
"MOV r10, r12 \n\t"
@ -1065,22 +1072,22 @@ static WC_INLINE int wc_Chacha_encrypt_256(const word32 input[CHACHA_CHUNK_WORDS
"VSRI.I32 q1, q12, #20 \n\t"
"ADD r9, r9, r11 \n\t" // 9 9 13
"VSRI.I32 q5, q13, #20 \n\t"
"STR r11, %[x_13] \n\t"
"STR r11, [sp, #4*13] \n\t"
"VSRI.I32 q9, q14, #20 \n\t"
"LDR r11, %[x_15] \n\t"
"LDR r11, [sp, #4*15] \n\t"
"VADD.I32 q0, q0, q1 \n\t"
"EOR r4, r4, r8 \n\t" // 4 4 8
"VADD.I32 q4, q4, q5 \n\t"
"STR r8, %[x_8] \n\t"
"STR r8, [sp, #4*8] \n\t"
"VADD.I32 q8, q8, q9 \n\t"
"LDR r8, %[x_10] \n\t"
"LDR r8, [sp, #4*10] \n\t"
"VEOR q12, q3, q0 \n\t"
"EOR r5, r5, r9 \n\t" // 5 5 9
"VEOR q13, q7, q4 \n\t"
"STR r9, %[x_9] \n\t"
"STR r9, [sp, #4*9] \n\t"
"VEOR q14, q11, q8 \n\t"
"LDR r9, %[x_11] \n\t"
"LDR r9, [sp, #4*11] \n\t"
// SIMD instructions don't support rotation so we have to cheat using shifts and a help register
"VSHL.I32 q3, q12, #8 \n\t"
"ROR r4, r4, #25 \n\t" // 4 4
@ -1194,24 +1201,24 @@ static WC_INLINE int wc_Chacha_encrypt_256(const word32 input[CHACHA_CHUNK_WORDS
"VSHL.I32 q9, q14, #12 \n\t"
"ADD r8, r8, r11 \n\t" // 10 10 15
"VSRI.I32 q1, q12, #20 \n\t"
"STR r11, %[x_15] \n\t"
"STR r11, [sp, #4*15] \n\t"
"VSRI.I32 q5, q13, #20 \n\t"
"LDR r11, %[x_13] \n\t"
"LDR r11, [sp, #4*13] \n\t"
"VSRI.I32 q9, q14, #20 \n\t"
"ADD r9, r9, r10 \n\t" // 11 11 12
"VADD.I32 q0, q0, q1 \n\t"
"EOR r5, r5, r8 \n\t" // 5 5 10
"VADD.I32 q4, q4, q5 \n\t"
"STR r8, %[x_10] \n\t"
"STR r8, [sp, #4*10] \n\t"
"VADD.I32 q8, q8, q9 \n\t"
"LDR r8, %[x_8] \n\t"
"LDR r8, [sp, #4*8] \n\t"
"VEOR q12, q3, q0 \n\t"
"EOR r6, r6, r9 \n\t" // 6 6 11
"VEOR q13, q7, q4 \n\t"
"STR r9, %[x_11] \n\t"
"STR r9, [sp, #4*11] \n\t"
"VEOR q14, q11, q8 \n\t"
"LDR r9, %[x_9] \n\t"
"LDR r9, [sp, #4*9] \n\t"
// SIMD instructions don't support rotation so we have to cheat using shifts and a help register
"VSHL.I32 q3, q12, #8 \n\t"
"ROR r5, r5, #25 \n\t" // 5 5
@ -1281,18 +1288,26 @@ static WC_INLINE int wc_Chacha_encrypt_256(const word32 input[CHACHA_CHUNK_WORDS
"BNE L_chacha20_arm32_256_loop_%= \n\t"
"LDR r14, %[x_addr] \n\t" // load address of x to r14
// r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12
// 0 1 2 3 4 5 6 7 8 9 12 13 14
"ADD r10, r10, #3 \n\t" // add three here to make later NEON easier
"STM r14, { r0-r9 } \n\t"
"STRD r10, r11, [r14, #4*12] \n\t"
"STM sp, { r0-r9 } \n\t"
"STRD r10, r11, [sp, #4*12] \n\t"
"STR r12, [sp, #4*14] \n\t"
"ADD sp, sp, #16*4 \n\t"
#ifndef NDEBUG
"POP { r7 } \n\t"
#endif
"LDR r9, %[input] \n\t" // load input address
"STR r12, [r14, #4*14] \n\t"
"LDR r10, %[c] \n\t" // load c address
"VLDM r9, { q12-q15 } \n\t"
"LDR r12, %[m] \n\t" // load m address
#ifndef NDEBUG
"SUB sp, sp, #17*4 \n\t"
#else
"SUB sp, sp, #16*4 \n\t"
#endif
"VADD.I32 q0, q0, q12 \n\t"
"VADD.I32 q1, q1, q13 \n\t"
@ -1324,7 +1339,7 @@ static WC_INLINE int wc_Chacha_encrypt_256(const word32 input[CHACHA_CHUNK_WORDS
"VEOR q3, q3, q15 \n\t"
"VSTM r10!, { q0-q3 } \n\t" // store to c
"VLDM r14, { q0-q3 } \n\t " // load final block from x
"VLDM sp, { q0-q3 } \n\t " // load final block from x
"VLDM r12!, { q12-q15 } \n\t" // load m
"VEOR q4, q4, q12 \n\t"
@ -1353,20 +1368,21 @@ static WC_INLINE int wc_Chacha_encrypt_256(const word32 input[CHACHA_CHUNK_WORDS
"VEOR q3, q3, q15 \n\t"
"VSTM r10!, { q0-q3 } \n\t" // store to c
: [c] "+m" (c),
[x_0] "=m" (x),
[x_8] "=m" (x[8]),
[x_9] "=m" (x[9]),
[x_10] "=m" (x[10]),
[x_11] "=m" (x[11]),
[x_13] "=m" (x[13]),
[x_15] "=m" (x[15])
#ifndef NDEBUG
"ADD sp, sp, #17*4 \n\t"
#else
"ADD sp, sp, #16*4 \n\t"
#endif
: [c] "+m" (c)
: [rounds] "I" (ROUNDS/2), [input] "m" (input),
[chacha_chunk_bytes] "I" (CHACHA_CHUNK_BYTES),
[m] "m" (m), [x_addr] "m" (x_addr)
[m] "m" (m)
: "memory", "cc",
"r0", "r1", "r2", "r3",
"r4", "r5", "r6", "r7",
"r4", "r5", "r6",
#ifdef NDEBUG
"r7",
#endif
"r8", "r9", "r10", "r11", "r12", "r14",
"q0", "q1", "q2", "q3", "q4",
"q5", "q6", "q7", "q8", "q9",
@ -2754,11 +2770,9 @@ static WC_INLINE void wc_Chacha_encrypt_64(const word32* input, const byte* m,
/* XOR 8 bytes */
"CMP %[bytes], #8 \n\t"
"BLT L_chacha20_arm32_64_lt_8_%= \n\t"
"VLDR d8, [%[m], #0] \n\t"
"ADD %[m], %[m], #8 \n\t"
"VLD1.64 { d8 }, [%[m]]! \n\t"
"VEOR d8, d8, d0 \n\t"
"VSTR d8, [%[c], #0] \n\t"
"ADD %[c], %[c], #8 \n\t"
"VST1.64 { d8 }, [%[c]]! \n\t"
"SUBS %[bytes], %[bytes], #8 \n\t"
"VMOV d0, d1 \n\t"
"BEQ L_chacha20_arm32_64_done_%= \n\t"
@ -2772,7 +2786,7 @@ static WC_INLINE void wc_Chacha_encrypt_64(const word32* input, const byte* m,
"EOR r12, r12, r14 \n\t"
"STR r12, [%[c]], #4 \n\t"
"SUBS %[bytes], %[bytes], #4 \n\t"
"VTRN.32 d0, d0 \n\t"
"VSHR.U64 d0, d0, #32 \n\t"
"BEQ L_chacha20_arm32_64_done_%= \n\t"
"\n"
"L_chacha20_arm32_64_lt_4_%=: \n\t"

View File

@ -29,6 +29,7 @@
#endif
#include <wolfssl/wolfcrypt/settings.h>
#include <wolfssl/wolfcrypt/types.h>
#ifdef WOLFSSL_ARMASM
#ifdef __aarch64__

View File

@ -45,6 +45,7 @@
#endif
#ifndef WOLFSSL_ARMASM_NO_HW_CRYPTO
static const ALIGN32 word32 K[64] = {
0x428A2F98L, 0x71374491L, 0xB5C0FBCFL, 0xE9B5DBA5L, 0x3956C25BL,
0x59F111F1L, 0x923F82A4L, 0xAB1C5ED5L, 0xD807AA98L, 0x12835B01L,
@ -60,6 +61,7 @@ static const ALIGN32 word32 K[64] = {
0x682E6FF3L, 0x748F82EEL, 0x78A5636FL, 0x84C87814L, 0x8CC70208L,
0x90BEFFFAL, 0xA4506CEBL, 0xBEF9A3F7L, 0xC67178F2L
};
#endif
static int InitSha256(wc_Sha256* sha256)
@ -94,6 +96,8 @@ static WC_INLINE void AddLength(wc_Sha256* sha256, word32 len)
}
#ifndef WOLFSSL_ARMASM_NO_HW_CRYPTO
#ifdef __aarch64__
/* First block is in sha256->buffer and rest in data. */
@ -1309,6 +1313,109 @@ static WC_INLINE int Sha256Final(wc_Sha256* sha256, byte* hash)
#endif /* __aarch64__ */
#else
extern void Transform_Sha256_Len(wc_Sha256* sha256, const byte* data,
word32 len);
/* ARMv8 hardware acceleration Aarch32 */
static WC_INLINE int Sha256Update(wc_Sha256* sha256, const byte* data, word32 len)
{
int ret = 0;
/* do block size increments */
byte* local = (byte*)sha256->buffer;
word32 blocksLen;
/* check that internal buffLen is valid */
if (sha256->buffLen >= WC_SHA256_BLOCK_SIZE)
return BUFFER_E;
AddLength(sha256, len);
if (sha256->buffLen > 0) {
word32 add = min(len, WC_SHA256_BLOCK_SIZE - sha256->buffLen);
if (add > 0) {
XMEMCPY(&local[sha256->buffLen], data, add);
sha256->buffLen += add;
data += add;
len -= add;
}
if (sha256->buffLen == WC_SHA256_BLOCK_SIZE) {
Transform_Sha256_Len(sha256, (const byte*)sha256->buffer,
WC_SHA256_BLOCK_SIZE);
sha256->buffLen = 0;
}
}
blocksLen = len & ~(WC_SHA256_BLOCK_SIZE-1);
if (blocksLen > 0) {
/* Byte reversal performed in function if required. */
Transform_Sha256_Len(sha256, data, blocksLen);
data += blocksLen;
len -= blocksLen;
}
if (len > 0) {
XMEMCPY(local, data, len);
sha256->buffLen = len;
}
return ret;
}
static WC_INLINE int Sha256Final(wc_Sha256* sha256, byte* hash)
{
byte* local = (byte*)sha256->buffer;
if (sha256 == NULL) {
return BAD_FUNC_ARG;
}
local[sha256->buffLen++] = 0x80; /* add 1 */
/* pad with zeros */
if (sha256->buffLen > WC_SHA256_PAD_SIZE) {
XMEMSET(&local[sha256->buffLen], 0, WC_SHA256_BLOCK_SIZE -
sha256->buffLen);
sha256->buffLen += WC_SHA256_BLOCK_SIZE - sha256->buffLen;
Transform_Sha256_Len(sha256, (const byte*)sha256->buffer,
WC_SHA256_BLOCK_SIZE);
sha256->buffLen = 0;
}
XMEMSET(&local[sha256->buffLen], 0, WC_SHA256_PAD_SIZE - sha256->buffLen);
/* put lengths in bits */
sha256->hiLen = (sha256->loLen >> (8 * sizeof(sha256->loLen) - 3)) +
(sha256->hiLen << 3);
sha256->loLen = sha256->loLen << 3;
/* store lengths */
/* ! length ordering dependent on digest endian type ! */
sha256->buffer[WC_SHA256_BLOCK_SIZE / sizeof(word32) - 2] = sha256->hiLen;
sha256->buffer[WC_SHA256_BLOCK_SIZE / sizeof(word32) - 1] = sha256->loLen;
ByteReverseWords(
&(sha256->buffer[WC_SHA256_BLOCK_SIZE / sizeof(word32) - 2]),
&(sha256->buffer[WC_SHA256_BLOCK_SIZE / sizeof(word32) - 2]),
WC_SHA256_BLOCK_SIZE - WC_SHA256_PAD_SIZE);
Transform_Sha256_Len(sha256, (const byte*)sha256->buffer,
WC_SHA256_BLOCK_SIZE);
#ifdef LITTLE_ENDIAN_ORDER
ByteReverseWords((word32*)hash, sha256->digest, WC_SHA256_DIGEST_SIZE);
#else
XMEMCPY(hash, sha256->digest, WC_SHA256_DIGEST_SIZE);
#endif
return 0;
}
#endif /* !WOLFSSL_ARMASM_NO_HW_CRYPTO */
#ifndef NO_SHA256
@ -1433,7 +1540,11 @@ int wc_Sha256Transform(wc_Sha256* sha256, const unsigned char* data)
#else
XMEMCPY(sha256->buffer, data, WC_SHA256_BLOCK_SIZE);
#endif
#ifndef WOLFSSL_ARMASM_NO_HW_CRYPTO
Sha256Transform(sha256, data, 1);
#else
Transform_Sha256_Len(sha256, data, WC_SHA256_BLOCK_SIZE);
#endif
return 0;
}
#endif

View File

@ -43,6 +43,7 @@ on the specific device platform.
#endif
#include <wolfssl/wolfcrypt/settings.h>
#include <wolfssl/wolfcrypt/types.h>
/*
* SHA256 Build Options:

View File

@ -5959,8 +5959,10 @@ WOLFSSL_TEST_SUBROUTINE int chacha_test(void)
return -4722;
for (i = 0; i < 18; ++i) {
/* this will test all paths */
/* block sizes: 1 2 3 4 7 8 15 16 31 32 63 64 127 128 255 256 511 512 */
/* this will test all paths
* block sizes: 1 3 7 15 31 63 127 255 511 (i = 0- 8)
* 2 4 8 16 32 64 128 256 512 (i = 9-17)
*/
block_size = (2 << (i%9)) - (i<9?1:0);
keySz = 32;
@ -5974,16 +5976,16 @@ WOLFSSL_TEST_SUBROUTINE int chacha_test(void)
if (ret != 0)
return ret;
ret |= wc_Chacha_Process(&enc, cipher_big, plain_big, block_size);
ret |= wc_Chacha_Process(&dec, plain_big, cipher_big, block_size);
ret |= wc_Chacha_Process(&enc, cipher_big, plain_big , block_size);
ret |= wc_Chacha_Process(&dec, plain_big , cipher_big, block_size);
if (ret != 0)
return ret;
if (XMEMCMP(plain_big, input_big, block_size))
return -4723-i;
return -4740-i*2;
if (XMEMCMP(cipher_big, cipher_big_result, block_size))
return -4724-i;
return -4741-i*2;
}
/* Streaming test */