Skip to content

Commit 36b92a4

Browse files
committed
Thumb2 ASM, Curve25519
Add support for compiling ASM for Thumb2 Add Curve25519 ASM for Thumb2 Limit assembly code compiled when Ed25519 not required. Rework all assembly implementations to replace ge_*() functions instead of having fe_ge_*() versions that take many parameters. Get ARM32 inline asm working.
1 parent 8272870 commit 36b92a4

45 files changed

Lines changed: 51497 additions & 38073 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

configure.ac

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2559,6 +2559,7 @@ then
25592559
# Include options.h
25602560
AM_CCASFLAGS="$AM_CCASFLAGS -DEXTERNAL_OPTS_OPENVPN"
25612561
ENABLED_ARMASM_CRYPTO=yes
2562+
ENABLED_ARMASM_NEON=yes
25622563

25632564
# Check for and set -mstrict-align compiler flag
25642565
# Used to set assumption that Aarch64 systems will not handle
@@ -2578,18 +2579,30 @@ then
25782579
AC_MSG_NOTICE([64bit ARMv8 found, setting mcpu to generic+crypto])
25792580
;;
25802581
armv7a*)
2581-
AM_CPPFLAGS="$AM_CPPFLAGS -march=armv7-a -mfpu=neon -DWOLFSSL_ARMASM_NO_HW_CRYPTO -DWOLFSSL_ARM_ARCH=7"
2582+
AM_CPPFLAGS="$AM_CPPFLAGS -march=armv7-a -mfpu=neon -DWOLFSSL_ARM_ARCH=7"
25822583
# Include options.h
25832584
AM_CCASFLAGS="$AM_CCASFLAGS -DEXTERNAL_OPTS_OPENVPN"
25842585
ENABLED_ARMASM_CRYPTO=no
25852586
ENABLED_AESGCM_STREAM=no # not yet implemented
2587+
ENABLED_ARMASM_NEON=yes
25862588
AC_MSG_NOTICE([32bit ARMv7-a found, setting mfpu to neon])
25872589
;;
2590+
armv7m*)
2591+
# QEMU doesn't work with armv7-m
2592+
AM_CPPFLAGS="$AM_CPPFLAGS -march=armv7-r -D__thumb__ -fomit-frame-pointer -DWOLFSSL_ARMASM_NO_HW_CRYPTO -DWOLFSSL_ARM_ARCH=7"
2593+
# Include options.h
2594+
AM_CCASFLAGS="$AM_CCASFLAGS -DEXTERNAL_OPTS_OPENVPN"
2595+
ENABLED_ARMASM_CRYPTO=no
2596+
ENABLED_AESGCM_STREAM=no # not yet implemented
2597+
ENABLED_ARMASM_NEON=no
2598+
AC_MSG_NOTICE([32bit ARMv7-m found])
2599+
;;
25882600
*)
2589-
AM_CPPFLAGS="$AM_CPPFLAGS -mfpu=crypto-neon-fp-armv8"
2601+
AM_CPPFLAGS="$AM_CPPFLAGS -mfpu=crypto-neon-fp-armv8 -marm"
25902602
# Include options.h
25912603
AM_CCASFLAGS="$AM_CCASFLAGS -DEXTERNAL_OPTS_OPENVPN"
25922604
ENABLED_ARMASM_CRYPTO=yes
2605+
ENABLED_ARMASM_NEON=yes
25932606
AC_MSG_NOTICE([32bit ARMv8 found, setting mfpu to crypto-neon-fp-armv8])
25942607
;;
25952608
esac
@@ -2606,6 +2619,17 @@ fi
26062619
if test "$ENABLED_ARMASM_SM4" = "yes"; then
26072620
AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_ARMASM_CRYPTO_SM4"
26082621
fi
2622+
if test "$ENABLED_ARMASM_CRYPTO" = "no"; then
2623+
AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_ARMASM_NO_HW_CRYPTO"
2624+
fi
2625+
if test "$ENABLED_ARMASM_NEON" = "no"; then
2626+
AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_ARMASM_NO_NEON"
2627+
AM_CCASFLAGS="$AM_CCASFLAGS -DWOLFSSL_ARMASM_NO_NEON"
2628+
fi
2629+
2630+
if test "$ENABLED_ARMASM_INLINE" = "yes"; then
2631+
AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_ARMASM_INLINE"
2632+
fi
26092633

26102634
# Xilinx hardened crypto
26112635
AC_ARG_ENABLE([xilinx],
@@ -3598,6 +3622,7 @@ then
35983622
fi
35993623

36003624
AM_CFLAGS="$AM_CFLAGS -DHAVE_CURVE25519"
3625+
AM_CCASFLAGS="$AM_CCASFLAGS -DHAVE_CURVE25519"
36013626
ENABLED_FEMATH=yes
36023627
fi
36033628

@@ -8379,6 +8404,8 @@ AS_IF([test "x$ENABLED_CERTEXT" = "xyes"],
83798404

83808405
AS_IF([test "x$ENABLED_ED25519" = "xyes" && test "x$ENABLED_32BIT" = "xno"],
83818406
[AM_CFLAGS="$AM_CFLAGS -DHAVE_ED25519"])
8407+
AS_IF([test "x$ENABLED_ED25519" = "xyes" && test "x$ENABLED_32BIT" = "xno"],
8408+
[AM_CCASFLAGS="$AM_CCASFLAGS -DHAVE_ED25519"])
83828409

83838410
AS_IF([test "x$ENABLED_ED25519_SMALL" = "xyes"],
83848411
[AM_CFLAGS="$AM_CFLAGS -DED25519_SMALL"])
@@ -8841,6 +8868,7 @@ AM_CONDITIONAL([BUILD_AESCCM],[test "x$ENABLED_AESCCM" = "xyes" || test "x$ENABL
88418868
AM_CONDITIONAL([BUILD_ARMASM],[test "x$ENABLED_ARMASM" = "xyes"])
88428869
AM_CONDITIONAL([BUILD_ARMASM_INLINE],[test "x$ENABLED_ARMASM_INLINE" = "xyes"])
88438870
AM_CONDITIONAL([BUILD_ARMASM_CRYPTO],[test "x$ENABLED_ARMASM_CRYPTO" = "xyes"])
8871+
AM_CONDITIONAL([BUILD_ARMASM_NEON],[test "x$ENABLED_ARMASM_NEON" = "xyes"])
88448872
AM_CONDITIONAL([BUILD_XILINX],[test "x$ENABLED_XILINX" = "xyes"])
88458873
AM_CONDITIONAL([BUILD_AESNI],[test "x$ENABLED_AESNI" = "xyes"])
88468874
AM_CONDITIONAL([BUILD_INTELASM],[test "x$ENABLED_INTELASM" = "xyes"])

src/include.am

Lines changed: 101 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -157,13 +157,17 @@ endif
157157

158158
if BUILD_AES
159159
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/aes.c
160-
if BUILD_ARMASM
160+
if BUILD_ARMASM_NEON
161161
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-aes.c
162162
if !BUILD_ARMASM_CRYPTO
163+
if BUILD_ARMASM_INLINE
164+
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-aes-asm_c.c
165+
else
163166
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-aes-asm.S
164-
endif
165-
endif
166-
endif
167+
endif !BUILD_ARMASM_INLINE
168+
endif !BUILD_ARMASM_CRYPTO
169+
endif BUILD_ARMASM_NEON
170+
endif BUILD_AES
167171

168172
if BUILD_AESNI
169173
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/aes_asm.S
@@ -178,47 +182,65 @@ if BUILD_SHA
178182
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sha.c
179183
endif
180184

181-
if BUILD_ARMASM
185+
if BUILD_ARMASM_NEON
182186
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-sha256.c
183187
if BUILD_ARMASM_INLINE
184188
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-sha256-asm_c.c
185189
else
186190
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-sha256-asm.S
187-
endif
191+
endif !BUILD_ARMASM_INLINE
192+
else
193+
if BUILD_ARMASM
194+
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-sha256.c
195+
if BUILD_ARMASM_INLINE
196+
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/thumb2-sha256-asm_c.c
197+
else
198+
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/thumb2-sha256-asm.S
199+
endif !BUILD_ARMASM_INLINE
188200
else
189201
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sha256.c
190202
if BUILD_INTELASM
191203
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sha256_asm.S
192-
endif
193-
endif
204+
endif BUILD_INTELASM
205+
endif !BUILD_ARMASM
206+
endif !BUILD_ARMASM_NEON
194207

195208
if BUILD_SHA512
196-
if BUILD_ARMASM
209+
if BUILD_ARMASM_NEON
197210
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-sha512.c
198211
if BUILD_ARMASM_INLINE
199212
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-sha512-asm_c.c
200213
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-sha512-asm_c.c
201214
else
202215
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-sha512-asm.S
203216
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-sha512-asm.S
204-
endif
217+
endif !BUILD_ARMASM_INLINE
218+
else
219+
if BUILD_ARMASM
220+
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-sha512.c
221+
if BUILD_ARMASM_INLINE
222+
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/thumb2-sha512-asm_c.c
223+
else
224+
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/thumb2-sha512-asm.S
225+
endif !BUILD_ARMASM_INLINE
205226
else
206227
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sha512.c
207228
if BUILD_INTELASM
208229
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sha512_asm.S
209-
endif
210-
endif
211-
endif
230+
endif BUILD_INTELASM
231+
endif !BUILD_ARMASM
232+
endif !BUILD_ARMASM_NEON
233+
endif BUILD_SHA512
212234

213235
if BUILD_SHA3
214236
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sha3.c
215-
if BUILD_ARMASM
237+
if BUILD_ARMASM_NEON
216238
if BUILD_ARMASM_INLINE
217239
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-sha3-asm_c.c
218240
else
219241
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-sha3-asm.S
220-
endif
221-
endif
242+
endif !BUILD_ARMASM_INLINE
243+
endif BUILD_ARMASM_NEON
222244
if BUILD_INTELASM
223245
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sha3_asm.S
224246
endif
@@ -283,18 +305,27 @@ endif !BUILD_FIPS_CURRENT
283305

284306
if !BUILD_FIPS_CURRENT
285307
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sha256.c
286-
if BUILD_ARMASM
308+
if BUILD_ARMASM_NEON
287309
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-sha256.c
288310
if BUILD_ARMASM_INLINE
289311
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-sha256-asm_c.c
290312
else
291313
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-sha256-asm.S
292-
endif
314+
endif !BUILD_ARMASM_INLINE
315+
else
316+
if BUILD_ARMASM
317+
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-sha256.c
318+
if BUILD_ARMASM_INLINE
319+
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/thumb2-sha256-asm_c.c
320+
else
321+
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/thumb2-sha256-asm.S
322+
endif !BUILD_ARMASM_INLINE
293323
else
294324
if BUILD_INTELASM
295325
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sha256_asm.S
296-
endif
297-
endif
326+
endif BUILD_INTELASM
327+
endif !BUILD_ARMASM
328+
endif !BUILD_ARMASM_NEON
298329
endif !BUILD_FIPS_CURRENT
299330

300331
if BUILD_AFALG
@@ -370,15 +401,19 @@ endif
370401
if !BUILD_FIPS_CURRENT
371402
if BUILD_AES
372403
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/aes.c
373-
if BUILD_ARMASM
404+
if BUILD_ARMASM_NEON
374405
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-aes.c
375406
if !BUILD_ARMASM_CRYPTO
407+
if BUILD_ARMASM_INLINE
408+
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-aes-asm_c.c
409+
else
376410
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-aes-asm.S
411+
endif !BUILD_ARMASM_INLINE
377412
endif !BUILD_ARMASM_CRYPTO
378-
endif BUILD_ARMASM
413+
endif BUILD_ARMASM_NEON
379414
if BUILD_AFALG
380415
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/af_alg/afalg_aes.c
381-
endif
416+
endif BUILD_AFALG
382417
endif BUILD_AES
383418
endif !BUILD_FIPS_CURRENT
384419

@@ -402,34 +437,43 @@ endif !BUILD_FIPS_CURRENT
402437

403438
if !BUILD_FIPS_CURRENT
404439
if BUILD_SHA512
405-
if BUILD_ARMASM
440+
if BUILD_ARMASM_NEON
406441
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-sha512.c
407442
if BUILD_ARMASM_INLINE
408443
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-sha512-asm_c.c
409444
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-sha512-asm_c.c
410445
else
411446
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-sha512-asm.S
412447
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-sha512-asm.S
413-
endif
448+
endif !BUILD_ARMASM_INLINE
449+
else
450+
if BUILD_ARMASM
451+
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-sha512.c
452+
if BUILD_ARMASM_INLINE
453+
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/thumb2-sha512-asm_c.c
454+
else
455+
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/thumb2-sha512-asm.S
456+
endif !BUILD_ARMASM_INLINE
414457
else
415458
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sha512.c
416459
if BUILD_INTELASM
417460
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sha512_asm.S
418-
endif
419-
endif
420-
endif
461+
endif BUILD_INTELASM
462+
endif !BUILD_ARMASM
463+
endif !BUILD_ARMASM_NEON
464+
endif BUILD_SHA512
421465
endif !BUILD_FIPS_CURRENT
422466

423467
if !BUILD_FIPS_CURRENT
424468
if BUILD_SHA3
425469
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sha3.c
426-
if BUILD_ARMASM
470+
if BUILD_ARMASM_NEON
427471
if BUILD_ARMASM_INLINE
428472
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-sha3-asm_c.c
429473
else
430474
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-sha3-asm.S
431-
endif
432-
endif
475+
endif !BUILD_ARMASM_INLINE
476+
endif BUILD_ARMASM_NEON
433477
if BUILD_INTELASM
434478
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sha3_asm.S
435479
endif
@@ -569,7 +613,7 @@ src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/blake2s.c
569613
endif
570614

571615
if BUILD_CHACHA
572-
if BUILD_ARMASM
616+
if BUILD_ARMASM_NEON
573617
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-chacha.c
574618
else
575619
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/chacha.c
@@ -637,19 +681,29 @@ if BUILD_INTELASM
637681
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/fe_x25519_asm.S
638682
else
639683
if BUILD_ARMASM
684+
if BUILD_ARMASM_NEON
640685
if BUILD_ARMASM_INLINE
641686
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-curve25519_c.c
642687
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-curve25519_c.c
643688
else
644689
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-curve25519.S
645690
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-curve25519.S
646-
endif
691+
endif !BUILD_ARMASM_INLINE
692+
else
693+
if BUILD_ARMASM_INLINE
694+
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/thumb2-curve25519_c.c
695+
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-curve25519_c.c
696+
else
697+
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/thumb2-curve25519.S
698+
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-curve25519.S
699+
endif !BUILD_ARMASM_INLINE
700+
endif !BUILD_ARMASM_NEON
647701
else
648702
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/fe_operations.c
649-
endif
650-
endif
651-
endif
652-
endif
703+
endif !BUILD_ARMASM
704+
endif !BUILD_INTELASM
705+
endif !BUILD_CURVE25519_SMALL
706+
endif BUILD_FEMATH
653707

654708
if BUILD_GEMATH
655709
if BUILD_ED25519_SMALL
@@ -661,12 +715,22 @@ if BUILD_INTELASM
661715
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/fe_x25519_asm.S
662716
else
663717
if BUILD_ARMASM
718+
if BUILD_ARMASM_NEON
664719
if BUILD_ARMASM_INLINE
665720
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-curve25519_c.c
666721
else
667722
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-curve25519.S
668723
endif
669724
else
725+
if BUILD_ARMASM_INLINE
726+
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/thumb2-curve25519_c.c
727+
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-curve25519_c.c
728+
else
729+
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/thumb2-curve25519.S
730+
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-curve25519.S
731+
endif
732+
endif
733+
else
670734
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/fe_operations.c
671735
endif
672736
endif

0 commit comments

Comments
 (0)