Re: [PATCH v2 02/11] crypto: crc64-rocksoft - remove from crypto API

From: Ard Biesheuvel
Date: Sun Feb 02 2025 - 09:27:49 EST


On Thu, 30 Jan 2025 at 04:54, Eric Biggers <ebiggers@xxxxxxxxxx> wrote:
>
> From: Eric Biggers <ebiggers@xxxxxxxxxx>
>
> Remove crc64-rocksoft from the crypto API. It has no known user now
> that the lib is no longer built on top of it. It was also added much
> more recently than the longstanding crc32 and crc32c. Unlike crc32 and
> crc32c, crc64-rocksoft is also not mentioned in the dm-integrity
> documentation and there are no references to it in anywhere in the
> cryptsetup git repo, so it is unlikely to have any user there either.
>
> Also, this CRC variant is named incorrectly; it has nothing to do with
> Rocksoft and should be called crc64-nvme. That is yet another reason to
> remove it from the crypto API; we would not want anyone to start
> depending on the current incorrect algorithm name of crc64-rocksoft.
>
> Note that this change temporarily makes this CRC variant not be covered
> by any tests, as previously it was relying on the crypto self-tests.
> This will be fixed by adding this CRC variant to crc_kunit.
>
> Signed-off-by: Eric Biggers <ebiggers@xxxxxxxxxx>
> ---
> crypto/Kconfig | 11 ----
> crypto/Makefile | 1 -
> crypto/crc64_rocksoft_generic.c | 89 ---------------------------------
> crypto/testmgr.c | 7 ---
> crypto/testmgr.h | 12 -----
> include/linux/crc64.h | 2 -
> 6 files changed, 122 deletions(-)
> delete mode 100644 crypto/crc64_rocksoft_generic.c
>

Reviewed-by: Ard Biesheuvel <ardb@xxxxxxxxxx>

> diff --git a/crypto/Kconfig b/crypto/Kconfig
> index 74ae5f52b784..9ffb59b1aac3 100644
> --- a/crypto/Kconfig
> +++ b/crypto/Kconfig
> @@ -1088,21 +1088,10 @@ config CRYPTO_CRCT10DIF
> help
> CRC16 CRC algorithm used for the T10 (SCSI) Data Integrity Field (DIF)
>
> CRC algorithm used by the SCSI Block Commands standard.
>
> -config CRYPTO_CRC64_ROCKSOFT
> - tristate "CRC64 based on Rocksoft Model algorithm"
> - depends on CRC64
> - select CRYPTO_HASH
> - help
> - CRC64 CRC algorithm based on the Rocksoft Model CRC Algorithm
> -
> - Used by the NVMe implementation of T10 DIF (BLK_DEV_INTEGRITY)
> -
> - See https://zlib.net/crc_v3.txt
> -
> endmenu
>
> menu "Compression"
>
> config CRYPTO_DEFLATE
> diff --git a/crypto/Makefile b/crypto/Makefile
> index f67e853c4690..d3b79b8c9022 100644
> --- a/crypto/Makefile
> +++ b/crypto/Makefile
> @@ -155,11 +155,10 @@ obj-$(CONFIG_CRYPTO_CRC32C) += crc32c_generic.o
> obj-$(CONFIG_CRYPTO_CRC32) += crc32_generic.o
> CFLAGS_crc32c_generic.o += -DARCH=$(ARCH)
> CFLAGS_crc32_generic.o += -DARCH=$(ARCH)
> obj-$(CONFIG_CRYPTO_CRCT10DIF) += crct10dif_generic.o
> CFLAGS_crct10dif_generic.o += -DARCH=$(ARCH)
> -obj-$(CONFIG_CRYPTO_CRC64_ROCKSOFT) += crc64_rocksoft_generic.o
> obj-$(CONFIG_CRYPTO_AUTHENC) += authenc.o authencesn.o
> obj-$(CONFIG_CRYPTO_LZO) += lzo.o lzo-rle.o
> obj-$(CONFIG_CRYPTO_LZ4) += lz4.o
> obj-$(CONFIG_CRYPTO_LZ4HC) += lz4hc.o
> obj-$(CONFIG_CRYPTO_XXHASH) += xxhash_generic.o
> diff --git a/crypto/crc64_rocksoft_generic.c b/crypto/crc64_rocksoft_generic.c
> deleted file mode 100644
> index ce0f3059b912..000000000000
> --- a/crypto/crc64_rocksoft_generic.c
> +++ /dev/null
> @@ -1,89 +0,0 @@
> -// SPDX-License-Identifier: GPL-2.0-only
> -
> -#include <linux/crc64.h>
> -#include <linux/module.h>
> -#include <crypto/internal/hash.h>
> -#include <linux/unaligned.h>
> -
> -static int chksum_init(struct shash_desc *desc)
> -{
> - u64 *crc = shash_desc_ctx(desc);
> -
> - *crc = 0;
> -
> - return 0;
> -}
> -
> -static int chksum_update(struct shash_desc *desc, const u8 *data,
> - unsigned int length)
> -{
> - u64 *crc = shash_desc_ctx(desc);
> -
> - *crc = crc64_rocksoft_generic(*crc, data, length);
> -
> - return 0;
> -}
> -
> -static int chksum_final(struct shash_desc *desc, u8 *out)
> -{
> - u64 *crc = shash_desc_ctx(desc);
> -
> - put_unaligned_le64(*crc, out);
> - return 0;
> -}
> -
> -static int __chksum_finup(u64 crc, const u8 *data, unsigned int len, u8 *out)
> -{
> - crc = crc64_rocksoft_generic(crc, data, len);
> - put_unaligned_le64(crc, out);
> - return 0;
> -}
> -
> -static int chksum_finup(struct shash_desc *desc, const u8 *data,
> - unsigned int len, u8 *out)
> -{
> - u64 *crc = shash_desc_ctx(desc);
> -
> - return __chksum_finup(*crc, data, len, out);
> -}
> -
> -static int chksum_digest(struct shash_desc *desc, const u8 *data,
> - unsigned int length, u8 *out)
> -{
> - return __chksum_finup(0, data, length, out);
> -}
> -
> -static struct shash_alg alg = {
> - .digestsize = sizeof(u64),
> - .init = chksum_init,
> - .update = chksum_update,
> - .final = chksum_final,
> - .finup = chksum_finup,
> - .digest = chksum_digest,
> - .descsize = sizeof(u64),
> - .base = {
> - .cra_name = CRC64_ROCKSOFT_STRING,
> - .cra_driver_name = "crc64-rocksoft-generic",
> - .cra_priority = 200,
> - .cra_blocksize = 1,
> - .cra_module = THIS_MODULE,
> - }
> -};
> -
> -static int __init crc64_rocksoft_init(void)
> -{
> - return crypto_register_shash(&alg);
> -}
> -
> -static void __exit crc64_rocksoft_exit(void)
> -{
> - crypto_unregister_shash(&alg);
> -}
> -
> -module_init(crc64_rocksoft_init);
> -module_exit(crc64_rocksoft_exit);
> -
> -MODULE_LICENSE("GPL");
> -MODULE_DESCRIPTION("Rocksoft model CRC64 calculation.");
> -MODULE_ALIAS_CRYPTO("crc64-rocksoft");
> -MODULE_ALIAS_CRYPTO("crc64-rocksoft-generic");
> diff --git a/crypto/testmgr.c b/crypto/testmgr.c
> index e61490ba4095..0c1c3a6453b6 100644
> --- a/crypto/testmgr.c
> +++ b/crypto/testmgr.c
> @@ -4757,17 +4757,10 @@ static const struct alg_test_desc alg_test_descs[] = {
> .test = alg_test_crc32c,
> .fips_allowed = 1,
> .suite = {
> .hash = __VECS(crc32c_tv_template)
> }
> - }, {
> - .alg = "crc64-rocksoft",
> - .test = alg_test_hash,
> - .fips_allowed = 1,
> - .suite = {
> - .hash = __VECS(crc64_rocksoft_tv_template)
> - }
> }, {
> .alg = "crct10dif",
> .test = alg_test_hash,
> .fips_allowed = 1,
> .suite = {
> diff --git a/crypto/testmgr.h b/crypto/testmgr.h
> index d754ab997186..4ab05046b734 100644
> --- a/crypto/testmgr.h
> +++ b/crypto/testmgr.h
> @@ -6018,22 +6018,10 @@ static const struct hash_testvec rmd160_tv_template[] = {
> };
>
> static const u8 zeroes[4096] = { [0 ... 4095] = 0 };
> static const u8 ones[4096] = { [0 ... 4095] = 0xff };
>
> -static const struct hash_testvec crc64_rocksoft_tv_template[] = {
> - {
> - .plaintext = zeroes,
> - .psize = 4096,
> - .digest = "\x4e\xb6\x22\xeb\x67\xd3\x82\x64",
> - }, {
> - .plaintext = ones,
> - .psize = 4096,
> - .digest = "\xac\xa3\xec\x02\x73\xba\xdd\xc0",
> - }
> -};
> -
> static const struct hash_testvec crct10dif_tv_template[] = {
> {
> .plaintext = "abc",
> .psize = 3,
> .digest = (u8 *)(u16 []){ 0x443b },
> diff --git a/include/linux/crc64.h b/include/linux/crc64.h
> index 0a595b272166..7880aeab69d6 100644
> --- a/include/linux/crc64.h
> +++ b/include/linux/crc64.h
> @@ -5,12 +5,10 @@
> #ifndef _LINUX_CRC64_H
> #define _LINUX_CRC64_H
>
> #include <linux/types.h>
>
> -#define CRC64_ROCKSOFT_STRING "crc64-rocksoft"
> -
> u64 __pure crc64_be(u64 crc, const void *p, size_t len);
> u64 __pure crc64_rocksoft_generic(u64 crc, const void *p, size_t len);
>
> /**
> * crc64_rocksoft_update - Calculate bitwise Rocksoft CRC64
> --
> 2.48.1
>