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