Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp1036007imu; Fri, 11 Jan 2019 13:48:19 -0800 (PST) X-Google-Smtp-Source: ALg8bN4MwjPYhLuBFN0NnvMjPHDhsZQEGTKVPnK42jno+TL3YNVg7SHfc6GeyNybzFNccwmv/KoN X-Received: by 2002:a62:55c4:: with SMTP id j187mr16162426pfb.129.1547243299203; Fri, 11 Jan 2019 13:48:19 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1547243299; cv=none; d=google.com; s=arc-20160816; b=DITBeDSiZ4ZFRyIw8e55R0TmU1IUELj0UyeLR5FvKT52NBeHWpqeNxj494JzzqRNHX zrJrv0GQCczXS5wds5QJE1klZph34Dg/i+3KSfFRQGzgWvWqVQCrnpDpshvM0dgLkhX9 XGa0BDrCPoNkd2Jr8qrBrinXZAHL/1NgU9ePaUAv9cPweCGt2aPu7PW7cizWO3O3VQJm jQyNyzpdfoST1mJUrXX+HO+Wg7VlMXybaYaejAw33j3ZLr6RVC6NsoSVt/txm1eZlnpu 6DxDW/hdbeoznObXgW6JzQZesual0hnKqD78L5VjH/YeVZ6ZApd2Rahxe7nU7/fawuF5 J2Mw== 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=CHGj5yCaXL70PXb2Cr+fWnqCelCvg3tFnYiGfiUoQT8=; b=UTr4LMdVQT/tRf0uoLy5LSzULDxLV3WqN1udsQZDc2wh/tg3buTcCJlBeDss1KcSQi ejtkez213B27vJ43ONHvIJGAkQaAW5V49pMNQhZ0p+ubL2c85HwxyYg/PZa3FeHX2iMO YVEvILBmvAveUOMNxQNRB4sYorGajtZ2wHEhYxH+I9ru2OkrYRz+NbMIKgkJG9I5d4zk CzH5CZTjITSz8fDZI1Ep1h7vvng3FNXTBR3xdkfccao7ZyNeGaIWuwYY1JjxngllWSn4 Kztq7Sr0VqfFaaermLe4hzrRHXJrYyrYpx5z+xAQU0zx1k0sSjlPEShfSfSPTVNhHXUk IraQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@chronox.de header.s=strato-dkim-0002 header.b=VhLkQt0d; 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 135si34497092pge.572.2019.01.11.13.48.04; Fri, 11 Jan 2019 13:48:19 -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=fail header.i=@chronox.de header.s=strato-dkim-0002 header.b=VhLkQt0d; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2390493AbfAKTOS (ORCPT + 99 others); Fri, 11 Jan 2019 14:14:18 -0500 Received: from mo4-p03-ob.smtp.rzone.de ([81.169.146.175]:32571 "EHLO mo4-p03-ob.smtp.rzone.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729364AbfAKTOP (ORCPT ); Fri, 11 Jan 2019 14:14:15 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; t=1547234051; s=strato-dkim-0002; d=chronox.de; h=References:In-Reply-To:Message-ID:Date:Subject:Cc:To:From: X-RZG-CLASS-ID:X-RZG-AUTH:From:Subject:Sender; bh=CHGj5yCaXL70PXb2Cr+fWnqCelCvg3tFnYiGfiUoQT8=; b=VhLkQt0dpw/A4hD8D2J41TAHZVbsudTfa/RAFIsMcH346vq+LnvmHKsXB8U9dZV4nx y6xPWpa8KO3vn2OFyA2tL6epKKdZ64Y/ciO5tLpFhX5pd9Q6sbXovaodZybJy0Aoqr+p WyMADNu8AwqySjc0GJkLPigvF4IY2e2Hz2hll2neOhANhvdqyJH6E+8XM7grTCDxGGnq tZabZS28b8UrOa0PgaWVeUz74TLht+seUIXUnnkLMrLr8/qlLOWEb4FQYsDZSl1DY1BJ h9goM/axHhSk/CavZKGMxlM2oxmYqTvEPd9RK7Mx5u/2A2ep4vIehE6HnNB3iSMYd7+e 4OaA== X-RZG-AUTH: ":P2ERcEykfu11Y98lp/T7+hdri+uKZK8TKWEqNyiHySGSa9k9xmwdNnzGHXPaLvSbdkg=" X-RZG-CLASS-ID: mo00 Received: from positron.chronox.de by smtp.strato.de (RZmta 44.9 DYNA|AUTH) with ESMTPSA id 309bcfv0BJDWflD (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (curve secp521r1 with 521 ECDH bits, eq. 15360 bits RSA)) (Client did not present a certificate); Fri, 11 Jan 2019 20:13:32 +0100 (CET) From: Stephan =?ISO-8859-1?Q?M=FCller?= To: Eric Biggers Cc: Herbert Xu , James Bottomley , Andy Lutomirski , "Lee, Chun-Yi" , "Rafael J . Wysocki" , Pavel Machek , linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org, keyrings@vger.kernel.org, "Rafael J. Wysocki" , Chen Yu , Oliver Neukum , Ryan Chen , David Howells , Giovanni Gherdovich , Randy Dunlap , Jann Horn , Andy Lutomirski , linux-crypto@vger.kernel.org Subject: [PATCH 1/6] crypto: add template handling for RNGs Date: Fri, 11 Jan 2019 20:09:42 +0100 Message-ID: <3591906.ScSkh9qv6E@positron.chronox.de> In-Reply-To: <9733066.Vrs4h5eWcW@positron.chronox.de> References: <20190103143227.9138-1-jlee@suse.com> <20190109082103.GA8586@sol.localdomain> <9733066.Vrs4h5eWcW@positron.chronox.de> MIME-Version: 1.0 Content-Transfer-Encoding: 7Bit Content-Type: text/plain; charset="us-ascii" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Add ability to register templates for RNGs. RNGs are "meta" mechanisms using raw cipher primitives. Thus, RNGs can now be implemented as templates to allow the complete flexibility the kernel crypto API provides. Signed-off-by: Stephan Mueller --- crypto/rng.c | 44 +++++++++++++++++++++++++++++++++++ include/crypto/internal/rng.h | 26 +++++++++++++++++++++ 2 files changed, 70 insertions(+) diff --git a/crypto/rng.c b/crypto/rng.c index 33c38a72bff5..da4fd03c0acd 100644 --- a/crypto/rng.c +++ b/crypto/rng.c @@ -64,6 +64,25 @@ static int crypto_rng_init_tfm(struct crypto_tfm *tfm) return 0; } +static inline struct rng_alg *__crypto_rng_alg(struct crypto_alg *alg) +{ + return container_of(alg, struct rng_alg, base); +} + +static inline struct rng_instance *rng_instance( + struct crypto_instance *inst) +{ + return container_of(__crypto_rng_alg(&inst->alg), + struct rng_instance, alg); +} + +static void crypto_rng_free_instance(struct crypto_instance *inst) +{ + struct rng_instance *rng = rng_instance(inst); + + rng->free(rng); +} + static unsigned int seedsize(struct crypto_alg *alg) { struct rng_alg *ralg = container_of(alg, struct rng_alg, base); @@ -102,6 +121,7 @@ static void crypto_rng_show(struct seq_file *m, struct crypto_alg *alg) static const struct crypto_type crypto_rng_type = { .extsize = crypto_alg_extsize, .init_tfm = crypto_rng_init_tfm, + .free = crypto_rng_free_instance, #ifdef CONFIG_PROC_FS .show = crypto_rng_show, #endif @@ -229,5 +249,29 @@ void crypto_unregister_rngs(struct rng_alg *algs, int count) } EXPORT_SYMBOL_GPL(crypto_unregister_rngs); +static int rng_prepare_alg(struct rng_alg *alg) +{ + struct crypto_alg *base = &alg->base; + + base->cra_type = &crypto_rng_type; + base->cra_flags &= ~CRYPTO_ALG_TYPE_MASK; + base->cra_flags |= CRYPTO_ALG_TYPE_RNG; + + return 0; +} + +int rng_register_instance(struct crypto_template *tmpl, + struct rng_instance *inst) +{ + int err; + + err = rng_prepare_alg(&inst->alg); + if (err) + return err; + + return crypto_register_instance(tmpl, rng_crypto_instance(inst)); +} +EXPORT_SYMBOL_GPL(rng_register_instance); + MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("Random Number Generator"); diff --git a/include/crypto/internal/rng.h b/include/crypto/internal/rng.h index a52ef3483dd7..bfe4482ad336 100644 --- a/include/crypto/internal/rng.h +++ b/include/crypto/internal/rng.h @@ -42,4 +42,30 @@ static inline void crypto_rng_set_entropy(struct crypto_rng *tfm, crypto_rng_alg(tfm)->set_ent(tfm, data, len); } +struct rng_instance { + void (*free)(struct rng_instance *inst); + struct rng_alg alg; +}; + +static inline struct rng_instance *rng_alloc_instance( + const char *name, struct crypto_alg *alg) +{ + return crypto_alloc_instance(name, alg, + sizeof(struct rng_instance) - sizeof(*alg)); +} + +static inline struct crypto_instance *rng_crypto_instance( + struct rng_instance *inst) +{ + return container_of(&inst->alg.base, struct crypto_instance, alg); +} + +static inline void *rng_instance_ctx(struct rng_instance *inst) +{ + return crypto_instance_ctx(rng_crypto_instance(inst)); +} + +int rng_register_instance(struct crypto_template *tmpl, + struct rng_instance *inst); + #endif -- 2.20.1