aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/src/crypto
diff options
context:
space:
mode:
authorSamuel Neves <sneves@dei.uc.pt>2018-11-12 08:28:55 +0000
committerJason A. Donenfeld <Jason@zx2c4.com>2018-11-14 23:59:05 -0800
commit73799cde1b0113a7da914ecaa80c09a5fe759477 (patch)
treecb18077ea95ae9246551e99710c616c3894c85ac /src/crypto
parentchacha20: begin adapting to kernel setting (diff)
downloadwireguard-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.pl39
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