blob: b2966b4abdcc68c8a9f43e6f1e7b5131cf5bfa90 [file] [log] [blame]
Robert Sloanc9abfe42018-11-26 12:19:07 -08001// This file is generated from a similarly-named Perl script in the BoringSSL
2// source tree. Do not edit by hand.
3
Pete Bentley0c61efe2019-08-13 09:32:23 +01004#if !defined(__has_feature)
5#define __has_feature(x) 0
6#endif
Robert Sloan726e9d12018-09-11 11:45:04 -07007#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM)
8#define OPENSSL_NO_ASM
9#endif
Robert Sloan726e9d12018-09-11 11:45:04 -070010
11#if !defined(OPENSSL_NO_ASM)
Kenny Rootb8494592015-09-25 02:29:14 +000012#if defined(__arm__)
Robert Sloan726e9d12018-09-11 11:45:04 -070013#if defined(BORINGSSL_PREFIX)
14#include <boringssl_prefix_symbols_asm.h>
15#endif
Robert Sloan8ff03552017-06-14 12:40:58 -070016@ Copyright 2007-2016 The OpenSSL Project Authors. All Rights Reserved.
17@
18@ Licensed under the OpenSSL license (the "License"). You may not use
19@ this file except in compliance with the License. You can obtain a copy
20@ in the file LICENSE in the source distribution or at
21@ https://www.openssl.org/source/license.html
22
Adam Langleyd9e397b2015-01-22 14:27:53 -080023
24@ ====================================================================
25@ Written by Andy Polyakov <appro@openssl.org> for the OpenSSL
26@ project. The module is, however, dual licensed under OpenSSL and
27@ CRYPTOGAMS licenses depending on where you obtain it. For further
28@ details see http://www.openssl.org/~appro/cryptogams/.
29@ ====================================================================
30
31@ AES for ARMv4
32
33@ January 2007.
34@
35@ Code uses single 1K S-box and is >2 times faster than code generated
36@ by gcc-3.4.1. This is thanks to unique feature of ARMv4 ISA, which
37@ allows to merge logical or arithmetic operation with shift or rotate
38@ in one instruction and emit combined result every cycle. The module
39@ is endian-neutral. The performance is ~42 cycles/byte for 128-bit
40@ key [on single-issue Xscale PXA250 core].
41
42@ May 2007.
43@
44@ AES_set_[en|de]crypt_key is added.
45
46@ July 2010.
47@
48@ Rescheduling for dual-issue pipeline resulted in 12% improvement on
49@ Cortex A8 core and ~25 cycles per byte processed with 128-bit key.
50
51@ February 2011.
52@
53@ Profiler-assisted and platform-specific optimization resulted in 16%
54@ improvement on Cortex A8 core and ~21.5 cycles per byte.
55
Adam Langleyd9e397b2015-01-22 14:27:53 -080056#ifndef __KERNEL__
Kenny Rootb8494592015-09-25 02:29:14 +000057# include <openssl/arm_arch.h>
Adam Langleyd9e397b2015-01-22 14:27:53 -080058#else
59# define __ARM_ARCH__ __LINUX_ARM_ARCH__
60#endif
61
Robert Sloan55818102017-12-18 11:26:17 -080062@ Silence ARMv8 deprecated IT instruction warnings. This file is used by both
63@ ARMv7 and ARMv8 processors and does not use ARMv8 instructions. (ARMv8 AES
64@ instructions are in aesv8-armx.pl.)
65.arch armv7-a
66
Adam Langleyd9e397b2015-01-22 14:27:53 -080067.text
Robert Sloan8ff03552017-06-14 12:40:58 -070068#if defined(__thumb2__) && !defined(__APPLE__)
Adam Langleyd9e397b2015-01-22 14:27:53 -080069.syntax unified
Adam Langleyd9e397b2015-01-22 14:27:53 -080070.thumb
Robert Sloan8ff03552017-06-14 12:40:58 -070071#else
Adam Langleyd9e397b2015-01-22 14:27:53 -080072.code 32
Robert Sloan8ff03552017-06-14 12:40:58 -070073#undef __thumb2__
Adam Langleyd9e397b2015-01-22 14:27:53 -080074#endif
75
76.type AES_Te,%object
77.align 5
78AES_Te:
79.word 0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d
80.word 0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554
81.word 0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d
82.word 0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a
83.word 0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87
84.word 0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b
85.word 0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea
86.word 0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b
87.word 0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a
88.word 0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f
89.word 0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108
90.word 0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f
91.word 0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e
92.word 0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5
93.word 0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d
94.word 0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f
95.word 0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e
96.word 0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb
97.word 0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce
98.word 0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497
99.word 0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c
100.word 0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed
101.word 0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b
102.word 0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a
103.word 0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16
104.word 0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594
105.word 0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81
106.word 0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3
107.word 0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a
108.word 0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504
109.word 0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163
110.word 0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d
111.word 0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f
112.word 0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739
113.word 0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47
114.word 0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395
115.word 0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f
116.word 0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883
117.word 0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c
118.word 0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76
119.word 0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e
120.word 0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4
121.word 0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6
122.word 0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b
123.word 0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7
124.word 0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0
125.word 0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25
126.word 0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818
127.word 0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72
128.word 0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651
129.word 0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21
130.word 0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85
131.word 0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa
132.word 0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12
133.word 0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0
134.word 0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9
135.word 0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133
136.word 0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7
137.word 0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920
138.word 0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a
139.word 0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17
140.word 0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8
141.word 0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11
142.word 0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a
143@ Te4[256]
144.byte 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5
145.byte 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76
146.byte 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0
147.byte 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0
148.byte 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc
149.byte 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15
150.byte 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a
151.byte 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75
152.byte 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0
153.byte 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84
154.byte 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b
155.byte 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf
156.byte 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85
157.byte 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8
158.byte 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5
159.byte 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2
160.byte 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17
161.byte 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73
162.byte 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88
163.byte 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb
164.byte 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c
165.byte 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79
166.byte 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9
167.byte 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08
168.byte 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6
169.byte 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a
170.byte 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e
171.byte 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e
172.byte 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94
173.byte 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf
174.byte 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68
175.byte 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16
176@ rcon[]
177.word 0x01000000, 0x02000000, 0x04000000, 0x08000000
178.word 0x10000000, 0x20000000, 0x40000000, 0x80000000
179.word 0x1B000000, 0x36000000, 0, 0, 0, 0, 0, 0
180.size AES_Te,.-AES_Te
181
Adam Vartanianbfcf3a72018-08-10 14:55:24 +0100182@ void aes_nohw_encrypt(const unsigned char *in, unsigned char *out,
183@ const AES_KEY *key) {
184.globl aes_nohw_encrypt
185.hidden aes_nohw_encrypt
186.type aes_nohw_encrypt,%function
Adam Langleyd9e397b2015-01-22 14:27:53 -0800187.align 5
Adam Vartanianbfcf3a72018-08-10 14:55:24 +0100188aes_nohw_encrypt:
Robert Sloan8ff03552017-06-14 12:40:58 -0700189#ifndef __thumb2__
Adam Vartanianbfcf3a72018-08-10 14:55:24 +0100190 sub r3,pc,#8 @ aes_nohw_encrypt
Adam Langleyd9e397b2015-01-22 14:27:53 -0800191#else
Robert Sloand5c22152017-11-13 09:22:12 -0800192 adr r3,.
Adam Langleyd9e397b2015-01-22 14:27:53 -0800193#endif
Adam Langleye9ada862015-05-11 17:20:37 -0700194 stmdb sp!,{r1,r4-r12,lr}
Robert Sloanab8b8882018-03-26 11:39:51 -0700195#if defined(__thumb2__) || defined(__APPLE__)
Adam Langleye9ada862015-05-11 17:20:37 -0700196 adr r10,AES_Te
197#else
Adam Vartanianbfcf3a72018-08-10 14:55:24 +0100198 sub r10,r3,#aes_nohw_encrypt-AES_Te @ Te
Adam Langleye9ada862015-05-11 17:20:37 -0700199#endif
Adam Langleyd9e397b2015-01-22 14:27:53 -0800200 mov r12,r0 @ inp
201 mov r11,r2
Adam Langleyd9e397b2015-01-22 14:27:53 -0800202#if __ARM_ARCH__<7
203 ldrb r0,[r12,#3] @ load input data in endian-neutral
204 ldrb r4,[r12,#2] @ manner...
205 ldrb r5,[r12,#1]
206 ldrb r6,[r12,#0]
207 orr r0,r0,r4,lsl#8
208 ldrb r1,[r12,#7]
209 orr r0,r0,r5,lsl#16
210 ldrb r4,[r12,#6]
211 orr r0,r0,r6,lsl#24
212 ldrb r5,[r12,#5]
213 ldrb r6,[r12,#4]
214 orr r1,r1,r4,lsl#8
215 ldrb r2,[r12,#11]
216 orr r1,r1,r5,lsl#16
217 ldrb r4,[r12,#10]
218 orr r1,r1,r6,lsl#24
219 ldrb r5,[r12,#9]
220 ldrb r6,[r12,#8]
221 orr r2,r2,r4,lsl#8
222 ldrb r3,[r12,#15]
223 orr r2,r2,r5,lsl#16
224 ldrb r4,[r12,#14]
225 orr r2,r2,r6,lsl#24
226 ldrb r5,[r12,#13]
227 ldrb r6,[r12,#12]
228 orr r3,r3,r4,lsl#8
229 orr r3,r3,r5,lsl#16
230 orr r3,r3,r6,lsl#24
231#else
232 ldr r0,[r12,#0]
233 ldr r1,[r12,#4]
234 ldr r2,[r12,#8]
235 ldr r3,[r12,#12]
236#ifdef __ARMEL__
237 rev r0,r0
238 rev r1,r1
239 rev r2,r2
240 rev r3,r3
241#endif
242#endif
243 bl _armv4_AES_encrypt
244
245 ldr r12,[sp],#4 @ pop out
246#if __ARM_ARCH__>=7
247#ifdef __ARMEL__
248 rev r0,r0
249 rev r1,r1
250 rev r2,r2
251 rev r3,r3
252#endif
253 str r0,[r12,#0]
254 str r1,[r12,#4]
255 str r2,[r12,#8]
256 str r3,[r12,#12]
257#else
258 mov r4,r0,lsr#24 @ write output in endian-neutral
259 mov r5,r0,lsr#16 @ manner...
260 mov r6,r0,lsr#8
261 strb r4,[r12,#0]
262 strb r5,[r12,#1]
263 mov r4,r1,lsr#24
264 strb r6,[r12,#2]
265 mov r5,r1,lsr#16
266 strb r0,[r12,#3]
267 mov r6,r1,lsr#8
268 strb r4,[r12,#4]
269 strb r5,[r12,#5]
270 mov r4,r2,lsr#24
271 strb r6,[r12,#6]
272 mov r5,r2,lsr#16
273 strb r1,[r12,#7]
274 mov r6,r2,lsr#8
275 strb r4,[r12,#8]
276 strb r5,[r12,#9]
277 mov r4,r3,lsr#24
278 strb r6,[r12,#10]
279 mov r5,r3,lsr#16
280 strb r2,[r12,#11]
281 mov r6,r3,lsr#8
282 strb r4,[r12,#12]
283 strb r5,[r12,#13]
284 strb r6,[r12,#14]
285 strb r3,[r12,#15]
286#endif
287#if __ARM_ARCH__>=5
Adam Langleye9ada862015-05-11 17:20:37 -0700288 ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,pc}
Adam Langleyd9e397b2015-01-22 14:27:53 -0800289#else
Adam Langleye9ada862015-05-11 17:20:37 -0700290 ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr}
Adam Langleyd9e397b2015-01-22 14:27:53 -0800291 tst lr,#1
292 moveq pc,lr @ be binary compatible with V4, yet
Adam Langleye9ada862015-05-11 17:20:37 -0700293.word 0xe12fff1e @ interoperable with Thumb ISA:-)
Adam Langleyd9e397b2015-01-22 14:27:53 -0800294#endif
Adam Vartanianbfcf3a72018-08-10 14:55:24 +0100295.size aes_nohw_encrypt,.-aes_nohw_encrypt
Adam Langleyd9e397b2015-01-22 14:27:53 -0800296
Adam Langleye9ada862015-05-11 17:20:37 -0700297.type _armv4_AES_encrypt,%function
Adam Langleyd9e397b2015-01-22 14:27:53 -0800298.align 2
299_armv4_AES_encrypt:
300 str lr,[sp,#-4]! @ push lr
Adam Langleye9ada862015-05-11 17:20:37 -0700301 ldmia r11!,{r4,r5,r6,r7}
Adam Langleyd9e397b2015-01-22 14:27:53 -0800302 eor r0,r0,r4
303 ldr r12,[r11,#240-16]
304 eor r1,r1,r5
305 eor r2,r2,r6
306 eor r3,r3,r7
307 sub r12,r12,#1
308 mov lr,#255
309
310 and r7,lr,r0
311 and r8,lr,r0,lsr#8
312 and r9,lr,r0,lsr#16
313 mov r0,r0,lsr#24
314.Lenc_loop:
315 ldr r4,[r10,r7,lsl#2] @ Te3[s0>>0]
316 and r7,lr,r1,lsr#16 @ i0
317 ldr r5,[r10,r8,lsl#2] @ Te2[s0>>8]
318 and r8,lr,r1
319 ldr r6,[r10,r9,lsl#2] @ Te1[s0>>16]
320 and r9,lr,r1,lsr#8
321 ldr r0,[r10,r0,lsl#2] @ Te0[s0>>24]
322 mov r1,r1,lsr#24
323
324 ldr r7,[r10,r7,lsl#2] @ Te1[s1>>16]
325 ldr r8,[r10,r8,lsl#2] @ Te3[s1>>0]
326 ldr r9,[r10,r9,lsl#2] @ Te2[s1>>8]
327 eor r0,r0,r7,ror#8
328 ldr r1,[r10,r1,lsl#2] @ Te0[s1>>24]
329 and r7,lr,r2,lsr#8 @ i0
330 eor r5,r5,r8,ror#8
331 and r8,lr,r2,lsr#16 @ i1
332 eor r6,r6,r9,ror#8
333 and r9,lr,r2
334 ldr r7,[r10,r7,lsl#2] @ Te2[s2>>8]
335 eor r1,r1,r4,ror#24
336 ldr r8,[r10,r8,lsl#2] @ Te1[s2>>16]
337 mov r2,r2,lsr#24
338
339 ldr r9,[r10,r9,lsl#2] @ Te3[s2>>0]
340 eor r0,r0,r7,ror#16
341 ldr r2,[r10,r2,lsl#2] @ Te0[s2>>24]
342 and r7,lr,r3 @ i0
343 eor r1,r1,r8,ror#8
344 and r8,lr,r3,lsr#8 @ i1
345 eor r6,r6,r9,ror#16
346 and r9,lr,r3,lsr#16 @ i2
347 ldr r7,[r10,r7,lsl#2] @ Te3[s3>>0]
348 eor r2,r2,r5,ror#16
349 ldr r8,[r10,r8,lsl#2] @ Te2[s3>>8]
350 mov r3,r3,lsr#24
351
352 ldr r9,[r10,r9,lsl#2] @ Te1[s3>>16]
353 eor r0,r0,r7,ror#24
354 ldr r7,[r11],#16
355 eor r1,r1,r8,ror#16
356 ldr r3,[r10,r3,lsl#2] @ Te0[s3>>24]
357 eor r2,r2,r9,ror#8
358 ldr r4,[r11,#-12]
359 eor r3,r3,r6,ror#8
360
361 ldr r5,[r11,#-8]
362 eor r0,r0,r7
363 ldr r6,[r11,#-4]
364 and r7,lr,r0
365 eor r1,r1,r4
366 and r8,lr,r0,lsr#8
367 eor r2,r2,r5
368 and r9,lr,r0,lsr#16
369 eor r3,r3,r6
370 mov r0,r0,lsr#24
371
372 subs r12,r12,#1
373 bne .Lenc_loop
374
375 add r10,r10,#2
376
377 ldrb r4,[r10,r7,lsl#2] @ Te4[s0>>0]
378 and r7,lr,r1,lsr#16 @ i0
379 ldrb r5,[r10,r8,lsl#2] @ Te4[s0>>8]
380 and r8,lr,r1
381 ldrb r6,[r10,r9,lsl#2] @ Te4[s0>>16]
382 and r9,lr,r1,lsr#8
383 ldrb r0,[r10,r0,lsl#2] @ Te4[s0>>24]
384 mov r1,r1,lsr#24
385
386 ldrb r7,[r10,r7,lsl#2] @ Te4[s1>>16]
387 ldrb r8,[r10,r8,lsl#2] @ Te4[s1>>0]
388 ldrb r9,[r10,r9,lsl#2] @ Te4[s1>>8]
389 eor r0,r7,r0,lsl#8
390 ldrb r1,[r10,r1,lsl#2] @ Te4[s1>>24]
391 and r7,lr,r2,lsr#8 @ i0
392 eor r5,r8,r5,lsl#8
393 and r8,lr,r2,lsr#16 @ i1
394 eor r6,r9,r6,lsl#8
395 and r9,lr,r2
396 ldrb r7,[r10,r7,lsl#2] @ Te4[s2>>8]
397 eor r1,r4,r1,lsl#24
398 ldrb r8,[r10,r8,lsl#2] @ Te4[s2>>16]
399 mov r2,r2,lsr#24
400
401 ldrb r9,[r10,r9,lsl#2] @ Te4[s2>>0]
402 eor r0,r7,r0,lsl#8
403 ldrb r2,[r10,r2,lsl#2] @ Te4[s2>>24]
404 and r7,lr,r3 @ i0
405 eor r1,r1,r8,lsl#16
406 and r8,lr,r3,lsr#8 @ i1
407 eor r6,r9,r6,lsl#8
408 and r9,lr,r3,lsr#16 @ i2
409 ldrb r7,[r10,r7,lsl#2] @ Te4[s3>>0]
410 eor r2,r5,r2,lsl#24
411 ldrb r8,[r10,r8,lsl#2] @ Te4[s3>>8]
412 mov r3,r3,lsr#24
413
414 ldrb r9,[r10,r9,lsl#2] @ Te4[s3>>16]
415 eor r0,r7,r0,lsl#8
416 ldr r7,[r11,#0]
417 ldrb r3,[r10,r3,lsl#2] @ Te4[s3>>24]
418 eor r1,r1,r8,lsl#8
419 ldr r4,[r11,#4]
420 eor r2,r2,r9,lsl#16
421 ldr r5,[r11,#8]
422 eor r3,r6,r3,lsl#24
423 ldr r6,[r11,#12]
424
425 eor r0,r0,r7
426 eor r1,r1,r4
427 eor r2,r2,r5
428 eor r3,r3,r6
429
430 sub r10,r10,#2
431 ldr pc,[sp],#4 @ pop and return
432.size _armv4_AES_encrypt,.-_armv4_AES_encrypt
433
Adam Vartanianbfcf3a72018-08-10 14:55:24 +0100434.globl aes_nohw_set_encrypt_key
435.hidden aes_nohw_set_encrypt_key
436.type aes_nohw_set_encrypt_key,%function
Adam Langleyd9e397b2015-01-22 14:27:53 -0800437.align 5
Adam Vartanianbfcf3a72018-08-10 14:55:24 +0100438aes_nohw_set_encrypt_key:
Adam Langleyd9e397b2015-01-22 14:27:53 -0800439_armv4_AES_set_encrypt_key:
Robert Sloan8ff03552017-06-14 12:40:58 -0700440#ifndef __thumb2__
Adam Vartanianbfcf3a72018-08-10 14:55:24 +0100441 sub r3,pc,#8 @ aes_nohw_set_encrypt_key
Adam Langleyd9e397b2015-01-22 14:27:53 -0800442#else
Robert Sloand5c22152017-11-13 09:22:12 -0800443 adr r3,.
Adam Langleyd9e397b2015-01-22 14:27:53 -0800444#endif
445 teq r0,#0
Robert Sloan8ff03552017-06-14 12:40:58 -0700446#ifdef __thumb2__
Adam Langleyd9e397b2015-01-22 14:27:53 -0800447 itt eq @ Thumb2 thing, sanity check in ARM
448#endif
449 moveq r0,#-1
450 beq .Labrt
451 teq r2,#0
Robert Sloan8ff03552017-06-14 12:40:58 -0700452#ifdef __thumb2__
Adam Langleyd9e397b2015-01-22 14:27:53 -0800453 itt eq @ Thumb2 thing, sanity check in ARM
454#endif
455 moveq r0,#-1
456 beq .Labrt
457
458 teq r1,#128
459 beq .Lok
460 teq r1,#192
461 beq .Lok
462 teq r1,#256
Robert Sloan8ff03552017-06-14 12:40:58 -0700463#ifdef __thumb2__
Adam Langleyd9e397b2015-01-22 14:27:53 -0800464 itt ne @ Thumb2 thing, sanity check in ARM
465#endif
466 movne r0,#-1
467 bne .Labrt
468
Adam Langleye9ada862015-05-11 17:20:37 -0700469.Lok: stmdb sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr}
Adam Langleyd9e397b2015-01-22 14:27:53 -0800470 mov r12,r0 @ inp
471 mov lr,r1 @ bits
472 mov r11,r2 @ key
473
Robert Sloanab8b8882018-03-26 11:39:51 -0700474#if defined(__thumb2__) || defined(__APPLE__)
Adam Langleye9ada862015-05-11 17:20:37 -0700475 adr r10,AES_Te+1024 @ Te4
476#else
477 sub r10,r3,#_armv4_AES_set_encrypt_key-AES_Te-1024 @ Te4
478#endif
479
Adam Langleyd9e397b2015-01-22 14:27:53 -0800480#if __ARM_ARCH__<7
481 ldrb r0,[r12,#3] @ load input data in endian-neutral
482 ldrb r4,[r12,#2] @ manner...
483 ldrb r5,[r12,#1]
484 ldrb r6,[r12,#0]
485 orr r0,r0,r4,lsl#8
486 ldrb r1,[r12,#7]
487 orr r0,r0,r5,lsl#16
488 ldrb r4,[r12,#6]
489 orr r0,r0,r6,lsl#24
490 ldrb r5,[r12,#5]
491 ldrb r6,[r12,#4]
492 orr r1,r1,r4,lsl#8
493 ldrb r2,[r12,#11]
494 orr r1,r1,r5,lsl#16
495 ldrb r4,[r12,#10]
496 orr r1,r1,r6,lsl#24
497 ldrb r5,[r12,#9]
498 ldrb r6,[r12,#8]
499 orr r2,r2,r4,lsl#8
500 ldrb r3,[r12,#15]
501 orr r2,r2,r5,lsl#16
502 ldrb r4,[r12,#14]
503 orr r2,r2,r6,lsl#24
504 ldrb r5,[r12,#13]
505 ldrb r6,[r12,#12]
506 orr r3,r3,r4,lsl#8
507 str r0,[r11],#16
508 orr r3,r3,r5,lsl#16
509 str r1,[r11,#-12]
510 orr r3,r3,r6,lsl#24
511 str r2,[r11,#-8]
512 str r3,[r11,#-4]
513#else
514 ldr r0,[r12,#0]
515 ldr r1,[r12,#4]
516 ldr r2,[r12,#8]
517 ldr r3,[r12,#12]
518#ifdef __ARMEL__
519 rev r0,r0
520 rev r1,r1
521 rev r2,r2
522 rev r3,r3
523#endif
524 str r0,[r11],#16
525 str r1,[r11,#-12]
526 str r2,[r11,#-8]
527 str r3,[r11,#-4]
528#endif
529
530 teq lr,#128
531 bne .Lnot128
532 mov r12,#10
533 str r12,[r11,#240-16]
534 add r6,r10,#256 @ rcon
535 mov lr,#255
536
537.L128_loop:
538 and r5,lr,r3,lsr#24
539 and r7,lr,r3,lsr#16
540 ldrb r5,[r10,r5]
541 and r8,lr,r3,lsr#8
542 ldrb r7,[r10,r7]
543 and r9,lr,r3
544 ldrb r8,[r10,r8]
545 orr r5,r5,r7,lsl#24
546 ldrb r9,[r10,r9]
547 orr r5,r5,r8,lsl#16
548 ldr r4,[r6],#4 @ rcon[i++]
549 orr r5,r5,r9,lsl#8
550 eor r5,r5,r4
551 eor r0,r0,r5 @ rk[4]=rk[0]^...
552 eor r1,r1,r0 @ rk[5]=rk[1]^rk[4]
553 str r0,[r11],#16
554 eor r2,r2,r1 @ rk[6]=rk[2]^rk[5]
555 str r1,[r11,#-12]
556 eor r3,r3,r2 @ rk[7]=rk[3]^rk[6]
557 str r2,[r11,#-8]
558 subs r12,r12,#1
559 str r3,[r11,#-4]
560 bne .L128_loop
561 sub r2,r11,#176
562 b .Ldone
563
564.Lnot128:
565#if __ARM_ARCH__<7
566 ldrb r8,[r12,#19]
567 ldrb r4,[r12,#18]
568 ldrb r5,[r12,#17]
569 ldrb r6,[r12,#16]
570 orr r8,r8,r4,lsl#8
571 ldrb r9,[r12,#23]
572 orr r8,r8,r5,lsl#16
573 ldrb r4,[r12,#22]
574 orr r8,r8,r6,lsl#24
575 ldrb r5,[r12,#21]
576 ldrb r6,[r12,#20]
577 orr r9,r9,r4,lsl#8
578 orr r9,r9,r5,lsl#16
579 str r8,[r11],#8
580 orr r9,r9,r6,lsl#24
581 str r9,[r11,#-4]
582#else
583 ldr r8,[r12,#16]
584 ldr r9,[r12,#20]
585#ifdef __ARMEL__
586 rev r8,r8
587 rev r9,r9
588#endif
589 str r8,[r11],#8
590 str r9,[r11,#-4]
591#endif
592
593 teq lr,#192
594 bne .Lnot192
595 mov r12,#12
596 str r12,[r11,#240-24]
597 add r6,r10,#256 @ rcon
598 mov lr,#255
599 mov r12,#8
600
601.L192_loop:
602 and r5,lr,r9,lsr#24
603 and r7,lr,r9,lsr#16
604 ldrb r5,[r10,r5]
605 and r8,lr,r9,lsr#8
606 ldrb r7,[r10,r7]
607 and r9,lr,r9
608 ldrb r8,[r10,r8]
609 orr r5,r5,r7,lsl#24
610 ldrb r9,[r10,r9]
611 orr r5,r5,r8,lsl#16
612 ldr r4,[r6],#4 @ rcon[i++]
613 orr r5,r5,r9,lsl#8
614 eor r9,r5,r4
615 eor r0,r0,r9 @ rk[6]=rk[0]^...
616 eor r1,r1,r0 @ rk[7]=rk[1]^rk[6]
617 str r0,[r11],#24
618 eor r2,r2,r1 @ rk[8]=rk[2]^rk[7]
619 str r1,[r11,#-20]
620 eor r3,r3,r2 @ rk[9]=rk[3]^rk[8]
621 str r2,[r11,#-16]
622 subs r12,r12,#1
623 str r3,[r11,#-12]
Robert Sloan8ff03552017-06-14 12:40:58 -0700624#ifdef __thumb2__
Adam Langleyd9e397b2015-01-22 14:27:53 -0800625 itt eq @ Thumb2 thing, sanity check in ARM
626#endif
627 subeq r2,r11,#216
628 beq .Ldone
629
630 ldr r7,[r11,#-32]
631 ldr r8,[r11,#-28]
632 eor r7,r7,r3 @ rk[10]=rk[4]^rk[9]
633 eor r9,r8,r7 @ rk[11]=rk[5]^rk[10]
634 str r7,[r11,#-8]
635 str r9,[r11,#-4]
636 b .L192_loop
637
638.Lnot192:
639#if __ARM_ARCH__<7
640 ldrb r8,[r12,#27]
641 ldrb r4,[r12,#26]
642 ldrb r5,[r12,#25]
643 ldrb r6,[r12,#24]
644 orr r8,r8,r4,lsl#8
645 ldrb r9,[r12,#31]
646 orr r8,r8,r5,lsl#16
647 ldrb r4,[r12,#30]
648 orr r8,r8,r6,lsl#24
649 ldrb r5,[r12,#29]
650 ldrb r6,[r12,#28]
651 orr r9,r9,r4,lsl#8
652 orr r9,r9,r5,lsl#16
653 str r8,[r11],#8
654 orr r9,r9,r6,lsl#24
655 str r9,[r11,#-4]
656#else
657 ldr r8,[r12,#24]
658 ldr r9,[r12,#28]
659#ifdef __ARMEL__
660 rev r8,r8
661 rev r9,r9
662#endif
663 str r8,[r11],#8
664 str r9,[r11,#-4]
665#endif
666
667 mov r12,#14
668 str r12,[r11,#240-32]
669 add r6,r10,#256 @ rcon
670 mov lr,#255
671 mov r12,#7
672
673.L256_loop:
674 and r5,lr,r9,lsr#24
675 and r7,lr,r9,lsr#16
676 ldrb r5,[r10,r5]
677 and r8,lr,r9,lsr#8
678 ldrb r7,[r10,r7]
679 and r9,lr,r9
680 ldrb r8,[r10,r8]
681 orr r5,r5,r7,lsl#24
682 ldrb r9,[r10,r9]
683 orr r5,r5,r8,lsl#16
684 ldr r4,[r6],#4 @ rcon[i++]
685 orr r5,r5,r9,lsl#8
686 eor r9,r5,r4
687 eor r0,r0,r9 @ rk[8]=rk[0]^...
688 eor r1,r1,r0 @ rk[9]=rk[1]^rk[8]
689 str r0,[r11],#32
690 eor r2,r2,r1 @ rk[10]=rk[2]^rk[9]
691 str r1,[r11,#-28]
692 eor r3,r3,r2 @ rk[11]=rk[3]^rk[10]
693 str r2,[r11,#-24]
694 subs r12,r12,#1
695 str r3,[r11,#-20]
Robert Sloan8ff03552017-06-14 12:40:58 -0700696#ifdef __thumb2__
Adam Langleyd9e397b2015-01-22 14:27:53 -0800697 itt eq @ Thumb2 thing, sanity check in ARM
698#endif
699 subeq r2,r11,#256
700 beq .Ldone
701
702 and r5,lr,r3
703 and r7,lr,r3,lsr#8
704 ldrb r5,[r10,r5]
705 and r8,lr,r3,lsr#16
706 ldrb r7,[r10,r7]
707 and r9,lr,r3,lsr#24
708 ldrb r8,[r10,r8]
709 orr r5,r5,r7,lsl#8
710 ldrb r9,[r10,r9]
711 orr r5,r5,r8,lsl#16
712 ldr r4,[r11,#-48]
713 orr r5,r5,r9,lsl#24
714
715 ldr r7,[r11,#-44]
716 ldr r8,[r11,#-40]
717 eor r4,r4,r5 @ rk[12]=rk[4]^...
718 ldr r9,[r11,#-36]
719 eor r7,r7,r4 @ rk[13]=rk[5]^rk[12]
720 str r4,[r11,#-16]
721 eor r8,r8,r7 @ rk[14]=rk[6]^rk[13]
722 str r7,[r11,#-12]
723 eor r9,r9,r8 @ rk[15]=rk[7]^rk[14]
724 str r8,[r11,#-8]
725 str r9,[r11,#-4]
726 b .L256_loop
727
728.align 2
729.Ldone: mov r0,#0
Adam Langleye9ada862015-05-11 17:20:37 -0700730 ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr}
Adam Langleyd9e397b2015-01-22 14:27:53 -0800731.Labrt:
Adam Langleye9ada862015-05-11 17:20:37 -0700732#if __ARM_ARCH__>=5
733 bx lr @ .word 0xe12fff1e
Adam Langleyd9e397b2015-01-22 14:27:53 -0800734#else
735 tst lr,#1
736 moveq pc,lr @ be binary compatible with V4, yet
Adam Langleye9ada862015-05-11 17:20:37 -0700737.word 0xe12fff1e @ interoperable with Thumb ISA:-)
Adam Langleyd9e397b2015-01-22 14:27:53 -0800738#endif
Adam Vartanianbfcf3a72018-08-10 14:55:24 +0100739.size aes_nohw_set_encrypt_key,.-aes_nohw_set_encrypt_key
Adam Langleyd9e397b2015-01-22 14:27:53 -0800740
Adam Vartanianbfcf3a72018-08-10 14:55:24 +0100741.globl aes_nohw_set_decrypt_key
742.hidden aes_nohw_set_decrypt_key
743.type aes_nohw_set_decrypt_key,%function
Adam Langleyd9e397b2015-01-22 14:27:53 -0800744.align 5
Adam Vartanianbfcf3a72018-08-10 14:55:24 +0100745aes_nohw_set_decrypt_key:
Adam Langleyd9e397b2015-01-22 14:27:53 -0800746 str lr,[sp,#-4]! @ push lr
747 bl _armv4_AES_set_encrypt_key
748 teq r0,#0
749 ldr lr,[sp],#4 @ pop lr
750 bne .Labrt
751
Adam Vartanianbfcf3a72018-08-10 14:55:24 +0100752 mov r0,r2 @ aes_nohw_set_encrypt_key preserves r2,
Adam Langleyd9e397b2015-01-22 14:27:53 -0800753 mov r1,r2 @ which is AES_KEY *key
754 b _armv4_AES_set_enc2dec_key
Adam Vartanianbfcf3a72018-08-10 14:55:24 +0100755.size aes_nohw_set_decrypt_key,.-aes_nohw_set_decrypt_key
Adam Langleyd9e397b2015-01-22 14:27:53 -0800756
757@ void AES_set_enc2dec_key(const AES_KEY *inp,AES_KEY *out)
Adam Langleye9ada862015-05-11 17:20:37 -0700758.globl AES_set_enc2dec_key
Adam Langleyd9e397b2015-01-22 14:27:53 -0800759.hidden AES_set_enc2dec_key
760.type AES_set_enc2dec_key,%function
761.align 5
762AES_set_enc2dec_key:
763_armv4_AES_set_enc2dec_key:
Adam Langleye9ada862015-05-11 17:20:37 -0700764 stmdb sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr}
Adam Langleyd9e397b2015-01-22 14:27:53 -0800765
766 ldr r12,[r0,#240]
767 mov r7,r0 @ input
768 add r8,r0,r12,lsl#4
Robert Sloan8ff03552017-06-14 12:40:58 -0700769 mov r11,r1 @ output
Adam Langleyd9e397b2015-01-22 14:27:53 -0800770 add r10,r1,r12,lsl#4
771 str r12,[r1,#240]
772
773.Linv: ldr r0,[r7],#16
774 ldr r1,[r7,#-12]
775 ldr r2,[r7,#-8]
776 ldr r3,[r7,#-4]
777 ldr r4,[r8],#-16
778 ldr r5,[r8,#16+4]
779 ldr r6,[r8,#16+8]
780 ldr r9,[r8,#16+12]
781 str r0,[r10],#-16
782 str r1,[r10,#16+4]
783 str r2,[r10,#16+8]
784 str r3,[r10,#16+12]
785 str r4,[r11],#16
786 str r5,[r11,#-12]
787 str r6,[r11,#-8]
788 str r9,[r11,#-4]
789 teq r7,r8
790 bne .Linv
791
792 ldr r0,[r7]
793 ldr r1,[r7,#4]
794 ldr r2,[r7,#8]
795 ldr r3,[r7,#12]
796 str r0,[r11]
797 str r1,[r11,#4]
798 str r2,[r11,#8]
799 str r3,[r11,#12]
800 sub r11,r11,r12,lsl#3
801 ldr r0,[r11,#16]! @ prefetch tp1
802 mov r7,#0x80
803 mov r8,#0x1b
804 orr r7,r7,#0x8000
805 orr r8,r8,#0x1b00
806 orr r7,r7,r7,lsl#16
807 orr r8,r8,r8,lsl#16
808 sub r12,r12,#1
809 mvn r9,r7
810 mov r12,r12,lsl#2 @ (rounds-1)*4
811
812.Lmix: and r4,r0,r7
813 and r1,r0,r9
814 sub r4,r4,r4,lsr#7
815 and r4,r4,r8
816 eor r1,r4,r1,lsl#1 @ tp2
817
818 and r4,r1,r7
819 and r2,r1,r9
820 sub r4,r4,r4,lsr#7
821 and r4,r4,r8
822 eor r2,r4,r2,lsl#1 @ tp4
823
824 and r4,r2,r7
825 and r3,r2,r9
826 sub r4,r4,r4,lsr#7
827 and r4,r4,r8
828 eor r3,r4,r3,lsl#1 @ tp8
829
830 eor r4,r1,r2
831 eor r5,r0,r3 @ tp9
832 eor r4,r4,r3 @ tpe
833 eor r4,r4,r1,ror#24
834 eor r4,r4,r5,ror#24 @ ^= ROTATE(tpb=tp9^tp2,8)
835 eor r4,r4,r2,ror#16
836 eor r4,r4,r5,ror#16 @ ^= ROTATE(tpd=tp9^tp4,16)
837 eor r4,r4,r5,ror#8 @ ^= ROTATE(tp9,24)
838
839 ldr r0,[r11,#4] @ prefetch tp1
840 str r4,[r11],#4
841 subs r12,r12,#1
842 bne .Lmix
843
844 mov r0,#0
845#if __ARM_ARCH__>=5
Adam Langleye9ada862015-05-11 17:20:37 -0700846 ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,pc}
Adam Langleyd9e397b2015-01-22 14:27:53 -0800847#else
Adam Langleye9ada862015-05-11 17:20:37 -0700848 ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr}
Adam Langleyd9e397b2015-01-22 14:27:53 -0800849 tst lr,#1
850 moveq pc,lr @ be binary compatible with V4, yet
Adam Langleye9ada862015-05-11 17:20:37 -0700851.word 0xe12fff1e @ interoperable with Thumb ISA:-)
Adam Langleyd9e397b2015-01-22 14:27:53 -0800852#endif
853.size AES_set_enc2dec_key,.-AES_set_enc2dec_key
854
855.type AES_Td,%object
856.align 5
857AES_Td:
858.word 0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96
859.word 0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393
860.word 0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25
861.word 0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f
862.word 0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1
863.word 0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6
864.word 0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da
865.word 0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844
866.word 0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd
867.word 0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4
868.word 0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45
869.word 0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94
870.word 0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7
871.word 0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a
872.word 0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5
873.word 0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c
874.word 0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1
875.word 0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a
876.word 0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75
877.word 0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051
878.word 0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46
879.word 0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff
880.word 0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77
881.word 0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb
882.word 0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000
883.word 0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e
884.word 0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927
885.word 0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a
886.word 0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e
887.word 0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16
888.word 0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d
889.word 0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8
890.word 0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd
891.word 0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34
892.word 0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163
893.word 0xd731dcca, 0x42638510, 0x13972240, 0x84c61120
894.word 0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d
895.word 0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0
896.word 0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422
897.word 0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef
898.word 0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36
899.word 0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4
900.word 0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662
901.word 0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5
902.word 0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3
903.word 0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b
904.word 0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8
905.word 0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6
906.word 0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6
907.word 0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0
908.word 0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815
909.word 0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f
910.word 0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df
911.word 0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f
912.word 0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e
913.word 0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713
914.word 0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89
915.word 0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c
916.word 0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf
917.word 0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86
918.word 0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f
919.word 0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541
920.word 0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190
921.word 0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742
922@ Td4[256]
923.byte 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38
924.byte 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb
925.byte 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87
926.byte 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb
927.byte 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d
928.byte 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e
929.byte 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2
930.byte 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25
931.byte 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16
932.byte 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92
933.byte 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda
934.byte 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84
935.byte 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a
936.byte 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06
937.byte 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02
938.byte 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b
939.byte 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea
940.byte 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73
941.byte 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85
942.byte 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e
943.byte 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89
944.byte 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b
945.byte 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20
946.byte 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4
947.byte 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31
948.byte 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f
949.byte 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d
950.byte 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef
951.byte 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0
952.byte 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61
953.byte 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26
954.byte 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d
955.size AES_Td,.-AES_Td
956
Adam Vartanianbfcf3a72018-08-10 14:55:24 +0100957@ void aes_nohw_decrypt(const unsigned char *in, unsigned char *out,
958@ const AES_KEY *key) {
959.globl aes_nohw_decrypt
960.hidden aes_nohw_decrypt
961.type aes_nohw_decrypt,%function
Adam Langleyd9e397b2015-01-22 14:27:53 -0800962.align 5
Adam Vartanianbfcf3a72018-08-10 14:55:24 +0100963aes_nohw_decrypt:
Robert Sloan8ff03552017-06-14 12:40:58 -0700964#ifndef __thumb2__
Adam Vartanianbfcf3a72018-08-10 14:55:24 +0100965 sub r3,pc,#8 @ aes_nohw_decrypt
Adam Langleyd9e397b2015-01-22 14:27:53 -0800966#else
Robert Sloand5c22152017-11-13 09:22:12 -0800967 adr r3,.
Adam Langleyd9e397b2015-01-22 14:27:53 -0800968#endif
Adam Langleye9ada862015-05-11 17:20:37 -0700969 stmdb sp!,{r1,r4-r12,lr}
Robert Sloanab8b8882018-03-26 11:39:51 -0700970#if defined(__thumb2__) || defined(__APPLE__)
Adam Langleye9ada862015-05-11 17:20:37 -0700971 adr r10,AES_Td
972#else
Adam Vartanianbfcf3a72018-08-10 14:55:24 +0100973 sub r10,r3,#aes_nohw_decrypt-AES_Td @ Td
Adam Langleye9ada862015-05-11 17:20:37 -0700974#endif
Adam Langleyd9e397b2015-01-22 14:27:53 -0800975 mov r12,r0 @ inp
976 mov r11,r2
Adam Langleyd9e397b2015-01-22 14:27:53 -0800977#if __ARM_ARCH__<7
978 ldrb r0,[r12,#3] @ load input data in endian-neutral
979 ldrb r4,[r12,#2] @ manner...
980 ldrb r5,[r12,#1]
981 ldrb r6,[r12,#0]
982 orr r0,r0,r4,lsl#8
983 ldrb r1,[r12,#7]
984 orr r0,r0,r5,lsl#16
985 ldrb r4,[r12,#6]
986 orr r0,r0,r6,lsl#24
987 ldrb r5,[r12,#5]
988 ldrb r6,[r12,#4]
989 orr r1,r1,r4,lsl#8
990 ldrb r2,[r12,#11]
991 orr r1,r1,r5,lsl#16
992 ldrb r4,[r12,#10]
993 orr r1,r1,r6,lsl#24
994 ldrb r5,[r12,#9]
995 ldrb r6,[r12,#8]
996 orr r2,r2,r4,lsl#8
997 ldrb r3,[r12,#15]
998 orr r2,r2,r5,lsl#16
999 ldrb r4,[r12,#14]
1000 orr r2,r2,r6,lsl#24
1001 ldrb r5,[r12,#13]
1002 ldrb r6,[r12,#12]
1003 orr r3,r3,r4,lsl#8
1004 orr r3,r3,r5,lsl#16
1005 orr r3,r3,r6,lsl#24
1006#else
1007 ldr r0,[r12,#0]
1008 ldr r1,[r12,#4]
1009 ldr r2,[r12,#8]
1010 ldr r3,[r12,#12]
1011#ifdef __ARMEL__
1012 rev r0,r0
1013 rev r1,r1
1014 rev r2,r2
1015 rev r3,r3
1016#endif
1017#endif
1018 bl _armv4_AES_decrypt
1019
1020 ldr r12,[sp],#4 @ pop out
1021#if __ARM_ARCH__>=7
1022#ifdef __ARMEL__
1023 rev r0,r0
1024 rev r1,r1
1025 rev r2,r2
1026 rev r3,r3
1027#endif
1028 str r0,[r12,#0]
1029 str r1,[r12,#4]
1030 str r2,[r12,#8]
1031 str r3,[r12,#12]
1032#else
1033 mov r4,r0,lsr#24 @ write output in endian-neutral
1034 mov r5,r0,lsr#16 @ manner...
1035 mov r6,r0,lsr#8
1036 strb r4,[r12,#0]
1037 strb r5,[r12,#1]
1038 mov r4,r1,lsr#24
1039 strb r6,[r12,#2]
1040 mov r5,r1,lsr#16
1041 strb r0,[r12,#3]
1042 mov r6,r1,lsr#8
1043 strb r4,[r12,#4]
1044 strb r5,[r12,#5]
1045 mov r4,r2,lsr#24
1046 strb r6,[r12,#6]
1047 mov r5,r2,lsr#16
1048 strb r1,[r12,#7]
1049 mov r6,r2,lsr#8
1050 strb r4,[r12,#8]
1051 strb r5,[r12,#9]
1052 mov r4,r3,lsr#24
1053 strb r6,[r12,#10]
1054 mov r5,r3,lsr#16
1055 strb r2,[r12,#11]
1056 mov r6,r3,lsr#8
1057 strb r4,[r12,#12]
1058 strb r5,[r12,#13]
1059 strb r6,[r12,#14]
1060 strb r3,[r12,#15]
1061#endif
1062#if __ARM_ARCH__>=5
Adam Langleye9ada862015-05-11 17:20:37 -07001063 ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,pc}
Adam Langleyd9e397b2015-01-22 14:27:53 -08001064#else
Adam Langleye9ada862015-05-11 17:20:37 -07001065 ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr}
Adam Langleyd9e397b2015-01-22 14:27:53 -08001066 tst lr,#1
1067 moveq pc,lr @ be binary compatible with V4, yet
Adam Langleye9ada862015-05-11 17:20:37 -07001068.word 0xe12fff1e @ interoperable with Thumb ISA:-)
Adam Langleyd9e397b2015-01-22 14:27:53 -08001069#endif
Adam Vartanianbfcf3a72018-08-10 14:55:24 +01001070.size aes_nohw_decrypt,.-aes_nohw_decrypt
Adam Langleyd9e397b2015-01-22 14:27:53 -08001071
Adam Langleye9ada862015-05-11 17:20:37 -07001072.type _armv4_AES_decrypt,%function
Adam Langleyd9e397b2015-01-22 14:27:53 -08001073.align 2
1074_armv4_AES_decrypt:
1075 str lr,[sp,#-4]! @ push lr
Adam Langleye9ada862015-05-11 17:20:37 -07001076 ldmia r11!,{r4,r5,r6,r7}
Adam Langleyd9e397b2015-01-22 14:27:53 -08001077 eor r0,r0,r4
1078 ldr r12,[r11,#240-16]
1079 eor r1,r1,r5
1080 eor r2,r2,r6
1081 eor r3,r3,r7
1082 sub r12,r12,#1
1083 mov lr,#255
1084
1085 and r7,lr,r0,lsr#16
1086 and r8,lr,r0,lsr#8
1087 and r9,lr,r0
1088 mov r0,r0,lsr#24
1089.Ldec_loop:
1090 ldr r4,[r10,r7,lsl#2] @ Td1[s0>>16]
1091 and r7,lr,r1 @ i0
1092 ldr r5,[r10,r8,lsl#2] @ Td2[s0>>8]
1093 and r8,lr,r1,lsr#16
1094 ldr r6,[r10,r9,lsl#2] @ Td3[s0>>0]
1095 and r9,lr,r1,lsr#8
1096 ldr r0,[r10,r0,lsl#2] @ Td0[s0>>24]
1097 mov r1,r1,lsr#24
1098
1099 ldr r7,[r10,r7,lsl#2] @ Td3[s1>>0]
1100 ldr r8,[r10,r8,lsl#2] @ Td1[s1>>16]
1101 ldr r9,[r10,r9,lsl#2] @ Td2[s1>>8]
1102 eor r0,r0,r7,ror#24
1103 ldr r1,[r10,r1,lsl#2] @ Td0[s1>>24]
1104 and r7,lr,r2,lsr#8 @ i0
1105 eor r5,r8,r5,ror#8
1106 and r8,lr,r2 @ i1
1107 eor r6,r9,r6,ror#8
1108 and r9,lr,r2,lsr#16
1109 ldr r7,[r10,r7,lsl#2] @ Td2[s2>>8]
1110 eor r1,r1,r4,ror#8
1111 ldr r8,[r10,r8,lsl#2] @ Td3[s2>>0]
1112 mov r2,r2,lsr#24
1113
1114 ldr r9,[r10,r9,lsl#2] @ Td1[s2>>16]
1115 eor r0,r0,r7,ror#16
1116 ldr r2,[r10,r2,lsl#2] @ Td0[s2>>24]
1117 and r7,lr,r3,lsr#16 @ i0
1118 eor r1,r1,r8,ror#24
1119 and r8,lr,r3,lsr#8 @ i1
1120 eor r6,r9,r6,ror#8
1121 and r9,lr,r3 @ i2
1122 ldr r7,[r10,r7,lsl#2] @ Td1[s3>>16]
1123 eor r2,r2,r5,ror#8
1124 ldr r8,[r10,r8,lsl#2] @ Td2[s3>>8]
1125 mov r3,r3,lsr#24
1126
1127 ldr r9,[r10,r9,lsl#2] @ Td3[s3>>0]
1128 eor r0,r0,r7,ror#8
1129 ldr r7,[r11],#16
1130 eor r1,r1,r8,ror#16
1131 ldr r3,[r10,r3,lsl#2] @ Td0[s3>>24]
1132 eor r2,r2,r9,ror#24
1133
1134 ldr r4,[r11,#-12]
1135 eor r0,r0,r7
1136 ldr r5,[r11,#-8]
1137 eor r3,r3,r6,ror#8
1138 ldr r6,[r11,#-4]
1139 and r7,lr,r0,lsr#16
1140 eor r1,r1,r4
1141 and r8,lr,r0,lsr#8
1142 eor r2,r2,r5
1143 and r9,lr,r0
1144 eor r3,r3,r6
1145 mov r0,r0,lsr#24
1146
1147 subs r12,r12,#1
1148 bne .Ldec_loop
1149
1150 add r10,r10,#1024
1151
1152 ldr r5,[r10,#0] @ prefetch Td4
1153 ldr r6,[r10,#32]
1154 ldr r4,[r10,#64]
1155 ldr r5,[r10,#96]
1156 ldr r6,[r10,#128]
1157 ldr r4,[r10,#160]
1158 ldr r5,[r10,#192]
1159 ldr r6,[r10,#224]
1160
1161 ldrb r0,[r10,r0] @ Td4[s0>>24]
1162 ldrb r4,[r10,r7] @ Td4[s0>>16]
1163 and r7,lr,r1 @ i0
1164 ldrb r5,[r10,r8] @ Td4[s0>>8]
1165 and r8,lr,r1,lsr#16
1166 ldrb r6,[r10,r9] @ Td4[s0>>0]
1167 and r9,lr,r1,lsr#8
1168
1169 add r1,r10,r1,lsr#24
1170 ldrb r7,[r10,r7] @ Td4[s1>>0]
1171 ldrb r1,[r1] @ Td4[s1>>24]
1172 ldrb r8,[r10,r8] @ Td4[s1>>16]
1173 eor r0,r7,r0,lsl#24
1174 ldrb r9,[r10,r9] @ Td4[s1>>8]
1175 eor r1,r4,r1,lsl#8
1176 and r7,lr,r2,lsr#8 @ i0
1177 eor r5,r5,r8,lsl#8
1178 and r8,lr,r2 @ i1
1179 ldrb r7,[r10,r7] @ Td4[s2>>8]
1180 eor r6,r6,r9,lsl#8
1181 ldrb r8,[r10,r8] @ Td4[s2>>0]
1182 and r9,lr,r2,lsr#16
1183
1184 add r2,r10,r2,lsr#24
1185 ldrb r2,[r2] @ Td4[s2>>24]
1186 eor r0,r0,r7,lsl#8
1187 ldrb r9,[r10,r9] @ Td4[s2>>16]
1188 eor r1,r8,r1,lsl#16
1189 and r7,lr,r3,lsr#16 @ i0
1190 eor r2,r5,r2,lsl#16
1191 and r8,lr,r3,lsr#8 @ i1
1192 ldrb r7,[r10,r7] @ Td4[s3>>16]
1193 eor r6,r6,r9,lsl#16
1194 ldrb r8,[r10,r8] @ Td4[s3>>8]
1195 and r9,lr,r3 @ i2
1196
1197 add r3,r10,r3,lsr#24
1198 ldrb r9,[r10,r9] @ Td4[s3>>0]
1199 ldrb r3,[r3] @ Td4[s3>>24]
1200 eor r0,r0,r7,lsl#16
1201 ldr r7,[r11,#0]
1202 eor r1,r1,r8,lsl#8
1203 ldr r4,[r11,#4]
1204 eor r2,r9,r2,lsl#8
1205 ldr r5,[r11,#8]
1206 eor r3,r6,r3,lsl#24
1207 ldr r6,[r11,#12]
1208
1209 eor r0,r0,r7
1210 eor r1,r1,r4
1211 eor r2,r2,r5
1212 eor r3,r3,r6
1213
1214 sub r10,r10,#1024
1215 ldr pc,[sp],#4 @ pop and return
1216.size _armv4_AES_decrypt,.-_armv4_AES_decrypt
Adam Langleye9ada862015-05-11 17:20:37 -07001217.byte 65,69,83,32,102,111,114,32,65,82,77,118,52,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
1218.align 2
Adam Langleyd9e397b2015-01-22 14:27:53 -08001219.align 2
David Benjamin4969cc92016-04-22 15:02:23 -04001220#endif
Robert Sloan726e9d12018-09-11 11:45:04 -07001221#endif // !OPENSSL_NO_ASM