1238384Sjkim#!/usr/bin/env perl 2238384Sjkim 3238384Sjkim# ==================================================================== 4290207Sjkim# Written by Andy Polyakov <appro@openssl.org> for the OpenSSL 5238384Sjkim# project. The module is, however, dual licensed under OpenSSL and 6238384Sjkim# CRYPTOGAMS licenses depending on where you obtain it. For further 7238384Sjkim# details see http://www.openssl.org/~appro/cryptogams/. 8238384Sjkim# ==================================================================== 9238384Sjkim 10238384Sjkim# AES for ARMv4 11238384Sjkim 12238384Sjkim# January 2007. 13238384Sjkim# 14238384Sjkim# Code uses single 1K S-box and is >2 times faster than code generated 15238384Sjkim# by gcc-3.4.1. This is thanks to unique feature of ARMv4 ISA, which 16238384Sjkim# allows to merge logical or arithmetic operation with shift or rotate 17238384Sjkim# in one instruction and emit combined result every cycle. The module 18238384Sjkim# is endian-neutral. The performance is ~42 cycles/byte for 128-bit 19238384Sjkim# key [on single-issue Xscale PXA250 core]. 20238384Sjkim 21238384Sjkim# May 2007. 22238384Sjkim# 23238384Sjkim# AES_set_[en|de]crypt_key is added. 24238384Sjkim 25238384Sjkim# July 2010. 26238384Sjkim# 27238384Sjkim# Rescheduling for dual-issue pipeline resulted in 12% improvement on 28238384Sjkim# Cortex A8 core and ~25 cycles per byte processed with 128-bit key. 29238384Sjkim 30238384Sjkim# February 2011. 31238384Sjkim# 32238384Sjkim# Profiler-assisted and platform-specific optimization resulted in 16% 33238384Sjkim# improvement on Cortex A8 core and ~21.5 cycles per byte. 34238384Sjkim 35238384Sjkimwhile (($output=shift) && ($output!~/^\w[\w\-]*\.\w+$/)) {} 36238384Sjkimopen STDOUT,">$output"; 37238384Sjkim 38238384Sjkim$s0="r0"; 39238384Sjkim$s1="r1"; 40238384Sjkim$s2="r2"; 41238384Sjkim$s3="r3"; 42238384Sjkim$t1="r4"; 43238384Sjkim$t2="r5"; 44238384Sjkim$t3="r6"; 45238384Sjkim$i1="r7"; 46238384Sjkim$i2="r8"; 47238384Sjkim$i3="r9"; 48238384Sjkim 49238384Sjkim$tbl="r10"; 50238384Sjkim$key="r11"; 51238384Sjkim$rounds="r12"; 52238384Sjkim 53238384Sjkim$code=<<___; 54290207Sjkim#ifndef __KERNEL__ 55290207Sjkim# include "arm_arch.h" 56290207Sjkim#else 57290207Sjkim# define __ARM_ARCH__ __LINUX_ARM_ARCH__ 58290207Sjkim#endif 59290207Sjkim 60238384Sjkim.text 61290207Sjkim#if __ARM_ARCH__<7 62238384Sjkim.code 32 63290207Sjkim#else 64290207Sjkim.syntax unified 65290207Sjkim# ifdef __thumb2__ 66290207Sjkim.thumb 67290207Sjkim# else 68290207Sjkim.code 32 69290207Sjkim# endif 70290207Sjkim#endif 71238384Sjkim 72238384Sjkim.type AES_Te,%object 73238384Sjkim.align 5 74238384SjkimAES_Te: 75238384Sjkim.word 0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d 76238384Sjkim.word 0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554 77238384Sjkim.word 0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d 78238384Sjkim.word 0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a 79238384Sjkim.word 0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87 80238384Sjkim.word 0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b 81238384Sjkim.word 0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea 82238384Sjkim.word 0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b 83238384Sjkim.word 0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a 84238384Sjkim.word 0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f 85238384Sjkim.word 0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108 86238384Sjkim.word 0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f 87238384Sjkim.word 0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e 88238384Sjkim.word 0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5 89238384Sjkim.word 0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d 90238384Sjkim.word 0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f 91238384Sjkim.word 0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e 92238384Sjkim.word 0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb 93238384Sjkim.word 0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce 94238384Sjkim.word 0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497 95238384Sjkim.word 0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c 96238384Sjkim.word 0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed 97238384Sjkim.word 0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b 98238384Sjkim.word 0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a 99238384Sjkim.word 0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16 100238384Sjkim.word 0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594 101238384Sjkim.word 0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81 102238384Sjkim.word 0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3 103238384Sjkim.word 0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a 104238384Sjkim.word 0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504 105238384Sjkim.word 0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163 106238384Sjkim.word 0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d 107238384Sjkim.word 0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f 108238384Sjkim.word 0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739 109238384Sjkim.word 0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47 110238384Sjkim.word 0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395 111238384Sjkim.word 0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f 112238384Sjkim.word 0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883 113238384Sjkim.word 0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c 114238384Sjkim.word 0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76 115238384Sjkim.word 0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e 116238384Sjkim.word 0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4 117238384Sjkim.word 0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6 118238384Sjkim.word 0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b 119238384Sjkim.word 0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7 120238384Sjkim.word 0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0 121238384Sjkim.word 0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25 122238384Sjkim.word 0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818 123238384Sjkim.word 0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72 124238384Sjkim.word 0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651 125238384Sjkim.word 0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21 126238384Sjkim.word 0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85 127238384Sjkim.word 0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa 128238384Sjkim.word 0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12 129238384Sjkim.word 0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0 130238384Sjkim.word 0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9 131238384Sjkim.word 0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133 132238384Sjkim.word 0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7 133238384Sjkim.word 0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920 134238384Sjkim.word 0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a 135238384Sjkim.word 0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17 136238384Sjkim.word 0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8 137238384Sjkim.word 0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11 138238384Sjkim.word 0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a 139238384Sjkim@ Te4[256] 140238384Sjkim.byte 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5 141238384Sjkim.byte 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76 142238384Sjkim.byte 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0 143238384Sjkim.byte 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0 144238384Sjkim.byte 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc 145238384Sjkim.byte 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15 146238384Sjkim.byte 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a 147238384Sjkim.byte 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75 148238384Sjkim.byte 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0 149238384Sjkim.byte 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84 150238384Sjkim.byte 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b 151238384Sjkim.byte 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf 152238384Sjkim.byte 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85 153238384Sjkim.byte 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8 154238384Sjkim.byte 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5 155238384Sjkim.byte 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2 156238384Sjkim.byte 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17 157238384Sjkim.byte 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73 158238384Sjkim.byte 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88 159238384Sjkim.byte 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb 160238384Sjkim.byte 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c 161238384Sjkim.byte 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79 162238384Sjkim.byte 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9 163238384Sjkim.byte 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08 164238384Sjkim.byte 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6 165238384Sjkim.byte 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a 166238384Sjkim.byte 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e 167238384Sjkim.byte 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e 168238384Sjkim.byte 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94 169238384Sjkim.byte 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf 170238384Sjkim.byte 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68 171238384Sjkim.byte 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 172238384Sjkim@ rcon[] 173238384Sjkim.word 0x01000000, 0x02000000, 0x04000000, 0x08000000 174238384Sjkim.word 0x10000000, 0x20000000, 0x40000000, 0x80000000 175238384Sjkim.word 0x1B000000, 0x36000000, 0, 0, 0, 0, 0, 0 176238384Sjkim.size AES_Te,.-AES_Te 177238384Sjkim 178238384Sjkim@ void AES_encrypt(const unsigned char *in, unsigned char *out, 179238384Sjkim@ const AES_KEY *key) { 180238384Sjkim.global AES_encrypt 181238384Sjkim.type AES_encrypt,%function 182238384Sjkim.align 5 183238384SjkimAES_encrypt: 184290207Sjkim#if __ARM_ARCH__<7 185238384Sjkim sub r3,pc,#8 @ AES_encrypt 186290207Sjkim#else 187326663Sjkim adr r3,. 188290207Sjkim#endif 189238384Sjkim stmdb sp!,{r1,r4-r12,lr} 190238384Sjkim mov $rounds,r0 @ inp 191238384Sjkim mov $key,r2 192238384Sjkim sub $tbl,r3,#AES_encrypt-AES_Te @ Te 193238384Sjkim#if __ARM_ARCH__<7 194238384Sjkim ldrb $s0,[$rounds,#3] @ load input data in endian-neutral 195238384Sjkim ldrb $t1,[$rounds,#2] @ manner... 196238384Sjkim ldrb $t2,[$rounds,#1] 197238384Sjkim ldrb $t3,[$rounds,#0] 198238384Sjkim orr $s0,$s0,$t1,lsl#8 199238384Sjkim ldrb $s1,[$rounds,#7] 200238384Sjkim orr $s0,$s0,$t2,lsl#16 201238384Sjkim ldrb $t1,[$rounds,#6] 202238384Sjkim orr $s0,$s0,$t3,lsl#24 203238384Sjkim ldrb $t2,[$rounds,#5] 204238384Sjkim ldrb $t3,[$rounds,#4] 205238384Sjkim orr $s1,$s1,$t1,lsl#8 206238384Sjkim ldrb $s2,[$rounds,#11] 207238384Sjkim orr $s1,$s1,$t2,lsl#16 208238384Sjkim ldrb $t1,[$rounds,#10] 209238384Sjkim orr $s1,$s1,$t3,lsl#24 210238384Sjkim ldrb $t2,[$rounds,#9] 211238384Sjkim ldrb $t3,[$rounds,#8] 212238384Sjkim orr $s2,$s2,$t1,lsl#8 213238384Sjkim ldrb $s3,[$rounds,#15] 214238384Sjkim orr $s2,$s2,$t2,lsl#16 215238384Sjkim ldrb $t1,[$rounds,#14] 216238384Sjkim orr $s2,$s2,$t3,lsl#24 217238384Sjkim ldrb $t2,[$rounds,#13] 218238384Sjkim ldrb $t3,[$rounds,#12] 219238384Sjkim orr $s3,$s3,$t1,lsl#8 220238384Sjkim orr $s3,$s3,$t2,lsl#16 221238384Sjkim orr $s3,$s3,$t3,lsl#24 222238384Sjkim#else 223238384Sjkim ldr $s0,[$rounds,#0] 224238384Sjkim ldr $s1,[$rounds,#4] 225238384Sjkim ldr $s2,[$rounds,#8] 226238384Sjkim ldr $s3,[$rounds,#12] 227238384Sjkim#ifdef __ARMEL__ 228238384Sjkim rev $s0,$s0 229238384Sjkim rev $s1,$s1 230238384Sjkim rev $s2,$s2 231238384Sjkim rev $s3,$s3 232238384Sjkim#endif 233238384Sjkim#endif 234238384Sjkim bl _armv4_AES_encrypt 235238384Sjkim 236238384Sjkim ldr $rounds,[sp],#4 @ pop out 237238384Sjkim#if __ARM_ARCH__>=7 238238384Sjkim#ifdef __ARMEL__ 239238384Sjkim rev $s0,$s0 240238384Sjkim rev $s1,$s1 241238384Sjkim rev $s2,$s2 242238384Sjkim rev $s3,$s3 243238384Sjkim#endif 244238384Sjkim str $s0,[$rounds,#0] 245238384Sjkim str $s1,[$rounds,#4] 246238384Sjkim str $s2,[$rounds,#8] 247238384Sjkim str $s3,[$rounds,#12] 248238384Sjkim#else 249238384Sjkim mov $t1,$s0,lsr#24 @ write output in endian-neutral 250238384Sjkim mov $t2,$s0,lsr#16 @ manner... 251238384Sjkim mov $t3,$s0,lsr#8 252238384Sjkim strb $t1,[$rounds,#0] 253238384Sjkim strb $t2,[$rounds,#1] 254238384Sjkim mov $t1,$s1,lsr#24 255238384Sjkim strb $t3,[$rounds,#2] 256238384Sjkim mov $t2,$s1,lsr#16 257238384Sjkim strb $s0,[$rounds,#3] 258238384Sjkim mov $t3,$s1,lsr#8 259238384Sjkim strb $t1,[$rounds,#4] 260238384Sjkim strb $t2,[$rounds,#5] 261238384Sjkim mov $t1,$s2,lsr#24 262238384Sjkim strb $t3,[$rounds,#6] 263238384Sjkim mov $t2,$s2,lsr#16 264238384Sjkim strb $s1,[$rounds,#7] 265238384Sjkim mov $t3,$s2,lsr#8 266238384Sjkim strb $t1,[$rounds,#8] 267238384Sjkim strb $t2,[$rounds,#9] 268238384Sjkim mov $t1,$s3,lsr#24 269238384Sjkim strb $t3,[$rounds,#10] 270238384Sjkim mov $t2,$s3,lsr#16 271238384Sjkim strb $s2,[$rounds,#11] 272238384Sjkim mov $t3,$s3,lsr#8 273238384Sjkim strb $t1,[$rounds,#12] 274238384Sjkim strb $t2,[$rounds,#13] 275238384Sjkim strb $t3,[$rounds,#14] 276238384Sjkim strb $s3,[$rounds,#15] 277238384Sjkim#endif 278238384Sjkim#if __ARM_ARCH__>=5 279238384Sjkim ldmia sp!,{r4-r12,pc} 280238384Sjkim#else 281238384Sjkim ldmia sp!,{r4-r12,lr} 282238384Sjkim tst lr,#1 283238384Sjkim moveq pc,lr @ be binary compatible with V4, yet 284238384Sjkim bx lr @ interoperable with Thumb ISA:-) 285238384Sjkim#endif 286238384Sjkim.size AES_encrypt,.-AES_encrypt 287238384Sjkim 288238384Sjkim.type _armv4_AES_encrypt,%function 289238384Sjkim.align 2 290238384Sjkim_armv4_AES_encrypt: 291238384Sjkim str lr,[sp,#-4]! @ push lr 292238384Sjkim ldmia $key!,{$t1-$i1} 293238384Sjkim eor $s0,$s0,$t1 294238384Sjkim ldr $rounds,[$key,#240-16] 295238384Sjkim eor $s1,$s1,$t2 296238384Sjkim eor $s2,$s2,$t3 297238384Sjkim eor $s3,$s3,$i1 298238384Sjkim sub $rounds,$rounds,#1 299238384Sjkim mov lr,#255 300238384Sjkim 301238384Sjkim and $i1,lr,$s0 302238384Sjkim and $i2,lr,$s0,lsr#8 303238384Sjkim and $i3,lr,$s0,lsr#16 304238384Sjkim mov $s0,$s0,lsr#24 305238384Sjkim.Lenc_loop: 306238384Sjkim ldr $t1,[$tbl,$i1,lsl#2] @ Te3[s0>>0] 307238384Sjkim and $i1,lr,$s1,lsr#16 @ i0 308238384Sjkim ldr $t2,[$tbl,$i2,lsl#2] @ Te2[s0>>8] 309238384Sjkim and $i2,lr,$s1 310238384Sjkim ldr $t3,[$tbl,$i3,lsl#2] @ Te1[s0>>16] 311238384Sjkim and $i3,lr,$s1,lsr#8 312238384Sjkim ldr $s0,[$tbl,$s0,lsl#2] @ Te0[s0>>24] 313238384Sjkim mov $s1,$s1,lsr#24 314238384Sjkim 315238384Sjkim ldr $i1,[$tbl,$i1,lsl#2] @ Te1[s1>>16] 316238384Sjkim ldr $i2,[$tbl,$i2,lsl#2] @ Te3[s1>>0] 317238384Sjkim ldr $i3,[$tbl,$i3,lsl#2] @ Te2[s1>>8] 318238384Sjkim eor $s0,$s0,$i1,ror#8 319238384Sjkim ldr $s1,[$tbl,$s1,lsl#2] @ Te0[s1>>24] 320238384Sjkim and $i1,lr,$s2,lsr#8 @ i0 321238384Sjkim eor $t2,$t2,$i2,ror#8 322238384Sjkim and $i2,lr,$s2,lsr#16 @ i1 323238384Sjkim eor $t3,$t3,$i3,ror#8 324238384Sjkim and $i3,lr,$s2 325238384Sjkim ldr $i1,[$tbl,$i1,lsl#2] @ Te2[s2>>8] 326238384Sjkim eor $s1,$s1,$t1,ror#24 327238384Sjkim ldr $i2,[$tbl,$i2,lsl#2] @ Te1[s2>>16] 328238384Sjkim mov $s2,$s2,lsr#24 329238384Sjkim 330238384Sjkim ldr $i3,[$tbl,$i3,lsl#2] @ Te3[s2>>0] 331238384Sjkim eor $s0,$s0,$i1,ror#16 332238384Sjkim ldr $s2,[$tbl,$s2,lsl#2] @ Te0[s2>>24] 333238384Sjkim and $i1,lr,$s3 @ i0 334238384Sjkim eor $s1,$s1,$i2,ror#8 335238384Sjkim and $i2,lr,$s3,lsr#8 @ i1 336238384Sjkim eor $t3,$t3,$i3,ror#16 337238384Sjkim and $i3,lr,$s3,lsr#16 @ i2 338238384Sjkim ldr $i1,[$tbl,$i1,lsl#2] @ Te3[s3>>0] 339238384Sjkim eor $s2,$s2,$t2,ror#16 340238384Sjkim ldr $i2,[$tbl,$i2,lsl#2] @ Te2[s3>>8] 341238384Sjkim mov $s3,$s3,lsr#24 342238384Sjkim 343238384Sjkim ldr $i3,[$tbl,$i3,lsl#2] @ Te1[s3>>16] 344238384Sjkim eor $s0,$s0,$i1,ror#24 345238384Sjkim ldr $i1,[$key],#16 346238384Sjkim eor $s1,$s1,$i2,ror#16 347238384Sjkim ldr $s3,[$tbl,$s3,lsl#2] @ Te0[s3>>24] 348238384Sjkim eor $s2,$s2,$i3,ror#8 349238384Sjkim ldr $t1,[$key,#-12] 350238384Sjkim eor $s3,$s3,$t3,ror#8 351238384Sjkim 352238384Sjkim ldr $t2,[$key,#-8] 353238384Sjkim eor $s0,$s0,$i1 354238384Sjkim ldr $t3,[$key,#-4] 355238384Sjkim and $i1,lr,$s0 356238384Sjkim eor $s1,$s1,$t1 357238384Sjkim and $i2,lr,$s0,lsr#8 358238384Sjkim eor $s2,$s2,$t2 359238384Sjkim and $i3,lr,$s0,lsr#16 360238384Sjkim eor $s3,$s3,$t3 361238384Sjkim mov $s0,$s0,lsr#24 362238384Sjkim 363238384Sjkim subs $rounds,$rounds,#1 364238384Sjkim bne .Lenc_loop 365238384Sjkim 366238384Sjkim add $tbl,$tbl,#2 367238384Sjkim 368238384Sjkim ldrb $t1,[$tbl,$i1,lsl#2] @ Te4[s0>>0] 369238384Sjkim and $i1,lr,$s1,lsr#16 @ i0 370238384Sjkim ldrb $t2,[$tbl,$i2,lsl#2] @ Te4[s0>>8] 371238384Sjkim and $i2,lr,$s1 372238384Sjkim ldrb $t3,[$tbl,$i3,lsl#2] @ Te4[s0>>16] 373238384Sjkim and $i3,lr,$s1,lsr#8 374238384Sjkim ldrb $s0,[$tbl,$s0,lsl#2] @ Te4[s0>>24] 375238384Sjkim mov $s1,$s1,lsr#24 376238384Sjkim 377238384Sjkim ldrb $i1,[$tbl,$i1,lsl#2] @ Te4[s1>>16] 378238384Sjkim ldrb $i2,[$tbl,$i2,lsl#2] @ Te4[s1>>0] 379238384Sjkim ldrb $i3,[$tbl,$i3,lsl#2] @ Te4[s1>>8] 380238384Sjkim eor $s0,$i1,$s0,lsl#8 381238384Sjkim ldrb $s1,[$tbl,$s1,lsl#2] @ Te4[s1>>24] 382238384Sjkim and $i1,lr,$s2,lsr#8 @ i0 383238384Sjkim eor $t2,$i2,$t2,lsl#8 384238384Sjkim and $i2,lr,$s2,lsr#16 @ i1 385238384Sjkim eor $t3,$i3,$t3,lsl#8 386238384Sjkim and $i3,lr,$s2 387238384Sjkim ldrb $i1,[$tbl,$i1,lsl#2] @ Te4[s2>>8] 388238384Sjkim eor $s1,$t1,$s1,lsl#24 389238384Sjkim ldrb $i2,[$tbl,$i2,lsl#2] @ Te4[s2>>16] 390238384Sjkim mov $s2,$s2,lsr#24 391238384Sjkim 392238384Sjkim ldrb $i3,[$tbl,$i3,lsl#2] @ Te4[s2>>0] 393238384Sjkim eor $s0,$i1,$s0,lsl#8 394238384Sjkim ldrb $s2,[$tbl,$s2,lsl#2] @ Te4[s2>>24] 395238384Sjkim and $i1,lr,$s3 @ i0 396238384Sjkim eor $s1,$s1,$i2,lsl#16 397238384Sjkim and $i2,lr,$s3,lsr#8 @ i1 398238384Sjkim eor $t3,$i3,$t3,lsl#8 399238384Sjkim and $i3,lr,$s3,lsr#16 @ i2 400238384Sjkim ldrb $i1,[$tbl,$i1,lsl#2] @ Te4[s3>>0] 401238384Sjkim eor $s2,$t2,$s2,lsl#24 402238384Sjkim ldrb $i2,[$tbl,$i2,lsl#2] @ Te4[s3>>8] 403238384Sjkim mov $s3,$s3,lsr#24 404238384Sjkim 405238384Sjkim ldrb $i3,[$tbl,$i3,lsl#2] @ Te4[s3>>16] 406238384Sjkim eor $s0,$i1,$s0,lsl#8 407238384Sjkim ldr $i1,[$key,#0] 408238384Sjkim ldrb $s3,[$tbl,$s3,lsl#2] @ Te4[s3>>24] 409238384Sjkim eor $s1,$s1,$i2,lsl#8 410238384Sjkim ldr $t1,[$key,#4] 411238384Sjkim eor $s2,$s2,$i3,lsl#16 412238384Sjkim ldr $t2,[$key,#8] 413238384Sjkim eor $s3,$t3,$s3,lsl#24 414238384Sjkim ldr $t3,[$key,#12] 415238384Sjkim 416238384Sjkim eor $s0,$s0,$i1 417238384Sjkim eor $s1,$s1,$t1 418238384Sjkim eor $s2,$s2,$t2 419238384Sjkim eor $s3,$s3,$t3 420238384Sjkim 421238384Sjkim sub $tbl,$tbl,#2 422238384Sjkim ldr pc,[sp],#4 @ pop and return 423238384Sjkim.size _armv4_AES_encrypt,.-_armv4_AES_encrypt 424238384Sjkim 425238384Sjkim.global private_AES_set_encrypt_key 426238384Sjkim.type private_AES_set_encrypt_key,%function 427238384Sjkim.align 5 428238384Sjkimprivate_AES_set_encrypt_key: 429238384Sjkim_armv4_AES_set_encrypt_key: 430290207Sjkim#if __ARM_ARCH__<7 431238384Sjkim sub r3,pc,#8 @ AES_set_encrypt_key 432290207Sjkim#else 433326663Sjkim adr r3,. 434290207Sjkim#endif 435238384Sjkim teq r0,#0 436290207Sjkim#if __ARM_ARCH__>=7 437290207Sjkim itt eq @ Thumb2 thing, sanity check in ARM 438290207Sjkim#endif 439238384Sjkim moveq r0,#-1 440238384Sjkim beq .Labrt 441238384Sjkim teq r2,#0 442290207Sjkim#if __ARM_ARCH__>=7 443290207Sjkim itt eq @ Thumb2 thing, sanity check in ARM 444290207Sjkim#endif 445238384Sjkim moveq r0,#-1 446238384Sjkim beq .Labrt 447238384Sjkim 448238384Sjkim teq r1,#128 449238384Sjkim beq .Lok 450238384Sjkim teq r1,#192 451238384Sjkim beq .Lok 452238384Sjkim teq r1,#256 453290207Sjkim#if __ARM_ARCH__>=7 454290207Sjkim itt ne @ Thumb2 thing, sanity check in ARM 455290207Sjkim#endif 456238384Sjkim movne r0,#-1 457238384Sjkim bne .Labrt 458238384Sjkim 459238384Sjkim.Lok: stmdb sp!,{r4-r12,lr} 460238384Sjkim sub $tbl,r3,#_armv4_AES_set_encrypt_key-AES_Te-1024 @ Te4 461238384Sjkim 462238384Sjkim mov $rounds,r0 @ inp 463238384Sjkim mov lr,r1 @ bits 464238384Sjkim mov $key,r2 @ key 465238384Sjkim 466238384Sjkim#if __ARM_ARCH__<7 467238384Sjkim ldrb $s0,[$rounds,#3] @ load input data in endian-neutral 468238384Sjkim ldrb $t1,[$rounds,#2] @ manner... 469238384Sjkim ldrb $t2,[$rounds,#1] 470238384Sjkim ldrb $t3,[$rounds,#0] 471238384Sjkim orr $s0,$s0,$t1,lsl#8 472238384Sjkim ldrb $s1,[$rounds,#7] 473238384Sjkim orr $s0,$s0,$t2,lsl#16 474238384Sjkim ldrb $t1,[$rounds,#6] 475238384Sjkim orr $s0,$s0,$t3,lsl#24 476238384Sjkim ldrb $t2,[$rounds,#5] 477238384Sjkim ldrb $t3,[$rounds,#4] 478238384Sjkim orr $s1,$s1,$t1,lsl#8 479238384Sjkim ldrb $s2,[$rounds,#11] 480238384Sjkim orr $s1,$s1,$t2,lsl#16 481238384Sjkim ldrb $t1,[$rounds,#10] 482238384Sjkim orr $s1,$s1,$t3,lsl#24 483238384Sjkim ldrb $t2,[$rounds,#9] 484238384Sjkim ldrb $t3,[$rounds,#8] 485238384Sjkim orr $s2,$s2,$t1,lsl#8 486238384Sjkim ldrb $s3,[$rounds,#15] 487238384Sjkim orr $s2,$s2,$t2,lsl#16 488238384Sjkim ldrb $t1,[$rounds,#14] 489238384Sjkim orr $s2,$s2,$t3,lsl#24 490238384Sjkim ldrb $t2,[$rounds,#13] 491238384Sjkim ldrb $t3,[$rounds,#12] 492238384Sjkim orr $s3,$s3,$t1,lsl#8 493238384Sjkim str $s0,[$key],#16 494238384Sjkim orr $s3,$s3,$t2,lsl#16 495238384Sjkim str $s1,[$key,#-12] 496238384Sjkim orr $s3,$s3,$t3,lsl#24 497238384Sjkim str $s2,[$key,#-8] 498238384Sjkim str $s3,[$key,#-4] 499238384Sjkim#else 500238384Sjkim ldr $s0,[$rounds,#0] 501238384Sjkim ldr $s1,[$rounds,#4] 502238384Sjkim ldr $s2,[$rounds,#8] 503238384Sjkim ldr $s3,[$rounds,#12] 504238384Sjkim#ifdef __ARMEL__ 505238384Sjkim rev $s0,$s0 506238384Sjkim rev $s1,$s1 507238384Sjkim rev $s2,$s2 508238384Sjkim rev $s3,$s3 509238384Sjkim#endif 510238384Sjkim str $s0,[$key],#16 511238384Sjkim str $s1,[$key,#-12] 512238384Sjkim str $s2,[$key,#-8] 513238384Sjkim str $s3,[$key,#-4] 514238384Sjkim#endif 515238384Sjkim 516238384Sjkim teq lr,#128 517238384Sjkim bne .Lnot128 518238384Sjkim mov $rounds,#10 519238384Sjkim str $rounds,[$key,#240-16] 520238384Sjkim add $t3,$tbl,#256 @ rcon 521238384Sjkim mov lr,#255 522238384Sjkim 523238384Sjkim.L128_loop: 524238384Sjkim and $t2,lr,$s3,lsr#24 525238384Sjkim and $i1,lr,$s3,lsr#16 526238384Sjkim ldrb $t2,[$tbl,$t2] 527238384Sjkim and $i2,lr,$s3,lsr#8 528238384Sjkim ldrb $i1,[$tbl,$i1] 529238384Sjkim and $i3,lr,$s3 530238384Sjkim ldrb $i2,[$tbl,$i2] 531238384Sjkim orr $t2,$t2,$i1,lsl#24 532238384Sjkim ldrb $i3,[$tbl,$i3] 533238384Sjkim orr $t2,$t2,$i2,lsl#16 534238384Sjkim ldr $t1,[$t3],#4 @ rcon[i++] 535238384Sjkim orr $t2,$t2,$i3,lsl#8 536238384Sjkim eor $t2,$t2,$t1 537238384Sjkim eor $s0,$s0,$t2 @ rk[4]=rk[0]^... 538238384Sjkim eor $s1,$s1,$s0 @ rk[5]=rk[1]^rk[4] 539238384Sjkim str $s0,[$key],#16 540238384Sjkim eor $s2,$s2,$s1 @ rk[6]=rk[2]^rk[5] 541238384Sjkim str $s1,[$key,#-12] 542238384Sjkim eor $s3,$s3,$s2 @ rk[7]=rk[3]^rk[6] 543238384Sjkim str $s2,[$key,#-8] 544238384Sjkim subs $rounds,$rounds,#1 545238384Sjkim str $s3,[$key,#-4] 546238384Sjkim bne .L128_loop 547238384Sjkim sub r2,$key,#176 548238384Sjkim b .Ldone 549238384Sjkim 550238384Sjkim.Lnot128: 551238384Sjkim#if __ARM_ARCH__<7 552238384Sjkim ldrb $i2,[$rounds,#19] 553238384Sjkim ldrb $t1,[$rounds,#18] 554238384Sjkim ldrb $t2,[$rounds,#17] 555238384Sjkim ldrb $t3,[$rounds,#16] 556238384Sjkim orr $i2,$i2,$t1,lsl#8 557238384Sjkim ldrb $i3,[$rounds,#23] 558238384Sjkim orr $i2,$i2,$t2,lsl#16 559238384Sjkim ldrb $t1,[$rounds,#22] 560238384Sjkim orr $i2,$i2,$t3,lsl#24 561238384Sjkim ldrb $t2,[$rounds,#21] 562238384Sjkim ldrb $t3,[$rounds,#20] 563238384Sjkim orr $i3,$i3,$t1,lsl#8 564238384Sjkim orr $i3,$i3,$t2,lsl#16 565238384Sjkim str $i2,[$key],#8 566238384Sjkim orr $i3,$i3,$t3,lsl#24 567238384Sjkim str $i3,[$key,#-4] 568238384Sjkim#else 569238384Sjkim ldr $i2,[$rounds,#16] 570238384Sjkim ldr $i3,[$rounds,#20] 571238384Sjkim#ifdef __ARMEL__ 572238384Sjkim rev $i2,$i2 573238384Sjkim rev $i3,$i3 574238384Sjkim#endif 575238384Sjkim str $i2,[$key],#8 576238384Sjkim str $i3,[$key,#-4] 577238384Sjkim#endif 578238384Sjkim 579238384Sjkim teq lr,#192 580238384Sjkim bne .Lnot192 581238384Sjkim mov $rounds,#12 582238384Sjkim str $rounds,[$key,#240-24] 583238384Sjkim add $t3,$tbl,#256 @ rcon 584238384Sjkim mov lr,#255 585238384Sjkim mov $rounds,#8 586238384Sjkim 587238384Sjkim.L192_loop: 588238384Sjkim and $t2,lr,$i3,lsr#24 589238384Sjkim and $i1,lr,$i3,lsr#16 590238384Sjkim ldrb $t2,[$tbl,$t2] 591238384Sjkim and $i2,lr,$i3,lsr#8 592238384Sjkim ldrb $i1,[$tbl,$i1] 593238384Sjkim and $i3,lr,$i3 594238384Sjkim ldrb $i2,[$tbl,$i2] 595238384Sjkim orr $t2,$t2,$i1,lsl#24 596238384Sjkim ldrb $i3,[$tbl,$i3] 597238384Sjkim orr $t2,$t2,$i2,lsl#16 598238384Sjkim ldr $t1,[$t3],#4 @ rcon[i++] 599238384Sjkim orr $t2,$t2,$i3,lsl#8 600238384Sjkim eor $i3,$t2,$t1 601238384Sjkim eor $s0,$s0,$i3 @ rk[6]=rk[0]^... 602238384Sjkim eor $s1,$s1,$s0 @ rk[7]=rk[1]^rk[6] 603238384Sjkim str $s0,[$key],#24 604238384Sjkim eor $s2,$s2,$s1 @ rk[8]=rk[2]^rk[7] 605238384Sjkim str $s1,[$key,#-20] 606238384Sjkim eor $s3,$s3,$s2 @ rk[9]=rk[3]^rk[8] 607238384Sjkim str $s2,[$key,#-16] 608238384Sjkim subs $rounds,$rounds,#1 609238384Sjkim str $s3,[$key,#-12] 610290207Sjkim#if __ARM_ARCH__>=7 611290207Sjkim itt eq @ Thumb2 thing, sanity check in ARM 612290207Sjkim#endif 613238384Sjkim subeq r2,$key,#216 614238384Sjkim beq .Ldone 615238384Sjkim 616238384Sjkim ldr $i1,[$key,#-32] 617238384Sjkim ldr $i2,[$key,#-28] 618238384Sjkim eor $i1,$i1,$s3 @ rk[10]=rk[4]^rk[9] 619238384Sjkim eor $i3,$i2,$i1 @ rk[11]=rk[5]^rk[10] 620238384Sjkim str $i1,[$key,#-8] 621238384Sjkim str $i3,[$key,#-4] 622238384Sjkim b .L192_loop 623238384Sjkim 624238384Sjkim.Lnot192: 625238384Sjkim#if __ARM_ARCH__<7 626238384Sjkim ldrb $i2,[$rounds,#27] 627238384Sjkim ldrb $t1,[$rounds,#26] 628238384Sjkim ldrb $t2,[$rounds,#25] 629238384Sjkim ldrb $t3,[$rounds,#24] 630238384Sjkim orr $i2,$i2,$t1,lsl#8 631238384Sjkim ldrb $i3,[$rounds,#31] 632238384Sjkim orr $i2,$i2,$t2,lsl#16 633238384Sjkim ldrb $t1,[$rounds,#30] 634238384Sjkim orr $i2,$i2,$t3,lsl#24 635238384Sjkim ldrb $t2,[$rounds,#29] 636238384Sjkim ldrb $t3,[$rounds,#28] 637238384Sjkim orr $i3,$i3,$t1,lsl#8 638238384Sjkim orr $i3,$i3,$t2,lsl#16 639238384Sjkim str $i2,[$key],#8 640238384Sjkim orr $i3,$i3,$t3,lsl#24 641238384Sjkim str $i3,[$key,#-4] 642238384Sjkim#else 643238384Sjkim ldr $i2,[$rounds,#24] 644238384Sjkim ldr $i3,[$rounds,#28] 645238384Sjkim#ifdef __ARMEL__ 646238384Sjkim rev $i2,$i2 647238384Sjkim rev $i3,$i3 648238384Sjkim#endif 649238384Sjkim str $i2,[$key],#8 650238384Sjkim str $i3,[$key,#-4] 651238384Sjkim#endif 652238384Sjkim 653238384Sjkim mov $rounds,#14 654238384Sjkim str $rounds,[$key,#240-32] 655238384Sjkim add $t3,$tbl,#256 @ rcon 656238384Sjkim mov lr,#255 657238384Sjkim mov $rounds,#7 658238384Sjkim 659238384Sjkim.L256_loop: 660238384Sjkim and $t2,lr,$i3,lsr#24 661238384Sjkim and $i1,lr,$i3,lsr#16 662238384Sjkim ldrb $t2,[$tbl,$t2] 663238384Sjkim and $i2,lr,$i3,lsr#8 664238384Sjkim ldrb $i1,[$tbl,$i1] 665238384Sjkim and $i3,lr,$i3 666238384Sjkim ldrb $i2,[$tbl,$i2] 667238384Sjkim orr $t2,$t2,$i1,lsl#24 668238384Sjkim ldrb $i3,[$tbl,$i3] 669238384Sjkim orr $t2,$t2,$i2,lsl#16 670238384Sjkim ldr $t1,[$t3],#4 @ rcon[i++] 671238384Sjkim orr $t2,$t2,$i3,lsl#8 672238384Sjkim eor $i3,$t2,$t1 673238384Sjkim eor $s0,$s0,$i3 @ rk[8]=rk[0]^... 674238384Sjkim eor $s1,$s1,$s0 @ rk[9]=rk[1]^rk[8] 675238384Sjkim str $s0,[$key],#32 676238384Sjkim eor $s2,$s2,$s1 @ rk[10]=rk[2]^rk[9] 677238384Sjkim str $s1,[$key,#-28] 678238384Sjkim eor $s3,$s3,$s2 @ rk[11]=rk[3]^rk[10] 679238384Sjkim str $s2,[$key,#-24] 680238384Sjkim subs $rounds,$rounds,#1 681238384Sjkim str $s3,[$key,#-20] 682290207Sjkim#if __ARM_ARCH__>=7 683290207Sjkim itt eq @ Thumb2 thing, sanity check in ARM 684290207Sjkim#endif 685238384Sjkim subeq r2,$key,#256 686238384Sjkim beq .Ldone 687238384Sjkim 688238384Sjkim and $t2,lr,$s3 689238384Sjkim and $i1,lr,$s3,lsr#8 690238384Sjkim ldrb $t2,[$tbl,$t2] 691238384Sjkim and $i2,lr,$s3,lsr#16 692238384Sjkim ldrb $i1,[$tbl,$i1] 693238384Sjkim and $i3,lr,$s3,lsr#24 694238384Sjkim ldrb $i2,[$tbl,$i2] 695238384Sjkim orr $t2,$t2,$i1,lsl#8 696238384Sjkim ldrb $i3,[$tbl,$i3] 697238384Sjkim orr $t2,$t2,$i2,lsl#16 698238384Sjkim ldr $t1,[$key,#-48] 699238384Sjkim orr $t2,$t2,$i3,lsl#24 700238384Sjkim 701238384Sjkim ldr $i1,[$key,#-44] 702238384Sjkim ldr $i2,[$key,#-40] 703238384Sjkim eor $t1,$t1,$t2 @ rk[12]=rk[4]^... 704238384Sjkim ldr $i3,[$key,#-36] 705238384Sjkim eor $i1,$i1,$t1 @ rk[13]=rk[5]^rk[12] 706238384Sjkim str $t1,[$key,#-16] 707238384Sjkim eor $i2,$i2,$i1 @ rk[14]=rk[6]^rk[13] 708238384Sjkim str $i1,[$key,#-12] 709238384Sjkim eor $i3,$i3,$i2 @ rk[15]=rk[7]^rk[14] 710238384Sjkim str $i2,[$key,#-8] 711238384Sjkim str $i3,[$key,#-4] 712238384Sjkim b .L256_loop 713238384Sjkim 714290207Sjkim.align 2 715238384Sjkim.Ldone: mov r0,#0 716238384Sjkim ldmia sp!,{r4-r12,lr} 717290207Sjkim.Labrt: 718290207Sjkim#if __ARM_ARCH__>=5 719290207Sjkim ret @ bx lr 720290207Sjkim#else 721290207Sjkim tst lr,#1 722238384Sjkim moveq pc,lr @ be binary compatible with V4, yet 723238384Sjkim bx lr @ interoperable with Thumb ISA:-) 724290207Sjkim#endif 725238384Sjkim.size private_AES_set_encrypt_key,.-private_AES_set_encrypt_key 726238384Sjkim 727238384Sjkim.global private_AES_set_decrypt_key 728238384Sjkim.type private_AES_set_decrypt_key,%function 729238384Sjkim.align 5 730238384Sjkimprivate_AES_set_decrypt_key: 731238384Sjkim str lr,[sp,#-4]! @ push lr 732238384Sjkim bl _armv4_AES_set_encrypt_key 733238384Sjkim teq r0,#0 734290207Sjkim ldr lr,[sp],#4 @ pop lr 735238384Sjkim bne .Labrt 736238384Sjkim 737290207Sjkim mov r0,r2 @ AES_set_encrypt_key preserves r2, 738290207Sjkim mov r1,r2 @ which is AES_KEY *key 739290207Sjkim b _armv4_AES_set_enc2dec_key 740290207Sjkim.size private_AES_set_decrypt_key,.-private_AES_set_decrypt_key 741238384Sjkim 742290207Sjkim@ void AES_set_enc2dec_key(const AES_KEY *inp,AES_KEY *out) 743290207Sjkim.global AES_set_enc2dec_key 744290207Sjkim.type AES_set_enc2dec_key,%function 745290207Sjkim.align 5 746290207SjkimAES_set_enc2dec_key: 747290207Sjkim_armv4_AES_set_enc2dec_key: 748290207Sjkim stmdb sp!,{r4-r12,lr} 749238384Sjkim 750290207Sjkim ldr $rounds,[r0,#240] 751290207Sjkim mov $i1,r0 @ input 752290207Sjkim add $i2,r0,$rounds,lsl#4 753290207Sjkim mov $key,r1 @ ouput 754290207Sjkim add $tbl,r1,$rounds,lsl#4 755290207Sjkim str $rounds,[r1,#240] 756290207Sjkim 757290207Sjkim.Linv: ldr $s0,[$i1],#16 758290207Sjkim ldr $s1,[$i1,#-12] 759290207Sjkim ldr $s2,[$i1,#-8] 760290207Sjkim ldr $s3,[$i1,#-4] 761290207Sjkim ldr $t1,[$i2],#-16 762290207Sjkim ldr $t2,[$i2,#16+4] 763290207Sjkim ldr $t3,[$i2,#16+8] 764290207Sjkim ldr $i3,[$i2,#16+12] 765290207Sjkim str $s0,[$tbl],#-16 766290207Sjkim str $s1,[$tbl,#16+4] 767290207Sjkim str $s2,[$tbl,#16+8] 768290207Sjkim str $s3,[$tbl,#16+12] 769290207Sjkim str $t1,[$key],#16 770290207Sjkim str $t2,[$key,#-12] 771290207Sjkim str $t3,[$key,#-8] 772290207Sjkim str $i3,[$key,#-4] 773290207Sjkim teq $i1,$i2 774290207Sjkim bne .Linv 775290207Sjkim 776290207Sjkim ldr $s0,[$i1] 777238384Sjkim ldr $s1,[$i1,#4] 778238384Sjkim ldr $s2,[$i1,#8] 779238384Sjkim ldr $s3,[$i1,#12] 780290207Sjkim str $s0,[$key] 781290207Sjkim str $s1,[$key,#4] 782290207Sjkim str $s2,[$key,#8] 783290207Sjkim str $s3,[$key,#12] 784290207Sjkim sub $key,$key,$rounds,lsl#3 785238384Sjkim___ 786238384Sjkim$mask80=$i1; 787238384Sjkim$mask1b=$i2; 788238384Sjkim$mask7f=$i3; 789238384Sjkim$code.=<<___; 790238384Sjkim ldr $s0,[$key,#16]! @ prefetch tp1 791238384Sjkim mov $mask80,#0x80 792238384Sjkim mov $mask1b,#0x1b 793238384Sjkim orr $mask80,$mask80,#0x8000 794238384Sjkim orr $mask1b,$mask1b,#0x1b00 795238384Sjkim orr $mask80,$mask80,$mask80,lsl#16 796238384Sjkim orr $mask1b,$mask1b,$mask1b,lsl#16 797238384Sjkim sub $rounds,$rounds,#1 798238384Sjkim mvn $mask7f,$mask80 799238384Sjkim mov $rounds,$rounds,lsl#2 @ (rounds-1)*4 800238384Sjkim 801238384Sjkim.Lmix: and $t1,$s0,$mask80 802238384Sjkim and $s1,$s0,$mask7f 803238384Sjkim sub $t1,$t1,$t1,lsr#7 804238384Sjkim and $t1,$t1,$mask1b 805238384Sjkim eor $s1,$t1,$s1,lsl#1 @ tp2 806238384Sjkim 807238384Sjkim and $t1,$s1,$mask80 808238384Sjkim and $s2,$s1,$mask7f 809238384Sjkim sub $t1,$t1,$t1,lsr#7 810238384Sjkim and $t1,$t1,$mask1b 811238384Sjkim eor $s2,$t1,$s2,lsl#1 @ tp4 812238384Sjkim 813238384Sjkim and $t1,$s2,$mask80 814238384Sjkim and $s3,$s2,$mask7f 815238384Sjkim sub $t1,$t1,$t1,lsr#7 816238384Sjkim and $t1,$t1,$mask1b 817238384Sjkim eor $s3,$t1,$s3,lsl#1 @ tp8 818238384Sjkim 819238384Sjkim eor $t1,$s1,$s2 820238384Sjkim eor $t2,$s0,$s3 @ tp9 821238384Sjkim eor $t1,$t1,$s3 @ tpe 822238384Sjkim eor $t1,$t1,$s1,ror#24 823238384Sjkim eor $t1,$t1,$t2,ror#24 @ ^= ROTATE(tpb=tp9^tp2,8) 824238384Sjkim eor $t1,$t1,$s2,ror#16 825238384Sjkim eor $t1,$t1,$t2,ror#16 @ ^= ROTATE(tpd=tp9^tp4,16) 826238384Sjkim eor $t1,$t1,$t2,ror#8 @ ^= ROTATE(tp9,24) 827238384Sjkim 828238384Sjkim ldr $s0,[$key,#4] @ prefetch tp1 829238384Sjkim str $t1,[$key],#4 830238384Sjkim subs $rounds,$rounds,#1 831238384Sjkim bne .Lmix 832238384Sjkim 833238384Sjkim mov r0,#0 834238384Sjkim#if __ARM_ARCH__>=5 835238384Sjkim ldmia sp!,{r4-r12,pc} 836238384Sjkim#else 837238384Sjkim ldmia sp!,{r4-r12,lr} 838238384Sjkim tst lr,#1 839238384Sjkim moveq pc,lr @ be binary compatible with V4, yet 840238384Sjkim bx lr @ interoperable with Thumb ISA:-) 841238384Sjkim#endif 842290207Sjkim.size AES_set_enc2dec_key,.-AES_set_enc2dec_key 843238384Sjkim 844238384Sjkim.type AES_Td,%object 845238384Sjkim.align 5 846238384SjkimAES_Td: 847238384Sjkim.word 0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96 848238384Sjkim.word 0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393 849238384Sjkim.word 0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25 850238384Sjkim.word 0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f 851238384Sjkim.word 0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1 852238384Sjkim.word 0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6 853238384Sjkim.word 0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da 854238384Sjkim.word 0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844 855238384Sjkim.word 0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd 856238384Sjkim.word 0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4 857238384Sjkim.word 0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45 858238384Sjkim.word 0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94 859238384Sjkim.word 0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7 860238384Sjkim.word 0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a 861238384Sjkim.word 0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5 862238384Sjkim.word 0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c 863238384Sjkim.word 0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1 864238384Sjkim.word 0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a 865238384Sjkim.word 0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75 866238384Sjkim.word 0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051 867238384Sjkim.word 0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46 868238384Sjkim.word 0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff 869238384Sjkim.word 0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77 870238384Sjkim.word 0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb 871238384Sjkim.word 0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000 872238384Sjkim.word 0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e 873238384Sjkim.word 0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927 874238384Sjkim.word 0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a 875238384Sjkim.word 0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e 876238384Sjkim.word 0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16 877238384Sjkim.word 0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d 878238384Sjkim.word 0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8 879238384Sjkim.word 0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd 880238384Sjkim.word 0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34 881238384Sjkim.word 0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163 882238384Sjkim.word 0xd731dcca, 0x42638510, 0x13972240, 0x84c61120 883238384Sjkim.word 0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d 884238384Sjkim.word 0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0 885238384Sjkim.word 0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422 886238384Sjkim.word 0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef 887238384Sjkim.word 0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36 888238384Sjkim.word 0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4 889238384Sjkim.word 0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662 890238384Sjkim.word 0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5 891238384Sjkim.word 0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3 892238384Sjkim.word 0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b 893238384Sjkim.word 0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8 894238384Sjkim.word 0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6 895238384Sjkim.word 0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6 896238384Sjkim.word 0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0 897238384Sjkim.word 0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815 898238384Sjkim.word 0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f 899238384Sjkim.word 0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df 900238384Sjkim.word 0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f 901238384Sjkim.word 0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e 902238384Sjkim.word 0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713 903238384Sjkim.word 0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89 904238384Sjkim.word 0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c 905238384Sjkim.word 0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf 906238384Sjkim.word 0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86 907238384Sjkim.word 0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f 908238384Sjkim.word 0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541 909238384Sjkim.word 0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190 910238384Sjkim.word 0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742 911238384Sjkim@ Td4[256] 912238384Sjkim.byte 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38 913238384Sjkim.byte 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb 914238384Sjkim.byte 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87 915238384Sjkim.byte 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb 916238384Sjkim.byte 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d 917238384Sjkim.byte 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e 918238384Sjkim.byte 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2 919238384Sjkim.byte 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25 920238384Sjkim.byte 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16 921238384Sjkim.byte 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92 922238384Sjkim.byte 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda 923238384Sjkim.byte 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84 924238384Sjkim.byte 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a 925238384Sjkim.byte 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06 926238384Sjkim.byte 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02 927238384Sjkim.byte 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b 928238384Sjkim.byte 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea 929238384Sjkim.byte 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73 930238384Sjkim.byte 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85 931238384Sjkim.byte 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e 932238384Sjkim.byte 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89 933238384Sjkim.byte 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b 934238384Sjkim.byte 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20 935238384Sjkim.byte 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4 936238384Sjkim.byte 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31 937238384Sjkim.byte 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f 938238384Sjkim.byte 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d 939238384Sjkim.byte 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef 940238384Sjkim.byte 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0 941238384Sjkim.byte 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61 942238384Sjkim.byte 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26 943238384Sjkim.byte 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d 944238384Sjkim.size AES_Td,.-AES_Td 945238384Sjkim 946238384Sjkim@ void AES_decrypt(const unsigned char *in, unsigned char *out, 947238384Sjkim@ const AES_KEY *key) { 948238384Sjkim.global AES_decrypt 949238384Sjkim.type AES_decrypt,%function 950238384Sjkim.align 5 951238384SjkimAES_decrypt: 952290207Sjkim#if __ARM_ARCH__<7 953238384Sjkim sub r3,pc,#8 @ AES_decrypt 954290207Sjkim#else 955326663Sjkim adr r3,. 956290207Sjkim#endif 957238384Sjkim stmdb sp!,{r1,r4-r12,lr} 958238384Sjkim mov $rounds,r0 @ inp 959238384Sjkim mov $key,r2 960238384Sjkim sub $tbl,r3,#AES_decrypt-AES_Td @ Td 961238384Sjkim#if __ARM_ARCH__<7 962238384Sjkim ldrb $s0,[$rounds,#3] @ load input data in endian-neutral 963238384Sjkim ldrb $t1,[$rounds,#2] @ manner... 964238384Sjkim ldrb $t2,[$rounds,#1] 965238384Sjkim ldrb $t3,[$rounds,#0] 966238384Sjkim orr $s0,$s0,$t1,lsl#8 967238384Sjkim ldrb $s1,[$rounds,#7] 968238384Sjkim orr $s0,$s0,$t2,lsl#16 969238384Sjkim ldrb $t1,[$rounds,#6] 970238384Sjkim orr $s0,$s0,$t3,lsl#24 971238384Sjkim ldrb $t2,[$rounds,#5] 972238384Sjkim ldrb $t3,[$rounds,#4] 973238384Sjkim orr $s1,$s1,$t1,lsl#8 974238384Sjkim ldrb $s2,[$rounds,#11] 975238384Sjkim orr $s1,$s1,$t2,lsl#16 976238384Sjkim ldrb $t1,[$rounds,#10] 977238384Sjkim orr $s1,$s1,$t3,lsl#24 978238384Sjkim ldrb $t2,[$rounds,#9] 979238384Sjkim ldrb $t3,[$rounds,#8] 980238384Sjkim orr $s2,$s2,$t1,lsl#8 981238384Sjkim ldrb $s3,[$rounds,#15] 982238384Sjkim orr $s2,$s2,$t2,lsl#16 983238384Sjkim ldrb $t1,[$rounds,#14] 984238384Sjkim orr $s2,$s2,$t3,lsl#24 985238384Sjkim ldrb $t2,[$rounds,#13] 986238384Sjkim ldrb $t3,[$rounds,#12] 987238384Sjkim orr $s3,$s3,$t1,lsl#8 988238384Sjkim orr $s3,$s3,$t2,lsl#16 989238384Sjkim orr $s3,$s3,$t3,lsl#24 990238384Sjkim#else 991238384Sjkim ldr $s0,[$rounds,#0] 992238384Sjkim ldr $s1,[$rounds,#4] 993238384Sjkim ldr $s2,[$rounds,#8] 994238384Sjkim ldr $s3,[$rounds,#12] 995238384Sjkim#ifdef __ARMEL__ 996238384Sjkim rev $s0,$s0 997238384Sjkim rev $s1,$s1 998238384Sjkim rev $s2,$s2 999238384Sjkim rev $s3,$s3 1000238384Sjkim#endif 1001238384Sjkim#endif 1002238384Sjkim bl _armv4_AES_decrypt 1003238384Sjkim 1004238384Sjkim ldr $rounds,[sp],#4 @ pop out 1005238384Sjkim#if __ARM_ARCH__>=7 1006238384Sjkim#ifdef __ARMEL__ 1007238384Sjkim rev $s0,$s0 1008238384Sjkim rev $s1,$s1 1009238384Sjkim rev $s2,$s2 1010238384Sjkim rev $s3,$s3 1011238384Sjkim#endif 1012238384Sjkim str $s0,[$rounds,#0] 1013238384Sjkim str $s1,[$rounds,#4] 1014238384Sjkim str $s2,[$rounds,#8] 1015238384Sjkim str $s3,[$rounds,#12] 1016238384Sjkim#else 1017238384Sjkim mov $t1,$s0,lsr#24 @ write output in endian-neutral 1018238384Sjkim mov $t2,$s0,lsr#16 @ manner... 1019238384Sjkim mov $t3,$s0,lsr#8 1020238384Sjkim strb $t1,[$rounds,#0] 1021238384Sjkim strb $t2,[$rounds,#1] 1022238384Sjkim mov $t1,$s1,lsr#24 1023238384Sjkim strb $t3,[$rounds,#2] 1024238384Sjkim mov $t2,$s1,lsr#16 1025238384Sjkim strb $s0,[$rounds,#3] 1026238384Sjkim mov $t3,$s1,lsr#8 1027238384Sjkim strb $t1,[$rounds,#4] 1028238384Sjkim strb $t2,[$rounds,#5] 1029238384Sjkim mov $t1,$s2,lsr#24 1030238384Sjkim strb $t3,[$rounds,#6] 1031238384Sjkim mov $t2,$s2,lsr#16 1032238384Sjkim strb $s1,[$rounds,#7] 1033238384Sjkim mov $t3,$s2,lsr#8 1034238384Sjkim strb $t1,[$rounds,#8] 1035238384Sjkim strb $t2,[$rounds,#9] 1036238384Sjkim mov $t1,$s3,lsr#24 1037238384Sjkim strb $t3,[$rounds,#10] 1038238384Sjkim mov $t2,$s3,lsr#16 1039238384Sjkim strb $s2,[$rounds,#11] 1040238384Sjkim mov $t3,$s3,lsr#8 1041238384Sjkim strb $t1,[$rounds,#12] 1042238384Sjkim strb $t2,[$rounds,#13] 1043238384Sjkim strb $t3,[$rounds,#14] 1044238384Sjkim strb $s3,[$rounds,#15] 1045238384Sjkim#endif 1046238384Sjkim#if __ARM_ARCH__>=5 1047238384Sjkim ldmia sp!,{r4-r12,pc} 1048238384Sjkim#else 1049238384Sjkim ldmia sp!,{r4-r12,lr} 1050238384Sjkim tst lr,#1 1051238384Sjkim moveq pc,lr @ be binary compatible with V4, yet 1052238384Sjkim bx lr @ interoperable with Thumb ISA:-) 1053238384Sjkim#endif 1054238384Sjkim.size AES_decrypt,.-AES_decrypt 1055238384Sjkim 1056238384Sjkim.type _armv4_AES_decrypt,%function 1057238384Sjkim.align 2 1058238384Sjkim_armv4_AES_decrypt: 1059238384Sjkim str lr,[sp,#-4]! @ push lr 1060238384Sjkim ldmia $key!,{$t1-$i1} 1061238384Sjkim eor $s0,$s0,$t1 1062238384Sjkim ldr $rounds,[$key,#240-16] 1063238384Sjkim eor $s1,$s1,$t2 1064238384Sjkim eor $s2,$s2,$t3 1065238384Sjkim eor $s3,$s3,$i1 1066238384Sjkim sub $rounds,$rounds,#1 1067238384Sjkim mov lr,#255 1068238384Sjkim 1069238384Sjkim and $i1,lr,$s0,lsr#16 1070238384Sjkim and $i2,lr,$s0,lsr#8 1071238384Sjkim and $i3,lr,$s0 1072238384Sjkim mov $s0,$s0,lsr#24 1073238384Sjkim.Ldec_loop: 1074238384Sjkim ldr $t1,[$tbl,$i1,lsl#2] @ Td1[s0>>16] 1075238384Sjkim and $i1,lr,$s1 @ i0 1076238384Sjkim ldr $t2,[$tbl,$i2,lsl#2] @ Td2[s0>>8] 1077238384Sjkim and $i2,lr,$s1,lsr#16 1078238384Sjkim ldr $t3,[$tbl,$i3,lsl#2] @ Td3[s0>>0] 1079238384Sjkim and $i3,lr,$s1,lsr#8 1080238384Sjkim ldr $s0,[$tbl,$s0,lsl#2] @ Td0[s0>>24] 1081238384Sjkim mov $s1,$s1,lsr#24 1082238384Sjkim 1083238384Sjkim ldr $i1,[$tbl,$i1,lsl#2] @ Td3[s1>>0] 1084238384Sjkim ldr $i2,[$tbl,$i2,lsl#2] @ Td1[s1>>16] 1085238384Sjkim ldr $i3,[$tbl,$i3,lsl#2] @ Td2[s1>>8] 1086238384Sjkim eor $s0,$s0,$i1,ror#24 1087238384Sjkim ldr $s1,[$tbl,$s1,lsl#2] @ Td0[s1>>24] 1088238384Sjkim and $i1,lr,$s2,lsr#8 @ i0 1089238384Sjkim eor $t2,$i2,$t2,ror#8 1090238384Sjkim and $i2,lr,$s2 @ i1 1091238384Sjkim eor $t3,$i3,$t3,ror#8 1092238384Sjkim and $i3,lr,$s2,lsr#16 1093238384Sjkim ldr $i1,[$tbl,$i1,lsl#2] @ Td2[s2>>8] 1094238384Sjkim eor $s1,$s1,$t1,ror#8 1095238384Sjkim ldr $i2,[$tbl,$i2,lsl#2] @ Td3[s2>>0] 1096238384Sjkim mov $s2,$s2,lsr#24 1097238384Sjkim 1098238384Sjkim ldr $i3,[$tbl,$i3,lsl#2] @ Td1[s2>>16] 1099238384Sjkim eor $s0,$s0,$i1,ror#16 1100238384Sjkim ldr $s2,[$tbl,$s2,lsl#2] @ Td0[s2>>24] 1101238384Sjkim and $i1,lr,$s3,lsr#16 @ i0 1102238384Sjkim eor $s1,$s1,$i2,ror#24 1103238384Sjkim and $i2,lr,$s3,lsr#8 @ i1 1104238384Sjkim eor $t3,$i3,$t3,ror#8 1105238384Sjkim and $i3,lr,$s3 @ i2 1106238384Sjkim ldr $i1,[$tbl,$i1,lsl#2] @ Td1[s3>>16] 1107238384Sjkim eor $s2,$s2,$t2,ror#8 1108238384Sjkim ldr $i2,[$tbl,$i2,lsl#2] @ Td2[s3>>8] 1109238384Sjkim mov $s3,$s3,lsr#24 1110238384Sjkim 1111238384Sjkim ldr $i3,[$tbl,$i3,lsl#2] @ Td3[s3>>0] 1112238384Sjkim eor $s0,$s0,$i1,ror#8 1113238384Sjkim ldr $i1,[$key],#16 1114238384Sjkim eor $s1,$s1,$i2,ror#16 1115238384Sjkim ldr $s3,[$tbl,$s3,lsl#2] @ Td0[s3>>24] 1116238384Sjkim eor $s2,$s2,$i3,ror#24 1117238384Sjkim 1118238384Sjkim ldr $t1,[$key,#-12] 1119238384Sjkim eor $s0,$s0,$i1 1120238384Sjkim ldr $t2,[$key,#-8] 1121238384Sjkim eor $s3,$s3,$t3,ror#8 1122238384Sjkim ldr $t3,[$key,#-4] 1123238384Sjkim and $i1,lr,$s0,lsr#16 1124238384Sjkim eor $s1,$s1,$t1 1125238384Sjkim and $i2,lr,$s0,lsr#8 1126238384Sjkim eor $s2,$s2,$t2 1127238384Sjkim and $i3,lr,$s0 1128238384Sjkim eor $s3,$s3,$t3 1129238384Sjkim mov $s0,$s0,lsr#24 1130238384Sjkim 1131238384Sjkim subs $rounds,$rounds,#1 1132238384Sjkim bne .Ldec_loop 1133238384Sjkim 1134238384Sjkim add $tbl,$tbl,#1024 1135238384Sjkim 1136238384Sjkim ldr $t2,[$tbl,#0] @ prefetch Td4 1137238384Sjkim ldr $t3,[$tbl,#32] 1138238384Sjkim ldr $t1,[$tbl,#64] 1139238384Sjkim ldr $t2,[$tbl,#96] 1140238384Sjkim ldr $t3,[$tbl,#128] 1141238384Sjkim ldr $t1,[$tbl,#160] 1142238384Sjkim ldr $t2,[$tbl,#192] 1143238384Sjkim ldr $t3,[$tbl,#224] 1144238384Sjkim 1145238384Sjkim ldrb $s0,[$tbl,$s0] @ Td4[s0>>24] 1146238384Sjkim ldrb $t1,[$tbl,$i1] @ Td4[s0>>16] 1147238384Sjkim and $i1,lr,$s1 @ i0 1148238384Sjkim ldrb $t2,[$tbl,$i2] @ Td4[s0>>8] 1149238384Sjkim and $i2,lr,$s1,lsr#16 1150238384Sjkim ldrb $t3,[$tbl,$i3] @ Td4[s0>>0] 1151238384Sjkim and $i3,lr,$s1,lsr#8 1152238384Sjkim 1153290207Sjkim add $s1,$tbl,$s1,lsr#24 1154238384Sjkim ldrb $i1,[$tbl,$i1] @ Td4[s1>>0] 1155290207Sjkim ldrb $s1,[$s1] @ Td4[s1>>24] 1156238384Sjkim ldrb $i2,[$tbl,$i2] @ Td4[s1>>16] 1157238384Sjkim eor $s0,$i1,$s0,lsl#24 1158238384Sjkim ldrb $i3,[$tbl,$i3] @ Td4[s1>>8] 1159238384Sjkim eor $s1,$t1,$s1,lsl#8 1160238384Sjkim and $i1,lr,$s2,lsr#8 @ i0 1161238384Sjkim eor $t2,$t2,$i2,lsl#8 1162238384Sjkim and $i2,lr,$s2 @ i1 1163238384Sjkim ldrb $i1,[$tbl,$i1] @ Td4[s2>>8] 1164238384Sjkim eor $t3,$t3,$i3,lsl#8 1165238384Sjkim ldrb $i2,[$tbl,$i2] @ Td4[s2>>0] 1166238384Sjkim and $i3,lr,$s2,lsr#16 1167238384Sjkim 1168290207Sjkim add $s2,$tbl,$s2,lsr#24 1169290207Sjkim ldrb $s2,[$s2] @ Td4[s2>>24] 1170238384Sjkim eor $s0,$s0,$i1,lsl#8 1171238384Sjkim ldrb $i3,[$tbl,$i3] @ Td4[s2>>16] 1172238384Sjkim eor $s1,$i2,$s1,lsl#16 1173238384Sjkim and $i1,lr,$s3,lsr#16 @ i0 1174238384Sjkim eor $s2,$t2,$s2,lsl#16 1175238384Sjkim and $i2,lr,$s3,lsr#8 @ i1 1176238384Sjkim ldrb $i1,[$tbl,$i1] @ Td4[s3>>16] 1177238384Sjkim eor $t3,$t3,$i3,lsl#16 1178238384Sjkim ldrb $i2,[$tbl,$i2] @ Td4[s3>>8] 1179238384Sjkim and $i3,lr,$s3 @ i2 1180238384Sjkim 1181290207Sjkim add $s3,$tbl,$s3,lsr#24 1182238384Sjkim ldrb $i3,[$tbl,$i3] @ Td4[s3>>0] 1183290207Sjkim ldrb $s3,[$s3] @ Td4[s3>>24] 1184238384Sjkim eor $s0,$s0,$i1,lsl#16 1185238384Sjkim ldr $i1,[$key,#0] 1186238384Sjkim eor $s1,$s1,$i2,lsl#8 1187238384Sjkim ldr $t1,[$key,#4] 1188238384Sjkim eor $s2,$i3,$s2,lsl#8 1189238384Sjkim ldr $t2,[$key,#8] 1190238384Sjkim eor $s3,$t3,$s3,lsl#24 1191238384Sjkim ldr $t3,[$key,#12] 1192238384Sjkim 1193238384Sjkim eor $s0,$s0,$i1 1194238384Sjkim eor $s1,$s1,$t1 1195238384Sjkim eor $s2,$s2,$t2 1196238384Sjkim eor $s3,$s3,$t3 1197238384Sjkim 1198238384Sjkim sub $tbl,$tbl,#1024 1199238384Sjkim ldr pc,[sp],#4 @ pop and return 1200238384Sjkim.size _armv4_AES_decrypt,.-_armv4_AES_decrypt 1201238384Sjkim.asciz "AES for ARMv4, CRYPTOGAMS by <appro\@openssl.org>" 1202238384Sjkim.align 2 1203238384Sjkim___ 1204238384Sjkim 1205238384Sjkim$code =~ s/\bbx\s+lr\b/.word\t0xe12fff1e/gm; # make it possible to compile with -march=armv4 1206290207Sjkim$code =~ s/\bret\b/bx\tlr/gm; 1207290207Sjkim 1208290207Sjkimopen SELF,$0; 1209290207Sjkimwhile(<SELF>) { 1210290207Sjkim next if (/^#!/); 1211290207Sjkim last if (!s/^#/@/ and !/^$/); 1212290207Sjkim print; 1213290207Sjkim} 1214290207Sjkimclose SELF; 1215290207Sjkim 1216238384Sjkimprint $code; 1217238384Sjkimclose STDOUT; # enforce flush 1218