Skip to content

Commit 2ea9150

Browse files
ebiggersherbertx
authored andcommitted
crypto: testmgr - create struct aead_extra_tests_ctx
In preparation for adding inauthentic input fuzz tests, which don't require that a generic implementation of the algorithm be available, refactor test_aead_vs_generic_impl() so that instead there's a higher-level function test_aead_extra() which initializes a struct aead_extra_tests_ctx and then calls test_aead_vs_generic_impl() with a pointer to that struct. As a bonus, this reduces stack usage. Also switch from crypto_aead_alg(tfm)->maxauthsize to crypto_aead_maxauthsize(), now that the latter is available in <crypto/aead.h>. Signed-off-by: Eric Biggers <[email protected]> Signed-off-by: Herbert Xu <[email protected]>
1 parent fd8c37c commit 2ea9150

File tree

1 file changed

+99
-71
lines changed

1 file changed

+99
-71
lines changed

crypto/testmgr.c

Lines changed: 99 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -2111,6 +2111,22 @@ static int test_aead_vec(const char *driver, int enc,
21112111
}
21122112

21132113
#ifdef CONFIG_CRYPTO_MANAGER_EXTRA_TESTS
2114+
2115+
struct aead_extra_tests_ctx {
2116+
struct aead_request *req;
2117+
struct crypto_aead *tfm;
2118+
const char *driver;
2119+
const struct alg_test_desc *test_desc;
2120+
struct cipher_test_sglists *tsgls;
2121+
unsigned int maxdatasize;
2122+
unsigned int maxkeysize;
2123+
2124+
struct aead_testvec vec;
2125+
char vec_name[64];
2126+
char cfgname[TESTVEC_CONFIG_NAMELEN];
2127+
struct testvec_config cfg;
2128+
};
2129+
21142130
/*
21152131
* Generate an AEAD test vector from the given implementation.
21162132
* Assumes the buffers in 'vec' were already allocated.
@@ -2123,7 +2139,7 @@ static void generate_random_aead_testvec(struct aead_request *req,
21232139
{
21242140
struct crypto_aead *tfm = crypto_aead_reqtfm(req);
21252141
const unsigned int ivsize = crypto_aead_ivsize(tfm);
2126-
unsigned int maxauthsize = crypto_aead_alg(tfm)->maxauthsize;
2142+
const unsigned int maxauthsize = crypto_aead_maxauthsize(tfm);
21272143
unsigned int authsize;
21282144
unsigned int total_len;
21292145
int i;
@@ -2192,35 +2208,21 @@ static void generate_random_aead_testvec(struct aead_request *req,
21922208
}
21932209

21942210
/*
2195-
* Test the AEAD algorithm represented by @req against the corresponding generic
2196-
* implementation, if one is available.
2211+
* Test the AEAD algorithm against the corresponding generic implementation, if
2212+
* one is available.
21972213
*/
2198-
static int test_aead_vs_generic_impl(const char *driver,
2199-
const struct alg_test_desc *test_desc,
2200-
struct aead_request *req,
2201-
struct cipher_test_sglists *tsgls)
2214+
static int test_aead_vs_generic_impl(struct aead_extra_tests_ctx *ctx)
22022215
{
2203-
struct crypto_aead *tfm = crypto_aead_reqtfm(req);
2204-
const unsigned int ivsize = crypto_aead_ivsize(tfm);
2205-
const unsigned int maxauthsize = crypto_aead_alg(tfm)->maxauthsize;
2206-
const unsigned int blocksize = crypto_aead_blocksize(tfm);
2207-
const unsigned int maxdatasize = (2 * PAGE_SIZE) - TESTMGR_POISON_LEN;
2216+
struct crypto_aead *tfm = ctx->tfm;
22082217
const char *algname = crypto_aead_alg(tfm)->base.cra_name;
2209-
const char *generic_driver = test_desc->generic_driver;
2218+
const char *driver = ctx->driver;
2219+
const char *generic_driver = ctx->test_desc->generic_driver;
22102220
char _generic_driver[CRYPTO_MAX_ALG_NAME];
22112221
struct crypto_aead *generic_tfm = NULL;
22122222
struct aead_request *generic_req = NULL;
2213-
unsigned int maxkeysize;
22142223
unsigned int i;
2215-
struct aead_testvec vec = { 0 };
2216-
char vec_name[64];
2217-
struct testvec_config *cfg;
2218-
char cfgname[TESTVEC_CONFIG_NAMELEN];
22192224
int err;
22202225

2221-
if (noextratests)
2222-
return 0;
2223-
22242226
if (!generic_driver) { /* Use default naming convention? */
22252227
err = build_generic_driver_name(algname, _generic_driver);
22262228
if (err)
@@ -2244,12 +2246,6 @@ static int test_aead_vs_generic_impl(const char *driver,
22442246
return err;
22452247
}
22462248

2247-
cfg = kzalloc(sizeof(*cfg), GFP_KERNEL);
2248-
if (!cfg) {
2249-
err = -ENOMEM;
2250-
goto out;
2251-
}
2252-
22532249
generic_req = aead_request_alloc(generic_tfm, GFP_KERNEL);
22542250
if (!generic_req) {
22552251
err = -ENOMEM;
@@ -2258,24 +2254,27 @@ static int test_aead_vs_generic_impl(const char *driver,
22582254

22592255
/* Check the algorithm properties for consistency. */
22602256

2261-
if (maxauthsize != crypto_aead_alg(generic_tfm)->maxauthsize) {
2257+
if (crypto_aead_maxauthsize(tfm) !=
2258+
crypto_aead_maxauthsize(generic_tfm)) {
22622259
pr_err("alg: aead: maxauthsize for %s (%u) doesn't match generic impl (%u)\n",
2263-
driver, maxauthsize,
2264-
crypto_aead_alg(generic_tfm)->maxauthsize);
2260+
driver, crypto_aead_maxauthsize(tfm),
2261+
crypto_aead_maxauthsize(generic_tfm));
22652262
err = -EINVAL;
22662263
goto out;
22672264
}
22682265

2269-
if (ivsize != crypto_aead_ivsize(generic_tfm)) {
2266+
if (crypto_aead_ivsize(tfm) != crypto_aead_ivsize(generic_tfm)) {
22702267
pr_err("alg: aead: ivsize for %s (%u) doesn't match generic impl (%u)\n",
2271-
driver, ivsize, crypto_aead_ivsize(generic_tfm));
2268+
driver, crypto_aead_ivsize(tfm),
2269+
crypto_aead_ivsize(generic_tfm));
22722270
err = -EINVAL;
22732271
goto out;
22742272
}
22752273

2276-
if (blocksize != crypto_aead_blocksize(generic_tfm)) {
2274+
if (crypto_aead_blocksize(tfm) != crypto_aead_blocksize(generic_tfm)) {
22772275
pr_err("alg: aead: blocksize for %s (%u) doesn't match generic impl (%u)\n",
2278-
driver, blocksize, crypto_aead_blocksize(generic_tfm));
2276+
driver, crypto_aead_blocksize(tfm),
2277+
crypto_aead_blocksize(generic_tfm));
22792278
err = -EINVAL;
22802279
goto out;
22812280
}
@@ -2284,57 +2283,86 @@ static int test_aead_vs_generic_impl(const char *driver,
22842283
* Now generate test vectors using the generic implementation, and test
22852284
* the other implementation against them.
22862285
*/
2287-
2288-
maxkeysize = 0;
2289-
for (i = 0; i < test_desc->suite.aead.count; i++)
2290-
maxkeysize = max_t(unsigned int, maxkeysize,
2291-
test_desc->suite.aead.vecs[i].klen);
2292-
2293-
vec.key = kmalloc(maxkeysize, GFP_KERNEL);
2294-
vec.iv = kmalloc(ivsize, GFP_KERNEL);
2295-
vec.assoc = kmalloc(maxdatasize, GFP_KERNEL);
2296-
vec.ptext = kmalloc(maxdatasize, GFP_KERNEL);
2297-
vec.ctext = kmalloc(maxdatasize, GFP_KERNEL);
2298-
if (!vec.key || !vec.iv || !vec.assoc || !vec.ptext || !vec.ctext) {
2299-
err = -ENOMEM;
2300-
goto out;
2301-
}
2302-
23032286
for (i = 0; i < fuzz_iterations * 8; i++) {
2304-
generate_random_aead_testvec(generic_req, &vec,
2305-
maxkeysize, maxdatasize,
2306-
vec_name, sizeof(vec_name));
2307-
generate_random_testvec_config(cfg, cfgname, sizeof(cfgname));
2308-
2309-
err = test_aead_vec_cfg(driver, ENCRYPT, &vec, vec_name, cfg,
2310-
req, tsgls);
2287+
generate_random_aead_testvec(generic_req, &ctx->vec,
2288+
ctx->maxkeysize, ctx->maxdatasize,
2289+
ctx->vec_name,
2290+
sizeof(ctx->vec_name));
2291+
generate_random_testvec_config(&ctx->cfg, ctx->cfgname,
2292+
sizeof(ctx->cfgname));
2293+
err = test_aead_vec_cfg(driver, ENCRYPT, &ctx->vec,
2294+
ctx->vec_name, &ctx->cfg,
2295+
ctx->req, ctx->tsgls);
23112296
if (err)
23122297
goto out;
2313-
if (vec.crypt_error == 0) {
2314-
err = test_aead_vec_cfg(driver, DECRYPT, &vec, vec_name,
2315-
cfg, req, tsgls);
2298+
if (ctx->vec.crypt_error == 0) {
2299+
err = test_aead_vec_cfg(driver, DECRYPT, &ctx->vec,
2300+
ctx->vec_name, &ctx->cfg,
2301+
ctx->req, ctx->tsgls);
23162302
if (err)
23172303
goto out;
23182304
}
23192305
cond_resched();
23202306
}
23212307
err = 0;
23222308
out:
2323-
kfree(cfg);
2324-
kfree(vec.key);
2325-
kfree(vec.iv);
2326-
kfree(vec.assoc);
2327-
kfree(vec.ptext);
2328-
kfree(vec.ctext);
23292309
crypto_free_aead(generic_tfm);
23302310
aead_request_free(generic_req);
23312311
return err;
23322312
}
2313+
2314+
static int test_aead_extra(const char *driver,
2315+
const struct alg_test_desc *test_desc,
2316+
struct aead_request *req,
2317+
struct cipher_test_sglists *tsgls)
2318+
{
2319+
struct aead_extra_tests_ctx *ctx;
2320+
unsigned int i;
2321+
int err;
2322+
2323+
if (noextratests)
2324+
return 0;
2325+
2326+
ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
2327+
if (!ctx)
2328+
return -ENOMEM;
2329+
ctx->req = req;
2330+
ctx->tfm = crypto_aead_reqtfm(req);
2331+
ctx->driver = driver;
2332+
ctx->test_desc = test_desc;
2333+
ctx->tsgls = tsgls;
2334+
ctx->maxdatasize = (2 * PAGE_SIZE) - TESTMGR_POISON_LEN;
2335+
ctx->maxkeysize = 0;
2336+
for (i = 0; i < test_desc->suite.aead.count; i++)
2337+
ctx->maxkeysize = max_t(unsigned int, ctx->maxkeysize,
2338+
test_desc->suite.aead.vecs[i].klen);
2339+
2340+
ctx->vec.key = kmalloc(ctx->maxkeysize, GFP_KERNEL);
2341+
ctx->vec.iv = kmalloc(crypto_aead_ivsize(ctx->tfm), GFP_KERNEL);
2342+
ctx->vec.assoc = kmalloc(ctx->maxdatasize, GFP_KERNEL);
2343+
ctx->vec.ptext = kmalloc(ctx->maxdatasize, GFP_KERNEL);
2344+
ctx->vec.ctext = kmalloc(ctx->maxdatasize, GFP_KERNEL);
2345+
if (!ctx->vec.key || !ctx->vec.iv || !ctx->vec.assoc ||
2346+
!ctx->vec.ptext || !ctx->vec.ctext) {
2347+
err = -ENOMEM;
2348+
goto out;
2349+
}
2350+
2351+
err = test_aead_vs_generic_impl(ctx);
2352+
out:
2353+
kfree(ctx->vec.key);
2354+
kfree(ctx->vec.iv);
2355+
kfree(ctx->vec.assoc);
2356+
kfree(ctx->vec.ptext);
2357+
kfree(ctx->vec.ctext);
2358+
kfree(ctx);
2359+
return err;
2360+
}
23332361
#else /* !CONFIG_CRYPTO_MANAGER_EXTRA_TESTS */
2334-
static int test_aead_vs_generic_impl(const char *driver,
2335-
const struct alg_test_desc *test_desc,
2336-
struct aead_request *req,
2337-
struct cipher_test_sglists *tsgls)
2362+
static int test_aead_extra(const char *driver,
2363+
const struct alg_test_desc *test_desc,
2364+
struct aead_request *req,
2365+
struct cipher_test_sglists *tsgls)
23382366
{
23392367
return 0;
23402368
}
@@ -2403,7 +2431,7 @@ static int alg_test_aead(const struct alg_test_desc *desc, const char *driver,
24032431
if (err)
24042432
goto out;
24052433

2406-
err = test_aead_vs_generic_impl(driver, desc, req, tsgls);
2434+
err = test_aead_extra(driver, desc, req, tsgls);
24072435
out:
24082436
free_cipher_test_sglists(tsgls);
24092437
aead_request_free(req);

0 commit comments

Comments
 (0)