From: Ard Biesheuvel <ardb@xxxxxxxxxx> crc32-generic is backed by the architecture's CRC-32 library, which may offer a variety of implementations depending on the capabilities of the platform. These are not covered by the crypto subsystem's fuzz testing capabilities because crc32-generic is the reference driver that the fuzzing logic uses as a source of truth. Fix this by proving a crc32-base implementation which is always based on the generic C implementation, and wire it up as the reference implementation for the fuzz tester. Signed-off-by: Ard Biesheuvel <ardb@xxxxxxxxxx> --- crypto/crc32_generic.c | 73 ++++++++++++++------ crypto/testmgr.c | 1 + 2 files changed, 52 insertions(+), 22 deletions(-) diff --git a/crypto/crc32_generic.c b/crypto/crc32_generic.c index d1251663ed66..73948ce96ac7 100644 --- a/crypto/crc32_generic.c +++ b/crypto/crc32_generic.c @@ -63,6 +63,17 @@ static int crc32_update(struct shash_desc *desc, const u8 *data, return 0; } +#ifdef CONFIG_CRYPTO_MANAGER_EXTRA_TESTS +static int crc32_update_base(struct shash_desc *desc, const u8 *data, + unsigned int len) +{ + u32 *crcp = shash_desc_ctx(desc); + + *crcp = crc32_le_base(*crcp, data, len); + return 0; +} +#endif + /* No final XOR 0xFFFFFFFF, like crc32_le */ static int __crc32_finup(u32 *crcp, const u8 *data, unsigned int len, u8 *out) @@ -91,35 +102,53 @@ static int crc32_digest(struct shash_desc *desc, const u8 *data, return __crc32_finup(crypto_shash_ctx(desc->tfm), data, len, out); } -static struct shash_alg alg = { - .setkey = crc32_setkey, - .init = crc32_init, - .update = crc32_update, - .final = crc32_final, - .finup = crc32_finup, - .digest = crc32_digest, - .descsize = sizeof(u32), - .digestsize = CHKSUM_DIGEST_SIZE, - .base = { - .cra_name = "crc32", - .cra_driver_name = "crc32-generic", - .cra_priority = 100, - .cra_flags = CRYPTO_ALG_OPTIONAL_KEY, - .cra_blocksize = CHKSUM_BLOCK_SIZE, - .cra_ctxsize = sizeof(u32), - .cra_module = THIS_MODULE, - .cra_init = crc32_cra_init, - } -}; +static struct shash_alg algs[] = {{ + .setkey = crc32_setkey, + .init = crc32_init, + .update = crc32_update, + .final = crc32_final, + .finup = crc32_finup, + .digest = crc32_digest, + .descsize = sizeof(u32), + .digestsize = CHKSUM_DIGEST_SIZE, + + .base.cra_name = "crc32", + .base.cra_driver_name = "crc32-generic", + .base.cra_priority = 100, + .base.cra_flags = CRYPTO_ALG_OPTIONAL_KEY, + .base.cra_blocksize = CHKSUM_BLOCK_SIZE, + .base.cra_ctxsize = sizeof(u32), + .base.cra_module = THIS_MODULE, + .base.cra_init = crc32_cra_init, +#ifdef CONFIG_CRYPTO_MANAGER_EXTRA_TESTS +}, { + .setkey = crc32_setkey, + .init = crc32_init, + .update = crc32_update_base, + .final = crc32_final, + .digest = crc32_digest, + .descsize = sizeof(u32), + .digestsize = CHKSUM_DIGEST_SIZE, + + .base.cra_name = "crc32", + .base.cra_driver_name = "crc32-base", + .base.cra_flags = CRYPTO_ALG_OPTIONAL_KEY, + .base.cra_blocksize = CHKSUM_BLOCK_SIZE, + .base.cra_ctxsize = sizeof(u32), + .base.cra_module = THIS_MODULE, + .base.cra_init = crc32_cra_init, +#endif +}}; static int __init crc32_mod_init(void) { - return crypto_register_shash(&alg); + return crypto_register_shashes(algs, ARRAY_SIZE(algs)); } static void __exit crc32_mod_fini(void) { - crypto_unregister_shash(&alg); + crypto_unregister_shashes(algs, ARRAY_SIZE(algs)); + } subsys_initcall(crc32_mod_init); diff --git a/crypto/testmgr.c b/crypto/testmgr.c index ee8da628e9da..e0d6bfcc13e6 100644 --- a/crypto/testmgr.c +++ b/crypto/testmgr.c @@ -4692,6 +4692,7 @@ static const struct alg_test_desc alg_test_descs[] = { .test = alg_test_null, }, { .alg = "crc32", + .generic_driver = "crc32-base", .test = alg_test_hash, .fips_allowed = 1, .suite = { -- 2.47.0.rc1.288.g06298d1525-goog