Commit 51d8d6d0 authored by Herbert Xu's avatar Herbert Xu
Browse files

crypto: cipher - Add crypto_clone_cipher



Allow simple ciphers to be cloned, if they don't have a cra_init
function.  This basically rules out those ciphers that require a
fallback.

In future simple ciphers will be eliminated, and replaced with a
linear skcipher interface.  When that happens this restriction will
disappear.

Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
Acked-by: default avatarArd Biesheuvel <ardb@kernel.org>
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent cf2eddc9
Loading
Loading
Loading
Loading
+23 −0
Original line number Diff line number Diff line
@@ -90,3 +90,26 @@ void crypto_cipher_decrypt_one(struct crypto_cipher *tfm,
	cipher_crypt_one(tfm, dst, src, false);
}
EXPORT_SYMBOL_NS_GPL(crypto_cipher_decrypt_one, CRYPTO_INTERNAL);

struct crypto_cipher *crypto_clone_cipher(struct crypto_cipher *cipher)
{
	struct crypto_tfm *tfm = crypto_cipher_tfm(cipher);
	struct crypto_alg *alg = tfm->__crt_alg;
	struct crypto_cipher *ncipher;
	struct crypto_tfm *ntfm;

	if (alg->cra_init)
		return ERR_PTR(-ENOSYS);

	ntfm = __crypto_alloc_tfm(alg, CRYPTO_ALG_TYPE_CIPHER,
				  CRYPTO_ALG_TYPE_MASK);
	if (IS_ERR(ntfm))
		return ERR_CAST(ntfm);

	ntfm->crt_flags = tfm->crt_flags;

	ncipher = __crypto_cipher_cast(ntfm);

	return ncipher;
}
EXPORT_SYMBOL_GPL(crypto_clone_cipher);
+2 −0
Original line number Diff line number Diff line
@@ -176,6 +176,8 @@ void crypto_cipher_encrypt_one(struct crypto_cipher *tfm,
void crypto_cipher_decrypt_one(struct crypto_cipher *tfm,
			       u8 *dst, const u8 *src);

struct crypto_cipher *crypto_clone_cipher(struct crypto_cipher *cipher);

struct crypto_cipher_spawn {
	struct crypto_spawn base;
};