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