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 5221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom# project. The module is, however, dual licensed under OpenSSL and 6221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom# CRYPTOGAMS licenses depending on where you obtain it. For further 7221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom# details see http://www.openssl.org/~appro/cryptogams/. 8656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# ==================================================================== 9656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# 10221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom# Version 2.1. 11656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# 12656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# aes-*-cbc benchmarks are improved by >70% [compared to gcc 3.3.2 on 13656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# Opteron 240 CPU] plus all the bells-n-whistles from 32-bit version 14656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# [you'll notice a lot of resemblance], such as compressed S-boxes 15656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# in little-endian byte order, prefetch of these tables in CBC mode, 16656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# as well as avoiding L1 cache aliasing between stack frame and key 17656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# schedule and already mentioned tables, compressed Td4... 18656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# 19656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# Performance in number of cycles per processed byte for 128-bit key: 20656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# 21221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom# ECB encrypt ECB decrypt CBC large chunk 22221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom# AMD64 33 41 13.0 23221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom# EM64T 38 59 18.6(*) 24221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom# Core 2 30 43 14.5(*) 25656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# 26221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom# (*) with hyper-threading off 27221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 28221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$flavour = shift; 29221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$output = shift; 30221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromif ($flavour =~ /\./) { $output = $flavour; undef $flavour; } 31221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 32221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$win64=0; $win64=1 if ($flavour =~ /[nm]asm|mingw64/ || $output =~ /\.asm$/); 33221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 34221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; 35221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom( $xlate="${dir}x86_64-xlate.pl" and -f $xlate ) or 36221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom( $xlate="${dir}../../perlasm/x86_64-xlate.pl" and -f $xlate) or 37221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromdie "can't locate x86_64-xlate.pl"; 38221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 39221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromopen STDOUT,"| $^X $xlate $flavour $output"; 40656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 41656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$verticalspin=1; # unlike 32-bit version $verticalspin performs 42656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project # ~15% better on both AMD and Intel cores 43221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$speed_limit=512; # see aes-586.pl for details 44656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 45656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code=".text\n"; 46656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 47656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$s0="%eax"; 48656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$s1="%ebx"; 49656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$s2="%ecx"; 50656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$s3="%edx"; 51221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$acc0="%esi"; $mask80="%rsi"; 52221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$acc1="%edi"; $maskfe="%rdi"; 53221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$acc2="%ebp"; $mask1b="%rbp"; 54656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$inp="%r8"; 55656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$out="%r9"; 56656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$t0="%r10d"; 57656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$t1="%r11d"; 58656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$t2="%r12d"; 59656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$rnds="%r13d"; 60656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$sbox="%r14"; 61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$key="%r15"; 62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub hi() { my $r=shift; $r =~ s/%[er]([a-d])x/%\1h/; $r; } 64656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub lo() { my $r=shift; $r =~ s/%[er]([a-d])x/%\1l/; 65656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $r =~ s/%[er]([sd]i)/%\1l/; 66656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $r =~ s/%(r[0-9]+)[d]?/%\1b/; $r; } 67221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromsub LO() { my $r=shift; $r =~ s/%r([a-z]+)/%e\1/; 68221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom $r =~ s/%r([0-9]+)/%r\1d/; $r; } 69656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub _data_word() 70656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ my $i; 71656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project while(defined($i=shift)) { $code.=sprintf".long\t0x%08x,0x%08x\n",$i,$i; } 72656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 73656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub data_word() 74656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ my $i; 75656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project my $last=pop(@_); 76656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=".long\t"; 77656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project while(defined($i=shift)) { $code.=sprintf"0x%08x,",$i; } 78656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=sprintf"0x%08x\n",$last; 79656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 80656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 81656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub data_byte() 82656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ my $i; 83656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project my $last=pop(@_); 84656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=".byte\t"; 85656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project while(defined($i=shift)) { $code.=sprintf"0x%02x,",$i&0xff; } 86656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=sprintf"0x%02x\n",$last&0xff; 87656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 88656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 89656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub encvert() 90656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ my $t3="%r8d"; # zaps $inp! 91656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 92656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___; 93656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project # favor 3-way issue Opteron pipeline... 94656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&lo("$s0")`,$acc0 95656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&lo("$s1")`,$acc1 96656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&lo("$s2")`,$acc2 97656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 0($sbox,$acc0,8),$t0 98656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 0($sbox,$acc1,8),$t1 99656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 0($sbox,$acc2,8),$t2 100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&hi("$s1")`,$acc0 102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&hi("$s2")`,$acc1 103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&lo("$s3")`,$acc2 104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 3($sbox,$acc0,8),$t0 105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 3($sbox,$acc1,8),$t1 106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 0($sbox,$acc2,8),$t3 107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&hi("$s3")`,$acc0 109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project shr \$16,$s2 110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&hi("$s0")`,$acc2 111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 3($sbox,$acc0,8),$t2 112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project shr \$16,$s3 113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 3($sbox,$acc2,8),$t3 114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project shr \$16,$s1 116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lea 16($key),$key 117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project shr \$16,$s0 118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&lo("$s2")`,$acc0 120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&lo("$s3")`,$acc1 121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&lo("$s0")`,$acc2 122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 2($sbox,$acc0,8),$t0 123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 2($sbox,$acc1,8),$t1 124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 2($sbox,$acc2,8),$t2 125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&hi("$s3")`,$acc0 127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&hi("$s0")`,$acc1 128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&lo("$s1")`,$acc2 129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 1($sbox,$acc0,8),$t0 130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 1($sbox,$acc1,8),$t1 131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 2($sbox,$acc2,8),$t3 132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 12($key),$s3 134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&hi("$s1")`,$acc1 135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&hi("$s2")`,$acc2 136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 0($key),$s0 137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 1($sbox,$acc1,8),$t2 138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 1($sbox,$acc2,8),$t3 139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 4($key),$s1 141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 8($key),$s2 142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $t0,$s0 143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $t1,$s1 144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $t2,$s2 145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $t3,$s3 146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___ 147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub enclastvert() 150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ my $t3="%r8d"; # zaps $inp! 151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___; 153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&lo("$s0")`,$acc0 154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&lo("$s1")`,$acc1 155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&lo("$s2")`,$acc2 156221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb 2($sbox,$acc0,8),$t0 157221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb 2($sbox,$acc1,8),$t1 158221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb 2($sbox,$acc2,8),$t2 159656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&lo("$s3")`,$acc0 161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&hi("$s1")`,$acc1 162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&hi("$s2")`,$acc2 163221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb 2($sbox,$acc0,8),$t3 164656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 0($sbox,$acc1,8),$acc1 #$t0 165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 0($sbox,$acc2,8),$acc2 #$t1 166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project and \$0x0000ff00,$acc1 168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project and \$0x0000ff00,$acc2 169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $acc1,$t0 171656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $acc2,$t1 172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project shr \$16,$s2 173656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 174656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&hi("$s3")`,$acc0 175656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&hi("$s0")`,$acc1 176656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project shr \$16,$s3 177656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 0($sbox,$acc0,8),$acc0 #$t2 178656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 0($sbox,$acc1,8),$acc1 #$t3 179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project and \$0x0000ff00,$acc0 181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project and \$0x0000ff00,$acc1 182656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project shr \$16,$s1 183656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $acc0,$t2 184656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $acc1,$t3 185656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project shr \$16,$s0 186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&lo("$s2")`,$acc0 188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&lo("$s3")`,$acc1 189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&lo("$s0")`,$acc2 190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 0($sbox,$acc0,8),$acc0 #$t0 191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 0($sbox,$acc1,8),$acc1 #$t1 192656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 0($sbox,$acc2,8),$acc2 #$t2 193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project and \$0x00ff0000,$acc0 195656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project and \$0x00ff0000,$acc1 196656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project and \$0x00ff0000,$acc2 197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 198656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $acc0,$t0 199656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $acc1,$t1 200656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $acc2,$t2 201656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 202656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&lo("$s1")`,$acc0 203656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&hi("$s3")`,$acc1 204656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&hi("$s0")`,$acc2 205656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 0($sbox,$acc0,8),$acc0 #$t3 206656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 2($sbox,$acc1,8),$acc1 #$t0 207656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 2($sbox,$acc2,8),$acc2 #$t1 208656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 209656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project and \$0x00ff0000,$acc0 210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project and \$0xff000000,$acc1 211656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project and \$0xff000000,$acc2 212656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 213656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $acc0,$t3 214656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $acc1,$t0 215656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $acc2,$t1 216656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 217656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&hi("$s1")`,$acc0 218656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&hi("$s2")`,$acc1 219656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 16+12($key),$s3 220656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 2($sbox,$acc0,8),$acc0 #$t2 221656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 2($sbox,$acc1,8),$acc1 #$t3 222656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 16+0($key),$s0 223656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 224656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project and \$0xff000000,$acc0 225656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project and \$0xff000000,$acc1 226656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 227656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $acc0,$t2 228656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $acc1,$t3 229656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 230656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 16+4($key),$s1 231656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 16+8($key),$s2 232656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $t0,$s0 233656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $t1,$s1 234656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $t2,$s2 235656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $t3,$s3 236656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___ 237656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 238656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 239656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub encstep() 240656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ my ($i,@s) = @_; 241656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project my $tmp0=$acc0; 242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project my $tmp1=$acc1; 243656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project my $tmp2=$acc2; 244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project my $out=($t0,$t1,$t2,$s[0])[$i]; 245656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 246656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ($i==3) { 247656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $tmp0=$s[1]; 248656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $tmp1=$s[2]; 249656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $tmp2=$s[3]; 250656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 251656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" movzb ".&lo($s[0]).",$out\n"; 252656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" mov $s[2],$tmp1\n" if ($i!=3); 253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" lea 16($key),$key\n" if ($i==0); 254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" movzb ".&hi($s[1]).",$tmp0\n"; 256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" mov 0($sbox,$out,8),$out\n"; 257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" shr \$16,$tmp1\n"; 259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" mov $s[3],$tmp2\n" if ($i!=3); 260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" xor 3($sbox,$tmp0,8),$out\n"; 261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" movzb ".&lo($tmp1).",$tmp1\n"; 263656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" shr \$24,$tmp2\n"; 264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" xor 4*$i($key),$out\n"; 265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" xor 2($sbox,$tmp1,8),$out\n"; 267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" xor 1($sbox,$tmp2,8),$out\n"; 268656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" mov $t0,$s[1]\n" if ($i==3); 270656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" mov $t1,$s[2]\n" if ($i==3); 271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" mov $t2,$s[3]\n" if ($i==3); 272656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.="\n"; 273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub enclast() 276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ my ($i,@s)=@_; 277656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project my $tmp0=$acc0; 278656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project my $tmp1=$acc1; 279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project my $tmp2=$acc2; 280656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project my $out=($t0,$t1,$t2,$s[0])[$i]; 281656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 282656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ($i==3) { 283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $tmp0=$s[1]; 284656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $tmp1=$s[2]; 285656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $tmp2=$s[3]; 286656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 287656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" movzb ".&lo($s[0]).",$out\n"; 288656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" mov $s[2],$tmp1\n" if ($i!=3); 289656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 290656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" mov 2($sbox,$out,8),$out\n"; 291656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" shr \$16,$tmp1\n"; 292656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" mov $s[3],$tmp2\n" if ($i!=3); 293656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 294656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" and \$0x000000ff,$out\n"; 295656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" movzb ".&hi($s[1]).",$tmp0\n"; 296656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" movzb ".&lo($tmp1).",$tmp1\n"; 297656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" shr \$24,$tmp2\n"; 298656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 299656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" mov 0($sbox,$tmp0,8),$tmp0\n"; 300656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" mov 0($sbox,$tmp1,8),$tmp1\n"; 301656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" mov 2($sbox,$tmp2,8),$tmp2\n"; 302656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 303656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" and \$0x0000ff00,$tmp0\n"; 304656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" and \$0x00ff0000,$tmp1\n"; 305656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" and \$0xff000000,$tmp2\n"; 306656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 307656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" xor $tmp0,$out\n"; 308656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" mov $t0,$s[1]\n" if ($i==3); 309656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" xor $tmp1,$out\n"; 310656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" mov $t1,$s[2]\n" if ($i==3); 311656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" xor $tmp2,$out\n"; 312656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" mov $t2,$s[3]\n" if ($i==3); 313656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.="\n"; 314656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 315656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 316656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___; 317656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.type _x86_64_AES_encrypt,\@abi-omnipotent 318656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align 16 319656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project_x86_64_AES_encrypt: 320656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 0($key),$s0 # xor with key 321656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 4($key),$s1 322656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 8($key),$s2 323656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 12($key),$s3 324656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 325656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 240($key),$rnds # load key->rounds 326656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sub \$1,$rnds 327656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project jmp .Lenc_loop 328656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align 16 329656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Lenc_loop: 330656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___ 331656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ($verticalspin) { &encvert(); } 332656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else { &encstep(0,$s0,$s1,$s2,$s3); 333656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &encstep(1,$s1,$s2,$s3,$s0); 334656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &encstep(2,$s2,$s3,$s0,$s1); 335656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &encstep(3,$s3,$s0,$s1,$s2); 336656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 337656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___; 338656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sub \$1,$rnds 339656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project jnz .Lenc_loop 340656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___ 341656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ($verticalspin) { &enclastvert(); } 342656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else { &enclast(0,$s0,$s1,$s2,$s3); 343656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &enclast(1,$s1,$s2,$s3,$s0); 344656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &enclast(2,$s2,$s3,$s0,$s1); 345656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &enclast(3,$s3,$s0,$s1,$s2); 346656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=<<___; 347656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 16+0($key),$s0 # xor with key 348656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 16+4($key),$s1 349656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 16+8($key),$s2 350656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 16+12($key),$s3 351656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___ 352656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 353656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___; 354656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project .byte 0xf3,0xc3 # rep ret 355656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.size _x86_64_AES_encrypt,.-_x86_64_AES_encrypt 356656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___ 357656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 358221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom# it's possible to implement this by shifting tN by 8, filling least 359221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom# significant byte with byte load and finally bswap-ing at the end, 360221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom# but such partial register load kills Core 2... 361221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromsub enccompactvert() 362221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom{ my ($t3,$t4,$t5)=("%r8d","%r9d","%r13d"); 363221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 364221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$code.=<<___; 365221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb `&lo("$s0")`,$t0 366221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb `&lo("$s1")`,$t1 367221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb `&lo("$s2")`,$t2 368221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb ($sbox,$t0,1),$t0 369221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb ($sbox,$t1,1),$t1 370221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb ($sbox,$t2,1),$t2 371221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 372221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb `&lo("$s3")`,$t3 373221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb `&hi("$s1")`,$acc0 374221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb `&hi("$s2")`,$acc1 375221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb ($sbox,$t3,1),$t3 376221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb ($sbox,$acc0,1),$t4 #$t0 377221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb ($sbox,$acc1,1),$t5 #$t1 378221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 379221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb `&hi("$s3")`,$acc2 380221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb `&hi("$s0")`,$acc0 381221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom shr \$16,$s2 382221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb ($sbox,$acc2,1),$acc2 #$t2 383221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb ($sbox,$acc0,1),$acc0 #$t3 384221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom shr \$16,$s3 385221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 386221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb `&lo("$s2")`,$acc1 387221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom shl \$8,$t4 388221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom shl \$8,$t5 389221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb ($sbox,$acc1,1),$acc1 #$t0 390221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $t4,$t0 391221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $t5,$t1 392221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 393221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb `&lo("$s3")`,$t4 394221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom shr \$16,$s0 395221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom shr \$16,$s1 396221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb `&lo("$s0")`,$t5 397221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom shl \$8,$acc2 398221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom shl \$8,$acc0 399221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb ($sbox,$t4,1),$t4 #$t1 400221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb ($sbox,$t5,1),$t5 #$t2 401221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $acc2,$t2 402221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $acc0,$t3 403221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 404221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb `&lo("$s1")`,$acc2 405221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb `&hi("$s3")`,$acc0 406221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom shl \$16,$acc1 407221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb ($sbox,$acc2,1),$acc2 #$t3 408221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb ($sbox,$acc0,1),$acc0 #$t0 409221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $acc1,$t0 410221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 411221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb `&hi("$s0")`,$acc1 412221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom shr \$8,$s2 413221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom shr \$8,$s1 414221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb ($sbox,$acc1,1),$acc1 #$t1 415221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb ($sbox,$s2,1),$s3 #$t3 416221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb ($sbox,$s1,1),$s2 #$t2 417221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom shl \$16,$t4 418221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom shl \$16,$t5 419221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom shl \$16,$acc2 420221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $t4,$t1 421221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $t5,$t2 422221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $acc2,$t3 423221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 424221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom shl \$24,$acc0 425221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom shl \$24,$acc1 426221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom shl \$24,$s3 427221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $acc0,$t0 428221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom shl \$24,$s2 429221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $acc1,$t1 430221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $t0,$s0 431221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $t1,$s1 432221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $t2,$s2 433221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $t3,$s3 434221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom___ 435221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom} 436221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 437221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromsub enctransform_ref() 438221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom{ my $sn = shift; 439221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom my ($acc,$r2,$tmp)=("%r8d","%r9d","%r13d"); 440221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 441221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$code.=<<___; 442221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $sn,$acc 443221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom and \$0x80808080,$acc 444221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $acc,$tmp 445221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom shr \$7,$tmp 446221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lea ($sn,$sn),$r2 447221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sub $tmp,$acc 448221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom and \$0xfefefefe,$r2 449221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom and \$0x1b1b1b1b,$acc 450221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $sn,$tmp 451221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $acc,$r2 452221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 453221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $r2,$sn 454221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom rol \$24,$sn 455221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $r2,$sn 456221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ror \$16,$tmp 457221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $tmp,$sn 458221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ror \$8,$tmp 459221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $tmp,$sn 460221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom___ 461221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom} 462221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 463221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom# unlike decrypt case it does not pay off to parallelize enctransform 464221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromsub enctransform() 465221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom{ my ($t3,$r20,$r21)=($acc2,"%r8d","%r9d"); 466221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 467221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$code.=<<___; 468221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $s0,$acc0 469221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $s1,$acc1 470221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom and \$0x80808080,$acc0 471221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom and \$0x80808080,$acc1 472221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $acc0,$t0 473221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $acc1,$t1 474221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom shr \$7,$t0 475221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lea ($s0,$s0),$r20 476221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom shr \$7,$t1 477221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lea ($s1,$s1),$r21 478221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sub $t0,$acc0 479221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sub $t1,$acc1 480221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom and \$0xfefefefe,$r20 481221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom and \$0xfefefefe,$r21 482221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom and \$0x1b1b1b1b,$acc0 483221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom and \$0x1b1b1b1b,$acc1 484221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $s0,$t0 485221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $s1,$t1 486221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $acc0,$r20 487221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $acc1,$r21 488221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 489221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $r20,$s0 490221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $r21,$s1 491221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $s2,$acc0 492221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $s3,$acc1 493221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom rol \$24,$s0 494221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom rol \$24,$s1 495221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom and \$0x80808080,$acc0 496221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom and \$0x80808080,$acc1 497221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $r20,$s0 498221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $r21,$s1 499221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $acc0,$t2 500221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $acc1,$t3 501221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ror \$16,$t0 502221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ror \$16,$t1 503221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom shr \$7,$t2 504221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lea ($s2,$s2),$r20 505221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $t0,$s0 506221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $t1,$s1 507221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom shr \$7,$t3 508221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lea ($s3,$s3),$r21 509221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ror \$8,$t0 510221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ror \$8,$t1 511221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sub $t2,$acc0 512221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sub $t3,$acc1 513221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $t0,$s0 514221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $t1,$s1 515221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 516221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom and \$0xfefefefe,$r20 517221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom and \$0xfefefefe,$r21 518221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom and \$0x1b1b1b1b,$acc0 519221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom and \$0x1b1b1b1b,$acc1 520221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $s2,$t2 521221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $s3,$t3 522221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $acc0,$r20 523221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $acc1,$r21 524221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 525221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $r20,$s2 526221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $r21,$s3 527221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom rol \$24,$s2 528221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom rol \$24,$s3 529221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $r20,$s2 530221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $r21,$s3 531221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 0($sbox),$acc0 # prefetch Te4 532221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ror \$16,$t2 533221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ror \$16,$t3 534221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 64($sbox),$acc1 535221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $t2,$s2 536221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $t3,$s3 537221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 128($sbox),$r20 538221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ror \$8,$t2 539221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ror \$8,$t3 540221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 192($sbox),$r21 541221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $t2,$s2 542221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $t3,$s3 543221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom___ 544221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom} 545221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 546221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$code.=<<___; 547221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.type _x86_64_AES_encrypt_compact,\@abi-omnipotent 548221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.align 16 549221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom_x86_64_AES_encrypt_compact: 550221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lea 128($sbox),$inp # size optimization 551221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 0-128($inp),$acc1 # prefetch Te4 552221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 32-128($inp),$acc2 553221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 64-128($inp),$t0 554221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 96-128($inp),$t1 555221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 128-128($inp),$acc1 556221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 160-128($inp),$acc2 557221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 192-128($inp),$t0 558221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 224-128($inp),$t1 559221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom jmp .Lenc_loop_compact 560221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.align 16 561221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Lenc_loop_compact: 562221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor 0($key),$s0 # xor with key 563221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor 4($key),$s1 564221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor 8($key),$s2 565221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor 12($key),$s3 566221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lea 16($key),$key 567221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom___ 568221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &enccompactvert(); 569221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$code.=<<___; 570221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom cmp 16(%rsp),$key 571221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom je .Lenc_compact_done 572221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom___ 573221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &enctransform(); 574221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$code.=<<___; 575221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom jmp .Lenc_loop_compact 576221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.align 16 577221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Lenc_compact_done: 578221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor 0($key),$s0 579221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor 4($key),$s1 580221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor 8($key),$s2 581221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor 12($key),$s3 582221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom .byte 0xf3,0xc3 # rep ret 583221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.size _x86_64_AES_encrypt_compact,.-_x86_64_AES_encrypt_compact 584221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom___ 585221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 586656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# void AES_encrypt (const void *inp,void *out,const AES_KEY *key); 587656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___; 588656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.globl AES_encrypt 589656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.type AES_encrypt,\@function,3 590656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align 16 591392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.globl asm_AES_encrypt 592392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.hidden asm_AES_encrypt 593392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromasm_AES_encrypt: 594656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectAES_encrypt: 595656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project push %rbx 596656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project push %rbp 597656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project push %r12 598656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project push %r13 599656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project push %r14 600656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project push %r15 601656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 602221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom # allocate frame "above" key schedule 603221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %rsp,%r10 604221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lea -63(%rdx),%rcx # %rdx is key argument 605221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom and \$-64,%rsp 606221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sub %rsp,%rcx 607221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom neg %rcx 608221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom and \$0x3c0,%rcx 609221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sub %rcx,%rsp 610221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sub \$32,%rsp 611656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 612221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %rsi,16(%rsp) # save out 613221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %r10,24(%rsp) # save real stack pointer 614221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Lenc_prologue: 615656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 616221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %rdx,$key 617221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 240($key),$rnds # load rounds 618221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 619221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 0(%rdi),$s0 # load input vector 620221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 4(%rdi),$s1 621221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 8(%rdi),$s2 622221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 12(%rdi),$s3 623221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 624221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom shl \$4,$rnds 625221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lea ($key,$rnds),%rbp 626221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $key,(%rsp) # key schedule 627221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %rbp,8(%rsp) # end of key schedule 628221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 629221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom # pick Te4 copy which can't "overlap" with stack frame or key schedule 630221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lea .LAES_Te+2048(%rip),$sbox 631221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lea 768(%rsp),%rbp 632221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sub $sbox,%rbp 633221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom and \$0x300,%rbp 634221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lea ($sbox,%rbp),$sbox 635221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 636221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom call _x86_64_AES_encrypt_compact 637221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 638221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 16(%rsp),$out # restore out 639221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 24(%rsp),%rsi # restore saved stack pointer 640221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $s0,0($out) # write output vector 641656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $s1,4($out) 642656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $s2,8($out) 643656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $s3,12($out) 644656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 645221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov (%rsi),%r15 646221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 8(%rsi),%r14 647221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 16(%rsi),%r13 648221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 24(%rsi),%r12 649221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 32(%rsi),%rbp 650221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 40(%rsi),%rbx 651221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lea 48(%rsi),%rsp 652221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Lenc_epilogue: 653656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret 654656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.size AES_encrypt,.-AES_encrypt 655656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___ 656656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 657656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#------------------------------------------------------------------# 658656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 659656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub decvert() 660656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ my $t3="%r8d"; # zaps $inp! 661656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 662656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___; 663656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project # favor 3-way issue Opteron pipeline... 664656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&lo("$s0")`,$acc0 665656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&lo("$s1")`,$acc1 666656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&lo("$s2")`,$acc2 667656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 0($sbox,$acc0,8),$t0 668656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 0($sbox,$acc1,8),$t1 669656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 0($sbox,$acc2,8),$t2 670656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 671656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&hi("$s3")`,$acc0 672656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&hi("$s0")`,$acc1 673656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&lo("$s3")`,$acc2 674656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 3($sbox,$acc0,8),$t0 675656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 3($sbox,$acc1,8),$t1 676656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 0($sbox,$acc2,8),$t3 677656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 678656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&hi("$s1")`,$acc0 679656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project shr \$16,$s0 680656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&hi("$s2")`,$acc2 681656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 3($sbox,$acc0,8),$t2 682656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project shr \$16,$s3 683656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 3($sbox,$acc2,8),$t3 684656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 685656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project shr \$16,$s1 686656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lea 16($key),$key 687656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project shr \$16,$s2 688656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 689656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&lo("$s2")`,$acc0 690656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&lo("$s3")`,$acc1 691656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&lo("$s0")`,$acc2 692656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 2($sbox,$acc0,8),$t0 693656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 2($sbox,$acc1,8),$t1 694656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 2($sbox,$acc2,8),$t2 695656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 696656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&hi("$s1")`,$acc0 697656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&hi("$s2")`,$acc1 698656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&lo("$s1")`,$acc2 699656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 1($sbox,$acc0,8),$t0 700656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 1($sbox,$acc1,8),$t1 701656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 2($sbox,$acc2,8),$t3 702656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 703656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&hi("$s3")`,$acc0 704656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 12($key),$s3 705656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&hi("$s0")`,$acc2 706656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 1($sbox,$acc0,8),$t2 707656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 0($key),$s0 708656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 1($sbox,$acc2,8),$t3 709656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 710656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $t0,$s0 711656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 4($key),$s1 712656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 8($key),$s2 713656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $t2,$s2 714656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $t1,$s1 715656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $t3,$s3 716656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___ 717656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 718656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 719656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub declastvert() 720656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ my $t3="%r8d"; # zaps $inp! 721656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 722656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___; 723221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lea 2048($sbox),$sbox # size optimization 724656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&lo("$s0")`,$acc0 725656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&lo("$s1")`,$acc1 726656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&lo("$s2")`,$acc2 727221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb ($sbox,$acc0,1),$t0 728221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb ($sbox,$acc1,1),$t1 729221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb ($sbox,$acc2,1),$t2 730656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 731656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&lo("$s3")`,$acc0 732656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&hi("$s3")`,$acc1 733656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&hi("$s0")`,$acc2 734221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb ($sbox,$acc0,1),$t3 735221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb ($sbox,$acc1,1),$acc1 #$t0 736221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb ($sbox,$acc2,1),$acc2 #$t1 737656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 738656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project shl \$8,$acc1 739656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project shl \$8,$acc2 740656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 741656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $acc1,$t0 742656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $acc2,$t1 743656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project shr \$16,$s3 744656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 745656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&hi("$s1")`,$acc0 746656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&hi("$s2")`,$acc1 747656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project shr \$16,$s0 748221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb ($sbox,$acc0,1),$acc0 #$t2 749221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb ($sbox,$acc1,1),$acc1 #$t3 750656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 751656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project shl \$8,$acc0 752656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project shl \$8,$acc1 753656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project shr \$16,$s1 754656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $acc0,$t2 755656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $acc1,$t3 756656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project shr \$16,$s2 757656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 758656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&lo("$s2")`,$acc0 759656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&lo("$s3")`,$acc1 760656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&lo("$s0")`,$acc2 761221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb ($sbox,$acc0,1),$acc0 #$t0 762221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb ($sbox,$acc1,1),$acc1 #$t1 763221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb ($sbox,$acc2,1),$acc2 #$t2 764656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 765656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project shl \$16,$acc0 766656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project shl \$16,$acc1 767656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project shl \$16,$acc2 768656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 769656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $acc0,$t0 770656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $acc1,$t1 771656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $acc2,$t2 772656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 773656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&lo("$s1")`,$acc0 774656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&hi("$s1")`,$acc1 775656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&hi("$s2")`,$acc2 776221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb ($sbox,$acc0,1),$acc0 #$t3 777221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb ($sbox,$acc1,1),$acc1 #$t0 778221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb ($sbox,$acc2,1),$acc2 #$t1 779656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 780656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project shl \$16,$acc0 781656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project shl \$24,$acc1 782656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project shl \$24,$acc2 783656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 784656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $acc0,$t3 785656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $acc1,$t0 786656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $acc2,$t1 787656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 788656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&hi("$s3")`,$acc0 789656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movzb `&hi("$s0")`,$acc1 790656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 16+12($key),$s3 791221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb ($sbox,$acc0,1),$acc0 #$t2 792221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb ($sbox,$acc1,1),$acc1 #$t3 793656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 16+0($key),$s0 794656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 795656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project shl \$24,$acc0 796656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project shl \$24,$acc1 797656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 798656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $acc0,$t2 799656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $acc1,$t3 800656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 801656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 16+4($key),$s1 802656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 16+8($key),$s2 803221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lea -2048($sbox),$sbox 804656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $t0,$s0 805656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $t1,$s1 806656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $t2,$s2 807656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor $t3,$s3 808656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___ 809656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 810656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 811656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub decstep() 812656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ my ($i,@s) = @_; 813656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project my $tmp0=$acc0; 814656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project my $tmp1=$acc1; 815656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project my $tmp2=$acc2; 816656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project my $out=($t0,$t1,$t2,$s[0])[$i]; 817656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 818656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" mov $s[0],$out\n" if ($i!=3); 819656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $tmp1=$s[2] if ($i==3); 820656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" mov $s[2],$tmp1\n" if ($i!=3); 821656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" and \$0xFF,$out\n"; 822656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 823656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" mov 0($sbox,$out,8),$out\n"; 824656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" shr \$16,$tmp1\n"; 825656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $tmp2=$s[3] if ($i==3); 826656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" mov $s[3],$tmp2\n" if ($i!=3); 827656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 828656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $tmp0=$s[1] if ($i==3); 829656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" movzb ".&hi($s[1]).",$tmp0\n"; 830656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" and \$0xFF,$tmp1\n"; 831656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" shr \$24,$tmp2\n"; 832656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 833656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" xor 3($sbox,$tmp0,8),$out\n"; 834656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" xor 2($sbox,$tmp1,8),$out\n"; 835656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" xor 1($sbox,$tmp2,8),$out\n"; 836656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 837656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" mov $t2,$s[1]\n" if ($i==3); 838656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" mov $t1,$s[2]\n" if ($i==3); 839656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" mov $t0,$s[3]\n" if ($i==3); 840656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.="\n"; 841656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 842656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 843656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub declast() 844656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ my ($i,@s)=@_; 845656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project my $tmp0=$acc0; 846656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project my $tmp1=$acc1; 847656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project my $tmp2=$acc2; 848656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project my $out=($t0,$t1,$t2,$s[0])[$i]; 849656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 850656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" mov $s[0],$out\n" if ($i!=3); 851656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $tmp1=$s[2] if ($i==3); 852656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" mov $s[2],$tmp1\n" if ($i!=3); 853656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" and \$0xFF,$out\n"; 854656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 855656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" movzb 2048($sbox,$out,1),$out\n"; 856656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" shr \$16,$tmp1\n"; 857656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $tmp2=$s[3] if ($i==3); 858656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" mov $s[3],$tmp2\n" if ($i!=3); 859656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 860656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $tmp0=$s[1] if ($i==3); 861656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" movzb ".&hi($s[1]).",$tmp0\n"; 862656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" and \$0xFF,$tmp1\n"; 863656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" shr \$24,$tmp2\n"; 864656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 865656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" movzb 2048($sbox,$tmp0,1),$tmp0\n"; 866656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" movzb 2048($sbox,$tmp1,1),$tmp1\n"; 867656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" movzb 2048($sbox,$tmp2,1),$tmp2\n"; 868656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 869656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" shl \$8,$tmp0\n"; 870656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" shl \$16,$tmp1\n"; 871656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" shl \$24,$tmp2\n"; 872656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 873656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" xor $tmp0,$out\n"; 874656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" mov $t2,$s[1]\n" if ($i==3); 875656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" xor $tmp1,$out\n"; 876656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" mov $t1,$s[2]\n" if ($i==3); 877656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" xor $tmp2,$out\n"; 878656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=" mov $t0,$s[3]\n" if ($i==3); 879656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.="\n"; 880656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 881656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 882656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___; 883656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.type _x86_64_AES_decrypt,\@abi-omnipotent 884656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align 16 885656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project_x86_64_AES_decrypt: 886656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 0($key),$s0 # xor with key 887656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 4($key),$s1 888656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 8($key),$s2 889656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 12($key),$s3 890656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 891656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 240($key),$rnds # load key->rounds 892656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sub \$1,$rnds 893656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project jmp .Ldec_loop 894656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align 16 895656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Ldec_loop: 896656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___ 897656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ($verticalspin) { &decvert(); } 898656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else { &decstep(0,$s0,$s3,$s2,$s1); 899656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &decstep(1,$s1,$s0,$s3,$s2); 900656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &decstep(2,$s2,$s1,$s0,$s3); 901656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &decstep(3,$s3,$s2,$s1,$s0); 902656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=<<___; 903656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lea 16($key),$key 904656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 0($key),$s0 # xor with key 905656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 4($key),$s1 906656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 8($key),$s2 907656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 12($key),$s3 908656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___ 909656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 910656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___; 911656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sub \$1,$rnds 912656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project jnz .Ldec_loop 913656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___ 914656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ($verticalspin) { &declastvert(); } 915656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else { &declast(0,$s0,$s3,$s2,$s1); 916656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &declast(1,$s1,$s0,$s3,$s2); 917656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &declast(2,$s2,$s1,$s0,$s3); 918656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &declast(3,$s3,$s2,$s1,$s0); 919656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project $code.=<<___; 920656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 16+0($key),$s0 # xor with key 921656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 16+4($key),$s1 922656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 16+8($key),$s2 923656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 16+12($key),$s3 924656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___ 925656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 926656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___; 927656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project .byte 0xf3,0xc3 # rep ret 928656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.size _x86_64_AES_decrypt,.-_x86_64_AES_decrypt 929656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___ 930656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 931221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromsub deccompactvert() 932221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom{ my ($t3,$t4,$t5)=("%r8d","%r9d","%r13d"); 933221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 934221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$code.=<<___; 935221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb `&lo("$s0")`,$t0 936221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb `&lo("$s1")`,$t1 937221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb `&lo("$s2")`,$t2 938221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb ($sbox,$t0,1),$t0 939221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb ($sbox,$t1,1),$t1 940221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb ($sbox,$t2,1),$t2 941221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 942221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb `&lo("$s3")`,$t3 943221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb `&hi("$s3")`,$acc0 944221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb `&hi("$s0")`,$acc1 945221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb ($sbox,$t3,1),$t3 946221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb ($sbox,$acc0,1),$t4 #$t0 947221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb ($sbox,$acc1,1),$t5 #$t1 948221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 949221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb `&hi("$s1")`,$acc2 950221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb `&hi("$s2")`,$acc0 951221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom shr \$16,$s2 952221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb ($sbox,$acc2,1),$acc2 #$t2 953221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb ($sbox,$acc0,1),$acc0 #$t3 954221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom shr \$16,$s3 955221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 956221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb `&lo("$s2")`,$acc1 957221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom shl \$8,$t4 958221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom shl \$8,$t5 959221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb ($sbox,$acc1,1),$acc1 #$t0 960221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $t4,$t0 961221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $t5,$t1 962221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 963221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb `&lo("$s3")`,$t4 964221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom shr \$16,$s0 965221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom shr \$16,$s1 966221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb `&lo("$s0")`,$t5 967221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom shl \$8,$acc2 968221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom shl \$8,$acc0 969221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb ($sbox,$t4,1),$t4 #$t1 970221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb ($sbox,$t5,1),$t5 #$t2 971221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $acc2,$t2 972221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $acc0,$t3 973221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 974221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb `&lo("$s1")`,$acc2 975221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb `&hi("$s1")`,$acc0 976221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom shl \$16,$acc1 977221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb ($sbox,$acc2,1),$acc2 #$t3 978221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb ($sbox,$acc0,1),$acc0 #$t0 979221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $acc1,$t0 980221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 981221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb `&hi("$s2")`,$acc1 982221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom shl \$16,$t4 983221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom shl \$16,$t5 984221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb ($sbox,$acc1,1),$s1 #$t1 985221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $t4,$t1 986221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $t5,$t2 987221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 988221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb `&hi("$s3")`,$acc1 989221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom shr \$8,$s0 990221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom shl \$16,$acc2 991221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb ($sbox,$acc1,1),$s2 #$t2 992221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb ($sbox,$s0,1),$s3 #$t3 993221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $acc2,$t3 994221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 995221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom shl \$24,$acc0 996221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom shl \$24,$s1 997221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom shl \$24,$s2 998221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $acc0,$t0 999221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom shl \$24,$s3 1000221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $t1,$s1 1001221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $t0,$s0 1002221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $t2,$s2 1003221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $t3,$s3 1004221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom___ 1005221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom} 1006221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1007221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom# parallelized version! input is pair of 64-bit values: %rax=s1.s0 1008221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom# and %rcx=s3.s2, output is four 32-bit values in %eax=s0, %ebx=s1, 1009221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom# %ecx=s2 and %edx=s3. 1010221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromsub dectransform() 1011221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom{ my ($tp10,$tp20,$tp40,$tp80,$acc0)=("%rax","%r8", "%r9", "%r10","%rbx"); 1012221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom my ($tp18,$tp28,$tp48,$tp88,$acc8)=("%rcx","%r11","%r12","%r13","%rdx"); 1013221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom my $prefetch = shift; 1014221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1015221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$code.=<<___; 1016221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $tp10,$acc0 1017221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $tp18,$acc8 1018221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom and $mask80,$acc0 1019221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom and $mask80,$acc8 1020221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $acc0,$tp40 1021221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $acc8,$tp48 1022221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom shr \$7,$tp40 1023221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lea ($tp10,$tp10),$tp20 1024221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom shr \$7,$tp48 1025221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lea ($tp18,$tp18),$tp28 1026221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sub $tp40,$acc0 1027221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sub $tp48,$acc8 1028221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom and $maskfe,$tp20 1029221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom and $maskfe,$tp28 1030221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom and $mask1b,$acc0 1031221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom and $mask1b,$acc8 1032221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $tp20,$acc0 1033221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $tp28,$acc8 1034221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $acc0,$tp20 1035221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $acc8,$tp28 1036221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1037221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom and $mask80,$acc0 1038221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom and $mask80,$acc8 1039221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $acc0,$tp80 1040221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $acc8,$tp88 1041221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom shr \$7,$tp80 1042221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lea ($tp20,$tp20),$tp40 1043221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom shr \$7,$tp88 1044221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lea ($tp28,$tp28),$tp48 1045221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sub $tp80,$acc0 1046221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sub $tp88,$acc8 1047221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom and $maskfe,$tp40 1048221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom and $maskfe,$tp48 1049221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom and $mask1b,$acc0 1050221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom and $mask1b,$acc8 1051221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $tp40,$acc0 1052221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $tp48,$acc8 1053221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $acc0,$tp40 1054221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $acc8,$tp48 1055221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1056221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom and $mask80,$acc0 1057221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom and $mask80,$acc8 1058221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $acc0,$tp80 1059221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $acc8,$tp88 1060221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom shr \$7,$tp80 1061221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $tp10,$tp20 # tp2^=tp1 1062221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom shr \$7,$tp88 1063221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $tp18,$tp28 # tp2^=tp1 1064221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sub $tp80,$acc0 1065221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sub $tp88,$acc8 1066221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lea ($tp40,$tp40),$tp80 1067221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lea ($tp48,$tp48),$tp88 1068221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $tp10,$tp40 # tp4^=tp1 1069221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $tp18,$tp48 # tp4^=tp1 1070221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom and $maskfe,$tp80 1071221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom and $maskfe,$tp88 1072221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom and $mask1b,$acc0 1073221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom and $mask1b,$acc8 1074221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $acc0,$tp80 1075221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $acc8,$tp88 1076221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1077221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $tp80,$tp10 # tp1^=tp8 1078221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $tp88,$tp18 # tp1^=tp8 1079221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $tp80,$tp20 # tp2^tp1^=tp8 1080221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $tp88,$tp28 # tp2^tp1^=tp8 1081221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $tp10,$acc0 1082221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $tp18,$acc8 1083221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $tp80,$tp40 # tp4^tp1^=tp8 1084221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $tp88,$tp48 # tp4^tp1^=tp8 1085221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom shr \$32,$acc0 1086221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom shr \$32,$acc8 1087221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $tp20,$tp80 # tp8^=tp8^tp2^tp1=tp2^tp1 1088221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $tp28,$tp88 # tp8^=tp8^tp2^tp1=tp2^tp1 1089221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom rol \$8,`&LO("$tp10")` # ROTATE(tp1^tp8,8) 1090221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom rol \$8,`&LO("$tp18")` # ROTATE(tp1^tp8,8) 1091221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $tp40,$tp80 # tp2^tp1^=tp8^tp4^tp1=tp8^tp4^tp2 1092221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $tp48,$tp88 # tp2^tp1^=tp8^tp4^tp1=tp8^tp4^tp2 1093221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1094221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom rol \$8,`&LO("$acc0")` # ROTATE(tp1^tp8,8) 1095221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom rol \$8,`&LO("$acc8")` # ROTATE(tp1^tp8,8) 1096221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor `&LO("$tp80")`,`&LO("$tp10")` 1097221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor `&LO("$tp88")`,`&LO("$tp18")` 1098221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom shr \$32,$tp80 1099221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom shr \$32,$tp88 1100221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor `&LO("$tp80")`,`&LO("$acc0")` 1101221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor `&LO("$tp88")`,`&LO("$acc8")` 1102221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1103221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $tp20,$tp80 1104221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $tp28,$tp88 1105221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom shr \$32,$tp80 1106221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom shr \$32,$tp88 1107221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom rol \$24,`&LO("$tp20")` # ROTATE(tp2^tp1^tp8,24) 1108221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom rol \$24,`&LO("$tp28")` # ROTATE(tp2^tp1^tp8,24) 1109221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom rol \$24,`&LO("$tp80")` # ROTATE(tp2^tp1^tp8,24) 1110221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom rol \$24,`&LO("$tp88")` # ROTATE(tp2^tp1^tp8,24) 1111221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor `&LO("$tp20")`,`&LO("$tp10")` 1112221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor `&LO("$tp28")`,`&LO("$tp18")` 1113221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $tp40,$tp20 1114221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $tp48,$tp28 1115221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor `&LO("$tp80")`,`&LO("$acc0")` 1116221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor `&LO("$tp88")`,`&LO("$acc8")` 1117221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1118221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom `"mov 0($sbox),$mask80" if ($prefetch)` 1119221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom shr \$32,$tp20 1120221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom shr \$32,$tp28 1121221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom `"mov 64($sbox),$maskfe" if ($prefetch)` 1122221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom rol \$16,`&LO("$tp40")` # ROTATE(tp4^tp1^tp8,16) 1123221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom rol \$16,`&LO("$tp48")` # ROTATE(tp4^tp1^tp8,16) 1124221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom `"mov 128($sbox),$mask1b" if ($prefetch)` 1125221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom rol \$16,`&LO("$tp20")` # ROTATE(tp4^tp1^tp8,16) 1126221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom rol \$16,`&LO("$tp28")` # ROTATE(tp4^tp1^tp8,16) 1127221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom `"mov 192($sbox),$tp80" if ($prefetch)` 1128221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor `&LO("$tp40")`,`&LO("$tp10")` 1129221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor `&LO("$tp48")`,`&LO("$tp18")` 1130221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom `"mov 256($sbox),$tp88" if ($prefetch)` 1131221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor `&LO("$tp20")`,`&LO("$acc0")` 1132221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor `&LO("$tp28")`,`&LO("$acc8")` 1133221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom___ 1134221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom} 1135221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1136221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$code.=<<___; 1137221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.type _x86_64_AES_decrypt_compact,\@abi-omnipotent 1138221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.align 16 1139221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom_x86_64_AES_decrypt_compact: 1140221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lea 128($sbox),$inp # size optimization 1141221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 0-128($inp),$acc1 # prefetch Td4 1142221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 32-128($inp),$acc2 1143221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 64-128($inp),$t0 1144221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 96-128($inp),$t1 1145221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 128-128($inp),$acc1 1146221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 160-128($inp),$acc2 1147221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 192-128($inp),$t0 1148221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 224-128($inp),$t1 1149221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom jmp .Ldec_loop_compact 1150221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1151221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.align 16 1152221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Ldec_loop_compact: 1153221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor 0($key),$s0 # xor with key 1154221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor 4($key),$s1 1155221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor 8($key),$s2 1156221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor 12($key),$s3 1157221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lea 16($key),$key 1158221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom___ 1159221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &deccompactvert(); 1160221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$code.=<<___; 1161221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom cmp 16(%rsp),$key 1162221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom je .Ldec_compact_done 1163221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1164221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 256+0($sbox),$mask80 1165221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom shl \$32,%rbx 1166221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom shl \$32,%rdx 1167221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 256+8($sbox),$maskfe 1168221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom or %rbx,%rax 1169221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom or %rdx,%rcx 1170221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 256+16($sbox),$mask1b 1171221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom___ 1172221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &dectransform(1); 1173221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$code.=<<___; 1174221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom jmp .Ldec_loop_compact 1175221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.align 16 1176221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Ldec_compact_done: 1177221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor 0($key),$s0 1178221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor 4($key),$s1 1179221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor 8($key),$s2 1180221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor 12($key),$s3 1181221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom .byte 0xf3,0xc3 # rep ret 1182221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.size _x86_64_AES_decrypt_compact,.-_x86_64_AES_decrypt_compact 1183221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom___ 1184221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1185656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# void AES_decrypt (const void *inp,void *out,const AES_KEY *key); 1186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___; 1187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.globl AES_decrypt 1188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.type AES_decrypt,\@function,3 1189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align 16 1190392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.globl asm_AES_decrypt 1191392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.hidden asm_AES_decrypt 1192392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromasm_AES_decrypt: 1193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectAES_decrypt: 1194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project push %rbx 1195656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project push %rbp 1196656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project push %r12 1197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project push %r13 1198656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project push %r14 1199656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project push %r15 1200656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1201221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom # allocate frame "above" key schedule 1202221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %rsp,%r10 1203221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lea -63(%rdx),%rcx # %rdx is key argument 1204221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom and \$-64,%rsp 1205221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sub %rsp,%rcx 1206221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom neg %rcx 1207221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom and \$0x3c0,%rcx 1208221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sub %rcx,%rsp 1209221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sub \$32,%rsp 1210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1211221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %rsi,16(%rsp) # save out 1212221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %r10,24(%rsp) # save real stack pointer 1213221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Ldec_prologue: 1214221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1215221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %rdx,$key 1216221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 240($key),$rnds # load rounds 1217221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1218221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 0(%rdi),$s0 # load input vector 1219221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 4(%rdi),$s1 1220221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 8(%rdi),$s2 1221221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 12(%rdi),$s3 1222221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1223221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom shl \$4,$rnds 1224221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lea ($key,$rnds),%rbp 1225221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $key,(%rsp) # key schedule 1226221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %rbp,8(%rsp) # end of key schedule 1227221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1228221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom # pick Td4 copy which can't "overlap" with stack frame or key schedule 1229221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lea .LAES_Td+2048(%rip),$sbox 1230221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lea 768(%rsp),%rbp 1231221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sub $sbox,%rbp 1232221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom and \$0x300,%rbp 1233221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lea ($sbox,%rbp),$sbox 1234221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom shr \$3,%rbp # recall "magic" constants! 1235221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom add %rbp,$sbox 1236221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1237221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom call _x86_64_AES_decrypt_compact 1238221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1239221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 16(%rsp),$out # restore out 1240221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 24(%rsp),%rsi # restore saved stack pointer 1241221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $s0,0($out) # write output vector 1242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $s1,4($out) 1243656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $s2,8($out) 1244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $s3,12($out) 1245656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1246221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov (%rsi),%r15 1247221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 8(%rsi),%r14 1248221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 16(%rsi),%r13 1249221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 24(%rsi),%r12 1250221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 32(%rsi),%rbp 1251221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 40(%rsi),%rbx 1252221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lea 48(%rsi),%rsp 1253221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Ldec_epilogue: 1254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret 1255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.size AES_decrypt,.-AES_decrypt 1256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___ 1257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#------------------------------------------------------------------# 1258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectsub enckey() 1260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ 1261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___; 1262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movz %dl,%esi # rk[i]>>0 1263221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb -128(%rbp,%rsi),%ebx 1264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movz %dh,%esi # rk[i]>>8 1265221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom shl \$24,%ebx 1266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor %ebx,%eax 1267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1268221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb -128(%rbp,%rsi),%ebx 1269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project shr \$16,%edx 1270656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movz %dl,%esi # rk[i]>>16 1271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor %ebx,%eax 1272656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1273221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb -128(%rbp,%rsi),%ebx 1274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movz %dh,%esi # rk[i]>>24 1275221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom shl \$8,%ebx 1276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor %ebx,%eax 1277656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1278221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb -128(%rbp,%rsi),%ebx 1279221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom shl \$16,%ebx 1280656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor %ebx,%eax 1281656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1282221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor 1024-128(%rbp,%rcx,4),%eax # rcon 1283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___ 1284656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 1285656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1286392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom# int private_AES_set_encrypt_key(const unsigned char *userKey, const int bits, 1287656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# AES_KEY *key) 1288656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___; 1289392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.globl private_AES_set_encrypt_key 1290392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.type private_AES_set_encrypt_key,\@function,3 1291656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align 16 1292392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromprivate_AES_set_encrypt_key: 1293656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project push %rbx 1294656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project push %rbp 1295221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom push %r12 # redundant, but allows to share 1296221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom push %r13 # exception handler... 1297221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom push %r14 1298221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom push %r15 1299221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sub \$8,%rsp 1300221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Lenc_key_prologue: 1301221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1302221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom call _x86_64_AES_set_encrypt_key 1303221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1304221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 8(%rsp),%r15 1305221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 16(%rsp),%r14 1306221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 24(%rsp),%r13 1307221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 32(%rsp),%r12 1308221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 40(%rsp),%rbp 1309221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 48(%rsp),%rbx 1310221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom add \$56,%rsp 1311221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Lenc_key_epilogue: 1312221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ret 1313392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.size private_AES_set_encrypt_key,.-private_AES_set_encrypt_key 1314656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1315221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.type _x86_64_AES_set_encrypt_key,\@abi-omnipotent 1316221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.align 16 1317221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom_x86_64_AES_set_encrypt_key: 1318656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %esi,%ecx # %ecx=bits 1319656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %rdi,%rsi # %rsi=userKey 1320656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %rdx,%rdi # %rdi=key 1321656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1322656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project test \$-1,%rsi 1323656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project jz .Lbadpointer 1324656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project test \$-1,%rdi 1325656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project jz .Lbadpointer 1326656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1327221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lea .LAES_Te(%rip),%rbp 1328221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lea 2048+128(%rbp),%rbp 1329221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1330221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom # prefetch Te4 1331221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 0-128(%rbp),%eax 1332221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 32-128(%rbp),%ebx 1333221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 64-128(%rbp),%r8d 1334221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 96-128(%rbp),%edx 1335221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 128-128(%rbp),%eax 1336221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 160-128(%rbp),%ebx 1337221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 192-128(%rbp),%r8d 1338221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 224-128(%rbp),%edx 1339656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1340656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cmp \$128,%ecx 1341656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project je .L10rounds 1342656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cmp \$192,%ecx 1343656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project je .L12rounds 1344656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cmp \$256,%ecx 1345656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project je .L14rounds 1346656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov \$-2,%rax # invalid number of bits 1347656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project jmp .Lexit 1348656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1349656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.L10rounds: 1350221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 0(%rsi),%rax # copy first 4 dwords 1351221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 8(%rsi),%rdx 1352221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %rax,0(%rdi) 1353221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %rdx,8(%rdi) 1354656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1355221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom shr \$32,%rdx 1356656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor %ecx,%ecx 1357656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project jmp .L10shortcut 1358656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align 4 1359656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.L10loop: 1360656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 0(%rdi),%eax # rk[0] 1361656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 12(%rdi),%edx # rk[3] 1362656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.L10shortcut: 1363656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___ 1364656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &enckey (); 1365656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___; 1366656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %eax,16(%rdi) # rk[4] 1367656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 4(%rdi),%eax 1368656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %eax,20(%rdi) # rk[5] 1369656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 8(%rdi),%eax 1370656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %eax,24(%rdi) # rk[6] 1371656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 12(%rdi),%eax 1372656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %eax,28(%rdi) # rk[7] 1373656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project add \$1,%ecx 1374656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lea 16(%rdi),%rdi 1375656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cmp \$10,%ecx 1376656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project jl .L10loop 1377656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1378656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movl \$10,80(%rdi) # setup number of rounds 1379656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor %rax,%rax 1380656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project jmp .Lexit 1381656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1382656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.L12rounds: 1383221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 0(%rsi),%rax # copy first 6 dwords 1384221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 8(%rsi),%rbx 1385221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 16(%rsi),%rdx 1386221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %rax,0(%rdi) 1387221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %rbx,8(%rdi) 1388221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %rdx,16(%rdi) 1389221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1390221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom shr \$32,%rdx 1391656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor %ecx,%ecx 1392656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project jmp .L12shortcut 1393656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align 4 1394656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.L12loop: 1395656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 0(%rdi),%eax # rk[0] 1396656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 20(%rdi),%edx # rk[5] 1397656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.L12shortcut: 1398656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___ 1399656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &enckey (); 1400656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___; 1401656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %eax,24(%rdi) # rk[6] 1402656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 4(%rdi),%eax 1403656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %eax,28(%rdi) # rk[7] 1404656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 8(%rdi),%eax 1405656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %eax,32(%rdi) # rk[8] 1406656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 12(%rdi),%eax 1407656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %eax,36(%rdi) # rk[9] 1408656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1409656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cmp \$7,%ecx 1410656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project je .L12break 1411656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project add \$1,%ecx 1412656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1413656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 16(%rdi),%eax 1414656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %eax,40(%rdi) # rk[10] 1415656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 20(%rdi),%eax 1416656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %eax,44(%rdi) # rk[11] 1417656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1418656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lea 24(%rdi),%rdi 1419656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project jmp .L12loop 1420656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.L12break: 1421656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movl \$12,72(%rdi) # setup number of rounds 1422656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor %rax,%rax 1423656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project jmp .Lexit 1424656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1425656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.L14rounds: 1426221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 0(%rsi),%rax # copy first 8 dwords 1427221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 8(%rsi),%rbx 1428221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 16(%rsi),%rcx 1429221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 24(%rsi),%rdx 1430221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %rax,0(%rdi) 1431221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %rbx,8(%rdi) 1432221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %rcx,16(%rdi) 1433221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %rdx,24(%rdi) 1434221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1435221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom shr \$32,%rdx 1436656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor %ecx,%ecx 1437656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project jmp .L14shortcut 1438656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align 4 1439656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.L14loop: 1440221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 0(%rdi),%eax # rk[0] 1441656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 28(%rdi),%edx # rk[4] 1442656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.L14shortcut: 1443656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___ 1444656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &enckey (); 1445656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___; 1446656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %eax,32(%rdi) # rk[8] 1447656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 4(%rdi),%eax 1448656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %eax,36(%rdi) # rk[9] 1449656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 8(%rdi),%eax 1450656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %eax,40(%rdi) # rk[10] 1451656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 12(%rdi),%eax 1452656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %eax,44(%rdi) # rk[11] 1453656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1454656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cmp \$6,%ecx 1455656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project je .L14break 1456656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project add \$1,%ecx 1457656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1458656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %eax,%edx 1459656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 16(%rdi),%eax # rk[4] 1460656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movz %dl,%esi # rk[11]>>0 1461221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb -128(%rbp,%rsi),%ebx 1462656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movz %dh,%esi # rk[11]>>8 1463656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor %ebx,%eax 1464656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1465221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb -128(%rbp,%rsi),%ebx 1466656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project shr \$16,%edx 1467221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom shl \$8,%ebx 1468656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movz %dl,%esi # rk[11]>>16 1469656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor %ebx,%eax 1470656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1471221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb -128(%rbp,%rsi),%ebx 1472656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movz %dh,%esi # rk[11]>>24 1473221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom shl \$16,%ebx 1474656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor %ebx,%eax 1475656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1476221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom movzb -128(%rbp,%rsi),%ebx 1477221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom shl \$24,%ebx 1478656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor %ebx,%eax 1479656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1480656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %eax,48(%rdi) # rk[12] 1481656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 20(%rdi),%eax 1482656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %eax,52(%rdi) # rk[13] 1483656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 24(%rdi),%eax 1484656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %eax,56(%rdi) # rk[14] 1485656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 28(%rdi),%eax 1486656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %eax,60(%rdi) # rk[15] 1487656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1488656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lea 32(%rdi),%rdi 1489656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project jmp .L14loop 1490656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.L14break: 1491656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movl \$14,48(%rdi) # setup number of rounds 1492656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor %rax,%rax 1493656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project jmp .Lexit 1494656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1495656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Lbadpointer: 1496656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov \$-1,%rax 1497656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Lexit: 1498221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom .byte 0xf3,0xc3 # rep ret 1499221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.size _x86_64_AES_set_encrypt_key,.-_x86_64_AES_set_encrypt_key 1500656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___ 1501656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1502221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromsub deckey_ref() 1503656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ my ($i,$ptr,$te,$td) = @_; 1504221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom my ($tp1,$tp2,$tp4,$tp8,$acc)=("%eax","%ebx","%edi","%edx","%r8d"); 1505656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___; 1506221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $i($ptr),$tp1 1507221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $tp1,$acc 1508221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom and \$0x80808080,$acc 1509221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $acc,$tp4 1510221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom shr \$7,$tp4 1511221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lea 0($tp1,$tp1),$tp2 1512221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sub $tp4,$acc 1513221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom and \$0xfefefefe,$tp2 1514221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom and \$0x1b1b1b1b,$acc 1515221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $tp2,$acc 1516221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $acc,$tp2 1517221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1518221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom and \$0x80808080,$acc 1519221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $acc,$tp8 1520221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom shr \$7,$tp8 1521221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lea 0($tp2,$tp2),$tp4 1522221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sub $tp8,$acc 1523221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom and \$0xfefefefe,$tp4 1524221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom and \$0x1b1b1b1b,$acc 1525221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $tp1,$tp2 # tp2^tp1 1526221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $tp4,$acc 1527221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $acc,$tp4 1528221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1529221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom and \$0x80808080,$acc 1530221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $acc,$tp8 1531221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom shr \$7,$tp8 1532221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sub $tp8,$acc 1533221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lea 0($tp4,$tp4),$tp8 1534221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $tp1,$tp4 # tp4^tp1 1535221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom and \$0xfefefefe,$tp8 1536221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom and \$0x1b1b1b1b,$acc 1537221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $acc,$tp8 1538221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1539221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $tp8,$tp1 # tp1^tp8 1540221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom rol \$8,$tp1 # ROTATE(tp1^tp8,8) 1541221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $tp8,$tp2 # tp2^tp1^tp8 1542221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $tp8,$tp4 # tp4^tp1^tp8 1543221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $tp2,$tp8 1544221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $tp4,$tp8 # tp8^(tp8^tp4^tp1)^(tp8^tp2^tp1)=tp8^tp4^tp2 1545221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1546221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $tp8,$tp1 1547221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom rol \$24,$tp2 # ROTATE(tp2^tp1^tp8,24) 1548221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $tp2,$tp1 1549221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom rol \$16,$tp4 # ROTATE(tp4^tp1^tp8,16) 1550221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor $tp4,$tp1 1551221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1552221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $tp1,$i($ptr) 1553656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___ 1554656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 1555656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1556392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom# int private_AES_set_decrypt_key(const unsigned char *userKey, const int bits, 1557656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# AES_KEY *key) 1558656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___; 1559392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.globl private_AES_set_decrypt_key 1560392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.type private_AES_set_decrypt_key,\@function,3 1561656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align 16 1562392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromprivate_AES_set_decrypt_key: 1563221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom push %rbx 1564221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom push %rbp 1565221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom push %r12 1566221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom push %r13 1567221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom push %r14 1568221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom push %r15 1569221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom push %rdx # save key schedule 1570221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Ldec_key_prologue: 1571221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1572221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom call _x86_64_AES_set_encrypt_key 1573656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov (%rsp),%r8 # restore key schedule 1574221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom cmp \$0,%eax 1575221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom jne .Labort 1576656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1577221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 240(%r8),%r14d # pull number of rounds 1578656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor %rdi,%rdi 1579221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lea (%rdi,%r14d,4),%rcx 1580656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %r8,%rsi 1581656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lea (%r8,%rcx,4),%rdi # pointer to last chunk 1582656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align 4 1583656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Linvert: 1584656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 0(%rsi),%rax 1585656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 8(%rsi),%rbx 1586656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 0(%rdi),%rcx 1587656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 8(%rdi),%rdx 1588656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %rax,0(%rdi) 1589656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %rbx,8(%rdi) 1590656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %rcx,0(%rsi) 1591656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %rdx,8(%rsi) 1592656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lea 16(%rsi),%rsi 1593656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lea -16(%rdi),%rdi 1594656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cmp %rsi,%rdi 1595656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project jne .Linvert 1596656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1597221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lea .LAES_Te+2048+1024(%rip),%rax # rcon 1598656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1599221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 40(%rax),$mask80 1600221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 48(%rax),$maskfe 1601221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 56(%rax),$mask1b 1602221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1603221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %r8,$key 1604221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sub \$1,%r14d 1605656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align 4 1606656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Lpermute: 1607221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lea 16($key),$key 1608221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 0($key),%rax 1609221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 8($key),%rcx 1610656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___ 1611221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &dectransform (); 1612656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___; 1613221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %eax,0($key) 1614221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %ebx,4($key) 1615221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %ecx,8($key) 1616221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %edx,12($key) 1617221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sub \$1,%r14d 1618656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project jnz .Lpermute 1619656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1620656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor %rax,%rax 1621221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Labort: 1622221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 8(%rsp),%r15 1623221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 16(%rsp),%r14 1624221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 24(%rsp),%r13 1625221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 32(%rsp),%r12 1626221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 40(%rsp),%rbp 1627221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 48(%rsp),%rbx 1628221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom add \$56,%rsp 1629221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Ldec_key_epilogue: 1630656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ret 1631392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.size private_AES_set_decrypt_key,.-private_AES_set_decrypt_key 1632656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___ 1633656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1634656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# void AES_cbc_encrypt (const void char *inp, unsigned char *out, 1635656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# size_t length, const AES_KEY *key, 1636656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# unsigned char *ivp,const int enc); 1637656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ 1638656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# stack frame layout 1639656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# -8(%rsp) return address 1640221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrommy $keyp="0(%rsp)"; # one to pass as $key 1641221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrommy $keyend="8(%rsp)"; # &(keyp->rd_key[4*keyp->rounds]) 1642221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrommy $_rsp="16(%rsp)"; # saved %rsp 1643221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrommy $_inp="24(%rsp)"; # copy of 1st parameter, inp 1644221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrommy $_out="32(%rsp)"; # copy of 2nd parameter, out 1645221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrommy $_len="40(%rsp)"; # copy of 3rd parameter, length 1646221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrommy $_key="48(%rsp)"; # copy of 4th parameter, key 1647221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrommy $_ivp="56(%rsp)"; # copy of 5th parameter, ivp 1648221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrommy $ivec="64(%rsp)"; # ivec[16] 1649221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrommy $aes_key="80(%rsp)"; # copy of aes_key 1650221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrommy $mark="80+240(%rsp)"; # copy of aes_key->rounds 1651656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1652656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___; 1653656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.globl AES_cbc_encrypt 1654656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.type AES_cbc_encrypt,\@function,6 1655656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align 16 1656221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.extern OPENSSL_ia32cap_P 1657392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.globl asm_AES_cbc_encrypt 1658392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.hidden asm_AES_cbc_encrypt 1659392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromasm_AES_cbc_encrypt: 1660656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectAES_cbc_encrypt: 1661656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cmp \$0,%rdx # check length 1662221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom je .Lcbc_epilogue 1663221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom pushfq 1664656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project push %rbx 1665656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project push %rbp 1666656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project push %r12 1667656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project push %r13 1668656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project push %r14 1669656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project push %r15 1670221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Lcbc_prologue: 1671221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1672656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cld 1673656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %r9d,%r9d # clear upper half of enc 1674656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1675221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lea .LAES_Te(%rip),$sbox 1676656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cmp \$0,%r9 1677221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom jne .Lcbc_picked_te 1678221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lea .LAES_Td(%rip),$sbox 1679221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Lcbc_picked_te: 1680221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1681221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov OPENSSL_ia32cap_P(%rip),%r10d 1682221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom cmp \$$speed_limit,%rdx 1683221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom jb .Lcbc_slow_prologue 1684221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom test \$15,%rdx 1685221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom jnz .Lcbc_slow_prologue 1686221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom bt \$28,%r10d 1687221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom jc .Lcbc_slow_prologue 1688656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1689656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project # allocate aligned stack frame... 1690221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lea -88-248(%rsp),$key 1691656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project and \$-64,$key 1692656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1693221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom # ... and make sure it doesn't alias with AES_T[ed] modulo 4096 1694656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $sbox,%r10 1695221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lea 2304($sbox),%r11 1696656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $key,%r12 1697656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project and \$0xFFF,%r10 # s = $sbox&0xfff 1698656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project and \$0xFFF,%r11 # e = ($sbox+2048)&0xfff 1699656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project and \$0xFFF,%r12 # p = %rsp&0xfff 1700656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1701656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cmp %r11,%r12 # if (p=>e) %rsp =- (p-e); 1702656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project jb .Lcbc_te_break_out 1703656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sub %r11,%r12 1704656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sub %r12,$key 1705656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project jmp .Lcbc_te_ok 1706656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Lcbc_te_break_out: # else %rsp -= (p-s)&0xfff + framesz 1707656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sub %r10,%r12 1708656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project and \$0xFFF,%r12 1709656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project add \$320,%r12 1710656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sub %r12,$key 1711656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align 4 1712656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Lcbc_te_ok: 1713656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1714656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xchg %rsp,$key 1715221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom #add \$8,%rsp # reserve for return address! 1716656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $key,$_rsp # save %rsp 1717221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Lcbc_fast_body: 1718221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %rdi,$_inp # save copy of inp 1719221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %rsi,$_out # save copy of out 1720656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %rdx,$_len # save copy of len 1721656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %rcx,$_key # save copy of key 1722656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %r8,$_ivp # save copy of ivp 1723656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project movl \$0,$mark # copy of aes_key->rounds = 0; 1724656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %r8,%rbp # rearrange input arguments 1725221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %r9,%rbx 1726656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %rsi,$out 1727656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %rdi,$inp 1728656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %rcx,$key 1729656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1730221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 240($key),%eax # key->rounds 1731656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project # do we copy key schedule to stack? 1732656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $key,%r10 1733656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sub $sbox,%r10 1734656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project and \$0xfff,%r10 1735221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom cmp \$2304,%r10 1736656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project jb .Lcbc_do_ecopy 1737656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project cmp \$4096-248,%r10 1738656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project jb .Lcbc_skip_ecopy 1739656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align 4 1740656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Lcbc_do_ecopy: 1741656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $key,%rsi 1742656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lea $aes_key,%rdi 1743656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lea $aes_key,$key 1744656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov \$240/8,%ecx 1745656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project .long 0x90A548F3 # rep movsq 1746221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %eax,(%rdi) # copy aes_key->rounds 1747656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Lcbc_skip_ecopy: 1748656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $key,$keyp # save key pointer 1749656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1750221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov \$18,%ecx 1751656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align 4 1752656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.Lcbc_prefetch_te: 1753656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 0($sbox),%r10 1754656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 32($sbox),%r11 1755656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 64($sbox),%r12 1756656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 96($sbox),%r13 1757656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lea 128($sbox),$sbox 1758656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sub \$1,%ecx 1759656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project jnz .Lcbc_prefetch_te 1760221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lea -2304($sbox),$sbox 1761656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1762221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom cmp \$0,%rbx 1763221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom je .LFAST_DECRYPT 1764221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1765221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#----------------------------- ENCRYPT -----------------------------# 1766656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 0(%rbp),$s0 # load iv 1767656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 4(%rbp),$s1 1768656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 8(%rbp),$s2 1769656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 12(%rbp),$s3 1770656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1771656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align 4 1772221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Lcbc_fast_enc_loop: 1773656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 0($inp),$s0 1774656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 4($inp),$s1 1775656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 8($inp),$s2 1776656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 12($inp),$s3 1777656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $keyp,$key # restore key 1778221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $inp,$_inp # if ($verticalspin) save inp 1779221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1780656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project call _x86_64_AES_encrypt 1781656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1782221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $_inp,$inp # if ($verticalspin) restore inp 1783221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $_len,%r10 1784656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $s0,0($out) 1785656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $s1,4($out) 1786656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $s2,8($out) 1787656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $s3,12($out) 1788656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1789656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lea 16($inp),$inp 1790656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lea 16($out),$out 1791656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sub \$16,%r10 1792656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project test \$-16,%r10 1793656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %r10,$_len 1794221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom jnz .Lcbc_fast_enc_loop 1795656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $_ivp,%rbp # restore ivp 1796656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $s0,0(%rbp) # save ivec 1797656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $s1,4(%rbp) 1798656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $s2,8(%rbp) 1799656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $s3,12(%rbp) 1800656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1801221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom jmp .Lcbc_fast_cleanup 1802221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1803656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#----------------------------- DECRYPT -----------------------------# 1804656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align 16 1805221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.LFAST_DECRYPT: 1806221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom cmp $inp,$out 1807221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom je .Lcbc_fast_dec_in_place 1808656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1809221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %rbp,$ivec 1810656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align 4 1811221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Lcbc_fast_dec_loop: 1812221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 0($inp),$s0 # read input 1813221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 4($inp),$s1 1814221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 8($inp),$s2 1815221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 12($inp),$s3 1816221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $keyp,$key # restore key 1817221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $inp,$_inp # if ($verticalspin) save inp 1818656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1819656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project call _x86_64_AES_decrypt 1820656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1821656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $ivec,%rbp # load ivp 1822221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $_inp,$inp # if ($verticalspin) restore inp 1823221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $_len,%r10 # load len 1824656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 0(%rbp),$s0 # xor iv 1825656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 4(%rbp),$s1 1826656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 8(%rbp),$s2 1827656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project xor 12(%rbp),$s3 1828656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $inp,%rbp # current input, next iv 1829656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1830656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sub \$16,%r10 1831656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %r10,$_len # update len 1832656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %rbp,$ivec # update ivp 1833656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1834656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $s0,0($out) # write output 1835656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $s1,4($out) 1836656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $s2,8($out) 1837656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $s3,12($out) 1838656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1839656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lea 16($inp),$inp 1840656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lea 16($out),$out 1841221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom jnz .Lcbc_fast_dec_loop 1842656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $_ivp,%r12 # load user ivp 1843656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 0(%rbp),%r10 # load iv 1844656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 8(%rbp),%r11 1845656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %r10,0(%r12) # copy back to user 1846656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov %r11,8(%r12) 1847221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom jmp .Lcbc_fast_cleanup 1848656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1849656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align 16 1850221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Lcbc_fast_dec_in_place: 1851221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 0(%rbp),%r10 # copy iv to stack 1852221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 8(%rbp),%r11 1853221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %r10,0+$ivec 1854221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %r11,8+$ivec 1855221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.align 4 1856221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Lcbc_fast_dec_in_place_loop: 1857656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 0($inp),$s0 # load input 1858656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 4($inp),$s1 1859656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 8($inp),$s2 1860656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov 12($inp),$s3 1861221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $keyp,$key # restore key 1862221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $inp,$_inp # if ($verticalspin) save inp 1863656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1864656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project call _x86_64_AES_decrypt 1865656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1866221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $_inp,$inp # if ($verticalspin) restore inp 1867221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $_len,%r10 1868221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor 0+$ivec,$s0 1869221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor 4+$ivec,$s1 1870221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor 8+$ivec,$s2 1871221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor 12+$ivec,$s3 1872656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1873221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 0($inp),%r11 # load input 1874221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 8($inp),%r12 1875221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sub \$16,%r10 1876221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom jz .Lcbc_fast_dec_in_place_done 1877221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1878221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %r11,0+$ivec # copy input to iv 1879221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %r12,8+$ivec 1880656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1881656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $s0,0($out) # save output [zaps input] 1882656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $s1,4($out) 1883656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $s2,8($out) 1884656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project mov $s3,12($out) 1885656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1886656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lea 16($inp),$inp 1887656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project lea 16($out),$out 1888221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %r10,$_len 1889221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom jmp .Lcbc_fast_dec_in_place_loop 1890221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Lcbc_fast_dec_in_place_done: 1891221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $_ivp,%rdi 1892221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %r11,0(%rdi) # copy iv back to user 1893221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %r12,8(%rdi) 1894221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1895221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $s0,0($out) # save output [zaps input] 1896221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $s1,4($out) 1897221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $s2,8($out) 1898221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $s3,12($out) 1899656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 1900656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align 4 1901221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Lcbc_fast_cleanup: 1902221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom cmpl \$0,$mark # was the key schedule copied? 1903221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lea $aes_key,%rdi 1904221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom je .Lcbc_exit 1905221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov \$240/8,%ecx 1906221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor %rax,%rax 1907221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom .long 0x90AB48F3 # rep stosq 1908221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1909221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom jmp .Lcbc_exit 1910221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1911221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#--------------------------- SLOW ROUTINE ---------------------------# 1912221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.align 16 1913221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Lcbc_slow_prologue: 1914221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom # allocate aligned stack frame... 1915221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lea -88(%rsp),%rbp 1916221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom and \$-64,%rbp 1917221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom # ... just "above" key schedule 1918221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lea -88-63(%rcx),%r10 1919221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sub %rbp,%r10 1920221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom neg %r10 1921221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom and \$0x3c0,%r10 1922221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sub %r10,%rbp 1923221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1924221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xchg %rsp,%rbp 1925221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom #add \$8,%rsp # reserve for return address! 1926221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %rbp,$_rsp # save %rsp 1927221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Lcbc_slow_body: 1928221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom #mov %rdi,$_inp # save copy of inp 1929221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom #mov %rsi,$_out # save copy of out 1930221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom #mov %rdx,$_len # save copy of len 1931221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom #mov %rcx,$_key # save copy of key 1932221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %r8,$_ivp # save copy of ivp 1933221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %r8,%rbp # rearrange input arguments 1934221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %r9,%rbx 1935221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %rsi,$out 1936221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %rdi,$inp 1937221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %rcx,$key 1938221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %rdx,%r10 1939221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1940221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 240($key),%eax 1941221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $key,$keyp # save key pointer 1942221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom shl \$4,%eax 1943221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lea ($key,%rax),%rax 1944221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %rax,$keyend 1945221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1946221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom # pick Te4 copy which can't "overlap" with stack frame or key scdedule 1947221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lea 2048($sbox),$sbox 1948221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lea 768-8(%rsp),%rax 1949221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sub $sbox,%rax 1950221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom and \$0x300,%rax 1951221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lea ($sbox,%rax),$sbox 1952221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1953221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom cmp \$0,%rbx 1954221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom je .LSLOW_DECRYPT 1955221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1956221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#--------------------------- SLOW ENCRYPT ---------------------------# 1957221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom test \$-16,%r10 # check upon length 1958221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 0(%rbp),$s0 # load iv 1959221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 4(%rbp),$s1 1960221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 8(%rbp),$s2 1961221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 12(%rbp),$s3 1962221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom jz .Lcbc_slow_enc_tail # short input... 1963221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1964221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.align 4 1965221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Lcbc_slow_enc_loop: 1966221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor 0($inp),$s0 1967221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor 4($inp),$s1 1968221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor 8($inp),$s2 1969221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor 12($inp),$s3 1970221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $keyp,$key # restore key 1971221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $inp,$_inp # save inp 1972221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $out,$_out # save out 1973221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %r10,$_len # save len 1974221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1975221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom call _x86_64_AES_encrypt_compact 1976221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1977221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $_inp,$inp # restore inp 1978221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $_out,$out # restore out 1979221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $_len,%r10 # restore len 1980221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $s0,0($out) 1981221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $s1,4($out) 1982221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $s2,8($out) 1983221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $s3,12($out) 1984221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1985221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lea 16($inp),$inp 1986221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lea 16($out),$out 1987221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sub \$16,%r10 1988221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom test \$-16,%r10 1989221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom jnz .Lcbc_slow_enc_loop 1990221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom test \$15,%r10 1991221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom jnz .Lcbc_slow_enc_tail 1992221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $_ivp,%rbp # restore ivp 1993221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $s0,0(%rbp) # save ivec 1994221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $s1,4(%rbp) 1995221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $s2,8(%rbp) 1996221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $s3,12(%rbp) 1997221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 1998221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom jmp .Lcbc_exit 1999221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 2000221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.align 4 2001221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Lcbc_slow_enc_tail: 2002221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %rax,%r11 2003221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %rcx,%r12 2004221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %r10,%rcx 2005221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $inp,%rsi 2006221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $out,%rdi 2007221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom .long 0x9066A4F3 # rep movsb 2008221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov \$16,%rcx # zero tail 2009221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sub %r10,%rcx 2010221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor %rax,%rax 2011221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom .long 0x9066AAF3 # rep stosb 2012221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $out,$inp # this is not a mistake! 2013221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov \$16,%r10 # len=16 2014221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %r11,%rax 2015221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %r12,%rcx 2016221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom jmp .Lcbc_slow_enc_loop # one more spin... 2017221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#--------------------------- SLOW DECRYPT ---------------------------# 2018221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.align 16 2019221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.LSLOW_DECRYPT: 2020221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom shr \$3,%rax 2021221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom add %rax,$sbox # recall "magic" constants! 2022221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 2023221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 0(%rbp),%r11 # copy iv to stack 2024221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 8(%rbp),%r12 2025221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %r11,0+$ivec 2026221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %r12,8+$ivec 2027221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 2028221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.align 4 2029221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Lcbc_slow_dec_loop: 2030221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 0($inp),$s0 # load input 2031221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 4($inp),$s1 2032221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 8($inp),$s2 2033221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 12($inp),$s3 2034221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $keyp,$key # restore key 2035221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $inp,$_inp # save inp 2036221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $out,$_out # save out 2037221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %r10,$_len # save len 2038221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 2039221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom call _x86_64_AES_decrypt_compact 2040221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 2041221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $_inp,$inp # restore inp 2042221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $_out,$out # restore out 2043221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $_len,%r10 2044221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor 0+$ivec,$s0 2045221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor 4+$ivec,$s1 2046221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor 8+$ivec,$s2 2047221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor 12+$ivec,$s3 2048221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 2049221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 0($inp),%r11 # load input 2050221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 8($inp),%r12 2051221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sub \$16,%r10 2052221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom jc .Lcbc_slow_dec_partial 2053221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom jz .Lcbc_slow_dec_done 2054221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 2055221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %r11,0+$ivec # copy input to iv 2056221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %r12,8+$ivec 2057221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 2058221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $s0,0($out) # save output [can zap input] 2059221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $s1,4($out) 2060221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $s2,8($out) 2061221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $s3,12($out) 2062221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 2063221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lea 16($inp),$inp 2064221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lea 16($out),$out 2065221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom jmp .Lcbc_slow_dec_loop 2066221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Lcbc_slow_dec_done: 2067221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $_ivp,%rdi 2068221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %r11,0(%rdi) # copy iv back to user 2069221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %r12,8(%rdi) 2070221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 2071221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $s0,0($out) # save output [can zap input] 2072221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $s1,4($out) 2073221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $s2,8($out) 2074221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $s3,12($out) 2075221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 2076221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom jmp .Lcbc_exit 2077221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 2078221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.align 4 2079221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Lcbc_slow_dec_partial: 2080221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $_ivp,%rdi 2081221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %r11,0(%rdi) # copy iv back to user 2082221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %r12,8(%rdi) 2083221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 2084221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $s0,0+$ivec # save output to stack 2085221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $s1,4+$ivec 2086221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $s2,8+$ivec 2087221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $s3,12+$ivec 2088221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 2089221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $out,%rdi 2090221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lea $ivec,%rsi 2091221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lea 16(%r10),%rcx 2092221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom .long 0x9066A4F3 # rep movsb 2093221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom jmp .Lcbc_exit 2094221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 2095221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.align 16 2096221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Lcbc_exit: 2097221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $_rsp,%rsi 2098221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov (%rsi),%r15 2099221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 8(%rsi),%r14 2100221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 16(%rsi),%r13 2101221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 24(%rsi),%r12 2102221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 32(%rsi),%rbp 2103221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 40(%rsi),%rbx 2104221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lea 48(%rsi),%rsp 2105221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Lcbc_popfq: 2106221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom popfq 2107221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Lcbc_epilogue: 2108221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ret 2109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.size AES_cbc_encrypt,.-AES_cbc_encrypt 2110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___ 2111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 2112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 2113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___; 2114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align 64 2115221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.LAES_Te: 2116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___ 2117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xa56363c6, 0x847c7cf8, 0x997777ee, 0x8d7b7bf6); 2118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x0df2f2ff, 0xbd6b6bd6, 0xb16f6fde, 0x54c5c591); 2119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x50303060, 0x03010102, 0xa96767ce, 0x7d2b2b56); 2120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x19fefee7, 0x62d7d7b5, 0xe6abab4d, 0x9a7676ec); 2121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x45caca8f, 0x9d82821f, 0x40c9c989, 0x877d7dfa); 2122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x15fafaef, 0xeb5959b2, 0xc947478e, 0x0bf0f0fb); 2123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xecadad41, 0x67d4d4b3, 0xfda2a25f, 0xeaafaf45); 2124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xbf9c9c23, 0xf7a4a453, 0x967272e4, 0x5bc0c09b); 2125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xc2b7b775, 0x1cfdfde1, 0xae93933d, 0x6a26264c); 2126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x5a36366c, 0x413f3f7e, 0x02f7f7f5, 0x4fcccc83); 2127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x5c343468, 0xf4a5a551, 0x34e5e5d1, 0x08f1f1f9); 2128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x937171e2, 0x73d8d8ab, 0x53313162, 0x3f15152a); 2129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x0c040408, 0x52c7c795, 0x65232346, 0x5ec3c39d); 2130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x28181830, 0xa1969637, 0x0f05050a, 0xb59a9a2f); 2131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x0907070e, 0x36121224, 0x9b80801b, 0x3de2e2df); 2132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x26ebebcd, 0x6927274e, 0xcdb2b27f, 0x9f7575ea); 2133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x1b090912, 0x9e83831d, 0x742c2c58, 0x2e1a1a34); 2134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x2d1b1b36, 0xb26e6edc, 0xee5a5ab4, 0xfba0a05b); 2135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xf65252a4, 0x4d3b3b76, 0x61d6d6b7, 0xceb3b37d); 2136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x7b292952, 0x3ee3e3dd, 0x712f2f5e, 0x97848413); 2137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xf55353a6, 0x68d1d1b9, 0x00000000, 0x2cededc1); 2138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x60202040, 0x1ffcfce3, 0xc8b1b179, 0xed5b5bb6); 2139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xbe6a6ad4, 0x46cbcb8d, 0xd9bebe67, 0x4b393972); 2140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xde4a4a94, 0xd44c4c98, 0xe85858b0, 0x4acfcf85); 2141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x6bd0d0bb, 0x2aefefc5, 0xe5aaaa4f, 0x16fbfbed); 2142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xc5434386, 0xd74d4d9a, 0x55333366, 0x94858511); 2143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xcf45458a, 0x10f9f9e9, 0x06020204, 0x817f7ffe); 2144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xf05050a0, 0x443c3c78, 0xba9f9f25, 0xe3a8a84b); 2145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xf35151a2, 0xfea3a35d, 0xc0404080, 0x8a8f8f05); 2146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xad92923f, 0xbc9d9d21, 0x48383870, 0x04f5f5f1); 2147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xdfbcbc63, 0xc1b6b677, 0x75dadaaf, 0x63212142); 2148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x30101020, 0x1affffe5, 0x0ef3f3fd, 0x6dd2d2bf); 2149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x4ccdcd81, 0x140c0c18, 0x35131326, 0x2fececc3); 2150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xe15f5fbe, 0xa2979735, 0xcc444488, 0x3917172e); 2151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x57c4c493, 0xf2a7a755, 0x827e7efc, 0x473d3d7a); 2152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xac6464c8, 0xe75d5dba, 0x2b191932, 0x957373e6); 2153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xa06060c0, 0x98818119, 0xd14f4f9e, 0x7fdcdca3); 2154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x66222244, 0x7e2a2a54, 0xab90903b, 0x8388880b); 2155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xca46468c, 0x29eeeec7, 0xd3b8b86b, 0x3c141428); 2156656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x79dedea7, 0xe25e5ebc, 0x1d0b0b16, 0x76dbdbad); 2157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x3be0e0db, 0x56323264, 0x4e3a3a74, 0x1e0a0a14); 2158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xdb494992, 0x0a06060c, 0x6c242448, 0xe45c5cb8); 2159656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x5dc2c29f, 0x6ed3d3bd, 0xefacac43, 0xa66262c4); 2160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xa8919139, 0xa4959531, 0x37e4e4d3, 0x8b7979f2); 2161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x32e7e7d5, 0x43c8c88b, 0x5937376e, 0xb76d6dda); 2162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x8c8d8d01, 0x64d5d5b1, 0xd24e4e9c, 0xe0a9a949); 2163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xb46c6cd8, 0xfa5656ac, 0x07f4f4f3, 0x25eaeacf); 2164656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xaf6565ca, 0x8e7a7af4, 0xe9aeae47, 0x18080810); 2165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xd5baba6f, 0x887878f0, 0x6f25254a, 0x722e2e5c); 2166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x241c1c38, 0xf1a6a657, 0xc7b4b473, 0x51c6c697); 2167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x23e8e8cb, 0x7cdddda1, 0x9c7474e8, 0x211f1f3e); 2168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xdd4b4b96, 0xdcbdbd61, 0x868b8b0d, 0x858a8a0f); 2169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x907070e0, 0x423e3e7c, 0xc4b5b571, 0xaa6666cc); 2170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xd8484890, 0x05030306, 0x01f6f6f7, 0x120e0e1c); 2171656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xa36161c2, 0x5f35356a, 0xf95757ae, 0xd0b9b969); 2172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x91868617, 0x58c1c199, 0x271d1d3a, 0xb99e9e27); 2173656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x38e1e1d9, 0x13f8f8eb, 0xb398982b, 0x33111122); 2174656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xbb6969d2, 0x70d9d9a9, 0x898e8e07, 0xa7949433); 2175656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xb69b9b2d, 0x221e1e3c, 0x92878715, 0x20e9e9c9); 2176656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x49cece87, 0xff5555aa, 0x78282850, 0x7adfdfa5); 2177656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x8f8c8c03, 0xf8a1a159, 0x80898909, 0x170d0d1a); 2178656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xdabfbf65, 0x31e6e6d7, 0xc6424284, 0xb86868d0); 2179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xc3414182, 0xb0999929, 0x772d2d5a, 0x110f0f1e); 2180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xcbb0b07b, 0xfc5454a8, 0xd6bbbb6d, 0x3a16162c); 2181221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 2182221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#Te4 # four copies of Te4 to choose from to avoid L1 aliasing 2183221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5); 2184221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76); 2185221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0); 2186221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0); 2187221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc); 2188221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15); 2189221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a); 2190221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75); 2191221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0); 2192221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84); 2193221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b); 2194221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf); 2195221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85); 2196221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8); 2197221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5); 2198221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2); 2199221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17); 2200221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73); 2201221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88); 2202221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb); 2203221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c); 2204221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79); 2205221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9); 2206221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08); 2207221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6); 2208221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a); 2209221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e); 2210221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e); 2211221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94); 2212221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf); 2213221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68); 2214221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16); 2215221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 2216221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5); 2217221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76); 2218221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0); 2219221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0); 2220221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc); 2221221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15); 2222221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a); 2223221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75); 2224221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0); 2225221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84); 2226221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b); 2227221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf); 2228221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85); 2229221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8); 2230221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5); 2231221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2); 2232221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17); 2233221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73); 2234221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88); 2235221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb); 2236221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c); 2237221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79); 2238221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9); 2239221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08); 2240221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6); 2241221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a); 2242221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e); 2243221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e); 2244221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94); 2245221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf); 2246221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68); 2247221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16); 2248221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 2249221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5); 2250221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76); 2251221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0); 2252221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0); 2253221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc); 2254221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15); 2255221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a); 2256221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75); 2257221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0); 2258221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84); 2259221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b); 2260221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf); 2261221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85); 2262221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8); 2263221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5); 2264221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2); 2265221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17); 2266221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73); 2267221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88); 2268221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb); 2269221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c); 2270221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79); 2271221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9); 2272221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08); 2273221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6); 2274221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a); 2275221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e); 2276221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e); 2277221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94); 2278221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf); 2279221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68); 2280221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16); 2281221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 2282221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5); 2283221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76); 2284221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0); 2285221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0); 2286221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc); 2287221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15); 2288221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a); 2289221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75); 2290221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0); 2291221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84); 2292221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b); 2293221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf); 2294221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85); 2295221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8); 2296221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5); 2297221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2); 2298221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17); 2299221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73); 2300221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88); 2301221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb); 2302221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c); 2303221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79); 2304221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9); 2305221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08); 2306221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6); 2307221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a); 2308221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e); 2309221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e); 2310221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94); 2311221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf); 2312221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68); 2313221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16); 2314656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#rcon: 2315656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___; 2316656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project .long 0x00000001, 0x00000002, 0x00000004, 0x00000008 2317656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project .long 0x00000010, 0x00000020, 0x00000040, 0x00000080 2318221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom .long 0x0000001b, 0x00000036, 0x80808080, 0x80808080 2319221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom .long 0xfefefefe, 0xfefefefe, 0x1b1b1b1b, 0x1b1b1b1b 2320656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___ 2321656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code.=<<___; 2322656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project.align 64 2323221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.LAES_Td: 2324656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project___ 2325656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x50a7f451, 0x5365417e, 0xc3a4171a, 0x965e273a); 2326656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xcb6bab3b, 0xf1459d1f, 0xab58faac, 0x9303e34b); 2327656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x55fa3020, 0xf66d76ad, 0x9176cc88, 0x254c02f5); 2328656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xfcd7e54f, 0xd7cb2ac5, 0x80443526, 0x8fa362b5); 2329656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x495ab1de, 0x671bba25, 0x980eea45, 0xe1c0fe5d); 2330656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x02752fc3, 0x12f04c81, 0xa397468d, 0xc6f9d36b); 2331656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xe75f8f03, 0x959c9215, 0xeb7a6dbf, 0xda595295); 2332656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x2d83bed4, 0xd3217458, 0x2969e049, 0x44c8c98e); 2333656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x6a89c275, 0x78798ef4, 0x6b3e5899, 0xdd71b927); 2334656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xb64fe1be, 0x17ad88f0, 0x66ac20c9, 0xb43ace7d); 2335656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x184adf63, 0x82311ae5, 0x60335197, 0x457f5362); 2336656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xe07764b1, 0x84ae6bbb, 0x1ca081fe, 0x942b08f9); 2337656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x58684870, 0x19fd458f, 0x876cde94, 0xb7f87b52); 2338656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x23d373ab, 0xe2024b72, 0x578f1fe3, 0x2aab5566); 2339656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x0728ebb2, 0x03c2b52f, 0x9a7bc586, 0xa50837d3); 2340656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xf2872830, 0xb2a5bf23, 0xba6a0302, 0x5c8216ed); 2341656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x2b1ccf8a, 0x92b479a7, 0xf0f207f3, 0xa1e2694e); 2342656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xcdf4da65, 0xd5be0506, 0x1f6234d1, 0x8afea6c4); 2343656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x9d532e34, 0xa055f3a2, 0x32e18a05, 0x75ebf6a4); 2344656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x39ec830b, 0xaaef6040, 0x069f715e, 0x51106ebd); 2345656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xf98a213e, 0x3d06dd96, 0xae053edd, 0x46bde64d); 2346656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xb58d5491, 0x055dc471, 0x6fd40604, 0xff155060); 2347656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x24fb9819, 0x97e9bdd6, 0xcc434089, 0x779ed967); 2348656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xbd42e8b0, 0x888b8907, 0x385b19e7, 0xdbeec879); 2349656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x470a7ca1, 0xe90f427c, 0xc91e84f8, 0x00000000); 2350656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x83868009, 0x48ed2b32, 0xac70111e, 0x4e725a6c); 2351656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xfbff0efd, 0x5638850f, 0x1ed5ae3d, 0x27392d36); 2352656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x64d90f0a, 0x21a65c68, 0xd1545b9b, 0x3a2e3624); 2353656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xb1670a0c, 0x0fe75793, 0xd296eeb4, 0x9e919b1b); 2354656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x4fc5c080, 0xa220dc61, 0x694b775a, 0x161a121c); 2355656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x0aba93e2, 0xe52aa0c0, 0x43e0223c, 0x1d171b12); 2356656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x0b0d090e, 0xadc78bf2, 0xb9a8b62d, 0xc8a91e14); 2357656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x8519f157, 0x4c0775af, 0xbbdd99ee, 0xfd607fa3); 2358656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x9f2601f7, 0xbcf5725c, 0xc53b6644, 0x347efb5b); 2359656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x7629438b, 0xdcc623cb, 0x68fcedb6, 0x63f1e4b8); 2360656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xcadc31d7, 0x10856342, 0x40229713, 0x2011c684); 2361656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x7d244a85, 0xf83dbbd2, 0x1132f9ae, 0x6da129c7); 2362656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x4b2f9e1d, 0xf330b2dc, 0xec52860d, 0xd0e3c177); 2363656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x6c16b32b, 0x99b970a9, 0xfa489411, 0x2264e947); 2364656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xc48cfca8, 0x1a3ff0a0, 0xd82c7d56, 0xef903322); 2365656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xc74e4987, 0xc1d138d9, 0xfea2ca8c, 0x360bd498); 2366656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xcf81f5a6, 0x28de7aa5, 0x268eb7da, 0xa4bfad3f); 2367656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xe49d3a2c, 0x0d927850, 0x9bcc5f6a, 0x62467e54); 2368656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xc2138df6, 0xe8b8d890, 0x5ef7392e, 0xf5afc382); 2369656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xbe805d9f, 0x7c93d069, 0xa92dd56f, 0xb31225cf); 2370656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x3b99acc8, 0xa77d1810, 0x6e639ce8, 0x7bbb3bdb); 2371656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x097826cd, 0xf418596e, 0x01b79aec, 0xa89a4f83); 2372656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x656e95e6, 0x7ee6ffaa, 0x08cfbc21, 0xe6e815ef); 2373656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xd99be7ba, 0xce366f4a, 0xd4099fea, 0xd67cb029); 2374656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xafb2a431, 0x31233f2a, 0x3094a5c6, 0xc066a235); 2375656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x37bc4e74, 0xa6ca82fc, 0xb0d090e0, 0x15d8a733); 2376656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x4a9804f1, 0xf7daec41, 0x0e50cd7f, 0x2ff69117); 2377656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x8dd64d76, 0x4db0ef43, 0x544daacc, 0xdf0496e4); 2378656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xe3b5d19e, 0x1b886a4c, 0xb81f2cc1, 0x7f516546); 2379656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x04ea5e9d, 0x5d358c01, 0x737487fa, 0x2e410bfb); 2380656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x5a1d67b3, 0x52d2db92, 0x335610e9, 0x1347d66d); 2381656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x8c61d79a, 0x7a0ca137, 0x8e14f859, 0x893c13eb); 2382656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xee27a9ce, 0x35c961b7, 0xede51ce1, 0x3cb1477a); 2383656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x59dfd29c, 0x3f73f255, 0x79ce1418, 0xbf37c773); 2384656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0xeacdf753, 0x5baafd5f, 0x146f3ddf, 0x86db4478); 2385656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x81f3afca, 0x3ec468b9, 0x2c342438, 0x5f40a3c2); 2386656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x72c31d16, 0x0c25e2bc, 0x8b493c28, 0x41950dff); 2387656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x7101a839, 0xdeb30c08, 0x9ce4b4d8, 0x90c15664); 2388656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &_data_word(0x6184cb7b, 0x70b632d5, 0x745c6c48, 0x4257b8d0); 2389221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 2390221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#Td4: # four copies of Td4 to choose from to avoid L1 aliasing 2391656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &data_byte(0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38); 2392656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &data_byte(0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb); 2393656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &data_byte(0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87); 2394656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &data_byte(0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb); 2395656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &data_byte(0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d); 2396656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &data_byte(0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e); 2397656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &data_byte(0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2); 2398656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &data_byte(0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25); 2399656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &data_byte(0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16); 2400656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &data_byte(0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92); 2401656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &data_byte(0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda); 2402656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &data_byte(0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84); 2403656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &data_byte(0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a); 2404656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &data_byte(0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06); 2405656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &data_byte(0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02); 2406656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &data_byte(0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b); 2407656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &data_byte(0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea); 2408656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &data_byte(0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73); 2409656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &data_byte(0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85); 2410656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &data_byte(0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e); 2411656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &data_byte(0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89); 2412656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &data_byte(0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b); 2413656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &data_byte(0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20); 2414656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &data_byte(0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4); 2415656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &data_byte(0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31); 2416656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &data_byte(0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f); 2417656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &data_byte(0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d); 2418656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &data_byte(0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef); 2419656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &data_byte(0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0); 2420656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &data_byte(0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61); 2421656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &data_byte(0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26); 2422656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &data_byte(0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d); 2423221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$code.=<<___; 2424221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom .long 0x80808080, 0x80808080, 0xfefefefe, 0xfefefefe 2425221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom .long 0x1b1b1b1b, 0x1b1b1b1b, 0, 0 2426221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom___ 2427221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38); 2428221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb); 2429221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87); 2430221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb); 2431221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d); 2432221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e); 2433221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2); 2434221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25); 2435221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16); 2436221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92); 2437221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda); 2438221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84); 2439221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a); 2440221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06); 2441221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02); 2442221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b); 2443221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea); 2444221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73); 2445221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85); 2446221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e); 2447221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89); 2448221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b); 2449221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20); 2450221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4); 2451221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31); 2452221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f); 2453221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d); 2454221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef); 2455221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0); 2456221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61); 2457221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26); 2458221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d); 2459221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$code.=<<___; 2460221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom .long 0x80808080, 0x80808080, 0xfefefefe, 0xfefefefe 2461221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom .long 0x1b1b1b1b, 0x1b1b1b1b, 0, 0 2462221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom___ 2463221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38); 2464221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb); 2465221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87); 2466221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb); 2467221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d); 2468221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e); 2469221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2); 2470221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25); 2471221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16); 2472221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92); 2473221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda); 2474221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84); 2475221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a); 2476221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06); 2477221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02); 2478221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b); 2479221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea); 2480221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73); 2481221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85); 2482221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e); 2483221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89); 2484221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b); 2485221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20); 2486221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4); 2487221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31); 2488221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f); 2489221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d); 2490221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef); 2491221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0); 2492221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61); 2493221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26); 2494221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d); 2495221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$code.=<<___; 2496221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom .long 0x80808080, 0x80808080, 0xfefefefe, 0xfefefefe 2497221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom .long 0x1b1b1b1b, 0x1b1b1b1b, 0, 0 2498221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom___ 2499221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38); 2500221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb); 2501221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87); 2502221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb); 2503221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d); 2504221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e); 2505221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2); 2506221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25); 2507221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16); 2508221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92); 2509221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda); 2510221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84); 2511221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a); 2512221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06); 2513221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02); 2514221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b); 2515221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea); 2516221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73); 2517221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85); 2518221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e); 2519221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89); 2520221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b); 2521221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20); 2522221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4); 2523221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31); 2524221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f); 2525221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d); 2526221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef); 2527221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0); 2528221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61); 2529221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26); 2530221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data_byte(0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d); 2531221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$code.=<<___; 2532221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom .long 0x80808080, 0x80808080, 0xfefefefe, 0xfefefefe 2533221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom .long 0x1b1b1b1b, 0x1b1b1b1b, 0, 0 2534221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.asciz "AES for x86_64, CRYPTOGAMS by <appro\@openssl.org>" 2535221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.align 64 2536221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom___ 2537221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 2538221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom# EXCEPTION_DISPOSITION handler (EXCEPTION_RECORD *rec,ULONG64 frame, 2539221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom# CONTEXT *context,DISPATCHER_CONTEXT *disp) 2540221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromif ($win64) { 2541221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$rec="%rcx"; 2542221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$frame="%rdx"; 2543221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$context="%r8"; 2544221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$disp="%r9"; 2545221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 2546221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom$code.=<<___; 2547221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.extern __imp_RtlVirtualUnwind 2548221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.type block_se_handler,\@abi-omnipotent 2549221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.align 16 2550221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromblock_se_handler: 2551221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom push %rsi 2552221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom push %rdi 2553221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom push %rbx 2554221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom push %rbp 2555221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom push %r12 2556221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom push %r13 2557221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom push %r14 2558221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom push %r15 2559221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom pushfq 2560221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sub \$64,%rsp 2561221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 2562221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 120($context),%rax # pull context->Rax 2563221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 248($context),%rbx # pull context->Rip 2564221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 2565221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 8($disp),%rsi # disp->ImageBase 2566221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 56($disp),%r11 # disp->HandlerData 2567221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 2568221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 0(%r11),%r10d # HandlerData[0] 2569221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lea (%rsi,%r10),%r10 # prologue label 2570221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom cmp %r10,%rbx # context->Rip<prologue label 2571221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom jb .Lin_block_prologue 2572221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 2573221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 152($context),%rax # pull context->Rsp 2574221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 2575221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 4(%r11),%r10d # HandlerData[1] 2576221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lea (%rsi,%r10),%r10 # epilogue label 2577221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom cmp %r10,%rbx # context->Rip>=epilogue label 2578221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom jae .Lin_block_prologue 2579221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 2580221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 24(%rax),%rax # pull saved real stack pointer 2581221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lea 48(%rax),%rax # adjust... 2582221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 2583221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov -8(%rax),%rbx 2584221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov -16(%rax),%rbp 2585221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov -24(%rax),%r12 2586221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov -32(%rax),%r13 2587221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov -40(%rax),%r14 2588221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov -48(%rax),%r15 2589221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %rbx,144($context) # restore context->Rbx 2590221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %rbp,160($context) # restore context->Rbp 2591221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %r12,216($context) # restore context->R12 2592221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %r13,224($context) # restore context->R13 2593221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %r14,232($context) # restore context->R14 2594221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %r15,240($context) # restore context->R15 2595221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 2596221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Lin_block_prologue: 2597221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 8(%rax),%rdi 2598221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 16(%rax),%rsi 2599221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %rax,152($context) # restore context->Rsp 2600221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %rsi,168($context) # restore context->Rsi 2601221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %rdi,176($context) # restore context->Rdi 2602221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 2603221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom jmp .Lcommon_seh_exit 2604221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.size block_se_handler,.-block_se_handler 2605221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 2606221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.type key_se_handler,\@abi-omnipotent 2607221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.align 16 2608221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromkey_se_handler: 2609221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom push %rsi 2610221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom push %rdi 2611221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom push %rbx 2612221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom push %rbp 2613221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom push %r12 2614221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom push %r13 2615221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom push %r14 2616221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom push %r15 2617221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom pushfq 2618221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sub \$64,%rsp 2619221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 2620221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 120($context),%rax # pull context->Rax 2621221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 248($context),%rbx # pull context->Rip 2622221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 2623221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 8($disp),%rsi # disp->ImageBase 2624221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 56($disp),%r11 # disp->HandlerData 2625221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 2626221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 0(%r11),%r10d # HandlerData[0] 2627221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lea (%rsi,%r10),%r10 # prologue label 2628221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom cmp %r10,%rbx # context->Rip<prologue label 2629221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom jb .Lin_key_prologue 2630221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 2631221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 152($context),%rax # pull context->Rsp 2632221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 2633221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 4(%r11),%r10d # HandlerData[1] 2634221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lea (%rsi,%r10),%r10 # epilogue label 2635221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom cmp %r10,%rbx # context->Rip>=epilogue label 2636221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom jae .Lin_key_prologue 2637221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 2638221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lea 56(%rax),%rax 2639221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 2640221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov -8(%rax),%rbx 2641221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov -16(%rax),%rbp 2642221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov -24(%rax),%r12 2643221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov -32(%rax),%r13 2644221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov -40(%rax),%r14 2645221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov -48(%rax),%r15 2646221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %rbx,144($context) # restore context->Rbx 2647221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %rbp,160($context) # restore context->Rbp 2648221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %r12,216($context) # restore context->R12 2649221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %r13,224($context) # restore context->R13 2650221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %r14,232($context) # restore context->R14 2651221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %r15,240($context) # restore context->R15 2652221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 2653221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Lin_key_prologue: 2654221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 8(%rax),%rdi 2655221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 16(%rax),%rsi 2656221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %rax,152($context) # restore context->Rsp 2657221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %rsi,168($context) # restore context->Rsi 2658221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %rdi,176($context) # restore context->Rdi 2659221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 2660221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom jmp .Lcommon_seh_exit 2661221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.size key_se_handler,.-key_se_handler 2662221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 2663221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.type cbc_se_handler,\@abi-omnipotent 2664221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.align 16 2665221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromcbc_se_handler: 2666221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom push %rsi 2667221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom push %rdi 2668221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom push %rbx 2669221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom push %rbp 2670221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom push %r12 2671221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom push %r13 2672221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom push %r14 2673221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom push %r15 2674221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom pushfq 2675221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sub \$64,%rsp 2676221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 2677221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 120($context),%rax # pull context->Rax 2678221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 248($context),%rbx # pull context->Rip 2679221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 2680221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lea .Lcbc_prologue(%rip),%r10 2681221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom cmp %r10,%rbx # context->Rip<.Lcbc_prologue 2682221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom jb .Lin_cbc_prologue 2683221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 2684221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lea .Lcbc_fast_body(%rip),%r10 2685221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom cmp %r10,%rbx # context->Rip<.Lcbc_fast_body 2686221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom jb .Lin_cbc_frame_setup 2687221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 2688221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lea .Lcbc_slow_prologue(%rip),%r10 2689221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom cmp %r10,%rbx # context->Rip<.Lcbc_slow_prologue 2690221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom jb .Lin_cbc_body 2691221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 2692221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lea .Lcbc_slow_body(%rip),%r10 2693221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom cmp %r10,%rbx # context->Rip<.Lcbc_slow_body 2694221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom jb .Lin_cbc_frame_setup 2695221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 2696221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Lin_cbc_body: 2697221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 152($context),%rax # pull context->Rsp 2698221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 2699221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lea .Lcbc_epilogue(%rip),%r10 2700221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom cmp %r10,%rbx # context->Rip>=.Lcbc_epilogue 2701221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom jae .Lin_cbc_prologue 2702221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 2703221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lea 8(%rax),%rax 2704221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 2705221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lea .Lcbc_popfq(%rip),%r10 2706221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom cmp %r10,%rbx # context->Rip>=.Lcbc_popfq 2707221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom jae .Lin_cbc_prologue 2708221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 2709221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov `16-8`(%rax),%rax # biased $_rsp 2710221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lea 56(%rax),%rax 2711221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 2712221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Lin_cbc_frame_setup: 2713221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov -16(%rax),%rbx 2714221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov -24(%rax),%rbp 2715221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov -32(%rax),%r12 2716221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov -40(%rax),%r13 2717221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov -48(%rax),%r14 2718221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov -56(%rax),%r15 2719221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %rbx,144($context) # restore context->Rbx 2720221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %rbp,160($context) # restore context->Rbp 2721221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %r12,216($context) # restore context->R12 2722221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %r13,224($context) # restore context->R13 2723221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %r14,232($context) # restore context->R14 2724221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %r15,240($context) # restore context->R15 2725221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 2726221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Lin_cbc_prologue: 2727221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 8(%rax),%rdi 2728221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 16(%rax),%rsi 2729221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %rax,152($context) # restore context->Rsp 2730221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %rsi,168($context) # restore context->Rsi 2731221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %rdi,176($context) # restore context->Rdi 2732221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 2733221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Lcommon_seh_exit: 2734221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 2735221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 40($disp),%rdi # disp->ContextRecord 2736221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $context,%rsi # context 2737221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov \$`1232/8`,%ecx # sizeof(CONTEXT) 2738221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom .long 0xa548f3fc # cld; rep movsq 2739221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 2740221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov $disp,%rsi 2741221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom xor %rcx,%rcx # arg1, UNW_FLAG_NHANDLER 2742221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 8(%rsi),%rdx # arg2, disp->ImageBase 2743221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 0(%rsi),%r8 # arg3, disp->ControlPc 2744221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 16(%rsi),%r9 # arg4, disp->FunctionEntry 2745221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov 40(%rsi),%r10 # disp->ContextRecord 2746221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lea 56(%rsi),%r11 # &disp->HandlerData 2747221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom lea 24(%rsi),%r12 # &disp->EstablisherFrame 2748221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %r10,32(%rsp) # arg5 2749221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %r11,40(%rsp) # arg6 2750221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %r12,48(%rsp) # arg7 2751221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov %rcx,56(%rsp) # arg8, (NULL) 2752221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom call *__imp_RtlVirtualUnwind(%rip) 2753221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 2754221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mov \$1,%eax # ExceptionContinueSearch 2755221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom add \$64,%rsp 2756221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom popfq 2757221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom pop %r15 2758221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom pop %r14 2759221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom pop %r13 2760221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom pop %r12 2761221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom pop %rbp 2762221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom pop %rbx 2763221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom pop %rdi 2764221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom pop %rsi 2765221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ret 2766221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.size cbc_se_handler,.-cbc_se_handler 2767221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 2768221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.section .pdata 2769221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.align 4 2770221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom .rva .LSEH_begin_AES_encrypt 2771221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom .rva .LSEH_end_AES_encrypt 2772221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom .rva .LSEH_info_AES_encrypt 2773221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 2774221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom .rva .LSEH_begin_AES_decrypt 2775221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom .rva .LSEH_end_AES_decrypt 2776221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom .rva .LSEH_info_AES_decrypt 2777221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 2778392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom .rva .LSEH_begin_private_AES_set_encrypt_key 2779392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom .rva .LSEH_end_private_AES_set_encrypt_key 2780392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom .rva .LSEH_info_private_AES_set_encrypt_key 2781221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 2782392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom .rva .LSEH_begin_private_AES_set_decrypt_key 2783392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom .rva .LSEH_end_private_AES_set_decrypt_key 2784392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom .rva .LSEH_info_private_AES_set_decrypt_key 2785221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 2786221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom .rva .LSEH_begin_AES_cbc_encrypt 2787221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom .rva .LSEH_end_AES_cbc_encrypt 2788221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom .rva .LSEH_info_AES_cbc_encrypt 2789221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 2790221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.section .xdata 2791221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.align 8 2792221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.LSEH_info_AES_encrypt: 2793221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom .byte 9,0,0,0 2794221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom .rva block_se_handler 2795221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom .rva .Lenc_prologue,.Lenc_epilogue # HandlerData[] 2796221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.LSEH_info_AES_decrypt: 2797221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom .byte 9,0,0,0 2798221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom .rva block_se_handler 2799221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom .rva .Ldec_prologue,.Ldec_epilogue # HandlerData[] 2800392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.LSEH_info_private_AES_set_encrypt_key: 2801221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom .byte 9,0,0,0 2802221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom .rva key_se_handler 2803221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom .rva .Lenc_key_prologue,.Lenc_key_epilogue # HandlerData[] 2804392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom.LSEH_info_private_AES_set_decrypt_key: 2805221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom .byte 9,0,0,0 2806221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom .rva key_se_handler 2807221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom .rva .Ldec_key_prologue,.Ldec_key_epilogue # HandlerData[] 2808221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.LSEH_info_AES_cbc_encrypt: 2809221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom .byte 9,0,0,0 2810221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom .rva cbc_se_handler 2811221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom___ 2812221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom} 2813656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 2814656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project$code =~ s/\`([^\`]*)\`/eval($1)/gem; 2815656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 2816656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectprint $code; 2817656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 2818656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectclose STDOUT; 2819