1238384Sjkim#!/usr/bin/env perl
2238384Sjkim
3238384Sjkim# ====================================================================
4290207Sjkim# Written by Andy Polyakov <appro@openssl.org> for the OpenSSL
5238384Sjkim# project. The module is, however, dual licensed under OpenSSL and
6238384Sjkim# CRYPTOGAMS licenses depending on where you obtain it. For further
7238384Sjkim# details see http://www.openssl.org/~appro/cryptogams/.
8238384Sjkim# ====================================================================
9238384Sjkim
10238384Sjkim# AES for ARMv4
11238384Sjkim
12238384Sjkim# January 2007.
13238384Sjkim#
14238384Sjkim# Code uses single 1K S-box and is >2 times faster than code generated
15238384Sjkim# by gcc-3.4.1. This is thanks to unique feature of ARMv4 ISA, which
16238384Sjkim# allows to merge logical or arithmetic operation with shift or rotate
17238384Sjkim# in one instruction and emit combined result every cycle. The module
18238384Sjkim# is endian-neutral. The performance is ~42 cycles/byte for 128-bit
19238384Sjkim# key [on single-issue Xscale PXA250 core].
20238384Sjkim
21238384Sjkim# May 2007.
22238384Sjkim#
23238384Sjkim# AES_set_[en|de]crypt_key is added.
24238384Sjkim
25238384Sjkim# July 2010.
26238384Sjkim#
27238384Sjkim# Rescheduling for dual-issue pipeline resulted in 12% improvement on
28238384Sjkim# Cortex A8 core and ~25 cycles per byte processed with 128-bit key.
29238384Sjkim
30238384Sjkim# February 2011.
31238384Sjkim#
32238384Sjkim# Profiler-assisted and platform-specific optimization resulted in 16%
33238384Sjkim# improvement on Cortex A8 core and ~21.5 cycles per byte.
34238384Sjkim
35238384Sjkimwhile (($output=shift) && ($output!~/^\w[\w\-]*\.\w+$/)) {}
36238384Sjkimopen STDOUT,">$output";
37238384Sjkim
38238384Sjkim$s0="r0";
39238384Sjkim$s1="r1";
40238384Sjkim$s2="r2";
41238384Sjkim$s3="r3";
42238384Sjkim$t1="r4";
43238384Sjkim$t2="r5";
44238384Sjkim$t3="r6";
45238384Sjkim$i1="r7";
46238384Sjkim$i2="r8";
47238384Sjkim$i3="r9";
48238384Sjkim
49238384Sjkim$tbl="r10";
50238384Sjkim$key="r11";
51238384Sjkim$rounds="r12";
52238384Sjkim
53238384Sjkim$code=<<___;
54290207Sjkim#ifndef __KERNEL__
55290207Sjkim# include "arm_arch.h"
56290207Sjkim#else
57290207Sjkim# define __ARM_ARCH__ __LINUX_ARM_ARCH__
58290207Sjkim#endif
59290207Sjkim
60238384Sjkim.text
61290207Sjkim#if __ARM_ARCH__<7
62238384Sjkim.code	32
63290207Sjkim#else
64290207Sjkim.syntax	unified
65290207Sjkim# ifdef __thumb2__
66290207Sjkim.thumb
67290207Sjkim# else
68290207Sjkim.code	32
69290207Sjkim# endif
70290207Sjkim#endif
71238384Sjkim
72238384Sjkim.type	AES_Te,%object
73238384Sjkim.align	5
74238384SjkimAES_Te:
75238384Sjkim.word	0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d
76238384Sjkim.word	0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554
77238384Sjkim.word	0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d
78238384Sjkim.word	0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a
79238384Sjkim.word	0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87
80238384Sjkim.word	0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b
81238384Sjkim.word	0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea
82238384Sjkim.word	0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b
83238384Sjkim.word	0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a
84238384Sjkim.word	0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f
85238384Sjkim.word	0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108
86238384Sjkim.word	0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f
87238384Sjkim.word	0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e
88238384Sjkim.word	0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5
89238384Sjkim.word	0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d
90238384Sjkim.word	0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f
91238384Sjkim.word	0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e
92238384Sjkim.word	0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb
93238384Sjkim.word	0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce
94238384Sjkim.word	0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497
95238384Sjkim.word	0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c
96238384Sjkim.word	0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed
97238384Sjkim.word	0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b
98238384Sjkim.word	0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a
99238384Sjkim.word	0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16
100238384Sjkim.word	0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594
101238384Sjkim.word	0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81
102238384Sjkim.word	0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3
103238384Sjkim.word	0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a
104238384Sjkim.word	0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504
105238384Sjkim.word	0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163
106238384Sjkim.word	0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d
107238384Sjkim.word	0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f
108238384Sjkim.word	0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739
109238384Sjkim.word	0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47
110238384Sjkim.word	0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395
111238384Sjkim.word	0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f
112238384Sjkim.word	0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883
113238384Sjkim.word	0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c
114238384Sjkim.word	0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76
115238384Sjkim.word	0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e
116238384Sjkim.word	0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4
117238384Sjkim.word	0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6
118238384Sjkim.word	0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b
119238384Sjkim.word	0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7
120238384Sjkim.word	0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0
121238384Sjkim.word	0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25
122238384Sjkim.word	0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818
123238384Sjkim.word	0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72
124238384Sjkim.word	0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651
125238384Sjkim.word	0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21
126238384Sjkim.word	0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85
127238384Sjkim.word	0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa
128238384Sjkim.word	0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12
129238384Sjkim.word	0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0
130238384Sjkim.word	0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9
131238384Sjkim.word	0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133
132238384Sjkim.word	0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7
133238384Sjkim.word	0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920
134238384Sjkim.word	0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a
135238384Sjkim.word	0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17
136238384Sjkim.word	0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8
137238384Sjkim.word	0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11
138238384Sjkim.word	0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a
139238384Sjkim@ Te4[256]
140238384Sjkim.byte	0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5
141238384Sjkim.byte	0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76
142238384Sjkim.byte	0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0
143238384Sjkim.byte	0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0
144238384Sjkim.byte	0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc
145238384Sjkim.byte	0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15
146238384Sjkim.byte	0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a
147238384Sjkim.byte	0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75
148238384Sjkim.byte	0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0
149238384Sjkim.byte	0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84
150238384Sjkim.byte	0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b
151238384Sjkim.byte	0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf
152238384Sjkim.byte	0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85
153238384Sjkim.byte	0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8
154238384Sjkim.byte	0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5
155238384Sjkim.byte	0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2
156238384Sjkim.byte	0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17
157238384Sjkim.byte	0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73
158238384Sjkim.byte	0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88
159238384Sjkim.byte	0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb
160238384Sjkim.byte	0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c
161238384Sjkim.byte	0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79
162238384Sjkim.byte	0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9
163238384Sjkim.byte	0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08
164238384Sjkim.byte	0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6
165238384Sjkim.byte	0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a
166238384Sjkim.byte	0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e
167238384Sjkim.byte	0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e
168238384Sjkim.byte	0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94
169238384Sjkim.byte	0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf
170238384Sjkim.byte	0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68
171238384Sjkim.byte	0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16
172238384Sjkim@ rcon[]
173238384Sjkim.word	0x01000000, 0x02000000, 0x04000000, 0x08000000
174238384Sjkim.word	0x10000000, 0x20000000, 0x40000000, 0x80000000
175238384Sjkim.word	0x1B000000, 0x36000000, 0, 0, 0, 0, 0, 0
176238384Sjkim.size	AES_Te,.-AES_Te
177238384Sjkim
178238384Sjkim@ void AES_encrypt(const unsigned char *in, unsigned char *out,
179238384Sjkim@ 		 const AES_KEY *key) {
180238384Sjkim.global AES_encrypt
181238384Sjkim.type   AES_encrypt,%function
182238384Sjkim.align	5
183238384SjkimAES_encrypt:
184290207Sjkim#if __ARM_ARCH__<7
185238384Sjkim	sub	r3,pc,#8		@ AES_encrypt
186290207Sjkim#else
187326663Sjkim	adr	r3,.
188290207Sjkim#endif
189238384Sjkim	stmdb   sp!,{r1,r4-r12,lr}
190238384Sjkim	mov	$rounds,r0		@ inp
191238384Sjkim	mov	$key,r2
192238384Sjkim	sub	$tbl,r3,#AES_encrypt-AES_Te	@ Te
193238384Sjkim#if __ARM_ARCH__<7
194238384Sjkim	ldrb	$s0,[$rounds,#3]	@ load input data in endian-neutral
195238384Sjkim	ldrb	$t1,[$rounds,#2]	@ manner...
196238384Sjkim	ldrb	$t2,[$rounds,#1]
197238384Sjkim	ldrb	$t3,[$rounds,#0]
198238384Sjkim	orr	$s0,$s0,$t1,lsl#8
199238384Sjkim	ldrb	$s1,[$rounds,#7]
200238384Sjkim	orr	$s0,$s0,$t2,lsl#16
201238384Sjkim	ldrb	$t1,[$rounds,#6]
202238384Sjkim	orr	$s0,$s0,$t3,lsl#24
203238384Sjkim	ldrb	$t2,[$rounds,#5]
204238384Sjkim	ldrb	$t3,[$rounds,#4]
205238384Sjkim	orr	$s1,$s1,$t1,lsl#8
206238384Sjkim	ldrb	$s2,[$rounds,#11]
207238384Sjkim	orr	$s1,$s1,$t2,lsl#16
208238384Sjkim	ldrb	$t1,[$rounds,#10]
209238384Sjkim	orr	$s1,$s1,$t3,lsl#24
210238384Sjkim	ldrb	$t2,[$rounds,#9]
211238384Sjkim	ldrb	$t3,[$rounds,#8]
212238384Sjkim	orr	$s2,$s2,$t1,lsl#8
213238384Sjkim	ldrb	$s3,[$rounds,#15]
214238384Sjkim	orr	$s2,$s2,$t2,lsl#16
215238384Sjkim	ldrb	$t1,[$rounds,#14]
216238384Sjkim	orr	$s2,$s2,$t3,lsl#24
217238384Sjkim	ldrb	$t2,[$rounds,#13]
218238384Sjkim	ldrb	$t3,[$rounds,#12]
219238384Sjkim	orr	$s3,$s3,$t1,lsl#8
220238384Sjkim	orr	$s3,$s3,$t2,lsl#16
221238384Sjkim	orr	$s3,$s3,$t3,lsl#24
222238384Sjkim#else
223238384Sjkim	ldr	$s0,[$rounds,#0]
224238384Sjkim	ldr	$s1,[$rounds,#4]
225238384Sjkim	ldr	$s2,[$rounds,#8]
226238384Sjkim	ldr	$s3,[$rounds,#12]
227238384Sjkim#ifdef __ARMEL__
228238384Sjkim	rev	$s0,$s0
229238384Sjkim	rev	$s1,$s1
230238384Sjkim	rev	$s2,$s2
231238384Sjkim	rev	$s3,$s3
232238384Sjkim#endif
233238384Sjkim#endif
234238384Sjkim	bl	_armv4_AES_encrypt
235238384Sjkim
236238384Sjkim	ldr	$rounds,[sp],#4		@ pop out
237238384Sjkim#if __ARM_ARCH__>=7
238238384Sjkim#ifdef __ARMEL__
239238384Sjkim	rev	$s0,$s0
240238384Sjkim	rev	$s1,$s1
241238384Sjkim	rev	$s2,$s2
242238384Sjkim	rev	$s3,$s3
243238384Sjkim#endif
244238384Sjkim	str	$s0,[$rounds,#0]
245238384Sjkim	str	$s1,[$rounds,#4]
246238384Sjkim	str	$s2,[$rounds,#8]
247238384Sjkim	str	$s3,[$rounds,#12]
248238384Sjkim#else
249238384Sjkim	mov	$t1,$s0,lsr#24		@ write output in endian-neutral
250238384Sjkim	mov	$t2,$s0,lsr#16		@ manner...
251238384Sjkim	mov	$t3,$s0,lsr#8
252238384Sjkim	strb	$t1,[$rounds,#0]
253238384Sjkim	strb	$t2,[$rounds,#1]
254238384Sjkim	mov	$t1,$s1,lsr#24
255238384Sjkim	strb	$t3,[$rounds,#2]
256238384Sjkim	mov	$t2,$s1,lsr#16
257238384Sjkim	strb	$s0,[$rounds,#3]
258238384Sjkim	mov	$t3,$s1,lsr#8
259238384Sjkim	strb	$t1,[$rounds,#4]
260238384Sjkim	strb	$t2,[$rounds,#5]
261238384Sjkim	mov	$t1,$s2,lsr#24
262238384Sjkim	strb	$t3,[$rounds,#6]
263238384Sjkim	mov	$t2,$s2,lsr#16
264238384Sjkim	strb	$s1,[$rounds,#7]
265238384Sjkim	mov	$t3,$s2,lsr#8
266238384Sjkim	strb	$t1,[$rounds,#8]
267238384Sjkim	strb	$t2,[$rounds,#9]
268238384Sjkim	mov	$t1,$s3,lsr#24
269238384Sjkim	strb	$t3,[$rounds,#10]
270238384Sjkim	mov	$t2,$s3,lsr#16
271238384Sjkim	strb	$s2,[$rounds,#11]
272238384Sjkim	mov	$t3,$s3,lsr#8
273238384Sjkim	strb	$t1,[$rounds,#12]
274238384Sjkim	strb	$t2,[$rounds,#13]
275238384Sjkim	strb	$t3,[$rounds,#14]
276238384Sjkim	strb	$s3,[$rounds,#15]
277238384Sjkim#endif
278238384Sjkim#if __ARM_ARCH__>=5
279238384Sjkim	ldmia	sp!,{r4-r12,pc}
280238384Sjkim#else
281238384Sjkim	ldmia   sp!,{r4-r12,lr}
282238384Sjkim	tst	lr,#1
283238384Sjkim	moveq	pc,lr			@ be binary compatible with V4, yet
284238384Sjkim	bx	lr			@ interoperable with Thumb ISA:-)
285238384Sjkim#endif
286238384Sjkim.size	AES_encrypt,.-AES_encrypt
287238384Sjkim
288238384Sjkim.type   _armv4_AES_encrypt,%function
289238384Sjkim.align	2
290238384Sjkim_armv4_AES_encrypt:
291238384Sjkim	str	lr,[sp,#-4]!		@ push lr
292238384Sjkim	ldmia	$key!,{$t1-$i1}
293238384Sjkim	eor	$s0,$s0,$t1
294238384Sjkim	ldr	$rounds,[$key,#240-16]
295238384Sjkim	eor	$s1,$s1,$t2
296238384Sjkim	eor	$s2,$s2,$t3
297238384Sjkim	eor	$s3,$s3,$i1
298238384Sjkim	sub	$rounds,$rounds,#1
299238384Sjkim	mov	lr,#255
300238384Sjkim
301238384Sjkim	and	$i1,lr,$s0
302238384Sjkim	and	$i2,lr,$s0,lsr#8
303238384Sjkim	and	$i3,lr,$s0,lsr#16
304238384Sjkim	mov	$s0,$s0,lsr#24
305238384Sjkim.Lenc_loop:
306238384Sjkim	ldr	$t1,[$tbl,$i1,lsl#2]	@ Te3[s0>>0]
307238384Sjkim	and	$i1,lr,$s1,lsr#16	@ i0
308238384Sjkim	ldr	$t2,[$tbl,$i2,lsl#2]	@ Te2[s0>>8]
309238384Sjkim	and	$i2,lr,$s1
310238384Sjkim	ldr	$t3,[$tbl,$i3,lsl#2]	@ Te1[s0>>16]
311238384Sjkim	and	$i3,lr,$s1,lsr#8
312238384Sjkim	ldr	$s0,[$tbl,$s0,lsl#2]	@ Te0[s0>>24]
313238384Sjkim	mov	$s1,$s1,lsr#24
314238384Sjkim
315238384Sjkim	ldr	$i1,[$tbl,$i1,lsl#2]	@ Te1[s1>>16]
316238384Sjkim	ldr	$i2,[$tbl,$i2,lsl#2]	@ Te3[s1>>0]
317238384Sjkim	ldr	$i3,[$tbl,$i3,lsl#2]	@ Te2[s1>>8]
318238384Sjkim	eor	$s0,$s0,$i1,ror#8
319238384Sjkim	ldr	$s1,[$tbl,$s1,lsl#2]	@ Te0[s1>>24]
320238384Sjkim	and	$i1,lr,$s2,lsr#8	@ i0
321238384Sjkim	eor	$t2,$t2,$i2,ror#8
322238384Sjkim	and	$i2,lr,$s2,lsr#16	@ i1
323238384Sjkim	eor	$t3,$t3,$i3,ror#8
324238384Sjkim	and	$i3,lr,$s2
325238384Sjkim	ldr	$i1,[$tbl,$i1,lsl#2]	@ Te2[s2>>8]
326238384Sjkim	eor	$s1,$s1,$t1,ror#24
327238384Sjkim	ldr	$i2,[$tbl,$i2,lsl#2]	@ Te1[s2>>16]
328238384Sjkim	mov	$s2,$s2,lsr#24
329238384Sjkim
330238384Sjkim	ldr	$i3,[$tbl,$i3,lsl#2]	@ Te3[s2>>0]
331238384Sjkim	eor	$s0,$s0,$i1,ror#16
332238384Sjkim	ldr	$s2,[$tbl,$s2,lsl#2]	@ Te0[s2>>24]
333238384Sjkim	and	$i1,lr,$s3		@ i0
334238384Sjkim	eor	$s1,$s1,$i2,ror#8
335238384Sjkim	and	$i2,lr,$s3,lsr#8	@ i1
336238384Sjkim	eor	$t3,$t3,$i3,ror#16
337238384Sjkim	and	$i3,lr,$s3,lsr#16	@ i2
338238384Sjkim	ldr	$i1,[$tbl,$i1,lsl#2]	@ Te3[s3>>0]
339238384Sjkim	eor	$s2,$s2,$t2,ror#16
340238384Sjkim	ldr	$i2,[$tbl,$i2,lsl#2]	@ Te2[s3>>8]
341238384Sjkim	mov	$s3,$s3,lsr#24
342238384Sjkim
343238384Sjkim	ldr	$i3,[$tbl,$i3,lsl#2]	@ Te1[s3>>16]
344238384Sjkim	eor	$s0,$s0,$i1,ror#24
345238384Sjkim	ldr	$i1,[$key],#16
346238384Sjkim	eor	$s1,$s1,$i2,ror#16
347238384Sjkim	ldr	$s3,[$tbl,$s3,lsl#2]	@ Te0[s3>>24]
348238384Sjkim	eor	$s2,$s2,$i3,ror#8
349238384Sjkim	ldr	$t1,[$key,#-12]
350238384Sjkim	eor	$s3,$s3,$t3,ror#8
351238384Sjkim
352238384Sjkim	ldr	$t2,[$key,#-8]
353238384Sjkim	eor	$s0,$s0,$i1
354238384Sjkim	ldr	$t3,[$key,#-4]
355238384Sjkim	and	$i1,lr,$s0
356238384Sjkim	eor	$s1,$s1,$t1
357238384Sjkim	and	$i2,lr,$s0,lsr#8
358238384Sjkim	eor	$s2,$s2,$t2
359238384Sjkim	and	$i3,lr,$s0,lsr#16
360238384Sjkim	eor	$s3,$s3,$t3
361238384Sjkim	mov	$s0,$s0,lsr#24
362238384Sjkim
363238384Sjkim	subs	$rounds,$rounds,#1
364238384Sjkim	bne	.Lenc_loop
365238384Sjkim
366238384Sjkim	add	$tbl,$tbl,#2
367238384Sjkim
368238384Sjkim	ldrb	$t1,[$tbl,$i1,lsl#2]	@ Te4[s0>>0]
369238384Sjkim	and	$i1,lr,$s1,lsr#16	@ i0
370238384Sjkim	ldrb	$t2,[$tbl,$i2,lsl#2]	@ Te4[s0>>8]
371238384Sjkim	and	$i2,lr,$s1
372238384Sjkim	ldrb	$t3,[$tbl,$i3,lsl#2]	@ Te4[s0>>16]
373238384Sjkim	and	$i3,lr,$s1,lsr#8
374238384Sjkim	ldrb	$s0,[$tbl,$s0,lsl#2]	@ Te4[s0>>24]
375238384Sjkim	mov	$s1,$s1,lsr#24
376238384Sjkim
377238384Sjkim	ldrb	$i1,[$tbl,$i1,lsl#2]	@ Te4[s1>>16]
378238384Sjkim	ldrb	$i2,[$tbl,$i2,lsl#2]	@ Te4[s1>>0]
379238384Sjkim	ldrb	$i3,[$tbl,$i3,lsl#2]	@ Te4[s1>>8]
380238384Sjkim	eor	$s0,$i1,$s0,lsl#8
381238384Sjkim	ldrb	$s1,[$tbl,$s1,lsl#2]	@ Te4[s1>>24]
382238384Sjkim	and	$i1,lr,$s2,lsr#8	@ i0
383238384Sjkim	eor	$t2,$i2,$t2,lsl#8
384238384Sjkim	and	$i2,lr,$s2,lsr#16	@ i1
385238384Sjkim	eor	$t3,$i3,$t3,lsl#8
386238384Sjkim	and	$i3,lr,$s2
387238384Sjkim	ldrb	$i1,[$tbl,$i1,lsl#2]	@ Te4[s2>>8]
388238384Sjkim	eor	$s1,$t1,$s1,lsl#24
389238384Sjkim	ldrb	$i2,[$tbl,$i2,lsl#2]	@ Te4[s2>>16]
390238384Sjkim	mov	$s2,$s2,lsr#24
391238384Sjkim
392238384Sjkim	ldrb	$i3,[$tbl,$i3,lsl#2]	@ Te4[s2>>0]
393238384Sjkim	eor	$s0,$i1,$s0,lsl#8
394238384Sjkim	ldrb	$s2,[$tbl,$s2,lsl#2]	@ Te4[s2>>24]
395238384Sjkim	and	$i1,lr,$s3		@ i0
396238384Sjkim	eor	$s1,$s1,$i2,lsl#16
397238384Sjkim	and	$i2,lr,$s3,lsr#8	@ i1
398238384Sjkim	eor	$t3,$i3,$t3,lsl#8
399238384Sjkim	and	$i3,lr,$s3,lsr#16	@ i2
400238384Sjkim	ldrb	$i1,[$tbl,$i1,lsl#2]	@ Te4[s3>>0]
401238384Sjkim	eor	$s2,$t2,$s2,lsl#24
402238384Sjkim	ldrb	$i2,[$tbl,$i2,lsl#2]	@ Te4[s3>>8]
403238384Sjkim	mov	$s3,$s3,lsr#24
404238384Sjkim
405238384Sjkim	ldrb	$i3,[$tbl,$i3,lsl#2]	@ Te4[s3>>16]
406238384Sjkim	eor	$s0,$i1,$s0,lsl#8
407238384Sjkim	ldr	$i1,[$key,#0]
408238384Sjkim	ldrb	$s3,[$tbl,$s3,lsl#2]	@ Te4[s3>>24]
409238384Sjkim	eor	$s1,$s1,$i2,lsl#8
410238384Sjkim	ldr	$t1,[$key,#4]
411238384Sjkim	eor	$s2,$s2,$i3,lsl#16
412238384Sjkim	ldr	$t2,[$key,#8]
413238384Sjkim	eor	$s3,$t3,$s3,lsl#24
414238384Sjkim	ldr	$t3,[$key,#12]
415238384Sjkim
416238384Sjkim	eor	$s0,$s0,$i1
417238384Sjkim	eor	$s1,$s1,$t1
418238384Sjkim	eor	$s2,$s2,$t2
419238384Sjkim	eor	$s3,$s3,$t3
420238384Sjkim
421238384Sjkim	sub	$tbl,$tbl,#2
422238384Sjkim	ldr	pc,[sp],#4		@ pop and return
423238384Sjkim.size	_armv4_AES_encrypt,.-_armv4_AES_encrypt
424238384Sjkim
425238384Sjkim.global private_AES_set_encrypt_key
426238384Sjkim.type   private_AES_set_encrypt_key,%function
427238384Sjkim.align	5
428238384Sjkimprivate_AES_set_encrypt_key:
429238384Sjkim_armv4_AES_set_encrypt_key:
430290207Sjkim#if __ARM_ARCH__<7
431238384Sjkim	sub	r3,pc,#8		@ AES_set_encrypt_key
432290207Sjkim#else
433326663Sjkim	adr	r3,.
434290207Sjkim#endif
435238384Sjkim	teq	r0,#0
436290207Sjkim#if __ARM_ARCH__>=7
437290207Sjkim	itt	eq			@ Thumb2 thing, sanity check in ARM
438290207Sjkim#endif
439238384Sjkim	moveq	r0,#-1
440238384Sjkim	beq	.Labrt
441238384Sjkim	teq	r2,#0
442290207Sjkim#if __ARM_ARCH__>=7
443290207Sjkim	itt	eq			@ Thumb2 thing, sanity check in ARM
444290207Sjkim#endif
445238384Sjkim	moveq	r0,#-1
446238384Sjkim	beq	.Labrt
447238384Sjkim
448238384Sjkim	teq	r1,#128
449238384Sjkim	beq	.Lok
450238384Sjkim	teq	r1,#192
451238384Sjkim	beq	.Lok
452238384Sjkim	teq	r1,#256
453290207Sjkim#if __ARM_ARCH__>=7
454290207Sjkim	itt	ne			@ Thumb2 thing, sanity check in ARM
455290207Sjkim#endif
456238384Sjkim	movne	r0,#-1
457238384Sjkim	bne	.Labrt
458238384Sjkim
459238384Sjkim.Lok:	stmdb   sp!,{r4-r12,lr}
460238384Sjkim	sub	$tbl,r3,#_armv4_AES_set_encrypt_key-AES_Te-1024	@ Te4
461238384Sjkim
462238384Sjkim	mov	$rounds,r0		@ inp
463238384Sjkim	mov	lr,r1			@ bits
464238384Sjkim	mov	$key,r2			@ key
465238384Sjkim
466238384Sjkim#if __ARM_ARCH__<7
467238384Sjkim	ldrb	$s0,[$rounds,#3]	@ load input data in endian-neutral
468238384Sjkim	ldrb	$t1,[$rounds,#2]	@ manner...
469238384Sjkim	ldrb	$t2,[$rounds,#1]
470238384Sjkim	ldrb	$t3,[$rounds,#0]
471238384Sjkim	orr	$s0,$s0,$t1,lsl#8
472238384Sjkim	ldrb	$s1,[$rounds,#7]
473238384Sjkim	orr	$s0,$s0,$t2,lsl#16
474238384Sjkim	ldrb	$t1,[$rounds,#6]
475238384Sjkim	orr	$s0,$s0,$t3,lsl#24
476238384Sjkim	ldrb	$t2,[$rounds,#5]
477238384Sjkim	ldrb	$t3,[$rounds,#4]
478238384Sjkim	orr	$s1,$s1,$t1,lsl#8
479238384Sjkim	ldrb	$s2,[$rounds,#11]
480238384Sjkim	orr	$s1,$s1,$t2,lsl#16
481238384Sjkim	ldrb	$t1,[$rounds,#10]
482238384Sjkim	orr	$s1,$s1,$t3,lsl#24
483238384Sjkim	ldrb	$t2,[$rounds,#9]
484238384Sjkim	ldrb	$t3,[$rounds,#8]
485238384Sjkim	orr	$s2,$s2,$t1,lsl#8
486238384Sjkim	ldrb	$s3,[$rounds,#15]
487238384Sjkim	orr	$s2,$s2,$t2,lsl#16
488238384Sjkim	ldrb	$t1,[$rounds,#14]
489238384Sjkim	orr	$s2,$s2,$t3,lsl#24
490238384Sjkim	ldrb	$t2,[$rounds,#13]
491238384Sjkim	ldrb	$t3,[$rounds,#12]
492238384Sjkim	orr	$s3,$s3,$t1,lsl#8
493238384Sjkim	str	$s0,[$key],#16
494238384Sjkim	orr	$s3,$s3,$t2,lsl#16
495238384Sjkim	str	$s1,[$key,#-12]
496238384Sjkim	orr	$s3,$s3,$t3,lsl#24
497238384Sjkim	str	$s2,[$key,#-8]
498238384Sjkim	str	$s3,[$key,#-4]
499238384Sjkim#else
500238384Sjkim	ldr	$s0,[$rounds,#0]
501238384Sjkim	ldr	$s1,[$rounds,#4]
502238384Sjkim	ldr	$s2,[$rounds,#8]
503238384Sjkim	ldr	$s3,[$rounds,#12]
504238384Sjkim#ifdef __ARMEL__
505238384Sjkim	rev	$s0,$s0
506238384Sjkim	rev	$s1,$s1
507238384Sjkim	rev	$s2,$s2
508238384Sjkim	rev	$s3,$s3
509238384Sjkim#endif
510238384Sjkim	str	$s0,[$key],#16
511238384Sjkim	str	$s1,[$key,#-12]
512238384Sjkim	str	$s2,[$key,#-8]
513238384Sjkim	str	$s3,[$key,#-4]
514238384Sjkim#endif
515238384Sjkim
516238384Sjkim	teq	lr,#128
517238384Sjkim	bne	.Lnot128
518238384Sjkim	mov	$rounds,#10
519238384Sjkim	str	$rounds,[$key,#240-16]
520238384Sjkim	add	$t3,$tbl,#256			@ rcon
521238384Sjkim	mov	lr,#255
522238384Sjkim
523238384Sjkim.L128_loop:
524238384Sjkim	and	$t2,lr,$s3,lsr#24
525238384Sjkim	and	$i1,lr,$s3,lsr#16
526238384Sjkim	ldrb	$t2,[$tbl,$t2]
527238384Sjkim	and	$i2,lr,$s3,lsr#8
528238384Sjkim	ldrb	$i1,[$tbl,$i1]
529238384Sjkim	and	$i3,lr,$s3
530238384Sjkim	ldrb	$i2,[$tbl,$i2]
531238384Sjkim	orr	$t2,$t2,$i1,lsl#24
532238384Sjkim	ldrb	$i3,[$tbl,$i3]
533238384Sjkim	orr	$t2,$t2,$i2,lsl#16
534238384Sjkim	ldr	$t1,[$t3],#4			@ rcon[i++]
535238384Sjkim	orr	$t2,$t2,$i3,lsl#8
536238384Sjkim	eor	$t2,$t2,$t1
537238384Sjkim	eor	$s0,$s0,$t2			@ rk[4]=rk[0]^...
538238384Sjkim	eor	$s1,$s1,$s0			@ rk[5]=rk[1]^rk[4]
539238384Sjkim	str	$s0,[$key],#16
540238384Sjkim	eor	$s2,$s2,$s1			@ rk[6]=rk[2]^rk[5]
541238384Sjkim	str	$s1,[$key,#-12]
542238384Sjkim	eor	$s3,$s3,$s2			@ rk[7]=rk[3]^rk[6]
543238384Sjkim	str	$s2,[$key,#-8]
544238384Sjkim	subs	$rounds,$rounds,#1
545238384Sjkim	str	$s3,[$key,#-4]
546238384Sjkim	bne	.L128_loop
547238384Sjkim	sub	r2,$key,#176
548238384Sjkim	b	.Ldone
549238384Sjkim
550238384Sjkim.Lnot128:
551238384Sjkim#if __ARM_ARCH__<7
552238384Sjkim	ldrb	$i2,[$rounds,#19]
553238384Sjkim	ldrb	$t1,[$rounds,#18]
554238384Sjkim	ldrb	$t2,[$rounds,#17]
555238384Sjkim	ldrb	$t3,[$rounds,#16]
556238384Sjkim	orr	$i2,$i2,$t1,lsl#8
557238384Sjkim	ldrb	$i3,[$rounds,#23]
558238384Sjkim	orr	$i2,$i2,$t2,lsl#16
559238384Sjkim	ldrb	$t1,[$rounds,#22]
560238384Sjkim	orr	$i2,$i2,$t3,lsl#24
561238384Sjkim	ldrb	$t2,[$rounds,#21]
562238384Sjkim	ldrb	$t3,[$rounds,#20]
563238384Sjkim	orr	$i3,$i3,$t1,lsl#8
564238384Sjkim	orr	$i3,$i3,$t2,lsl#16
565238384Sjkim	str	$i2,[$key],#8
566238384Sjkim	orr	$i3,$i3,$t3,lsl#24
567238384Sjkim	str	$i3,[$key,#-4]
568238384Sjkim#else
569238384Sjkim	ldr	$i2,[$rounds,#16]
570238384Sjkim	ldr	$i3,[$rounds,#20]
571238384Sjkim#ifdef __ARMEL__
572238384Sjkim	rev	$i2,$i2
573238384Sjkim	rev	$i3,$i3
574238384Sjkim#endif
575238384Sjkim	str	$i2,[$key],#8
576238384Sjkim	str	$i3,[$key,#-4]
577238384Sjkim#endif
578238384Sjkim
579238384Sjkim	teq	lr,#192
580238384Sjkim	bne	.Lnot192
581238384Sjkim	mov	$rounds,#12
582238384Sjkim	str	$rounds,[$key,#240-24]
583238384Sjkim	add	$t3,$tbl,#256			@ rcon
584238384Sjkim	mov	lr,#255
585238384Sjkim	mov	$rounds,#8
586238384Sjkim
587238384Sjkim.L192_loop:
588238384Sjkim	and	$t2,lr,$i3,lsr#24
589238384Sjkim	and	$i1,lr,$i3,lsr#16
590238384Sjkim	ldrb	$t2,[$tbl,$t2]
591238384Sjkim	and	$i2,lr,$i3,lsr#8
592238384Sjkim	ldrb	$i1,[$tbl,$i1]
593238384Sjkim	and	$i3,lr,$i3
594238384Sjkim	ldrb	$i2,[$tbl,$i2]
595238384Sjkim	orr	$t2,$t2,$i1,lsl#24
596238384Sjkim	ldrb	$i3,[$tbl,$i3]
597238384Sjkim	orr	$t2,$t2,$i2,lsl#16
598238384Sjkim	ldr	$t1,[$t3],#4			@ rcon[i++]
599238384Sjkim	orr	$t2,$t2,$i3,lsl#8
600238384Sjkim	eor	$i3,$t2,$t1
601238384Sjkim	eor	$s0,$s0,$i3			@ rk[6]=rk[0]^...
602238384Sjkim	eor	$s1,$s1,$s0			@ rk[7]=rk[1]^rk[6]
603238384Sjkim	str	$s0,[$key],#24
604238384Sjkim	eor	$s2,$s2,$s1			@ rk[8]=rk[2]^rk[7]
605238384Sjkim	str	$s1,[$key,#-20]
606238384Sjkim	eor	$s3,$s3,$s2			@ rk[9]=rk[3]^rk[8]
607238384Sjkim	str	$s2,[$key,#-16]
608238384Sjkim	subs	$rounds,$rounds,#1
609238384Sjkim	str	$s3,[$key,#-12]
610290207Sjkim#if __ARM_ARCH__>=7
611290207Sjkim	itt	eq				@ Thumb2 thing, sanity check in ARM
612290207Sjkim#endif
613238384Sjkim	subeq	r2,$key,#216
614238384Sjkim	beq	.Ldone
615238384Sjkim
616238384Sjkim	ldr	$i1,[$key,#-32]
617238384Sjkim	ldr	$i2,[$key,#-28]
618238384Sjkim	eor	$i1,$i1,$s3			@ rk[10]=rk[4]^rk[9]
619238384Sjkim	eor	$i3,$i2,$i1			@ rk[11]=rk[5]^rk[10]
620238384Sjkim	str	$i1,[$key,#-8]
621238384Sjkim	str	$i3,[$key,#-4]
622238384Sjkim	b	.L192_loop
623238384Sjkim
624238384Sjkim.Lnot192:
625238384Sjkim#if __ARM_ARCH__<7
626238384Sjkim	ldrb	$i2,[$rounds,#27]
627238384Sjkim	ldrb	$t1,[$rounds,#26]
628238384Sjkim	ldrb	$t2,[$rounds,#25]
629238384Sjkim	ldrb	$t3,[$rounds,#24]
630238384Sjkim	orr	$i2,$i2,$t1,lsl#8
631238384Sjkim	ldrb	$i3,[$rounds,#31]
632238384Sjkim	orr	$i2,$i2,$t2,lsl#16
633238384Sjkim	ldrb	$t1,[$rounds,#30]
634238384Sjkim	orr	$i2,$i2,$t3,lsl#24
635238384Sjkim	ldrb	$t2,[$rounds,#29]
636238384Sjkim	ldrb	$t3,[$rounds,#28]
637238384Sjkim	orr	$i3,$i3,$t1,lsl#8
638238384Sjkim	orr	$i3,$i3,$t2,lsl#16
639238384Sjkim	str	$i2,[$key],#8
640238384Sjkim	orr	$i3,$i3,$t3,lsl#24
641238384Sjkim	str	$i3,[$key,#-4]
642238384Sjkim#else
643238384Sjkim	ldr	$i2,[$rounds,#24]
644238384Sjkim	ldr	$i3,[$rounds,#28]
645238384Sjkim#ifdef __ARMEL__
646238384Sjkim	rev	$i2,$i2
647238384Sjkim	rev	$i3,$i3
648238384Sjkim#endif
649238384Sjkim	str	$i2,[$key],#8
650238384Sjkim	str	$i3,[$key,#-4]
651238384Sjkim#endif
652238384Sjkim
653238384Sjkim	mov	$rounds,#14
654238384Sjkim	str	$rounds,[$key,#240-32]
655238384Sjkim	add	$t3,$tbl,#256			@ rcon
656238384Sjkim	mov	lr,#255
657238384Sjkim	mov	$rounds,#7
658238384Sjkim
659238384Sjkim.L256_loop:
660238384Sjkim	and	$t2,lr,$i3,lsr#24
661238384Sjkim	and	$i1,lr,$i3,lsr#16
662238384Sjkim	ldrb	$t2,[$tbl,$t2]
663238384Sjkim	and	$i2,lr,$i3,lsr#8
664238384Sjkim	ldrb	$i1,[$tbl,$i1]
665238384Sjkim	and	$i3,lr,$i3
666238384Sjkim	ldrb	$i2,[$tbl,$i2]
667238384Sjkim	orr	$t2,$t2,$i1,lsl#24
668238384Sjkim	ldrb	$i3,[$tbl,$i3]
669238384Sjkim	orr	$t2,$t2,$i2,lsl#16
670238384Sjkim	ldr	$t1,[$t3],#4			@ rcon[i++]
671238384Sjkim	orr	$t2,$t2,$i3,lsl#8
672238384Sjkim	eor	$i3,$t2,$t1
673238384Sjkim	eor	$s0,$s0,$i3			@ rk[8]=rk[0]^...
674238384Sjkim	eor	$s1,$s1,$s0			@ rk[9]=rk[1]^rk[8]
675238384Sjkim	str	$s0,[$key],#32
676238384Sjkim	eor	$s2,$s2,$s1			@ rk[10]=rk[2]^rk[9]
677238384Sjkim	str	$s1,[$key,#-28]
678238384Sjkim	eor	$s3,$s3,$s2			@ rk[11]=rk[3]^rk[10]
679238384Sjkim	str	$s2,[$key,#-24]
680238384Sjkim	subs	$rounds,$rounds,#1
681238384Sjkim	str	$s3,[$key,#-20]
682290207Sjkim#if __ARM_ARCH__>=7
683290207Sjkim	itt	eq				@ Thumb2 thing, sanity check in ARM
684290207Sjkim#endif
685238384Sjkim	subeq	r2,$key,#256
686238384Sjkim	beq	.Ldone
687238384Sjkim
688238384Sjkim	and	$t2,lr,$s3
689238384Sjkim	and	$i1,lr,$s3,lsr#8
690238384Sjkim	ldrb	$t2,[$tbl,$t2]
691238384Sjkim	and	$i2,lr,$s3,lsr#16
692238384Sjkim	ldrb	$i1,[$tbl,$i1]
693238384Sjkim	and	$i3,lr,$s3,lsr#24
694238384Sjkim	ldrb	$i2,[$tbl,$i2]
695238384Sjkim	orr	$t2,$t2,$i1,lsl#8
696238384Sjkim	ldrb	$i3,[$tbl,$i3]
697238384Sjkim	orr	$t2,$t2,$i2,lsl#16
698238384Sjkim	ldr	$t1,[$key,#-48]
699238384Sjkim	orr	$t2,$t2,$i3,lsl#24
700238384Sjkim
701238384Sjkim	ldr	$i1,[$key,#-44]
702238384Sjkim	ldr	$i2,[$key,#-40]
703238384Sjkim	eor	$t1,$t1,$t2			@ rk[12]=rk[4]^...
704238384Sjkim	ldr	$i3,[$key,#-36]
705238384Sjkim	eor	$i1,$i1,$t1			@ rk[13]=rk[5]^rk[12]
706238384Sjkim	str	$t1,[$key,#-16]
707238384Sjkim	eor	$i2,$i2,$i1			@ rk[14]=rk[6]^rk[13]
708238384Sjkim	str	$i1,[$key,#-12]
709238384Sjkim	eor	$i3,$i3,$i2			@ rk[15]=rk[7]^rk[14]
710238384Sjkim	str	$i2,[$key,#-8]
711238384Sjkim	str	$i3,[$key,#-4]
712238384Sjkim	b	.L256_loop
713238384Sjkim
714290207Sjkim.align	2
715238384Sjkim.Ldone:	mov	r0,#0
716238384Sjkim	ldmia   sp!,{r4-r12,lr}
717290207Sjkim.Labrt:
718290207Sjkim#if __ARM_ARCH__>=5
719290207Sjkim	ret				@ bx lr
720290207Sjkim#else
721290207Sjkim	tst	lr,#1
722238384Sjkim	moveq	pc,lr			@ be binary compatible with V4, yet
723238384Sjkim	bx	lr			@ interoperable with Thumb ISA:-)
724290207Sjkim#endif
725238384Sjkim.size	private_AES_set_encrypt_key,.-private_AES_set_encrypt_key
726238384Sjkim
727238384Sjkim.global private_AES_set_decrypt_key
728238384Sjkim.type   private_AES_set_decrypt_key,%function
729238384Sjkim.align	5
730238384Sjkimprivate_AES_set_decrypt_key:
731238384Sjkim	str	lr,[sp,#-4]!            @ push lr
732238384Sjkim	bl	_armv4_AES_set_encrypt_key
733238384Sjkim	teq	r0,#0
734290207Sjkim	ldr	lr,[sp],#4              @ pop lr
735238384Sjkim	bne	.Labrt
736238384Sjkim
737290207Sjkim	mov	r0,r2			@ AES_set_encrypt_key preserves r2,
738290207Sjkim	mov	r1,r2			@ which is AES_KEY *key
739290207Sjkim	b	_armv4_AES_set_enc2dec_key
740290207Sjkim.size	private_AES_set_decrypt_key,.-private_AES_set_decrypt_key
741238384Sjkim
742290207Sjkim@ void AES_set_enc2dec_key(const AES_KEY *inp,AES_KEY *out)
743290207Sjkim.global	AES_set_enc2dec_key
744290207Sjkim.type	AES_set_enc2dec_key,%function
745290207Sjkim.align	5
746290207SjkimAES_set_enc2dec_key:
747290207Sjkim_armv4_AES_set_enc2dec_key:
748290207Sjkim	stmdb   sp!,{r4-r12,lr}
749238384Sjkim
750290207Sjkim	ldr	$rounds,[r0,#240]
751290207Sjkim	mov	$i1,r0			@ input
752290207Sjkim	add	$i2,r0,$rounds,lsl#4
753290207Sjkim	mov	$key,r1			@ ouput
754290207Sjkim	add	$tbl,r1,$rounds,lsl#4
755290207Sjkim	str	$rounds,[r1,#240]
756290207Sjkim
757290207Sjkim.Linv:	ldr	$s0,[$i1],#16
758290207Sjkim	ldr	$s1,[$i1,#-12]
759290207Sjkim	ldr	$s2,[$i1,#-8]
760290207Sjkim	ldr	$s3,[$i1,#-4]
761290207Sjkim	ldr	$t1,[$i2],#-16
762290207Sjkim	ldr	$t2,[$i2,#16+4]
763290207Sjkim	ldr	$t3,[$i2,#16+8]
764290207Sjkim	ldr	$i3,[$i2,#16+12]
765290207Sjkim	str	$s0,[$tbl],#-16
766290207Sjkim	str	$s1,[$tbl,#16+4]
767290207Sjkim	str	$s2,[$tbl,#16+8]
768290207Sjkim	str	$s3,[$tbl,#16+12]
769290207Sjkim	str	$t1,[$key],#16
770290207Sjkim	str	$t2,[$key,#-12]
771290207Sjkim	str	$t3,[$key,#-8]
772290207Sjkim	str	$i3,[$key,#-4]
773290207Sjkim	teq	$i1,$i2
774290207Sjkim	bne	.Linv
775290207Sjkim
776290207Sjkim	ldr	$s0,[$i1]
777238384Sjkim	ldr	$s1,[$i1,#4]
778238384Sjkim	ldr	$s2,[$i1,#8]
779238384Sjkim	ldr	$s3,[$i1,#12]
780290207Sjkim	str	$s0,[$key]
781290207Sjkim	str	$s1,[$key,#4]
782290207Sjkim	str	$s2,[$key,#8]
783290207Sjkim	str	$s3,[$key,#12]
784290207Sjkim	sub	$key,$key,$rounds,lsl#3
785238384Sjkim___
786238384Sjkim$mask80=$i1;
787238384Sjkim$mask1b=$i2;
788238384Sjkim$mask7f=$i3;
789238384Sjkim$code.=<<___;
790238384Sjkim	ldr	$s0,[$key,#16]!		@ prefetch tp1
791238384Sjkim	mov	$mask80,#0x80
792238384Sjkim	mov	$mask1b,#0x1b
793238384Sjkim	orr	$mask80,$mask80,#0x8000
794238384Sjkim	orr	$mask1b,$mask1b,#0x1b00
795238384Sjkim	orr	$mask80,$mask80,$mask80,lsl#16
796238384Sjkim	orr	$mask1b,$mask1b,$mask1b,lsl#16
797238384Sjkim	sub	$rounds,$rounds,#1
798238384Sjkim	mvn	$mask7f,$mask80
799238384Sjkim	mov	$rounds,$rounds,lsl#2	@ (rounds-1)*4
800238384Sjkim
801238384Sjkim.Lmix:	and	$t1,$s0,$mask80
802238384Sjkim	and	$s1,$s0,$mask7f
803238384Sjkim	sub	$t1,$t1,$t1,lsr#7
804238384Sjkim	and	$t1,$t1,$mask1b
805238384Sjkim	eor	$s1,$t1,$s1,lsl#1	@ tp2
806238384Sjkim
807238384Sjkim	and	$t1,$s1,$mask80
808238384Sjkim	and	$s2,$s1,$mask7f
809238384Sjkim	sub	$t1,$t1,$t1,lsr#7
810238384Sjkim	and	$t1,$t1,$mask1b
811238384Sjkim	eor	$s2,$t1,$s2,lsl#1	@ tp4
812238384Sjkim
813238384Sjkim	and	$t1,$s2,$mask80
814238384Sjkim	and	$s3,$s2,$mask7f
815238384Sjkim	sub	$t1,$t1,$t1,lsr#7
816238384Sjkim	and	$t1,$t1,$mask1b
817238384Sjkim	eor	$s3,$t1,$s3,lsl#1	@ tp8
818238384Sjkim
819238384Sjkim	eor	$t1,$s1,$s2
820238384Sjkim	eor	$t2,$s0,$s3		@ tp9
821238384Sjkim	eor	$t1,$t1,$s3		@ tpe
822238384Sjkim	eor	$t1,$t1,$s1,ror#24
823238384Sjkim	eor	$t1,$t1,$t2,ror#24	@ ^= ROTATE(tpb=tp9^tp2,8)
824238384Sjkim	eor	$t1,$t1,$s2,ror#16
825238384Sjkim	eor	$t1,$t1,$t2,ror#16	@ ^= ROTATE(tpd=tp9^tp4,16)
826238384Sjkim	eor	$t1,$t1,$t2,ror#8	@ ^= ROTATE(tp9,24)
827238384Sjkim
828238384Sjkim	ldr	$s0,[$key,#4]		@ prefetch tp1
829238384Sjkim	str	$t1,[$key],#4
830238384Sjkim	subs	$rounds,$rounds,#1
831238384Sjkim	bne	.Lmix
832238384Sjkim
833238384Sjkim	mov	r0,#0
834238384Sjkim#if __ARM_ARCH__>=5
835238384Sjkim	ldmia	sp!,{r4-r12,pc}
836238384Sjkim#else
837238384Sjkim	ldmia   sp!,{r4-r12,lr}
838238384Sjkim	tst	lr,#1
839238384Sjkim	moveq	pc,lr			@ be binary compatible with V4, yet
840238384Sjkim	bx	lr			@ interoperable with Thumb ISA:-)
841238384Sjkim#endif
842290207Sjkim.size	AES_set_enc2dec_key,.-AES_set_enc2dec_key
843238384Sjkim
844238384Sjkim.type	AES_Td,%object
845238384Sjkim.align	5
846238384SjkimAES_Td:
847238384Sjkim.word	0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96
848238384Sjkim.word	0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393
849238384Sjkim.word	0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25
850238384Sjkim.word	0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f
851238384Sjkim.word	0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1
852238384Sjkim.word	0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6
853238384Sjkim.word	0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da
854238384Sjkim.word	0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844
855238384Sjkim.word	0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd
856238384Sjkim.word	0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4
857238384Sjkim.word	0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45
858238384Sjkim.word	0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94
859238384Sjkim.word	0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7
860238384Sjkim.word	0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a
861238384Sjkim.word	0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5
862238384Sjkim.word	0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c
863238384Sjkim.word	0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1
864238384Sjkim.word	0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a
865238384Sjkim.word	0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75
866238384Sjkim.word	0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051
867238384Sjkim.word	0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46
868238384Sjkim.word	0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff
869238384Sjkim.word	0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77
870238384Sjkim.word	0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb
871238384Sjkim.word	0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000
872238384Sjkim.word	0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e
873238384Sjkim.word	0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927
874238384Sjkim.word	0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a
875238384Sjkim.word	0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e
876238384Sjkim.word	0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16
877238384Sjkim.word	0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d
878238384Sjkim.word	0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8
879238384Sjkim.word	0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd
880238384Sjkim.word	0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34
881238384Sjkim.word	0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163
882238384Sjkim.word	0xd731dcca, 0x42638510, 0x13972240, 0x84c61120
883238384Sjkim.word	0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d
884238384Sjkim.word	0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0
885238384Sjkim.word	0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422
886238384Sjkim.word	0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef
887238384Sjkim.word	0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36
888238384Sjkim.word	0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4
889238384Sjkim.word	0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662
890238384Sjkim.word	0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5
891238384Sjkim.word	0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3
892238384Sjkim.word	0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b
893238384Sjkim.word	0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8
894238384Sjkim.word	0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6
895238384Sjkim.word	0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6
896238384Sjkim.word	0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0
897238384Sjkim.word	0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815
898238384Sjkim.word	0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f
899238384Sjkim.word	0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df
900238384Sjkim.word	0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f
901238384Sjkim.word	0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e
902238384Sjkim.word	0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713
903238384Sjkim.word	0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89
904238384Sjkim.word	0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c
905238384Sjkim.word	0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf
906238384Sjkim.word	0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86
907238384Sjkim.word	0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f
908238384Sjkim.word	0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541
909238384Sjkim.word	0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190
910238384Sjkim.word	0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742
911238384Sjkim@ Td4[256]
912238384Sjkim.byte	0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38
913238384Sjkim.byte	0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb
914238384Sjkim.byte	0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87
915238384Sjkim.byte	0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb
916238384Sjkim.byte	0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d
917238384Sjkim.byte	0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e
918238384Sjkim.byte	0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2
919238384Sjkim.byte	0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25
920238384Sjkim.byte	0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16
921238384Sjkim.byte	0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92
922238384Sjkim.byte	0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda
923238384Sjkim.byte	0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84
924238384Sjkim.byte	0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a
925238384Sjkim.byte	0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06
926238384Sjkim.byte	0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02
927238384Sjkim.byte	0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b
928238384Sjkim.byte	0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea
929238384Sjkim.byte	0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73
930238384Sjkim.byte	0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85
931238384Sjkim.byte	0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e
932238384Sjkim.byte	0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89
933238384Sjkim.byte	0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b
934238384Sjkim.byte	0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20
935238384Sjkim.byte	0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4
936238384Sjkim.byte	0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31
937238384Sjkim.byte	0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f
938238384Sjkim.byte	0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d
939238384Sjkim.byte	0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef
940238384Sjkim.byte	0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0
941238384Sjkim.byte	0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61
942238384Sjkim.byte	0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26
943238384Sjkim.byte	0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d
944238384Sjkim.size	AES_Td,.-AES_Td
945238384Sjkim
946238384Sjkim@ void AES_decrypt(const unsigned char *in, unsigned char *out,
947238384Sjkim@ 		 const AES_KEY *key) {
948238384Sjkim.global AES_decrypt
949238384Sjkim.type   AES_decrypt,%function
950238384Sjkim.align	5
951238384SjkimAES_decrypt:
952290207Sjkim#if __ARM_ARCH__<7
953238384Sjkim	sub	r3,pc,#8		@ AES_decrypt
954290207Sjkim#else
955326663Sjkim	adr	r3,.
956290207Sjkim#endif
957238384Sjkim	stmdb   sp!,{r1,r4-r12,lr}
958238384Sjkim	mov	$rounds,r0		@ inp
959238384Sjkim	mov	$key,r2
960238384Sjkim	sub	$tbl,r3,#AES_decrypt-AES_Td		@ Td
961238384Sjkim#if __ARM_ARCH__<7
962238384Sjkim	ldrb	$s0,[$rounds,#3]	@ load input data in endian-neutral
963238384Sjkim	ldrb	$t1,[$rounds,#2]	@ manner...
964238384Sjkim	ldrb	$t2,[$rounds,#1]
965238384Sjkim	ldrb	$t3,[$rounds,#0]
966238384Sjkim	orr	$s0,$s0,$t1,lsl#8
967238384Sjkim	ldrb	$s1,[$rounds,#7]
968238384Sjkim	orr	$s0,$s0,$t2,lsl#16
969238384Sjkim	ldrb	$t1,[$rounds,#6]
970238384Sjkim	orr	$s0,$s0,$t3,lsl#24
971238384Sjkim	ldrb	$t2,[$rounds,#5]
972238384Sjkim	ldrb	$t3,[$rounds,#4]
973238384Sjkim	orr	$s1,$s1,$t1,lsl#8
974238384Sjkim	ldrb	$s2,[$rounds,#11]
975238384Sjkim	orr	$s1,$s1,$t2,lsl#16
976238384Sjkim	ldrb	$t1,[$rounds,#10]
977238384Sjkim	orr	$s1,$s1,$t3,lsl#24
978238384Sjkim	ldrb	$t2,[$rounds,#9]
979238384Sjkim	ldrb	$t3,[$rounds,#8]
980238384Sjkim	orr	$s2,$s2,$t1,lsl#8
981238384Sjkim	ldrb	$s3,[$rounds,#15]
982238384Sjkim	orr	$s2,$s2,$t2,lsl#16
983238384Sjkim	ldrb	$t1,[$rounds,#14]
984238384Sjkim	orr	$s2,$s2,$t3,lsl#24
985238384Sjkim	ldrb	$t2,[$rounds,#13]
986238384Sjkim	ldrb	$t3,[$rounds,#12]
987238384Sjkim	orr	$s3,$s3,$t1,lsl#8
988238384Sjkim	orr	$s3,$s3,$t2,lsl#16
989238384Sjkim	orr	$s3,$s3,$t3,lsl#24
990238384Sjkim#else
991238384Sjkim	ldr	$s0,[$rounds,#0]
992238384Sjkim	ldr	$s1,[$rounds,#4]
993238384Sjkim	ldr	$s2,[$rounds,#8]
994238384Sjkim	ldr	$s3,[$rounds,#12]
995238384Sjkim#ifdef __ARMEL__
996238384Sjkim	rev	$s0,$s0
997238384Sjkim	rev	$s1,$s1
998238384Sjkim	rev	$s2,$s2
999238384Sjkim	rev	$s3,$s3
1000238384Sjkim#endif
1001238384Sjkim#endif
1002238384Sjkim	bl	_armv4_AES_decrypt
1003238384Sjkim
1004238384Sjkim	ldr	$rounds,[sp],#4		@ pop out
1005238384Sjkim#if __ARM_ARCH__>=7
1006238384Sjkim#ifdef __ARMEL__
1007238384Sjkim	rev	$s0,$s0
1008238384Sjkim	rev	$s1,$s1
1009238384Sjkim	rev	$s2,$s2
1010238384Sjkim	rev	$s3,$s3
1011238384Sjkim#endif
1012238384Sjkim	str	$s0,[$rounds,#0]
1013238384Sjkim	str	$s1,[$rounds,#4]
1014238384Sjkim	str	$s2,[$rounds,#8]
1015238384Sjkim	str	$s3,[$rounds,#12]
1016238384Sjkim#else
1017238384Sjkim	mov	$t1,$s0,lsr#24		@ write output in endian-neutral
1018238384Sjkim	mov	$t2,$s0,lsr#16		@ manner...
1019238384Sjkim	mov	$t3,$s0,lsr#8
1020238384Sjkim	strb	$t1,[$rounds,#0]
1021238384Sjkim	strb	$t2,[$rounds,#1]
1022238384Sjkim	mov	$t1,$s1,lsr#24
1023238384Sjkim	strb	$t3,[$rounds,#2]
1024238384Sjkim	mov	$t2,$s1,lsr#16
1025238384Sjkim	strb	$s0,[$rounds,#3]
1026238384Sjkim	mov	$t3,$s1,lsr#8
1027238384Sjkim	strb	$t1,[$rounds,#4]
1028238384Sjkim	strb	$t2,[$rounds,#5]
1029238384Sjkim	mov	$t1,$s2,lsr#24
1030238384Sjkim	strb	$t3,[$rounds,#6]
1031238384Sjkim	mov	$t2,$s2,lsr#16
1032238384Sjkim	strb	$s1,[$rounds,#7]
1033238384Sjkim	mov	$t3,$s2,lsr#8
1034238384Sjkim	strb	$t1,[$rounds,#8]
1035238384Sjkim	strb	$t2,[$rounds,#9]
1036238384Sjkim	mov	$t1,$s3,lsr#24
1037238384Sjkim	strb	$t3,[$rounds,#10]
1038238384Sjkim	mov	$t2,$s3,lsr#16
1039238384Sjkim	strb	$s2,[$rounds,#11]
1040238384Sjkim	mov	$t3,$s3,lsr#8
1041238384Sjkim	strb	$t1,[$rounds,#12]
1042238384Sjkim	strb	$t2,[$rounds,#13]
1043238384Sjkim	strb	$t3,[$rounds,#14]
1044238384Sjkim	strb	$s3,[$rounds,#15]
1045238384Sjkim#endif
1046238384Sjkim#if __ARM_ARCH__>=5
1047238384Sjkim	ldmia	sp!,{r4-r12,pc}
1048238384Sjkim#else
1049238384Sjkim	ldmia   sp!,{r4-r12,lr}
1050238384Sjkim	tst	lr,#1
1051238384Sjkim	moveq	pc,lr			@ be binary compatible with V4, yet
1052238384Sjkim	bx	lr			@ interoperable with Thumb ISA:-)
1053238384Sjkim#endif
1054238384Sjkim.size	AES_decrypt,.-AES_decrypt
1055238384Sjkim
1056238384Sjkim.type   _armv4_AES_decrypt,%function
1057238384Sjkim.align	2
1058238384Sjkim_armv4_AES_decrypt:
1059238384Sjkim	str	lr,[sp,#-4]!		@ push lr
1060238384Sjkim	ldmia	$key!,{$t1-$i1}
1061238384Sjkim	eor	$s0,$s0,$t1
1062238384Sjkim	ldr	$rounds,[$key,#240-16]
1063238384Sjkim	eor	$s1,$s1,$t2
1064238384Sjkim	eor	$s2,$s2,$t3
1065238384Sjkim	eor	$s3,$s3,$i1
1066238384Sjkim	sub	$rounds,$rounds,#1
1067238384Sjkim	mov	lr,#255
1068238384Sjkim
1069238384Sjkim	and	$i1,lr,$s0,lsr#16
1070238384Sjkim	and	$i2,lr,$s0,lsr#8
1071238384Sjkim	and	$i3,lr,$s0
1072238384Sjkim	mov	$s0,$s0,lsr#24
1073238384Sjkim.Ldec_loop:
1074238384Sjkim	ldr	$t1,[$tbl,$i1,lsl#2]	@ Td1[s0>>16]
1075238384Sjkim	and	$i1,lr,$s1		@ i0
1076238384Sjkim	ldr	$t2,[$tbl,$i2,lsl#2]	@ Td2[s0>>8]
1077238384Sjkim	and	$i2,lr,$s1,lsr#16
1078238384Sjkim	ldr	$t3,[$tbl,$i3,lsl#2]	@ Td3[s0>>0]
1079238384Sjkim	and	$i3,lr,$s1,lsr#8
1080238384Sjkim	ldr	$s0,[$tbl,$s0,lsl#2]	@ Td0[s0>>24]
1081238384Sjkim	mov	$s1,$s1,lsr#24
1082238384Sjkim
1083238384Sjkim	ldr	$i1,[$tbl,$i1,lsl#2]	@ Td3[s1>>0]
1084238384Sjkim	ldr	$i2,[$tbl,$i2,lsl#2]	@ Td1[s1>>16]
1085238384Sjkim	ldr	$i3,[$tbl,$i3,lsl#2]	@ Td2[s1>>8]
1086238384Sjkim	eor	$s0,$s0,$i1,ror#24
1087238384Sjkim	ldr	$s1,[$tbl,$s1,lsl#2]	@ Td0[s1>>24]
1088238384Sjkim	and	$i1,lr,$s2,lsr#8	@ i0
1089238384Sjkim	eor	$t2,$i2,$t2,ror#8
1090238384Sjkim	and	$i2,lr,$s2		@ i1
1091238384Sjkim	eor	$t3,$i3,$t3,ror#8
1092238384Sjkim	and	$i3,lr,$s2,lsr#16
1093238384Sjkim	ldr	$i1,[$tbl,$i1,lsl#2]	@ Td2[s2>>8]
1094238384Sjkim	eor	$s1,$s1,$t1,ror#8
1095238384Sjkim	ldr	$i2,[$tbl,$i2,lsl#2]	@ Td3[s2>>0]
1096238384Sjkim	mov	$s2,$s2,lsr#24
1097238384Sjkim
1098238384Sjkim	ldr	$i3,[$tbl,$i3,lsl#2]	@ Td1[s2>>16]
1099238384Sjkim	eor	$s0,$s0,$i1,ror#16
1100238384Sjkim	ldr	$s2,[$tbl,$s2,lsl#2]	@ Td0[s2>>24]
1101238384Sjkim	and	$i1,lr,$s3,lsr#16	@ i0
1102238384Sjkim	eor	$s1,$s1,$i2,ror#24
1103238384Sjkim	and	$i2,lr,$s3,lsr#8	@ i1
1104238384Sjkim	eor	$t3,$i3,$t3,ror#8
1105238384Sjkim	and	$i3,lr,$s3		@ i2
1106238384Sjkim	ldr	$i1,[$tbl,$i1,lsl#2]	@ Td1[s3>>16]
1107238384Sjkim	eor	$s2,$s2,$t2,ror#8
1108238384Sjkim	ldr	$i2,[$tbl,$i2,lsl#2]	@ Td2[s3>>8]
1109238384Sjkim	mov	$s3,$s3,lsr#24
1110238384Sjkim
1111238384Sjkim	ldr	$i3,[$tbl,$i3,lsl#2]	@ Td3[s3>>0]
1112238384Sjkim	eor	$s0,$s0,$i1,ror#8
1113238384Sjkim	ldr	$i1,[$key],#16
1114238384Sjkim	eor	$s1,$s1,$i2,ror#16
1115238384Sjkim	ldr	$s3,[$tbl,$s3,lsl#2]	@ Td0[s3>>24]
1116238384Sjkim	eor	$s2,$s2,$i3,ror#24
1117238384Sjkim
1118238384Sjkim	ldr	$t1,[$key,#-12]
1119238384Sjkim	eor	$s0,$s0,$i1
1120238384Sjkim	ldr	$t2,[$key,#-8]
1121238384Sjkim	eor	$s3,$s3,$t3,ror#8
1122238384Sjkim	ldr	$t3,[$key,#-4]
1123238384Sjkim	and	$i1,lr,$s0,lsr#16
1124238384Sjkim	eor	$s1,$s1,$t1
1125238384Sjkim	and	$i2,lr,$s0,lsr#8
1126238384Sjkim	eor	$s2,$s2,$t2
1127238384Sjkim	and	$i3,lr,$s0
1128238384Sjkim	eor	$s3,$s3,$t3
1129238384Sjkim	mov	$s0,$s0,lsr#24
1130238384Sjkim
1131238384Sjkim	subs	$rounds,$rounds,#1
1132238384Sjkim	bne	.Ldec_loop
1133238384Sjkim
1134238384Sjkim	add	$tbl,$tbl,#1024
1135238384Sjkim
1136238384Sjkim	ldr	$t2,[$tbl,#0]		@ prefetch Td4
1137238384Sjkim	ldr	$t3,[$tbl,#32]
1138238384Sjkim	ldr	$t1,[$tbl,#64]
1139238384Sjkim	ldr	$t2,[$tbl,#96]
1140238384Sjkim	ldr	$t3,[$tbl,#128]
1141238384Sjkim	ldr	$t1,[$tbl,#160]
1142238384Sjkim	ldr	$t2,[$tbl,#192]
1143238384Sjkim	ldr	$t3,[$tbl,#224]
1144238384Sjkim
1145238384Sjkim	ldrb	$s0,[$tbl,$s0]		@ Td4[s0>>24]
1146238384Sjkim	ldrb	$t1,[$tbl,$i1]		@ Td4[s0>>16]
1147238384Sjkim	and	$i1,lr,$s1		@ i0
1148238384Sjkim	ldrb	$t2,[$tbl,$i2]		@ Td4[s0>>8]
1149238384Sjkim	and	$i2,lr,$s1,lsr#16
1150238384Sjkim	ldrb	$t3,[$tbl,$i3]		@ Td4[s0>>0]
1151238384Sjkim	and	$i3,lr,$s1,lsr#8
1152238384Sjkim
1153290207Sjkim	add	$s1,$tbl,$s1,lsr#24
1154238384Sjkim	ldrb	$i1,[$tbl,$i1]		@ Td4[s1>>0]
1155290207Sjkim	ldrb	$s1,[$s1]		@ Td4[s1>>24]
1156238384Sjkim	ldrb	$i2,[$tbl,$i2]		@ Td4[s1>>16]
1157238384Sjkim	eor	$s0,$i1,$s0,lsl#24
1158238384Sjkim	ldrb	$i3,[$tbl,$i3]		@ Td4[s1>>8]
1159238384Sjkim	eor	$s1,$t1,$s1,lsl#8
1160238384Sjkim	and	$i1,lr,$s2,lsr#8	@ i0
1161238384Sjkim	eor	$t2,$t2,$i2,lsl#8
1162238384Sjkim	and	$i2,lr,$s2		@ i1
1163238384Sjkim	ldrb	$i1,[$tbl,$i1]		@ Td4[s2>>8]
1164238384Sjkim	eor	$t3,$t3,$i3,lsl#8
1165238384Sjkim	ldrb	$i2,[$tbl,$i2]		@ Td4[s2>>0]
1166238384Sjkim	and	$i3,lr,$s2,lsr#16
1167238384Sjkim
1168290207Sjkim	add	$s2,$tbl,$s2,lsr#24
1169290207Sjkim	ldrb	$s2,[$s2]		@ Td4[s2>>24]
1170238384Sjkim	eor	$s0,$s0,$i1,lsl#8
1171238384Sjkim	ldrb	$i3,[$tbl,$i3]		@ Td4[s2>>16]
1172238384Sjkim	eor	$s1,$i2,$s1,lsl#16
1173238384Sjkim	and	$i1,lr,$s3,lsr#16	@ i0
1174238384Sjkim	eor	$s2,$t2,$s2,lsl#16
1175238384Sjkim	and	$i2,lr,$s3,lsr#8	@ i1
1176238384Sjkim	ldrb	$i1,[$tbl,$i1]		@ Td4[s3>>16]
1177238384Sjkim	eor	$t3,$t3,$i3,lsl#16
1178238384Sjkim	ldrb	$i2,[$tbl,$i2]		@ Td4[s3>>8]
1179238384Sjkim	and	$i3,lr,$s3		@ i2
1180238384Sjkim
1181290207Sjkim	add	$s3,$tbl,$s3,lsr#24
1182238384Sjkim	ldrb	$i3,[$tbl,$i3]		@ Td4[s3>>0]
1183290207Sjkim	ldrb	$s3,[$s3]		@ Td4[s3>>24]
1184238384Sjkim	eor	$s0,$s0,$i1,lsl#16
1185238384Sjkim	ldr	$i1,[$key,#0]
1186238384Sjkim	eor	$s1,$s1,$i2,lsl#8
1187238384Sjkim	ldr	$t1,[$key,#4]
1188238384Sjkim	eor	$s2,$i3,$s2,lsl#8
1189238384Sjkim	ldr	$t2,[$key,#8]
1190238384Sjkim	eor	$s3,$t3,$s3,lsl#24
1191238384Sjkim	ldr	$t3,[$key,#12]
1192238384Sjkim
1193238384Sjkim	eor	$s0,$s0,$i1
1194238384Sjkim	eor	$s1,$s1,$t1
1195238384Sjkim	eor	$s2,$s2,$t2
1196238384Sjkim	eor	$s3,$s3,$t3
1197238384Sjkim
1198238384Sjkim	sub	$tbl,$tbl,#1024
1199238384Sjkim	ldr	pc,[sp],#4		@ pop and return
1200238384Sjkim.size	_armv4_AES_decrypt,.-_armv4_AES_decrypt
1201238384Sjkim.asciz	"AES for ARMv4, CRYPTOGAMS by <appro\@openssl.org>"
1202238384Sjkim.align	2
1203238384Sjkim___
1204238384Sjkim
1205238384Sjkim$code =~ s/\bbx\s+lr\b/.word\t0xe12fff1e/gm;	# make it possible to compile with -march=armv4
1206290207Sjkim$code =~ s/\bret\b/bx\tlr/gm;
1207290207Sjkim
1208290207Sjkimopen SELF,$0;
1209290207Sjkimwhile(<SELF>) {
1210290207Sjkim	next if (/^#!/);
1211290207Sjkim	last if (!s/^#/@/ and !/^$/);
1212290207Sjkim	print;
1213290207Sjkim}
1214290207Sjkimclose SELF;
1215290207Sjkim
1216238384Sjkimprint $code;
1217238384Sjkimclose STDOUT;	# enforce flush
1218