All of lore.kernel.org
 help / color / mirror / Atom feed
From: Eric Biggers <ebiggers@kernel.org>
To: linux-crypto@vger.kernel.org, Herbert Xu <herbert@gondor.apana.org.au>
Cc: linux-kernel@vger.kernel.org, "Jason A . Donenfeld" <Jason@zx2c4.com>
Subject: [RFC/RFT PATCH 10/15] crypto: testmgr - implement random testvec_config generation
Date: Wed, 23 Jan 2019 14:49:21 -0800	[thread overview]
Message-ID: <20190123224926.250525-11-ebiggers@kernel.org> (raw)
In-Reply-To: <20190123224926.250525-1-ebiggers@kernel.org>

From: Eric Biggers <ebiggers@google.com>

Add functions that generate a random testvec_config, in preparation for
using it for randomized fuzz tests.

Signed-off-by: Eric Biggers <ebiggers@google.com>
---
 crypto/testmgr.c | 117 +++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 117 insertions(+)

diff --git a/crypto/testmgr.c b/crypto/testmgr.c
index 7c68b4101bd0..ccc0e18b13ea 100644
--- a/crypto/testmgr.c
+++ b/crypto/testmgr.c
@@ -28,6 +28,7 @@
 #include <linux/fips.h>
 #include <linux/module.h>
 #include <linux/once.h>
+#include <linux/random.h>
 #include <linux/scatterlist.h>
 #include <linux/slab.h>
 #include <linux/string.h>
@@ -603,6 +604,122 @@ static int build_cipher_test_sglists(struct cipher_test_sglists *tsgls,
 				 alignmask, dst_total_len, NULL, NULL);
 }
 
+#ifdef CONFIG_CRYPTO_MANAGER_EXTRA_TESTS
+static char *generate_random_sgl_divisions(struct test_sg_division *divs,
+					   size_t max_divs, char *p, char *end,
+					   bool gen_flushes)
+{
+	struct test_sg_division *div = divs;
+	unsigned int remaining = TEST_SG_TOTAL;
+
+	do {
+		unsigned int this_len;
+
+		if (div == &divs[max_divs - 1] || prandom_u32() % 2 != 0)
+			this_len = remaining;
+		else
+			this_len = 1 + (prandom_u32() % remaining);
+		div->proportion_of_total = this_len;
+
+		if (prandom_u32() % 4 == 0)
+			div->offset = (PAGE_SIZE - 128) + (prandom_u32() % 128);
+		else if (prandom_u32() % 2 == 0)
+			div->offset = prandom_u32() % 32;
+		else
+			div->offset = prandom_u32() % PAGE_SIZE;
+		if (prandom_u32() % 8 == 0)
+			div->offset_relative_to_alignmask = true;
+
+		div->flush_type = FLUSH_TYPE_NONE;
+		if (gen_flushes) {
+			switch (prandom_u32() % 4) {
+			case 0:
+				div->flush_type = FLUSH_TYPE_REIMPORT;
+				break;
+			case 1:
+				div->flush_type = FLUSH_TYPE_FLUSH;
+				break;
+			}
+		}
+
+		BUILD_BUG_ON(TEST_SG_TOTAL != 10000); /* for "%u.%u%%" */
+		p += scnprintf(p, end - p, "%s%u.%u%%@%s+%u%s",
+			       div->flush_type == FLUSH_TYPE_NONE ? "" :
+			       div->flush_type == FLUSH_TYPE_FLUSH ?
+			       "<flush> " : "<reimport> ",
+			       this_len / 100, this_len % 100,
+			       div->offset_relative_to_alignmask ?
+					"alignmask" : "",
+			       div->offset, this_len == remaining ? "" : ", ");
+		remaining -= this_len;
+		div++;
+	} while (remaining);
+
+	return p;
+}
+
+/* Generate a random testvec_config for fuzz testing */
+static void generate_random_testvec_config(struct testvec_config *cfg,
+					   char *name, size_t max_namelen)
+{
+	char *p = name;
+	char * const end = name + max_namelen;
+
+	memset(cfg, 0, sizeof(*cfg));
+
+	cfg->name = name;
+
+	p += scnprintf(p, end - p, "random:");
+
+	if (prandom_u32() % 2 == 0) {
+		cfg->inplace = true;
+		p += scnprintf(p, end - p, " inplace");
+	}
+
+	if (prandom_u32() % 2 == 0) {
+		cfg->req_flags |= CRYPTO_TFM_REQ_MAY_SLEEP;
+		p += scnprintf(p, end - p, " may_sleep");
+	}
+
+	switch (prandom_u32() % 4) {
+	case 0:
+		cfg->finalization_type = FINALIZATION_TYPE_FINAL;
+		p += scnprintf(p, end - p, " use_final");
+		break;
+	case 1:
+		cfg->finalization_type = FINALIZATION_TYPE_FINUP;
+		p += scnprintf(p, end - p, " use_finup");
+		break;
+	default:
+		cfg->finalization_type = FINALIZATION_TYPE_DIGEST;
+		p += scnprintf(p, end - p, " use_digest");
+		break;
+	}
+
+	p += scnprintf(p, end - p, " src_divs=[");
+	p = generate_random_sgl_divisions(cfg->src_divs,
+					  ARRAY_SIZE(cfg->src_divs), p, end,
+					  (cfg->finalization_type !=
+					   FINALIZATION_TYPE_DIGEST));
+	p += scnprintf(p, end - p, "]");
+
+	if (!cfg->inplace && prandom_u32() % 2 == 0) {
+		p += scnprintf(p, end - p, " dst_divs=[");
+		p = generate_random_sgl_divisions(cfg->dst_divs,
+						  ARRAY_SIZE(cfg->dst_divs),
+						  p, end, false);
+		p += scnprintf(p, end - p, "]");
+	}
+
+	if (prandom_u32() % 2 == 0) {
+		cfg->iv_offset = 1 + (prandom_u32() % MAX_ALGAPI_ALIGNMASK);
+		p += scnprintf(p, end - p, " iv_offset=%u", cfg->iv_offset);
+	}
+
+	WARN_ON_ONCE(!valid_testvec_config(cfg));
+}
+#endif /* CONFIG_CRYPTO_MANAGER_EXTRA_TESTS */
+
 static int ahash_guard_result(char *result, char c, int size)
 {
 	int i;
-- 
2.20.1.321.g9e740568ce-goog


  parent reply	other threads:[~2019-01-23 22:53 UTC|newest]

Thread overview: 30+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-01-23 22:49 [RFC/RFT PATCH 00/15] crypto: improved skcipher, aead, and hash tests Eric Biggers
2019-01-23 22:49 ` [RFC/RFT PATCH 01/15] crypto: aegis - fix handling chunked inputs Eric Biggers
2019-01-23 22:49 ` [RFC/RFT PATCH 02/15] crypto: morus " Eric Biggers
2019-01-31  9:05   ` Ondrej Mosnacek
2019-02-01  5:25     ` Eric Biggers
2019-01-23 22:49 ` [RFC/RFT PATCH 03/15] crypto: x86/aegis - fix handling chunked inputs and MAY_SLEEP Eric Biggers
2019-01-23 22:49 ` [RFC/RFT PATCH 04/15] crypto: x86/morus " Eric Biggers
2019-01-23 22:49 ` [RFC/RFT PATCH 05/15] crypto: x86/aesni-gcm - fix crash on empty plaintext Eric Biggers
2019-01-23 22:49 ` [RFC/RFT PATCH 06/15] crypto: ahash - fix another early termination in hash walk Eric Biggers
2019-01-23 22:49 ` [RFC/RFT PATCH 07/15] crypto: arm64/aes-neonbs - fix returning final keystream block Eric Biggers
2019-01-24 12:11   ` Ard Biesheuvel
2019-01-23 22:49 ` [RFC/RFT PATCH 08/15] crypto: testmgr - add testvec_config struct and helper functions Eric Biggers
2019-01-23 22:49 ` [RFC/RFT PATCH 09/15] crypto: testmgr - introduce CONFIG_CRYPTO_MANAGER_EXTRA_TESTS Eric Biggers
2019-02-01  5:31   ` Herbert Xu
2019-02-01  7:00     ` Eric Biggers
2019-01-23 22:49 ` Eric Biggers [this message]
2019-01-23 22:49 ` [RFC/RFT PATCH 11/15] crypto: testmgr - convert skcipher testing to use testvec_configs Eric Biggers
2019-01-24 12:36   ` Ard Biesheuvel
2019-01-24 13:14     ` Corentin Labbe
2019-01-24 14:09       ` Ard Biesheuvel
2019-01-23 22:49 ` [RFC/RFT PATCH 12/15] crypto: testmgr - convert aead " Eric Biggers
2019-01-23 22:49 ` [RFC/RFT PATCH 13/15] crypto: testmgr - convert hash " Eric Biggers
2019-01-23 22:49 ` [RFC/RFT PATCH 14/15] crypto: testmgr - check for skcipher_request corruption Eric Biggers
2019-01-23 22:49 ` [RFC/RFT PATCH 15/15] crypto: testmgr - check for aead_request corruption Eric Biggers
2019-01-24  8:48 ` [RFC/RFT PATCH 00/15] crypto: improved skcipher, aead, and hash tests Eric Biggers
2019-01-24  8:50   ` Ard Biesheuvel
2019-01-24  9:23     ` Herbert Xu
2019-01-24 10:16       ` Ard Biesheuvel
2019-01-24 10:20         ` Herbert Xu
2019-01-24 18:22       ` Eric Biggers

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20190123224926.250525-11-ebiggers@kernel.org \
    --to=ebiggers@kernel.org \
    --cc=Jason@zx2c4.com \
    --cc=herbert@gondor.apana.org.au \
    --cc=linux-crypto@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.