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