Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp1320596imu; Wed, 23 Jan 2019 14:55:32 -0800 (PST) X-Google-Smtp-Source: ALg8bN5ZPgeNljWFsfwTCuhzDknyh1IEuSvtcOm6W1+GLNBkkC/BF9JKw/56d5NDj+OoM5r6o4yG X-Received: by 2002:a62:1a44:: with SMTP id a65mr4000204pfa.30.1548284132149; Wed, 23 Jan 2019 14:55:32 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1548284132; cv=none; d=google.com; s=arc-20160816; b=ydKizWKzHClovVnwWvM3ECCc57cFOLxoRedB1j8/FWReEPSuwREB1bXnmp/WstiFcv tSRdQqAtutOlxfc419OCaqSuiaOHrDOOce26TBwKiG5NQs3MXx7s9efnytKkeW1uclcf IEgskJgoIGxb9RxH+bw4pu2BBAZaPPP7Oah5ARgaPTtgrTG6gBk6uqMLIWrdz/+3jGww pW2y4zI6Gwz4LM242KzgsdR+FAkhQ+lg9HkdHZwiJRcd+83IbpX52IE3lkoeNvLwLSVv D6wB8sh1jehOuUQ1k9BFS0YjhBmcStCEL4FSXXRbqNTIKpIjAZGiz5EmUuSbGz03X4Ty 6hsg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=wE+xASAe0Tq2LpwJn5Sf+6hdQaVN6jT15JoOWunJz64=; b=pyClXwnNUQlLBxVtYen5HL8zoWGlwE+ZFM+idDd5gn2hVrc0lYyF2+maYpWsdaLPXf vodISaglhTpskdpr09vxDJm94i5vxXNA8WElRcJDE87zWyZAauUc06JumT2dxW8YhHgm HfXlF1SGL/f875a3UhVar8b4KMi2eNYdy4U0BoNA6jm5e24TLqTT81hI35saNaza1u7p k6zs/tuoprxrg7G/D87EeiOwraH3mOuReHFqQA0VbY0RElrcQp5l9w1r4LFZHryn8Mvj 0rEOGOVIrHT2cW+sOuIngDG7etqGixVio8qNqAUNWbjhKYgWgcV58p+XrmJPiPIYVU4t +Nww== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=yulEvxbq; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id w189si18556056pfb.151.2019.01.23.14.55.15; Wed, 23 Jan 2019 14:55:32 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=yulEvxbq; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727348AbfAWWxV (ORCPT + 99 others); Wed, 23 Jan 2019 17:53:21 -0500 Received: from mail.kernel.org ([198.145.29.99]:50134 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727009AbfAWWwe (ORCPT ); Wed, 23 Jan 2019 17:52:34 -0500 Received: from ebiggers-linuxstation.mtv.corp.google.com (unknown [104.132.1.77]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 380AF218B0; Wed, 23 Jan 2019 22:52:34 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1548283954; bh=rVbGDT71dBT/zRkzkJEevIBX0SIfRuicvb3fn0GBt7Y=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=yulEvxbqg1xm3zVKLZ7hBBoWsBK0gqJSP1Mwd3Rv7iQ4kUsXIqRDIi8yoyoez+QQg +6kezoO1j3yDIaT/ftSGaViFCUwo/n7ZijWrRPsDck5+NQugTcOdsWDUZkKlVHCQn2 oXrYSEhOGlu7wZCwc1Lj2THHzcGaYmcLP5d/SzDY= From: Eric Biggers To: linux-crypto@vger.kernel.org, Herbert Xu Cc: linux-kernel@vger.kernel.org, "Jason A . Donenfeld" Subject: [RFC/RFT PATCH 10/15] crypto: testmgr - implement random testvec_config generation Date: Wed, 23 Jan 2019 14:49:21 -0800 Message-Id: <20190123224926.250525-11-ebiggers@kernel.org> X-Mailer: git-send-email 2.20.1.321.g9e740568ce-goog In-Reply-To: <20190123224926.250525-1-ebiggers@kernel.org> References: <20190123224926.250525-1-ebiggers@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Eric Biggers Add functions that generate a random testvec_config, in preparation for using it for randomized fuzz tests. Signed-off-by: Eric Biggers --- 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 #include #include +#include #include #include #include @@ -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 ? + " " : " ", + 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