aes-x86_64.pl revision 656d9c7f52f88b3a3daccafa7655dec086c4756e
1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#!/usr/bin/env perl 2656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# 3656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# ==================================================================== 4656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# Written by Andy Polyakov <appro@fy.chalmers.se> for the OpenSSL 5656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# project. Rights for redistribution and usage in source and binary 6656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# forms are granted according to the OpenSSL license. 7656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# ==================================================================== 8656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# 9656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# Version 1.2. 10656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# 11656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# aes-*-cbc benchmarks are improved by >70% [compared to gcc 3.3.2 on 12656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# Opteron 240 CPU] plus all the bells-n-whistles from 32-bit version 13656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# [you'll notice a lot of resemblance], such as compressed S-boxes 14656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# in little-endian byte order, prefetch of these tables in CBC mode, 15656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# as well as avoiding L1 cache aliasing between stack frame and key 16656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# schedule and already mentioned tables, compressed Td4... 17656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# 18656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# Performance in number of cycles per processed byte for 128-bit key: 19656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# 20656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# ECB CBC encrypt 21656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# AMD64 13.7 13.0(*) 22656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# EM64T 20.2 18.6(*) 23656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# 24656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# (*) CBC benchmarks are better than ECB thanks to custom ABI used 25656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# by the private block encryption function. 26656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 27656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$verticalspin=1; # unlike 32-bit version $verticalspin performs 28656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project # ~15% better on both AMD and Intel cores 29656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$output=shift; 30656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectopen STDOUT,"| $^X ../perlasm/x86_64-xlate.pl $output"; 31656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 32656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code=".text\n"; 33656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 34656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$s0="%eax"; 35656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$s1="%ebx"; 36656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$s2="%ecx"; 37656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$s3="%edx"; 38656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$acc0="%esi"; 39656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$acc1="%edi"; 40656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$acc2="%ebp"; 41656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$inp="%r8"; 42656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$out="%r9"; 43656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$t0="%r10d"; 44656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$t1="%r11d"; 45656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$t2="%r12d"; 46656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$rnds="%r13d"; 47656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$sbox="%r14"; 48656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$key="%r15"; 49656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 50656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub hi() { my $r=shift; $r =~ s/%[er]([a-d])x/%\1h/; $r; } 51656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub lo() { my $r=shift; $r =~ s/%[er]([a-d])x/%\1l/; 52656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $r =~ s/%[er]([sd]i)/%\1l/; 53656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $r =~ s/%(r[0-9]+)[d]?/%\1b/; $r; } 54656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub _data_word() 55656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ my $i; 56656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project while(defined($i=shift)) { $code.=sprintf".long\t0x%08x,0x%08x\n",$i,$i; } 57656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 58656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub data_word() 59656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ my $i; 60656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project my $last=pop(@_); 61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=".long\t"; 62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project while(defined($i=shift)) { $code.=sprintf"0x%08x,",$i; } 63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=sprintf"0x%08x\n",$last; 64656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 65656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 66656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub data_byte() 67656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ my $i; 68656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project my $last=pop(@_); 69656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=".byte\t"; 70656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project while(defined($i=shift)) { $code.=sprintf"0x%02x,",$i&0xff; } 71656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=sprintf"0x%02x\n",$last&0xff; 72656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 73656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 74656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub encvert() 75656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ my $t3="%r8d"; # zaps $inp! 76656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 77656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___; 78656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project # favor 3-way issue Opteron pipeline... 79656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&lo("$s0")`,$acc0 80656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&lo("$s1")`,$acc1 81656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&lo("$s2")`,$acc2 82656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 0($sbox,$acc0,8),$t0 83656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 0($sbox,$acc1,8),$t1 84656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 0($sbox,$acc2,8),$t2 85656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 86656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&hi("$s1")`,$acc0 87656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&hi("$s2")`,$acc1 88656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&lo("$s3")`,$acc2 89656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 3($sbox,$acc0,8),$t0 90656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 3($sbox,$acc1,8),$t1 91656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 0($sbox,$acc2,8),$t3 92656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 93656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&hi("$s3")`,$acc0 94656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project shr \$16,$s2 95656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&hi("$s0")`,$acc2 96656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 3($sbox,$acc0,8),$t2 97656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project shr \$16,$s3 98656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 3($sbox,$acc2,8),$t3 99656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project shr \$16,$s1 101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lea 16($key),$key 102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project shr \$16,$s0 103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&lo("$s2")`,$acc0 105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&lo("$s3")`,$acc1 106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&lo("$s0")`,$acc2 107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 2($sbox,$acc0,8),$t0 108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 2($sbox,$acc1,8),$t1 109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 2($sbox,$acc2,8),$t2 110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&hi("$s3")`,$acc0 112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&hi("$s0")`,$acc1 113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&lo("$s1")`,$acc2 114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 1($sbox,$acc0,8),$t0 115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 1($sbox,$acc1,8),$t1 116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 2($sbox,$acc2,8),$t3 117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 12($key),$s3 119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&hi("$s1")`,$acc1 120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&hi("$s2")`,$acc2 121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 0($key),$s0 122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 1($sbox,$acc1,8),$t2 123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 1($sbox,$acc2,8),$t3 124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 4($key),$s1 126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 8($key),$s2 127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $t0,$s0 128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $t1,$s1 129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $t2,$s2 130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $t3,$s3 131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___ 132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub enclastvert() 135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ my $t3="%r8d"; # zaps $inp! 136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___; 138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&lo("$s0")`,$acc0 139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&lo("$s1")`,$acc1 140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&lo("$s2")`,$acc2 141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 2($sbox,$acc0,8),$t0 142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 2($sbox,$acc1,8),$t1 143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 2($sbox,$acc2,8),$t2 144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project and \$0x000000ff,$t0 146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project and \$0x000000ff,$t1 147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project and \$0x000000ff,$t2 148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&lo("$s3")`,$acc0 150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&hi("$s1")`,$acc1 151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&hi("$s2")`,$acc2 152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 2($sbox,$acc0,8),$t3 153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 0($sbox,$acc1,8),$acc1 #$t0 154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 0($sbox,$acc2,8),$acc2 #$t1 155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 156656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project and \$0x000000ff,$t3 157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project and \$0x0000ff00,$acc1 158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project and \$0x0000ff00,$acc2 159656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $acc1,$t0 161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $acc2,$t1 162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project shr \$16,$s2 163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 164656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&hi("$s3")`,$acc0 165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&hi("$s0")`,$acc1 166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project shr \$16,$s3 167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 0($sbox,$acc0,8),$acc0 #$t2 168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 0($sbox,$acc1,8),$acc1 #$t3 169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project and \$0x0000ff00,$acc0 171656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project and \$0x0000ff00,$acc1 172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project shr \$16,$s1 173656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $acc0,$t2 174656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $acc1,$t3 175656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project shr \$16,$s0 176656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 177656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&lo("$s2")`,$acc0 178656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&lo("$s3")`,$acc1 179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&lo("$s0")`,$acc2 180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 0($sbox,$acc0,8),$acc0 #$t0 181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 0($sbox,$acc1,8),$acc1 #$t1 182656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 0($sbox,$acc2,8),$acc2 #$t2 183656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 184656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project and \$0x00ff0000,$acc0 185656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project and \$0x00ff0000,$acc1 186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project and \$0x00ff0000,$acc2 187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $acc0,$t0 189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $acc1,$t1 190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $acc2,$t2 191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 192656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&lo("$s1")`,$acc0 193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&hi("$s3")`,$acc1 194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&hi("$s0")`,$acc2 195656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 0($sbox,$acc0,8),$acc0 #$t3 196656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 2($sbox,$acc1,8),$acc1 #$t0 197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 2($sbox,$acc2,8),$acc2 #$t1 198656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 199656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project and \$0x00ff0000,$acc0 200656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project and \$0xff000000,$acc1 201656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project and \$0xff000000,$acc2 202656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 203656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $acc0,$t3 204656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $acc1,$t0 205656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $acc2,$t1 206656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 207656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&hi("$s1")`,$acc0 208656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&hi("$s2")`,$acc1 209656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 16+12($key),$s3 210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 2($sbox,$acc0,8),$acc0 #$t2 211656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 2($sbox,$acc1,8),$acc1 #$t3 212656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 16+0($key),$s0 213656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 214656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project and \$0xff000000,$acc0 215656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project and \$0xff000000,$acc1 216656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 217656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $acc0,$t2 218656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $acc1,$t3 219656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 220656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 16+4($key),$s1 221656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 16+8($key),$s2 222656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $t0,$s0 223656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $t1,$s1 224656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $t2,$s2 225656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $t3,$s3 226656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___ 227656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 228656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 229656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub encstep() 230656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ my ($i,@s) = @_; 231656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project my $tmp0=$acc0; 232656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project my $tmp1=$acc1; 233656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project my $tmp2=$acc2; 234656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project my $out=($t0,$t1,$t2,$s[0])[$i]; 235656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 236656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ($i==3) { 237656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $tmp0=$s[1]; 238656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $tmp1=$s[2]; 239656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $tmp2=$s[3]; 240656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 241656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" movzb ".&lo($s[0]).",$out\n"; 242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" mov $s[2],$tmp1\n" if ($i!=3); 243656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" lea 16($key),$key\n" if ($i==0); 244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 245656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" movzb ".&hi($s[1]).",$tmp0\n"; 246656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" mov 0($sbox,$out,8),$out\n"; 247656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 248656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" shr \$16,$tmp1\n"; 249656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" mov $s[3],$tmp2\n" if ($i!=3); 250656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" xor 3($sbox,$tmp0,8),$out\n"; 251656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 252656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" movzb ".&lo($tmp1).",$tmp1\n"; 253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" shr \$24,$tmp2\n"; 254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" xor 4*$i($key),$out\n"; 255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" xor 2($sbox,$tmp1,8),$out\n"; 257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" xor 1($sbox,$tmp2,8),$out\n"; 258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" mov $t0,$s[1]\n" if ($i==3); 260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" mov $t1,$s[2]\n" if ($i==3); 261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" mov $t2,$s[3]\n" if ($i==3); 262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.="\n"; 263656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub enclast() 266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ my ($i,@s)=@_; 267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project my $tmp0=$acc0; 268656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project my $tmp1=$acc1; 269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project my $tmp2=$acc2; 270656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project my $out=($t0,$t1,$t2,$s[0])[$i]; 271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 272656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ($i==3) { 273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $tmp0=$s[1]; 274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $tmp1=$s[2]; 275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $tmp2=$s[3]; 276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 277656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" movzb ".&lo($s[0]).",$out\n"; 278656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" mov $s[2],$tmp1\n" if ($i!=3); 279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 280656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" mov 2($sbox,$out,8),$out\n"; 281656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" shr \$16,$tmp1\n"; 282656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" mov $s[3],$tmp2\n" if ($i!=3); 283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 284656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" and \$0x000000ff,$out\n"; 285656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" movzb ".&hi($s[1]).",$tmp0\n"; 286656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" movzb ".&lo($tmp1).",$tmp1\n"; 287656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" shr \$24,$tmp2\n"; 288656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 289656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" mov 0($sbox,$tmp0,8),$tmp0\n"; 290656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" mov 0($sbox,$tmp1,8),$tmp1\n"; 291656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" mov 2($sbox,$tmp2,8),$tmp2\n"; 292656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 293656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" and \$0x0000ff00,$tmp0\n"; 294656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" and \$0x00ff0000,$tmp1\n"; 295656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" and \$0xff000000,$tmp2\n"; 296656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 297656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" xor $tmp0,$out\n"; 298656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" mov $t0,$s[1]\n" if ($i==3); 299656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" xor $tmp1,$out\n"; 300656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" mov $t1,$s[2]\n" if ($i==3); 301656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" xor $tmp2,$out\n"; 302656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" mov $t2,$s[3]\n" if ($i==3); 303656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.="\n"; 304656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 305656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 306656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___; 307656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.type _x86_64_AES_encrypt,\@abi-omnipotent 308656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align 16 309656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project_x86_64_AES_encrypt: 310656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 0($key),$s0 # xor with key 311656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 4($key),$s1 312656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 8($key),$s2 313656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 12($key),$s3 314656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 315656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 240($key),$rnds # load key->rounds 316656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sub \$1,$rnds 317656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project jmp .Lenc_loop 318656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align 16 319656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Lenc_loop: 320656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___ 321656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ($verticalspin) { &encvert(); } 322656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else { &encstep(0,$s0,$s1,$s2,$s3); 323656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &encstep(1,$s1,$s2,$s3,$s0); 324656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &encstep(2,$s2,$s3,$s0,$s1); 325656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &encstep(3,$s3,$s0,$s1,$s2); 326656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 327656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___; 328656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sub \$1,$rnds 329656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project jnz .Lenc_loop 330656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___ 331656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ($verticalspin) { &enclastvert(); } 332656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else { &enclast(0,$s0,$s1,$s2,$s3); 333656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &enclast(1,$s1,$s2,$s3,$s0); 334656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &enclast(2,$s2,$s3,$s0,$s1); 335656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &enclast(3,$s3,$s0,$s1,$s2); 336656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=<<___; 337656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 16+0($key),$s0 # xor with key 338656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 16+4($key),$s1 339656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 16+8($key),$s2 340656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 16+12($key),$s3 341656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___ 342656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 343656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___; 344656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project .byte 0xf3,0xc3 # rep ret 345656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.size _x86_64_AES_encrypt,.-_x86_64_AES_encrypt 346656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___ 347656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 348656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# void AES_encrypt (const void *inp,void *out,const AES_KEY *key); 349656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___; 350656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.globl AES_encrypt 351656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.type AES_encrypt,\@function,3 352656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align 16 353656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectAES_encrypt: 354656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project push %rbx 355656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project push %rbp 356656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project push %r12 357656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project push %r13 358656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project push %r14 359656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project push %r15 360656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 361656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %rdx,$key 362656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %rdi,$inp 363656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %rsi,$out 364656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 365656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project .picmeup $sbox 366656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lea AES_Te-.($sbox),$sbox 367656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 368656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 0($inp),$s0 369656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 4($inp),$s1 370656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 8($inp),$s2 371656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 12($inp),$s3 372656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 373656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project call _x86_64_AES_encrypt 374656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 375656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $s0,0($out) 376656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $s1,4($out) 377656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $s2,8($out) 378656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $s3,12($out) 379656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 380656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project pop %r15 381656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project pop %r14 382656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project pop %r13 383656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project pop %r12 384656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project pop %rbp 385656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project pop %rbx 386656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret 387656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.size AES_encrypt,.-AES_encrypt 388656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___ 389656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 390656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#------------------------------------------------------------------# 391656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 392656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub decvert() 393656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ my $t3="%r8d"; # zaps $inp! 394656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 395656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___; 396656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project # favor 3-way issue Opteron pipeline... 397656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&lo("$s0")`,$acc0 398656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&lo("$s1")`,$acc1 399656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&lo("$s2")`,$acc2 400656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 0($sbox,$acc0,8),$t0 401656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 0($sbox,$acc1,8),$t1 402656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 0($sbox,$acc2,8),$t2 403656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 404656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&hi("$s3")`,$acc0 405656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&hi("$s0")`,$acc1 406656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&lo("$s3")`,$acc2 407656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 3($sbox,$acc0,8),$t0 408656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 3($sbox,$acc1,8),$t1 409656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 0($sbox,$acc2,8),$t3 410656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 411656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&hi("$s1")`,$acc0 412656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project shr \$16,$s0 413656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&hi("$s2")`,$acc2 414656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 3($sbox,$acc0,8),$t2 415656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project shr \$16,$s3 416656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 3($sbox,$acc2,8),$t3 417656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 418656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project shr \$16,$s1 419656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lea 16($key),$key 420656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project shr \$16,$s2 421656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 422656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&lo("$s2")`,$acc0 423656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&lo("$s3")`,$acc1 424656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&lo("$s0")`,$acc2 425656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 2($sbox,$acc0,8),$t0 426656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 2($sbox,$acc1,8),$t1 427656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 2($sbox,$acc2,8),$t2 428656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 429656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&hi("$s1")`,$acc0 430656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&hi("$s2")`,$acc1 431656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&lo("$s1")`,$acc2 432656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 1($sbox,$acc0,8),$t0 433656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 1($sbox,$acc1,8),$t1 434656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 2($sbox,$acc2,8),$t3 435656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 436656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&hi("$s3")`,$acc0 437656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 12($key),$s3 438656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&hi("$s0")`,$acc2 439656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 1($sbox,$acc0,8),$t2 440656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 0($key),$s0 441656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 1($sbox,$acc2,8),$t3 442656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 443656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $t0,$s0 444656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 4($key),$s1 445656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 8($key),$s2 446656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $t2,$s2 447656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $t1,$s1 448656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $t3,$s3 449656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___ 450656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 451656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 452656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub declastvert() 453656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ my $t3="%r8d"; # zaps $inp! 454656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 455656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___; 456656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&lo("$s0")`,$acc0 457656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&lo("$s1")`,$acc1 458656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&lo("$s2")`,$acc2 459656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb 2048($sbox,$acc0,1),$t0 460656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb 2048($sbox,$acc1,1),$t1 461656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb 2048($sbox,$acc2,1),$t2 462656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 463656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&lo("$s3")`,$acc0 464656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&hi("$s3")`,$acc1 465656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&hi("$s0")`,$acc2 466656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb 2048($sbox,$acc0,1),$t3 467656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb 2048($sbox,$acc1,1),$acc1 #$t0 468656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb 2048($sbox,$acc2,1),$acc2 #$t1 469656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 470656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project shl \$8,$acc1 471656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project shl \$8,$acc2 472656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 473656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $acc1,$t0 474656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $acc2,$t1 475656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project shr \$16,$s3 476656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 477656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&hi("$s1")`,$acc0 478656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&hi("$s2")`,$acc1 479656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project shr \$16,$s0 480656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb 2048($sbox,$acc0,1),$acc0 #$t2 481656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb 2048($sbox,$acc1,1),$acc1 #$t3 482656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 483656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project shl \$8,$acc0 484656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project shl \$8,$acc1 485656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project shr \$16,$s1 486656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $acc0,$t2 487656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $acc1,$t3 488656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project shr \$16,$s2 489656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 490656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&lo("$s2")`,$acc0 491656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&lo("$s3")`,$acc1 492656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&lo("$s0")`,$acc2 493656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb 2048($sbox,$acc0,1),$acc0 #$t0 494656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb 2048($sbox,$acc1,1),$acc1 #$t1 495656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb 2048($sbox,$acc2,1),$acc2 #$t2 496656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 497656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project shl \$16,$acc0 498656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project shl \$16,$acc1 499656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project shl \$16,$acc2 500656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 501656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $acc0,$t0 502656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $acc1,$t1 503656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $acc2,$t2 504656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 505656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&lo("$s1")`,$acc0 506656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&hi("$s1")`,$acc1 507656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&hi("$s2")`,$acc2 508656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb 2048($sbox,$acc0,1),$acc0 #$t3 509656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb 2048($sbox,$acc1,1),$acc1 #$t0 510656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb 2048($sbox,$acc2,1),$acc2 #$t1 511656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 512656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project shl \$16,$acc0 513656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project shl \$24,$acc1 514656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project shl \$24,$acc2 515656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 516656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $acc0,$t3 517656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $acc1,$t0 518656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $acc2,$t1 519656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 520656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&hi("$s3")`,$acc0 521656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&hi("$s0")`,$acc1 522656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 16+12($key),$s3 523656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb 2048($sbox,$acc0,1),$acc0 #$t2 524656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb 2048($sbox,$acc1,1),$acc1 #$t3 525656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 16+0($key),$s0 526656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 527656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project shl \$24,$acc0 528656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project shl \$24,$acc1 529656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 530656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $acc0,$t2 531656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $acc1,$t3 532656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 533656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 16+4($key),$s1 534656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 16+8($key),$s2 535656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $t0,$s0 536656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $t1,$s1 537656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $t2,$s2 538656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $t3,$s3 539656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___ 540656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 541656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 542656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub decstep() 543656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ my ($i,@s) = @_; 544656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project my $tmp0=$acc0; 545656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project my $tmp1=$acc1; 546656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project my $tmp2=$acc2; 547656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project my $out=($t0,$t1,$t2,$s[0])[$i]; 548656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 549656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" mov $s[0],$out\n" if ($i!=3); 550656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $tmp1=$s[2] if ($i==3); 551656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" mov $s[2],$tmp1\n" if ($i!=3); 552656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" and \$0xFF,$out\n"; 553656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 554656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" mov 0($sbox,$out,8),$out\n"; 555656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" shr \$16,$tmp1\n"; 556656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $tmp2=$s[3] if ($i==3); 557656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" mov $s[3],$tmp2\n" if ($i!=3); 558656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 559656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $tmp0=$s[1] if ($i==3); 560656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" movzb ".&hi($s[1]).",$tmp0\n"; 561656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" and \$0xFF,$tmp1\n"; 562656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" shr \$24,$tmp2\n"; 563656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 564656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" xor 3($sbox,$tmp0,8),$out\n"; 565656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" xor 2($sbox,$tmp1,8),$out\n"; 566656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" xor 1($sbox,$tmp2,8),$out\n"; 567656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 568656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" mov $t2,$s[1]\n" if ($i==3); 569656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" mov $t1,$s[2]\n" if ($i==3); 570656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" mov $t0,$s[3]\n" if ($i==3); 571656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.="\n"; 572656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 573656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 574656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub declast() 575656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ my ($i,@s)=@_; 576656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project my $tmp0=$acc0; 577656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project my $tmp1=$acc1; 578656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project my $tmp2=$acc2; 579656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project my $out=($t0,$t1,$t2,$s[0])[$i]; 580656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 581656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" mov $s[0],$out\n" if ($i!=3); 582656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $tmp1=$s[2] if ($i==3); 583656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" mov $s[2],$tmp1\n" if ($i!=3); 584656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" and \$0xFF,$out\n"; 585656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 586656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" movzb 2048($sbox,$out,1),$out\n"; 587656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" shr \$16,$tmp1\n"; 588656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $tmp2=$s[3] if ($i==3); 589656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" mov $s[3],$tmp2\n" if ($i!=3); 590656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 591656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $tmp0=$s[1] if ($i==3); 592656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" movzb ".&hi($s[1]).",$tmp0\n"; 593656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" and \$0xFF,$tmp1\n"; 594656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" shr \$24,$tmp2\n"; 595656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 596656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" movzb 2048($sbox,$tmp0,1),$tmp0\n"; 597656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" movzb 2048($sbox,$tmp1,1),$tmp1\n"; 598656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" movzb 2048($sbox,$tmp2,1),$tmp2\n"; 599656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 600656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" shl \$8,$tmp0\n"; 601656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" shl \$16,$tmp1\n"; 602656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" shl \$24,$tmp2\n"; 603656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 604656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" xor $tmp0,$out\n"; 605656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" mov $t2,$s[1]\n" if ($i==3); 606656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" xor $tmp1,$out\n"; 607656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" mov $t1,$s[2]\n" if ($i==3); 608656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" xor $tmp2,$out\n"; 609656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" mov $t0,$s[3]\n" if ($i==3); 610656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.="\n"; 611656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 612656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 613656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___; 614656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.type _x86_64_AES_decrypt,\@abi-omnipotent 615656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align 16 616656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project_x86_64_AES_decrypt: 617656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 0($key),$s0 # xor with key 618656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 4($key),$s1 619656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 8($key),$s2 620656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 12($key),$s3 621656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 622656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 240($key),$rnds # load key->rounds 623656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sub \$1,$rnds 624656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project jmp .Ldec_loop 625656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align 16 626656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Ldec_loop: 627656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___ 628656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ($verticalspin) { &decvert(); } 629656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else { &decstep(0,$s0,$s3,$s2,$s1); 630656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &decstep(1,$s1,$s0,$s3,$s2); 631656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &decstep(2,$s2,$s1,$s0,$s3); 632656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &decstep(3,$s3,$s2,$s1,$s0); 633656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=<<___; 634656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lea 16($key),$key 635656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 0($key),$s0 # xor with key 636656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 4($key),$s1 637656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 8($key),$s2 638656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 12($key),$s3 639656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___ 640656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 641656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___; 642656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sub \$1,$rnds 643656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project jnz .Ldec_loop 644656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___ 645656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ($verticalspin) { &declastvert(); } 646656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else { &declast(0,$s0,$s3,$s2,$s1); 647656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &declast(1,$s1,$s0,$s3,$s2); 648656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &declast(2,$s2,$s1,$s0,$s3); 649656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &declast(3,$s3,$s2,$s1,$s0); 650656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=<<___; 651656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 16+0($key),$s0 # xor with key 652656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 16+4($key),$s1 653656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 16+8($key),$s2 654656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 16+12($key),$s3 655656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___ 656656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 657656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___; 658656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project .byte 0xf3,0xc3 # rep ret 659656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.size _x86_64_AES_decrypt,.-_x86_64_AES_decrypt 660656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___ 661656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 662656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# void AES_decrypt (const void *inp,void *out,const AES_KEY *key); 663656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___; 664656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.globl AES_decrypt 665656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.type AES_decrypt,\@function,3 666656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align 16 667656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectAES_decrypt: 668656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project push %rbx 669656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project push %rbp 670656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project push %r12 671656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project push %r13 672656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project push %r14 673656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project push %r15 674656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 675656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %rdx,$key 676656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %rdi,$inp 677656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %rsi,$out 678656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 679656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project .picmeup $sbox 680656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lea AES_Td-.($sbox),$sbox 681656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 682656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project # prefetch Td4 683656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lea 2048+128($sbox),$sbox; 684656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 0-128($sbox),$s0 685656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 32-128($sbox),$s1 686656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 64-128($sbox),$s2 687656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 96-128($sbox),$s3 688656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 128-128($sbox),$s0 689656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 160-128($sbox),$s1 690656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 192-128($sbox),$s2 691656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 224-128($sbox),$s3 692656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lea -2048-128($sbox),$sbox; 693656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 694656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 0($inp),$s0 695656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 4($inp),$s1 696656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 8($inp),$s2 697656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 12($inp),$s3 698656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 699656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project call _x86_64_AES_decrypt 700656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 701656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $s0,0($out) 702656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $s1,4($out) 703656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $s2,8($out) 704656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $s3,12($out) 705656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 706656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project pop %r15 707656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project pop %r14 708656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project pop %r13 709656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project pop %r12 710656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project pop %rbp 711656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project pop %rbx 712656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret 713656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.size AES_decrypt,.-AES_decrypt 714656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___ 715656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#------------------------------------------------------------------# 716656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 717656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub enckey() 718656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ 719656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___; 720656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movz %dl,%esi # rk[i]>>0 721656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 2(%rbp,%rsi,8),%ebx 722656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movz %dh,%esi # rk[i]>>8 723656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project and \$0xFF000000,%ebx 724656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor %ebx,%eax 725656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 726656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 2(%rbp,%rsi,8),%ebx 727656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project shr \$16,%edx 728656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project and \$0x000000FF,%ebx 729656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movz %dl,%esi # rk[i]>>16 730656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor %ebx,%eax 731656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 732656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 0(%rbp,%rsi,8),%ebx 733656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movz %dh,%esi # rk[i]>>24 734656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project and \$0x0000FF00,%ebx 735656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor %ebx,%eax 736656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 737656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 0(%rbp,%rsi,8),%ebx 738656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project and \$0x00FF0000,%ebx 739656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor %ebx,%eax 740656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 741656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 2048(%rbp,%rcx,4),%eax # rcon 742656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___ 743656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 744656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 745656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# int AES_set_encrypt_key(const unsigned char *userKey, const int bits, 746656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# AES_KEY *key) 747656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___; 748656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.globl AES_set_encrypt_key 749656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.type AES_set_encrypt_key,\@function,3 750656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align 16 751656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectAES_set_encrypt_key: 752656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project push %rbx 753656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project push %rbp 754656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 755656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %esi,%ecx # %ecx=bits 756656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %rdi,%rsi # %rsi=userKey 757656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %rdx,%rdi # %rdi=key 758656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 759656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project test \$-1,%rsi 760656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project jz .Lbadpointer 761656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project test \$-1,%rdi 762656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project jz .Lbadpointer 763656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 764656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project .picmeup %rbp 765656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lea AES_Te-.(%rbp),%rbp 766656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 767656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cmp \$128,%ecx 768656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project je .L10rounds 769656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cmp \$192,%ecx 770656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project je .L12rounds 771656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cmp \$256,%ecx 772656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project je .L14rounds 773656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov \$-2,%rax # invalid number of bits 774656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project jmp .Lexit 775656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 776656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.L10rounds: 777656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 0(%rsi),%eax # copy first 4 dwords 778656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 4(%rsi),%ebx 779656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 8(%rsi),%ecx 780656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 12(%rsi),%edx 781656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %eax,0(%rdi) 782656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %ebx,4(%rdi) 783656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %ecx,8(%rdi) 784656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %edx,12(%rdi) 785656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 786656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor %ecx,%ecx 787656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project jmp .L10shortcut 788656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align 4 789656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.L10loop: 790656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 0(%rdi),%eax # rk[0] 791656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 12(%rdi),%edx # rk[3] 792656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.L10shortcut: 793656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___ 794656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &enckey (); 795656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___; 796656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %eax,16(%rdi) # rk[4] 797656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 4(%rdi),%eax 798656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %eax,20(%rdi) # rk[5] 799656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 8(%rdi),%eax 800656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %eax,24(%rdi) # rk[6] 801656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 12(%rdi),%eax 802656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %eax,28(%rdi) # rk[7] 803656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project add \$1,%ecx 804656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lea 16(%rdi),%rdi 805656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cmp \$10,%ecx 806656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project jl .L10loop 807656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 808656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movl \$10,80(%rdi) # setup number of rounds 809656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor %rax,%rax 810656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project jmp .Lexit 811656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 812656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.L12rounds: 813656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 0(%rsi),%eax # copy first 6 dwords 814656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 4(%rsi),%ebx 815656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 8(%rsi),%ecx 816656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 12(%rsi),%edx 817656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %eax,0(%rdi) 818656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %ebx,4(%rdi) 819656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %ecx,8(%rdi) 820656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %edx,12(%rdi) 821656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 16(%rsi),%ecx 822656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 20(%rsi),%edx 823656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %ecx,16(%rdi) 824656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %edx,20(%rdi) 825656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 826656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor %ecx,%ecx 827656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project jmp .L12shortcut 828656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align 4 829656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.L12loop: 830656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 0(%rdi),%eax # rk[0] 831656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 20(%rdi),%edx # rk[5] 832656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.L12shortcut: 833656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___ 834656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &enckey (); 835656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___; 836656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %eax,24(%rdi) # rk[6] 837656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 4(%rdi),%eax 838656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %eax,28(%rdi) # rk[7] 839656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 8(%rdi),%eax 840656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %eax,32(%rdi) # rk[8] 841656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 12(%rdi),%eax 842656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %eax,36(%rdi) # rk[9] 843656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 844656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cmp \$7,%ecx 845656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project je .L12break 846656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project add \$1,%ecx 847656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 848656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 16(%rdi),%eax 849656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %eax,40(%rdi) # rk[10] 850656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 20(%rdi),%eax 851656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %eax,44(%rdi) # rk[11] 852656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 853656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lea 24(%rdi),%rdi 854656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project jmp .L12loop 855656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.L12break: 856656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movl \$12,72(%rdi) # setup number of rounds 857656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor %rax,%rax 858656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project jmp .Lexit 859656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 860656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.L14rounds: 861656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 0(%rsi),%eax # copy first 8 dwords 862656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 4(%rsi),%ebx 863656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 8(%rsi),%ecx 864656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 12(%rsi),%edx 865656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %eax,0(%rdi) 866656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %ebx,4(%rdi) 867656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %ecx,8(%rdi) 868656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %edx,12(%rdi) 869656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 16(%rsi),%eax 870656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 20(%rsi),%ebx 871656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 24(%rsi),%ecx 872656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 28(%rsi),%edx 873656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %eax,16(%rdi) 874656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %ebx,20(%rdi) 875656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %ecx,24(%rdi) 876656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %edx,28(%rdi) 877656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 878656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor %ecx,%ecx 879656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project jmp .L14shortcut 880656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align 4 881656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.L14loop: 882656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 28(%rdi),%edx # rk[4] 883656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.L14shortcut: 884656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 0(%rdi),%eax # rk[0] 885656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___ 886656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &enckey (); 887656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___; 888656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %eax,32(%rdi) # rk[8] 889656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 4(%rdi),%eax 890656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %eax,36(%rdi) # rk[9] 891656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 8(%rdi),%eax 892656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %eax,40(%rdi) # rk[10] 893656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 12(%rdi),%eax 894656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %eax,44(%rdi) # rk[11] 895656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 896656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cmp \$6,%ecx 897656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project je .L14break 898656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project add \$1,%ecx 899656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 900656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %eax,%edx 901656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 16(%rdi),%eax # rk[4] 902656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movz %dl,%esi # rk[11]>>0 903656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 2(%rbp,%rsi,8),%ebx 904656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movz %dh,%esi # rk[11]>>8 905656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project and \$0x000000FF,%ebx 906656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor %ebx,%eax 907656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 908656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 0(%rbp,%rsi,8),%ebx 909656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project shr \$16,%edx 910656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project and \$0x0000FF00,%ebx 911656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movz %dl,%esi # rk[11]>>16 912656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor %ebx,%eax 913656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 914656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 0(%rbp,%rsi,8),%ebx 915656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movz %dh,%esi # rk[11]>>24 916656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project and \$0x00FF0000,%ebx 917656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor %ebx,%eax 918656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 919656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 2(%rbp,%rsi,8),%ebx 920656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project and \$0xFF000000,%ebx 921656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor %ebx,%eax 922656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 923656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %eax,48(%rdi) # rk[12] 924656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 20(%rdi),%eax 925656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %eax,52(%rdi) # rk[13] 926656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 24(%rdi),%eax 927656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %eax,56(%rdi) # rk[14] 928656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 28(%rdi),%eax 929656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %eax,60(%rdi) # rk[15] 930656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 931656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lea 32(%rdi),%rdi 932656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project jmp .L14loop 933656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.L14break: 934656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movl \$14,48(%rdi) # setup number of rounds 935656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor %rax,%rax 936656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project jmp .Lexit 937656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 938656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Lbadpointer: 939656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov \$-1,%rax 940656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Lexit: 941656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project pop %rbp 942656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project pop %rbx 943656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret 944656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.size AES_set_encrypt_key,.-AES_set_encrypt_key 945656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___ 946656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 947656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub deckey() 948656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ my ($i,$ptr,$te,$td) = @_; 949656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___; 950656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $i($ptr),%eax 951656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %eax,%edx 952656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movz %ah,%ebx 953656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project shr \$16,%edx 954656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project and \$0xFF,%eax 955656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb 2($te,%rax,8),%rax 956656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb 2($te,%rbx,8),%rbx 957656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 0($td,%rax,8),%eax 958656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 3($td,%rbx,8),%eax 959656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb %dh,%ebx 960656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project and \$0xFF,%edx 961656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb 2($te,%rdx,8),%rdx 962656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb 2($te,%rbx,8),%rbx 963656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 2($td,%rdx,8),%eax 964656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 1($td,%rbx,8),%eax 965656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %eax,$i($ptr) 966656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___ 967656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 968656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 969656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# int AES_set_decrypt_key(const unsigned char *userKey, const int bits, 970656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# AES_KEY *key) 971656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___; 972656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.globl AES_set_decrypt_key 973656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.type AES_set_decrypt_key,\@function,3 974656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align 16 975656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectAES_set_decrypt_key: 976656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project push %rdx 977656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project call AES_set_encrypt_key 978656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cmp \$0,%eax 979656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project je .Lproceed 980656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lea 24(%rsp),%rsp 981656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret 982656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Lproceed: 983656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov (%rsp),%r8 # restore key schedule 984656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %rbx,(%rsp) 985656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 986656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 240(%r8),%ecx # pull number of rounds 987656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor %rdi,%rdi 988656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lea (%rdi,%rcx,4),%rcx 989656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %r8,%rsi 990656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lea (%r8,%rcx,4),%rdi # pointer to last chunk 991656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align 4 992656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Linvert: 993656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 0(%rsi),%rax 994656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 8(%rsi),%rbx 995656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 0(%rdi),%rcx 996656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 8(%rdi),%rdx 997656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %rax,0(%rdi) 998656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %rbx,8(%rdi) 999656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %rcx,0(%rsi) 1000656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %rdx,8(%rsi) 1001656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lea 16(%rsi),%rsi 1002656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lea -16(%rdi),%rdi 1003656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cmp %rsi,%rdi 1004656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project jne .Linvert 1005656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1006656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project .picmeup %r9 1007656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lea AES_Td-.(%r9),%rdi 1008656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lea AES_Te-AES_Td(%rdi),%r9 1009656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1010656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %r8,%rsi 1011656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 240(%r8),%ecx # pull number of rounds 1012656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sub \$1,%ecx 1013656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align 4 1014656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Lpermute: 1015656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lea 16(%rsi),%rsi 1016656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___ 1017656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &deckey (0,"%rsi","%r9","%rdi"); 1018656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &deckey (4,"%rsi","%r9","%rdi"); 1019656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &deckey (8,"%rsi","%r9","%rdi"); 1020656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &deckey (12,"%rsi","%r9","%rdi"); 1021656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___; 1022656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sub \$1,%ecx 1023656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project jnz .Lpermute 1024656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1025656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor %rax,%rax 1026656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project pop %rbx 1027656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret 1028656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.size AES_set_decrypt_key,.-AES_set_decrypt_key 1029656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___ 1030656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1031656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# void AES_cbc_encrypt (const void char *inp, unsigned char *out, 1032656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# size_t length, const AES_KEY *key, 1033656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# unsigned char *ivp,const int enc); 1034656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ 1035656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# stack frame layout 1036656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# -8(%rsp) return address 1037656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectmy $_rsp="0(%rsp)"; # saved %rsp 1038656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectmy $_len="8(%rsp)"; # copy of 3rd parameter, length 1039656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectmy $_key="16(%rsp)"; # copy of 4th parameter, key 1040656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectmy $_ivp="24(%rsp)"; # copy of 5th parameter, ivp 1041656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectmy $keyp="32(%rsp)"; # one to pass as $key 1042656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectmy $ivec="40(%rsp)"; # ivec[16] 1043656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectmy $aes_key="56(%rsp)"; # copy of aes_key 1044656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectmy $mark="56+240(%rsp)"; # copy of aes_key->rounds 1045656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1046656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___; 1047656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.globl AES_cbc_encrypt 1048656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.type AES_cbc_encrypt,\@function,6 1049656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align 16 1050656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectAES_cbc_encrypt: 1051656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cmp \$0,%rdx # check length 1052656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project je .Lcbc_just_ret 1053656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project push %rbx 1054656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project push %rbp 1055656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project push %r12 1056656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project push %r13 1057656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project push %r14 1058656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project push %r15 1059656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project pushfq 1060656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cld 1061656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %r9d,%r9d # clear upper half of enc 1062656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1063656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project .picmeup $sbox 1064656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Lcbc_pic_point: 1065656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1066656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cmp \$0,%r9 1067656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project je .LDECRYPT 1068656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1069656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lea AES_Te-.Lcbc_pic_point($sbox),$sbox 1070656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1071656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project # allocate aligned stack frame... 1072656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lea -64-248(%rsp),$key 1073656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project and \$-64,$key 1074656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1075656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project # ... and make it doesn't alias with AES_Te modulo 4096 1076656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $sbox,%r10 1077656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lea 2048($sbox),%r11 1078656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $key,%r12 1079656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project and \$0xFFF,%r10 # s = $sbox&0xfff 1080656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project and \$0xFFF,%r11 # e = ($sbox+2048)&0xfff 1081656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project and \$0xFFF,%r12 # p = %rsp&0xfff 1082656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1083656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cmp %r11,%r12 # if (p=>e) %rsp =- (p-e); 1084656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project jb .Lcbc_te_break_out 1085656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sub %r11,%r12 1086656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sub %r12,$key 1087656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project jmp .Lcbc_te_ok 1088656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Lcbc_te_break_out: # else %rsp -= (p-s)&0xfff + framesz 1089656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sub %r10,%r12 1090656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project and \$0xFFF,%r12 1091656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project add \$320,%r12 1092656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sub %r12,$key 1093656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align 4 1094656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Lcbc_te_ok: 1095656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1096656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xchg %rsp,$key 1097656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project add \$8,%rsp # reserve for return address! 1098656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $key,$_rsp # save %rsp 1099656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %rdx,$_len # save copy of len 1100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %rcx,$_key # save copy of key 1101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %r8,$_ivp # save copy of ivp 1102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movl \$0,$mark # copy of aes_key->rounds = 0; 1103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %r8,%rbp # rearrange input arguments 1104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %rsi,$out 1105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %rdi,$inp 1106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %rcx,$key 1107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project # do we copy key schedule to stack? 1109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $key,%r10 1110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sub $sbox,%r10 1111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project and \$0xfff,%r10 1112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cmp \$2048,%r10 1113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project jb .Lcbc_do_ecopy 1114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cmp \$4096-248,%r10 1115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project jb .Lcbc_skip_ecopy 1116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align 4 1117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Lcbc_do_ecopy: 1118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $key,%rsi 1119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lea $aes_key,%rdi 1120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lea $aes_key,$key 1121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov \$240/8,%ecx 1122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project .long 0x90A548F3 # rep movsq 1123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov (%rsi),%eax # copy aes_key->rounds 1124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %eax,(%rdi) 1125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Lcbc_skip_ecopy: 1126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $key,$keyp # save key pointer 1127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov \$16,%ecx 1129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align 4 1130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Lcbc_prefetch_te: 1131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 0($sbox),%r10 1132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 32($sbox),%r11 1133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 64($sbox),%r12 1134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 96($sbox),%r13 1135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lea 128($sbox),$sbox 1136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sub \$1,%ecx 1137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project jnz .Lcbc_prefetch_te 1138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sub \$2048,$sbox 1139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project test \$-16,%rdx # check upon length 1141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %rdx,%r10 1142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 0(%rbp),$s0 # load iv 1143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 4(%rbp),$s1 1144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 8(%rbp),$s2 1145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 12(%rbp),$s3 1146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project jz .Lcbc_enc_tail # short input... 1147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align 4 1149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Lcbc_enc_loop: 1150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 0($inp),$s0 1151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 4($inp),$s1 1152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 8($inp),$s2 1153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 12($inp),$s3 1154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $inp,$ivec # if ($verticalspin) save inp 1155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1156656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $keyp,$key # restore key 1157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project call _x86_64_AES_encrypt 1158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1159656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $ivec,$inp # if ($verticalspin) restore inp 1160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $s0,0($out) 1161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $s1,4($out) 1162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $s2,8($out) 1163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $s3,12($out) 1164656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $_len,%r10 1166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lea 16($inp),$inp 1167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lea 16($out),$out 1168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sub \$16,%r10 1169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project test \$-16,%r10 1170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %r10,$_len 1171656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project jnz .Lcbc_enc_loop 1172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project test \$15,%r10 1173656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project jnz .Lcbc_enc_tail 1174656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $_ivp,%rbp # restore ivp 1175656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $s0,0(%rbp) # save ivec 1176656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $s1,4(%rbp) 1177656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $s2,8(%rbp) 1178656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $s3,12(%rbp) 1179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align 4 1181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Lcbc_cleanup: 1182656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cmpl \$0,$mark # was the key schedule copied? 1183656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lea $aes_key,%rdi 1184656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $_rsp,%rsp 1185656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project je .Lcbc_exit 1186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov \$240/8,%ecx 1187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor %rax,%rax 1188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project .long 0x90AB48F3 # rep stosq 1189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Lcbc_exit: 1190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project popfq 1191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project pop %r15 1192656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project pop %r14 1193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project pop %r13 1194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project pop %r12 1195656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project pop %rbp 1196656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project pop %rbx 1197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Lcbc_just_ret: 1198656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret 1199656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align 4 1200656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Lcbc_enc_tail: 1201656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cmp $inp,$out 1202656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project je .Lcbc_enc_in_place 1203656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %r10,%rcx 1204656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $inp,%rsi 1205656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $out,%rdi 1206656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project .long 0xF689A4F3 # rep movsb 1207656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Lcbc_enc_in_place: 1208656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov \$16,%rcx # zero tail 1209656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sub %r10,%rcx 1210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor %rax,%rax 1211656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project .long 0xF689AAF3 # rep stosb 1212656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $out,$inp # this is not a mistake! 1213656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movq \$16,$_len # len=16 1214656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project jmp .Lcbc_enc_loop # one more spin... 1215656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#----------------------------- DECRYPT -----------------------------# 1216656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align 16 1217656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.LDECRYPT: 1218656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lea AES_Td-.Lcbc_pic_point($sbox),$sbox 1219656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1220656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project # allocate aligned stack frame... 1221656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lea -64-248(%rsp),$key 1222656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project and \$-64,$key 1223656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1224656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project # ... and make it doesn't alias with AES_Td modulo 4096 1225656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $sbox,%r10 1226656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lea 2304($sbox),%r11 1227656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $key,%r12 1228656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project and \$0xFFF,%r10 # s = $sbox&0xfff 1229656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project and \$0xFFF,%r11 # e = ($sbox+2048+256)&0xfff 1230656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project and \$0xFFF,%r12 # p = %rsp&0xfff 1231656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1232656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cmp %r11,%r12 # if (p=>e) %rsp =- (p-e); 1233656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project jb .Lcbc_td_break_out 1234656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sub %r11,%r12 1235656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sub %r12,$key 1236656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project jmp .Lcbc_td_ok 1237656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Lcbc_td_break_out: # else %rsp -= (p-s)&0xfff + framesz 1238656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sub %r10,%r12 1239656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project and \$0xFFF,%r12 1240656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project add \$320,%r12 1241656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sub %r12,$key 1242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align 4 1243656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Lcbc_td_ok: 1244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1245656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xchg %rsp,$key 1246656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project add \$8,%rsp # reserve for return address! 1247656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $key,$_rsp # save %rsp 1248656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %rdx,$_len # save copy of len 1249656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %rcx,$_key # save copy of key 1250656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %r8,$_ivp # save copy of ivp 1251656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movl \$0,$mark # copy of aes_key->rounds = 0; 1252656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %r8,%rbp # rearrange input arguments 1253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %rsi,$out 1254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %rdi,$inp 1255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %rcx,$key 1256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project # do we copy key schedule to stack? 1258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $key,%r10 1259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sub $sbox,%r10 1260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project and \$0xfff,%r10 1261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cmp \$2304,%r10 1262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project jb .Lcbc_do_dcopy 1263656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cmp \$4096-248,%r10 1264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project jb .Lcbc_skip_dcopy 1265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align 4 1266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Lcbc_do_dcopy: 1267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $key,%rsi 1268656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lea $aes_key,%rdi 1269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lea $aes_key,$key 1270656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov \$240/8,%ecx 1271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project .long 0x90A548F3 # rep movsq 1272656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov (%rsi),%eax # copy aes_key->rounds 1273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %eax,(%rdi) 1274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Lcbc_skip_dcopy: 1275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $key,$keyp # save key pointer 1276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1277656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov \$18,%ecx 1278656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align 4 1279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Lcbc_prefetch_td: 1280656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 0($sbox),%r10 1281656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 32($sbox),%r11 1282656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 64($sbox),%r12 1283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 96($sbox),%r13 1284656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lea 128($sbox),$sbox 1285656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sub \$1,%ecx 1286656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project jnz .Lcbc_prefetch_td 1287656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sub \$2304,$sbox 1288656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1289656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cmp $inp,$out 1290656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project je .Lcbc_dec_in_place 1291656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1292656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %rbp,$ivec 1293656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align 4 1294656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Lcbc_dec_loop: 1295656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 0($inp),$s0 # read input 1296656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 4($inp),$s1 1297656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 8($inp),$s2 1298656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 12($inp),$s3 1299656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $inp,8+$ivec # if ($verticalspin) save inp 1300656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1301656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $keyp,$key # restore key 1302656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project call _x86_64_AES_decrypt 1303656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1304656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $ivec,%rbp # load ivp 1305656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 8+$ivec,$inp # if ($verticalspin) restore inp 1306656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 0(%rbp),$s0 # xor iv 1307656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 4(%rbp),$s1 1308656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 8(%rbp),$s2 1309656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 12(%rbp),$s3 1310656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $inp,%rbp # current input, next iv 1311656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1312656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $_len,%r10 # load len 1313656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sub \$16,%r10 1314656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project jc .Lcbc_dec_partial 1315656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %r10,$_len # update len 1316656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %rbp,$ivec # update ivp 1317656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1318656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $s0,0($out) # write output 1319656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $s1,4($out) 1320656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $s2,8($out) 1321656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $s3,12($out) 1322656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1323656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lea 16($inp),$inp 1324656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lea 16($out),$out 1325656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project jnz .Lcbc_dec_loop 1326656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Lcbc_dec_end: 1327656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $_ivp,%r12 # load user ivp 1328656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 0(%rbp),%r10 # load iv 1329656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 8(%rbp),%r11 1330656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %r10,0(%r12) # copy back to user 1331656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %r11,8(%r12) 1332656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project jmp .Lcbc_cleanup 1333656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1334656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align 4 1335656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Lcbc_dec_partial: 1336656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $s0,0+$ivec # dump output to stack 1337656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $s1,4+$ivec 1338656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $s2,8+$ivec 1339656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $s3,12+$ivec 1340656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $out,%rdi 1341656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lea $ivec,%rsi 1342656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov \$16,%rcx 1343656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project add %r10,%rcx # number of bytes to copy 1344656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project .long 0xF689A4F3 # rep movsb 1345656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project jmp .Lcbc_dec_end 1346656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1347656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align 16 1348656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Lcbc_dec_in_place: 1349656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 0($inp),$s0 # load input 1350656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 4($inp),$s1 1351656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 8($inp),$s2 1352656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 12($inp),$s3 1353656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1354656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $inp,$ivec # if ($verticalspin) save inp 1355656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $keyp,$key 1356656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project call _x86_64_AES_decrypt 1357656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1358656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $ivec,$inp # if ($verticalspin) restore inp 1359656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $_ivp,%rbp 1360656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 0(%rbp),$s0 1361656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 4(%rbp),$s1 1362656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 8(%rbp),$s2 1363656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 12(%rbp),$s3 1364656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1365656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 0($inp),%r10 # copy input to iv 1366656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 8($inp),%r11 1367656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %r10,0(%rbp) 1368656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %r11,8(%rbp) 1369656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1370656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $s0,0($out) # save output [zaps input] 1371656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $s1,4($out) 1372656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $s2,8($out) 1373656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $s3,12($out) 1374656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1375656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $_len,%rcx 1376656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lea 16($inp),$inp 1377656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lea 16($out),$out 1378656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sub \$16,%rcx 1379656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project jc .Lcbc_dec_in_place_partial 1380656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %rcx,$_len 1381656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project jnz .Lcbc_dec_in_place 1382656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project jmp .Lcbc_cleanup 1383656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1384656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align 4 1385656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Lcbc_dec_in_place_partial: 1386656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project # one can argue if this is actually required 1387656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lea ($out,%rcx),%rdi 1388656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lea (%rbp,%rcx),%rsi 1389656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project neg %rcx 1390656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project .long 0xF689A4F3 # rep movsb # restore tail 1391656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project jmp .Lcbc_cleanup 1392656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.size AES_cbc_encrypt,.-AES_cbc_encrypt 1393656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___ 1394656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 1395656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1396656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___; 1397656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.globl AES_Te 1398656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align 64 1399656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectAES_Te: 1400656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___ 1401656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xa56363c6, 0x847c7cf8, 0x997777ee, 0x8d7b7bf6); 1402656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x0df2f2ff, 0xbd6b6bd6, 0xb16f6fde, 0x54c5c591); 1403656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x50303060, 0x03010102, 0xa96767ce, 0x7d2b2b56); 1404656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x19fefee7, 0x62d7d7b5, 0xe6abab4d, 0x9a7676ec); 1405656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x45caca8f, 0x9d82821f, 0x40c9c989, 0x877d7dfa); 1406656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x15fafaef, 0xeb5959b2, 0xc947478e, 0x0bf0f0fb); 1407656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xecadad41, 0x67d4d4b3, 0xfda2a25f, 0xeaafaf45); 1408656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xbf9c9c23, 0xf7a4a453, 0x967272e4, 0x5bc0c09b); 1409656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xc2b7b775, 0x1cfdfde1, 0xae93933d, 0x6a26264c); 1410656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x5a36366c, 0x413f3f7e, 0x02f7f7f5, 0x4fcccc83); 1411656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x5c343468, 0xf4a5a551, 0x34e5e5d1, 0x08f1f1f9); 1412656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x937171e2, 0x73d8d8ab, 0x53313162, 0x3f15152a); 1413656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x0c040408, 0x52c7c795, 0x65232346, 0x5ec3c39d); 1414656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x28181830, 0xa1969637, 0x0f05050a, 0xb59a9a2f); 1415656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x0907070e, 0x36121224, 0x9b80801b, 0x3de2e2df); 1416656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x26ebebcd, 0x6927274e, 0xcdb2b27f, 0x9f7575ea); 1417656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x1b090912, 0x9e83831d, 0x742c2c58, 0x2e1a1a34); 1418656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x2d1b1b36, 0xb26e6edc, 0xee5a5ab4, 0xfba0a05b); 1419656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xf65252a4, 0x4d3b3b76, 0x61d6d6b7, 0xceb3b37d); 1420656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x7b292952, 0x3ee3e3dd, 0x712f2f5e, 0x97848413); 1421656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xf55353a6, 0x68d1d1b9, 0x00000000, 0x2cededc1); 1422656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x60202040, 0x1ffcfce3, 0xc8b1b179, 0xed5b5bb6); 1423656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xbe6a6ad4, 0x46cbcb8d, 0xd9bebe67, 0x4b393972); 1424656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xde4a4a94, 0xd44c4c98, 0xe85858b0, 0x4acfcf85); 1425656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x6bd0d0bb, 0x2aefefc5, 0xe5aaaa4f, 0x16fbfbed); 1426656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xc5434386, 0xd74d4d9a, 0x55333366, 0x94858511); 1427656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xcf45458a, 0x10f9f9e9, 0x06020204, 0x817f7ffe); 1428656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xf05050a0, 0x443c3c78, 0xba9f9f25, 0xe3a8a84b); 1429656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xf35151a2, 0xfea3a35d, 0xc0404080, 0x8a8f8f05); 1430656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xad92923f, 0xbc9d9d21, 0x48383870, 0x04f5f5f1); 1431656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xdfbcbc63, 0xc1b6b677, 0x75dadaaf, 0x63212142); 1432656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x30101020, 0x1affffe5, 0x0ef3f3fd, 0x6dd2d2bf); 1433656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x4ccdcd81, 0x140c0c18, 0x35131326, 0x2fececc3); 1434656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xe15f5fbe, 0xa2979735, 0xcc444488, 0x3917172e); 1435656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x57c4c493, 0xf2a7a755, 0x827e7efc, 0x473d3d7a); 1436656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xac6464c8, 0xe75d5dba, 0x2b191932, 0x957373e6); 1437656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xa06060c0, 0x98818119, 0xd14f4f9e, 0x7fdcdca3); 1438656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x66222244, 0x7e2a2a54, 0xab90903b, 0x8388880b); 1439656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xca46468c, 0x29eeeec7, 0xd3b8b86b, 0x3c141428); 1440656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x79dedea7, 0xe25e5ebc, 0x1d0b0b16, 0x76dbdbad); 1441656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x3be0e0db, 0x56323264, 0x4e3a3a74, 0x1e0a0a14); 1442656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xdb494992, 0x0a06060c, 0x6c242448, 0xe45c5cb8); 1443656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x5dc2c29f, 0x6ed3d3bd, 0xefacac43, 0xa66262c4); 1444656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xa8919139, 0xa4959531, 0x37e4e4d3, 0x8b7979f2); 1445656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x32e7e7d5, 0x43c8c88b, 0x5937376e, 0xb76d6dda); 1446656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x8c8d8d01, 0x64d5d5b1, 0xd24e4e9c, 0xe0a9a949); 1447656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xb46c6cd8, 0xfa5656ac, 0x07f4f4f3, 0x25eaeacf); 1448656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xaf6565ca, 0x8e7a7af4, 0xe9aeae47, 0x18080810); 1449656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xd5baba6f, 0x887878f0, 0x6f25254a, 0x722e2e5c); 1450656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x241c1c38, 0xf1a6a657, 0xc7b4b473, 0x51c6c697); 1451656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x23e8e8cb, 0x7cdddda1, 0x9c7474e8, 0x211f1f3e); 1452656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xdd4b4b96, 0xdcbdbd61, 0x868b8b0d, 0x858a8a0f); 1453656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x907070e0, 0x423e3e7c, 0xc4b5b571, 0xaa6666cc); 1454656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xd8484890, 0x05030306, 0x01f6f6f7, 0x120e0e1c); 1455656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xa36161c2, 0x5f35356a, 0xf95757ae, 0xd0b9b969); 1456656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x91868617, 0x58c1c199, 0x271d1d3a, 0xb99e9e27); 1457656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x38e1e1d9, 0x13f8f8eb, 0xb398982b, 0x33111122); 1458656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xbb6969d2, 0x70d9d9a9, 0x898e8e07, 0xa7949433); 1459656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xb69b9b2d, 0x221e1e3c, 0x92878715, 0x20e9e9c9); 1460656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x49cece87, 0xff5555aa, 0x78282850, 0x7adfdfa5); 1461656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x8f8c8c03, 0xf8a1a159, 0x80898909, 0x170d0d1a); 1462656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xdabfbf65, 0x31e6e6d7, 0xc6424284, 0xb86868d0); 1463656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xc3414182, 0xb0999929, 0x772d2d5a, 0x110f0f1e); 1464656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xcbb0b07b, 0xfc5454a8, 0xd6bbbb6d, 0x3a16162c); 1465656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#rcon: 1466656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___; 1467656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project .long 0x00000001, 0x00000002, 0x00000004, 0x00000008 1468656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project .long 0x00000010, 0x00000020, 0x00000040, 0x00000080 1469656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project .long 0x0000001b, 0x00000036, 0, 0, 0, 0, 0, 0 1470656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___ 1471656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___; 1472656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.globl AES_Td 1473656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align 64 1474656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectAES_Td: 1475656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___ 1476656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x50a7f451, 0x5365417e, 0xc3a4171a, 0x965e273a); 1477656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xcb6bab3b, 0xf1459d1f, 0xab58faac, 0x9303e34b); 1478656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x55fa3020, 0xf66d76ad, 0x9176cc88, 0x254c02f5); 1479656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xfcd7e54f, 0xd7cb2ac5, 0x80443526, 0x8fa362b5); 1480656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x495ab1de, 0x671bba25, 0x980eea45, 0xe1c0fe5d); 1481656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x02752fc3, 0x12f04c81, 0xa397468d, 0xc6f9d36b); 1482656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xe75f8f03, 0x959c9215, 0xeb7a6dbf, 0xda595295); 1483656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x2d83bed4, 0xd3217458, 0x2969e049, 0x44c8c98e); 1484656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x6a89c275, 0x78798ef4, 0x6b3e5899, 0xdd71b927); 1485656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xb64fe1be, 0x17ad88f0, 0x66ac20c9, 0xb43ace7d); 1486656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x184adf63, 0x82311ae5, 0x60335197, 0x457f5362); 1487656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xe07764b1, 0x84ae6bbb, 0x1ca081fe, 0x942b08f9); 1488656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x58684870, 0x19fd458f, 0x876cde94, 0xb7f87b52); 1489656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x23d373ab, 0xe2024b72, 0x578f1fe3, 0x2aab5566); 1490656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x0728ebb2, 0x03c2b52f, 0x9a7bc586, 0xa50837d3); 1491656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xf2872830, 0xb2a5bf23, 0xba6a0302, 0x5c8216ed); 1492656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x2b1ccf8a, 0x92b479a7, 0xf0f207f3, 0xa1e2694e); 1493656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xcdf4da65, 0xd5be0506, 0x1f6234d1, 0x8afea6c4); 1494656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x9d532e34, 0xa055f3a2, 0x32e18a05, 0x75ebf6a4); 1495656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x39ec830b, 0xaaef6040, 0x069f715e, 0x51106ebd); 1496656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xf98a213e, 0x3d06dd96, 0xae053edd, 0x46bde64d); 1497656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xb58d5491, 0x055dc471, 0x6fd40604, 0xff155060); 1498656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x24fb9819, 0x97e9bdd6, 0xcc434089, 0x779ed967); 1499656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xbd42e8b0, 0x888b8907, 0x385b19e7, 0xdbeec879); 1500656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x470a7ca1, 0xe90f427c, 0xc91e84f8, 0x00000000); 1501656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x83868009, 0x48ed2b32, 0xac70111e, 0x4e725a6c); 1502656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xfbff0efd, 0x5638850f, 0x1ed5ae3d, 0x27392d36); 1503656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x64d90f0a, 0x21a65c68, 0xd1545b9b, 0x3a2e3624); 1504656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xb1670a0c, 0x0fe75793, 0xd296eeb4, 0x9e919b1b); 1505656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x4fc5c080, 0xa220dc61, 0x694b775a, 0x161a121c); 1506656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x0aba93e2, 0xe52aa0c0, 0x43e0223c, 0x1d171b12); 1507656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x0b0d090e, 0xadc78bf2, 0xb9a8b62d, 0xc8a91e14); 1508656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x8519f157, 0x4c0775af, 0xbbdd99ee, 0xfd607fa3); 1509656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x9f2601f7, 0xbcf5725c, 0xc53b6644, 0x347efb5b); 1510656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x7629438b, 0xdcc623cb, 0x68fcedb6, 0x63f1e4b8); 1511656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xcadc31d7, 0x10856342, 0x40229713, 0x2011c684); 1512656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x7d244a85, 0xf83dbbd2, 0x1132f9ae, 0x6da129c7); 1513656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x4b2f9e1d, 0xf330b2dc, 0xec52860d, 0xd0e3c177); 1514656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x6c16b32b, 0x99b970a9, 0xfa489411, 0x2264e947); 1515656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xc48cfca8, 0x1a3ff0a0, 0xd82c7d56, 0xef903322); 1516656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xc74e4987, 0xc1d138d9, 0xfea2ca8c, 0x360bd498); 1517656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xcf81f5a6, 0x28de7aa5, 0x268eb7da, 0xa4bfad3f); 1518656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xe49d3a2c, 0x0d927850, 0x9bcc5f6a, 0x62467e54); 1519656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xc2138df6, 0xe8b8d890, 0x5ef7392e, 0xf5afc382); 1520656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xbe805d9f, 0x7c93d069, 0xa92dd56f, 0xb31225cf); 1521656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x3b99acc8, 0xa77d1810, 0x6e639ce8, 0x7bbb3bdb); 1522656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x097826cd, 0xf418596e, 0x01b79aec, 0xa89a4f83); 1523656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x656e95e6, 0x7ee6ffaa, 0x08cfbc21, 0xe6e815ef); 1524656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xd99be7ba, 0xce366f4a, 0xd4099fea, 0xd67cb029); 1525656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xafb2a431, 0x31233f2a, 0x3094a5c6, 0xc066a235); 1526656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x37bc4e74, 0xa6ca82fc, 0xb0d090e0, 0x15d8a733); 1527656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x4a9804f1, 0xf7daec41, 0x0e50cd7f, 0x2ff69117); 1528656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x8dd64d76, 0x4db0ef43, 0x544daacc, 0xdf0496e4); 1529656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xe3b5d19e, 0x1b886a4c, 0xb81f2cc1, 0x7f516546); 1530656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x04ea5e9d, 0x5d358c01, 0x737487fa, 0x2e410bfb); 1531656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x5a1d67b3, 0x52d2db92, 0x335610e9, 0x1347d66d); 1532656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x8c61d79a, 0x7a0ca137, 0x8e14f859, 0x893c13eb); 1533656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xee27a9ce, 0x35c961b7, 0xede51ce1, 0x3cb1477a); 1534656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x59dfd29c, 0x3f73f255, 0x79ce1418, 0xbf37c773); 1535656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xeacdf753, 0x5baafd5f, 0x146f3ddf, 0x86db4478); 1536656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x81f3afca, 0x3ec468b9, 0x2c342438, 0x5f40a3c2); 1537656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x72c31d16, 0x0c25e2bc, 0x8b493c28, 0x41950dff); 1538656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x7101a839, 0xdeb30c08, 0x9ce4b4d8, 0x90c15664); 1539656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x6184cb7b, 0x70b632d5, 0x745c6c48, 0x4257b8d0); 1540656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#Td4: 1541656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &data_byte(0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38); 1542656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &data_byte(0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb); 1543656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &data_byte(0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87); 1544656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &data_byte(0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb); 1545656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &data_byte(0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d); 1546656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &data_byte(0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e); 1547656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &data_byte(0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2); 1548656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &data_byte(0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25); 1549656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &data_byte(0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16); 1550656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &data_byte(0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92); 1551656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &data_byte(0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda); 1552656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &data_byte(0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84); 1553656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &data_byte(0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a); 1554656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &data_byte(0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06); 1555656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &data_byte(0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02); 1556656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &data_byte(0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b); 1557656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &data_byte(0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea); 1558656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &data_byte(0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73); 1559656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &data_byte(0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85); 1560656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &data_byte(0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e); 1561656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &data_byte(0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89); 1562656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &data_byte(0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b); 1563656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &data_byte(0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20); 1564656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &data_byte(0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4); 1565656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &data_byte(0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31); 1566656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &data_byte(0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f); 1567656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &data_byte(0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d); 1568656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &data_byte(0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef); 1569656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &data_byte(0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0); 1570656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &data_byte(0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61); 1571656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &data_byte(0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26); 1572656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &data_byte(0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d); 1573656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1574656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code =~ s/\`([^\`]*)\`/eval($1)/gem; 1575656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1576656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectprint $code; 1577656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1578656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectclose STDOUT; 1579