Skip to content

Commit 0638ec2

Browse files
committed
AES ARM32 and Thumb2 ASM: fixup ARM32 and add Thumb2
Fix which functions and data are compiled in depending on defines. Better handing of constants. Also fix Aarch64 ed25519 inline assembly.
1 parent 70c362f commit 0638ec2

22 files changed

Lines changed: 6511 additions & 652 deletions

configure.ac

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2268,7 +2268,7 @@ AC_ARG_ENABLE([aescbc],
22682268
if test "$ENABLED_AESCBC" = "no"
22692269
then
22702270
AM_CFLAGS="$AM_CFLAGS -DNO_AES_CBC"
2271-
AM_CCASFLAGS="$AM_CCASFLAGS -DHAVE_AES_CBC"
2271+
AM_CCASFLAGS="$AM_CCASFLAGS -DNO_AES_CBC"
22722272
fi
22732273

22742274
# AES-CBC length checks (checks that input lengths are multiples of block size)

src/include.am

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -157,16 +157,24 @@ endif
157157

158158
if BUILD_AES
159159
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/aes.c
160-
if BUILD_ARMASM_NEON
161160
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-aes.c
161+
if BUILD_ARMASM_NEON
162162
if !BUILD_ARMASM_CRYPTO
163163
if BUILD_ARMASM_INLINE
164164
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-aes-asm_c.c
165165
else
166166
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-aes-asm.S
167167
endif !BUILD_ARMASM_INLINE
168168
endif !BUILD_ARMASM_CRYPTO
169-
endif BUILD_ARMASM_NEON
169+
else
170+
if BUILD_ARMASM
171+
if BUILD_ARMASM_INLINE
172+
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/thumb2-aes-asm_c.c
173+
else
174+
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/thumb2-aes-asm.S
175+
endif !BUILD_ARMASM_INLINE
176+
endif BUILD_ARMASM
177+
endif !BUILD_ARMASM_NEON
170178
endif BUILD_AES
171179

172180
if BUILD_AESNI
@@ -401,16 +409,26 @@ endif
401409
if !BUILD_FIPS_CURRENT
402410
if BUILD_AES
403411
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/aes.c
404-
if BUILD_ARMASM_NEON
405412
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-aes.c
413+
if BUILD_ARMASM_NEON
406414
if !BUILD_ARMASM_CRYPTO
407415
if BUILD_ARMASM_INLINE
408416
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-aes-asm_c.c
417+
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/thumb2-aes-asm_c.c
409418
else
410419
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-aes-asm.S
420+
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/thumb2-aes-asm.S
411421
endif !BUILD_ARMASM_INLINE
412422
endif !BUILD_ARMASM_CRYPTO
413-
endif BUILD_ARMASM_NEON
423+
else
424+
if BUILD_ARMASM
425+
if BUILD_ARMASM_INLINE
426+
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/thumb2-aes-asm_c.c
427+
else
428+
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/thumb2-aes-asm.S
429+
endif !BUILD_ARMASM_INLINE
430+
endif BUILD_ARMASM
431+
endif !BUILD_ARMASM_NEON
414432
if BUILD_AFALG
415433
src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/af_alg/afalg_aes.c
416434
endif BUILD_AFALG

wolfcrypt/src/aes.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ block cipher mechanism that uses n-bit binary string parameter key with 128-bits
9797
#include <wolfcrypt/src/misc.c>
9898
#endif
9999

100-
#if !defined(WOLFSSL_ARMASM) || defined(WOLFSSL_ARMASM_NO_NEON)
100+
#ifndef WOLFSSL_ARMASM
101101

102102
#ifdef WOLFSSL_IMX6_CAAM_BLOB
103103
/* case of possibly not using hardware acceleration for AES but using key
@@ -4573,7 +4573,7 @@ int wc_AesSetIV(Aes* aes, const byte* iv)
45734573
#endif /* NEED_AES_CTR_SOFT */
45744574

45754575
#endif /* WOLFSSL_AES_COUNTER */
4576-
#endif /* !WOLFSSL_ARMASM || WOLFSSL_ARMASM_NO_NEON */
4576+
#endif /* !WOLFSSL_ARMASM */
45774577

45784578

45794579
/*
@@ -4620,7 +4620,7 @@ static WC_INLINE void IncCtr(byte* ctr, word32 ctrSz)
46204620

46214621
#endif
46224622

4623-
#if defined(WOLFSSL_ARMASM) && !defined(WOLFSSL_ARMASM_NO_NEON)
4623+
#ifdef WOLFSSL_ARMASM
46244624
/* implementation is located in wolfcrypt/src/port/arm/armv8-aes.c */
46254625

46264626
#elif defined(WOLFSSL_AFALG)
@@ -8851,7 +8851,7 @@ int wc_AesCcmCheckTagSize(int sz)
88518851
return 0;
88528852
}
88538853

8854-
#if defined(WOLFSSL_ARMASM) && !defined(WOLFSSL_ARMASM_NO_NEON)
8854+
#ifdef WOLFSSL_ARMASM
88558855
/* implementation located in wolfcrypt/src/port/arm/armv8-aes.c */
88568856

88578857
#elif defined(HAVE_COLDFIRE_SEC)

wolfcrypt/src/ge_operations.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -921,10 +921,14 @@ int ge_compress_key(byte* out, const byte* xIn, const byte* yIn, word32 keySz)
921921
{
922922
ge_p2 g;
923923
byte bArray[ED25519_KEY_SIZE];
924+
byte x[ED25519_KEY_SIZE];
925+
byte y[ED25519_KEY_SIZE];
924926
word32 i;
925927

926-
fe_frombytes(g.X, xIn);
927-
fe_frombytes(g.Y, yIn);
928+
XMEMCPY(x, xIn, ED25519_KEY_SIZE);
929+
XMEMCPY(y, yIn, ED25519_KEY_SIZE);
930+
fe_frombytes(g.X, x);
931+
fe_frombytes(g.Y, y);
928932
fe_1(g.Z);
929933

930934
ge_tobytes(bArray, &g);

wolfcrypt/src/port/arm/armv8-32-aes-asm.S

Lines changed: 28 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
#if !defined(__aarch64__) && defined(__arm__)
3434
#ifndef WOLFSSL_ARMASM_INLINE
3535
#ifndef NO_AES
36+
#ifdef HAVE_AES_DECRYPT
3637
.text
3738
.type L_AES_ARM32_td_data, %object
3839
.size L_AES_ARM32_td_data, 1024
@@ -294,6 +295,8 @@ L_AES_ARM32_td_data:
294295
.word 0x70d532b6
295296
.word 0x74486c5c
296297
.word 0x42d0b857
298+
#endif /* HAVE_AES_DECRYPT */
299+
#if defined(HAVE_AES_DECRYPT) || defined(HAVE_AES_CBC) || defined(HAVE_AESCCM) || defined(HAVE_AESGCM) || defined(WOLFSSL_AES_DIRECT) || defined(WOLFSSL_AES_COUNTER)
297300
.text
298301
.type L_AES_ARM32_te_data, %object
299302
.size L_AES_ARM32_te_data, 1024
@@ -555,27 +558,34 @@ L_AES_ARM32_te_data:
555558
.word 0xfca85454
556559
.word 0xd66dbbbb
557560
.word 0x3a2c1616
561+
#endif /* HAVE_AES_DECRYPT || HAVE_AES_CBC || HAVE_AESCCM || HAVE_AESGCM || WOLFSSL_AES_DIRECT || WOLFSSL_AES_COUNTER */
562+
#ifdef HAVE_AES_DECRYPT
558563
.text
559564
.type L_AES_ARM32_td, %object
560565
.size L_AES_ARM32_td, 12
561566
.align 4
562567
L_AES_ARM32_td:
563568
.word L_AES_ARM32_td_data
569+
#endif /* HAVE_AES_DECRYPT */
570+
#if defined(HAVE_AES_DECRYPT) || defined(HAVE_AES_CBC) || defined(HAVE_AESCCM) || defined(HAVE_AESGCM) || defined(WOLFSSL_AES_DIRECT) || defined(WOLFSSL_AES_COUNTER)
564571
.text
565572
.type L_AES_ARM32_te, %object
566573
.size L_AES_ARM32_te, 12
567574
.align 4
568575
L_AES_ARM32_te:
569576
.word L_AES_ARM32_te_data
577+
#endif /* HAVE_AES_DECRYPT || HAVE_AES_CBC || HAVE_AESCCM || HAVE_AESGCM || WOLFSSL_AES_DIRECT || WOLFSSL_AES_COUNTER */
570578
#ifdef HAVE_AES_DECRYPT
571579
.text
572580
.align 4
573581
.globl AES_invert_key
574582
.type AES_invert_key, %function
575583
AES_invert_key:
576584
push {r4, r5, r6, r7, r8, r9, r10, r11, lr}
577-
ldr r12, L_AES_ARM32_te
578-
ldr lr, L_AES_ARM32_td
585+
adr r12, L_AES_ARM32_te
586+
ldr r12, [r12]
587+
adr lr, L_AES_ARM32_td
588+
ldr lr, [lr]
579589
add r10, r0, r1, lsl #4
580590
mov r11, r1
581591
L_AES_invert_key_loop:
@@ -681,7 +691,8 @@ L_AES_ARM32_rcon:
681691
.type AES_set_encrypt_key, %function
682692
AES_set_encrypt_key:
683693
push {r4, r5, r6, r7, r8, lr}
684-
ldr r8, L_AES_ARM32_te
694+
adr r8, L_AES_ARM32_te
695+
ldr r8, [r8]
685696
adr lr, L_AES_ARM32_rcon
686697
cmp r1, #0x80
687698
beq L_AES_set_encrypt_key_start_128
@@ -911,7 +922,6 @@ L_AES_set_encrypt_key_loop_128:
911922
L_AES_set_encrypt_key_end:
912923
pop {r4, r5, r6, r7, r8, pc}
913924
.size AES_set_encrypt_key,.-AES_set_encrypt_key
914-
#if defined(HAVE_AESCCM) || defined(HAVE_AESGCM) || defined(WOLFSSL_AES_DIRECT) || defined(WOLFSSL_AES_COUNTER)
915925
.text
916926
.align 4
917927
.globl AES_encrypt_block
@@ -1123,12 +1133,14 @@ L_AES_encrypt_block_nr:
11231133
eor r7, r7, r11
11241134
pop {pc}
11251135
.size AES_encrypt_block,.-AES_encrypt_block
1136+
#if defined(HAVE_AES_CBC) || defined(HAVE_AESCCM) || defined(HAVE_AESGCM) || defined(WOLFSSL_AES_DIRECT) || defined(WOLFSSL_AES_COUNTER)
11261137
.text
11271138
.type L_AES_ARM32_te_ecb, %object
11281139
.size L_AES_ARM32_te_ecb, 12
11291140
.align 4
11301141
L_AES_ARM32_te_ecb:
11311142
.word L_AES_ARM32_te_data
1143+
#endif /* HAVE_AES_CBC || HAVE_AESCCM || HAVE_AESGCM || WOLFSSL_AES_DIRECT || WOLFSSL_AES_COUNTER */
11321144
#if defined(HAVE_AESCCM) || defined(HAVE_AESGCM) || defined(WOLFSSL_AES_DIRECT) || defined(WOLFSSL_AES_COUNTER)
11331145
.text
11341146
.align 4
@@ -1137,7 +1149,8 @@ L_AES_ARM32_te_ecb:
11371149
AES_ECB_encrypt:
11381150
push {r4, r5, r6, r7, r8, r9, r10, r11, lr}
11391151
mov lr, r0
1140-
ldr r0, L_AES_ARM32_te_ecb
1152+
adr r0, L_AES_ARM32_te_ecb
1153+
ldr r0, [r0]
11411154
ldr r12, [sp, #36]
11421155
push {r3}
11431156
cmp r12, #10
@@ -1259,7 +1272,8 @@ AES_CBC_encrypt:
12591272
ldr r8, [sp, #36]
12601273
ldr r9, [sp, #40]
12611274
mov lr, r0
1262-
ldr r0, L_AES_ARM32_te_ecb
1275+
adr r0, L_AES_ARM32_te_ecb
1276+
ldr r0, [r0]
12631277
ldm r9, {r4, r5, r6, r7}
12641278
push {r3, r9}
12651279
cmp r8, #10
@@ -1394,7 +1408,8 @@ AES_CTR_encrypt:
13941408
ldr r12, [sp, #36]
13951409
ldr r8, [sp, #40]
13961410
mov lr, r0
1397-
ldr r0, L_AES_ARM32_te_ecb
1411+
adr r0, L_AES_ARM32_te_ecb
1412+
ldr r0, [r0]
13981413
ldm r8, {r4, r5, r6, r7}
13991414
rev r4, r4
14001415
rev r5, r5
@@ -1540,7 +1555,6 @@ L_AES_CTR_encrypt_end:
15401555
pop {r4, r5, r6, r7, r8, r9, r10, r11, pc}
15411556
.size AES_CTR_encrypt,.-AES_CTR_encrypt
15421557
#endif /* WOLFSSL_AES_COUNTER */
1543-
#endif /* HAVE_AESCCM || HAVE_AESGCM || WOLFSSL_AES_DIRECT || WOLFSSL_AES_COUNTER */
15441558
#ifdef HAVE_AES_DECRYPT
15451559
#if defined(WOLFSSL_AES_DIRECT) || defined(WOLFSSL_AES_COUNTER) || defined(HAVE_AES_CBC)
15461560
.text
@@ -2030,7 +2044,8 @@ AES_ECB_decrypt:
20302044
push {r4, r5, r6, r7, r8, r9, r10, r11, lr}
20312045
ldr r8, [sp, #36]
20322046
mov lr, r0
2033-
ldr r0, L_AES_ARM32_td_ecb
2047+
adr r0, L_AES_ARM32_td_ecb
2048+
ldr r0, [r0]
20342049
adr r12, L_AES_ARM32_td4
20352050
cmp r8, #10
20362051
beq L_AES_ECB_decrypt_start_block_128
@@ -2147,7 +2162,8 @@ AES_CBC_decrypt:
21472162
ldr r8, [sp, #36]
21482163
ldr r4, [sp, #40]
21492164
mov lr, r0
2150-
ldr r0, L_AES_ARM32_td_ecb
2165+
adr r0, L_AES_ARM32_td_ecb
2166+
ldr r0, [r0]
21512167
adr r12, L_AES_ARM32_td4
21522168
push {r3, r4}
21532169
cmp r8, #10
@@ -3118,7 +3134,8 @@ AES_GCM_encrypt:
31183134
ldr r12, [sp, #36]
31193135
ldr r8, [sp, #40]
31203136
mov lr, r0
3121-
ldr r0, L_AES_ARM32_te_gcm
3137+
adr r0, L_AES_ARM32_te_gcm
3138+
ldr r0, [r0]
31223139
ldm r8, {r4, r5, r6, r7}
31233140
rev r4, r4
31243141
rev r5, r5

0 commit comments

Comments
 (0)