Thumb2 AES ASM: don't assume alignment on key

Fix AES_set_encrypt_key to not assume a word alignment on key.
pull/7301/head
Sean Parkinson 2024-03-06 08:50:21 +10:00
parent ee39a8f17f
commit d057f10d58
2 changed files with 37 additions and 19 deletions

View File

@ -714,15 +714,19 @@ AES_set_encrypt_key:
#else
BEQ.W L_AES_set_encrypt_key_start_192
#endif
LDRD r4, r5, [r0]
LDRD r6, r7, [r0, #8]
LDR r4, [r0]
LDR r5, [r0, #4]
LDR r6, [r0, #8]
LDR r7, [r0, #12]
REV r4, r4
REV r5, r5
REV r6, r6
REV r7, r7
STM r2!, {r4, r5, r6, r7}
LDRD r4, r5, [r0, #16]
LDRD r6, r7, [r0, #24]
LDR r4, [r0, #16]
LDR r5, [r0, #20]
LDR r6, [r0, #24]
LDR r7, [r0, #28]
REV r4, r4
REV r5, r5
REV r6, r6
@ -805,9 +809,12 @@ L_AES_set_encrypt_key_loop_256:
B.N L_AES_set_encrypt_key_end
#endif
L_AES_set_encrypt_key_start_192:
LDRD r4, r5, [r0]
LDRD r6, r7, [r0, #8]
LDRD r8, r9, [r0, #16]
LDR r4, [r0]
LDR r5, [r0, #4]
LDR r6, [r0, #8]
LDR r7, [r0, #12]
LDR r8, [r0, #16]
LDR r9, [r0, #20]
REV r4, r4
REV r5, r5
REV r6, r6
@ -871,8 +878,10 @@ L_AES_set_encrypt_key_loop_192:
B.N L_AES_set_encrypt_key_end
#endif
L_AES_set_encrypt_key_start_128:
LDRD r4, r5, [r0]
LDRD r6, r7, [r0, #8]
LDR r4, [r0]
LDR r5, [r0, #4]
LDR r6, [r0, #8]
LDR r7, [r0, #12]
REV r4, r4
REV r5, r5
REV r6, r6
@ -907,7 +916,7 @@ L_AES_set_encrypt_key_loop_128:
#endif
L_AES_set_encrypt_key_end:
POP {r4, r5, r6, r7, r8, r9, r10, pc}
/* Cycle Count = 331 */
/* Cycle Count = 340 */
.size AES_set_encrypt_key,.-AES_set_encrypt_key
.text
.align 4

View File

@ -357,15 +357,19 @@ void AES_set_encrypt_key(const unsigned char* key, word32 len, unsigned char* ks
#else
"BEQ.W L_AES_set_encrypt_key_start_192\n\t"
#endif
"LDRD r4, r5, [%[key]]\n\t"
"LDRD r6, r7, [%[key], #8]\n\t"
"LDR r4, [%[key]]\n\t"
"LDR r5, [%[key], #4]\n\t"
"LDR r6, [%[key], #8]\n\t"
"LDR r7, [%[key], #12]\n\t"
"REV r4, r4\n\t"
"REV r5, r5\n\t"
"REV r6, r6\n\t"
"REV r7, r7\n\t"
"STM %[ks]!, {r4, r5, r6, r7}\n\t"
"LDRD r4, r5, [%[key], #16]\n\t"
"LDRD r6, r7, [%[key], #24]\n\t"
"LDR r4, [%[key], #16]\n\t"
"LDR r5, [%[key], #20]\n\t"
"LDR r6, [%[key], #24]\n\t"
"LDR r7, [%[key], #28]\n\t"
"REV r4, r4\n\t"
"REV r5, r5\n\t"
"REV r6, r6\n\t"
@ -450,9 +454,12 @@ void AES_set_encrypt_key(const unsigned char* key, word32 len, unsigned char* ks
#endif
"\n"
"L_AES_set_encrypt_key_start_192:\n\t"
"LDRD r4, r5, [%[key]]\n\t"
"LDRD r6, r7, [%[key], #8]\n\t"
"LDRD r8, r9, [%[key], #16]\n\t"
"LDR r4, [%[key]]\n\t"
"LDR r5, [%[key], #4]\n\t"
"LDR r6, [%[key], #8]\n\t"
"LDR r7, [%[key], #12]\n\t"
"LDR r8, [%[key], #16]\n\t"
"LDR r9, [%[key], #20]\n\t"
"REV r4, r4\n\t"
"REV r5, r5\n\t"
"REV r6, r6\n\t"
@ -518,8 +525,10 @@ void AES_set_encrypt_key(const unsigned char* key, word32 len, unsigned char* ks
#endif
"\n"
"L_AES_set_encrypt_key_start_128:\n\t"
"LDRD r4, r5, [%[key]]\n\t"
"LDRD r6, r7, [%[key], #8]\n\t"
"LDR r4, [%[key]]\n\t"
"LDR r5, [%[key], #4]\n\t"
"LDR r6, [%[key], #8]\n\t"
"LDR r7, [%[key], #12]\n\t"
"REV r4, r4\n\t"
"REV r5, r5\n\t"
"REV r6, r6\n\t"