aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/src/crypto/zinc/curve25519/curve25519-x86_64-glue.c
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2018-10-05 23:20:40 +0200
committerJason A. Donenfeld <Jason@zx2c4.com>2018-10-06 01:03:16 +0200
commitad5e42105059b23545b6958b3d8d4a65e7c78f01 (patch)
tree2aaad03f36ba8c27c051ffeb6272d4f9c851c693 /src/crypto/zinc/curve25519/curve25519-x86_64-glue.c
parentallowedips: remove ifdefs in favor of IS_ENABLED (diff)
downloadwireguard-monolithic-historical-ad5e42105059b23545b6958b3d8d4a65e7c78f01.tar.xz
wireguard-monolithic-historical-ad5e42105059b23545b6958b3d8d4a65e7c78f01.zip
global: rename include'd C files to be .c
This is done by 259 other files in the kernel tree: linux $ rg '#include.*\.c' -l | wc -l 259 Suggested-by: Sultan Alsawaf <sultanxda@gmail.com>
Diffstat (limited to 'src/crypto/zinc/curve25519/curve25519-x86_64-glue.c')
-rw-r--r--src/crypto/zinc/curve25519/curve25519-x86_64-glue.c46
1 files changed, 46 insertions, 0 deletions
diff --git a/src/crypto/zinc/curve25519/curve25519-x86_64-glue.c b/src/crypto/zinc/curve25519/curve25519-x86_64-glue.c
new file mode 100644
index 0000000..34ff1d8
--- /dev/null
+++ b/src/crypto/zinc/curve25519/curve25519-x86_64-glue.c
@@ -0,0 +1,46 @@
+// SPDX-License-Identifier: GPL-2.0 OR MIT
+/*
+ * Copyright (C) 2015-2018 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
+ */
+
+#include <asm/cpufeature.h>
+#include <asm/processor.h>
+
+#include "curve25519-x86_64.h"
+
+static bool curve25519_use_bmi2 __ro_after_init;
+static bool curve25519_use_adx __ro_after_init;
+
+static void __init curve25519_fpu_init(void)
+{
+ curve25519_use_bmi2 = boot_cpu_has(X86_FEATURE_BMI2);
+ curve25519_use_adx = boot_cpu_has(X86_FEATURE_BMI2) &&
+ boot_cpu_has(X86_FEATURE_ADX);
+}
+
+static inline bool curve25519_arch(u8 mypublic[CURVE25519_KEY_SIZE],
+ const u8 secret[CURVE25519_KEY_SIZE],
+ const u8 basepoint[CURVE25519_KEY_SIZE])
+{
+ if (curve25519_use_adx) {
+ curve25519_adx(mypublic, secret, basepoint);
+ return true;
+ } else if (curve25519_use_bmi2) {
+ curve25519_bmi2(mypublic, secret, basepoint);
+ return true;
+ }
+ return false;
+}
+
+static inline bool curve25519_base_arch(u8 pub[CURVE25519_KEY_SIZE],
+ const u8 secret[CURVE25519_KEY_SIZE])
+{
+ if (curve25519_use_adx) {
+ curve25519_adx_base(pub, secret);
+ return true;
+ } else if (curve25519_use_bmi2) {
+ curve25519_bmi2_base(pub, secret);
+ return true;
+ }
+ return false;
+}