[PATCH v4 00/13] Architecture-optimized SHA-256 library API

Herbert Xu herbert at gondor.apana.org.au
Mon May 5 22:24:34 AEST 2025


Eric Biggers <ebiggers at kernel.org> wrote:
> This is based on cryptodev commit 2dfc7cd74a5e062a.  It can also be
> retrieved from:
> 
>    git fetch https://git.kernel.org/pub/scm/linux/kernel/git/ebiggers/linux.git sha256-lib-v4
> 
> Following the example of several other algorithms (e.g. CRC32, ChaCha,
> Poly1305, BLAKE2s), this series refactors the kernel's existing
> architecture-optimized SHA-256 code to be available via the library API,
> instead of just via the crypto_shash API as it was before.  It also
> reimplements the SHA-256 crypto_shash API on top of the library API.
> 
> This makes it possible to use the SHA-256 library in
> performance-critical cases.  The new design is also much simpler, with a
> negative diffstat of almost 1200 lines.  Finally, this also fixes the
> longstanding issue where the arch-optimized SHA-256 was disabled by
> default, so people often forgot to enable it.
> 
> For now the SHA-256 library is well-covered by the crypto_shash
> self-tests, but I plan to add a test for the library directly later.
> I've fully tested this series on arm, arm64, riscv, and x86.  On mips,
> powerpc, s390, and sparc I've only been able to partially test it, since
> QEMU does not support the SHA-256 instructions on those platforms.  If
> anyone with access to a mips, powerpc, s390, or sparc system that has
> SHA-256 instructions can verify that the crypto self-tests still pass,
> 
> Changed v1 => v4:
>    - Moved sha256_generic_blocks() into its own module to avoid a
>      circular module dependency.
>    - Added Ard's Reviewed-by tags.
>    - Rebased onto cryptodev.
> 
> Eric Biggers (13):
>  crypto: sha256 - support arch-optimized lib and expose through shash
>  crypto: arm/sha256 - implement library instead of shash
>  crypto: arm64/sha256 - remove obsolete chunking logic
>  crypto: arm64/sha256 - implement library instead of shash
>  crypto: mips/sha256 - implement library instead of shash
>  crypto: powerpc/sha256 - implement library instead of shash
>  crypto: riscv/sha256 - implement library instead of shash
>  crypto: s390/sha256 - implement library instead of shash
>  crypto: sparc - move opcodes.h into asm directory
>  crypto: sparc/sha256 - implement library instead of shash
>  crypto: x86/sha256 - implement library instead of shash
>  crypto: sha256 - remove sha256_base.h
>  crypto: lib/sha256 - improve function prototypes
> 
> arch/arm/configs/exynos_defconfig             |   1 -
> arch/arm/configs/milbeaut_m10v_defconfig      |   1 -
> arch/arm/configs/multi_v7_defconfig           |   1 -
> arch/arm/configs/omap2plus_defconfig          |   1 -
> arch/arm/configs/pxa_defconfig                |   1 -
> arch/arm/crypto/Kconfig                       |  21 -
> arch/arm/crypto/Makefile                      |   8 +-
> arch/arm/crypto/sha2-ce-glue.c                |  87 ----
> arch/arm/crypto/sha256_glue.c                 | 107 -----
> arch/arm/crypto/sha256_glue.h                 |   9 -
> arch/arm/crypto/sha256_neon_glue.c            |  75 ---
> arch/arm/lib/crypto/.gitignore                |   1 +
> arch/arm/lib/crypto/Kconfig                   |   6 +
> arch/arm/lib/crypto/Makefile                  |   8 +-
> arch/arm/{ => lib}/crypto/sha256-armv4.pl     |   0
> .../sha2-ce-core.S => lib/crypto/sha256-ce.S} |  10 +-
> arch/arm/lib/crypto/sha256.c                  |  64 +++
> arch/arm64/configs/defconfig                  |   1 -
> arch/arm64/crypto/Kconfig                     |  19 -
> arch/arm64/crypto/Makefile                    |  13 +-
> arch/arm64/crypto/sha2-ce-glue.c              | 138 ------
> arch/arm64/crypto/sha256-glue.c               | 171 -------
> arch/arm64/lib/crypto/.gitignore              |   1 +
> arch/arm64/lib/crypto/Kconfig                 |   5 +
> arch/arm64/lib/crypto/Makefile                |   9 +-
> .../crypto/sha2-armv8.pl}                     |   0
> .../sha2-ce-core.S => lib/crypto/sha256-ce.S} |  36 +-
> arch/arm64/lib/crypto/sha256.c                |  75 +++
> arch/mips/cavium-octeon/Kconfig               |   6 +
> .../mips/cavium-octeon/crypto/octeon-sha256.c | 135 ++----
> arch/mips/configs/cavium_octeon_defconfig     |   1 -
> arch/mips/crypto/Kconfig                      |  10 -
> arch/powerpc/crypto/Kconfig                   |  11 -
> arch/powerpc/crypto/Makefile                  |   2 -
> arch/powerpc/crypto/sha256-spe-glue.c         | 128 ------
> arch/powerpc/lib/crypto/Kconfig               |   6 +
> arch/powerpc/lib/crypto/Makefile              |   3 +
> .../powerpc/{ => lib}/crypto/sha256-spe-asm.S |   0
> arch/powerpc/lib/crypto/sha256.c              |  70 +++
> arch/riscv/crypto/Kconfig                     |  11 -
> arch/riscv/crypto/Makefile                    |   3 -
> arch/riscv/crypto/sha256-riscv64-glue.c       | 125 -----
> arch/riscv/lib/crypto/Kconfig                 |   7 +
> arch/riscv/lib/crypto/Makefile                |   3 +
> .../sha256-riscv64-zvknha_or_zvknhb-zvkb.S    |   4 +-
> arch/riscv/lib/crypto/sha256.c                |  62 +++
> arch/s390/configs/debug_defconfig             |   1 -
> arch/s390/configs/defconfig                   |   1 -
> arch/s390/crypto/Kconfig                      |  10 -
> arch/s390/crypto/Makefile                     |   1 -
> arch/s390/crypto/sha256_s390.c                | 144 ------
> arch/s390/lib/crypto/Kconfig                  |   6 +
> arch/s390/lib/crypto/Makefile                 |   2 +
> arch/s390/lib/crypto/sha256.c                 |  47 ++
> arch/sparc/crypto/Kconfig                     |  10 -
> arch/sparc/crypto/Makefile                    |   2 -
> arch/sparc/crypto/aes_asm.S                   |   3 +-
> arch/sparc/crypto/aes_glue.c                  |   3 +-
> arch/sparc/crypto/camellia_asm.S              |   3 +-
> arch/sparc/crypto/camellia_glue.c             |   3 +-
> arch/sparc/crypto/des_asm.S                   |   3 +-
> arch/sparc/crypto/des_glue.c                  |   3 +-
> arch/sparc/crypto/md5_asm.S                   |   3 +-
> arch/sparc/crypto/md5_glue.c                  |   3 +-
> arch/sparc/crypto/sha1_asm.S                  |   3 +-
> arch/sparc/crypto/sha1_glue.c                 |   3 +-
> arch/sparc/crypto/sha256_glue.c               | 129 ------
> arch/sparc/crypto/sha512_asm.S                |   3 +-
> arch/sparc/crypto/sha512_glue.c               |   3 +-
> arch/sparc/{crypto => include/asm}/opcodes.h  |   6 +-
> arch/sparc/lib/Makefile                       |   1 +
> arch/sparc/lib/crc32c_asm.S                   |   3 +-
> arch/sparc/lib/crypto/Kconfig                 |   8 +
> arch/sparc/lib/crypto/Makefile                |   4 +
> arch/sparc/lib/crypto/sha256.c                |  64 +++
> arch/sparc/{ => lib}/crypto/sha256_asm.S      |   5 +-
> arch/x86/crypto/Kconfig                       |  14 -
> arch/x86/crypto/Makefile                      |   3 -
> arch/x86/crypto/sha256_ssse3_glue.c           | 432 ------------------
> arch/x86/lib/crypto/Kconfig                   |   7 +
> arch/x86/lib/crypto/Makefile                  |   3 +
> arch/x86/{ => lib}/crypto/sha256-avx-asm.S    |  12 +-
> arch/x86/{ => lib}/crypto/sha256-avx2-asm.S   |  12 +-
> .../crypto/sha256-ni-asm.S}                   |  36 +-
> arch/x86/{ => lib}/crypto/sha256-ssse3-asm.S  |  14 +-
> arch/x86/lib/crypto/sha256.c                  |  74 +++
> crypto/Kconfig                                |   1 +
> crypto/Makefile                               |   3 +-
> crypto/sha256.c                               | 201 ++++++++
> crypto/sha256_generic.c                       | 102 -----
> include/crypto/internal/sha2.h                |  28 ++
> include/crypto/sha2.h                         |  23 +-
> include/crypto/sha256_base.h                  | 180 --------
> lib/crypto/Kconfig                            |  22 +
> lib/crypto/Makefile                           |   3 +
> lib/crypto/sha256-generic.c                   | 137 ++++++
> lib/crypto/sha256.c                           | 204 ++++-----
> 97 files changed, 1128 insertions(+), 2319 deletions(-)
> delete mode 100644 arch/arm/crypto/sha2-ce-glue.c
> delete mode 100644 arch/arm/crypto/sha256_glue.c
> delete mode 100644 arch/arm/crypto/sha256_glue.h
> delete mode 100644 arch/arm/crypto/sha256_neon_glue.c
> rename arch/arm/{ => lib}/crypto/sha256-armv4.pl (100%)
> rename arch/arm/{crypto/sha2-ce-core.S => lib/crypto/sha256-ce.S} (91%)
> create mode 100644 arch/arm/lib/crypto/sha256.c
> delete mode 100644 arch/arm64/crypto/sha2-ce-glue.c
> delete mode 100644 arch/arm64/crypto/sha256-glue.c
> rename arch/arm64/{crypto/sha512-armv8.pl => lib/crypto/sha2-armv8.pl} (100%)
> rename arch/arm64/{crypto/sha2-ce-core.S => lib/crypto/sha256-ce.S} (80%)
> create mode 100644 arch/arm64/lib/crypto/sha256.c
> delete mode 100644 arch/powerpc/crypto/sha256-spe-glue.c
> rename arch/powerpc/{ => lib}/crypto/sha256-spe-asm.S (100%)
> create mode 100644 arch/powerpc/lib/crypto/sha256.c
> delete mode 100644 arch/riscv/crypto/sha256-riscv64-glue.c
> rename arch/riscv/{ => lib}/crypto/sha256-riscv64-zvknha_or_zvknhb-zvkb.S (98%)
> create mode 100644 arch/riscv/lib/crypto/sha256.c
> delete mode 100644 arch/s390/crypto/sha256_s390.c
> create mode 100644 arch/s390/lib/crypto/sha256.c
> delete mode 100644 arch/sparc/crypto/sha256_glue.c
> rename arch/sparc/{crypto => include/asm}/opcodes.h (96%)
> create mode 100644 arch/sparc/lib/crypto/Kconfig
> create mode 100644 arch/sparc/lib/crypto/Makefile
> create mode 100644 arch/sparc/lib/crypto/sha256.c
> rename arch/sparc/{ => lib}/crypto/sha256_asm.S (95%)
> delete mode 100644 arch/x86/crypto/sha256_ssse3_glue.c
> rename arch/x86/{ => lib}/crypto/sha256-avx-asm.S (98%)
> rename arch/x86/{ => lib}/crypto/sha256-avx2-asm.S (98%)
> rename arch/x86/{crypto/sha256_ni_asm.S => lib/crypto/sha256-ni-asm.S} (85%)
> rename arch/x86/{ => lib}/crypto/sha256-ssse3-asm.S (98%)
> create mode 100644 arch/x86/lib/crypto/sha256.c
> create mode 100644 crypto/sha256.c
> delete mode 100644 crypto/sha256_generic.c
> create mode 100644 include/crypto/internal/sha2.h
> delete mode 100644 include/crypto/sha256_base.h
> create mode 100644 lib/crypto/sha256-generic.c
> 
> 
> base-commit: 2dfc7cd74a5e062a5405560447517e7aab1c7341

All applied with export/import addition to patch 1.  Thanks.
-- 
Email: Herbert Xu <herbert at gondor.apana.org.au>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt


More information about the Linuxppc-dev mailing list