crypto: testmgr - replace compression known answer test

Compression implementations might return valid outputs that
do not match what specified in the test vectors.
For this reason, the testmgr might report that a compression
implementation failed the test even if the data produced
by the compressor is correct.
This implements a decompress-and-verify test for acomp
compression tests rather than a known answer test.

Signed-off-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
This commit is contained in:
Giovanni Cabiddu 2017-04-19 14:27:18 +01:00 committed by Herbert Xu
parent 3ce5bc72eb
commit a9943a0ad1

View File

@ -1458,7 +1458,7 @@ static int test_acomp(struct crypto_acomp *tfm,
{ {
const char *algo = crypto_tfm_alg_driver_name(crypto_acomp_tfm(tfm)); const char *algo = crypto_tfm_alg_driver_name(crypto_acomp_tfm(tfm));
unsigned int i; unsigned int i;
char *output; char *output, *decomp_out;
int ret; int ret;
struct scatterlist src, dst; struct scatterlist src, dst;
struct acomp_req *req; struct acomp_req *req;
@ -1468,6 +1468,12 @@ static int test_acomp(struct crypto_acomp *tfm,
if (!output) if (!output)
return -ENOMEM; return -ENOMEM;
decomp_out = kmalloc(COMP_BUF_SIZE, GFP_KERNEL);
if (!decomp_out) {
kfree(output);
return -ENOMEM;
}
for (i = 0; i < ctcount; i++) { for (i = 0; i < ctcount; i++) {
unsigned int dlen = COMP_BUF_SIZE; unsigned int dlen = COMP_BUF_SIZE;
int ilen = ctemplate[i].inlen; int ilen = ctemplate[i].inlen;
@ -1506,7 +1512,23 @@ static int test_acomp(struct crypto_acomp *tfm,
goto out; goto out;
} }
if (req->dlen != ctemplate[i].outlen) { ilen = req->dlen;
dlen = COMP_BUF_SIZE;
sg_init_one(&src, output, ilen);
sg_init_one(&dst, decomp_out, dlen);
init_completion(&result.completion);
acomp_request_set_params(req, &src, &dst, ilen, dlen);
ret = wait_async_op(&result, crypto_acomp_decompress(req));
if (ret) {
pr_err("alg: acomp: compression failed on test %d for %s: ret=%d\n",
i + 1, algo, -ret);
kfree(input_vec);
acomp_request_free(req);
goto out;
}
if (req->dlen != ctemplate[i].inlen) {
pr_err("alg: acomp: Compression test %d failed for %s: output len = %d\n", pr_err("alg: acomp: Compression test %d failed for %s: output len = %d\n",
i + 1, algo, req->dlen); i + 1, algo, req->dlen);
ret = -EINVAL; ret = -EINVAL;
@ -1515,7 +1537,7 @@ static int test_acomp(struct crypto_acomp *tfm,
goto out; goto out;
} }
if (memcmp(output, ctemplate[i].output, req->dlen)) { if (memcmp(input_vec, decomp_out, req->dlen)) {
pr_err("alg: acomp: Compression test %d failed for %s\n", pr_err("alg: acomp: Compression test %d failed for %s\n",
i + 1, algo); i + 1, algo);
hexdump(output, req->dlen); hexdump(output, req->dlen);
@ -1593,6 +1615,7 @@ static int test_acomp(struct crypto_acomp *tfm,
ret = 0; ret = 0;
out: out:
kfree(decomp_out);
kfree(output); kfree(output);
return ret; return ret;
} }