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