SHA-3 Thumb2, ARM32 ASM: Add assembly implemention

Add SHA-3 assembly implementation for Thumb2 and ARM32.
This commit is contained in:
Sean Parkinson
2024-06-20 11:46:00 +10:00
parent 118d2cc8cc
commit 8734f1251d
16 changed files with 7156 additions and 27 deletions

View File

@ -269,6 +269,15 @@ else
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-sha3-asm.S src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-sha3-asm.S
endif !BUILD_ARMASM_INLINE endif !BUILD_ARMASM_INLINE
endif BUILD_ARMASM_NEON endif BUILD_ARMASM_NEON
if BUILD_ARMASM
if BUILD_ARMASM_INLINE
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-sha3-asm_c.c
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/thumb2-sha3-asm_c.c
else
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-sha3-asm.S
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/thumb2-sha3-asm.S
endif !BUILD_ARMASM_INLINE
endif BUILD_ARMASM
if !BUILD_X86_ASM if !BUILD_X86_ASM
if BUILD_INTELASM if BUILD_INTELASM
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sha3_asm.S src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sha3_asm.S
@ -413,6 +422,15 @@ else
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-sha3-asm.S src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-sha3-asm.S
endif !BUILD_ARMASM_INLINE endif !BUILD_ARMASM_INLINE
endif BUILD_ARMASM_NEON endif BUILD_ARMASM_NEON
if BUILD_ARMASM
if BUILD_ARMASM_INLINE
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-sha3-asm_c.c
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/thumb2-sha3-asm_c.c
else
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-sha3-asm.S
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/thumb2-sha3-asm.S
endif !BUILD_ARMASM_INLINE
endif BUILD_ARMASM
if BUILD_INTELASM if BUILD_INTELASM
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sha3_asm.S src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sha3_asm.S
endif endif
@ -748,6 +766,15 @@ else
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-sha3-asm.S src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-sha3-asm.S
endif !BUILD_ARMASM_INLINE endif !BUILD_ARMASM_INLINE
endif BUILD_ARMASM_NEON endif BUILD_ARMASM_NEON
if BUILD_ARMASM
if BUILD_ARMASM_INLINE
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-sha3-asm_c.c
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/thumb2-sha3-asm_c.c
else
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-sha3-asm.S
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/thumb2-sha3-asm.S
endif !BUILD_ARMASM_INLINE
endif BUILD_ARMASM
if !BUILD_X86_ASM if !BUILD_X86_ASM
if BUILD_INTELASM if BUILD_INTELASM
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sha3_asm.S src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sha3_asm.S

View File

@ -30,7 +30,7 @@
#include <wolfssl/wolfcrypt/settings.h> #include <wolfssl/wolfcrypt/settings.h>
#ifdef WOLFSSL_ARMASM #ifdef WOLFSSL_ARMASM
#if !defined(__aarch64__) && defined(__arm__) #if !defined(__aarch64__) && defined(__arm__) && !defined(__thumb__)
#ifndef WOLFSSL_ARMASM_INLINE #ifndef WOLFSSL_ARMASM_INLINE
#ifndef NO_AES #ifndef NO_AES
#ifdef HAVE_AES_DECRYPT #ifdef HAVE_AES_DECRYPT
@ -5304,7 +5304,7 @@ L_AES_GCM_encrypt_end:
.size AES_GCM_encrypt,.-AES_GCM_encrypt .size AES_GCM_encrypt,.-AES_GCM_encrypt
#endif /* HAVE_AESGCM */ #endif /* HAVE_AESGCM */
#endif /* !NO_AES */ #endif /* !NO_AES */
#endif /* !__aarch64__ && !__thumb__ */ #endif /* !__aarch64__ && __arm__ && !__thumb__ */
#endif /* WOLFSSL_ARMASM */ #endif /* WOLFSSL_ARMASM */
#if defined(__linux__) && defined(__ELF__) #if defined(__linux__) && defined(__ELF__)

View File

@ -31,7 +31,7 @@
#include <wolfssl/wolfcrypt/error-crypt.h> #include <wolfssl/wolfcrypt/error-crypt.h>
#ifdef WOLFSSL_ARMASM #ifdef WOLFSSL_ARMASM
#if !defined(__aarch64__) && defined(__arm__) #if !defined(__aarch64__) && defined(__arm__) && !defined(__thumb__)
#include <stdint.h> #include <stdint.h>
#ifdef HAVE_CONFIG_H #ifdef HAVE_CONFIG_H
#include <config.h> #include <config.h>
@ -41,7 +41,7 @@
#ifdef WOLFSSL_ARMASM_INLINE #ifdef WOLFSSL_ARMASM_INLINE
#ifdef WOLFSSL_ARMASM #ifdef WOLFSSL_ARMASM
#if !defined(__aarch64__) && defined(__arm__) #if !defined(__aarch64__) && defined(__arm__) && !defined(__thumb__)
#ifdef __IAR_SYSTEMS_ICC__ #ifdef __IAR_SYSTEMS_ICC__
#define __asm__ asm #define __asm__ asm
@ -4786,9 +4786,9 @@ void AES_GCM_encrypt(const unsigned char* in_p, unsigned char* out_p, unsigned l
#endif /* HAVE_AESGCM */ #endif /* HAVE_AESGCM */
#endif /* !NO_AES */ #endif /* !NO_AES */
#endif /* !__aarch64__ && !__thumb__ */ #endif /* !__aarch64__ && __arm__ && !__thumb__ */
#endif /* WOLFSSL_ARMASM */ #endif /* WOLFSSL_ARMASM */
#endif /* !defined(__aarch64__) && defined(__arm__) */ #endif /* !defined(__aarch64__) && defined(__arm__) && !defined(__thumb__) */
#endif /* WOLFSSL_ARMASM */ #endif /* WOLFSSL_ARMASM */
#endif /* WOLFSSL_ARMASM_INLINE */ #endif /* WOLFSSL_ARMASM_INLINE */

View File

@ -30,7 +30,7 @@
#include <wolfssl/wolfcrypt/settings.h> #include <wolfssl/wolfcrypt/settings.h>
#ifdef WOLFSSL_ARMASM #ifdef WOLFSSL_ARMASM
#if !defined(__aarch64__) && defined(__arm__) #if !defined(__aarch64__) && defined(__arm__) && !defined(__thumb__)
#ifndef WOLFSSL_ARMASM_INLINE #ifndef WOLFSSL_ARMASM_INLINE
#if defined(HAVE_CURVE25519) || defined(HAVE_ED25519) #if defined(HAVE_CURVE25519) || defined(HAVE_ED25519)
#if !defined(CURVE25519_SMALL) || !defined(ED25519_SMALL) #if !defined(CURVE25519_SMALL) || !defined(ED25519_SMALL)
@ -8771,7 +8771,7 @@ sc_muladd:
#endif /* !CURVE25519_SMALL || !ED25519_SMALL */ #endif /* !CURVE25519_SMALL || !ED25519_SMALL */
#endif /* HAVE_CURVE25519 || HAVE_ED25519 */ #endif /* HAVE_CURVE25519 || HAVE_ED25519 */
#endif /* !__aarch64__ && !__thumb__ */ #endif /* !__aarch64__ && __arm__ && !__thumb__ */
#endif /* WOLFSSL_ARMASM */ #endif /* WOLFSSL_ARMASM */
#if defined(__linux__) && defined(__ELF__) #if defined(__linux__) && defined(__ELF__)

View File

@ -31,7 +31,7 @@
#include <wolfssl/wolfcrypt/error-crypt.h> #include <wolfssl/wolfcrypt/error-crypt.h>
#ifdef WOLFSSL_ARMASM #ifdef WOLFSSL_ARMASM
#if !defined(__aarch64__) && defined(__arm__) #if !defined(__aarch64__) && defined(__arm__) && !defined(__thumb__)
#include <stdint.h> #include <stdint.h>
#ifdef HAVE_CONFIG_H #ifdef HAVE_CONFIG_H
#include <config.h> #include <config.h>
@ -41,7 +41,7 @@
#ifdef WOLFSSL_ARMASM_INLINE #ifdef WOLFSSL_ARMASM_INLINE
#ifdef WOLFSSL_ARMASM #ifdef WOLFSSL_ARMASM
#if !defined(__aarch64__) && defined(__arm__) #if !defined(__aarch64__) && defined(__arm__) && !defined(__thumb__)
#ifdef __IAR_SYSTEMS_ICC__ #ifdef __IAR_SYSTEMS_ICC__
#define __asm__ asm #define __asm__ asm
@ -8995,9 +8995,9 @@ void sc_muladd(byte* s_p, const byte* a_p, const byte* b_p, const byte* c_p)
#endif /* !CURVE25519_SMALL || !ED25519_SMALL */ #endif /* !CURVE25519_SMALL || !ED25519_SMALL */
#endif /* HAVE_CURVE25519 || HAVE_ED25519 */ #endif /* HAVE_CURVE25519 || HAVE_ED25519 */
#endif /* !__aarch64__ && !__thumb__ */ #endif /* !__aarch64__ && __arm__ && !__thumb__ */
#endif /* WOLFSSL_ARMASM */ #endif /* WOLFSSL_ARMASM */
#endif /* !defined(__aarch64__) && defined(__arm__) */ #endif /* !defined(__aarch64__) && defined(__arm__) && !defined(__thumb__) */
#endif /* WOLFSSL_ARMASM */ #endif /* WOLFSSL_ARMASM */
#endif /* WOLFSSL_ARMASM_INLINE */ #endif /* WOLFSSL_ARMASM_INLINE */

View File

@ -30,7 +30,7 @@
#include <wolfssl/wolfcrypt/settings.h> #include <wolfssl/wolfcrypt/settings.h>
#ifdef WOLFSSL_ARMASM #ifdef WOLFSSL_ARMASM
#if !defined(__aarch64__) && defined(__arm__) #if !defined(__aarch64__) && defined(__arm__) && !defined(__thumb__)
#ifndef WOLFSSL_ARMASM_INLINE #ifndef WOLFSSL_ARMASM_INLINE
#ifndef NO_SHA256 #ifndef NO_SHA256
#ifdef WOLFSSL_ARMASM_NO_NEON #ifdef WOLFSSL_ARMASM_NO_NEON
@ -2865,7 +2865,7 @@ L_SHA256_transform_neon_len_start:
.size Transform_Sha256_Len,.-Transform_Sha256_Len .size Transform_Sha256_Len,.-Transform_Sha256_Len
#endif /* WOLFSSL_ARMASM_NO_NEON */ #endif /* WOLFSSL_ARMASM_NO_NEON */
#endif /* !NO_SHA256 */ #endif /* !NO_SHA256 */
#endif /* !__aarch64__ && !__thumb__ */ #endif /* !__aarch64__ && __arm__ && !__thumb__ */
#endif /* WOLFSSL_ARMASM */ #endif /* WOLFSSL_ARMASM */
#if defined(__linux__) && defined(__ELF__) #if defined(__linux__) && defined(__ELF__)

View File

@ -31,7 +31,7 @@
#include <wolfssl/wolfcrypt/error-crypt.h> #include <wolfssl/wolfcrypt/error-crypt.h>
#ifdef WOLFSSL_ARMASM #ifdef WOLFSSL_ARMASM
#if !defined(__aarch64__) && defined(__arm__) #if !defined(__aarch64__) && defined(__arm__) && !defined(__thumb__)
#include <stdint.h> #include <stdint.h>
#ifdef HAVE_CONFIG_H #ifdef HAVE_CONFIG_H
#include <config.h> #include <config.h>
@ -41,7 +41,7 @@
#ifdef WOLFSSL_ARMASM_INLINE #ifdef WOLFSSL_ARMASM_INLINE
#ifdef WOLFSSL_ARMASM #ifdef WOLFSSL_ARMASM
#if !defined(__aarch64__) && defined(__arm__) #if !defined(__aarch64__) && defined(__arm__) && !defined(__thumb__)
#ifdef __IAR_SYSTEMS_ICC__ #ifdef __IAR_SYSTEMS_ICC__
#define __asm__ asm #define __asm__ asm
@ -2802,9 +2802,9 @@ void Transform_Sha256_Len(wc_Sha256* sha256_p, const byte* data_p, word32 len_p)
#endif /* WOLFSSL_ARMASM_NO_NEON */ #endif /* WOLFSSL_ARMASM_NO_NEON */
#endif /* !NO_SHA256 */ #endif /* !NO_SHA256 */
#endif /* !__aarch64__ && !__thumb__ */ #endif /* !__aarch64__ && __arm__ && !__thumb__ */
#endif /* WOLFSSL_ARMASM */ #endif /* WOLFSSL_ARMASM */
#endif /* !defined(__aarch64__) && defined(__arm__) */ #endif /* !defined(__aarch64__) && defined(__arm__) && !defined(__thumb__) */
#endif /* WOLFSSL_ARMASM */ #endif /* WOLFSSL_ARMASM */
#endif /* WOLFSSL_ARMASM_INLINE */ #endif /* WOLFSSL_ARMASM_INLINE */

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -30,7 +30,7 @@
#include <wolfssl/wolfcrypt/settings.h> #include <wolfssl/wolfcrypt/settings.h>
#ifdef WOLFSSL_ARMASM #ifdef WOLFSSL_ARMASM
#if !defined(__aarch64__) && defined(__arm__) #if !defined(__aarch64__) && defined(__arm__) && !defined(__thumb__)
#ifndef WOLFSSL_ARMASM_INLINE #ifndef WOLFSSL_ARMASM_INLINE
#ifdef WOLFSSL_SHA512 #ifdef WOLFSSL_SHA512
#ifdef WOLFSSL_ARMASM_NO_NEON #ifdef WOLFSSL_ARMASM_NO_NEON
@ -9366,7 +9366,7 @@ L_SHA512_transform_neon_len_start:
.size Transform_Sha512_Len,.-Transform_Sha512_Len .size Transform_Sha512_Len,.-Transform_Sha512_Len
#endif /* !WOLFSSL_ARMASM_NO_NEON */ #endif /* !WOLFSSL_ARMASM_NO_NEON */
#endif /* WOLFSSL_SHA512 */ #endif /* WOLFSSL_SHA512 */
#endif /* !__aarch64__ && !__thumb__ */ #endif /* !__aarch64__ && __arm__ && !__thumb__ */
#endif /* WOLFSSL_ARMASM */ #endif /* WOLFSSL_ARMASM */
#if defined(__linux__) && defined(__ELF__) #if defined(__linux__) && defined(__ELF__)

View File

@ -31,7 +31,7 @@
#include <wolfssl/wolfcrypt/error-crypt.h> #include <wolfssl/wolfcrypt/error-crypt.h>
#ifdef WOLFSSL_ARMASM #ifdef WOLFSSL_ARMASM
#if !defined(__aarch64__) && defined(__arm__) #if !defined(__aarch64__) && defined(__arm__) && !defined(__thumb__)
#include <stdint.h> #include <stdint.h>
#ifdef HAVE_CONFIG_H #ifdef HAVE_CONFIG_H
#include <config.h> #include <config.h>
@ -41,7 +41,7 @@
#ifdef WOLFSSL_ARMASM_INLINE #ifdef WOLFSSL_ARMASM_INLINE
#ifdef WOLFSSL_ARMASM #ifdef WOLFSSL_ARMASM
#if !defined(__aarch64__) && defined(__arm__) #if !defined(__aarch64__) && defined(__arm__) && !defined(__thumb__)
#ifdef __IAR_SYSTEMS_ICC__ #ifdef __IAR_SYSTEMS_ICC__
#define __asm__ asm #define __asm__ asm
@ -9159,9 +9159,9 @@ void Transform_Sha512_Len(wc_Sha512* sha512_p, const byte* data_p, word32 len_p)
#endif /* !WOLFSSL_ARMASM_NO_NEON */ #endif /* !WOLFSSL_ARMASM_NO_NEON */
#endif /* WOLFSSL_SHA512 */ #endif /* WOLFSSL_SHA512 */
#endif /* !__aarch64__ && !__thumb__ */ #endif /* !__aarch64__ && __arm__ && !__thumb__ */
#endif /* WOLFSSL_ARMASM */ #endif /* WOLFSSL_ARMASM */
#endif /* !defined(__aarch64__) && defined(__arm__) */ #endif /* !defined(__aarch64__) && defined(__arm__) && !defined(__thumb__) */
#endif /* WOLFSSL_ARMASM */ #endif /* WOLFSSL_ARMASM */
#endif /* WOLFSSL_ARMASM_INLINE */ #endif /* WOLFSSL_ARMASM_INLINE */

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -39,7 +39,7 @@
.text .text
.type L_SHA512_transform_len_k, %object .type L_SHA512_transform_len_k, %object
.size L_SHA512_transform_len_k, 640 .size L_SHA512_transform_len_k, 640
.align 4 .align 8
L_SHA512_transform_len_k: L_SHA512_transform_len_k:
.word 0xd728ae22 .word 0xd728ae22
.word 0x428a2f98 .word 0x428a2f98

View File

@ -59,7 +59,8 @@
} }
#endif #endif
#if !defined(WOLFSSL_ARMASM) || !defined(WOLFSSL_ARMASM_CRYPTO_SHA3) #if !defined(WOLFSSL_ARMASM) || (!defined(__arm__) && \
!defined(WOLFSSL_ARMASM_CRYPTO_SHA3))
#ifdef USE_INTEL_SPEEDUP #ifdef USE_INTEL_SPEEDUP
#include <wolfssl/wolfcrypt/cpuid.h> #include <wolfssl/wolfcrypt/cpuid.h>

View File

@ -216,7 +216,8 @@ WOLFSSL_LOCAL void sha3_block_bmi2(word64* s);
WOLFSSL_LOCAL void sha3_block_avx2(word64* s); WOLFSSL_LOCAL void sha3_block_avx2(word64* s);
WOLFSSL_LOCAL void BlockSha3(word64 *s); WOLFSSL_LOCAL void BlockSha3(word64 *s);
#endif #endif
#if defined(WOLFSSL_ARMASM) && defined(WOLFSSL_ARMASM_CRYPTO_SHA3) #if defined(WOLFSSL_ARMASM) && (defined(__arm__) || \
defined(WOLFSSL_ARMASM_CRYPTO_SHA3))
WOLFSSL_LOCAL void BlockSha3(word64 *s); WOLFSSL_LOCAL void BlockSha3(word64 *s);
#endif #endif