summaryrefslogtreecommitdiff
path: root/linux/crypto/api.c
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2017-05-05 01:49:48 -0800
committerKent Overstreet <kent.overstreet@gmail.com>2017-05-05 04:28:45 -0800
commitf9395eeca59290b210bc2b79f7bf2e9cb779cf3f (patch)
treec88c76ffdc400ce7b5f354a79574823a2dcb4074 /linux/crypto/api.c
parente004b95b88ae95cf7bb26bd7dc80c5dcf2b2664a (diff)
Update bcachefs sources to 3610542890 bcachefs: Convert to skcipher interface for chacha20
Diffstat (limited to 'linux/crypto/api.c')
-rw-r--r--linux/crypto/api.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/linux/crypto/api.c b/linux/crypto/api.c
index 2d24630e..63efee30 100644
--- a/linux/crypto/api.c
+++ b/linux/crypto/api.c
@@ -201,3 +201,36 @@ int crypto_register_alg(struct crypto_alg *alg)
return 0;
}
+
+/* skcipher: */
+
+static int crypto_skcipher_init_tfm(struct crypto_tfm *tfm)
+{
+ struct crypto_skcipher *skcipher = __crypto_skcipher_cast(tfm);
+ struct skcipher_alg *alg = crypto_skcipher_alg(skcipher);
+
+ skcipher->setkey = alg->setkey;
+ skcipher->encrypt = alg->encrypt;
+ skcipher->decrypt = alg->decrypt;
+ skcipher->ivsize = alg->ivsize;
+ skcipher->keysize = alg->max_keysize;
+
+ if (alg->init)
+ return alg->init(skcipher);
+
+ return 0;
+}
+
+static const struct crypto_type crypto_skcipher_type2 = {
+ .extsize = crypto_alg_extsize,
+ .init_tfm = crypto_skcipher_init_tfm,
+ .maskclear = ~CRYPTO_ALG_TYPE_MASK,
+ .maskset = CRYPTO_ALG_TYPE_BLKCIPHER_MASK,
+ .tfmsize = offsetof(struct crypto_skcipher, base),
+};
+
+struct crypto_skcipher *crypto_alloc_skcipher(const char *alg_name,
+ u32 type, u32 mask)
+{
+ return crypto_alloc_tfm(alg_name, &crypto_skcipher_type2, type, mask);
+}