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