Index: third_party/boringssl/linux-arm/crypto/aes/bsaes-armv7.S |
diff --git a/third_party/boringssl/linux-arm/crypto/aes/bsaes-armv7.S b/third_party/boringssl/linux-arm/crypto/aes/bsaes-armv7.S |
index cbc32fb57f6ae729a5ce65bbc93b97aabbf170b5..0feeab0b1d65c9ddb04d0f90b6d52b9209bc8d9c 100644 |
--- a/third_party/boringssl/linux-arm/crypto/aes/bsaes-armv7.S |
+++ b/third_party/boringssl/linux-arm/crypto/aes/bsaes-armv7.S |
@@ -60,135 +60,141 @@ |
# define BSAES_ASM_EXTENDED_KEY |
# define XTS_CHAIN_TWEAK |
# define __ARM_ARCH__ __LINUX_ARM_ARCH__ |
+# define __ARM_MAX_ARCH__ 7 |
#endif |
#ifdef __thumb__ |
# define adrl adr |
#endif |
-#if __ARM_ARCH__>=7 |
+#if __ARM_MAX_ARCH__>=7 |
+.arch armv7-a |
+.fpu neon |
+ |
.text |
.syntax unified @ ARMv7-capable assembler is expected to handle this |
-#ifdef __thumb2__ |
+#if defined(__thumb2__) && !defined(__APPLE__) |
.thumb |
#else |
-.code 32 |
+.code 32 |
#endif |
-.fpu neon |
- |
.type _bsaes_decrypt8,%function |
.align 4 |
_bsaes_decrypt8: |
adr r6,_bsaes_decrypt8 |
vldmia r4!, {q9} @ round 0 key |
+#ifdef __APPLE__ |
+ adr r6,.LM0ISR |
+#else |
add r6,r6,#.LM0ISR-_bsaes_decrypt8 |
+#endif |
vldmia r6!, {q8} @ .LM0ISR |
veor q10, q0, q9 @ xor with round0 key |
veor q11, q1, q9 |
- vtbl.8 d0, {q10}, d16 |
- vtbl.8 d1, {q10}, d17 |
+ vtbl.8 d0, {q10}, d16 |
+ vtbl.8 d1, {q10}, d17 |
veor q12, q2, q9 |
- vtbl.8 d2, {q11}, d16 |
- vtbl.8 d3, {q11}, d17 |
+ vtbl.8 d2, {q11}, d16 |
+ vtbl.8 d3, {q11}, d17 |
veor q13, q3, q9 |
- vtbl.8 d4, {q12}, d16 |
- vtbl.8 d5, {q12}, d17 |
+ vtbl.8 d4, {q12}, d16 |
+ vtbl.8 d5, {q12}, d17 |
veor q14, q4, q9 |
- vtbl.8 d6, {q13}, d16 |
- vtbl.8 d7, {q13}, d17 |
+ vtbl.8 d6, {q13}, d16 |
+ vtbl.8 d7, {q13}, d17 |
veor q15, q5, q9 |
- vtbl.8 d8, {q14}, d16 |
- vtbl.8 d9, {q14}, d17 |
+ vtbl.8 d8, {q14}, d16 |
+ vtbl.8 d9, {q14}, d17 |
veor q10, q6, q9 |
- vtbl.8 d10, {q15}, d16 |
- vtbl.8 d11, {q15}, d17 |
+ vtbl.8 d10, {q15}, d16 |
+ vtbl.8 d11, {q15}, d17 |
veor q11, q7, q9 |
- vtbl.8 d12, {q10}, d16 |
- vtbl.8 d13, {q10}, d17 |
- vtbl.8 d14, {q11}, d16 |
- vtbl.8 d15, {q11}, d17 |
+ vtbl.8 d12, {q10}, d16 |
+ vtbl.8 d13, {q10}, d17 |
+ vtbl.8 d14, {q11}, d16 |
+ vtbl.8 d15, {q11}, d17 |
vmov.i8 q8,#0x55 @ compose .LBS0 |
vmov.i8 q9,#0x33 @ compose .LBS1 |
vshr.u64 q10, q6, #1 |
- vshr.u64 q11, q4, #1 |
- veor q10, q10, q7 |
- veor q11, q11, q5 |
- vand q10, q10, q8 |
- vand q11, q11, q8 |
- veor q7, q7, q10 |
+ vshr.u64 q11, q4, #1 |
+ veor q10, q10, q7 |
+ veor q11, q11, q5 |
+ vand q10, q10, q8 |
+ vand q11, q11, q8 |
+ veor q7, q7, q10 |
vshl.u64 q10, q10, #1 |
- veor q5, q5, q11 |
- vshl.u64 q11, q11, #1 |
- veor q6, q6, q10 |
- veor q4, q4, q11 |
+ veor q5, q5, q11 |
+ vshl.u64 q11, q11, #1 |
+ veor q6, q6, q10 |
+ veor q4, q4, q11 |
vshr.u64 q10, q2, #1 |
- vshr.u64 q11, q0, #1 |
- veor q10, q10, q3 |
- veor q11, q11, q1 |
- vand q10, q10, q8 |
- vand q11, q11, q8 |
- veor q3, q3, q10 |
+ vshr.u64 q11, q0, #1 |
+ veor q10, q10, q3 |
+ veor q11, q11, q1 |
+ vand q10, q10, q8 |
+ vand q11, q11, q8 |
+ veor q3, q3, q10 |
vshl.u64 q10, q10, #1 |
- veor q1, q1, q11 |
- vshl.u64 q11, q11, #1 |
- veor q2, q2, q10 |
- veor q0, q0, q11 |
+ veor q1, q1, q11 |
+ vshl.u64 q11, q11, #1 |
+ veor q2, q2, q10 |
+ veor q0, q0, q11 |
vmov.i8 q8,#0x0f @ compose .LBS2 |
vshr.u64 q10, q5, #2 |
- vshr.u64 q11, q4, #2 |
- veor q10, q10, q7 |
- veor q11, q11, q6 |
- vand q10, q10, q9 |
- vand q11, q11, q9 |
- veor q7, q7, q10 |
+ vshr.u64 q11, q4, #2 |
+ veor q10, q10, q7 |
+ veor q11, q11, q6 |
+ vand q10, q10, q9 |
+ vand q11, q11, q9 |
+ veor q7, q7, q10 |
vshl.u64 q10, q10, #2 |
- veor q6, q6, q11 |
- vshl.u64 q11, q11, #2 |
- veor q5, q5, q10 |
- veor q4, q4, q11 |
+ veor q6, q6, q11 |
+ vshl.u64 q11, q11, #2 |
+ veor q5, q5, q10 |
+ veor q4, q4, q11 |
vshr.u64 q10, q1, #2 |
- vshr.u64 q11, q0, #2 |
- veor q10, q10, q3 |
- veor q11, q11, q2 |
- vand q10, q10, q9 |
- vand q11, q11, q9 |
- veor q3, q3, q10 |
+ vshr.u64 q11, q0, #2 |
+ veor q10, q10, q3 |
+ veor q11, q11, q2 |
+ vand q10, q10, q9 |
+ vand q11, q11, q9 |
+ veor q3, q3, q10 |
vshl.u64 q10, q10, #2 |
- veor q2, q2, q11 |
- vshl.u64 q11, q11, #2 |
- veor q1, q1, q10 |
- veor q0, q0, q11 |
+ veor q2, q2, q11 |
+ vshl.u64 q11, q11, #2 |
+ veor q1, q1, q10 |
+ veor q0, q0, q11 |
vshr.u64 q10, q3, #4 |
- vshr.u64 q11, q2, #4 |
- veor q10, q10, q7 |
- veor q11, q11, q6 |
- vand q10, q10, q8 |
- vand q11, q11, q8 |
- veor q7, q7, q10 |
+ vshr.u64 q11, q2, #4 |
+ veor q10, q10, q7 |
+ veor q11, q11, q6 |
+ vand q10, q10, q8 |
+ vand q11, q11, q8 |
+ veor q7, q7, q10 |
vshl.u64 q10, q10, #4 |
- veor q6, q6, q11 |
- vshl.u64 q11, q11, #4 |
- veor q3, q3, q10 |
- veor q2, q2, q11 |
+ veor q6, q6, q11 |
+ vshl.u64 q11, q11, #4 |
+ veor q3, q3, q10 |
+ veor q2, q2, q11 |
vshr.u64 q10, q1, #4 |
- vshr.u64 q11, q0, #4 |
- veor q10, q10, q5 |
- veor q11, q11, q4 |
- vand q10, q10, q8 |
- vand q11, q11, q8 |
- veor q5, q5, q10 |
+ vshr.u64 q11, q0, #4 |
+ veor q10, q10, q5 |
+ veor q11, q11, q4 |
+ vand q10, q10, q8 |
+ vand q11, q11, q8 |
+ veor q5, q5, q10 |
vshl.u64 q10, q10, #4 |
- veor q4, q4, q11 |
- vshl.u64 q11, q11, #4 |
- veor q1, q1, q10 |
- veor q0, q0, q11 |
+ veor q4, q4, q11 |
+ vshl.u64 q11, q11, #4 |
+ veor q1, q1, q10 |
+ veor q0, q0, q11 |
sub r5,r5,#1 |
b .Ldec_sbox |
.align 4 |
.Ldec_loop: |
- vldmia r4!, {q8-q11} |
+ vldmia r4!, {q8,q9,q10,q11} |
veor q8, q8, q0 |
veor q9, q9, q1 |
vtbl.8 d0, {q8}, d24 |
@@ -218,17 +224,17 @@ _bsaes_decrypt8: |
vtbl.8 d14, {q11}, d24 |
vtbl.8 d15, {q11}, d25 |
.Ldec_sbox: |
- veor q1, q1, q4 |
+ veor q1, q1, q4 |
veor q3, q3, q4 |
veor q4, q4, q7 |
- veor q1, q1, q6 |
+ veor q1, q1, q6 |
veor q2, q2, q7 |
veor q6, q6, q4 |
veor q0, q0, q1 |
veor q2, q2, q5 |
- veor q7, q7, q6 |
+ veor q7, q7, q6 |
veor q3, q3, q0 |
veor q5, q5, q0 |
veor q1, q1, q3 |
@@ -236,7 +242,7 @@ _bsaes_decrypt8: |
veor q10, q7, q4 |
veor q9, q1, q6 |
veor q13, q4, q0 |
- vmov q8, q10 |
+ vmov q8, q10 |
veor q12, q5, q2 |
vorr q10, q10, q9 |
@@ -293,7 +299,7 @@ _bsaes_decrypt8: |
veor q14, q14, q11 |
veor q12, q5, q2 |
veor q8, q1, q6 |
- veor q10, q15, q14 |
+ veor q10, q15, q14 |
vand q10, q10, q5 |
veor q5, q5, q1 |
vand q11, q1, q15 |
@@ -303,19 +309,19 @@ _bsaes_decrypt8: |
veor q15, q15, q13 |
veor q14, q14, q9 |
veor q11, q15, q14 |
- veor q10, q13, q9 |
+ veor q10, q13, q9 |
vand q11, q11, q12 |
- vand q10, q10, q2 |
+ vand q10, q10, q2 |
veor q12, q12, q8 |
- veor q2, q2, q6 |
+ veor q2, q2, q6 |
vand q8, q8, q15 |
- vand q6, q6, q13 |
+ vand q6, q6, q13 |
vand q12, q12, q14 |
- vand q2, q2, q9 |
+ vand q2, q2, q9 |
veor q8, q8, q12 |
- veor q2, q2, q6 |
+ veor q2, q2, q6 |
veor q12, q12, q11 |
- veor q6, q6, q10 |
+ veor q6, q6, q10 |
veor q5, q5, q12 |
veor q2, q2, q12 |
veor q1, q1, q8 |
@@ -324,22 +330,22 @@ _bsaes_decrypt8: |
veor q12, q3, q0 |
veor q8, q7, q4 |
veor q11, q15, q14 |
- veor q10, q13, q9 |
+ veor q10, q13, q9 |
vand q11, q11, q12 |
- vand q10, q10, q0 |
+ vand q10, q10, q0 |
veor q12, q12, q8 |
- veor q0, q0, q4 |
+ veor q0, q0, q4 |
vand q8, q8, q15 |
- vand q4, q4, q13 |
+ vand q4, q4, q13 |
vand q12, q12, q14 |
- vand q0, q0, q9 |
+ vand q0, q0, q9 |
veor q8, q8, q12 |
- veor q0, q0, q4 |
+ veor q0, q0, q4 |
veor q12, q12, q11 |
- veor q4, q4, q10 |
+ veor q4, q4, q10 |
veor q15, q15, q13 |
veor q14, q14, q9 |
- veor q10, q15, q14 |
+ veor q10, q15, q14 |
vand q10, q10, q3 |
veor q3, q3, q7 |
vand q11, q7, q15 |
@@ -357,10 +363,10 @@ _bsaes_decrypt8: |
veor q2, q2, q7 |
veor q5, q5, q7 |
veor q4, q4, q2 |
- veor q7, q7, q0 |
+ veor q7, q7, q0 |
veor q4, q4, q5 |
- veor q3, q3, q6 |
- veor q6, q6, q1 |
+ veor q3, q3, q6 |
+ veor q6, q6, q1 |
veor q3, q3, q4 |
veor q4, q4, q0 |
@@ -385,58 +391,58 @@ _bsaes_decrypt8: |
veor q12, q12, q2 |
veor q13, q13, q7 |
- veor q0, q0, q14 |
- veor q1, q1, q14 |
- veor q6, q6, q8 |
- veor q2, q2, q10 |
- veor q4, q4, q9 |
- veor q1, q1, q15 |
- veor q6, q6, q15 |
- veor q2, q2, q14 |
- veor q7, q7, q11 |
- veor q4, q4, q14 |
- veor q3, q3, q12 |
- veor q2, q2, q15 |
- veor q7, q7, q15 |
- veor q5, q5, q13 |
+ veor q0, q0, q14 |
+ veor q1, q1, q14 |
+ veor q6, q6, q8 |
+ veor q2, q2, q10 |
+ veor q4, q4, q9 |
+ veor q1, q1, q15 |
+ veor q6, q6, q15 |
+ veor q2, q2, q14 |
+ veor q7, q7, q11 |
+ veor q4, q4, q14 |
+ veor q3, q3, q12 |
+ veor q2, q2, q15 |
+ veor q7, q7, q15 |
+ veor q5, q5, q13 |
vext.8 q8, q0, q0, #12 @ x0 <<< 32 |
vext.8 q9, q1, q1, #12 |
- veor q0, q0, q8 @ x0 ^ (x0 <<< 32) |
+ veor q0, q0, q8 @ x0 ^ (x0 <<< 32) |
vext.8 q10, q6, q6, #12 |
- veor q1, q1, q9 |
+ veor q1, q1, q9 |
vext.8 q11, q4, q4, #12 |
- veor q6, q6, q10 |
+ veor q6, q6, q10 |
vext.8 q12, q2, q2, #12 |
- veor q4, q4, q11 |
+ veor q4, q4, q11 |
vext.8 q13, q7, q7, #12 |
- veor q2, q2, q12 |
+ veor q2, q2, q12 |
vext.8 q14, q3, q3, #12 |
- veor q7, q7, q13 |
+ veor q7, q7, q13 |
vext.8 q15, q5, q5, #12 |
- veor q3, q3, q14 |
+ veor q3, q3, q14 |
veor q9, q9, q0 |
- veor q5, q5, q15 |
- vext.8 q0, q0, q0, #8 @ (x0 ^ (x0 <<< 32)) <<< 64) |
+ veor q5, q5, q15 |
+ vext.8 q0, q0, q0, #8 @ (x0 ^ (x0 <<< 32)) <<< 64) |
veor q10, q10, q1 |
veor q8, q8, q5 |
veor q9, q9, q5 |
- vext.8 q1, q1, q1, #8 |
+ vext.8 q1, q1, q1, #8 |
veor q13, q13, q2 |
- veor q0, q0, q8 |
+ veor q0, q0, q8 |
veor q14, q14, q7 |
- veor q1, q1, q9 |
- vext.8 q8, q2, q2, #8 |
+ veor q1, q1, q9 |
+ vext.8 q8, q2, q2, #8 |
veor q12, q12, q4 |
- vext.8 q9, q7, q7, #8 |
+ vext.8 q9, q7, q7, #8 |
veor q15, q15, q3 |
- vext.8 q2, q4, q4, #8 |
+ vext.8 q2, q4, q4, #8 |
veor q11, q11, q6 |
- vext.8 q7, q5, q5, #8 |
+ vext.8 q7, q5, q5, #8 |
veor q12, q12, q5 |
- vext.8 q4, q3, q3, #8 |
+ vext.8 q4, q3, q3, #8 |
veor q11, q11, q5 |
- vext.8 q3, q6, q6, #8 |
+ vext.8 q3, q6, q6, #8 |
veor q5, q9, q13 |
veor q11, q11, q2 |
veor q7, q7, q15 |
@@ -456,78 +462,78 @@ _bsaes_decrypt8: |
vmov.i8 q8,#0x55 @ compose .LBS0 |
vmov.i8 q9,#0x33 @ compose .LBS1 |
vshr.u64 q10, q3, #1 |
- vshr.u64 q11, q2, #1 |
- veor q10, q10, q5 |
- veor q11, q11, q7 |
- vand q10, q10, q8 |
- vand q11, q11, q8 |
- veor q5, q5, q10 |
+ vshr.u64 q11, q2, #1 |
+ veor q10, q10, q5 |
+ veor q11, q11, q7 |
+ vand q10, q10, q8 |
+ vand q11, q11, q8 |
+ veor q5, q5, q10 |
vshl.u64 q10, q10, #1 |
- veor q7, q7, q11 |
- vshl.u64 q11, q11, #1 |
- veor q3, q3, q10 |
- veor q2, q2, q11 |
+ veor q7, q7, q11 |
+ vshl.u64 q11, q11, #1 |
+ veor q3, q3, q10 |
+ veor q2, q2, q11 |
vshr.u64 q10, q6, #1 |
- vshr.u64 q11, q0, #1 |
- veor q10, q10, q4 |
- veor q11, q11, q1 |
- vand q10, q10, q8 |
- vand q11, q11, q8 |
- veor q4, q4, q10 |
+ vshr.u64 q11, q0, #1 |
+ veor q10, q10, q4 |
+ veor q11, q11, q1 |
+ vand q10, q10, q8 |
+ vand q11, q11, q8 |
+ veor q4, q4, q10 |
vshl.u64 q10, q10, #1 |
- veor q1, q1, q11 |
- vshl.u64 q11, q11, #1 |
- veor q6, q6, q10 |
- veor q0, q0, q11 |
+ veor q1, q1, q11 |
+ vshl.u64 q11, q11, #1 |
+ veor q6, q6, q10 |
+ veor q0, q0, q11 |
vmov.i8 q8,#0x0f @ compose .LBS2 |
vshr.u64 q10, q7, #2 |
- vshr.u64 q11, q2, #2 |
- veor q10, q10, q5 |
- veor q11, q11, q3 |
- vand q10, q10, q9 |
- vand q11, q11, q9 |
- veor q5, q5, q10 |
+ vshr.u64 q11, q2, #2 |
+ veor q10, q10, q5 |
+ veor q11, q11, q3 |
+ vand q10, q10, q9 |
+ vand q11, q11, q9 |
+ veor q5, q5, q10 |
vshl.u64 q10, q10, #2 |
- veor q3, q3, q11 |
- vshl.u64 q11, q11, #2 |
- veor q7, q7, q10 |
- veor q2, q2, q11 |
+ veor q3, q3, q11 |
+ vshl.u64 q11, q11, #2 |
+ veor q7, q7, q10 |
+ veor q2, q2, q11 |
vshr.u64 q10, q1, #2 |
- vshr.u64 q11, q0, #2 |
- veor q10, q10, q4 |
- veor q11, q11, q6 |
- vand q10, q10, q9 |
- vand q11, q11, q9 |
- veor q4, q4, q10 |
+ vshr.u64 q11, q0, #2 |
+ veor q10, q10, q4 |
+ veor q11, q11, q6 |
+ vand q10, q10, q9 |
+ vand q11, q11, q9 |
+ veor q4, q4, q10 |
vshl.u64 q10, q10, #2 |
- veor q6, q6, q11 |
- vshl.u64 q11, q11, #2 |
- veor q1, q1, q10 |
- veor q0, q0, q11 |
+ veor q6, q6, q11 |
+ vshl.u64 q11, q11, #2 |
+ veor q1, q1, q10 |
+ veor q0, q0, q11 |
vshr.u64 q10, q4, #4 |
- vshr.u64 q11, q6, #4 |
- veor q10, q10, q5 |
- veor q11, q11, q3 |
- vand q10, q10, q8 |
- vand q11, q11, q8 |
- veor q5, q5, q10 |
+ vshr.u64 q11, q6, #4 |
+ veor q10, q10, q5 |
+ veor q11, q11, q3 |
+ vand q10, q10, q8 |
+ vand q11, q11, q8 |
+ veor q5, q5, q10 |
vshl.u64 q10, q10, #4 |
- veor q3, q3, q11 |
- vshl.u64 q11, q11, #4 |
- veor q4, q4, q10 |
- veor q6, q6, q11 |
+ veor q3, q3, q11 |
+ vshl.u64 q11, q11, #4 |
+ veor q4, q4, q10 |
+ veor q6, q6, q11 |
vshr.u64 q10, q1, #4 |
- vshr.u64 q11, q0, #4 |
- veor q10, q10, q7 |
- veor q11, q11, q2 |
- vand q10, q10, q8 |
- vand q11, q11, q8 |
- veor q7, q7, q10 |
+ vshr.u64 q11, q0, #4 |
+ veor q10, q10, q7 |
+ veor q11, q11, q2 |
+ vand q10, q10, q8 |
+ vand q11, q11, q8 |
+ veor q7, q7, q10 |
vshl.u64 q10, q10, #4 |
- veor q2, q2, q11 |
- vshl.u64 q11, q11, #4 |
- veor q1, q1, q10 |
- veor q0, q0, q11 |
+ veor q2, q2, q11 |
+ vshl.u64 q11, q11, #4 |
+ veor q1, q1, q10 |
+ veor q0, q0, q11 |
vldmia r4, {q8} @ last round key |
veor q6, q6, q8 |
veor q4, q4, q8 |
@@ -543,23 +549,24 @@ _bsaes_decrypt8: |
.type _bsaes_const,%object |
.align 6 |
_bsaes_const: |
-.LM0ISR: @ InvShiftRows constants |
- .quad 0x0a0e0206070b0f03, 0x0004080c0d010509 |
+.LM0ISR:@ InvShiftRows constants |
+.quad 0x0a0e0206070b0f03, 0x0004080c0d010509 |
.LISR: |
- .quad 0x0504070602010003, 0x0f0e0d0c080b0a09 |
+.quad 0x0504070602010003, 0x0f0e0d0c080b0a09 |
.LISRM0: |
- .quad 0x01040b0e0205080f, 0x0306090c00070a0d |
-.LM0SR: @ ShiftRows constants |
- .quad 0x0a0e02060f03070b, 0x0004080c05090d01 |
+.quad 0x01040b0e0205080f, 0x0306090c00070a0d |
+.LM0SR:@ ShiftRows constants |
+.quad 0x0a0e02060f03070b, 0x0004080c05090d01 |
.LSR: |
- .quad 0x0504070600030201, 0x0f0e0d0c0a09080b |
+.quad 0x0504070600030201, 0x0f0e0d0c0a09080b |
.LSRM0: |
- .quad 0x0304090e00050a0f, 0x01060b0c0207080d |
+.quad 0x0304090e00050a0f, 0x01060b0c0207080d |
.LM0: |
- .quad 0x02060a0e03070b0f, 0x0004080c0105090d |
+.quad 0x02060a0e03070b0f, 0x0004080c0105090d |
.LREVM0SR: |
- .quad 0x090d01050c000408, 0x03070b0f060a0e02 |
-.asciz "Bit-sliced AES for NEON, CRYPTOGAMS by <appro@openssl.org>" |
+.quad 0x090d01050c000408, 0x03070b0f060a0e02 |
+.byte 66,105,116,45,115,108,105,99,101,100,32,65,69,83,32,102,111,114,32,78,69,79,78,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0 |
+.align 2 |
.align 6 |
.size _bsaes_const,.-_bsaes_const |
@@ -568,115 +575,119 @@ _bsaes_const: |
_bsaes_encrypt8: |
adr r6,_bsaes_encrypt8 |
vldmia r4!, {q9} @ round 0 key |
+#ifdef __APPLE__ |
+ adr r6,.LM0SR |
+#else |
sub r6,r6,#_bsaes_encrypt8-.LM0SR |
+#endif |
vldmia r6!, {q8} @ .LM0SR |
_bsaes_encrypt8_alt: |
veor q10, q0, q9 @ xor with round0 key |
veor q11, q1, q9 |
- vtbl.8 d0, {q10}, d16 |
- vtbl.8 d1, {q10}, d17 |
+ vtbl.8 d0, {q10}, d16 |
+ vtbl.8 d1, {q10}, d17 |
veor q12, q2, q9 |
- vtbl.8 d2, {q11}, d16 |
- vtbl.8 d3, {q11}, d17 |
+ vtbl.8 d2, {q11}, d16 |
+ vtbl.8 d3, {q11}, d17 |
veor q13, q3, q9 |
- vtbl.8 d4, {q12}, d16 |
- vtbl.8 d5, {q12}, d17 |
+ vtbl.8 d4, {q12}, d16 |
+ vtbl.8 d5, {q12}, d17 |
veor q14, q4, q9 |
- vtbl.8 d6, {q13}, d16 |
- vtbl.8 d7, {q13}, d17 |
+ vtbl.8 d6, {q13}, d16 |
+ vtbl.8 d7, {q13}, d17 |
veor q15, q5, q9 |
- vtbl.8 d8, {q14}, d16 |
- vtbl.8 d9, {q14}, d17 |
+ vtbl.8 d8, {q14}, d16 |
+ vtbl.8 d9, {q14}, d17 |
veor q10, q6, q9 |
- vtbl.8 d10, {q15}, d16 |
- vtbl.8 d11, {q15}, d17 |
+ vtbl.8 d10, {q15}, d16 |
+ vtbl.8 d11, {q15}, d17 |
veor q11, q7, q9 |
- vtbl.8 d12, {q10}, d16 |
- vtbl.8 d13, {q10}, d17 |
- vtbl.8 d14, {q11}, d16 |
- vtbl.8 d15, {q11}, d17 |
+ vtbl.8 d12, {q10}, d16 |
+ vtbl.8 d13, {q10}, d17 |
+ vtbl.8 d14, {q11}, d16 |
+ vtbl.8 d15, {q11}, d17 |
_bsaes_encrypt8_bitslice: |
vmov.i8 q8,#0x55 @ compose .LBS0 |
vmov.i8 q9,#0x33 @ compose .LBS1 |
vshr.u64 q10, q6, #1 |
- vshr.u64 q11, q4, #1 |
- veor q10, q10, q7 |
- veor q11, q11, q5 |
- vand q10, q10, q8 |
- vand q11, q11, q8 |
- veor q7, q7, q10 |
+ vshr.u64 q11, q4, #1 |
+ veor q10, q10, q7 |
+ veor q11, q11, q5 |
+ vand q10, q10, q8 |
+ vand q11, q11, q8 |
+ veor q7, q7, q10 |
vshl.u64 q10, q10, #1 |
- veor q5, q5, q11 |
- vshl.u64 q11, q11, #1 |
- veor q6, q6, q10 |
- veor q4, q4, q11 |
+ veor q5, q5, q11 |
+ vshl.u64 q11, q11, #1 |
+ veor q6, q6, q10 |
+ veor q4, q4, q11 |
vshr.u64 q10, q2, #1 |
- vshr.u64 q11, q0, #1 |
- veor q10, q10, q3 |
- veor q11, q11, q1 |
- vand q10, q10, q8 |
- vand q11, q11, q8 |
- veor q3, q3, q10 |
+ vshr.u64 q11, q0, #1 |
+ veor q10, q10, q3 |
+ veor q11, q11, q1 |
+ vand q10, q10, q8 |
+ vand q11, q11, q8 |
+ veor q3, q3, q10 |
vshl.u64 q10, q10, #1 |
- veor q1, q1, q11 |
- vshl.u64 q11, q11, #1 |
- veor q2, q2, q10 |
- veor q0, q0, q11 |
+ veor q1, q1, q11 |
+ vshl.u64 q11, q11, #1 |
+ veor q2, q2, q10 |
+ veor q0, q0, q11 |
vmov.i8 q8,#0x0f @ compose .LBS2 |
vshr.u64 q10, q5, #2 |
- vshr.u64 q11, q4, #2 |
- veor q10, q10, q7 |
- veor q11, q11, q6 |
- vand q10, q10, q9 |
- vand q11, q11, q9 |
- veor q7, q7, q10 |
+ vshr.u64 q11, q4, #2 |
+ veor q10, q10, q7 |
+ veor q11, q11, q6 |
+ vand q10, q10, q9 |
+ vand q11, q11, q9 |
+ veor q7, q7, q10 |
vshl.u64 q10, q10, #2 |
- veor q6, q6, q11 |
- vshl.u64 q11, q11, #2 |
- veor q5, q5, q10 |
- veor q4, q4, q11 |
+ veor q6, q6, q11 |
+ vshl.u64 q11, q11, #2 |
+ veor q5, q5, q10 |
+ veor q4, q4, q11 |
vshr.u64 q10, q1, #2 |
- vshr.u64 q11, q0, #2 |
- veor q10, q10, q3 |
- veor q11, q11, q2 |
- vand q10, q10, q9 |
- vand q11, q11, q9 |
- veor q3, q3, q10 |
+ vshr.u64 q11, q0, #2 |
+ veor q10, q10, q3 |
+ veor q11, q11, q2 |
+ vand q10, q10, q9 |
+ vand q11, q11, q9 |
+ veor q3, q3, q10 |
vshl.u64 q10, q10, #2 |
- veor q2, q2, q11 |
- vshl.u64 q11, q11, #2 |
- veor q1, q1, q10 |
- veor q0, q0, q11 |
+ veor q2, q2, q11 |
+ vshl.u64 q11, q11, #2 |
+ veor q1, q1, q10 |
+ veor q0, q0, q11 |
vshr.u64 q10, q3, #4 |
- vshr.u64 q11, q2, #4 |
- veor q10, q10, q7 |
- veor q11, q11, q6 |
- vand q10, q10, q8 |
- vand q11, q11, q8 |
- veor q7, q7, q10 |
+ vshr.u64 q11, q2, #4 |
+ veor q10, q10, q7 |
+ veor q11, q11, q6 |
+ vand q10, q10, q8 |
+ vand q11, q11, q8 |
+ veor q7, q7, q10 |
vshl.u64 q10, q10, #4 |
- veor q6, q6, q11 |
- vshl.u64 q11, q11, #4 |
- veor q3, q3, q10 |
- veor q2, q2, q11 |
+ veor q6, q6, q11 |
+ vshl.u64 q11, q11, #4 |
+ veor q3, q3, q10 |
+ veor q2, q2, q11 |
vshr.u64 q10, q1, #4 |
- vshr.u64 q11, q0, #4 |
- veor q10, q10, q5 |
- veor q11, q11, q4 |
- vand q10, q10, q8 |
- vand q11, q11, q8 |
- veor q5, q5, q10 |
+ vshr.u64 q11, q0, #4 |
+ veor q10, q10, q5 |
+ veor q11, q11, q4 |
+ vand q10, q10, q8 |
+ vand q11, q11, q8 |
+ veor q5, q5, q10 |
vshl.u64 q10, q10, #4 |
- veor q4, q4, q11 |
- vshl.u64 q11, q11, #4 |
- veor q1, q1, q10 |
- veor q0, q0, q11 |
+ veor q4, q4, q11 |
+ vshl.u64 q11, q11, #4 |
+ veor q1, q1, q10 |
+ veor q0, q0, q11 |
sub r5,r5,#1 |
b .Lenc_sbox |
.align 4 |
.Lenc_loop: |
- vldmia r4!, {q8-q11} |
+ vldmia r4!, {q8,q9,q10,q11} |
veor q8, q8, q0 |
veor q9, q9, q1 |
vtbl.8 d0, {q8}, d24 |
@@ -725,7 +736,7 @@ _bsaes_encrypt8_bitslice: |
veor q10, q1, q2 |
veor q9, q5, q3 |
veor q13, q2, q4 |
- vmov q8, q10 |
+ vmov q8, q10 |
veor q12, q6, q0 |
vorr q10, q10, q9 |
@@ -782,7 +793,7 @@ _bsaes_encrypt8_bitslice: |
veor q14, q14, q11 |
veor q12, q6, q0 |
veor q8, q5, q3 |
- veor q10, q15, q14 |
+ veor q10, q15, q14 |
vand q10, q10, q6 |
veor q6, q6, q5 |
vand q11, q5, q15 |
@@ -792,19 +803,19 @@ _bsaes_encrypt8_bitslice: |
veor q15, q15, q13 |
veor q14, q14, q9 |
veor q11, q15, q14 |
- veor q10, q13, q9 |
+ veor q10, q13, q9 |
vand q11, q11, q12 |
- vand q10, q10, q0 |
+ vand q10, q10, q0 |
veor q12, q12, q8 |
- veor q0, q0, q3 |
+ veor q0, q0, q3 |
vand q8, q8, q15 |
- vand q3, q3, q13 |
+ vand q3, q3, q13 |
vand q12, q12, q14 |
- vand q0, q0, q9 |
+ vand q0, q0, q9 |
veor q8, q8, q12 |
- veor q0, q0, q3 |
+ veor q0, q0, q3 |
veor q12, q12, q11 |
- veor q3, q3, q10 |
+ veor q3, q3, q10 |
veor q6, q6, q12 |
veor q0, q0, q12 |
veor q5, q5, q8 |
@@ -813,22 +824,22 @@ _bsaes_encrypt8_bitslice: |
veor q12, q7, q4 |
veor q8, q1, q2 |
veor q11, q15, q14 |
- veor q10, q13, q9 |
+ veor q10, q13, q9 |
vand q11, q11, q12 |
- vand q10, q10, q4 |
+ vand q10, q10, q4 |
veor q12, q12, q8 |
- veor q4, q4, q2 |
+ veor q4, q4, q2 |
vand q8, q8, q15 |
- vand q2, q2, q13 |
+ vand q2, q2, q13 |
vand q12, q12, q14 |
- vand q4, q4, q9 |
+ vand q4, q4, q9 |
veor q8, q8, q12 |
- veor q4, q4, q2 |
+ veor q4, q4, q2 |
veor q12, q12, q11 |
- veor q2, q2, q10 |
+ veor q2, q2, q10 |
veor q15, q15, q13 |
veor q14, q14, q9 |
- veor q10, q15, q14 |
+ veor q10, q15, q14 |
vand q10, q10, q7 |
veor q7, q7, q1 |
vand q11, q1, q15 |
@@ -856,42 +867,42 @@ _bsaes_encrypt8_bitslice: |
bcc .Lenc_done |
vext.8 q8, q0, q0, #12 @ x0 <<< 32 |
vext.8 q9, q1, q1, #12 |
- veor q0, q0, q8 @ x0 ^ (x0 <<< 32) |
+ veor q0, q0, q8 @ x0 ^ (x0 <<< 32) |
vext.8 q10, q4, q4, #12 |
- veor q1, q1, q9 |
+ veor q1, q1, q9 |
vext.8 q11, q6, q6, #12 |
- veor q4, q4, q10 |
+ veor q4, q4, q10 |
vext.8 q12, q3, q3, #12 |
- veor q6, q6, q11 |
+ veor q6, q6, q11 |
vext.8 q13, q7, q7, #12 |
- veor q3, q3, q12 |
+ veor q3, q3, q12 |
vext.8 q14, q2, q2, #12 |
- veor q7, q7, q13 |
+ veor q7, q7, q13 |
vext.8 q15, q5, q5, #12 |
- veor q2, q2, q14 |
+ veor q2, q2, q14 |
veor q9, q9, q0 |
- veor q5, q5, q15 |
- vext.8 q0, q0, q0, #8 @ (x0 ^ (x0 <<< 32)) <<< 64) |
+ veor q5, q5, q15 |
+ vext.8 q0, q0, q0, #8 @ (x0 ^ (x0 <<< 32)) <<< 64) |
veor q10, q10, q1 |
veor q8, q8, q5 |
veor q9, q9, q5 |
- vext.8 q1, q1, q1, #8 |
+ vext.8 q1, q1, q1, #8 |
veor q13, q13, q3 |
- veor q0, q0, q8 |
+ veor q0, q0, q8 |
veor q14, q14, q7 |
- veor q1, q1, q9 |
- vext.8 q8, q3, q3, #8 |
+ veor q1, q1, q9 |
+ vext.8 q8, q3, q3, #8 |
veor q12, q12, q6 |
- vext.8 q9, q7, q7, #8 |
+ vext.8 q9, q7, q7, #8 |
veor q15, q15, q2 |
- vext.8 q3, q6, q6, #8 |
+ vext.8 q3, q6, q6, #8 |
veor q11, q11, q4 |
- vext.8 q7, q5, q5, #8 |
+ vext.8 q7, q5, q5, #8 |
veor q12, q12, q5 |
- vext.8 q6, q2, q2, #8 |
+ vext.8 q6, q2, q2, #8 |
veor q11, q11, q5 |
- vext.8 q2, q4, q4, #8 |
+ vext.8 q2, q4, q4, #8 |
veor q5, q9, q13 |
veor q4, q8, q12 |
veor q3, q3, q11 |
@@ -911,78 +922,78 @@ _bsaes_encrypt8_bitslice: |
vmov.i8 q8,#0x55 @ compose .LBS0 |
vmov.i8 q9,#0x33 @ compose .LBS1 |
vshr.u64 q10, q2, #1 |
- vshr.u64 q11, q3, #1 |
- veor q10, q10, q5 |
- veor q11, q11, q7 |
- vand q10, q10, q8 |
- vand q11, q11, q8 |
- veor q5, q5, q10 |
+ vshr.u64 q11, q3, #1 |
+ veor q10, q10, q5 |
+ veor q11, q11, q7 |
+ vand q10, q10, q8 |
+ vand q11, q11, q8 |
+ veor q5, q5, q10 |
vshl.u64 q10, q10, #1 |
- veor q7, q7, q11 |
- vshl.u64 q11, q11, #1 |
- veor q2, q2, q10 |
- veor q3, q3, q11 |
+ veor q7, q7, q11 |
+ vshl.u64 q11, q11, #1 |
+ veor q2, q2, q10 |
+ veor q3, q3, q11 |
vshr.u64 q10, q4, #1 |
- vshr.u64 q11, q0, #1 |
- veor q10, q10, q6 |
- veor q11, q11, q1 |
- vand q10, q10, q8 |
- vand q11, q11, q8 |
- veor q6, q6, q10 |
+ vshr.u64 q11, q0, #1 |
+ veor q10, q10, q6 |
+ veor q11, q11, q1 |
+ vand q10, q10, q8 |
+ vand q11, q11, q8 |
+ veor q6, q6, q10 |
vshl.u64 q10, q10, #1 |
- veor q1, q1, q11 |
- vshl.u64 q11, q11, #1 |
- veor q4, q4, q10 |
- veor q0, q0, q11 |
+ veor q1, q1, q11 |
+ vshl.u64 q11, q11, #1 |
+ veor q4, q4, q10 |
+ veor q0, q0, q11 |
vmov.i8 q8,#0x0f @ compose .LBS2 |
vshr.u64 q10, q7, #2 |
- vshr.u64 q11, q3, #2 |
- veor q10, q10, q5 |
- veor q11, q11, q2 |
- vand q10, q10, q9 |
- vand q11, q11, q9 |
- veor q5, q5, q10 |
+ vshr.u64 q11, q3, #2 |
+ veor q10, q10, q5 |
+ veor q11, q11, q2 |
+ vand q10, q10, q9 |
+ vand q11, q11, q9 |
+ veor q5, q5, q10 |
vshl.u64 q10, q10, #2 |
- veor q2, q2, q11 |
- vshl.u64 q11, q11, #2 |
- veor q7, q7, q10 |
- veor q3, q3, q11 |
+ veor q2, q2, q11 |
+ vshl.u64 q11, q11, #2 |
+ veor q7, q7, q10 |
+ veor q3, q3, q11 |
vshr.u64 q10, q1, #2 |
- vshr.u64 q11, q0, #2 |
- veor q10, q10, q6 |
- veor q11, q11, q4 |
- vand q10, q10, q9 |
- vand q11, q11, q9 |
- veor q6, q6, q10 |
+ vshr.u64 q11, q0, #2 |
+ veor q10, q10, q6 |
+ veor q11, q11, q4 |
+ vand q10, q10, q9 |
+ vand q11, q11, q9 |
+ veor q6, q6, q10 |
vshl.u64 q10, q10, #2 |
- veor q4, q4, q11 |
- vshl.u64 q11, q11, #2 |
- veor q1, q1, q10 |
- veor q0, q0, q11 |
+ veor q4, q4, q11 |
+ vshl.u64 q11, q11, #2 |
+ veor q1, q1, q10 |
+ veor q0, q0, q11 |
vshr.u64 q10, q6, #4 |
- vshr.u64 q11, q4, #4 |
- veor q10, q10, q5 |
- veor q11, q11, q2 |
- vand q10, q10, q8 |
- vand q11, q11, q8 |
- veor q5, q5, q10 |
+ vshr.u64 q11, q4, #4 |
+ veor q10, q10, q5 |
+ veor q11, q11, q2 |
+ vand q10, q10, q8 |
+ vand q11, q11, q8 |
+ veor q5, q5, q10 |
vshl.u64 q10, q10, #4 |
- veor q2, q2, q11 |
- vshl.u64 q11, q11, #4 |
- veor q6, q6, q10 |
- veor q4, q4, q11 |
+ veor q2, q2, q11 |
+ vshl.u64 q11, q11, #4 |
+ veor q6, q6, q10 |
+ veor q4, q4, q11 |
vshr.u64 q10, q1, #4 |
- vshr.u64 q11, q0, #4 |
- veor q10, q10, q7 |
- veor q11, q11, q3 |
- vand q10, q10, q8 |
- vand q11, q11, q8 |
- veor q7, q7, q10 |
+ vshr.u64 q11, q0, #4 |
+ veor q10, q10, q7 |
+ veor q11, q11, q3 |
+ vand q10, q10, q8 |
+ vand q11, q11, q8 |
+ veor q7, q7, q10 |
vshl.u64 q10, q10, #4 |
- veor q3, q3, q11 |
- vshl.u64 q11, q11, #4 |
- veor q1, q1, q10 |
- veor q0, q0, q11 |
+ veor q3, q3, q11 |
+ vshl.u64 q11, q11, #4 |
+ veor q1, q1, q10 |
+ veor q0, q0, q11 |
vldmia r4, {q8} @ last round key |
veor q4, q4, q8 |
veor q6, q6, q8 |
@@ -999,7 +1010,11 @@ _bsaes_encrypt8_bitslice: |
_bsaes_key_convert: |
adr r6,_bsaes_key_convert |
vld1.8 {q7}, [r4]! @ load round 0 key |
+#ifdef __APPLE__ |
+ adr r6,.LM0 |
+#else |
sub r6,r6,#_bsaes_key_convert-.LM0 |
+#endif |
vld1.8 {q15}, [r4]! @ load round 1 key |
vmov.i8 q8, #0x01 @ bit masks |
@@ -1042,17 +1057,17 @@ _bsaes_key_convert: |
vrev32.8 q15, q15 |
#endif |
subs r5,r5,#1 |
- vstmia r12!,{q0-q7} @ write bit-sliced round key |
+ vstmia r12!,{q0,q1,q2,q3,q4,q5,q6,q7} @ write bit-sliced round key |
bne .Lkey_loop |
vmov.i8 q7,#0x63 @ compose .L63 |
@ don't save last round key |
bx lr |
.size _bsaes_key_convert,.-_bsaes_key_convert |
-.extern AES_cbc_encrypt |
-.extern AES_decrypt |
-.global bsaes_cbc_encrypt |
+ |
+ |
+.globl bsaes_cbc_encrypt |
.hidden bsaes_cbc_encrypt |
.type bsaes_cbc_encrypt,%function |
.align 5 |
@@ -1071,7 +1086,7 @@ bsaes_cbc_encrypt: |
@ it is up to the caller to make sure we are called with enc == 0 |
mov ip, sp |
- stmdb sp!, {r4-r10, lr} |
+ stmdb sp!, {r4,r5,r6,r7,r8,r9,r10, lr} |
VFP_ABI_PUSH |
ldr r8, [ip] @ IV is 1st arg on the stack |
mov r2, r2, lsr#4 @ len in 16 byte blocks |
@@ -1111,7 +1126,7 @@ bsaes_cbc_encrypt: |
vstmia r4, {q7} |
.align 2 |
-0: |
+ |
#endif |
vld1.8 {q15}, [r8] @ load IV |
@@ -1122,33 +1137,33 @@ bsaes_cbc_encrypt: |
subs r2, r2, #0x8 |
bmi .Lcbc_dec_loop_finish |
- vld1.8 {q0-q1}, [r0]! @ load input |
- vld1.8 {q2-q3}, [r0]! |
+ vld1.8 {q0,q1}, [r0]! @ load input |
+ vld1.8 {q2,q3}, [r0]! |
#ifndef BSAES_ASM_EXTENDED_KEY |
mov r4, sp @ pass the key |
#else |
add r4, r3, #248 |
#endif |
- vld1.8 {q4-q5}, [r0]! |
+ vld1.8 {q4,q5}, [r0]! |
mov r5, r10 |
- vld1.8 {q6-q7}, [r0] |
+ vld1.8 {q6,q7}, [r0] |
sub r0, r0, #0x60 |
vstmia r9, {q15} @ put aside IV |
bl _bsaes_decrypt8 |
vldmia r9, {q14} @ reload IV |
- vld1.8 {q8-q9}, [r0]! @ reload input |
+ vld1.8 {q8,q9}, [r0]! @ reload input |
veor q0, q0, q14 @ ^= IV |
- vld1.8 {q10-q11}, [r0]! |
+ vld1.8 {q10,q11}, [r0]! |
veor q1, q1, q8 |
veor q6, q6, q9 |
- vld1.8 {q12-q13}, [r0]! |
+ vld1.8 {q12,q13}, [r0]! |
veor q4, q4, q10 |
veor q2, q2, q11 |
- vld1.8 {q14-q15}, [r0]! |
+ vld1.8 {q14,q15}, [r0]! |
veor q7, q7, q12 |
- vst1.8 {q0-q1}, [r1]! @ write output |
+ vst1.8 {q0,q1}, [r1]! @ write output |
veor q3, q3, q13 |
vst1.8 {q6}, [r1]! |
veor q5, q5, q14 |
@@ -1192,17 +1207,17 @@ bsaes_cbc_encrypt: |
bl _bsaes_decrypt8 |
vldmia r9, {q14} @ reload IV |
- vld1.8 {q8-q9}, [r0]! @ reload input |
+ vld1.8 {q8,q9}, [r0]! @ reload input |
veor q0, q0, q14 @ ^= IV |
- vld1.8 {q10-q11}, [r0]! |
+ vld1.8 {q10,q11}, [r0]! |
veor q1, q1, q8 |
veor q6, q6, q9 |
- vld1.8 {q12-q13}, [r0]! |
+ vld1.8 {q12,q13}, [r0]! |
veor q4, q4, q10 |
veor q2, q2, q11 |
vld1.8 {q15}, [r0]! |
veor q7, q7, q12 |
- vst1.8 {q0-q1}, [r1]! @ write output |
+ vst1.8 {q0,q1}, [r1]! @ write output |
veor q3, q3, q13 |
vst1.8 {q6}, [r1]! |
vst1.8 {q4}, [r1]! |
@@ -1215,9 +1230,9 @@ bsaes_cbc_encrypt: |
sub r0, r0, #0x60 |
bl _bsaes_decrypt8 |
vldmia r9,{q14} @ reload IV |
- vld1.8 {q8-q9}, [r0]! @ reload input |
+ vld1.8 {q8,q9}, [r0]! @ reload input |
veor q0, q0, q14 @ ^= IV |
- vld1.8 {q10-q11}, [r0]! |
+ vld1.8 {q10,q11}, [r0]! |
veor q1, q1, q8 |
veor q6, q6, q9 |
vld1.8 {q12}, [r0]! |
@@ -1225,7 +1240,7 @@ bsaes_cbc_encrypt: |
veor q2, q2, q11 |
vld1.8 {q15}, [r0]! |
veor q7, q7, q12 |
- vst1.8 {q0-q1}, [r1]! @ write output |
+ vst1.8 {q0,q1}, [r1]! @ write output |
vst1.8 {q6}, [r1]! |
vst1.8 {q4}, [r1]! |
vst1.8 {q2}, [r1]! |
@@ -1236,14 +1251,14 @@ bsaes_cbc_encrypt: |
sub r0, r0, #0x50 |
bl _bsaes_decrypt8 |
vldmia r9, {q14} @ reload IV |
- vld1.8 {q8-q9}, [r0]! @ reload input |
+ vld1.8 {q8,q9}, [r0]! @ reload input |
veor q0, q0, q14 @ ^= IV |
- vld1.8 {q10-q11}, [r0]! |
+ vld1.8 {q10,q11}, [r0]! |
veor q1, q1, q8 |
veor q6, q6, q9 |
vld1.8 {q15}, [r0]! |
veor q4, q4, q10 |
- vst1.8 {q0-q1}, [r1]! @ write output |
+ vst1.8 {q0,q1}, [r1]! @ write output |
veor q2, q2, q11 |
vst1.8 {q6}, [r1]! |
vst1.8 {q4}, [r1]! |
@@ -1254,14 +1269,14 @@ bsaes_cbc_encrypt: |
sub r0, r0, #0x40 |
bl _bsaes_decrypt8 |
vldmia r9, {q14} @ reload IV |
- vld1.8 {q8-q9}, [r0]! @ reload input |
+ vld1.8 {q8,q9}, [r0]! @ reload input |
veor q0, q0, q14 @ ^= IV |
vld1.8 {q10}, [r0]! |
veor q1, q1, q8 |
veor q6, q6, q9 |
vld1.8 {q15}, [r0]! |
veor q4, q4, q10 |
- vst1.8 {q0-q1}, [r1]! @ write output |
+ vst1.8 {q0,q1}, [r1]! @ write output |
vst1.8 {q6}, [r1]! |
vst1.8 {q4}, [r1]! |
b .Lcbc_dec_done |
@@ -1270,12 +1285,12 @@ bsaes_cbc_encrypt: |
sub r0, r0, #0x30 |
bl _bsaes_decrypt8 |
vldmia r9, {q14} @ reload IV |
- vld1.8 {q8-q9}, [r0]! @ reload input |
+ vld1.8 {q8,q9}, [r0]! @ reload input |
veor q0, q0, q14 @ ^= IV |
vld1.8 {q15}, [r0]! |
veor q1, q1, q8 |
veor q6, q6, q9 |
- vst1.8 {q0-q1}, [r1]! @ write output |
+ vst1.8 {q0,q1}, [r1]! @ write output |
vst1.8 {q6}, [r1]! |
b .Lcbc_dec_done |
.align 4 |
@@ -1287,7 +1302,7 @@ bsaes_cbc_encrypt: |
veor q0, q0, q14 @ ^= IV |
vld1.8 {q15}, [r0]! @ reload input |
veor q1, q1, q8 |
- vst1.8 {q0-q1}, [r1]! @ write output |
+ vst1.8 {q0,q1}, [r1]! @ write output |
b .Lcbc_dec_done |
.align 4 |
.Lcbc_dec_one: |
@@ -1307,20 +1322,20 @@ bsaes_cbc_encrypt: |
#ifndef BSAES_ASM_EXTENDED_KEY |
vmov.i32 q0, #0 |
vmov.i32 q1, #0 |
-.Lcbc_dec_bzero: @ wipe key schedule [if any] |
- vstmia sp!, {q0-q1} |
- cmp sp, r9 |
- bne .Lcbc_dec_bzero |
+.Lcbc_dec_bzero:@ wipe key schedule [if any] |
+ vstmia sp!, {q0,q1} |
+ cmp sp, r9 |
+ bne .Lcbc_dec_bzero |
#endif |
mov sp, r9 |
add sp, #0x10 @ add sp,r9,#0x10 is no good for thumb |
vst1.8 {q15}, [r8] @ return IV |
VFP_ABI_POP |
- ldmia sp!, {r4-r10, pc} |
+ ldmia sp!, {r4,r5,r6,r7,r8,r9,r10, pc} |
.size bsaes_cbc_encrypt,.-bsaes_cbc_encrypt |
-.extern AES_encrypt |
-.global bsaes_ctr32_encrypt_blocks |
+ |
+.globl bsaes_ctr32_encrypt_blocks |
.hidden bsaes_ctr32_encrypt_blocks |
.type bsaes_ctr32_encrypt_blocks,%function |
.align 5 |
@@ -1329,7 +1344,7 @@ bsaes_ctr32_encrypt_blocks: |
blo .Lctr_enc_short @ small sizes |
mov ip, sp |
- stmdb sp!, {r4-r10, lr} |
+ stmdb sp!, {r4,r5,r6,r7,r8,r9,r10, lr} |
VFP_ABI_PUSH |
ldr r8, [ip] @ ctr is 1st arg on the stack |
sub sp, sp, #0x10 @ scratch space to carry over the ctr |
@@ -1350,7 +1365,12 @@ bsaes_ctr32_encrypt_blocks: |
vstmia r12, {q7} @ save last round key |
vld1.8 {q0}, [r8] @ load counter |
+#ifdef __APPLE__ |
+ mov r8, #.LREVM0SR-.LM0 |
+ add r8, r6, r8 |
+#else |
add r8, r6, #.LREVM0SR-.LM0 @ borrow r8 |
+#endif |
vldmia sp, {q4} @ load round0 key |
#else |
ldr r12, [r3, #244] |
@@ -1367,7 +1387,7 @@ bsaes_ctr32_encrypt_blocks: |
vstmia r12, {q7} @ save last round key |
.align 2 |
-0: add r12, r3, #248 |
+ add r12, r3, #248 |
vld1.8 {q0}, [r8] @ load counter |
adrl r8, .LREVM0SR @ borrow r8 |
vldmia r12, {q4} @ load round0 key |
@@ -1375,9 +1395,9 @@ bsaes_ctr32_encrypt_blocks: |
#endif |
vmov.i32 q8,#1 @ compose 1<<96 |
- veor q9,q9,q9 |
+ veor q9,q9,q9 |
vrev32.8 q0,q0 |
- vext.8 q8,q9,q8,#4 |
+ vext.8 q8,q9,q8,#4 |
vrev32.8 q4,q4 |
vadd.u32 q9,q8,q8 @ compose 2<<96 |
vstmia sp, {q4} @ save adjusted round0 key |
@@ -1398,117 +1418,122 @@ bsaes_ctr32_encrypt_blocks: |
@ Borrow prologue from _bsaes_encrypt8 to use the opportunity |
@ to flip byte order in 32-bit counter |
- vldmia sp, {q9} @ load round0 key |
+ vldmia sp, {q9} @ load round0 key |
#ifndef BSAES_ASM_EXTENDED_KEY |
- add r4, sp, #0x10 @ pass next round key |
+ add r4, sp, #0x10 @ pass next round key |
#else |
- add r4, r3, #264 |
+ add r4, r3, #264 |
#endif |
- vldmia r8, {q8} @ .LREVM0SR |
- mov r5, r10 @ pass rounds |
- vstmia r9, {q10} @ save next counter |
- sub r6, r8, #.LREVM0SR-.LSR @ pass constants |
- |
- bl _bsaes_encrypt8_alt |
- |
- subs r2, r2, #8 |
- blo .Lctr_enc_loop_done |
- |
- vld1.8 {q8-q9}, [r0]! @ load input |
- vld1.8 {q10-q11}, [r0]! |
- veor q0, q8 |
- veor q1, q9 |
- vld1.8 {q12-q13}, [r0]! |
- veor q4, q10 |
- veor q6, q11 |
- vld1.8 {q14-q15}, [r0]! |
- veor q3, q12 |
- vst1.8 {q0-q1}, [r1]! @ write output |
- veor q7, q13 |
- veor q2, q14 |
- vst1.8 {q4}, [r1]! |
- veor q5, q15 |
- vst1.8 {q6}, [r1]! |
+ vldmia r8, {q8} @ .LREVM0SR |
+ mov r5, r10 @ pass rounds |
+ vstmia r9, {q10} @ save next counter |
+#ifdef __APPLE__ |
+ mov r6, #.LREVM0SR-.LSR |
+ sub r6, r8, r6 |
+#else |
+ sub r6, r8, #.LREVM0SR-.LSR @ pass constants |
+#endif |
+ |
+ bl _bsaes_encrypt8_alt |
+ |
+ subs r2, r2, #8 |
+ blo .Lctr_enc_loop_done |
+ |
+ vld1.8 {q8,q9}, [r0]! @ load input |
+ vld1.8 {q10,q11}, [r0]! |
+ veor q0, q8 |
+ veor q1, q9 |
+ vld1.8 {q12,q13}, [r0]! |
+ veor q4, q10 |
+ veor q6, q11 |
+ vld1.8 {q14,q15}, [r0]! |
+ veor q3, q12 |
+ vst1.8 {q0,q1}, [r1]! @ write output |
+ veor q7, q13 |
+ veor q2, q14 |
+ vst1.8 {q4}, [r1]! |
+ veor q5, q15 |
+ vst1.8 {q6}, [r1]! |
vmov.i32 q8, #1 @ compose 1<<96 |
- vst1.8 {q3}, [r1]! |
- veor q9, q9, q9 |
- vst1.8 {q7}, [r1]! |
- vext.8 q8, q9, q8, #4 |
- vst1.8 {q2}, [r1]! |
+ vst1.8 {q3}, [r1]! |
+ veor q9, q9, q9 |
+ vst1.8 {q7}, [r1]! |
+ vext.8 q8, q9, q8, #4 |
+ vst1.8 {q2}, [r1]! |
vadd.u32 q9,q8,q8 @ compose 2<<96 |
- vst1.8 {q5}, [r1]! |
- vldmia r9, {q0} @ load counter |
+ vst1.8 {q5}, [r1]! |
+ vldmia r9, {q0} @ load counter |
- bne .Lctr_enc_loop |
- b .Lctr_enc_done |
+ bne .Lctr_enc_loop |
+ b .Lctr_enc_done |
.align 4 |
.Lctr_enc_loop_done: |
- add r2, r2, #8 |
- vld1.8 {q8}, [r0]! @ load input |
- veor q0, q8 |
- vst1.8 {q0}, [r1]! @ write output |
- cmp r2, #2 |
- blo .Lctr_enc_done |
- vld1.8 {q9}, [r0]! |
- veor q1, q9 |
- vst1.8 {q1}, [r1]! |
- beq .Lctr_enc_done |
- vld1.8 {q10}, [r0]! |
- veor q4, q10 |
- vst1.8 {q4}, [r1]! |
- cmp r2, #4 |
- blo .Lctr_enc_done |
- vld1.8 {q11}, [r0]! |
- veor q6, q11 |
- vst1.8 {q6}, [r1]! |
- beq .Lctr_enc_done |
- vld1.8 {q12}, [r0]! |
- veor q3, q12 |
- vst1.8 {q3}, [r1]! |
- cmp r2, #6 |
- blo .Lctr_enc_done |
- vld1.8 {q13}, [r0]! |
- veor q7, q13 |
- vst1.8 {q7}, [r1]! |
- beq .Lctr_enc_done |
- vld1.8 {q14}, [r0] |
- veor q2, q14 |
- vst1.8 {q2}, [r1]! |
+ add r2, r2, #8 |
+ vld1.8 {q8}, [r0]! @ load input |
+ veor q0, q8 |
+ vst1.8 {q0}, [r1]! @ write output |
+ cmp r2, #2 |
+ blo .Lctr_enc_done |
+ vld1.8 {q9}, [r0]! |
+ veor q1, q9 |
+ vst1.8 {q1}, [r1]! |
+ beq .Lctr_enc_done |
+ vld1.8 {q10}, [r0]! |
+ veor q4, q10 |
+ vst1.8 {q4}, [r1]! |
+ cmp r2, #4 |
+ blo .Lctr_enc_done |
+ vld1.8 {q11}, [r0]! |
+ veor q6, q11 |
+ vst1.8 {q6}, [r1]! |
+ beq .Lctr_enc_done |
+ vld1.8 {q12}, [r0]! |
+ veor q3, q12 |
+ vst1.8 {q3}, [r1]! |
+ cmp r2, #6 |
+ blo .Lctr_enc_done |
+ vld1.8 {q13}, [r0]! |
+ veor q7, q13 |
+ vst1.8 {q7}, [r1]! |
+ beq .Lctr_enc_done |
+ vld1.8 {q14}, [r0] |
+ veor q2, q14 |
+ vst1.8 {q2}, [r1]! |
.Lctr_enc_done: |
vmov.i32 q0, #0 |
vmov.i32 q1, #0 |
#ifndef BSAES_ASM_EXTENDED_KEY |
-.Lctr_enc_bzero: @ wipe key schedule [if any] |
- vstmia sp!, {q0-q1} |
- cmp sp, r9 |
- bne .Lctr_enc_bzero |
+.Lctr_enc_bzero:@ wipe key schedule [if any] |
+ vstmia sp!, {q0,q1} |
+ cmp sp, r9 |
+ bne .Lctr_enc_bzero |
#else |
- vstmia sp, {q0-q1} |
+ vstmia sp, {q0,q1} |
#endif |
mov sp, r9 |
add sp, #0x10 @ add sp,r9,#0x10 is no good for thumb |
VFP_ABI_POP |
- ldmia sp!, {r4-r10, pc} @ return |
+ ldmia sp!, {r4,r5,r6,r7,r8,r9,r10, pc} @ return |
.align 4 |
.Lctr_enc_short: |
ldr ip, [sp] @ ctr pointer is passed on stack |
- stmdb sp!, {r4-r8, lr} |
+ stmdb sp!, {r4,r5,r6,r7,r8, lr} |
mov r4, r0 @ copy arguments |
mov r5, r1 |
mov r6, r2 |
mov r7, r3 |
- ldr r8, [ip, #12] @ load counter LSW |
+ ldr r8, [ip, #12] @ load counter .LSW |
vld1.8 {q1}, [ip] @ load whole counter value |
#ifdef __ARMEL__ |
rev r8, r8 |
#endif |
sub sp, sp, #0x10 |
- vst1.8 {q1}, [sp,:64] @ copy counter value |
+ vst1.8 {q1}, [sp] @ copy counter value |
sub sp, sp, #0x10 |
.Lctr_enc_short_loop: |
@@ -1519,7 +1544,7 @@ bsaes_ctr32_encrypt_blocks: |
bl AES_encrypt |
vld1.8 {q0}, [r4]! @ load input |
- vld1.8 {q1}, [sp,:64] @ load encrypted counter |
+ vld1.8 {q1}, [sp] @ load encrypted counter |
add r8, r8, #1 |
#ifdef __ARMEL__ |
rev r0, r8 |
@@ -1534,9 +1559,9 @@ bsaes_ctr32_encrypt_blocks: |
vmov.i32 q0, #0 |
vmov.i32 q1, #0 |
- vstmia sp!, {q0-q1} |
+ vstmia sp!, {q0,q1} |
- ldmia sp!, {r4-r8, pc} |
+ ldmia sp!, {r4,r5,r6,r7,r8, pc} |
.size bsaes_ctr32_encrypt_blocks,.-bsaes_ctr32_encrypt_blocks |
.globl bsaes_xts_encrypt |
.hidden bsaes_xts_encrypt |
@@ -1544,7 +1569,7 @@ bsaes_ctr32_encrypt_blocks: |
.align 4 |
bsaes_xts_encrypt: |
mov ip, sp |
- stmdb sp!, {r4-r10, lr} @ 0x20 |
+ stmdb sp!, {r4,r5,r6,r7,r8,r9,r10, lr} @ 0x20 |
VFP_ABI_PUSH |
mov r6, sp @ future r3 |
@@ -1598,7 +1623,7 @@ bsaes_xts_encrypt: |
vstmia r12, {q7} |
.align 2 |
-0: sub sp, #0x90 @ place for tweak[9] |
+ sub sp, #0x90 @ place for tweak[9] |
#endif |
vld1.8 {q8}, [r0] @ initial tweak |
@@ -1610,422 +1635,422 @@ bsaes_xts_encrypt: |
.align 4 |
.Lxts_enc_loop: |
- vldmia r2, {q5} @ load XTS magic |
+ vldmia r2, {q5} @ load XTS magic |
vshr.s64 q6, q8, #63 |
- mov r0, sp |
- vand q6, q6, q5 |
+ mov r0, sp |
+ vand q6, q6, q5 |
vadd.u64 q9, q8, q8 |
- vst1.64 {q8}, [r0,:128]! |
- vswp d13,d12 |
+ vst1.64 {q8}, [r0,:128]! |
+ vswp d13,d12 |
vshr.s64 q7, q9, #63 |
- veor q9, q9, q6 |
- vand q7, q7, q5 |
+ veor q9, q9, q6 |
+ vand q7, q7, q5 |
vadd.u64 q10, q9, q9 |
- vst1.64 {q9}, [r0,:128]! |
- vswp d15,d14 |
+ vst1.64 {q9}, [r0,:128]! |
+ vswp d15,d14 |
vshr.s64 q6, q10, #63 |
- veor q10, q10, q7 |
- vand q6, q6, q5 |
- vld1.8 {q0}, [r7]! |
+ veor q10, q10, q7 |
+ vand q6, q6, q5 |
+ vld1.8 {q0}, [r7]! |
vadd.u64 q11, q10, q10 |
- vst1.64 {q10}, [r0,:128]! |
- vswp d13,d12 |
+ vst1.64 {q10}, [r0,:128]! |
+ vswp d13,d12 |
vshr.s64 q7, q11, #63 |
- veor q11, q11, q6 |
- vand q7, q7, q5 |
- vld1.8 {q1}, [r7]! |
- veor q0, q0, q8 |
+ veor q11, q11, q6 |
+ vand q7, q7, q5 |
+ vld1.8 {q1}, [r7]! |
+ veor q0, q0, q8 |
vadd.u64 q12, q11, q11 |
- vst1.64 {q11}, [r0,:128]! |
- vswp d15,d14 |
+ vst1.64 {q11}, [r0,:128]! |
+ vswp d15,d14 |
vshr.s64 q6, q12, #63 |
- veor q12, q12, q7 |
- vand q6, q6, q5 |
- vld1.8 {q2}, [r7]! |
- veor q1, q1, q9 |
+ veor q12, q12, q7 |
+ vand q6, q6, q5 |
+ vld1.8 {q2}, [r7]! |
+ veor q1, q1, q9 |
vadd.u64 q13, q12, q12 |
- vst1.64 {q12}, [r0,:128]! |
- vswp d13,d12 |
+ vst1.64 {q12}, [r0,:128]! |
+ vswp d13,d12 |
vshr.s64 q7, q13, #63 |
- veor q13, q13, q6 |
- vand q7, q7, q5 |
- vld1.8 {q3}, [r7]! |
- veor q2, q2, q10 |
+ veor q13, q13, q6 |
+ vand q7, q7, q5 |
+ vld1.8 {q3}, [r7]! |
+ veor q2, q2, q10 |
vadd.u64 q14, q13, q13 |
- vst1.64 {q13}, [r0,:128]! |
- vswp d15,d14 |
+ vst1.64 {q13}, [r0,:128]! |
+ vswp d15,d14 |
vshr.s64 q6, q14, #63 |
- veor q14, q14, q7 |
- vand q6, q6, q5 |
- vld1.8 {q4}, [r7]! |
- veor q3, q3, q11 |
+ veor q14, q14, q7 |
+ vand q6, q6, q5 |
+ vld1.8 {q4}, [r7]! |
+ veor q3, q3, q11 |
vadd.u64 q15, q14, q14 |
- vst1.64 {q14}, [r0,:128]! |
- vswp d13,d12 |
+ vst1.64 {q14}, [r0,:128]! |
+ vswp d13,d12 |
vshr.s64 q7, q15, #63 |
- veor q15, q15, q6 |
- vand q7, q7, q5 |
- vld1.8 {q5}, [r7]! |
- veor q4, q4, q12 |
+ veor q15, q15, q6 |
+ vand q7, q7, q5 |
+ vld1.8 {q5}, [r7]! |
+ veor q4, q4, q12 |
vadd.u64 q8, q15, q15 |
- vst1.64 {q15}, [r0,:128]! |
- vswp d15,d14 |
- veor q8, q8, q7 |
- vst1.64 {q8}, [r0,:128] @ next round tweak |
+ vst1.64 {q15}, [r0,:128]! |
+ vswp d15,d14 |
+ veor q8, q8, q7 |
+ vst1.64 {q8}, [r0,:128] @ next round tweak |
- vld1.8 {q6-q7}, [r7]! |
- veor q5, q5, q13 |
+ vld1.8 {q6,q7}, [r7]! |
+ veor q5, q5, q13 |
#ifndef BSAES_ASM_EXTENDED_KEY |
- add r4, sp, #0x90 @ pass key schedule |
+ add r4, sp, #0x90 @ pass key schedule |
#else |
- add r4, r10, #248 @ pass key schedule |
+ add r4, r10, #248 @ pass key schedule |
#endif |
- veor q6, q6, q14 |
- mov r5, r1 @ pass rounds |
- veor q7, q7, q15 |
- mov r0, sp |
- |
- bl _bsaes_encrypt8 |
- |
- vld1.64 {q8-q9}, [r0,:128]! |
- vld1.64 {q10-q11}, [r0,:128]! |
- veor q0, q0, q8 |
- vld1.64 {q12-q13}, [r0,:128]! |
- veor q1, q1, q9 |
- veor q8, q4, q10 |
- vst1.8 {q0-q1}, [r8]! |
- veor q9, q6, q11 |
- vld1.64 {q14-q15}, [r0,:128]! |
- veor q10, q3, q12 |
- vst1.8 {q8-q9}, [r8]! |
- veor q11, q7, q13 |
- veor q12, q2, q14 |
- vst1.8 {q10-q11}, [r8]! |
- veor q13, q5, q15 |
- vst1.8 {q12-q13}, [r8]! |
- |
- vld1.64 {q8}, [r0,:128] @ next round tweak |
- |
- subs r9, #0x80 |
- bpl .Lxts_enc_loop |
+ veor q6, q6, q14 |
+ mov r5, r1 @ pass rounds |
+ veor q7, q7, q15 |
+ mov r0, sp |
+ |
+ bl _bsaes_encrypt8 |
+ |
+ vld1.64 {q8,q9}, [r0,:128]! |
+ vld1.64 {q10,q11}, [r0,:128]! |
+ veor q0, q0, q8 |
+ vld1.64 {q12,q13}, [r0,:128]! |
+ veor q1, q1, q9 |
+ veor q8, q4, q10 |
+ vst1.8 {q0,q1}, [r8]! |
+ veor q9, q6, q11 |
+ vld1.64 {q14,q15}, [r0,:128]! |
+ veor q10, q3, q12 |
+ vst1.8 {q8,q9}, [r8]! |
+ veor q11, q7, q13 |
+ veor q12, q2, q14 |
+ vst1.8 {q10,q11}, [r8]! |
+ veor q13, q5, q15 |
+ vst1.8 {q12,q13}, [r8]! |
+ |
+ vld1.64 {q8}, [r0,:128] @ next round tweak |
+ |
+ subs r9, #0x80 |
+ bpl .Lxts_enc_loop |
.Lxts_enc_short: |
- adds r9, #0x70 |
- bmi .Lxts_enc_done |
+ adds r9, #0x70 |
+ bmi .Lxts_enc_done |
- vldmia r2, {q5} @ load XTS magic |
+ vldmia r2, {q5} @ load XTS magic |
vshr.s64 q7, q8, #63 |
- mov r0, sp |
- vand q7, q7, q5 |
+ mov r0, sp |
+ vand q7, q7, q5 |
vadd.u64 q9, q8, q8 |
- vst1.64 {q8}, [r0,:128]! |
- vswp d15,d14 |
+ vst1.64 {q8}, [r0,:128]! |
+ vswp d15,d14 |
vshr.s64 q6, q9, #63 |
- veor q9, q9, q7 |
- vand q6, q6, q5 |
+ veor q9, q9, q7 |
+ vand q6, q6, q5 |
vadd.u64 q10, q9, q9 |
- vst1.64 {q9}, [r0,:128]! |
- vswp d13,d12 |
+ vst1.64 {q9}, [r0,:128]! |
+ vswp d13,d12 |
vshr.s64 q7, q10, #63 |
- veor q10, q10, q6 |
- vand q7, q7, q5 |
- vld1.8 {q0}, [r7]! |
- subs r9, #0x10 |
- bmi .Lxts_enc_1 |
+ veor q10, q10, q6 |
+ vand q7, q7, q5 |
+ vld1.8 {q0}, [r7]! |
+ subs r9, #0x10 |
+ bmi .Lxts_enc_1 |
vadd.u64 q11, q10, q10 |
- vst1.64 {q10}, [r0,:128]! |
- vswp d15,d14 |
+ vst1.64 {q10}, [r0,:128]! |
+ vswp d15,d14 |
vshr.s64 q6, q11, #63 |
- veor q11, q11, q7 |
- vand q6, q6, q5 |
- vld1.8 {q1}, [r7]! |
- subs r9, #0x10 |
- bmi .Lxts_enc_2 |
- veor q0, q0, q8 |
+ veor q11, q11, q7 |
+ vand q6, q6, q5 |
+ vld1.8 {q1}, [r7]! |
+ subs r9, #0x10 |
+ bmi .Lxts_enc_2 |
+ veor q0, q0, q8 |
vadd.u64 q12, q11, q11 |
- vst1.64 {q11}, [r0,:128]! |
- vswp d13,d12 |
+ vst1.64 {q11}, [r0,:128]! |
+ vswp d13,d12 |
vshr.s64 q7, q12, #63 |
- veor q12, q12, q6 |
- vand q7, q7, q5 |
- vld1.8 {q2}, [r7]! |
- subs r9, #0x10 |
- bmi .Lxts_enc_3 |
- veor q1, q1, q9 |
+ veor q12, q12, q6 |
+ vand q7, q7, q5 |
+ vld1.8 {q2}, [r7]! |
+ subs r9, #0x10 |
+ bmi .Lxts_enc_3 |
+ veor q1, q1, q9 |
vadd.u64 q13, q12, q12 |
- vst1.64 {q12}, [r0,:128]! |
- vswp d15,d14 |
+ vst1.64 {q12}, [r0,:128]! |
+ vswp d15,d14 |
vshr.s64 q6, q13, #63 |
- veor q13, q13, q7 |
- vand q6, q6, q5 |
- vld1.8 {q3}, [r7]! |
- subs r9, #0x10 |
- bmi .Lxts_enc_4 |
- veor q2, q2, q10 |
+ veor q13, q13, q7 |
+ vand q6, q6, q5 |
+ vld1.8 {q3}, [r7]! |
+ subs r9, #0x10 |
+ bmi .Lxts_enc_4 |
+ veor q2, q2, q10 |
vadd.u64 q14, q13, q13 |
- vst1.64 {q13}, [r0,:128]! |
- vswp d13,d12 |
+ vst1.64 {q13}, [r0,:128]! |
+ vswp d13,d12 |
vshr.s64 q7, q14, #63 |
- veor q14, q14, q6 |
- vand q7, q7, q5 |
- vld1.8 {q4}, [r7]! |
- subs r9, #0x10 |
- bmi .Lxts_enc_5 |
- veor q3, q3, q11 |
+ veor q14, q14, q6 |
+ vand q7, q7, q5 |
+ vld1.8 {q4}, [r7]! |
+ subs r9, #0x10 |
+ bmi .Lxts_enc_5 |
+ veor q3, q3, q11 |
vadd.u64 q15, q14, q14 |
- vst1.64 {q14}, [r0,:128]! |
- vswp d15,d14 |
+ vst1.64 {q14}, [r0,:128]! |
+ vswp d15,d14 |
vshr.s64 q6, q15, #63 |
- veor q15, q15, q7 |
- vand q6, q6, q5 |
- vld1.8 {q5}, [r7]! |
- subs r9, #0x10 |
- bmi .Lxts_enc_6 |
- veor q4, q4, q12 |
- sub r9, #0x10 |
- vst1.64 {q15}, [r0,:128] @ next round tweak |
- |
- vld1.8 {q6}, [r7]! |
- veor q5, q5, q13 |
+ veor q15, q15, q7 |
+ vand q6, q6, q5 |
+ vld1.8 {q5}, [r7]! |
+ subs r9, #0x10 |
+ bmi .Lxts_enc_6 |
+ veor q4, q4, q12 |
+ sub r9, #0x10 |
+ vst1.64 {q15}, [r0,:128] @ next round tweak |
+ |
+ vld1.8 {q6}, [r7]! |
+ veor q5, q5, q13 |
#ifndef BSAES_ASM_EXTENDED_KEY |
- add r4, sp, #0x90 @ pass key schedule |
+ add r4, sp, #0x90 @ pass key schedule |
#else |
- add r4, r10, #248 @ pass key schedule |
+ add r4, r10, #248 @ pass key schedule |
#endif |
- veor q6, q6, q14 |
- mov r5, r1 @ pass rounds |
- mov r0, sp |
- |
- bl _bsaes_encrypt8 |
- |
- vld1.64 {q8-q9}, [r0,:128]! |
- vld1.64 {q10-q11}, [r0,:128]! |
- veor q0, q0, q8 |
- vld1.64 {q12-q13}, [r0,:128]! |
- veor q1, q1, q9 |
- veor q8, q4, q10 |
- vst1.8 {q0-q1}, [r8]! |
- veor q9, q6, q11 |
- vld1.64 {q14}, [r0,:128]! |
- veor q10, q3, q12 |
- vst1.8 {q8-q9}, [r8]! |
- veor q11, q7, q13 |
- veor q12, q2, q14 |
- vst1.8 {q10-q11}, [r8]! |
- vst1.8 {q12}, [r8]! |
- |
- vld1.64 {q8}, [r0,:128] @ next round tweak |
- b .Lxts_enc_done |
+ veor q6, q6, q14 |
+ mov r5, r1 @ pass rounds |
+ mov r0, sp |
+ |
+ bl _bsaes_encrypt8 |
+ |
+ vld1.64 {q8,q9}, [r0,:128]! |
+ vld1.64 {q10,q11}, [r0,:128]! |
+ veor q0, q0, q8 |
+ vld1.64 {q12,q13}, [r0,:128]! |
+ veor q1, q1, q9 |
+ veor q8, q4, q10 |
+ vst1.8 {q0,q1}, [r8]! |
+ veor q9, q6, q11 |
+ vld1.64 {q14}, [r0,:128]! |
+ veor q10, q3, q12 |
+ vst1.8 {q8,q9}, [r8]! |
+ veor q11, q7, q13 |
+ veor q12, q2, q14 |
+ vst1.8 {q10,q11}, [r8]! |
+ vst1.8 {q12}, [r8]! |
+ |
+ vld1.64 {q8}, [r0,:128] @ next round tweak |
+ b .Lxts_enc_done |
.align 4 |
.Lxts_enc_6: |
- vst1.64 {q14}, [r0,:128] @ next round tweak |
+ vst1.64 {q14}, [r0,:128] @ next round tweak |
- veor q4, q4, q12 |
+ veor q4, q4, q12 |
#ifndef BSAES_ASM_EXTENDED_KEY |
- add r4, sp, #0x90 @ pass key schedule |
+ add r4, sp, #0x90 @ pass key schedule |
#else |
- add r4, r10, #248 @ pass key schedule |
+ add r4, r10, #248 @ pass key schedule |
#endif |
- veor q5, q5, q13 |
- mov r5, r1 @ pass rounds |
- mov r0, sp |
- |
- bl _bsaes_encrypt8 |
- |
- vld1.64 {q8-q9}, [r0,:128]! |
- vld1.64 {q10-q11}, [r0,:128]! |
- veor q0, q0, q8 |
- vld1.64 {q12-q13}, [r0,:128]! |
- veor q1, q1, q9 |
- veor q8, q4, q10 |
- vst1.8 {q0-q1}, [r8]! |
- veor q9, q6, q11 |
- veor q10, q3, q12 |
- vst1.8 {q8-q9}, [r8]! |
- veor q11, q7, q13 |
- vst1.8 {q10-q11}, [r8]! |
- |
- vld1.64 {q8}, [r0,:128] @ next round tweak |
- b .Lxts_enc_done |
+ veor q5, q5, q13 |
+ mov r5, r1 @ pass rounds |
+ mov r0, sp |
+ |
+ bl _bsaes_encrypt8 |
+ |
+ vld1.64 {q8,q9}, [r0,:128]! |
+ vld1.64 {q10,q11}, [r0,:128]! |
+ veor q0, q0, q8 |
+ vld1.64 {q12,q13}, [r0,:128]! |
+ veor q1, q1, q9 |
+ veor q8, q4, q10 |
+ vst1.8 {q0,q1}, [r8]! |
+ veor q9, q6, q11 |
+ veor q10, q3, q12 |
+ vst1.8 {q8,q9}, [r8]! |
+ veor q11, q7, q13 |
+ vst1.8 {q10,q11}, [r8]! |
+ |
+ vld1.64 {q8}, [r0,:128] @ next round tweak |
+ b .Lxts_enc_done |
@ put this in range for both ARM and Thumb mode adr instructions |
.align 5 |
.Lxts_magic: |
- .quad 1, 0x87 |
+.quad 1, 0x87 |
.align 5 |
.Lxts_enc_5: |
- vst1.64 {q13}, [r0,:128] @ next round tweak |
+ vst1.64 {q13}, [r0,:128] @ next round tweak |
- veor q3, q3, q11 |
+ veor q3, q3, q11 |
#ifndef BSAES_ASM_EXTENDED_KEY |
- add r4, sp, #0x90 @ pass key schedule |
+ add r4, sp, #0x90 @ pass key schedule |
#else |
- add r4, r10, #248 @ pass key schedule |
+ add r4, r10, #248 @ pass key schedule |
#endif |
- veor q4, q4, q12 |
- mov r5, r1 @ pass rounds |
- mov r0, sp |
- |
- bl _bsaes_encrypt8 |
- |
- vld1.64 {q8-q9}, [r0,:128]! |
- vld1.64 {q10-q11}, [r0,:128]! |
- veor q0, q0, q8 |
- vld1.64 {q12}, [r0,:128]! |
- veor q1, q1, q9 |
- veor q8, q4, q10 |
- vst1.8 {q0-q1}, [r8]! |
- veor q9, q6, q11 |
- veor q10, q3, q12 |
- vst1.8 {q8-q9}, [r8]! |
- vst1.8 {q10}, [r8]! |
- |
- vld1.64 {q8}, [r0,:128] @ next round tweak |
- b .Lxts_enc_done |
+ veor q4, q4, q12 |
+ mov r5, r1 @ pass rounds |
+ mov r0, sp |
+ |
+ bl _bsaes_encrypt8 |
+ |
+ vld1.64 {q8,q9}, [r0,:128]! |
+ vld1.64 {q10,q11}, [r0,:128]! |
+ veor q0, q0, q8 |
+ vld1.64 {q12}, [r0,:128]! |
+ veor q1, q1, q9 |
+ veor q8, q4, q10 |
+ vst1.8 {q0,q1}, [r8]! |
+ veor q9, q6, q11 |
+ veor q10, q3, q12 |
+ vst1.8 {q8,q9}, [r8]! |
+ vst1.8 {q10}, [r8]! |
+ |
+ vld1.64 {q8}, [r0,:128] @ next round tweak |
+ b .Lxts_enc_done |
.align 4 |
.Lxts_enc_4: |
- vst1.64 {q12}, [r0,:128] @ next round tweak |
+ vst1.64 {q12}, [r0,:128] @ next round tweak |
- veor q2, q2, q10 |
+ veor q2, q2, q10 |
#ifndef BSAES_ASM_EXTENDED_KEY |
- add r4, sp, #0x90 @ pass key schedule |
+ add r4, sp, #0x90 @ pass key schedule |
#else |
- add r4, r10, #248 @ pass key schedule |
+ add r4, r10, #248 @ pass key schedule |
#endif |
- veor q3, q3, q11 |
- mov r5, r1 @ pass rounds |
- mov r0, sp |
- |
- bl _bsaes_encrypt8 |
- |
- vld1.64 {q8-q9}, [r0,:128]! |
- vld1.64 {q10-q11}, [r0,:128]! |
- veor q0, q0, q8 |
- veor q1, q1, q9 |
- veor q8, q4, q10 |
- vst1.8 {q0-q1}, [r8]! |
- veor q9, q6, q11 |
- vst1.8 {q8-q9}, [r8]! |
- |
- vld1.64 {q8}, [r0,:128] @ next round tweak |
- b .Lxts_enc_done |
+ veor q3, q3, q11 |
+ mov r5, r1 @ pass rounds |
+ mov r0, sp |
+ |
+ bl _bsaes_encrypt8 |
+ |
+ vld1.64 {q8,q9}, [r0,:128]! |
+ vld1.64 {q10,q11}, [r0,:128]! |
+ veor q0, q0, q8 |
+ veor q1, q1, q9 |
+ veor q8, q4, q10 |
+ vst1.8 {q0,q1}, [r8]! |
+ veor q9, q6, q11 |
+ vst1.8 {q8,q9}, [r8]! |
+ |
+ vld1.64 {q8}, [r0,:128] @ next round tweak |
+ b .Lxts_enc_done |
.align 4 |
.Lxts_enc_3: |
- vst1.64 {q11}, [r0,:128] @ next round tweak |
+ vst1.64 {q11}, [r0,:128] @ next round tweak |
- veor q1, q1, q9 |
+ veor q1, q1, q9 |
#ifndef BSAES_ASM_EXTENDED_KEY |
- add r4, sp, #0x90 @ pass key schedule |
+ add r4, sp, #0x90 @ pass key schedule |
#else |
- add r4, r10, #248 @ pass key schedule |
+ add r4, r10, #248 @ pass key schedule |
#endif |
- veor q2, q2, q10 |
- mov r5, r1 @ pass rounds |
- mov r0, sp |
- |
- bl _bsaes_encrypt8 |
- |
- vld1.64 {q8-q9}, [r0,:128]! |
- vld1.64 {q10}, [r0,:128]! |
- veor q0, q0, q8 |
- veor q1, q1, q9 |
- veor q8, q4, q10 |
- vst1.8 {q0-q1}, [r8]! |
- vst1.8 {q8}, [r8]! |
- |
- vld1.64 {q8}, [r0,:128] @ next round tweak |
- b .Lxts_enc_done |
+ veor q2, q2, q10 |
+ mov r5, r1 @ pass rounds |
+ mov r0, sp |
+ |
+ bl _bsaes_encrypt8 |
+ |
+ vld1.64 {q8,q9}, [r0,:128]! |
+ vld1.64 {q10}, [r0,:128]! |
+ veor q0, q0, q8 |
+ veor q1, q1, q9 |
+ veor q8, q4, q10 |
+ vst1.8 {q0,q1}, [r8]! |
+ vst1.8 {q8}, [r8]! |
+ |
+ vld1.64 {q8}, [r0,:128] @ next round tweak |
+ b .Lxts_enc_done |
.align 4 |
.Lxts_enc_2: |
- vst1.64 {q10}, [r0,:128] @ next round tweak |
+ vst1.64 {q10}, [r0,:128] @ next round tweak |
- veor q0, q0, q8 |
+ veor q0, q0, q8 |
#ifndef BSAES_ASM_EXTENDED_KEY |
- add r4, sp, #0x90 @ pass key schedule |
+ add r4, sp, #0x90 @ pass key schedule |
#else |
- add r4, r10, #248 @ pass key schedule |
+ add r4, r10, #248 @ pass key schedule |
#endif |
- veor q1, q1, q9 |
- mov r5, r1 @ pass rounds |
- mov r0, sp |
+ veor q1, q1, q9 |
+ mov r5, r1 @ pass rounds |
+ mov r0, sp |
- bl _bsaes_encrypt8 |
+ bl _bsaes_encrypt8 |
- vld1.64 {q8-q9}, [r0,:128]! |
- veor q0, q0, q8 |
- veor q1, q1, q9 |
- vst1.8 {q0-q1}, [r8]! |
+ vld1.64 {q8,q9}, [r0,:128]! |
+ veor q0, q0, q8 |
+ veor q1, q1, q9 |
+ vst1.8 {q0,q1}, [r8]! |
- vld1.64 {q8}, [r0,:128] @ next round tweak |
- b .Lxts_enc_done |
+ vld1.64 {q8}, [r0,:128] @ next round tweak |
+ b .Lxts_enc_done |
.align 4 |
.Lxts_enc_1: |
- mov r0, sp |
- veor q0, q8 |
- mov r1, sp |
- vst1.8 {q0}, [sp,:128] |
- mov r2, r10 |
- mov r4, r3 @ preserve fp |
+ mov r0, sp |
+ veor q0, q8 |
+ mov r1, sp |
+ vst1.8 {q0}, [sp,:128] |
+ mov r2, r10 |
+ mov r4, r3 @ preserve fp |
- bl AES_encrypt |
+ bl AES_encrypt |
- vld1.8 {q0}, [sp,:128] |
- veor q0, q0, q8 |
- vst1.8 {q0}, [r8]! |
- mov r3, r4 |
+ vld1.8 {q0}, [sp,:128] |
+ veor q0, q0, q8 |
+ vst1.8 {q0}, [r8]! |
+ mov r3, r4 |
- vmov q8, q9 @ next round tweak |
+ vmov q8, q9 @ next round tweak |
.Lxts_enc_done: |
#ifndef XTS_CHAIN_TWEAK |
- adds r9, #0x10 |
- beq .Lxts_enc_ret |
- sub r6, r8, #0x10 |
+ adds r9, #0x10 |
+ beq .Lxts_enc_ret |
+ sub r6, r8, #0x10 |
.Lxts_enc_steal: |
- ldrb r0, [r7], #1 |
- ldrb r1, [r8, #-0x10] |
- strb r0, [r8, #-0x10] |
- strb r1, [r8], #1 |
- |
- subs r9, #1 |
- bhi .Lxts_enc_steal |
- |
- vld1.8 {q0}, [r6] |
- mov r0, sp |
- veor q0, q0, q8 |
- mov r1, sp |
- vst1.8 {q0}, [sp,:128] |
- mov r2, r10 |
- mov r4, r3 @ preserve fp |
- |
- bl AES_encrypt |
- |
- vld1.8 {q0}, [sp,:128] |
- veor q0, q0, q8 |
- vst1.8 {q0}, [r6] |
- mov r3, r4 |
+ ldrb r0, [r7], #1 |
+ ldrb r1, [r8, #-0x10] |
+ strb r0, [r8, #-0x10] |
+ strb r1, [r8], #1 |
+ |
+ subs r9, #1 |
+ bhi .Lxts_enc_steal |
+ |
+ vld1.8 {q0}, [r6] |
+ mov r0, sp |
+ veor q0, q0, q8 |
+ mov r1, sp |
+ vst1.8 {q0}, [sp,:128] |
+ mov r2, r10 |
+ mov r4, r3 @ preserve fp |
+ |
+ bl AES_encrypt |
+ |
+ vld1.8 {q0}, [sp,:128] |
+ veor q0, q0, q8 |
+ vst1.8 {q0}, [r6] |
+ mov r3, r4 |
#endif |
.Lxts_enc_ret: |
- bic r0, r3, #0xf |
+ bic r0, r3, #0xf |
vmov.i32 q0, #0 |
vmov.i32 q1, #0 |
#ifdef XTS_CHAIN_TWEAK |
- ldr r1, [r3, #0x20+VFP_ABI_FRAME] @ chain tweak |
+ ldr r1, [r3, #0x20+VFP_ABI_FRAME] @ chain tweak |
#endif |
-.Lxts_enc_bzero: @ wipe key schedule [if any] |
- vstmia sp!, {q0-q1} |
- cmp sp, r0 |
- bne .Lxts_enc_bzero |
+.Lxts_enc_bzero:@ wipe key schedule [if any] |
+ vstmia sp!, {q0,q1} |
+ cmp sp, r0 |
+ bne .Lxts_enc_bzero |
- mov sp, r3 |
+ mov sp, r3 |
#ifdef XTS_CHAIN_TWEAK |
- vst1.8 {q8}, [r1] |
+ vst1.8 {q8}, [r1] |
#endif |
VFP_ABI_POP |
- ldmia sp!, {r4-r10, pc} @ return |
+ ldmia sp!, {r4,r5,r6,r7,r8,r9,r10, pc} @ return |
.size bsaes_xts_encrypt,.-bsaes_xts_encrypt |
@@ -2035,7 +2060,7 @@ bsaes_xts_encrypt: |
.align 4 |
bsaes_xts_decrypt: |
mov ip, sp |
- stmdb sp!, {r4-r10, lr} @ 0x20 |
+ stmdb sp!, {r4,r5,r6,r7,r8,r9,r10, lr} @ 0x20 |
VFP_ABI_PUSH |
mov r6, sp @ future r3 |
@@ -2095,14 +2120,16 @@ bsaes_xts_decrypt: |
vstmia r4, {q7} |
.align 2 |
-0: sub sp, #0x90 @ place for tweak[9] |
+ sub sp, #0x90 @ place for tweak[9] |
#endif |
vld1.8 {q8}, [r0] @ initial tweak |
adr r2, .Lxts_magic |
+#ifndef XTS_CHAIN_TWEAK |
tst r9, #0xf @ if not multiple of 16 |
it ne @ Thumb2 thing, sanity check in ARM |
subne r9, #0x10 @ subtract another 16 bytes |
+#endif |
subs r9, #0x80 |
blo .Lxts_dec_short |
@@ -2110,440 +2137,440 @@ bsaes_xts_decrypt: |
.align 4 |
.Lxts_dec_loop: |
- vldmia r2, {q5} @ load XTS magic |
+ vldmia r2, {q5} @ load XTS magic |
vshr.s64 q6, q8, #63 |
- mov r0, sp |
- vand q6, q6, q5 |
+ mov r0, sp |
+ vand q6, q6, q5 |
vadd.u64 q9, q8, q8 |
- vst1.64 {q8}, [r0,:128]! |
- vswp d13,d12 |
+ vst1.64 {q8}, [r0,:128]! |
+ vswp d13,d12 |
vshr.s64 q7, q9, #63 |
- veor q9, q9, q6 |
- vand q7, q7, q5 |
+ veor q9, q9, q6 |
+ vand q7, q7, q5 |
vadd.u64 q10, q9, q9 |
- vst1.64 {q9}, [r0,:128]! |
- vswp d15,d14 |
+ vst1.64 {q9}, [r0,:128]! |
+ vswp d15,d14 |
vshr.s64 q6, q10, #63 |
- veor q10, q10, q7 |
- vand q6, q6, q5 |
- vld1.8 {q0}, [r7]! |
+ veor q10, q10, q7 |
+ vand q6, q6, q5 |
+ vld1.8 {q0}, [r7]! |
vadd.u64 q11, q10, q10 |
- vst1.64 {q10}, [r0,:128]! |
- vswp d13,d12 |
+ vst1.64 {q10}, [r0,:128]! |
+ vswp d13,d12 |
vshr.s64 q7, q11, #63 |
- veor q11, q11, q6 |
- vand q7, q7, q5 |
- vld1.8 {q1}, [r7]! |
- veor q0, q0, q8 |
+ veor q11, q11, q6 |
+ vand q7, q7, q5 |
+ vld1.8 {q1}, [r7]! |
+ veor q0, q0, q8 |
vadd.u64 q12, q11, q11 |
- vst1.64 {q11}, [r0,:128]! |
- vswp d15,d14 |
+ vst1.64 {q11}, [r0,:128]! |
+ vswp d15,d14 |
vshr.s64 q6, q12, #63 |
- veor q12, q12, q7 |
- vand q6, q6, q5 |
- vld1.8 {q2}, [r7]! |
- veor q1, q1, q9 |
+ veor q12, q12, q7 |
+ vand q6, q6, q5 |
+ vld1.8 {q2}, [r7]! |
+ veor q1, q1, q9 |
vadd.u64 q13, q12, q12 |
- vst1.64 {q12}, [r0,:128]! |
- vswp d13,d12 |
+ vst1.64 {q12}, [r0,:128]! |
+ vswp d13,d12 |
vshr.s64 q7, q13, #63 |
- veor q13, q13, q6 |
- vand q7, q7, q5 |
- vld1.8 {q3}, [r7]! |
- veor q2, q2, q10 |
+ veor q13, q13, q6 |
+ vand q7, q7, q5 |
+ vld1.8 {q3}, [r7]! |
+ veor q2, q2, q10 |
vadd.u64 q14, q13, q13 |
- vst1.64 {q13}, [r0,:128]! |
- vswp d15,d14 |
+ vst1.64 {q13}, [r0,:128]! |
+ vswp d15,d14 |
vshr.s64 q6, q14, #63 |
- veor q14, q14, q7 |
- vand q6, q6, q5 |
- vld1.8 {q4}, [r7]! |
- veor q3, q3, q11 |
+ veor q14, q14, q7 |
+ vand q6, q6, q5 |
+ vld1.8 {q4}, [r7]! |
+ veor q3, q3, q11 |
vadd.u64 q15, q14, q14 |
- vst1.64 {q14}, [r0,:128]! |
- vswp d13,d12 |
+ vst1.64 {q14}, [r0,:128]! |
+ vswp d13,d12 |
vshr.s64 q7, q15, #63 |
- veor q15, q15, q6 |
- vand q7, q7, q5 |
- vld1.8 {q5}, [r7]! |
- veor q4, q4, q12 |
+ veor q15, q15, q6 |
+ vand q7, q7, q5 |
+ vld1.8 {q5}, [r7]! |
+ veor q4, q4, q12 |
vadd.u64 q8, q15, q15 |
- vst1.64 {q15}, [r0,:128]! |
- vswp d15,d14 |
- veor q8, q8, q7 |
- vst1.64 {q8}, [r0,:128] @ next round tweak |
+ vst1.64 {q15}, [r0,:128]! |
+ vswp d15,d14 |
+ veor q8, q8, q7 |
+ vst1.64 {q8}, [r0,:128] @ next round tweak |
- vld1.8 {q6-q7}, [r7]! |
- veor q5, q5, q13 |
+ vld1.8 {q6,q7}, [r7]! |
+ veor q5, q5, q13 |
#ifndef BSAES_ASM_EXTENDED_KEY |
- add r4, sp, #0x90 @ pass key schedule |
+ add r4, sp, #0x90 @ pass key schedule |
#else |
- add r4, r10, #248 @ pass key schedule |
+ add r4, r10, #248 @ pass key schedule |
#endif |
- veor q6, q6, q14 |
- mov r5, r1 @ pass rounds |
- veor q7, q7, q15 |
- mov r0, sp |
- |
- bl _bsaes_decrypt8 |
- |
- vld1.64 {q8-q9}, [r0,:128]! |
- vld1.64 {q10-q11}, [r0,:128]! |
- veor q0, q0, q8 |
- vld1.64 {q12-q13}, [r0,:128]! |
- veor q1, q1, q9 |
- veor q8, q6, q10 |
- vst1.8 {q0-q1}, [r8]! |
- veor q9, q4, q11 |
- vld1.64 {q14-q15}, [r0,:128]! |
- veor q10, q2, q12 |
- vst1.8 {q8-q9}, [r8]! |
- veor q11, q7, q13 |
- veor q12, q3, q14 |
- vst1.8 {q10-q11}, [r8]! |
- veor q13, q5, q15 |
- vst1.8 {q12-q13}, [r8]! |
- |
- vld1.64 {q8}, [r0,:128] @ next round tweak |
- |
- subs r9, #0x80 |
- bpl .Lxts_dec_loop |
+ veor q6, q6, q14 |
+ mov r5, r1 @ pass rounds |
+ veor q7, q7, q15 |
+ mov r0, sp |
+ |
+ bl _bsaes_decrypt8 |
+ |
+ vld1.64 {q8,q9}, [r0,:128]! |
+ vld1.64 {q10,q11}, [r0,:128]! |
+ veor q0, q0, q8 |
+ vld1.64 {q12,q13}, [r0,:128]! |
+ veor q1, q1, q9 |
+ veor q8, q6, q10 |
+ vst1.8 {q0,q1}, [r8]! |
+ veor q9, q4, q11 |
+ vld1.64 {q14,q15}, [r0,:128]! |
+ veor q10, q2, q12 |
+ vst1.8 {q8,q9}, [r8]! |
+ veor q11, q7, q13 |
+ veor q12, q3, q14 |
+ vst1.8 {q10,q11}, [r8]! |
+ veor q13, q5, q15 |
+ vst1.8 {q12,q13}, [r8]! |
+ |
+ vld1.64 {q8}, [r0,:128] @ next round tweak |
+ |
+ subs r9, #0x80 |
+ bpl .Lxts_dec_loop |
.Lxts_dec_short: |
- adds r9, #0x70 |
- bmi .Lxts_dec_done |
+ adds r9, #0x70 |
+ bmi .Lxts_dec_done |
- vldmia r2, {q5} @ load XTS magic |
+ vldmia r2, {q5} @ load XTS magic |
vshr.s64 q7, q8, #63 |
- mov r0, sp |
- vand q7, q7, q5 |
+ mov r0, sp |
+ vand q7, q7, q5 |
vadd.u64 q9, q8, q8 |
- vst1.64 {q8}, [r0,:128]! |
- vswp d15,d14 |
+ vst1.64 {q8}, [r0,:128]! |
+ vswp d15,d14 |
vshr.s64 q6, q9, #63 |
- veor q9, q9, q7 |
- vand q6, q6, q5 |
+ veor q9, q9, q7 |
+ vand q6, q6, q5 |
vadd.u64 q10, q9, q9 |
- vst1.64 {q9}, [r0,:128]! |
- vswp d13,d12 |
+ vst1.64 {q9}, [r0,:128]! |
+ vswp d13,d12 |
vshr.s64 q7, q10, #63 |
- veor q10, q10, q6 |
- vand q7, q7, q5 |
- vld1.8 {q0}, [r7]! |
- subs r9, #0x10 |
- bmi .Lxts_dec_1 |
+ veor q10, q10, q6 |
+ vand q7, q7, q5 |
+ vld1.8 {q0}, [r7]! |
+ subs r9, #0x10 |
+ bmi .Lxts_dec_1 |
vadd.u64 q11, q10, q10 |
- vst1.64 {q10}, [r0,:128]! |
- vswp d15,d14 |
+ vst1.64 {q10}, [r0,:128]! |
+ vswp d15,d14 |
vshr.s64 q6, q11, #63 |
- veor q11, q11, q7 |
- vand q6, q6, q5 |
- vld1.8 {q1}, [r7]! |
- subs r9, #0x10 |
- bmi .Lxts_dec_2 |
- veor q0, q0, q8 |
+ veor q11, q11, q7 |
+ vand q6, q6, q5 |
+ vld1.8 {q1}, [r7]! |
+ subs r9, #0x10 |
+ bmi .Lxts_dec_2 |
+ veor q0, q0, q8 |
vadd.u64 q12, q11, q11 |
- vst1.64 {q11}, [r0,:128]! |
- vswp d13,d12 |
+ vst1.64 {q11}, [r0,:128]! |
+ vswp d13,d12 |
vshr.s64 q7, q12, #63 |
- veor q12, q12, q6 |
- vand q7, q7, q5 |
- vld1.8 {q2}, [r7]! |
- subs r9, #0x10 |
- bmi .Lxts_dec_3 |
- veor q1, q1, q9 |
+ veor q12, q12, q6 |
+ vand q7, q7, q5 |
+ vld1.8 {q2}, [r7]! |
+ subs r9, #0x10 |
+ bmi .Lxts_dec_3 |
+ veor q1, q1, q9 |
vadd.u64 q13, q12, q12 |
- vst1.64 {q12}, [r0,:128]! |
- vswp d15,d14 |
+ vst1.64 {q12}, [r0,:128]! |
+ vswp d15,d14 |
vshr.s64 q6, q13, #63 |
- veor q13, q13, q7 |
- vand q6, q6, q5 |
- vld1.8 {q3}, [r7]! |
- subs r9, #0x10 |
- bmi .Lxts_dec_4 |
- veor q2, q2, q10 |
+ veor q13, q13, q7 |
+ vand q6, q6, q5 |
+ vld1.8 {q3}, [r7]! |
+ subs r9, #0x10 |
+ bmi .Lxts_dec_4 |
+ veor q2, q2, q10 |
vadd.u64 q14, q13, q13 |
- vst1.64 {q13}, [r0,:128]! |
- vswp d13,d12 |
+ vst1.64 {q13}, [r0,:128]! |
+ vswp d13,d12 |
vshr.s64 q7, q14, #63 |
- veor q14, q14, q6 |
- vand q7, q7, q5 |
- vld1.8 {q4}, [r7]! |
- subs r9, #0x10 |
- bmi .Lxts_dec_5 |
- veor q3, q3, q11 |
+ veor q14, q14, q6 |
+ vand q7, q7, q5 |
+ vld1.8 {q4}, [r7]! |
+ subs r9, #0x10 |
+ bmi .Lxts_dec_5 |
+ veor q3, q3, q11 |
vadd.u64 q15, q14, q14 |
- vst1.64 {q14}, [r0,:128]! |
- vswp d15,d14 |
+ vst1.64 {q14}, [r0,:128]! |
+ vswp d15,d14 |
vshr.s64 q6, q15, #63 |
- veor q15, q15, q7 |
- vand q6, q6, q5 |
- vld1.8 {q5}, [r7]! |
- subs r9, #0x10 |
- bmi .Lxts_dec_6 |
- veor q4, q4, q12 |
- sub r9, #0x10 |
- vst1.64 {q15}, [r0,:128] @ next round tweak |
- |
- vld1.8 {q6}, [r7]! |
- veor q5, q5, q13 |
+ veor q15, q15, q7 |
+ vand q6, q6, q5 |
+ vld1.8 {q5}, [r7]! |
+ subs r9, #0x10 |
+ bmi .Lxts_dec_6 |
+ veor q4, q4, q12 |
+ sub r9, #0x10 |
+ vst1.64 {q15}, [r0,:128] @ next round tweak |
+ |
+ vld1.8 {q6}, [r7]! |
+ veor q5, q5, q13 |
#ifndef BSAES_ASM_EXTENDED_KEY |
- add r4, sp, #0x90 @ pass key schedule |
+ add r4, sp, #0x90 @ pass key schedule |
#else |
- add r4, r10, #248 @ pass key schedule |
+ add r4, r10, #248 @ pass key schedule |
#endif |
- veor q6, q6, q14 |
- mov r5, r1 @ pass rounds |
- mov r0, sp |
- |
- bl _bsaes_decrypt8 |
- |
- vld1.64 {q8-q9}, [r0,:128]! |
- vld1.64 {q10-q11}, [r0,:128]! |
- veor q0, q0, q8 |
- vld1.64 {q12-q13}, [r0,:128]! |
- veor q1, q1, q9 |
- veor q8, q6, q10 |
- vst1.8 {q0-q1}, [r8]! |
- veor q9, q4, q11 |
- vld1.64 {q14}, [r0,:128]! |
- veor q10, q2, q12 |
- vst1.8 {q8-q9}, [r8]! |
- veor q11, q7, q13 |
- veor q12, q3, q14 |
- vst1.8 {q10-q11}, [r8]! |
- vst1.8 {q12}, [r8]! |
- |
- vld1.64 {q8}, [r0,:128] @ next round tweak |
- b .Lxts_dec_done |
+ veor q6, q6, q14 |
+ mov r5, r1 @ pass rounds |
+ mov r0, sp |
+ |
+ bl _bsaes_decrypt8 |
+ |
+ vld1.64 {q8,q9}, [r0,:128]! |
+ vld1.64 {q10,q11}, [r0,:128]! |
+ veor q0, q0, q8 |
+ vld1.64 {q12,q13}, [r0,:128]! |
+ veor q1, q1, q9 |
+ veor q8, q6, q10 |
+ vst1.8 {q0,q1}, [r8]! |
+ veor q9, q4, q11 |
+ vld1.64 {q14}, [r0,:128]! |
+ veor q10, q2, q12 |
+ vst1.8 {q8,q9}, [r8]! |
+ veor q11, q7, q13 |
+ veor q12, q3, q14 |
+ vst1.8 {q10,q11}, [r8]! |
+ vst1.8 {q12}, [r8]! |
+ |
+ vld1.64 {q8}, [r0,:128] @ next round tweak |
+ b .Lxts_dec_done |
.align 4 |
.Lxts_dec_6: |
- vst1.64 {q14}, [r0,:128] @ next round tweak |
+ vst1.64 {q14}, [r0,:128] @ next round tweak |
- veor q4, q4, q12 |
+ veor q4, q4, q12 |
#ifndef BSAES_ASM_EXTENDED_KEY |
- add r4, sp, #0x90 @ pass key schedule |
+ add r4, sp, #0x90 @ pass key schedule |
#else |
- add r4, r10, #248 @ pass key schedule |
+ add r4, r10, #248 @ pass key schedule |
#endif |
- veor q5, q5, q13 |
- mov r5, r1 @ pass rounds |
- mov r0, sp |
- |
- bl _bsaes_decrypt8 |
- |
- vld1.64 {q8-q9}, [r0,:128]! |
- vld1.64 {q10-q11}, [r0,:128]! |
- veor q0, q0, q8 |
- vld1.64 {q12-q13}, [r0,:128]! |
- veor q1, q1, q9 |
- veor q8, q6, q10 |
- vst1.8 {q0-q1}, [r8]! |
- veor q9, q4, q11 |
- veor q10, q2, q12 |
- vst1.8 {q8-q9}, [r8]! |
- veor q11, q7, q13 |
- vst1.8 {q10-q11}, [r8]! |
- |
- vld1.64 {q8}, [r0,:128] @ next round tweak |
- b .Lxts_dec_done |
+ veor q5, q5, q13 |
+ mov r5, r1 @ pass rounds |
+ mov r0, sp |
+ |
+ bl _bsaes_decrypt8 |
+ |
+ vld1.64 {q8,q9}, [r0,:128]! |
+ vld1.64 {q10,q11}, [r0,:128]! |
+ veor q0, q0, q8 |
+ vld1.64 {q12,q13}, [r0,:128]! |
+ veor q1, q1, q9 |
+ veor q8, q6, q10 |
+ vst1.8 {q0,q1}, [r8]! |
+ veor q9, q4, q11 |
+ veor q10, q2, q12 |
+ vst1.8 {q8,q9}, [r8]! |
+ veor q11, q7, q13 |
+ vst1.8 {q10,q11}, [r8]! |
+ |
+ vld1.64 {q8}, [r0,:128] @ next round tweak |
+ b .Lxts_dec_done |
.align 4 |
.Lxts_dec_5: |
- vst1.64 {q13}, [r0,:128] @ next round tweak |
+ vst1.64 {q13}, [r0,:128] @ next round tweak |
- veor q3, q3, q11 |
+ veor q3, q3, q11 |
#ifndef BSAES_ASM_EXTENDED_KEY |
- add r4, sp, #0x90 @ pass key schedule |
+ add r4, sp, #0x90 @ pass key schedule |
#else |
- add r4, r10, #248 @ pass key schedule |
+ add r4, r10, #248 @ pass key schedule |
#endif |
- veor q4, q4, q12 |
- mov r5, r1 @ pass rounds |
- mov r0, sp |
- |
- bl _bsaes_decrypt8 |
- |
- vld1.64 {q8-q9}, [r0,:128]! |
- vld1.64 {q10-q11}, [r0,:128]! |
- veor q0, q0, q8 |
- vld1.64 {q12}, [r0,:128]! |
- veor q1, q1, q9 |
- veor q8, q6, q10 |
- vst1.8 {q0-q1}, [r8]! |
- veor q9, q4, q11 |
- veor q10, q2, q12 |
- vst1.8 {q8-q9}, [r8]! |
- vst1.8 {q10}, [r8]! |
- |
- vld1.64 {q8}, [r0,:128] @ next round tweak |
- b .Lxts_dec_done |
+ veor q4, q4, q12 |
+ mov r5, r1 @ pass rounds |
+ mov r0, sp |
+ |
+ bl _bsaes_decrypt8 |
+ |
+ vld1.64 {q8,q9}, [r0,:128]! |
+ vld1.64 {q10,q11}, [r0,:128]! |
+ veor q0, q0, q8 |
+ vld1.64 {q12}, [r0,:128]! |
+ veor q1, q1, q9 |
+ veor q8, q6, q10 |
+ vst1.8 {q0,q1}, [r8]! |
+ veor q9, q4, q11 |
+ veor q10, q2, q12 |
+ vst1.8 {q8,q9}, [r8]! |
+ vst1.8 {q10}, [r8]! |
+ |
+ vld1.64 {q8}, [r0,:128] @ next round tweak |
+ b .Lxts_dec_done |
.align 4 |
.Lxts_dec_4: |
- vst1.64 {q12}, [r0,:128] @ next round tweak |
+ vst1.64 {q12}, [r0,:128] @ next round tweak |
- veor q2, q2, q10 |
+ veor q2, q2, q10 |
#ifndef BSAES_ASM_EXTENDED_KEY |
- add r4, sp, #0x90 @ pass key schedule |
+ add r4, sp, #0x90 @ pass key schedule |
#else |
- add r4, r10, #248 @ pass key schedule |
+ add r4, r10, #248 @ pass key schedule |
#endif |
- veor q3, q3, q11 |
- mov r5, r1 @ pass rounds |
- mov r0, sp |
- |
- bl _bsaes_decrypt8 |
- |
- vld1.64 {q8-q9}, [r0,:128]! |
- vld1.64 {q10-q11}, [r0,:128]! |
- veor q0, q0, q8 |
- veor q1, q1, q9 |
- veor q8, q6, q10 |
- vst1.8 {q0-q1}, [r8]! |
- veor q9, q4, q11 |
- vst1.8 {q8-q9}, [r8]! |
- |
- vld1.64 {q8}, [r0,:128] @ next round tweak |
- b .Lxts_dec_done |
+ veor q3, q3, q11 |
+ mov r5, r1 @ pass rounds |
+ mov r0, sp |
+ |
+ bl _bsaes_decrypt8 |
+ |
+ vld1.64 {q8,q9}, [r0,:128]! |
+ vld1.64 {q10,q11}, [r0,:128]! |
+ veor q0, q0, q8 |
+ veor q1, q1, q9 |
+ veor q8, q6, q10 |
+ vst1.8 {q0,q1}, [r8]! |
+ veor q9, q4, q11 |
+ vst1.8 {q8,q9}, [r8]! |
+ |
+ vld1.64 {q8}, [r0,:128] @ next round tweak |
+ b .Lxts_dec_done |
.align 4 |
.Lxts_dec_3: |
- vst1.64 {q11}, [r0,:128] @ next round tweak |
+ vst1.64 {q11}, [r0,:128] @ next round tweak |
- veor q1, q1, q9 |
+ veor q1, q1, q9 |
#ifndef BSAES_ASM_EXTENDED_KEY |
- add r4, sp, #0x90 @ pass key schedule |
+ add r4, sp, #0x90 @ pass key schedule |
#else |
- add r4, r10, #248 @ pass key schedule |
+ add r4, r10, #248 @ pass key schedule |
#endif |
- veor q2, q2, q10 |
- mov r5, r1 @ pass rounds |
- mov r0, sp |
- |
- bl _bsaes_decrypt8 |
- |
- vld1.64 {q8-q9}, [r0,:128]! |
- vld1.64 {q10}, [r0,:128]! |
- veor q0, q0, q8 |
- veor q1, q1, q9 |
- veor q8, q6, q10 |
- vst1.8 {q0-q1}, [r8]! |
- vst1.8 {q8}, [r8]! |
- |
- vld1.64 {q8}, [r0,:128] @ next round tweak |
- b .Lxts_dec_done |
+ veor q2, q2, q10 |
+ mov r5, r1 @ pass rounds |
+ mov r0, sp |
+ |
+ bl _bsaes_decrypt8 |
+ |
+ vld1.64 {q8,q9}, [r0,:128]! |
+ vld1.64 {q10}, [r0,:128]! |
+ veor q0, q0, q8 |
+ veor q1, q1, q9 |
+ veor q8, q6, q10 |
+ vst1.8 {q0,q1}, [r8]! |
+ vst1.8 {q8}, [r8]! |
+ |
+ vld1.64 {q8}, [r0,:128] @ next round tweak |
+ b .Lxts_dec_done |
.align 4 |
.Lxts_dec_2: |
- vst1.64 {q10}, [r0,:128] @ next round tweak |
+ vst1.64 {q10}, [r0,:128] @ next round tweak |
- veor q0, q0, q8 |
+ veor q0, q0, q8 |
#ifndef BSAES_ASM_EXTENDED_KEY |
- add r4, sp, #0x90 @ pass key schedule |
+ add r4, sp, #0x90 @ pass key schedule |
#else |
- add r4, r10, #248 @ pass key schedule |
+ add r4, r10, #248 @ pass key schedule |
#endif |
- veor q1, q1, q9 |
- mov r5, r1 @ pass rounds |
- mov r0, sp |
+ veor q1, q1, q9 |
+ mov r5, r1 @ pass rounds |
+ mov r0, sp |
- bl _bsaes_decrypt8 |
+ bl _bsaes_decrypt8 |
- vld1.64 {q8-q9}, [r0,:128]! |
- veor q0, q0, q8 |
- veor q1, q1, q9 |
- vst1.8 {q0-q1}, [r8]! |
+ vld1.64 {q8,q9}, [r0,:128]! |
+ veor q0, q0, q8 |
+ veor q1, q1, q9 |
+ vst1.8 {q0,q1}, [r8]! |
- vld1.64 {q8}, [r0,:128] @ next round tweak |
- b .Lxts_dec_done |
+ vld1.64 {q8}, [r0,:128] @ next round tweak |
+ b .Lxts_dec_done |
.align 4 |
.Lxts_dec_1: |
- mov r0, sp |
- veor q0, q8 |
- mov r1, sp |
- vst1.8 {q0}, [sp,:128] |
- mov r2, r10 |
- mov r4, r3 @ preserve fp |
- mov r5, r2 @ preserve magic |
+ mov r0, sp |
+ veor q0, q8 |
+ mov r1, sp |
+ vst1.8 {q0}, [sp,:128] |
+ mov r2, r10 |
+ mov r4, r3 @ preserve fp |
+ mov r5, r2 @ preserve magic |
- bl AES_decrypt |
+ bl AES_decrypt |
- vld1.8 {q0}, [sp,:128] |
- veor q0, q0, q8 |
- vst1.8 {q0}, [r8]! |
- mov r3, r4 |
- mov r2, r5 |
+ vld1.8 {q0}, [sp,:128] |
+ veor q0, q0, q8 |
+ vst1.8 {q0}, [r8]! |
+ mov r3, r4 |
+ mov r2, r5 |
- vmov q8, q9 @ next round tweak |
+ vmov q8, q9 @ next round tweak |
.Lxts_dec_done: |
#ifndef XTS_CHAIN_TWEAK |
- adds r9, #0x10 |
- beq .Lxts_dec_ret |
+ adds r9, #0x10 |
+ beq .Lxts_dec_ret |
@ calculate one round of extra tweak for the stolen ciphertext |
- vldmia r2, {q5} |
+ vldmia r2, {q5} |
vshr.s64 q6, q8, #63 |
- vand q6, q6, q5 |
+ vand q6, q6, q5 |
vadd.u64 q9, q8, q8 |
- vswp d13,d12 |
- veor q9, q9, q6 |
+ vswp d13,d12 |
+ veor q9, q9, q6 |
@ perform the final decryption with the last tweak value |
- vld1.8 {q0}, [r7]! |
- mov r0, sp |
- veor q0, q0, q9 |
- mov r1, sp |
- vst1.8 {q0}, [sp,:128] |
- mov r2, r10 |
- mov r4, r3 @ preserve fp |
+ vld1.8 {q0}, [r7]! |
+ mov r0, sp |
+ veor q0, q0, q9 |
+ mov r1, sp |
+ vst1.8 {q0}, [sp,:128] |
+ mov r2, r10 |
+ mov r4, r3 @ preserve fp |
- bl AES_decrypt |
+ bl AES_decrypt |
- vld1.8 {q0}, [sp,:128] |
- veor q0, q0, q9 |
- vst1.8 {q0}, [r8] |
+ vld1.8 {q0}, [sp,:128] |
+ veor q0, q0, q9 |
+ vst1.8 {q0}, [r8] |
- mov r6, r8 |
+ mov r6, r8 |
.Lxts_dec_steal: |
- ldrb r1, [r8] |
- ldrb r0, [r7], #1 |
- strb r1, [r8, #0x10] |
- strb r0, [r8], #1 |
- |
- subs r9, #1 |
- bhi .Lxts_dec_steal |
- |
- vld1.8 {q0}, [r6] |
- mov r0, sp |
- veor q0, q8 |
- mov r1, sp |
- vst1.8 {q0}, [sp,:128] |
- mov r2, r10 |
- |
- bl AES_decrypt |
- |
- vld1.8 {q0}, [sp,:128] |
- veor q0, q0, q8 |
- vst1.8 {q0}, [r6] |
- mov r3, r4 |
+ ldrb r1, [r8] |
+ ldrb r0, [r7], #1 |
+ strb r1, [r8, #0x10] |
+ strb r0, [r8], #1 |
+ |
+ subs r9, #1 |
+ bhi .Lxts_dec_steal |
+ |
+ vld1.8 {q0}, [r6] |
+ mov r0, sp |
+ veor q0, q8 |
+ mov r1, sp |
+ vst1.8 {q0}, [sp,:128] |
+ mov r2, r10 |
+ |
+ bl AES_decrypt |
+ |
+ vld1.8 {q0}, [sp,:128] |
+ veor q0, q0, q8 |
+ vst1.8 {q0}, [r6] |
+ mov r3, r4 |
#endif |
.Lxts_dec_ret: |
- bic r0, r3, #0xf |
+ bic r0, r3, #0xf |
vmov.i32 q0, #0 |
vmov.i32 q1, #0 |
#ifdef XTS_CHAIN_TWEAK |
- ldr r1, [r3, #0x20+VFP_ABI_FRAME] @ chain tweak |
+ ldr r1, [r3, #0x20+VFP_ABI_FRAME] @ chain tweak |
#endif |
-.Lxts_dec_bzero: @ wipe key schedule [if any] |
- vstmia sp!, {q0-q1} |
- cmp sp, r0 |
- bne .Lxts_dec_bzero |
+.Lxts_dec_bzero:@ wipe key schedule [if any] |
+ vstmia sp!, {q0,q1} |
+ cmp sp, r0 |
+ bne .Lxts_dec_bzero |
- mov sp, r3 |
+ mov sp, r3 |
#ifdef XTS_CHAIN_TWEAK |
- vst1.8 {q8}, [r1] |
+ vst1.8 {q8}, [r1] |
#endif |
VFP_ABI_POP |
- ldmia sp!, {r4-r10, pc} @ return |
+ ldmia sp!, {r4,r5,r6,r7,r8,r9,r10, pc} @ return |
.size bsaes_xts_decrypt,.-bsaes_xts_decrypt |
#endif |