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