summaryrefslogtreecommitdiffstats
path: root/crypto/testmgr.c
diff options
context:
space:
mode:
authorArnd Bergmann <arnd@arndb.de>2019-06-18 05:21:53 -0400
committerHerbert Xu <herbert@gondor.apana.org.au>2019-06-27 02:28:01 -0400
commit149c4e6ef7788d58b9c05eed9fb85e0f5a2c3456 (patch)
treed079cb9928b3ed09a39ede7a516196897a8dfc7e /crypto/testmgr.c
parent6b5ca646ca9d99611e30f3c8f6b4837b9890eb73 (diff)
crypto: testmgr - dynamically allocate crypto_shash
The largest stack object in this file is now the shash descriptor. Since there are many other stack variables, this can push it over the 1024 byte warning limit, in particular with clang and KASAN: crypto/testmgr.c:1693:12: error: stack frame size of 1312 bytes in function '__alg_test_hash' [-Werror,-Wframe-larger-than=] Make test_hash_vs_generic_impl() do the same thing as the corresponding eaed and skcipher functions by allocating the descriptor dynamically. We can still do better than this, but it brings us well below the 1024 byte limit. Suggested-by: Eric Biggers <ebiggers@kernel.org> Fixes: 9a8a6b3f0950 ("crypto: testmgr - fuzz hashes against their generic implementation") Signed-off-by: Arnd Bergmann <arnd@arndb.de> Reviewed-by: Eric Biggers <ebiggers@kernel.org> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'crypto/testmgr.c')
-rw-r--r--crypto/testmgr.c19
1 files changed, 13 insertions, 6 deletions
diff --git a/crypto/testmgr.c b/crypto/testmgr.c
index ace4c260ea5d..d760f5cd35b2 100644
--- a/crypto/testmgr.c
+++ b/crypto/testmgr.c
@@ -1508,14 +1508,12 @@ static int test_hash_vec(const char *driver, const struct hash_testvec *vec,
1508 * Generate a hash test vector from the given implementation. 1508 * Generate a hash test vector from the given implementation.
1509 * Assumes the buffers in 'vec' were already allocated. 1509 * Assumes the buffers in 'vec' were already allocated.
1510 */ 1510 */
1511static void generate_random_hash_testvec(struct crypto_shash *tfm, 1511static void generate_random_hash_testvec(struct shash_desc *desc,
1512 struct hash_testvec *vec, 1512 struct hash_testvec *vec,
1513 unsigned int maxkeysize, 1513 unsigned int maxkeysize,
1514 unsigned int maxdatasize, 1514 unsigned int maxdatasize,
1515 char *name, size_t max_namelen) 1515 char *name, size_t max_namelen)
1516{ 1516{
1517 SHASH_DESC_ON_STACK(desc, tfm);
1518
1519 /* Data */ 1517 /* Data */
1520 vec->psize = generate_random_length(maxdatasize); 1518 vec->psize = generate_random_length(maxdatasize);
1521 generate_random_bytes((u8 *)vec->plaintext, vec->psize); 1519 generate_random_bytes((u8 *)vec->plaintext, vec->psize);
@@ -1532,7 +1530,7 @@ static void generate_random_hash_testvec(struct crypto_shash *tfm,
1532 vec->ksize = 1 + (prandom_u32() % maxkeysize); 1530 vec->ksize = 1 + (prandom_u32() % maxkeysize);
1533 generate_random_bytes((u8 *)vec->key, vec->ksize); 1531 generate_random_bytes((u8 *)vec->key, vec->ksize);
1534 1532
1535 vec->setkey_error = crypto_shash_setkey(tfm, vec->key, 1533 vec->setkey_error = crypto_shash_setkey(desc->tfm, vec->key,
1536 vec->ksize); 1534 vec->ksize);
1537 /* If the key couldn't be set, no need to continue to digest. */ 1535 /* If the key couldn't be set, no need to continue to digest. */
1538 if (vec->setkey_error) 1536 if (vec->setkey_error)
@@ -1540,7 +1538,6 @@ static void generate_random_hash_testvec(struct crypto_shash *tfm,
1540 } 1538 }
1541 1539
1542 /* Digest */ 1540 /* Digest */
1543 desc->tfm = tfm;
1544 vec->digest_error = crypto_shash_digest(desc, vec->plaintext, 1541 vec->digest_error = crypto_shash_digest(desc, vec->plaintext,
1545 vec->psize, (u8 *)vec->digest); 1542 vec->psize, (u8 *)vec->digest);
1546done: 1543done:
@@ -1567,6 +1564,7 @@ static int test_hash_vs_generic_impl(const char *driver,
1567 const char *algname = crypto_hash_alg_common(tfm)->base.cra_name; 1564 const char *algname = crypto_hash_alg_common(tfm)->base.cra_name;
1568 char _generic_driver[CRYPTO_MAX_ALG_NAME]; 1565 char _generic_driver[CRYPTO_MAX_ALG_NAME];
1569 struct crypto_shash *generic_tfm = NULL; 1566 struct crypto_shash *generic_tfm = NULL;
1567 struct shash_desc *generic_desc = NULL;
1570 unsigned int i; 1568 unsigned int i;
1571 struct hash_testvec vec = { 0 }; 1569 struct hash_testvec vec = { 0 };
1572 char vec_name[64]; 1570 char vec_name[64];
@@ -1606,6 +1604,14 @@ static int test_hash_vs_generic_impl(const char *driver,
1606 goto out; 1604 goto out;
1607 } 1605 }
1608 1606
1607 generic_desc = kzalloc(sizeof(*desc) +
1608 crypto_shash_descsize(generic_tfm), GFP_KERNEL);
1609 if (!generic_desc) {
1610 err = -ENOMEM;
1611 goto out;
1612 }
1613 generic_desc->tfm = generic_tfm;
1614
1609 /* Check the algorithm properties for consistency. */ 1615 /* Check the algorithm properties for consistency. */
1610 1616
1611 if (digestsize != crypto_shash_digestsize(generic_tfm)) { 1617 if (digestsize != crypto_shash_digestsize(generic_tfm)) {
@@ -1637,7 +1643,7 @@ static int test_hash_vs_generic_impl(const char *driver,
1637 } 1643 }
1638 1644
1639 for (i = 0; i < fuzz_iterations * 8; i++) { 1645 for (i = 0; i < fuzz_iterations * 8; i++) {
1640 generate_random_hash_testvec(generic_tfm, &vec, 1646 generate_random_hash_testvec(generic_desc, &vec,
1641 maxkeysize, maxdatasize, 1647 maxkeysize, maxdatasize,
1642 vec_name, sizeof(vec_name)); 1648 vec_name, sizeof(vec_name));
1643 generate_random_testvec_config(cfg, cfgname, sizeof(cfgname)); 1649 generate_random_testvec_config(cfg, cfgname, sizeof(cfgname));
@@ -1655,6 +1661,7 @@ out:
1655 kfree(vec.plaintext); 1661 kfree(vec.plaintext);
1656 kfree(vec.digest); 1662 kfree(vec.digest);
1657 crypto_free_shash(generic_tfm); 1663 crypto_free_shash(generic_tfm);
1664 kzfree(generic_desc);
1658 return err; 1665 return err;
1659} 1666}
1660#else /* !CONFIG_CRYPTO_MANAGER_EXTRA_TESTS */ 1667#else /* !CONFIG_CRYPTO_MANAGER_EXTRA_TESTS */