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