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 |
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 --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) {