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