]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - crypto/chacha20_generic.c
Merge tag 'drm-intel-fixes-2017-03-22' of git://anongit.freedesktop.org/git/drm-intel...
[karo-tx-linux.git] / crypto / chacha20_generic.c
index 1cab83146e33bc4a6d6399d62ffb3e781fa36eda..8b3c04d625c3bb0ee667a8a61a0c1e4499b0b486 100644 (file)
  */
 
 #include <crypto/algapi.h>
-#include <linux/crypto.h>
-#include <linux/kernel.h>
-#include <linux/module.h>
 #include <crypto/chacha20.h>
+#include <crypto/internal/skcipher.h>
+#include <linux/module.h>
 
 static inline u32 le32_to_cpuvp(const void *p)
 {
@@ -63,10 +62,10 @@ void crypto_chacha20_init(u32 *state, struct chacha20_ctx *ctx, u8 *iv)
 }
 EXPORT_SYMBOL_GPL(crypto_chacha20_init);
 
-int crypto_chacha20_setkey(struct crypto_tfm *tfm, const u8 *key,
+int crypto_chacha20_setkey(struct crypto_skcipher *tfm, const u8 *key,
                           unsigned int keysize)
 {
-       struct chacha20_ctx *ctx = crypto_tfm_ctx(tfm);
+       struct chacha20_ctx *ctx = crypto_skcipher_ctx(tfm);
        int i;
 
        if (keysize != CHACHA20_KEY_SIZE)
@@ -79,66 +78,54 @@ int crypto_chacha20_setkey(struct crypto_tfm *tfm, const u8 *key,
 }
 EXPORT_SYMBOL_GPL(crypto_chacha20_setkey);
 
-int crypto_chacha20_crypt(struct blkcipher_desc *desc, struct scatterlist *dst,
-                         struct scatterlist *src, unsigned int nbytes)
+int crypto_chacha20_crypt(struct skcipher_request *req)
 {
-       struct blkcipher_walk walk;
+       struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
+       struct chacha20_ctx *ctx = crypto_skcipher_ctx(tfm);
+       struct skcipher_walk walk;
        u32 state[16];
        int err;
 
-       blkcipher_walk_init(&walk, dst, src, nbytes);
-       err = blkcipher_walk_virt_block(desc, &walk, CHACHA20_BLOCK_SIZE);
-
-       crypto_chacha20_init(state, crypto_blkcipher_ctx(desc->tfm), walk.iv);
+       err = skcipher_walk_virt(&walk, req, true);
 
-       while (walk.nbytes >= CHACHA20_BLOCK_SIZE) {
-               chacha20_docrypt(state, walk.dst.virt.addr, walk.src.virt.addr,
-                                rounddown(walk.nbytes, CHACHA20_BLOCK_SIZE));
-               err = blkcipher_walk_done(desc, &walk,
-                                         walk.nbytes % CHACHA20_BLOCK_SIZE);
-       }
+       crypto_chacha20_init(state, ctx, walk.iv);
 
-       if (walk.nbytes) {
+       while (walk.nbytes > 0) {
                chacha20_docrypt(state, walk.dst.virt.addr, walk.src.virt.addr,
                                 walk.nbytes);
-               err = blkcipher_walk_done(desc, &walk, 0);
+               err = skcipher_walk_done(&walk, 0);
        }
 
        return err;
 }
 EXPORT_SYMBOL_GPL(crypto_chacha20_crypt);
 
-static struct crypto_alg alg = {
-       .cra_name               = "chacha20",
-       .cra_driver_name        = "chacha20-generic",
-       .cra_priority           = 100,
-       .cra_flags              = CRYPTO_ALG_TYPE_BLKCIPHER,
-       .cra_blocksize          = 1,
-       .cra_type               = &crypto_blkcipher_type,
-       .cra_ctxsize            = sizeof(struct chacha20_ctx),
-       .cra_alignmask          = sizeof(u32) - 1,
-       .cra_module             = THIS_MODULE,
-       .cra_u                  = {
-               .blkcipher = {
-                       .min_keysize    = CHACHA20_KEY_SIZE,
-                       .max_keysize    = CHACHA20_KEY_SIZE,
-                       .ivsize         = CHACHA20_IV_SIZE,
-                       .geniv          = "seqiv",
-                       .setkey         = crypto_chacha20_setkey,
-                       .encrypt        = crypto_chacha20_crypt,
-                       .decrypt        = crypto_chacha20_crypt,
-               },
-       },
+static struct skcipher_alg alg = {
+       .base.cra_name          = "chacha20",
+       .base.cra_driver_name   = "chacha20-generic",
+       .base.cra_priority      = 100,
+       .base.cra_blocksize     = 1,
+       .base.cra_ctxsize       = sizeof(struct chacha20_ctx),
+       .base.cra_alignmask     = sizeof(u32) - 1,
+       .base.cra_module        = THIS_MODULE,
+
+       .min_keysize            = CHACHA20_KEY_SIZE,
+       .max_keysize            = CHACHA20_KEY_SIZE,
+       .ivsize                 = CHACHA20_IV_SIZE,
+       .chunksize              = CHACHA20_BLOCK_SIZE,
+       .setkey                 = crypto_chacha20_setkey,
+       .encrypt                = crypto_chacha20_crypt,
+       .decrypt                = crypto_chacha20_crypt,
 };
 
 static int __init chacha20_generic_mod_init(void)
 {
-       return crypto_register_alg(&alg);
+       return crypto_register_skcipher(&alg);
 }
 
 static void __exit chacha20_generic_mod_fini(void)
 {
-       crypto_unregister_alg(&alg);
+       crypto_unregister_skcipher(&alg);
 }
 
 module_init(chacha20_generic_mod_init);