crypto: testmgr - replace compression known answer test
authorGiovanni Cabiddu <giovanni.cabiddu@intel.com>
Wed, 19 Apr 2017 13:27:18 +0000 (14:27 +0100)
committerHerbert Xu <herbert@gondor.apana.org.au>
Fri, 21 Apr 2017 12:30:50 +0000 (20:30 +0800)
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>
crypto/testmgr.c

index cd075c7d8ee1791a481ebabe465f372580512959..8373c727752a022c570fd1113fb501f8efe94ac3 100644 (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));
        unsigned int i;
-       char *output;
+       char *output, *decomp_out;
        int ret;
        struct scatterlist src, dst;
        struct acomp_req *req;
@@ -1468,6 +1468,12 @@ static int test_acomp(struct crypto_acomp *tfm,
        if (!output)
                return -ENOMEM;
 
+       decomp_out = kmalloc(COMP_BUF_SIZE, GFP_KERNEL);
+       if (!decomp_out) {
+               kfree(output);
+               return -ENOMEM;
+       }
+
        for (i = 0; i < ctcount; i++) {
                unsigned int dlen = COMP_BUF_SIZE;
                int ilen = ctemplate[i].inlen;
@@ -1506,7 +1512,23 @@ static int test_acomp(struct crypto_acomp *tfm,
                        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",
                               i + 1, algo, req->dlen);
                        ret = -EINVAL;
@@ -1515,7 +1537,7 @@ static int test_acomp(struct crypto_acomp *tfm,
                        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",
                               i + 1, algo);
                        hexdump(output, req->dlen);
@@ -1593,6 +1615,7 @@ static int test_acomp(struct crypto_acomp *tfm,
        ret = 0;
 
 out:
+       kfree(decomp_out);
        kfree(output);
        return ret;
 }