From patchwork Tue Dec 2 08:59:34 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: George Spelvin X-Patchwork-Id: 5418521 X-Patchwork-Delegate: herbert@gondor.apana.org.au Return-Path: X-Original-To: patchwork-linux-crypto@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork2.web.kernel.org (Postfix) with ESMTP id C833EBEEA8 for ; Tue, 2 Dec 2014 08:59:41 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id DD8DD20160 for ; Tue, 2 Dec 2014 08:59:40 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 0ECC120120 for ; Tue, 2 Dec 2014 08:59:40 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753451AbaLBI7h (ORCPT ); Tue, 2 Dec 2014 03:59:37 -0500 Received: from ns.horizon.com ([71.41.210.147]:42456 "HELO ns.horizon.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with SMTP id S1752013AbaLBI7f (ORCPT ); Tue, 2 Dec 2014 03:59:35 -0500 Received: (qmail 19593 invoked by uid 1000); 2 Dec 2014 03:59:34 -0500 Date: 2 Dec 2014 03:59:34 -0500 Message-ID: <20141202085934.19592.qmail@ns.horizon.com> From: "George Spelvin" To: herbert@gondor.apana.org.au, nhorman@tuxdriver.com Subject: [PATCH 15/17] crypto: testmgr - Teach test_cprng to handle non-default seed sizes Cc: linux-crypto@vger.kernel.org, linux@horizon.com, smueller@chronox.de In-Reply-To: <20141202083314.17647.qmail@ns.horizon.com> Sender: linux-crypto-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-crypto@vger.kernel.org X-Spam-Status: No, score=-6.9 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, T_RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP crypto_rng_seedsize() isn't necessarily enough. Also (while we're at it), dynamically allocate the result (in the same buffer) as well. Signed-off-by: George Spelvin --- crypto/testmgr.c | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) Much of this gets undone in the next patch, but I wanted to show the idea. diff --git a/crypto/testmgr.c b/crypto/testmgr.c index 29a0cbdd..b81e593d 100644 --- a/crypto/testmgr.c +++ b/crypto/testmgr.c @@ -1449,9 +1449,19 @@ static int test_cprng(struct crypto_rng *tfm, struct cprng_testvec *template, const char *algo = crypto_tfm_alg_driver_name(crypto_rng_tfm(tfm)); int err = 0, i, j, seedsize; u8 *seed; - char result[32]; - seedsize = crypto_rng_seedsize(tfm); + /* + * How big a seed + result buffer do we need? Note that some + * tests use a non-default seed size, so crypto_rng_seedsize(tfm) + * isn't necessarily enough. + */ + seedsize = 0; + for (i = 0; i < tcount; i++) { + j = template[i].vlen + template[i].klen + + template[i].dtlen + template[i].rlen; + if (j > seedsize) + seedsize = j; + } seed = kmalloc(seedsize, GFP_KERNEL); if (!seed) { @@ -1461,13 +1471,16 @@ static int test_cprng(struct crypto_rng *tfm, struct cprng_testvec *template, } for (i = 0; i < tcount; i++) { - memset(result, 0, 32); memcpy(seed, template[i].v, template[i].vlen); memcpy(seed + template[i].vlen, template[i].key, template[i].klen); memcpy(seed + template[i].vlen + template[i].klen, template[i].dt, template[i].dtlen); + seedsize = template[i].vlen + template[i].klen + + template[i].dtlen + + + memset(seed+seedsize, 0, template[i].rlen); err = crypto_rng_reset(tfm, seed, seedsize); if (err) { @@ -1477,7 +1490,7 @@ static int test_cprng(struct crypto_rng *tfm, struct cprng_testvec *template, } for (j = 0; j < template[i].loops; j++) { - err = crypto_rng_get_bytes(tfm, result, + err = crypto_rng_get_bytes(tfm, seed + seedsize, template[i].rlen); if (err != template[i].rlen) { printk(KERN_ERR "alg: cprng: Failed to obtain " @@ -1488,12 +1501,12 @@ static int test_cprng(struct crypto_rng *tfm, struct cprng_testvec *template, } } - err = memcmp(result, template[i].result, + err = memcmp(seed + seedsize, template[i].result, template[i].rlen); if (err) { printk(KERN_ERR "alg: cprng: Test %d failed for %s\n", i, algo); - hexdump(result, template[i].rlen); + hexdump(seed + seedsize, template[i].rlen); err = -EINVAL; goto out; } @@ -1722,6 +1735,8 @@ static int alg_test_cprng(const struct alg_test_desc *desc, const char *driver, crypto_free_rng(rng); +printk("alg_test_cprng: testing %s: err %d\n", driver, err); + return err; }