| From e45009229be6a7fae49bdfa3459905668c0b0fb1 Mon Sep 17 00:00:00 2001 |
| From: David S. Miller <davem@davemloft.net> |
| Date: Wed, 19 May 2010 14:12:03 +1000 |
| Subject: crypto: testmgr - Add testing for async hashing and update/final |
| |
| Extend testmgr such that it tests async hash algorithms, |
| and that for both sync and async hashes it tests both |
| ->digest() and ->update()/->final() sequences. |
| |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> |
| |
| crypto/testmgr.c | 66 +++++++++++++++++++++++++++++++++++++++-------------- |
| 1 files changed, 48 insertions(+), 18 deletions(-) |
| |
| diff --git a/crypto/testmgr.c b/crypto/testmgr.c |
| index c494d76..5c8aaa0 100644 |
| |
| |
| @@ -153,8 +153,21 @@ static void testmgr_free_buf(char *buf[XBUFSIZE]) |
| free_page((unsigned long)buf[i]); |
| } |
| |
| +static int do_one_async_hash_op(struct ahash_request *req, |
| + struct tcrypt_result *tr, |
| + int ret) |
| +{ |
| + if (ret == -EINPROGRESS || ret == -EBUSY) { |
| + ret = wait_for_completion_interruptible(&tr->completion); |
| + if (!ret) |
| + ret = tr->err; |
| + INIT_COMPLETION(tr->completion); |
| + } |
| + return ret; |
| +} |
| + |
| static int test_hash(struct crypto_ahash *tfm, struct hash_testvec *template, |
| - unsigned int tcount) |
| + unsigned int tcount, bool use_digest) |
| { |
| const char *algo = crypto_tfm_alg_driver_name(crypto_ahash_tfm(tfm)); |
| unsigned int i, j, k, temp; |
| @@ -206,23 +219,36 @@ static int test_hash(struct crypto_ahash *tfm, struct hash_testvec *template, |
| } |
| |
| ahash_request_set_crypt(req, sg, result, template[i].psize); |
| - ret = crypto_ahash_digest(req); |
| - switch (ret) { |
| - case 0: |
| - break; |
| - case -EINPROGRESS: |
| - case -EBUSY: |
| - ret = wait_for_completion_interruptible( |
| - &tresult.completion); |
| - if (!ret && !(ret = tresult.err)) { |
| - INIT_COMPLETION(tresult.completion); |
| - break; |
| + if (use_digest) { |
| + ret = do_one_async_hash_op(req, &tresult, |
| + crypto_ahash_digest(req)); |
| + if (ret) { |
| + pr_err("alg: hash: digest failed on test %d " |
| + "for %s: ret=%d\n", j, algo, -ret); |
| + goto out; |
| + } |
| + } else { |
| + ret = do_one_async_hash_op(req, &tresult, |
| + crypto_ahash_init(req)); |
| + if (ret) { |
| + pr_err("alt: hash: init failed on test %d " |
| + "for %s: ret=%d\n", j, algo, -ret); |
| + goto out; |
| + } |
| + ret = do_one_async_hash_op(req, &tresult, |
| + crypto_ahash_update(req)); |
| + if (ret) { |
| + pr_err("alt: hash: update failed on test %d " |
| + "for %s: ret=%d\n", j, algo, -ret); |
| + goto out; |
| + } |
| + ret = do_one_async_hash_op(req, &tresult, |
| + crypto_ahash_final(req)); |
| + if (ret) { |
| + pr_err("alt: hash: final failed on test %d " |
| + "for %s: ret=%d\n", j, algo, -ret); |
| + goto out; |
| } |
| - /* fall through */ |
| - default: |
| - printk(KERN_ERR "alg: hash: digest failed on test %d " |
| - "for %s: ret=%d\n", j, algo, -ret); |
| - goto out; |
| } |
| |
| if (memcmp(result, template[i].digest, |
| @@ -1402,7 +1428,11 @@ static int alg_test_hash(const struct alg_test_desc *desc, const char *driver, |
| return PTR_ERR(tfm); |
| } |
| |
| - err = test_hash(tfm, desc->suite.hash.vecs, desc->suite.hash.count); |
| + err = test_hash(tfm, desc->suite.hash.vecs, |
| + desc->suite.hash.count, true); |
| + if (!err) |
| + err = test_hash(tfm, desc->suite.hash.vecs, |
| + desc->suite.hash.count, false); |
| |
| crypto_free_ahash(tfm); |
| return err; |
| -- |
| 1.7.0.1 |
| |