linux/crypto/arc4.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/*
   3 * Cryptographic API
   4 *
   5 * ARC4 Cipher Algorithm
   6 *
   7 * Jon Oberheide <jon@oberheide.org>
   8 */
   9
  10#include <crypto/algapi.h>
  11#include <crypto/arc4.h>
  12#include <crypto/internal/skcipher.h>
  13#include <linux/init.h>
  14#include <linux/module.h>
  15
  16static int crypto_arc4_setkey(struct crypto_skcipher *tfm, const u8 *in_key,
  17                              unsigned int key_len)
  18{
  19        struct arc4_ctx *ctx = crypto_skcipher_ctx(tfm);
  20
  21        return arc4_setkey(ctx, in_key, key_len);
  22}
  23
  24static int crypto_arc4_crypt(struct skcipher_request *req)
  25{
  26        struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
  27        struct arc4_ctx *ctx = crypto_skcipher_ctx(tfm);
  28        struct skcipher_walk walk;
  29        int err;
  30
  31        err = skcipher_walk_virt(&walk, req, false);
  32
  33        while (walk.nbytes > 0) {
  34                arc4_crypt(ctx, walk.dst.virt.addr, walk.src.virt.addr,
  35                           walk.nbytes);
  36                err = skcipher_walk_done(&walk, 0);
  37        }
  38
  39        return err;
  40}
  41
  42static struct skcipher_alg arc4_alg = {
  43        /*
  44         * For legacy reasons, this is named "ecb(arc4)", not "arc4".
  45         * Nevertheless it's actually a stream cipher, not a block cipher.
  46         */
  47        .base.cra_name          =       "ecb(arc4)",
  48        .base.cra_driver_name   =       "ecb(arc4)-generic",
  49        .base.cra_priority      =       100,
  50        .base.cra_blocksize     =       ARC4_BLOCK_SIZE,
  51        .base.cra_ctxsize       =       sizeof(struct arc4_ctx),
  52        .base.cra_module        =       THIS_MODULE,
  53        .min_keysize            =       ARC4_MIN_KEY_SIZE,
  54        .max_keysize            =       ARC4_MAX_KEY_SIZE,
  55        .setkey                 =       crypto_arc4_setkey,
  56        .encrypt                =       crypto_arc4_crypt,
  57        .decrypt                =       crypto_arc4_crypt,
  58};
  59
  60static int __init arc4_init(void)
  61{
  62        return crypto_register_skcipher(&arc4_alg);
  63}
  64
  65static void __exit arc4_exit(void)
  66{
  67        crypto_unregister_skcipher(&arc4_alg);
  68}
  69
  70subsys_initcall(arc4_init);
  71module_exit(arc4_exit);
  72
  73MODULE_LICENSE("GPL");
  74MODULE_DESCRIPTION("ARC4 Cipher Algorithm");
  75MODULE_AUTHOR("Jon Oberheide <jon@oberheide.org>");
  76MODULE_ALIAS_CRYPTO("ecb(arc4)");
  77