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