Curve25519 cleanup
Subsystems (12)
Eric Biggers
maintainerv2 cover Curve25519 cleanup
This series is targeting libcrypto-next. It can also be retrieved from:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/ebiggers/linux.git curve25519-v2
This series removes the unused crypto_kpp support for Curve25519, migrates curve25519-selftest to a KUnit test suite, and reorganizes the generic and arch-optimized Curve25519 code to all be located in lib/crypto/ and built into a single libcurve25519 module.
Changed from v1:
- Split kpp removal into multiple patches
- Don't select CRYPTO_LIB_CURVE25519_GENERIC from KUnit test
- Removed unnecessary parameter from hpre_ecc_clear_ctx()
- Removed unnecessary 'return' from arm curve25519_base_arch()
- Updated file comment in lib/crypto/curve25519.c
- Made kconfig help text for KUnit test more consistent with other tests
- Used initializer in test_curve25519()
- Removed unnecessary newlines from messages in test_curve25519()
- Use NSEC_PER_SEC instead of literal 1000000000
- Added an Acked-by
Eric Biggers (12):
crypto: hisilicon/hpre - Remove unused curve25519 kpp support
crypto: arm/curve25519 - Remove unused kpp support
crypto: powerpc/curve25519 - Remove unused kpp support
crypto: x86/curve25519 - Remove unused kpp support
crypto: testmgr - Remove curve25519 kpp tests
crypto: curve25519 - Remove unused kpp support lib/crypto: tests: Migrate Curve25519 self-test to KUnit lib/crypto: tests: Add Curve25519 benchmark lib/crypto: curve25519: Move a couple functions out-of-line lib/crypto: curve25519: Consolidate into single module lib/crypto: tests: Enable Curve25519 test when CRYPTO_SELFTESTS
wireguard: kconfig: Simplify crypto kconfig selections
arch/arm/crypto/Kconfig | 13 -
arch/arm/crypto/Makefile | 2 -
arch/arm/crypto/curve25519-glue.c | 137 --
arch/m68k/configs/amiga_defconfig | 1 -
arch/m68k/configs/apollo_defconfig | 1 -
arch/m68k/configs/atari_defconfig | 1 -
arch/m68k/configs/bvme6000_defconfig | 1 -
arch/m68k/configs/hp300_defconfig | 1 -
arch/m68k/configs/mac_defconfig | 1 -
arch/m68k/configs/multi_defconfig | 1 -
arch/m68k/configs/mvme147_defconfig | 1 -
arch/m68k/configs/mvme16x_defconfig | 1 -
arch/m68k/configs/q40_defconfig | 1 -
arch/m68k/configs/sun3_defconfig | 1 -
arch/m68k/configs/sun3x_defconfig | 1 -
arch/powerpc/crypto/Kconfig | 13 -
arch/powerpc/crypto/Makefile | 2 -
arch/s390/configs/debug_defconfig | 1 -
arch/s390/configs/defconfig | 1 -
arch/x86/crypto/Kconfig | 13 -
arch/x86/crypto/Makefile | 5 -
crypto/Kconfig | 8 -
crypto/Makefile | 1 -
crypto/curve25519-generic.c | 91 --
crypto/testmgr.c | 6 -
crypto/testmgr.h | 1225 -----------------
drivers/crypto/hisilicon/Kconfig | 1 -
drivers/crypto/hisilicon/hpre/hpre_crypto.c | 403 +-----
drivers/net/Kconfig | 15 +-
include/crypto/curve25519.h | 40 +-
lib/crypto/Kconfig | 37 +-
lib/crypto/Makefile | 27 +-
.../crypto/arm}/curve25519-core.S | 0
lib/crypto/arm/curve25519.h | 47 +
lib/crypto/curve25519-generic.c | 25 -
lib/crypto/curve25519.c | 69 +-
.../crypto/powerpc}/curve25519-ppc64le_asm.S | 0
.../crypto/powerpc/curve25519.h | 124 +-
lib/crypto/tests/Kconfig | 9 +
lib/crypto/tests/Makefile | 1 +
.../curve25519_kunit.c} | 99 +-
.../crypto/x86/curve25519.h | 127 +-
42 files changed, 236 insertions(+), 2318 deletions(-)
delete mode 100644 arch/arm/crypto/curve25519-glue.c
delete mode 100644 crypto/curve25519-generic.c
rename {arch/arm/crypto => lib/crypto/arm}/curve25519-core.S (100%)
create mode 100644 lib/crypto/arm/curve25519.h
delete mode 100644 lib/crypto/curve25519-generic.c
rename {arch/powerpc/crypto => lib/crypto/powerpc}/curve25519-ppc64le_asm.S (100%)
rename arch/powerpc/crypto/curve25519-ppc64le-core.c => lib/crypto/powerpc/curve25519.h (56%)
rename lib/crypto/{curve25519-selftest.c => tests/curve25519_kunit.c} (96%)
rename arch/x86/crypto/curve25519-x86_64.c => lib/crypto/x86/curve25519.h (94%)base-commit: 362f92286065d9f8282da5def89e173a12191568
Signature · 1 line
2.50.1
Eric Biggers
maintainerPATCH v2 1/12 crypto: hisilicon/hpre - Remove unused curve25519 kpp support
Curve25519 is used only via the library API, not the crypto_kpp API. In preparation for removing the unused crypto_kpp API for Curve25519, remove the unused "hpre-curve25519" kpp algorithm.
--- drivers/crypto/hisilicon/Kconfig | 1 - drivers/crypto/hisilicon/hpre/hpre_crypto.c | 403 +------------------- 2 files changed, 4 insertions(+), 400 deletions(-)
drivers/crypto/hisilicon/Kconfig +0 -1
@@ -67,11 +67,10 @@ config CRYPTO_DEV_HISI_HPRE depends on ARM64 || (COMPILE_TEST && 64BIT) depends on ACPI select CRYPTO_DEV_HISI_QM select CRYPTO_DH select CRYPTO_RSA - select CRYPTO_CURVE25519 select CRYPTO_ECDH help Support for HiSilicon HPRE(High Performance RSA Engine) accelerator, which can accelerate RSA and DH algorithms.
drivers/crypto/hisilicon/hpre/hpre_crypto.c +4 -399
528 lines not on this page · raw message
Signature · 1 line
2.50.1
Eric Biggers
maintainerPATCH v2 2/12 crypto: arm/curve25519 - Remove unused kpp support
In reply to Eric BiggersCurve25519 is used only via the library API, not the crypto_kpp API. In preparation for removing the unused crypto_kpp API for Curve25519, remove the unused "curve25519-neon" kpp algorithm.
Note that the underlying NEON optimized Curve25519 code remains fully supported and accessible via the library API.
It's also worth noting that even if the kpp support for Curve25519 comes back later, there is no need for arch-specific kpp glue code like this, as a single kpp algorithm that wraps the library API is sufficient.
--- arch/arm/crypto/Kconfig | 1 - arch/arm/crypto/curve25519-glue.c | 77 +------------------------------ 2 files changed, 1 insertion(+), 77 deletions(-)
arch/arm/crypto/Kconfig +0 -1
@@ -3,11 +3,10 @@ menu "Accelerated Cryptographic Algorithms for CPU (arm)" config CRYPTO_CURVE25519_NEON tristate depends on KERNEL_MODE_NEON - select CRYPTO_KPP select CRYPTO_LIB_CURVE25519_GENERIC select CRYPTO_ARCH_HAVE_LIB_CURVE25519 default CRYPTO_LIB_CURVE25519_INTERNAL help Curve25519 algorithm
arch/arm/crypto/curve25519-glue.c +1 -76
112 lines not on this page · raw message
Signature · 1 line
2.50.1
Eric Biggers
maintainerPATCH v2 3/12 crypto: powerpc/curve25519 - Remove unused kpp support
In reply to Eric BiggersCurve25519 is used only via the library API, not the crypto_kpp API. In preparation for removing the unused crypto_kpp API for Curve25519, remove the unused "curve25519-ppc64le" kpp algorithm.
Note that the underlying PowerPC optimized Curve25519 code remains fully supported and accessible via the library API.
It's also worth noting that even if the kpp support for Curve25519 comes back later, there is no need for arch-specific kpp glue code like this, as a single kpp algorithm that wraps the library API is sufficient.
--- arch/powerpc/crypto/Kconfig | 1 - arch/powerpc/crypto/curve25519-ppc64le-core.c | 105 ------------------ 2 files changed, 106 deletions(-)
arch/powerpc/crypto/Kconfig +0 -1
@@ -3,11 +3,10 @@ menu "Accelerated Cryptographic Algorithms for CPU (powerpc)" config CRYPTO_CURVE25519_PPC64 tristate depends on PPC64 && CPU_LITTLE_ENDIAN - select CRYPTO_KPP select CRYPTO_LIB_CURVE25519_GENERIC select CRYPTO_ARCH_HAVE_LIB_CURVE25519 default CRYPTO_LIB_CURVE25519_INTERNAL help Curve25519 algorithm
arch/powerpc/crypto/curve25519-ppc64le-core.c +0 -105
128 lines not on this page · raw message
Signature · 1 line
2.50.1
Eric Biggers
maintainerPATCH v2 4/12 crypto: x86/curve25519 - Remove unused kpp support
In reply to Eric BiggersCurve25519 is used only via the library API, not the crypto_kpp API. In preparation for removing the unused crypto_kpp API for Curve25519, remove the unused "curve25519-x86" kpp algorithm.
Note that the underlying x86_64 optimized Curve25519 code remains fully supported and accessible via the library API.
It's also worth noting that even if the kpp support for Curve25519 comes back later, there is no need for arch-specific kpp glue code like this, as a single kpp algorithm that wraps the library API is sufficient.
--- arch/x86/crypto/Kconfig | 1 - arch/x86/crypto/curve25519-x86_64.c | 98 +---------------------------- 2 files changed, 1 insertion(+), 98 deletions(-)
arch/x86/crypto/Kconfig +0 -1
@@ -3,11 +3,10 @@ menu "Accelerated Cryptographic Algorithms for CPU (x86)" config CRYPTO_CURVE25519_X86 tristate depends on 64BIT - select CRYPTO_KPP select CRYPTO_LIB_CURVE25519_GENERIC select CRYPTO_ARCH_HAVE_LIB_CURVE25519 default CRYPTO_LIB_CURVE25519_INTERNAL help Curve25519 algorithm
arch/x86/crypto/curve25519-x86_64.c +1 -97
135 lines not on this page · raw message
Signature · 1 line
2.50.1
Eric Biggers
maintainerPATCH v2 5/12 crypto: testmgr - Remove curve25519 kpp tests
In reply to Eric BiggersCurve25519 is used only via the library API, not the crypto_kpp API. In preparation for removing the unused crypto_kpp API for Curve25519, remove the tests for the "curve25519" kpp from crypto/testmgr.c.
Note that these tests just duplicated lib/crypto/curve25519-selftest.c, which uses the same list of test vectors. So they didn't really provide any additional value.
--- crypto/testmgr.c | 6 - crypto/testmgr.h | 1225 ---------------------------------------------- 2 files changed, 1231 deletions(-)
crypto/testmgr.c +0 -6
@@ -4639,16 +4639,10 @@ static const struct alg_test_desc alg_test_descs[] = { .alg = "cts(cbc(sm4))", .test = alg_test_skcipher, .suite = { .cipher = __VECS(sm4_cts_tv_template) } - }, { - .alg = "curve25519", - .test = alg_test_kpp, - .suite = { - .kpp = __VECS(curve25519_tv_template) - } }, { .alg = "deflate", .test = alg_test_comp, .fips_allowed = 1, .suite = {
crypto/testmgr.h +0 -1225
1,235 lines not on this page · raw message
Signature · 1 line
2.50.1
Eric Biggers
maintainerPATCH v2 6/12 crypto: curve25519 - Remove unused kpp support
In reply to Eric BiggersCurve25519 has both a library API and a crypto_kpp API. However, the crypto_kpp API for Curve25519 had no users outside crypto/testmgr.c. I.e., no non-test code ever passed "curve25519" to crypto_alloc_kpp().
Remove this unused code. We'll instead focus on the Curve25519 library API (<crypto/curve25519.h>), which is a simpler and easier-to-use API and is the API that is actually being used.
--- arch/m68k/configs/amiga_defconfig | 1 - arch/m68k/configs/apollo_defconfig | 1 - arch/m68k/configs/atari_defconfig | 1 - arch/m68k/configs/bvme6000_defconfig | 1 - arch/m68k/configs/hp300_defconfig | 1 - arch/m68k/configs/mac_defconfig | 1 - arch/m68k/configs/multi_defconfig | 1 - arch/m68k/configs/mvme147_defconfig | 1 - arch/m68k/configs/mvme16x_defconfig | 1 - arch/m68k/configs/q40_defconfig | 1 - arch/m68k/configs/sun3_defconfig | 1 - arch/m68k/configs/sun3x_defconfig | 1 - arch/s390/configs/debug_defconfig | 1 - arch/s390/configs/defconfig | 1 - crypto/Kconfig | 8 --- crypto/Makefile | 1 - crypto/curve25519-generic.c | 91 ---------------------------- 17 files changed, 114 deletions(-) delete mode 100644 crypto/curve25519-generic.c
arch/m68k/configs/amiga_defconfig +0 -1
@@ -558,11 +558,10 @@ CONFIG_CRYPTO_BENCHMARK=m CONFIG_CRYPTO_RSA=m CONFIG_CRYPTO_DH=m CONFIG_CRYPTO_ECDH=m CONFIG_CRYPTO_ECDSA=m CONFIG_CRYPTO_ECRDSA=m -CONFIG_CRYPTO_CURVE25519=m CONFIG_CRYPTO_AES=y CONFIG_CRYPTO_AES_TI=m CONFIG_CRYPTO_ANUBIS=m CONFIG_CRYPTO_ARIA=m CONFIG_CRYPTO_BLOWFISH=m
arch/m68k/configs/apollo_defconfig +0 -1
@@ -515,11 +515,10 @@ CONFIG_CRYPTO_BENCHMARK=m CONFIG_CRYPTO_RSA=m CONFIG_CRYPTO_DH=m CONFIG_CRYPTO_ECDH=m CONFIG_CRYPTO_ECDSA=m CONFIG_CRYPTO_ECRDSA=m -CONFIG_CRYPTO_CURVE25519=m CONFIG_CRYPTO_AES=y CONFIG_CRYPTO_AES_TI=m CONFIG_CRYPTO_ANUBIS=m CONFIG_CRYPTO_ARIA=m CONFIG_CRYPTO_BLOWFISH=m
arch/m68k/configs/atari_defconfig +0 -1
@@ -535,11 +535,10 @@ CONFIG_CRYPTO_BENCHMARK=m CONFIG_CRYPTO_RSA=m CONFIG_CRYPTO_DH=m CONFIG_CRYPTO_ECDH=m CONFIG_CRYPTO_ECDSA=m CONFIG_CRYPTO_ECRDSA=m -CONFIG_CRYPTO_CURVE25519=m CONFIG_CRYPTO_AES=y CONFIG_CRYPTO_AES_TI=m CONFIG_CRYPTO_ANUBIS=m CONFIG_CRYPTO_ARIA=m CONFIG_CRYPTO_BLOWFISH=m
arch/m68k/configs/bvme6000_defconfig +0 -1
@@ -507,11 +507,10 @@ CONFIG_CRYPTO_BENCHMARK=m CONFIG_CRYPTO_RSA=m CONFIG_CRYPTO_DH=m CONFIG_CRYPTO_ECDH=m CONFIG_CRYPTO_ECDSA=m CONFIG_CRYPTO_ECRDSA=m -CONFIG_CRYPTO_CURVE25519=m CONFIG_CRYPTO_AES=y CONFIG_CRYPTO_AES_TI=m CONFIG_CRYPTO_ANUBIS=m CONFIG_CRYPTO_ARIA=m CONFIG_CRYPTO_BLOWFISH=m
arch/m68k/configs/hp300_defconfig +0 -1
@@ -517,11 +517,10 @@ CONFIG_CRYPTO_BENCHMARK=m CONFIG_CRYPTO_RSA=m CONFIG_CRYPTO_DH=m CONFIG_CRYPTO_ECDH=m CONFIG_CRYPTO_ECDSA=m CONFIG_CRYPTO_ECRDSA=m -CONFIG_CRYPTO_CURVE25519=m CONFIG_CRYPTO_AES=y CONFIG_CRYPTO_AES_TI=m CONFIG_CRYPTO_ANUBIS=m CONFIG_CRYPTO_ARIA=m CONFIG_CRYPTO_BLOWFISH=m
arch/m68k/configs/mac_defconfig +0 -1
@@ -534,11 +534,10 @@ CONFIG_CRYPTO_BENCHMARK=m CONFIG_CRYPTO_RSA=m CONFIG_CRYPTO_DH=m CONFIG_CRYPTO_ECDH=m CONFIG_CRYPTO_ECDSA=m CONFIG_CRYPTO_ECRDSA=m -CONFIG_CRYPTO_CURVE25519=m CONFIG_CRYPTO_AES=y CONFIG_CRYPTO_AES_TI=m CONFIG_CRYPTO_ANUBIS=m CONFIG_CRYPTO_ARIA=m CONFIG_CRYPTO_BLOWFISH=m
arch/m68k/configs/multi_defconfig +0 -1
@@ -621,11 +621,10 @@ CONFIG_CRYPTO_BENCHMARK=m CONFIG_CRYPTO_RSA=m CONFIG_CRYPTO_DH=m CONFIG_CRYPTO_ECDH=m CONFIG_CRYPTO_ECDSA=m CONFIG_CRYPTO_ECRDSA=m -CONFIG_CRYPTO_CURVE25519=m CONFIG_CRYPTO_AES=y CONFIG_CRYPTO_AES_TI=m CONFIG_CRYPTO_ANUBIS=m CONFIG_CRYPTO_ARIA=m CONFIG_CRYPTO_BLOWFISH=m
arch/m68k/configs/mvme147_defconfig +0 -1
@@ -507,11 +507,10 @@ CONFIG_CRYPTO_BENCHMARK=m CONFIG_CRYPTO_RSA=m CONFIG_CRYPTO_DH=m CONFIG_CRYPTO_ECDH=m CONFIG_CRYPTO_ECDSA=m CONFIG_CRYPTO_ECRDSA=m -CONFIG_CRYPTO_CURVE25519=m CONFIG_CRYPTO_AES=y CONFIG_CRYPTO_AES_TI=m CONFIG_CRYPTO_ANUBIS=m CONFIG_CRYPTO_ARIA=m CONFIG_CRYPTO_BLOWFISH=m
arch/m68k/configs/mvme16x_defconfig +0 -1
@@ -508,11 +508,10 @@ CONFIG_CRYPTO_BENCHMARK=m CONFIG_CRYPTO_RSA=m CONFIG_CRYPTO_DH=m CONFIG_CRYPTO_ECDH=m CONFIG_CRYPTO_ECDSA=m CONFIG_CRYPTO_ECRDSA=m -CONFIG_CRYPTO_CURVE25519=m CONFIG_CRYPTO_AES=y CONFIG_CRYPTO_AES_TI=m CONFIG_CRYPTO_ANUBIS=m CONFIG_CRYPTO_ARIA=m CONFIG_CRYPTO_BLOWFISH=m
arch/m68k/configs/q40_defconfig +0 -1
@@ -524,11 +524,10 @@ CONFIG_CRYPTO_BENCHMARK=m CONFIG_CRYPTO_RSA=m CONFIG_CRYPTO_DH=m CONFIG_CRYPTO_ECDH=m CONFIG_CRYPTO_ECDSA=m CONFIG_CRYPTO_ECRDSA=m -CONFIG_CRYPTO_CURVE25519=m CONFIG_CRYPTO_AES=y CONFIG_CRYPTO_AES_TI=m CONFIG_CRYPTO_ANUBIS=m CONFIG_CRYPTO_ARIA=m CONFIG_CRYPTO_BLOWFISH=m
arch/m68k/configs/sun3_defconfig +0 -1
@@ -505,11 +505,10 @@ CONFIG_CRYPTO_BENCHMARK=m CONFIG_CRYPTO_RSA=m CONFIG_CRYPTO_DH=m CONFIG_CRYPTO_ECDH=m CONFIG_CRYPTO_ECDSA=m CONFIG_CRYPTO_ECRDSA=m -CONFIG_CRYPTO_CURVE25519=m CONFIG_CRYPTO_AES=y CONFIG_CRYPTO_AES_TI=m CONFIG_CRYPTO_ANUBIS=m CONFIG_CRYPTO_ARIA=m CONFIG_CRYPTO_BLOWFISH=m
arch/m68k/configs/sun3x_defconfig +0 -1
@@ -505,11 +505,10 @@ CONFIG_CRYPTO_BENCHMARK=m CONFIG_CRYPTO_RSA=m CONFIG_CRYPTO_DH=m CONFIG_CRYPTO_ECDH=m CONFIG_CRYPTO_ECDSA=m CONFIG_CRYPTO_ECRDSA=m -CONFIG_CRYPTO_CURVE25519=m CONFIG_CRYPTO_AES=y CONFIG_CRYPTO_AES_TI=m CONFIG_CRYPTO_ANUBIS=m CONFIG_CRYPTO_ARIA=m CONFIG_CRYPTO_BLOWFISH=m
arch/s390/configs/debug_defconfig +0 -1
@@ -759,11 +759,10 @@ CONFIG_CRYPTO_CRYPTD=m CONFIG_CRYPTO_BENCHMARK=m CONFIG_CRYPTO_DH=m CONFIG_CRYPTO_ECDH=m CONFIG_CRYPTO_ECDSA=m CONFIG_CRYPTO_ECRDSA=m -CONFIG_CRYPTO_CURVE25519=m CONFIG_CRYPTO_AES_TI=m CONFIG_CRYPTO_ANUBIS=m CONFIG_CRYPTO_ARIA=m CONFIG_CRYPTO_BLOWFISH=m CONFIG_CRYPTO_CAST5=m
arch/s390/configs/defconfig +0 -1
@@ -743,11 +743,10 @@ CONFIG_CRYPTO_CRYPTD=m CONFIG_CRYPTO_BENCHMARK=m CONFIG_CRYPTO_DH=m CONFIG_CRYPTO_ECDH=m CONFIG_CRYPTO_ECDSA=m CONFIG_CRYPTO_ECRDSA=m -CONFIG_CRYPTO_CURVE25519=m CONFIG_CRYPTO_AES_TI=m CONFIG_CRYPTO_ANUBIS=m CONFIG_CRYPTO_ARIA=m CONFIG_CRYPTO_BLOWFISH=m CONFIG_CRYPTO_CAST5=m
crypto/Kconfig +0 -8
@@ -342,18 +342,10 @@ config CRYPTO_ECRDSA RFC 7091, ISO/IEC 14888-3) One of the Russian cryptographic standard algorithms (called GOST algorithms). Only signature verification is implemented. -config CRYPTO_CURVE25519 - tristate "Curve25519" - select CRYPTO_KPP - select CRYPTO_LIB_CURVE25519_GENERIC - select CRYPTO_LIB_CURVE25519_INTERNAL - help - Curve25519 elliptic curve (RFC7748) - endmenu menu "Block ciphers" config CRYPTO_AES
crypto/Makefile +0 -1
@@ -180,11 +180,10 @@ obj-$(CONFIG_CRYPTO_USER_API_SKCIPHER) += algif_skcipher.o obj-$(CONFIG_CRYPTO_USER_API_RNG) += algif_rng.o obj-$(CONFIG_CRYPTO_USER_API_AEAD) += algif_aead.o obj-$(CONFIG_CRYPTO_ZSTD) += zstd.o obj-$(CONFIG_CRYPTO_ECC) += ecc.o obj-$(CONFIG_CRYPTO_ESSIV) += essiv.o -obj-$(CONFIG_CRYPTO_CURVE25519) += curve25519-generic.o ecdh_generic-y += ecdh.o ecdh_generic-y += ecdh_helper.o obj-$(CONFIG_CRYPTO_ECDH) += ecdh_generic.o
crypto/curve25519-generic.c deleted +0 -91
91 lines not on this page · raw message
Signature · 1 line
2.50.1
Eric Biggers
maintainerPATCH v2 7/12 lib/crypto: tests: Migrate Curve25519 self-test to KUnit
In reply to Eric BiggersMove the Curve25519 test from an ad-hoc self-test to a KUnit test.
Generally keep the same test logic for now, just translated to KUnit. There's one exception, which is that I dropped the incomplete test of curve25519_generic(). The approach I'm taking to cover the different implementations with the KUnit tests is to just rely on booting kernels in QEMU with different '-cpu' options, rather than try to make the tests (incompletely) test multiple implementations on one CPU. This way, both the test and the library API are simpler.
This commit makes the file lib/crypto/curve25519.c no longer needed, as its only purpose was to call the self-test. However, keep it for now, since a later commit will add code to it again.
Temporarily omit the default value of CRYPTO_SELFTESTS that the other lib/crypto/ KUnit tests have. It would cause a recursive kconfig dependency, since the Curve25519 code is still entangled with CRYPTO. A later commit will fix that.
---
include/crypto/curve25519.h | 2 -
lib/crypto/Makefile | 1 -
lib/crypto/curve25519.c | 3 -
lib/crypto/tests/Kconfig | 9 +++
lib/crypto/tests/Makefile | 1 +
.../curve25519_kunit.c} | 70 +++++++++++--------
6 files changed, 49 insertions(+), 37 deletions(-)
rename lib/crypto/{curve25519-selftest.c => tests/curve25519_kunit.c} (97%)include/crypto/curve25519.h +0 -2
@@ -26,12 +26,10 @@ void curve25519_arch(u8 out[CURVE25519_KEY_SIZE], const u8 point[CURVE25519_KEY_SIZE]);void curve25519_base_arch (u8 pub[CURVE25519_KEY_SIZE ],const u8 secret[CURVE25519_KEY_SIZE ]); -bool curve25519_selftest (void ); -static inline bool __must_check curve25519 (u8 mypublic[CURVE25519_KEY_SIZE ],const u8 secret[CURVE25519_KEY_SIZE ],const u8 basepoint[CURVE25519_KEY_SIZE ]) {
lib/crypto/Makefile +0 -1
@@ -85,11 +85,10 @@ ifeq ($(call clang-min-version, 180000),) KASAN_SANITIZE_curve25519-hacl64.o := n endif obj-$(CONFIG_CRYPTO_LIB_CURVE25519) += libcurve25519.o libcurve25519-y += curve25519.o -libcurve25519-$(CONFIG_CRYPTO_SELFTESTS) += curve25519-selftest.o obj-$(CONFIG_CRYPTO_LIB_DES) += libdes.o libdes-y := des.o ################################################################################
lib/crypto/curve25519.c +0 -3
@@ -13,13 +13,10 @@#include <linux/module.h> #include <linux/init.h> static int __init curve25519_init (void ) { -if (IS_ENABLED (CONFIG_CRYPTO_SELFTESTS ) && -WARN_ON (!curve25519_selftest ())) -return -ENODEV ;return 0 ; } static void __exit curve25519_exit(void) {
lib/crypto/tests/Kconfig +9 -0
@@ -8,10 +8,19 @@ config CRYPTO_LIB_BLAKE2S_KUNIT_TEST # No need to select CRYPTO_LIB_BLAKE2S here, as that option doesn't # exist; the BLAKE2s code is always built-in for the /dev/random driver. help KUnit tests for the BLAKE2s cryptographic hash function. +config CRYPTO_LIB_CURVE25519_KUNIT_TEST + tristate "KUnit tests for Curve25519" if !KUNIT_ALL_TESTS + depends on KUNIT + default KUNIT_ALL_TESTS + select CRYPTO_LIB_BENCHMARK_VISIBLE + select CRYPTO_LIB_CURVE25519 + help + KUnit tests for the Curve25519 Diffie-Hellman function. + config CRYPTO_LIB_MD5_KUNIT_TEST tristate "KUnit tests for MD5" if !KUNIT_ALL_TESTS depends on KUNIT default KUNIT_ALL_TESTS || CRYPTO_SELFTESTS select CRYPTO_LIB_BENCHMARK_VISIBLE
lib/crypto/tests/Makefile +1 -0
@@ -1,8 +1,9 @@ # SPDX-License-Identifier: GPL-2.0-or-later obj-$(CONFIG_CRYPTO_LIB_BLAKE2S_KUNIT_TEST) += blake2s_kunit.o +obj-$(CONFIG_CRYPTO_LIB_CURVE25519_KUNIT_TEST) += curve25519_kunit.o obj-$(CONFIG_CRYPTO_LIB_MD5_KUNIT_TEST) += md5_kunit.o obj-$(CONFIG_CRYPTO_LIB_POLY1305_KUNIT_TEST) += poly1305_kunit.o obj-$(CONFIG_CRYPTO_LIB_SHA1_KUNIT_TEST) += sha1_kunit.o obj-$(CONFIG_CRYPTO_LIB_SHA256_KUNIT_TEST) += sha224_kunit.o sha256_kunit.o obj-$(CONFIG_CRYPTO_LIB_SHA512_KUNIT_TEST) += sha384_kunit.o sha512_kunit.o
lib/crypto/tests/curve25519_kunit.c renamed from lib/crypto/curve25519-selftest.c +39 -31
101 lines not on this page · raw message
Signature · 1 line
2.50.1
Eric Biggers
maintainerRe: [PATCH v2 07/12] lib/crypto: tests: Migrate Curve25519 self-test to KUnit
lib/crypto/tests/curve25519_kunit.c static const struct curve25519_test_vector curve25519_test_vectors[] __initconst · line 1329
Quoted 11 lines · Eric Biggers
lib/crypto/tests/curve25519_kunit.c renamed from lib/crypto/curve25519-selftest.c +11
-0+static struct kunit_case curve25519_test_cases[] = { +KUNIT_CASE (test_curve25519), +KUNIT_CASE (test_curve25519_basepoint), + {}, +}; + +static struct kunit_suite curve25519_test_suite = { + .name ="curve25519" , + .test_cases = curve25519_test_cases, +}; +kunit_test_suite (curve25519_test_suite);
Correction: there should be a module description and license here.
MODULE_DESCRIPTION("KUnit tests and benchmark for Curve25519"); MODULE_LICENSE("GPL");
- Eric
Eric Biggers
maintainerPATCH v2 8/12 lib/crypto: tests: Add Curve25519 benchmark
In reply to Eric BiggersAdd a benchmark to curve25519_kunit. This brings it in line with the other crypto KUnit tests and provides an easy way to measure performance.
--- lib/crypto/tests/curve25519_kunit.c | 31 +++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+)
lib/crypto/tests/curve25519_kunit.c +31 -0
@@ -3,10 +3,11 @@* Copyright (C) 2015-2019 Jason A. Donenfeld <[email protected]>. All Rights Reserved. */ #include <crypto/curve25519.h> #include <kunit/test.h> +#include <linux/timekeeping.h> struct curve25519_test_vector {u8 private[CURVE25519_KEY_SIZE ];u8 public[CURVE25519_KEY_SIZE ];u8 result[CURVE25519_KEY_SIZE ];
@@ -1314,13 +1315,43 @@ static void test_curve25519_basepoint(struct kunit *test)KUNIT_EXPECT_MEMEQ_MSG (test, out, out2,CURVE25519_KEY_SIZE ,"in=%*phN" ,CURVE25519_KEY_SIZE , in); } } +static void benchmark_curve25519 (struct kunit *test) +{ +const u8 *private = curve25519_test_vectors[0 ].private; +const u8 *public = curve25519_test_vectors[0 ].public; +const size_t warmup_niter =5000 ; +const size_t benchmark_niter =1024 ; +u8 out[CURVE25519_KEY_SIZE ]; +bool ok = true; +u64 t; + +if (!IS_ENABLED (CONFIG_CRYPTO_LIB_BENCHMARK )) +kunit_skip (test,"not enabled" ); + +/* Warm-up */ +for (size_t i =0 ; i < warmup_niter; i++) + ok &=curve25519 (out, private, public); + +/* Benchmark */ +preempt_disable (); + t =ktime_get_ns (); +for (size_t i =0 ; i < benchmark_niter; i++) + ok &=curve25519 (out, private, public); + t =ktime_get_ns () - t; +preempt_enable (); +KUNIT_EXPECT_TRUE (test, ok); +kunit_info (test,"%llu ops/s" , +div64_u64 ((u64 )benchmark_niter *NSEC_PER_SEC , t ?:1 )); +} +static struct kunit_case curve25519_test_cases[] = {KUNIT_CASE (test_curve25519),KUNIT_CASE (test_curve25519_basepoint), +KUNIT_CASE (benchmark_curve25519), {}, };static struct kunit_suite curve25519_test_suite = { .name ="curve25519" ,
Signature · 1 line
2.50.1
Eric Biggers
maintainerPATCH v2 9/12 lib/crypto: curve25519: Move a couple functions out-of-line
In reply to Eric BiggersMove curve25519() and curve25519_generate_public() from curve25519.h to curve25519.c. There's no good reason for them to be inline.
--- include/crypto/curve25519.h | 28 +++------------------------- lib/crypto/curve25519.c | 34 +++++++++++++++++++++++++++++++++- 2 files changed, 36 insertions(+), 26 deletions(-)
include/crypto/curve25519.h +3 -25
@@ -4,11 +4,10 @@*/ #ifndef CURVE25519_H #define CURVE25519_H -#include <crypto/algapi.h> // For crypto_memneq. #include <linux/types.h> #include <linux/random.h> enum curve25519_lengths { CURVE25519_KEY_SIZE = 32
@@ -26,37 +25,16 @@ void curve25519_arch(u8 out[CURVE25519_KEY_SIZE], const u8 point[CURVE25519_KEY_SIZE]);void curve25519_base_arch (u8 pub[CURVE25519_KEY_SIZE ],const u8 secret[CURVE25519_KEY_SIZE ]); -static inline bool __must_check curve25519 (u8 mypublic[CURVE25519_KEY_SIZE ],const u8 secret[CURVE25519_KEY_SIZE ], -const u8 basepoint[CURVE25519_KEY_SIZE ]) -{ -if (IS_ENABLED (CONFIG_CRYPTO_ARCH_HAVE_LIB_CURVE25519 )) -curve25519_arch (mypublic, secret, basepoint); -else -curve25519_generic (mypublic, secret, basepoint); -return crypto_memneq (mypublic, curve25519_null_point, -CURVE25519_KEY_SIZE ); -} +const u8 basepoint[CURVE25519_KEY_SIZE ]); -static inline bool -__must_check curve25519_generate_public (u8 pub[CURVE25519_KEY_SIZE ], -const u8 secret[CURVE25519_KEY_SIZE ]) -{ -if (unlikely (!crypto_memneq (secret, curve25519_null_point, -CURVE25519_KEY_SIZE ))) -return false; - -if (IS_ENABLED (CONFIG_CRYPTO_ARCH_HAVE_LIB_CURVE25519 )) -curve25519_base_arch (pub, secret); -else -curve25519_generic (pub, secret, curve25519_base_point); -return crypto_memneq (pub, curve25519_null_point,CURVE25519_KEY_SIZE ); -} +bool __must_check curve25519_generate_public (u8 pub[CURVE25519_KEY_SIZE ], +const u8 secret[CURVE25519_KEY_SIZE ]);static inline void curve25519_clamp_secret (u8 secret[CURVE25519_KEY_SIZE ]) { secret[0 ] &=248 ; secret[31 ] = (secret[31 ] &127 ) |64 ;
lib/crypto/curve25519.c +33 -1
@@ -8,12 +8,44 @@* * Information: https://cr.yp.to/ecdh.html */ #include <crypto/curve25519.h> -#include <linux/module.h> +#include <crypto/utils.h> +#include <linux/export.h> #include <linux/init.h> +#include <linux/module.h> + +bool __must_check +curve25519 (u8 mypublic[CURVE25519_KEY_SIZE ], +const u8 secret[CURVE25519_KEY_SIZE ], +const u8 basepoint[CURVE25519_KEY_SIZE ]) +{ +if (IS_ENABLED (CONFIG_CRYPTO_ARCH_HAVE_LIB_CURVE25519 )) +curve25519_arch (mypublic, secret, basepoint); +else +curve25519_generic (mypublic, secret, basepoint); +return crypto_memneq (mypublic, curve25519_null_point, +CURVE25519_KEY_SIZE ); +} +EXPORT_SYMBOL (curve25519); + +bool __must_check +curve25519_generate_public (u8 pub[CURVE25519_KEY_SIZE ], +const u8 secret[CURVE25519_KEY_SIZE ]) +{ +if (unlikely (!crypto_memneq (secret, curve25519_null_point, +CURVE25519_KEY_SIZE ))) +return false; + +if (IS_ENABLED (CONFIG_CRYPTO_ARCH_HAVE_LIB_CURVE25519 )) +curve25519_base_arch (pub, secret); +else +curve25519_generic (pub, secret, curve25519_base_point); +return crypto_memneq (pub, curve25519_null_point,CURVE25519_KEY_SIZE ); +} +EXPORT_SYMBOL (curve25519_generate_public);static int __init curve25519_init (void ) {return 0 ; }
Signature · 1 line
2.50.1
Eric Biggers
maintainerPATCH v2 10/12 lib/crypto: curve25519: Consolidate into single module
In reply to Eric BiggersReorganize the Curve25519 library code:
- Build a single libcurve25519 module, instead of up to three modules:
libcurve25519, libcurve25519-generic, and an arch-specific module.
- Move the arch-specific Curve25519 code from arch/$(SRCARCH)/crypto/ to lib/crypto/$(SRCARCH)/. Centralize the build rules into lib/crypto/Makefile and lib/crypto/Kconfig.
- Include the arch-specific code directly in lib/crypto/curve25519.c via a header, rather than using a separate .c file.
- Eliminate the entanglement with CRYPTO. CRYPTO_LIB_CURVE25519 no longer selects CRYPTO, and the arch-specific Curve25519 code no longer depends on CRYPTO.
This brings Curve25519 in line with the latest conventions for lib/crypto/, used by other algorithms. The exception is that I kept the generic code in separate translation units for now. (Some of the function names collide between the x86 and generic Curve25519 code. And the Curve25519 functions are very long anyway, so inlining doesn't matter as much for Curve25519 as it does for some other algorithms.)
---
arch/arm/crypto/Kconfig | 12 -----
arch/arm/crypto/Makefile | 2 -
arch/powerpc/crypto/Kconfig | 12 -----
arch/powerpc/crypto/Makefile | 2 -
arch/x86/crypto/Kconfig | 12 -----
arch/x86/crypto/Makefile | 5 --
include/crypto/curve25519.h | 10 ----
lib/crypto/Kconfig | 37 +++++---------
lib/crypto/Makefile | 26 +++++++---
.../crypto/arm}/curve25519-core.S | 0
.../crypto/arm/curve25519.h | 31 +++---------
lib/crypto/curve25519-generic.c | 25 ----------
lib/crypto/curve25519.c | 50 ++++++++++++-------
.../crypto/powerpc}/curve25519-ppc64le_asm.S | 0
.../crypto/powerpc/curve25519.h | 19 ++-----
.../crypto/x86/curve25519.h | 31 +++---------
16 files changed, 86 insertions(+), 188 deletions(-)
rename {arch/arm/crypto => lib/crypto/arm}/curve25519-core.S (100%)
rename arch/arm/crypto/curve25519-glue.c => lib/crypto/arm/curve25519.h (58%)
delete mode 100644 lib/crypto/curve25519-generic.c
rename {arch/powerpc/crypto => lib/crypto/powerpc}/curve25519-ppc64le_asm.S (100%)
rename arch/powerpc/crypto/curve25519-ppc64le-core.c => lib/crypto/powerpc/curve25519.h (88%)
rename arch/x86/crypto/curve25519-x86_64.c => lib/crypto/x86/curve25519.h (98%)arch/arm/crypto/Kconfig +0 -12
@@ -1,21 +1,9 @@ # SPDX-License-Identifier: GPL-2.0 menu "Accelerated Cryptographic Algorithms for CPU (arm)" -config CRYPTO_CURVE25519_NEON - tristate - depends on KERNEL_MODE_NEON - select CRYPTO_LIB_CURVE25519_GENERIC - select CRYPTO_ARCH_HAVE_LIB_CURVE25519 - default CRYPTO_LIB_CURVE25519_INTERNAL - help - Curve25519 algorithm - - Architecture: arm with - - NEON (Advanced SIMD) extensions - config CRYPTO_GHASH_ARM_CE tristate "Hash functions: GHASH (PMULL/NEON/ARMv8 Crypto Extensions)" depends on KERNEL_MODE_NEON select CRYPTO_AEAD select CRYPTO_HASH
arch/arm/crypto/Makefile +0 -2
@@ -5,17 +5,15 @@ obj-$(CONFIG_CRYPTO_AES_ARM) += aes-arm.o obj-$(CONFIG_CRYPTO_AES_ARM_BS) += aes-arm-bs.o obj-$(CONFIG_CRYPTO_BLAKE2B_NEON) += blake2b-neon.o obj-$(CONFIG_CRYPTO_NHPOLY1305_NEON) += nhpoly1305-neon.o -obj-$(CONFIG_CRYPTO_CURVE25519_NEON) += curve25519-neon.o obj-$(CONFIG_CRYPTO_AES_ARM_CE) += aes-arm-ce.o obj-$(CONFIG_CRYPTO_GHASH_ARM_CE) += ghash-arm-ce.o aes-arm-y := aes-cipher-core.o aes-cipher-glue.o aes-arm-bs-y := aes-neonbs-core.o aes-neonbs-glue.o blake2b-neon-y := blake2b-neon-core.o blake2b-neon-glue.o aes-arm-ce-y := aes-ce-core.o aes-ce-glue.o ghash-arm-ce-y := ghash-ce-core.o ghash-ce-glue.o nhpoly1305-neon-y := nh-neon-core.o nhpoly1305-neon-glue.o -curve25519-neon-y := curve25519-core.o curve25519-glue.o
arch/powerpc/crypto/Kconfig +0 -12
@@ -1,21 +1,9 @@ # SPDX-License-Identifier: GPL-2.0 menu "Accelerated Cryptographic Algorithms for CPU (powerpc)" -config CRYPTO_CURVE25519_PPC64 - tristate - depends on PPC64 && CPU_LITTLE_ENDIAN - select CRYPTO_LIB_CURVE25519_GENERIC - select CRYPTO_ARCH_HAVE_LIB_CURVE25519 - default CRYPTO_LIB_CURVE25519_INTERNAL - help - Curve25519 algorithm - - Architecture: PowerPC64 - - Little-endian - config CRYPTO_AES_PPC_SPE tristate "Ciphers: AES, modes: ECB/CBC/CTR/XTS (SPE)" depends on SPE select CRYPTO_SKCIPHER help
arch/powerpc/crypto/Makefile +0 -2
@@ -6,16 +6,14 @@ # obj-$(CONFIG_CRYPTO_AES_PPC_SPE) += aes-ppc-spe.o obj-$(CONFIG_CRYPTO_AES_GCM_P10) += aes-gcm-p10-crypto.o obj-$(CONFIG_CRYPTO_DEV_VMX_ENCRYPT) += vmx-crypto.o -obj-$(CONFIG_CRYPTO_CURVE25519_PPC64) += curve25519-ppc64le.o aes-ppc-spe-y := aes-spe-core.o aes-spe-keys.o aes-tab-4k.o aes-spe-modes.o aes-spe-glue.o aes-gcm-p10-crypto-y := aes-gcm-p10-glue.o aes-gcm-p10.o ghashp10-ppc.o aesp10-ppc.o vmx-crypto-objs := vmx.o aesp8-ppc.o ghashp8-ppc.o aes.o aes_cbc.o aes_ctr.o aes_xts.o ghash.o -curve25519-ppc64le-y := curve25519-ppc64le-core.o curve25519-ppc64le_asm.o ifeq ($(CONFIG_CPU_LITTLE_ENDIAN),y) override flavour := linux-ppc64le else ifdef CONFIG_PPC64_ELF_ABI_V2
arch/x86/crypto/Kconfig +0 -12
@@ -1,21 +1,9 @@ # SPDX-License-Identifier: GPL-2.0 menu "Accelerated Cryptographic Algorithms for CPU (x86)" -config CRYPTO_CURVE25519_X86 - tristate - depends on 64BIT - select CRYPTO_LIB_CURVE25519_GENERIC - select CRYPTO_ARCH_HAVE_LIB_CURVE25519 - default CRYPTO_LIB_CURVE25519_INTERNAL - help - Curve25519 algorithm - - Architecture: x86_64 using: - - ADX (large integer arithmetic) - config CRYPTO_AES_NI_INTEL tristate "Ciphers: AES, modes: ECB, CBC, CTS, CTR, XCTR, XTS, GCM (AES-NI/VAES)" select CRYPTO_AEAD select CRYPTO_LIB_AES select CRYPTO_LIB_GF128MUL
arch/x86/crypto/Makefile +0 -5
@@ -60,12 +60,10 @@ polyval-clmulni-y := polyval-clmulni_asm.o polyval-clmulni_glue.o obj-$(CONFIG_CRYPTO_NHPOLY1305_SSE2) += nhpoly1305-sse2.o nhpoly1305-sse2-y := nh-sse2-x86_64.o nhpoly1305-sse2-glue.o obj-$(CONFIG_CRYPTO_NHPOLY1305_AVX2) += nhpoly1305-avx2.o nhpoly1305-avx2-y := nh-avx2-x86_64.o nhpoly1305-avx2-glue.o -obj-$(CONFIG_CRYPTO_CURVE25519_X86) += curve25519-x86_64.o - obj-$(CONFIG_CRYPTO_SM3_AVX_X86_64) += sm3-avx-x86_64.o sm3-avx-x86_64-y := sm3-avx-asm_64.o sm3_avx_glue.o obj-$(CONFIG_CRYPTO_SM4_AESNI_AVX_X86_64) += sm4-aesni-avx-x86_64.o sm4-aesni-avx-x86_64-y := sm4-aesni-avx-asm_64.o sm4_aesni_avx_glue.o
@@ -79,8 +77,5 @@ aria-aesni-avx-x86_64-y := aria-aesni-avx-asm_64.o aria_aesni_avx_glue.o obj-$(CONFIG_CRYPTO_ARIA_AESNI_AVX2_X86_64) += aria-aesni-avx2-x86_64.o aria-aesni-avx2-x86_64-y := aria-aesni-avx2-asm_64.o aria_aesni_avx2_glue.o obj-$(CONFIG_CRYPTO_ARIA_GFNI_AVX512_X86_64) += aria-gfni-avx512-x86_64.o aria-gfni-avx512-x86_64-y := aria-gfni-avx512-asm_64.o aria_gfni_avx512_glue.o - -# Disable GCOV in odd or sensitive code -GCOV_PROFILE_curve25519-x86_64.o := n
include/crypto/curve25519.h +0 -10
@@ -11,24 +11,14 @@enum curve25519_lengths {CURVE25519_KEY_SIZE =32 }; -extern const u8 curve25519_null_point[]; -extern const u8 curve25519_base_point[]; -void curve25519_generic (u8 out[CURVE25519_KEY_SIZE ],const u8 scalar[CURVE25519_KEY_SIZE ],const u8 point[CURVE25519_KEY_SIZE ]); -void curve25519_arch (u8 out[CURVE25519_KEY_SIZE ], -const u8 scalar[CURVE25519_KEY_SIZE ], -const u8 point[CURVE25519_KEY_SIZE ]); - -void curve25519_base_arch (u8 pub[CURVE25519_KEY_SIZE ], -const u8 secret[CURVE25519_KEY_SIZE ]); -bool __must_check curve25519 (u8 mypublic[CURVE25519_KEY_SIZE ],const u8 secret[CURVE25519_KEY_SIZE ],const u8 basepoint[CURVE25519_KEY_SIZE ]); bool __must_check curve25519_generate_public(u8 pub[CURVE25519_KEY_SIZE],
lib/crypto/Kconfig +13 -24
@@ -52,39 +52,28 @@ config CRYPTO_LIB_CHACHA_ARCH default y if PPC64 && CPU_LITTLE_ENDIAN && VSX default y if RISCV && 64BIT && RISCV_ISA_V && TOOLCHAIN_HAS_VECTOR_CRYPTO default y if S390 default y if X86_64 -config CRYPTO_ARCH_HAVE_LIB_CURVE25519 - bool - help - Declares whether the architecture provides an arch-specific - accelerated implementation of the Curve25519 library interface, - either builtin or as a module. - -config CRYPTO_LIB_CURVE25519_GENERIC +config CRYPTO_LIB_CURVE25519 tristate select CRYPTO_LIB_UTILS help - This symbol can be depended upon by arch implementations of the - Curve25519 library interface that require the generic code as a - fallback, e.g., for SIMD implementations. If no arch specific - implementation is enabled, this implementation serves the users - of CRYPTO_LIB_CURVE25519. + The Curve25519 library functions. Select this if your module uses any + of the functions from <crypto/curve25519.h>. -config CRYPTO_LIB_CURVE25519_INTERNAL - tristate - select CRYPTO_LIB_CURVE25519_GENERIC if CRYPTO_ARCH_HAVE_LIB_CURVE25519=n +config CRYPTO_LIB_CURVE25519_ARCH + bool + depends on CRYPTO_LIB_CURVE25519 && !UML && !KMSAN + default y if ARM && KERNEL_MODE_NEON + default y if PPC64 && CPU_LITTLE_ENDIAN + default y if X86_64 -config CRYPTO_LIB_CURVE25519 - tristate - select CRYPTO - select CRYPTO_LIB_CURVE25519_INTERNAL - help - Enable the Curve25519 library interface. This interface may be - fulfilled by either the generic implementation or an arch-specific - one, if one is available and enabled. +config CRYPTO_LIB_CURVE25519_GENERIC + bool + depends on CRYPTO_LIB_CURVE25519 + default y if !CRYPTO_LIB_CURVE25519_ARCH || ARM || X86_64 config CRYPTO_LIB_DES tristate config CRYPTO_LIB_MD5
lib/crypto/Makefile +20 -6
@@ -74,21 +74,35 @@ endif # CONFIG_CRYPTO_LIB_CHACHA_ARCH obj-$(CONFIG_CRYPTO_LIB_CHACHA20POLY1305) += libchacha20poly1305.o libchacha20poly1305-y += chacha20poly1305.o libchacha20poly1305-$(CONFIG_CRYPTO_SELFTESTS) += chacha20poly1305-selftest.o -obj-$(CONFIG_CRYPTO_LIB_CURVE25519_GENERIC) += libcurve25519-generic.o -libcurve25519-generic-y := curve25519-fiat32.o -libcurve25519-generic-$(CONFIG_ARCH_SUPPORTS_INT128) := curve25519-hacl64.o -libcurve25519-generic-y += curve25519-generic.o +################################################################################ + +obj-$(CONFIG_CRYPTO_LIB_CURVE25519) += libcurve25519.o +libcurve25519-y := curve25519.o + +# Disable GCOV in odd or sensitive code +GCOV_PROFILE_curve25519.o := n + +ifeq ($(CONFIG_ARCH_SUPPORTS_INT128),y) +libcurve25519-$(CONFIG_CRYPTO_LIB_CURVE25519_GENERIC) += curve25519-hacl64.o +else +libcurve25519-$(CONFIG_CRYPTO_LIB_CURVE25519_GENERIC) += curve25519-fiat32.o +endif # clang versions prior to 18 may blow out the stack with KASAN ifeq ($(call clang-min-version, 180000),) KASAN_SANITIZE_curve25519-hacl64.o := n endif -obj-$(CONFIG_CRYPTO_LIB_CURVE25519) += libcurve25519.o -libcurve25519-y += curve25519.o +ifeq ($(CONFIG_CRYPTO_LIB_CURVE25519_ARCH),y) +CFLAGS_curve25519.o += -I$(src)/$(SRCARCH) +libcurve25519-$(CONFIG_ARM) += arm/curve25519-core.o +libcurve25519-$(CONFIG_PPC) += powerpc/curve25519-ppc64le_asm.o +endif + +################################################################################ obj-$(CONFIG_CRYPTO_LIB_DES) += libdes.o libdes-y := des.o ################################################################################
lib/crypto/arm/curve25519-core.S renamed from arch/arm/crypto/curve25519-core.S +0 -0
lib/crypto/arm/curve25519.h renamed from arch/arm/crypto/curve25519-glue.c +8 -23
@@ -10,53 +10,38 @@#include <asm/hwcap.h> #include <asm/neon.h> #include <asm/simd.h> #include <crypto/internal/simd.h> #include <linux/types.h> -#include <linux/module.h> -#include <linux/init.h> #include <linux/jump_label.h> -#include <crypto/curve25519.h> asmlinkage void curve25519_neon(u8 mypublic[CURVE25519_KEY_SIZE],const u8 secret[CURVE25519_KEY_SIZE ],const u8 basepoint[CURVE25519_KEY_SIZE ]);static __ro_after_init DEFINE_STATIC_KEY_FALSE (have_neon); -void curve25519_arch (u8 out[CURVE25519_KEY_SIZE ], -const u8 scalar[CURVE25519_KEY_SIZE ], -const u8 point[CURVE25519_KEY_SIZE ]) +static void curve25519_arch (u8 out[CURVE25519_KEY_SIZE ], +const u8 scalar[CURVE25519_KEY_SIZE ], +const u8 point[CURVE25519_KEY_SIZE ]) {if (static_branch_likely (&have_neon) &&crypto_simd_usable ()) {kernel_neon_begin ();curve25519_neon (out, scalar, point);kernel_neon_end (); }else {curve25519_generic (out, scalar, point); } } -EXPORT_SYMBOL (curve25519_arch); -void curve25519_base_arch (u8 pub[CURVE25519_KEY_SIZE ], -const u8 secret[CURVE25519_KEY_SIZE ]) +static void curve25519_base_arch (u8 pub[CURVE25519_KEY_SIZE ], +const u8 secret[CURVE25519_KEY_SIZE ]) { -return curve25519_arch (pub, secret, curve25519_base_point); +curve25519_arch (pub, secret, curve25519_base_point); } -EXPORT_SYMBOL (curve25519_base_arch); -static int __init arm_curve25519_init (void ) +#define curve25519_mod_init_arch curve25519_mod_init_arch +static void curve25519_mod_init_arch (void ) {if (elf_hwcap &HWCAP_NEON )static_branch_enable (&have_neon); -return 0 ; } - -static void __exit arm_curve25519_exit(void) -{ -} - -module_init (arm_curve25519_init); -module_exit (arm_curve25519_exit); - -MODULE_DESCRIPTION ("Public key crypto: Curve25519 (NEON-accelerated)" ); -MODULE_LICENSE ("GPL v2" );
lib/crypto/curve25519-generic.c deleted +0 -25
@@ -1,25 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 OR MIT -/* -* Copyright (C) 2015-2019 Jason A. Donenfeld <[email protected]>. All Rights Reserved. -* -* This is an implementation of the Curve25519 ECDH algorithm, using either -* a 32-bit implementation or a 64-bit implementation with 128-bit integers, -* depending on what is supported by the target compiler. -* -* Information: https://cr.yp.to/ecdh.html -*/ - -#include <crypto/curve25519.h> -#include <linux/export.h> -#include <linux/module.h> - -const u8 curve25519_null_point[CURVE25519_KEY_SIZE ]__aligned(32) = {0 }; -const u8 curve25519_base_point[CURVE25519_KEY_SIZE ]__aligned(32) = {9 }; - -EXPORT_SYMBOL (curve25519_null_point); -EXPORT_SYMBOL (curve25519_base_point); -EXPORT_SYMBOL (curve25519_generic); - -MODULE_LICENSE ("GPL v2" ); -MODULE_DESCRIPTION ("Curve25519 scalar multiplication" ); -MODULE_AUTHOR ("Jason A. Donenfeld <[email protected]>" );
lib/crypto/curve25519.c +33 -17
92 lines not on this page · raw message
lib/crypto/powerpc/curve25519-ppc64le_asm.S renamed from arch/powerpc/crypto/curve25519-ppc64le_asm.S +0 -0
lib/crypto/powerpc/curve25519.h renamed from arch/powerpc/crypto/curve25519-ppc64le-core.c +5 -14
@@ -5,16 +5,13 @@* X25519 scalar multiplication with 51 bits limbs for PPC64le. * Based on RFC7748 and AArch64 optimized implementation for X25519 * - Algorithm 1 Scalar multiplication of a variable point */ -#include <crypto/curve25519.h> -#include <linux/types.h> #include <linux/jump_label.h> #include <linux/kernel.h> -#include <linux/module.h> #include <linux/cpufeature.h> #include <linux/processor.h> typedef uint64_t fe51 [5 ];
@@ -173,23 +170,17 @@ static void curve25519_fe51(uint8_t out[32], const uint8_t scalar[32],finv (z2, z2);fmul (x2, x2, z2);fe51_tobytes (out, x2); } -void curve25519_arch (u8 mypublic[CURVE25519_KEY_SIZE ], -const u8 secret[CURVE25519_KEY_SIZE ], -const u8 basepoint[CURVE25519_KEY_SIZE ]) +static void curve25519_arch (u8 mypublic[CURVE25519_KEY_SIZE ], +const u8 secret[CURVE25519_KEY_SIZE ], +const u8 basepoint[CURVE25519_KEY_SIZE ]) {curve25519_fe51 (mypublic, secret, basepoint); } -EXPORT_SYMBOL (curve25519_arch); -void curve25519_base_arch (u8 pub[CURVE25519_KEY_SIZE ], -const u8 secret[CURVE25519_KEY_SIZE ]) +static void curve25519_base_arch (u8 pub[CURVE25519_KEY_SIZE ], +const u8 secret[CURVE25519_KEY_SIZE ]) {curve25519_fe51 (pub, secret, curve25519_base_point); } -EXPORT_SYMBOL (curve25519_base_arch); - -MODULE_DESCRIPTION ("PPC64le Curve25519 scalar multiplication with 51 bits limbs" ); -MODULE_LICENSE ("GPL v2" ); -MODULE_AUTHOR ("Danny Tsen <[email protected]>" );
lib/crypto/x86/curve25519.h renamed from arch/x86/crypto/curve25519-x86_64.c +7 -24
@@ -2,17 +2,13 @@/* * Copyright (C) 2020 Jason A. Donenfeld <[email protected]>. All Rights Reserved. * Copyright (c) 2016-2020 INRIA, CMU and Microsoft Corporation */ -#include <crypto/curve25519.h> - -#include <linux/export.h> #include <linux/types.h> #include <linux/jump_label.h> #include <linux/kernel.h> -#include <linux/module.h> #include <asm/cpufeature.h> #include <asm/processor.h> static __always_inline u64 eq_mask(u64 a, u64 b)
@@ -1588,43 +1584,30 @@ static void curve25519_ever64_base(u8 *out, const u8 *priv)memzero_explicit (tmp,sizeof (tmp)); }static __ro_after_init DEFINE_STATIC_KEY_FALSE (curve25519_use_bmi2_adx); -void curve25519_arch (u8 mypublic[CURVE25519_KEY_SIZE ], -const u8 secret[CURVE25519_KEY_SIZE ], -const u8 basepoint[CURVE25519_KEY_SIZE ]) +static void curve25519_arch (u8 mypublic[CURVE25519_KEY_SIZE ], +const u8 secret[CURVE25519_KEY_SIZE ], +const u8 basepoint[CURVE25519_KEY_SIZE ]) {if (static_branch_likely (&curve25519_use_bmi2_adx))curve25519_ever64 (mypublic, secret, basepoint);else curve25519_generic (mypublic, secret, basepoint); } -EXPORT_SYMBOL (curve25519_arch); -void curve25519_base_arch (u8 pub[CURVE25519_KEY_SIZE ], -const u8 secret[CURVE25519_KEY_SIZE ]) +static void curve25519_base_arch (u8 pub[CURVE25519_KEY_SIZE ], +const u8 secret[CURVE25519_KEY_SIZE ]) {if (static_branch_likely (&curve25519_use_bmi2_adx))curve25519_ever64_base (pub, secret);else curve25519_generic (pub, secret, curve25519_base_point); } -EXPORT_SYMBOL (curve25519_base_arch); -static int __init curve25519_mod_init (void ) +#define curve25519_mod_init_arch curve25519_mod_init_arch +static void curve25519_mod_init_arch (void ) {if (boot_cpu_has (X86_FEATURE_BMI2 ) &&boot_cpu_has (X86_FEATURE_ADX ))static_branch_enable (&curve25519_use_bmi2_adx); -return 0 ; -} - -static void __exit curve25519_mod_exit(void) -{ } - -module_init (curve25519_mod_init); -module_exit (curve25519_mod_exit); - -MODULE_DESCRIPTION ("Curve25519 algorithm, ADX optimized" ); -MODULE_LICENSE ("GPL v2" ); -MODULE_AUTHOR ("Jason A. Donenfeld <[email protected]>" );
Signature · 1 line
2.50.1
Eric Biggers
maintainerPATCH v2 11/12 lib/crypto: tests: Enable Curve25519 test when CRYPTO_SELFTESTS
In reply to Eric BiggersNow that the Curve25519 library has been disentangled from CRYPTO, adding CRYPTO_SELFTESTS as a default value of CRYPTO_LIB_CURVE25519_KUNIT_TEST no longer causes a recursive kconfig dependency. Do this, which makes this option consistent with the other crypto KUnit test options in the same file.
--- lib/crypto/tests/Kconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
lib/crypto/tests/Kconfig +1 -1
@@ -11,11 +11,11 @@ config CRYPTO_LIB_BLAKE2S_KUNIT_TEST KUnit tests for the BLAKE2s cryptographic hash function. config CRYPTO_LIB_CURVE25519_KUNIT_TEST tristate "KUnit tests for Curve25519" if !KUNIT_ALL_TESTS depends on KUNIT - default KUNIT_ALL_TESTS + default KUNIT_ALL_TESTS || CRYPTO_SELFTESTS select CRYPTO_LIB_BENCHMARK_VISIBLE select CRYPTO_LIB_CURVE25519 help KUnit tests for the Curve25519 Diffie-Hellman function.
Signature · 1 line
2.50.1
Eric Biggers
maintainerPATCH v2 12/12 wireguard: kconfig: Simplify crypto kconfig selections
In reply to Eric BiggersSimplify the kconfig entry for WIREGUARD:
- Drop the selections of the arch-optimized ChaCha20, Poly1305, BLAKE2s, and Curve25519 code. These options no longer exist, as lib/crypto/ now enables the arch-optimized code automatically.
- Drop the selection of CRYPTO. This was needed only to make the arch-optimized options visible. lib/crypto/ now handles these options internally, without any dependency on CRYPTO.
- Drop the dependency on !KMSAN. This was needed only to avoid selecting arch-optimized code that isn't compatible with KMSAN. lib/crypto/ now handles the !KMSAN dependencies internally.
- Add a selection of CRYPTO_LIB_UTILS, since WireGuard directly calls crypto_memneq(). This gets selected indirectly by CRYPTO_LIB_CURVE25519 and CRYPTO_LIB_CHACHA20POLY1305 anyway, but it's best to make this dependency explicit.
--- drivers/net/Kconfig | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-)
drivers/net/Kconfig +1 -14
@@ -74,28 +74,15 @@ config DUMMY config WIREGUARD tristate "WireGuard secure network tunnel" depends on NET && INET depends on IPV6 || !IPV6 - depends on !KMSAN # KMSAN doesn't support the crypto configs below select NET_UDP_TUNNEL select DST_CACHE - select CRYPTO select CRYPTO_LIB_CURVE25519 select CRYPTO_LIB_CHACHA20POLY1305 - select CRYPTO_CHACHA20_X86_64 if X86 && 64BIT - select CRYPTO_POLY1305_X86_64 if X86 && 64BIT - select CRYPTO_BLAKE2S_X86 if X86 && 64BIT - select CRYPTO_CURVE25519_X86 if X86 && 64BIT - select CRYPTO_CHACHA20_NEON if ARM || (ARM64 && KERNEL_MODE_NEON) - select CRYPTO_POLY1305_NEON if ARM64 && KERNEL_MODE_NEON - select CRYPTO_POLY1305_ARM if ARM - select CRYPTO_BLAKE2S_ARM if ARM - select CRYPTO_CURVE25519_NEON if ARM && KERNEL_MODE_NEON - select CRYPTO_CHACHA_MIPS if CPU_MIPS32_R2 - select CRYPTO_POLY1305_MIPS if MIPS - select CRYPTO_CHACHA_S390 if S390 + select CRYPTO_LIB_UTILS help WireGuard is a secure, fast, and easy to use replacement for IPSec that uses modern cryptography and clever networking tricks. It's designed to be fairly general purpose and abstract enough to fit most use cases, while at the same time remaining extremely simple to
Signature · 1 line
2.50.1
Jason A. Donenfeld
maintainerRe: [PATCH v2 12/12] wireguard: kconfig: Simplify crypto kconfig selections
Hi Eric,
Just a small nit -- would you commit this with the subject line all lower case, like the other wireguard commits?
By the way, I have been reading every single one of your patches. It didn't seem like it'd be useful for me to respond endlessly with Acked-by/Reviewed-by, so I haven't. But I have quite actively been looking through these series. Thanks for doing these cleanups and reorganizations. This patch here especially is quite the relief...
Jason
Eric Biggers
maintainerRe: [PATCH v2 12/12] wireguard: kconfig: Simplify crypto kconfig selections
Quoted 4 lines · Jason A. Donenfeld
Hi Eric,
Just a small nit -- would you commit this with the subject line all lower case, like the other wireguard commits?
Done.
Quoted 5 lines
By the way, I have been reading every single one of your patches. It didn't seem like it'd be useful for me to respond endlessly with Acked-by/Reviewed-by, so I haven't. But I have quite actively been looking through these series. Thanks for doing these cleanups and reorganizations. This patch here especially is quite the relief...
Thanks! I think Acks/Reviews would still be helpful, as it shows that someone else really read the patches. Maybe you'd at least like to send those for the cleanups for the algorithms used by WireGuard?
- Eric
Jason A. Donenfeld
maintainerRe: [PATCH v2 12/12] wireguard: kconfig: Simplify crypto kconfig selections
Quoted 15 lines · Eric Biggers
Quoted 4 lines · Jason A. Donenfeld
Hi Eric,
Just a small nit -- would you commit this with the subject line all lower case, like the other wireguard commits?
Done.
Quoted 5 lines
By the way, I have been reading every single one of your patches. It didn't seem like it'd be useful for me to respond endlessly with Acked-by/Reviewed-by, so I haven't. But I have quite actively been looking through these series. Thanks for doing these cleanups and reorganizations. This patch here especially is quite the relief...
Quoted 3 lines
Thanks! I think Acks/Reviews would still be helpful, as it shows that someone else really read the patches. Maybe you'd at least like to send those for the cleanups for the algorithms used by WireGuard?
I can do it for everything I read, I suppose. I care about a lot more than just wg, anyhow.
Jason
Quoted 9 lines · Eric Biggers
This series is targeting libcrypto-next. It can also be retrieved from:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/ebiggers/linux.git curve25519-v2
This series removes the unused
crypto_kppsupport for Curve25519, migrates curve25519-selftest to a KUnit test suite, and reorganizes the generic and arch-optimized Curve25519 code to all be located inlib/crypto/and built into a single libcurve25519 module.
Quoted 11 lines
Changed from v1:
- Split kpp removal into multiple patches
- Don't selectCRYPTO_LIB_CURVE25519_GENERICfrom KUnit test
- Removed unnecessary parameter fromhpre_ecc_clear_ctx()
- Removed unnecessary 'return' from armcurve25519_base_arch()
- Updated file comment inlib/crypto/curve25519.c
- Made kconfig help text for KUnit test more consistent with other tests
- Used initializer intest_curve25519()
- Removed unnecessary newlines from messages intest_curve25519()
- UseNSEC_PER_SECinstead of literal 1000000000
- Added an Acked-by
Applied to https://git.kernel.org/pub/scm/linux/kernel/git/ebiggers/linux.git/log/?h=libcrypto-next
Reviews and acks would still be appreciated, of course.
- Eric