This push fixes reverts the multibuffer hash testing as it is buggy.

-----BEGIN PGP SIGNATURE-----
 
 iQIzBAABCgAdFiEEn51F/lCuNhUwmDeSxycdCkmxi6cFAmfotyEACgkQxycdCkmx
 i6cexw/+P89k6YKSHv9tYQ7hndFBf8ivDKvhb2bmB1tWSC+n7p8AW0oC9rCLkgih
 fya2mhPLgH3M+qOcKURFks9f5SVZm1IXuG+Hu/9hBkETW6RZZt+m5FzxAnbjVUqA
 dETVYvPDyw1pv6G1oUpi68fKhID8miZS2XLGmwCHrE+I+c/wskq8+oTjqZrn3jA3
 iE29V6ZC4jV/aLk4EzIxBKJiGFHA9S5kd6sj7vMHVx9j3pvcBq0t3NuqBU5dmTbD
 sCpYF8PCWv4TgbiMy8EgIgZPlrbUAtctFUS1O1X//C8YvvcRuJARBXBLCHcFUqEV
 A8Ub1gvO9J+xzS9TTV3cKOifAPeNX87748gpSk/5FmTdIANSBKVuKLkAdF5mm7UM
 sodUr95jHkqpAbzNKJlN4cSYw0ZjVHvd/fAL3e8jNGPo97rqQYJM3OZzStgArHAz
 PCKqb4agjHpN9T8MSsKAv8b/5+ZoukpBwkiM+57zxyG3Qrfpg1c369Ld/P8Bg0rY
 PKxsgH5AAP6kpPw5ZLQYuTnq4FvvrkJdTnfVd5G6qQZ/NCabnw/dIFgAM/qhJWz0
 Ib8p5y1bdRhbECQOHu678vAJIiKkD5Ml2ltx3FZnEmmQR3ueAMqcj0tx3S9Lq5pC
 Tk0znvQRRbwBSCeQQa7BHyEXulvOrNxV6ZZFwn1YWM5cDbuq/oc=
 =fRer
 -----END PGP SIGNATURE-----

Merge tag 'v6.15-p2' of git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6

Pull crypto fix from Herbert Xu:

 - revert the multibuffer hash testing as it is buggy

* tag 'v6.15-p2' of git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6:
  Revert "crypto: testmgr - Add multibuffer hash testing"
This commit is contained in:
Linus Torvalds 2025-04-02 09:14:59 -07:00
commit 5de0afb422

View File

@ -302,13 +302,6 @@ struct test_sg_division {
* @key_offset_relative_to_alignmask: if true, add the algorithm's alignmask to
* the @key_offset
* @finalization_type: what finalization function to use for hashes
* @multibuffer: test with multibuffer
* @multibuffer_index: random number used to generate the message index to use
* for multibuffer.
* @multibuffer_uneven: test with multibuffer using uneven lengths
* @multibuffer_lens: random lengths to make chained request uneven
* @multibuffer_count: random number used to generate the num_msgs parameter
* for multibuffer
* @nosimd: execute with SIMD disabled? Requires !CRYPTO_TFM_REQ_MAY_SLEEP.
* This applies to the parts of the operation that aren't controlled
* individually by @nosimd_setkey or @src_divs[].nosimd.
@ -328,11 +321,6 @@ struct testvec_config {
enum finalization_type finalization_type;
bool nosimd;
bool nosimd_setkey;
bool multibuffer;
unsigned int multibuffer_index;
unsigned int multibuffer_count;
bool multibuffer_uneven;
unsigned int multibuffer_lens[MAX_MB_MSGS];
};
#define TESTVEC_CONFIG_NAMELEN 192
@ -572,7 +560,6 @@ struct test_sglist {
char *bufs[XBUFSIZE];
struct scatterlist sgl[XBUFSIZE];
struct scatterlist sgl_saved[XBUFSIZE];
struct scatterlist full_sgl[XBUFSIZE];
struct scatterlist *sgl_ptr;
unsigned int nents;
};
@ -686,11 +673,6 @@ static int build_test_sglist(struct test_sglist *tsgl,
sg_mark_end(&tsgl->sgl[tsgl->nents - 1]);
tsgl->sgl_ptr = tsgl->sgl;
memcpy(tsgl->sgl_saved, tsgl->sgl, tsgl->nents * sizeof(tsgl->sgl[0]));
sg_init_table(tsgl->full_sgl, XBUFSIZE);
for (i = 0; i < XBUFSIZE; i++)
sg_set_buf(tsgl->full_sgl, tsgl->bufs[i], PAGE_SIZE * 2);
return 0;
}
@ -1167,27 +1149,6 @@ static void generate_random_testvec_config(struct rnd_state *rng,
break;
}
if (prandom_bool(rng)) {
int i;
cfg->multibuffer = true;
cfg->multibuffer_count = prandom_u32_state(rng);
cfg->multibuffer_count %= MAX_MB_MSGS;
if (cfg->multibuffer_count++) {
cfg->multibuffer_index = prandom_u32_state(rng);
cfg->multibuffer_index %= cfg->multibuffer_count;
}
cfg->multibuffer_uneven = prandom_bool(rng);
for (i = 0; i < MAX_MB_MSGS; i++)
cfg->multibuffer_lens[i] =
generate_random_length(rng, PAGE_SIZE * 2 * XBUFSIZE);
p += scnprintf(p, end - p, " multibuffer(%d/%d%s)",
cfg->multibuffer_index, cfg->multibuffer_count,
cfg->multibuffer_uneven ? "/uneven" : "");
}
if (!(cfg->req_flags & CRYPTO_TFM_REQ_MAY_SLEEP)) {
if (prandom_bool(rng)) {
cfg->nosimd = true;
@ -1492,7 +1453,6 @@ static int do_ahash_op(int (*op)(struct ahash_request *req),
struct ahash_request *req,
struct crypto_wait *wait, bool nosimd)
{
struct ahash_request *r2;
int err;
if (nosimd)
@ -1503,15 +1463,7 @@ static int do_ahash_op(int (*op)(struct ahash_request *req),
if (nosimd)
crypto_reenable_simd_for_test();
err = crypto_wait_req(err, wait);
if (err)
return err;
list_for_each_entry(r2, &req->base.list, base.list)
if (r2->base.err)
return r2->base.err;
return 0;
return crypto_wait_req(err, wait);
}
static int check_nonfinal_ahash_op(const char *op, int err,
@ -1532,65 +1484,20 @@ static int check_nonfinal_ahash_op(const char *op, int err,
return 0;
}
static void setup_ahash_multibuffer(
struct ahash_request *reqs[MAX_MB_MSGS],
const struct testvec_config *cfg,
struct test_sglist *tsgl)
{
struct scatterlist *sg = tsgl->full_sgl;
static u8 trash[HASH_MAX_DIGESTSIZE];
struct ahash_request *req = reqs[0];
unsigned int num_msgs;
unsigned int msg_idx;
int i;
if (!cfg->multibuffer)
return;
num_msgs = cfg->multibuffer_count;
if (num_msgs == 1)
return;
msg_idx = cfg->multibuffer_index;
for (i = 1; i < num_msgs; i++) {
struct ahash_request *r2 = reqs[i];
unsigned int nbytes = req->nbytes;
if (cfg->multibuffer_uneven)
nbytes = cfg->multibuffer_lens[i];
ahash_request_set_callback(r2, req->base.flags, NULL, NULL);
ahash_request_set_crypt(r2, sg, trash, nbytes);
ahash_request_chain(r2, req);
}
if (msg_idx) {
reqs[msg_idx]->src = req->src;
reqs[msg_idx]->nbytes = req->nbytes;
reqs[msg_idx]->result = req->result;
req->src = sg;
if (cfg->multibuffer_uneven)
req->nbytes = cfg->multibuffer_lens[0];
req->result = trash;
}
}
/* Test one hash test vector in one configuration, using the ahash API */
static int test_ahash_vec_cfg(const struct hash_testvec *vec,
const char *vec_name,
const struct testvec_config *cfg,
struct ahash_request *reqs[MAX_MB_MSGS],
struct ahash_request *req,
struct test_sglist *tsgl,
u8 *hashstate)
{
struct ahash_request *req = reqs[0];
struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
const unsigned int digestsize = crypto_ahash_digestsize(tfm);
const unsigned int statesize = crypto_ahash_statesize(tfm);
const char *driver = crypto_ahash_driver_name(tfm);
const u32 req_flags = CRYPTO_TFM_REQ_MAY_BACKLOG | cfg->req_flags;
const struct test_sg_division *divs[XBUFSIZE];
struct ahash_request *reqi = req;
DECLARE_CRYPTO_WAIT(wait);
unsigned int i;
struct scatterlist *pending_sgl;
@ -1598,9 +1505,6 @@ static int test_ahash_vec_cfg(const struct hash_testvec *vec,
u8 result[HASH_MAX_DIGESTSIZE + TESTMGR_POISON_LEN];
int err;
if (cfg->multibuffer)
reqi = reqs[cfg->multibuffer_index];
/* Set the key, if specified */
if (vec->ksize) {
err = do_setkey(crypto_ahash_setkey, tfm, vec->key, vec->ksize,
@ -1630,7 +1534,7 @@ static int test_ahash_vec_cfg(const struct hash_testvec *vec,
/* Do the actual hashing */
testmgr_poison(reqi->__ctx, crypto_ahash_reqsize(tfm));
testmgr_poison(req->__ctx, crypto_ahash_reqsize(tfm));
testmgr_poison(result, digestsize + TESTMGR_POISON_LEN);
if (cfg->finalization_type == FINALIZATION_TYPE_DIGEST ||
@ -1639,7 +1543,6 @@ static int test_ahash_vec_cfg(const struct hash_testvec *vec,
ahash_request_set_callback(req, req_flags, crypto_req_done,
&wait);
ahash_request_set_crypt(req, tsgl->sgl, result, vec->psize);
setup_ahash_multibuffer(reqs, cfg, tsgl);
err = do_ahash_op(crypto_ahash_digest, req, &wait, cfg->nosimd);
if (err) {
if (err == vec->digest_error)
@ -1661,7 +1564,6 @@ static int test_ahash_vec_cfg(const struct hash_testvec *vec,
ahash_request_set_callback(req, req_flags, crypto_req_done, &wait);
ahash_request_set_crypt(req, NULL, result, 0);
setup_ahash_multibuffer(reqs, cfg, tsgl);
err = do_ahash_op(crypto_ahash_init, req, &wait, cfg->nosimd);
err = check_nonfinal_ahash_op("init", err, result, digestsize,
driver, vec_name, cfg);
@ -1678,7 +1580,6 @@ static int test_ahash_vec_cfg(const struct hash_testvec *vec,
crypto_req_done, &wait);
ahash_request_set_crypt(req, pending_sgl, result,
pending_len);
setup_ahash_multibuffer(reqs, cfg, tsgl);
err = do_ahash_op(crypto_ahash_update, req, &wait,
divs[i]->nosimd);
err = check_nonfinal_ahash_op("update", err,
@ -1693,7 +1594,7 @@ static int test_ahash_vec_cfg(const struct hash_testvec *vec,
/* Test ->export() and ->import() */
testmgr_poison(hashstate + statesize,
TESTMGR_POISON_LEN);
err = crypto_ahash_export(reqi, hashstate);
err = crypto_ahash_export(req, hashstate);
err = check_nonfinal_ahash_op("export", err,
result, digestsize,
driver, vec_name, cfg);
@ -1706,8 +1607,8 @@ static int test_ahash_vec_cfg(const struct hash_testvec *vec,
return -EOVERFLOW;
}
testmgr_poison(reqi->__ctx, crypto_ahash_reqsize(tfm));
err = crypto_ahash_import(reqi, hashstate);
testmgr_poison(req->__ctx, crypto_ahash_reqsize(tfm));
err = crypto_ahash_import(req, hashstate);
err = check_nonfinal_ahash_op("import", err,
result, digestsize,
driver, vec_name, cfg);
@ -1721,7 +1622,6 @@ static int test_ahash_vec_cfg(const struct hash_testvec *vec,
ahash_request_set_callback(req, req_flags, crypto_req_done, &wait);
ahash_request_set_crypt(req, pending_sgl, result, pending_len);
setup_ahash_multibuffer(reqs, cfg, tsgl);
if (cfg->finalization_type == FINALIZATION_TYPE_FINAL) {
/* finish with update() and final() */
err = do_ahash_op(crypto_ahash_update, req, &wait, cfg->nosimd);
@ -1753,7 +1653,7 @@ result_ready:
static int test_hash_vec_cfg(const struct hash_testvec *vec,
const char *vec_name,
const struct testvec_config *cfg,
struct ahash_request *reqs[MAX_MB_MSGS],
struct ahash_request *req,
struct shash_desc *desc,
struct test_sglist *tsgl,
u8 *hashstate)
@ -1773,12 +1673,11 @@ static int test_hash_vec_cfg(const struct hash_testvec *vec,
return err;
}
return test_ahash_vec_cfg(vec, vec_name, cfg, reqs, tsgl, hashstate);
return test_ahash_vec_cfg(vec, vec_name, cfg, req, tsgl, hashstate);
}
static int test_hash_vec(const struct hash_testvec *vec, unsigned int vec_num,
struct ahash_request *reqs[MAX_MB_MSGS],
struct shash_desc *desc,
struct ahash_request *req, struct shash_desc *desc,
struct test_sglist *tsgl, u8 *hashstate)
{
char vec_name[16];
@ -1790,7 +1689,7 @@ static int test_hash_vec(const struct hash_testvec *vec, unsigned int vec_num,
for (i = 0; i < ARRAY_SIZE(default_hash_testvec_configs); i++) {
err = test_hash_vec_cfg(vec, vec_name,
&default_hash_testvec_configs[i],
reqs, desc, tsgl, hashstate);
req, desc, tsgl, hashstate);
if (err)
return err;
}
@ -1807,7 +1706,7 @@ static int test_hash_vec(const struct hash_testvec *vec, unsigned int vec_num,
generate_random_testvec_config(&rng, &cfg, cfgname,
sizeof(cfgname));
err = test_hash_vec_cfg(vec, vec_name, &cfg,
reqs, desc, tsgl, hashstate);
req, desc, tsgl, hashstate);
if (err)
return err;
cond_resched();
@ -1866,12 +1765,11 @@ done:
*/
static int test_hash_vs_generic_impl(const char *generic_driver,
unsigned int maxkeysize,
struct ahash_request *reqs[MAX_MB_MSGS],
struct ahash_request *req,
struct shash_desc *desc,
struct test_sglist *tsgl,
u8 *hashstate)
{
struct ahash_request *req = reqs[0];
struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
const unsigned int digestsize = crypto_ahash_digestsize(tfm);
const unsigned int blocksize = crypto_ahash_blocksize(tfm);
@ -1969,7 +1867,7 @@ static int test_hash_vs_generic_impl(const char *generic_driver,
sizeof(cfgname));
err = test_hash_vec_cfg(&vec, vec_name, cfg,
reqs, desc, tsgl, hashstate);
req, desc, tsgl, hashstate);
if (err)
goto out;
cond_resched();
@ -1987,7 +1885,7 @@ out:
#else /* !CONFIG_CRYPTO_MANAGER_EXTRA_TESTS */
static int test_hash_vs_generic_impl(const char *generic_driver,
unsigned int maxkeysize,
struct ahash_request *reqs[MAX_MB_MSGS],
struct ahash_request *req,
struct shash_desc *desc,
struct test_sglist *tsgl,
u8 *hashstate)
@ -2034,8 +1932,8 @@ static int __alg_test_hash(const struct hash_testvec *vecs,
u32 type, u32 mask,
const char *generic_driver, unsigned int maxkeysize)
{
struct ahash_request *reqs[MAX_MB_MSGS] = {};
struct crypto_ahash *atfm = NULL;
struct ahash_request *req = NULL;
struct crypto_shash *stfm = NULL;
struct shash_desc *desc = NULL;
struct test_sglist *tsgl = NULL;
@ -2059,14 +1957,12 @@ static int __alg_test_hash(const struct hash_testvec *vecs,
}
driver = crypto_ahash_driver_name(atfm);
for (i = 0; i < MAX_MB_MSGS; i++) {
reqs[i] = ahash_request_alloc(atfm, GFP_KERNEL);
if (!reqs[i]) {
pr_err("alg: hash: failed to allocate request for %s\n",
driver);
err = -ENOMEM;
goto out;
}
req = ahash_request_alloc(atfm, GFP_KERNEL);
if (!req) {
pr_err("alg: hash: failed to allocate request for %s\n",
driver);
err = -ENOMEM;
goto out;
}
/*
@ -2102,12 +1998,12 @@ static int __alg_test_hash(const struct hash_testvec *vecs,
if (fips_enabled && vecs[i].fips_skip)
continue;
err = test_hash_vec(&vecs[i], i, reqs, desc, tsgl, hashstate);
err = test_hash_vec(&vecs[i], i, req, desc, tsgl, hashstate);
if (err)
goto out;
cond_resched();
}
err = test_hash_vs_generic_impl(generic_driver, maxkeysize, reqs,
err = test_hash_vs_generic_impl(generic_driver, maxkeysize, req,
desc, tsgl, hashstate);
out:
kfree(hashstate);
@ -2117,12 +2013,7 @@ out:
}
kfree(desc);
crypto_free_shash(stfm);
if (reqs[0]) {
ahash_request_set_callback(reqs[0], 0, NULL, NULL);
for (i = 1; i < MAX_MB_MSGS && reqs[i]; i++)
ahash_request_chain(reqs[i], reqs[0]);
ahash_request_free(reqs[0]);
}
ahash_request_free(req);
crypto_free_ahash(atfm);
return err;
}