diff options
author | 2018-11-12 08:28:55 +0000 | |
---|---|---|
committer | 2018-11-14 23:59:05 -0800 | |
commit | 73799cde1b0113a7da914ecaa80c09a5fe759477 (patch) | |
tree | cb18077ea95ae9246551e99710c616c3894c85ac /src/crypto | |
parent | chacha20: begin adapting to kernel setting (diff) | |
download | wireguard-monolithic-historical-73799cde1b0113a7da914ecaa80c09a5fe759477.tar.xz wireguard-monolithic-historical-73799cde1b0113a7da914ecaa80c09a5fe759477.zip |
chacha20: add hchacha_ssse3
Signed-off-by: Samuel Neves <sneves@dei.uc.pt>
Diffstat (limited to 'src/crypto')
-rw-r--r-- | src/crypto/zinc/chacha20/chacha20-x86_64.pl | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/src/crypto/zinc/chacha20/chacha20-x86_64.pl b/src/crypto/zinc/chacha20/chacha20-x86_64.pl index 20e9786..e6f8d71 100644 --- a/src/crypto/zinc/chacha20/chacha20-x86_64.pl +++ b/src/crypto/zinc/chacha20/chacha20-x86_64.pl @@ -504,6 +504,45 @@ my $xframe = $win64 ? 32+8 : 8; if($kernel) { $code .= "#ifdef CONFIG_AS_SSSE3\n"; } + +if($kernel) { +&declare_function("hchacha20_ssse3", 32); +$code.=<<___; + movdqa .Lsigma(%rip),$a + movdqu ($len),$b + movdqu 16($len),$c + movdqu ($inp),$d + # This code is only used when targeting kernel. + # If targeting win64, xmm{6,7} preserving needs to be added. + movdqa .Lrot16(%rip),$rot16 + movdqa .Lrot24(%rip),$rot24 + mov \$10,$counter # reuse $counter + jmp 1f +.align 32 +1: +___ + &SSSE3ROUND(); + &pshufd ($c,$c,0b01001110); + &pshufd ($b,$b,0b00111001); + &pshufd ($d,$d,0b10010011); + &nop (); + + &SSSE3ROUND(); + &pshufd ($c,$c,0b01001110); + &pshufd ($b,$b,0b10010011); + &pshufd ($d,$d,0b00111001); + + &dec ($counter); + &jnz ("1b"); + +$code.=<<___; + movdqu $a, ($out) + movdqu $d, 16($out) + ret +___ +&end_function("hchacha20_ssse3"); +} + &declare_function("chacha20_ssse3", 32); $code.=<<___; .cfi_startproc |