Consolidate Poly1305 code and add RISC-V optimization
Subsystems (3)
Eric Biggers
maintainercover Consolidate Poly1305 code and add RISC-V optimization
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 poly1305-v1
This series simplifies and optimizes the organization of the Poly1305 code by consolidating it into a single module. This follows the example of SHA-1, SHA-256, SHA-512, CRC32, etc.
Since the RISC-V Poly1305 patch has had a moving target, I also rebased it on top of this series and included it as patch 3.
Eric Biggers (2):
lib/crypto: poly1305: Remove unused function
poly1305_is_arch_optimized()
lib/crypto: poly1305: Consolidate into single module
Zhihang Shao (1):
lib/crypto: riscv/poly1305: Import OpenSSL/CRYPTOGAMS implementation
crypto/Kconfig | 2 +
include/crypto/internal/poly1305.h | 16 +-
include/crypto/poly1305.h | 9 -
lib/crypto/Kconfig | 53 +-
lib/crypto/Makefile | 69 +-
lib/crypto/arm/Kconfig | 5 -
lib/crypto/arm/Makefile | 18 -
lib/crypto/arm/poly1305-armv4.pl | 3 +-
lib/crypto/arm/poly1305-glue.c | 76 --
lib/crypto/arm/poly1305.h | 53 ++
lib/crypto/arm64/Kconfig | 6 -
lib/crypto/arm64/Makefile | 13 -
lib/crypto/arm64/poly1305-armv8.pl | 3 +
lib/crypto/arm64/poly1305-glue.c | 74 --
lib/crypto/arm64/poly1305.h | 50 ++
lib/crypto/mips/Kconfig | 5 -
lib/crypto/mips/Makefile | 14 -
lib/crypto/mips/poly1305-glue.c | 33 -
lib/crypto/mips/poly1305-mips.pl | 8 +-
lib/crypto/mips/poly1305.h | 14 +
lib/crypto/poly1305-generic.c | 25 -
lib/crypto/poly1305.c | 81 +-
lib/crypto/powerpc/Kconfig | 8 -
lib/crypto/powerpc/Makefile | 3 -
.../{poly1305-p10-glue.c => poly1305.h} | 40 +-
lib/crypto/riscv/poly1305-riscv.pl | 847 ++++++++++++++++++
lib/crypto/riscv/poly1305.h | 14 +
lib/crypto/x86/Kconfig | 6 -
lib/crypto/x86/Makefile | 10 -
lib/crypto/x86/poly1305-x86_64-cryptogams.pl | 33 +-
.../x86/{poly1305_glue.c => poly1305.h} | 47 +-
31 files changed, 1172 insertions(+), 466 deletions(-)
delete mode 100644 lib/crypto/arm/poly1305-glue.c
create mode 100644 lib/crypto/arm/poly1305.h
delete mode 100644 lib/crypto/arm64/poly1305-glue.c
create mode 100644 lib/crypto/arm64/poly1305.h
delete mode 100644 lib/crypto/mips/poly1305-glue.c
create mode 100644 lib/crypto/mips/poly1305.h
delete mode 100644 lib/crypto/poly1305-generic.c
rename lib/crypto/powerpc/{poly1305-p10-glue.c => poly1305.h} (63%)
create mode 100644 lib/crypto/riscv/poly1305-riscv.pl
create mode 100644 lib/crypto/riscv/poly1305.h
rename lib/crypto/x86/{poly1305_glue.c => poly1305.h} (83%)base-commit: 56784a42208677e6fb24ba0bd93a2ea0bd9f41ff
Signature · 1 line
2.50.1
Eric Biggers
maintainerPATCH 1/3 lib/crypto: poly1305: Remove unused function poly1305_is_arch_optimized()
poly1305_is_arch_optimized() is unused, so remove it.
--- include/crypto/poly1305.h | 9 --------- lib/crypto/arm/poly1305-glue.c | 7 ------- lib/crypto/arm64/poly1305-glue.c | 7 ------- lib/crypto/mips/poly1305-glue.c | 6 ------ lib/crypto/powerpc/poly1305-p10-glue.c | 6 ------ lib/crypto/x86/poly1305_glue.c | 6 ------ 6 files changed, 41 deletions(-)
include/crypto/poly1305.h +0 -9
@@ -62,15 +62,6 @@ void poly1305_init(struct poly1305_desc_ctx *desc, const u8 key[POLY1305_KEY_SIZE]);void poly1305_update (struct poly1305_desc_ctx *desc,const u8 *src,unsigned int nbytes);void poly1305_final (struct poly1305_desc_ctx *desc,u8 *digest); -#if IS_ENABLED (CONFIG_CRYPTO_ARCH_HAVE_LIB_POLY1305 ) -bool poly1305_is_arch_optimized (void ); -#else -static inline bool poly1305_is_arch_optimized (void ) -{ -return false; -} -#endif -#endif
lib/crypto/arm/poly1305-glue.c +0 -7
@@ -49,17 +49,10 @@ void poly1305_blocks_arch(struct poly1305_block_state *state, const u8 *src, }else poly1305_blocks_arm (state, src, len, padbit); }EXPORT_SYMBOL_GPL (poly1305_blocks_arch); -bool poly1305_is_arch_optimized (void ) -{ -/* We always can use at least the ARM scalar implementation. */ -return true; -} -EXPORT_SYMBOL (poly1305_is_arch_optimized); -static int __init arm_poly1305_mod_init (void ) {if (IS_ENABLED (CONFIG_KERNEL_MODE_NEON ) && (elf_hwcap &HWCAP_NEON ))static_branch_enable (&have_neon);
lib/crypto/arm64/poly1305-glue.c +0 -7
@@ -48,17 +48,10 @@ void poly1305_blocks_arch(struct poly1305_block_state *state, const u8 *src, }else poly1305_blocks (state, src, len, padbit); }EXPORT_SYMBOL_GPL (poly1305_blocks_arch); -bool poly1305_is_arch_optimized (void ) -{ -/* We always can use at least the ARM64 scalar implementation. */ -return true; -} -EXPORT_SYMBOL (poly1305_is_arch_optimized); -static int __init neon_poly1305_mod_init (void ) {if (cpu_have_named_feature (ASIMD ))static_branch_enable (&have_neon);return 0 ;
lib/crypto/mips/poly1305-glue.c +0 -6
@@ -21,13 +21,7 @@ EXPORT_SYMBOL_GPL(poly1305_blocks_arch); asmlinkage void poly1305_emit_arch(const struct poly1305_state *state,u8 digest[POLY1305_DIGEST_SIZE ],const u32 nonce[4 ]);EXPORT_SYMBOL_GPL (poly1305_emit_arch); -bool poly1305_is_arch_optimized (void ) -{ -return true; -} -EXPORT_SYMBOL (poly1305_is_arch_optimized); -MODULE_DESCRIPTION ("Poly1305 transform (MIPS accelerated" );MODULE_LICENSE ("GPL v2" );
lib/crypto/powerpc/poly1305-p10-glue.c +0 -6
@@ -70,16 +70,10 @@ void poly1305_emit_arch(const struct poly1305_state *state,return poly1305_emit_generic (state, digest, nonce);poly1305_emit_64 (state, nonce, digest); }EXPORT_SYMBOL_GPL (poly1305_emit_arch); -bool poly1305_is_arch_optimized (void ) -{ -return static_key_enabled (&have_p10); -} -EXPORT_SYMBOL (poly1305_is_arch_optimized); -static int __init poly1305_p10_init (void ) {if (cpu_has_feature (CPU_FTR_ARCH_31 ))static_branch_enable (&have_p10);return 0 ;
lib/crypto/x86/poly1305_glue.c +0 -6
@@ -139,16 +139,10 @@ void poly1305_emit_arch(const struct poly1305_state *ctx,else poly1305_emit_avx (ctx, mac, nonce); }EXPORT_SYMBOL_GPL (poly1305_emit_arch); -bool poly1305_is_arch_optimized (void ) -{ -return static_key_enabled (&poly1305_use_avx); -} -EXPORT_SYMBOL (poly1305_is_arch_optimized); -static int __init poly1305_simd_mod_init (void ) {if (boot_cpu_has (X86_FEATURE_AVX ) &&cpu_has_xfeatures (XFEATURE_MASK_SSE |XFEATURE_MASK_YMM ,NULL ))static_branch_enable (&poly1305_use_avx);
Signature · 1 line
2.50.1
Eric Biggers
maintainerPATCH 2/3 lib/crypto: poly1305: Consolidate into single module
In reply to Eric BiggersConsolidate the Poly1305 code into a single module, similar to various other algorithms (SHA-1, SHA-256, SHA-512, etc.):
- Each arch now provides a header file lib/crypto/$(SRCARCH)/poly1305.h, replacing lib/crypto/$(SRCARCH)/poly1305*.c. The header defines poly1305_block_init(), poly1305_blocks(), poly1305_emit(), and optionally poly1305_mod_init_arch(). It is included by lib/crypto/poly1305.c, and thus the code gets built into the single libpoly1305 module, with improved inlining in some cases.
- Whether arch-optimized Poly1305 is buildable is now controlled centrally by lib/crypto/Kconfig instead of by lib/crypto/$(SRCARCH)/Kconfig. The conditions for enabling it remain the same as before, and it remains enabled by default. (The PPC64 one remains unconditionally disabled due to 'depends on BROKEN'.)
- Any additional arch-specific translation units for the optimized Poly1305 code, such as assembly files, are now compiled by lib/crypto/Makefile instead of lib/crypto/$(SRCARCH)/Makefile.
A special consideration is needed because the Adiantum code uses the poly1305_core_*() functions directly. For now, just carry forward that approach. This means retaining the CRYPTO_LIB_POLY1305_GENERIC kconfig symbol, and keeping the poly1305_core_*() functions in separate translation units. So it's not quite as streamlined I've done with the other hash functions, but we still get a single libpoly1305 module.
Note: to see the diff from the arm, arm64, and x86 .c files to the new .h files, view this commit with 'git show -M10'.
---
crypto/Kconfig | 2 +
include/crypto/internal/poly1305.h | 16 ++--
lib/crypto/Kconfig | 50 ++++++------
lib/crypto/Makefile | 57 +++++++++++--
lib/crypto/arm/Kconfig | 5 --
lib/crypto/arm/Makefile | 18 -----
lib/crypto/arm/poly1305-armv4.pl | 3 +-
lib/crypto/arm/poly1305-glue.c | 69 ----------------
lib/crypto/arm/poly1305.h | 53 ++++++++++++
lib/crypto/arm64/Kconfig | 6 --
lib/crypto/arm64/Makefile | 13 ---
lib/crypto/arm64/poly1305-armv8.pl | 3 +
lib/crypto/arm64/poly1305-glue.c | 67 ---------------
lib/crypto/arm64/poly1305.h | 50 ++++++++++++
lib/crypto/mips/Kconfig | 5 --
lib/crypto/mips/Makefile | 14 ----
lib/crypto/mips/poly1305-glue.c | 27 -------
lib/crypto/mips/poly1305-mips.pl | 8 +-
lib/crypto/mips/poly1305.h | 14 ++++
lib/crypto/poly1305-generic.c | 25 ------
lib/crypto/poly1305.c | 81 ++++++++++++-------
lib/crypto/powerpc/Kconfig | 8 --
lib/crypto/powerpc/Makefile | 3 -
.../{poly1305-p10-glue.c => poly1305.h} | 34 +++-----
lib/crypto/x86/Kconfig | 6 --
lib/crypto/x86/Makefile | 10 ---
lib/crypto/x86/poly1305-x86_64-cryptogams.pl | 33 +++-----
.../x86/{poly1305_glue.c => poly1305.h} | 41 ++++------
28 files changed, 297 insertions(+), 424 deletions(-)
delete mode 100644 lib/crypto/arm/poly1305-glue.c
create mode 100644 lib/crypto/arm/poly1305.h
delete mode 100644 lib/crypto/arm64/poly1305-glue.c
create mode 100644 lib/crypto/arm64/poly1305.h
delete mode 100644 lib/crypto/mips/poly1305-glue.c
create mode 100644 lib/crypto/mips/poly1305.h
delete mode 100644 lib/crypto/poly1305-generic.c
rename lib/crypto/powerpc/{poly1305-p10-glue.c => poly1305.h} (66%)
rename lib/crypto/x86/{poly1305_glue.c => poly1305.h} (85%)crypto/Kconfig +2 -0
@@ -607,10 +607,11 @@ endmenu menu "Length-preserving ciphers and modes" config CRYPTO_ADIANTUM tristate "Adiantum" select CRYPTO_CHACHA20 + select CRYPTO_LIB_POLY1305 select CRYPTO_LIB_POLY1305_GENERIC select CRYPTO_NHPOLY1305 select CRYPTO_MANAGER help Adiantum tweakable, length-preserving encryption mode
@@ -768,10 +769,11 @@ config CRYPTO_XTS multiple of 16 bytes. config CRYPTO_NHPOLY1305 tristate select CRYPTO_HASH + select CRYPTO_LIB_POLY1305 select CRYPTO_LIB_POLY1305_GENERIC endmenu menu "AEAD (authenticated encryption with associated data) ciphers"
include/crypto/internal/poly1305.h +7 -9
@@ -28,28 +28,26 @@ void poly1305_core_blocks(struct poly1305_state *state, const struct poly1305_core_key *key, const void *src, unsigned int nblocks, u32 hibit);void poly1305_core_emit (const struct poly1305_state *state,const u32 nonce[4 ],void *dst); -void poly1305_block_init_arch (struct poly1305_block_state *state, -const u8 raw_key[POLY1305_BLOCK_SIZE ]); -void poly1305_block_init_generic (struct poly1305_block_state *state, -const u8 raw_key[POLY1305_BLOCK_SIZE ]); -void poly1305_blocks_arch (struct poly1305_block_state *state,const u8 *src, -unsigned int len,u32 padbit); +static inline void +poly1305_block_init_generic (struct poly1305_block_state *desc, +const u8 raw_key[POLY1305_BLOCK_SIZE ]) +{ +poly1305_core_init (&desc->h); +poly1305_core_setkey (&desc->core_r, raw_key); +}static inline void poly1305_blocks_generic (struct poly1305_block_state *state,const u8 *src,unsigned int len,u32 padbit) {poly1305_core_blocks (&state->h, &state->core_r, src, len /POLY1305_BLOCK_SIZE , padbit); } -void poly1305_emit_arch (const struct poly1305_state *state, -u8 digest[POLY1305_DIGEST_SIZE ],const u32 nonce[4 ]); -static inline void poly1305_emit_generic (const struct poly1305_state *state,u8 digest[POLY1305_DIGEST_SIZE ],const u32 nonce[4 ]) {poly1305_core_emit (state, nonce, digest);
lib/crypto/Kconfig +27 -23
67 lines not on this page · raw message
lib/crypto/Makefile +51 -6
68 lines not on this page · raw message
lib/crypto/arm/Kconfig +0 -5
@@ -15,10 +15,5 @@ config CRYPTO_BLAKE2S_ARM config CRYPTO_CHACHA20_NEON tristate default CRYPTO_LIB_CHACHA select CRYPTO_ARCH_HAVE_LIB_CHACHA - -config CRYPTO_POLY1305_ARM - tristate - default CRYPTO_LIB_POLY1305 - select CRYPTO_ARCH_HAVE_LIB_POLY1305
lib/crypto/arm/Makefile +0 -18
@@ -4,23 +4,5 @@ obj-$(CONFIG_CRYPTO_BLAKE2S_ARM) += libblake2s-arm.o libblake2s-arm-y := blake2s-core.o blake2s-glue.o obj-$(CONFIG_CRYPTO_CHACHA20_NEON) += chacha-neon.o chacha-neon-y := chacha-scalar-core.o chacha-glue.o chacha-neon-$(CONFIG_KERNEL_MODE_NEON) += chacha-neon-core.o - -obj-$(CONFIG_CRYPTO_POLY1305_ARM) += poly1305-arm.o -poly1305-arm-y := poly1305-core.o poly1305-glue.o - -quiet_cmd_perl = PERL $@ - cmd_perl = $(PERL) $(<) > $(@) - -$(obj)/%-core.S: $(src)/%-armv4.pl - $(call cmd,perl) - -clean-files += poly1305-core.S - -aflags-thumb2-$(CONFIG_THUMB2_KERNEL) := -U__thumb2__ -D__thumb2__=1 - -# massage the perlasm code a bit so we only get the NEON routine if we need it -poly1305-aflags-$(CONFIG_CPU_V7) := -U__LINUX_ARM_ARCH__ -D__LINUX_ARM_ARCH__=5 -poly1305-aflags-$(CONFIG_KERNEL_MODE_NEON) := -U__LINUX_ARM_ARCH__ -D__LINUX_ARM_ARCH__=7 -AFLAGS_poly1305-core.o += $(poly1305-aflags-y) $(aflags-thumb2-y)
lib/crypto/arm/poly1305-armv4.pl +1 -2
@@ -41,13 +41,12 @@ $code.=<<___; #ifndef __KERNEL__ # include "arm_arch.h" #else # define __ARM_ARCH__ __LINUX_ARM_ARCH__ # define __ARM_MAX_ARCH__ __LINUX_ARM_ARCH__ -# define poly1305_init poly1305_block_init_arch +# define poly1305_init poly1305_block_init # define poly1305_blocks poly1305_blocks_arm -# define poly1305_emit poly1305_emit_arch #endif #if defined(__thumb2__) .syntax unified .thumb
lib/crypto/arm/poly1305-glue.c deleted +0 -69
69 lines not on this page · raw message
lib/crypto/arm/poly1305.h new file +53 -0
53 lines not on this page · raw message
lib/crypto/arm64/Kconfig +0 -6
@@ -4,11 +4,5 @@ config CRYPTO_CHACHA20_NEON tristate depends on KERNEL_MODE_NEON default CRYPTO_LIB_CHACHA select CRYPTO_LIB_CHACHA_GENERIC select CRYPTO_ARCH_HAVE_LIB_CHACHA - -config CRYPTO_POLY1305_NEON - tristate - depends on KERNEL_MODE_NEON - default CRYPTO_LIB_POLY1305 - select CRYPTO_ARCH_HAVE_LIB_POLY1305
lib/crypto/arm64/Makefile +0 -13
@@ -1,17 +1,4 @@ # SPDX-License-Identifier: GPL-2.0-only obj-$(CONFIG_CRYPTO_CHACHA20_NEON) += chacha-neon.o chacha-neon-y := chacha-neon-core.o chacha-neon-glue.o - -obj-$(CONFIG_CRYPTO_POLY1305_NEON) += poly1305-neon.o -poly1305-neon-y := poly1305-core.o poly1305-glue.o -AFLAGS_poly1305-core.o += -Dpoly1305_init=poly1305_block_init_arch -AFLAGS_poly1305-core.o += -Dpoly1305_emit=poly1305_emit_arch - -quiet_cmd_perlasm = PERLASM $@ - cmd_perlasm = $(PERL) $(<) void $(@) - -$(obj)/%-core.S: $(src)/%-armv8.pl - $(call cmd,perlasm) - -clean-files += poly1305-core.S
lib/crypto/arm64/poly1305-armv8.pl +3 -0
@@ -48,10 +48,13 @@ my ($h0,$h1,$h2,$r0,$r1,$s1,$t0,$t1,$d0,$d1,$d2) = map("x$_",(4..14)); $code.=<<___; #ifndef __KERNEL__ # include "arm_arch.h" .extern OPENSSL_armcap_P +#else +# define poly1305_init poly1305_block_init +# define poly1305_blocks poly1305_blocks_arm64 #endif .text // forward "declarations" are required for Apple
lib/crypto/arm64/poly1305-glue.c deleted +0 -67
67 lines not on this page · raw message
lib/crypto/arm64/poly1305.h new file +50 -0
50 lines not on this page · raw message
lib/crypto/mips/Kconfig +0 -5
@@ -3,10 +3,5 @@ config CRYPTO_CHACHA_MIPS tristate depends on CPU_MIPS32_R2 default CRYPTO_LIB_CHACHA select CRYPTO_ARCH_HAVE_LIB_CHACHA - -config CRYPTO_POLY1305_MIPS - tristate - default CRYPTO_LIB_POLY1305 - select CRYPTO_ARCH_HAVE_LIB_POLY1305
lib/crypto/mips/Makefile +0 -14
@@ -1,19 +1,5 @@ # SPDX-License-Identifier: GPL-2.0-only obj-$(CONFIG_CRYPTO_CHACHA_MIPS) += chacha-mips.o chacha-mips-y := chacha-core.o chacha-glue.o AFLAGS_chacha-core.o += -O2 # needed to fill branch delay slots - -obj-$(CONFIG_CRYPTO_POLY1305_MIPS) += poly1305-mips.o -poly1305-mips-y := poly1305-core.o poly1305-glue.o - -perlasm-flavour-$(CONFIG_32BIT) := o32 -perlasm-flavour-$(CONFIG_64BIT) := 64 - -quiet_cmd_perlasm = PERLASM $@ - cmd_perlasm = $(PERL) $(<) $(perlasm-flavour-y) $(@) - -$(obj)/poly1305-core.S: $(src)/poly1305-mips.pl FORCE - $(call if_changed,perlasm) - -targets += poly1305-core.S
lib/crypto/mips/poly1305-glue.c deleted +0 -27
@@ -1,27 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -/* -* OpenSSL/Cryptogams accelerated Poly1305 transform for MIPS -* -* Copyright (C) 2019 Linaro Ltd. <[email protected]> -*/ - -#include <crypto/internal/poly1305.h> -#include <linux/cpufeature.h> -#include <linux/kernel.h> -#include <linux/module.h> -#include <linux/unaligned.h> - -asmlinkage void poly1305_block_init_arch( -struct poly1305_block_state *state, -const u8 raw_key[POLY1305_BLOCK_SIZE ]); -EXPORT_SYMBOL_GPL (poly1305_block_init_arch); -asmlinkage void poly1305_blocks_arch(struct poly1305_block_state *state, -const u8 *src,u32 len,u32 hibit); -EXPORT_SYMBOL_GPL (poly1305_blocks_arch); -asmlinkage void poly1305_emit_arch(const struct poly1305_state *state, -u8 digest[POLY1305_DIGEST_SIZE ], -const u32 nonce[4 ]); -EXPORT_SYMBOL_GPL (poly1305_emit_arch); - -MODULE_DESCRIPTION ("Poly1305 transform (MIPS accelerated" ); -MODULE_LICENSE ("GPL v2" );
lib/crypto/mips/poly1305-mips.pl +2 -6
@@ -91,13 +91,11 @@ $code.=<<___; # define mflo(rd,rs,rt) mflo rd # define mfhi(rd,rs,rt) mfhi rd #endif #ifdef __KERNEL__ -# define poly1305_init poly1305_block_init_arch -# define poly1305_blocks poly1305_blocks_arch -# define poly1305_emit poly1305_emit_arch +# define poly1305_init poly1305_block_init #endif #if defined(__MIPSEB__) && !defined(MIPSEB) # define MIPSEB #endif
@@ -563,13 +561,11 @@ $code.=<<___; # define mflo(rd,rs,rt) mflo rd # define mfhi(rd,rs,rt) mfhi rd #endif #ifdef __KERNEL__ -# define poly1305_init poly1305_block_init_arch -# define poly1305_blocks poly1305_blocks_arch -# define poly1305_emit poly1305_emit_arch +# define poly1305_init poly1305_block_init #endif #if defined(__MIPSEB__) && !defined(MIPSEB) # define MIPSEB #endif
lib/crypto/mips/poly1305.h new file +14 -0
@@ -0,0 +1,14 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* +* OpenSSL/Cryptogams accelerated Poly1305 transform for MIPS +* +* Copyright (C) 2019 Linaro Ltd. <[email protected]> +*/ + +asmlinkage void poly1305_block_init(struct poly1305_block_state *state, +const u8 raw_key[POLY1305_BLOCK_SIZE ]); +asmlinkage void poly1305_blocks(struct poly1305_block_state *state, +const u8 *src,u32 len,u32 hibit); +asmlinkage void poly1305_emit(const struct poly1305_state *state, +u8 digest[POLY1305_DIGEST_SIZE ], +const u32 nonce[4 ]);
lib/crypto/poly1305-generic.c deleted +0 -25
@@ -1,25 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-or-later -/* -* Poly1305 authenticator algorithm, RFC7539 -* -* Copyright (C) 2015 Martin Willi -* -* Based on public domain code by Andrew Moon and Daniel J. Bernstein. -*/ - -#include <crypto/internal/poly1305.h> -#include <linux/export.h> -#include <linux/kernel.h> -#include <linux/module.h> - -void poly1305_block_init_generic (struct poly1305_block_state *desc, -const u8 raw_key[POLY1305_BLOCK_SIZE ]) -{ -poly1305_core_init (&desc->h); -poly1305_core_setkey (&desc->core_r, raw_key); -} -EXPORT_SYMBOL_GPL (poly1305_block_init_generic); - -MODULE_LICENSE ("GPL" ); -MODULE_AUTHOR ("Martin Willi <[email protected]>" ); -MODULE_DESCRIPTION ("Poly1305 algorithm (generic implementation)" );
lib/crypto/poly1305.c +53 -28
124 lines not on this page · raw message
lib/crypto/powerpc/Kconfig +0 -8
@@ -4,13 +4,5 @@ config CRYPTO_CHACHA20_P10 tristate depends on PPC64 && CPU_LITTLE_ENDIAN && VSX default CRYPTO_LIB_CHACHA select CRYPTO_LIB_CHACHA_GENERIC select CRYPTO_ARCH_HAVE_LIB_CHACHA - -config CRYPTO_POLY1305_P10 - tristate - depends on PPC64 && CPU_LITTLE_ENDIAN && VSX - depends on BROKEN # Needs to be fixed to work in softirq context - default CRYPTO_LIB_POLY1305 - select CRYPTO_ARCH_HAVE_LIB_POLY1305 - select CRYPTO_LIB_POLY1305_GENERIC
lib/crypto/powerpc/Makefile +0 -3
@@ -1,7 +1,4 @@ # SPDX-License-Identifier: GPL-2.0-only obj-$(CONFIG_CRYPTO_CHACHA20_P10) += chacha-p10-crypto.o chacha-p10-crypto-y := chacha-p10-glue.o chacha-p10le-8x.o - -obj-$(CONFIG_CRYPTO_POLY1305_P10) += poly1305-p10-crypto.o -poly1305-p10-crypto-y := poly1305-p10-glue.o poly1305-p10le_64.o
lib/crypto/powerpc/poly1305.h renamed from lib/crypto/powerpc/poly1305-p10-glue.c +9 -25
@@ -1,17 +1,15 @@ -// SPDX-License-Identifier: GPL-2.0 +/* SPDX-License-Identifier: GPL-2.0 */ /* * Poly1305 authenticator algorithm, RFC7539. * * Copyright 2023- IBM Corp. All rights reserved. */ #include <asm/switch_to.h> -#include <crypto/internal/poly1305.h> #include <linux/cpufeature.h> #include <linux/jump_label.h> #include <linux/kernel.h> -#include <linux/module.h> #include <linux/unaligned.h> asmlinkage void poly1305_p10le_4blocks(struct poly1305_block_state *state, const u8 *m, u32 mlen); asmlinkage void poly1305_64s(struct poly1305_block_state *state, const u8 *m, u32 mlen, int highbit); asmlinkage void poly1305_emit_64(const struct poly1305_state *state, const u32 nonce[4], u8 digest[POLY1305_DIGEST_SIZE]);
@@ -28,24 +26,23 @@ static void vsx_end(void) {disable_kernel_vsx ();preempt_enable (); } -void poly1305_block_init_arch (struct poly1305_block_state *dctx, -const u8 raw_key[POLY1305_BLOCK_SIZE ]) +static void poly1305_block_init (struct poly1305_block_state *dctx, +const u8 raw_key[POLY1305_BLOCK_SIZE ]) {if (!static_key_enabled (&have_p10))return poly1305_block_init_generic (dctx, raw_key); dctx->h = (struct poly1305_state ){}; dctx->core_r.key.r64[0 ] =get_unaligned_le64 (raw_key +0 ); dctx->core_r.key.r64[1 ] =get_unaligned_le64 (raw_key +8 ); } -EXPORT_SYMBOL_GPL (poly1305_block_init_arch); -void poly1305_blocks_arch (struct poly1305_block_state *state,const u8 *src, -unsigned int len,u32 padbit) +static void poly1305_blocks (struct poly1305_block_state *state,const u8 *src, +unsigned int len,u32 padbit) {if (!static_key_enabled (&have_p10))return poly1305_blocks_generic (state, src, len, padbit);vsx_begin ();if (len >=POLY1305_BLOCK_SIZE *4 ) {
@@ -58,33 +55,20 @@ void poly1305_blocks_arch(struct poly1305_block_state *state, const u8 *src, len -=POLY1305_BLOCK_SIZE ; src +=POLY1305_BLOCK_SIZE ; }vsx_end (); } -EXPORT_SYMBOL_GPL (poly1305_blocks_arch); -void poly1305_emit_arch (const struct poly1305_state *state, -u8 digest[POLY1305_DIGEST_SIZE ], -const u32 nonce[4 ]) +static void poly1305_emit (const struct poly1305_state *state, +u8 digest[POLY1305_DIGEST_SIZE ],const u32 nonce[4 ]) {if (!static_key_enabled (&have_p10))return poly1305_emit_generic (state, digest, nonce);poly1305_emit_64 (state, nonce, digest); } -EXPORT_SYMBOL_GPL (poly1305_emit_arch); -static int __init poly1305_p10_init (void ) +#define poly1305_mod_init_arch poly1305_mod_init_arch +static void poly1305_mod_init_arch (void ) {if (cpu_has_feature (CPU_FTR_ARCH_31 ))static_branch_enable (&have_p10); -return 0 ; } -subsys_initcall (poly1305_p10_init); - -static void __exit poly1305_p10_exit(void) -{ -} -module_exit (poly1305_p10_exit); - -MODULE_LICENSE ("GPL" ); -MODULE_AUTHOR ("Danny Tsen <[email protected]>" ); -MODULE_DESCRIPTION ("Optimized Poly1305 for P10" );
lib/crypto/x86/Kconfig +0 -6
@@ -16,11 +16,5 @@ config CRYPTO_CHACHA20_X86_64 tristate depends on 64BIT default CRYPTO_LIB_CHACHA select CRYPTO_LIB_CHACHA_GENERIC select CRYPTO_ARCH_HAVE_LIB_CHACHA - -config CRYPTO_POLY1305_X86_64 - tristate - depends on 64BIT - default CRYPTO_LIB_POLY1305 - select CRYPTO_ARCH_HAVE_LIB_POLY1305
lib/crypto/x86/Makefile +0 -10
@@ -3,15 +3,5 @@ obj-$(CONFIG_CRYPTO_BLAKE2S_X86) += libblake2s-x86_64.o libblake2s-x86_64-y := blake2s-core.o blake2s-glue.o obj-$(CONFIG_CRYPTO_CHACHA20_X86_64) += chacha-x86_64.o chacha-x86_64-y := chacha-avx2-x86_64.o chacha-ssse3-x86_64.o chacha-avx512vl-x86_64.o chacha_glue.o - -obj-$(CONFIG_CRYPTO_POLY1305_X86_64) += poly1305-x86_64.o -poly1305-x86_64-y := poly1305-x86_64-cryptogams.o poly1305_glue.o -targets += poly1305-x86_64-cryptogams.S - -quiet_cmd_perlasm = PERLASM $@ - cmd_perlasm = $(PERL) $< > $@ - -$(obj)/%.S: $(src)/%.pl FORCE - $(call if_changed,perlasm)
lib/crypto/x86/poly1305-x86_64-cryptogams.pl +10 -23
@@ -116,34 +116,21 @@ sub declare_function() { $code .= ".align $align\n"; $code .= "$name:\n"; } } -sub declare_typed_function() { - my ($name, $align, $nargs) = @_; - if($kernel) { - $code .= "SYM_TYPED_FUNC_START($name)\n"; - $code .= ".L$name:\n"; - } else { - $code .= ".globl $name\n"; - $code .= ".type $name,\@function,$nargs\n"; - $code .= ".align $align\n"; - $code .= "$name:\n"; - } -} - sub end_function() { my ($name) = @_; if($kernel) { $code .= "SYM_FUNC_END($name)\n"; } else { $code .= ".size $name,.-$name\n"; } } $code.=<<___ if $kernel; -#include <linux/cfi_types.h> +#include <linux/linkage.h> ___ if ($avx) { $code.=<<___ if $kernel; .section .rodata
@@ -247,18 +234,18 @@ $code.=<<___; .text ___ $code.=<<___ if (!$kernel); .extern OPENSSL_ia32cap_P -.globl poly1305_block_init_arch -.hidden poly1305_block_init_arch +.globl poly1305_init_x86_64 +.hidden poly1305_init_x86_64 .globl poly1305_blocks_x86_64 .hidden poly1305_blocks_x86_64 .globl poly1305_emit_x86_64 .hidden poly1305_emit_x86_64 ___ -&declare_typed_function("poly1305_block_init_arch", 32, 3); +&declare_function("poly1305_init_x86_64", 32, 3); $code.=<<___; xor %eax,%eax mov %rax,0($ctx) # initialize hash value mov %rax,8($ctx) mov %rax,16($ctx)
@@ -309,11 +296,11 @@ ___ $code.=<<___; mov \$1,%eax .Lno_key: RET ___ -&end_function("poly1305_block_init_arch"); +&end_function("poly1305_init_x86_64"); &declare_function("poly1305_blocks_x86_64", 32, 4); $code.=<<___; .cfi_startproc .Lblocks:
@@ -4116,13 +4103,13 @@ avx_handler: RET .size avx_handler,.-avx_handler .section .pdata .align 4 - .rva .LSEH_begin_poly1305_block_init_arch - .rva .LSEH_end_poly1305_block_init_arch - .rva .LSEH_info_poly1305_block_init_arch + .rva .LSEH_begin_poly1305_init_x86_64 + .rva .LSEH_end_poly1305_init_x86_64 + .rva .LSEH_info_poly1305_init_x86_64 .rva .LSEH_begin_poly1305_blocks_x86_64 .rva .LSEH_end_poly1305_blocks_x86_64 .rva .LSEH_info_poly1305_blocks_x86_64
@@ -4166,14 +4153,14 @@ $code.=<<___ if ($avx>2); .rva .LSEH_info_poly1305_blocks_avx512 ___ $code.=<<___; .section .xdata .align 8 -.LSEH_info_poly1305_block_init_arch: +.LSEH_info_poly1305_init_x86_64: .byte 9,0,0,0 .rva se_handler - .rva .LSEH_begin_poly1305_block_init_arch,.LSEH_begin_poly1305_block_init_arch + .rva .LSEH_begin_poly1305_init_x86_64,.LSEH_begin_poly1305_init_x86_64 .LSEH_info_poly1305_blocks_x86_64: .byte 9,0,0,0 .rva se_handler .rva .Lblocks_body,.Lblocks_epilogue
lib/crypto/x86/poly1305.h renamed from lib/crypto/x86/poly1305_glue.c +15 -26
99 lines not on this page · raw message
Signature · 1 line
2.50.1
Eric Biggers
maintainerRe: [PATCH 2/3] lib/crypto: poly1305: Consolidate into single module
Quoted 8 lines · Eric Biggers
lib/crypto/mips/Makefile +0
-8-perlasm-flavour-$(CONFIG_32BIT) := o32 -perlasm-flavour-$(CONFIG_64BIT) := 64 - -quiet_cmd_perlasm = PERLASM $@ - cmd_perlasm = $(PERL) $(<) $(perlasm-flavour-y) $(@) - -$(obj)/poly1305-core.S: $(src)/poly1305-mips.pl FORCE - $(call if_changed,perlasm)
[...]
lib/crypto/Makefile libmd5-$(CONFIG_PPC) += powerpc/md5-asm.o · line 109
Quoted 9 lines
lib/crypto/Makefile +9
-0+ifeq ($(CONFIG_MIPS),y) +libpoly1305-y += mips/poly1305-core.o +poly1305-perlasm-flavour-$(CONFIG_32BIT) := o32 +poly1305-perlasm-flavour-$(CONFIG_64BIT) := 64 +quiet_cmd_perlasm_poly1305 = PERLASM $@ + cmd_perlasm_poly1305 = $(PERL) $< $(poly1305-perlasm-flavour-y) $@ +$(obj)/mips/poly1305-core.S: $(src)/mips/poly1305-mips.pl + $(call if_changed,perlasm_poly1305) +endif
Small issue that I noticed: I removed the "FORCE" from the rule for poly1305-core.S since none of the other perlasm rules had it. But it's actually needed because, unlike the other perlasm rules, this one uses 'if_changed' instead of 'cmd'. 'if_changed' requires FORCE. And I believe it does need to use 'if_changed', since the contents of the generated .S file depends on the perlasm-flavour passed as an argument to the perl script. That can change when the kernel config changes.
So, TLDR: I'll restore the FORCE to the rule, and add a comment.
The RISC-V optimized Poly1305 code added by the third patch will need if_changed and FORCE for the same reason.
Of course, it's unfortunate that these are written in Perl at all. But that is the convention used by Andy / CRYPTOGAMS, so that is what we'll use unless someone wants to rewrite it...
- Eric
Eric Biggers
maintainerPATCH 3/3 lib/crypto: riscv/poly1305: Import OpenSSL/CRYPTOGAMS implementation
In reply to Eric BiggersFrom: Zhihang Shao <[email protected]>
This is a straight import of the OpenSSL/CRYPTOGAMS Poly1305 implementation for riscv authored by Andy Polyakov. The file 'poly1305-riscv.pl' is taken straight from
https://github.com/dot-asm/cryptogams commit 5e3fba73576244708a752fa61a8e93e587f271bb. This patch was tested on SpacemiT X60, with 2~2.5x improvement over generic implementation.
--- lib/crypto/Kconfig | 3 +- lib/crypto/Makefile | 12 + lib/crypto/riscv/poly1305-riscv.pl | 847 +++++++++++++++++++++++++++++ lib/crypto/riscv/poly1305.h | 14 + 4 files changed, 875 insertions(+), 1 deletion(-) create mode 100644 lib/crypto/riscv/poly1305-riscv.pl create mode 100644 lib/crypto/riscv/poly1305.h
lib/crypto/Kconfig +2 -1
@@ -126,10 +126,11 @@ config CRYPTO_LIB_POLY1305_ARCH default y if ARM default y if ARM64 && KERNEL_MODE_NEON default y if MIPS # The PPC64 code needs to be fixed to work in softirq context. default y if PPC64 && CPU_LITTLE_ENDIAN && VSX && BROKEN + default y if RISCV default y if X86_64 # This symbol controls the inclusion of the Poly1305 generic code. This differs # from most of the other algorithms, which handle the generic code # "automatically" via __maybe_unused. This is needed so that the Adiantum code,
@@ -141,11 +142,11 @@ config CRYPTO_LIB_POLY1305_GENERIC # impl as a fallback. (Or if selected explicitly.) default y if !CRYPTO_LIB_POLY1305_ARCH || PPC64 config CRYPTO_LIB_POLY1305_RSIZE int - default 2 if MIPS + default 2 if MIPS || RISCV default 11 if X86_64 default 9 if ARM || ARM64 default 1 config CRYPTO_LIB_CHACHA20POLY1305
lib/crypto/Makefile +12 -0
@@ -108,10 +108,21 @@ $(obj)/mips/poly1305-core.S: $(src)/mips/poly1305-mips.pl $(call if_changed,perlasm_poly1305) endif libpoly1305-$(CONFIG_PPC) += powerpc/poly1305-p10le_64.o +ifeq ($(CONFIG_RISCV),y) +libpoly1305-y += riscv/poly1305-core.o +poly1305-perlasm-flavour-$(CONFIG_32BIT) := 32 +poly1305-perlasm-flavour-$(CONFIG_64BIT) := 64 +quiet_cmd_perlasm_poly1305 = PERLASM $@ + cmd_perlasm_poly1305 = $(PERL) $< $(poly1305-perlasm-flavour-y) $@ +$(obj)/riscv/poly1305-core.S: $(src)/riscv/poly1305-riscv.pl + $(call if_changed,perlasm_poly1305) +AFLAGS_riscv/poly1305-core.o += -Dpoly1305_init=poly1305_block_init +endif + ifeq ($(CONFIG_X86),y) libpoly1305-y += x86/poly1305-x86_64-cryptogams.o $(obj)/x86/poly1305-x86_64-cryptogams.S: $(src)/x86/poly1305-x86_64-cryptogams.pl $(call cmd,perlasm) endif
@@ -120,10 +131,11 @@ endif # CONFIG_CRYPTO_LIB_POLY1305_ARCH # clean-files must be defined unconditionally clean-files += arm/poly1305-core.S \ arm64/poly1305-core.S \ mips/poly1305-core.S \ + riscv/poly1305-core.S \ x86/poly1305-x86_64-cryptogams.S ################################################################################ obj-$(CONFIG_CRYPTO_LIB_SHA1) += libsha1.o
lib/crypto/riscv/poly1305-riscv.pl new file +847 -0
847 lines not on this page · raw message
lib/crypto/riscv/poly1305.h new file +14 -0
@@ -0,0 +1,14 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* +* OpenSSL/Cryptogams accelerated Poly1305 transform for riscv +* +* Copyright (C) 2025 Institute of Software, CAS. +*/ + +asmlinkage void poly1305_block_init(struct poly1305_block_state *state, +const u8 raw_key[POLY1305_BLOCK_SIZE ]); +asmlinkage void poly1305_blocks(struct poly1305_block_state *state, +const u8 *src,u32 len,u32 hibit); +asmlinkage void poly1305_emit(const struct poly1305_state *state, +u8 digest[POLY1305_DIGEST_SIZE ], +const u32 nonce[4 ]);
Signature · 1 line
2.50.1