comparison aes-arm.S @ 908:3ca7113936c1 asm

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