diff mbox series

[11/28] crypto: cipher - introduce crypto_cipher_spawn and crypto_grab_cipher()

Message ID 20191229025714.544159-12-ebiggers@kernel.org (mailing list archive)
State Superseded
Delegated to: Herbert Xu
Headers show
Series crypto: template instantiation cleanup | expand

Commit Message

Eric Biggers Dec. 29, 2019, 2:56 a.m. UTC
From: Eric Biggers <ebiggers@google.com>

Currently, "cipher" (single-block cipher) spawns are usually initialized
by using crypto_get_attr_alg() to look up the algorithm, then calling
crypto_init_spawn().  In one case, crypto_grab_spawn() is used directly.

The former way is different from how skcipher, aead, and akcipher spawns
are initialized (they use crypto_grab_*()), and for no good reason.
This difference introduces unnecessary complexity.

The crypto_grab_*() functions used to have some problems, like not
holding a reference to the algorithm and requiring the caller to
initialize spawn->base.inst.  But those problems are fixed now.

Also, the cipher spawns are not strongly typed; e.g., the API requires
that the user manually specify the flags CRYPTO_ALG_TYPE_CIPHER and
CRYPTO_ALG_TYPE_MASK.  Though the "cipher" algorithm type itself isn't
yet strongly typed, we can start by making the spawns strongly typed.

So, let's introduce a new 'struct crypto_cipher_spawn', and functions
crypto_grab_cipher() and crypto_drop_cipher() to grab and drop them.

Later patches will convert all cipher spawns to use these, then make
crypto_spawn_cipher() take 'struct crypto_cipher_spawn' as well, instead
of a bare 'struct crypto_spawn' as it currently does.

Signed-off-by: Eric Biggers <ebiggers@google.com>
---
 crypto/cipher.c         | 11 +++++++++++
 include/crypto/algapi.h | 19 +++++++++++++++++++
 2 files changed, 30 insertions(+)

Comments

Eric Biggers Jan. 1, 2020, 2:50 p.m. UTC | #1
On Sat, Dec 28, 2019 at 08:56:57PM -0600, Eric Biggers wrote:
> From: Eric Biggers <ebiggers@google.com>
> 
> Currently, "cipher" (single-block cipher) spawns are usually initialized
> by using crypto_get_attr_alg() to look up the algorithm, then calling
> crypto_init_spawn().  In one case, crypto_grab_spawn() is used directly.
> 
> The former way is different from how skcipher, aead, and akcipher spawns
> are initialized (they use crypto_grab_*()), and for no good reason.
> This difference introduces unnecessary complexity.
> 
> The crypto_grab_*() functions used to have some problems, like not
> holding a reference to the algorithm and requiring the caller to
> initialize spawn->base.inst.  But those problems are fixed now.
> 
> Also, the cipher spawns are not strongly typed; e.g., the API requires
> that the user manually specify the flags CRYPTO_ALG_TYPE_CIPHER and
> CRYPTO_ALG_TYPE_MASK.  Though the "cipher" algorithm type itself isn't
> yet strongly typed, we can start by making the spawns strongly typed.
> 
> So, let's introduce a new 'struct crypto_cipher_spawn', and functions
> crypto_grab_cipher() and crypto_drop_cipher() to grab and drop them.
> 
> Later patches will convert all cipher spawns to use these, then make
> crypto_spawn_cipher() take 'struct crypto_cipher_spawn' as well, instead
> of a bare 'struct crypto_spawn' as it currently does.
> 
> Signed-off-by: Eric Biggers <ebiggers@google.com>
> ---
>  crypto/cipher.c         | 11 +++++++++++
>  include/crypto/algapi.h | 19 +++++++++++++++++++
>  2 files changed, 30 insertions(+)
> 
> diff --git a/crypto/cipher.c b/crypto/cipher.c
> index aadd51cb7250..924d9f6575f9 100644
> --- a/crypto/cipher.c
> +++ b/crypto/cipher.c
> @@ -92,3 +92,14 @@ void crypto_cipher_decrypt_one(struct crypto_cipher *tfm,
>  	cipher_crypt_one(tfm, dst, src, false);
>  }
>  EXPORT_SYMBOL_GPL(crypto_cipher_decrypt_one);
> +
> +int crypto_grab_cipher(struct crypto_cipher_spawn *spawn,
> +		       struct crypto_instance *inst,
> +		       const char *name, u32 type, u32 mask)
> +{
> +	type &= ~CRYPTO_ALG_TYPE_MASK;
> +	type |= CRYPTO_ALG_TYPE_CIPHER;
> +	mask |= CRYPTO_ALG_TYPE_MASK;
> +	return crypto_grab_spawn(&spawn->base, inst, name, type, mask);
> +}
> +EXPORT_SYMBOL_GPL(crypto_grab_cipher);

kbuild test robot complained that calling crypto_grab_spawn() from here is not
allowed when "crypto" is built-in but "crypto_algapi" is a module.  (cipher.c is
part of "crypto"; this is different from the new-style algorithm types which
have their own modules.)  So I'll be sending out a new version which makes
crypto_grab_cipher() an inline function.

- Eric
diff mbox series

Patch

diff --git a/crypto/cipher.c b/crypto/cipher.c
index aadd51cb7250..924d9f6575f9 100644
--- a/crypto/cipher.c
+++ b/crypto/cipher.c
@@ -92,3 +92,14 @@  void crypto_cipher_decrypt_one(struct crypto_cipher *tfm,
 	cipher_crypt_one(tfm, dst, src, false);
 }
 EXPORT_SYMBOL_GPL(crypto_cipher_decrypt_one);
+
+int crypto_grab_cipher(struct crypto_cipher_spawn *spawn,
+		       struct crypto_instance *inst,
+		       const char *name, u32 type, u32 mask)
+{
+	type &= ~CRYPTO_ALG_TYPE_MASK;
+	type |= CRYPTO_ALG_TYPE_CIPHER;
+	mask |= CRYPTO_ALG_TYPE_MASK;
+	return crypto_grab_spawn(&spawn->base, inst, name, type, mask);
+}
+EXPORT_SYMBOL_GPL(crypto_grab_cipher);
diff --git a/include/crypto/algapi.h b/include/crypto/algapi.h
index 2779c8d34ba9..aad3348f60d1 100644
--- a/include/crypto/algapi.h
+++ b/include/crypto/algapi.h
@@ -208,6 +208,25 @@  static inline void *crypto_instance_ctx(struct crypto_instance *inst)
 	return inst->__ctx;
 }
 
+struct crypto_cipher_spawn {
+	struct crypto_spawn base;
+};
+
+int crypto_grab_cipher(struct crypto_cipher_spawn *spawn,
+		       struct crypto_instance *inst,
+		       const char *name, u32 type, u32 mask);
+
+static inline void crypto_drop_cipher(struct crypto_cipher_spawn *spawn)
+{
+	crypto_drop_spawn(&spawn->base);
+}
+
+static inline struct crypto_alg *crypto_spawn_cipher_alg(
+	struct crypto_cipher_spawn *spawn)
+{
+	return spawn->base.alg;
+}
+
 static inline struct crypto_cipher *crypto_spawn_cipher(
 	struct crypto_spawn *spawn)
 {