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/kernel.h>
  15#include <linux/module.h>
  16#include <linux/sched.h>
  17
  18static int crypto_arc4_setkey(struct crypto_skcipher *tfm, const u8 *in_key,
  19                              unsigned int key_len)
  20{
  21        struct arc4_ctx *ctx = crypto_skcipher_ctx(tfm);
  22
  23        return arc4_setkey(ctx, in_key, key_len);
  24}
  25
  26static int crypto_arc4_crypt(struct skcipher_request *req)
  27{
  28        struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
  29        struct arc4_ctx *ctx = crypto_skcipher_ctx(tfm);
  30        struct skcipher_walk walk;
  31        int err;
  32
  33        err = skcipher_walk_virt(&walk, req, false);
  34
  35        while (walk.nbytes > 0) {
  36                arc4_crypt(ctx, walk.dst.virt.addr, walk.src.virt.addr,
  37                           walk.nbytes);
  38                err = skcipher_walk_done(&walk, 0);
  39        }
  40
  41        return err;
  42}
  43
  44static int crypto_arc4_init(struct crypto_skcipher *tfm)
  45{
  46        pr_warn_ratelimited("\"%s\" (%ld) uses obsolete ecb(arc4) skcipher\n",
  47                            current->comm, (unsigned long)current->pid);
  48
  49        return 0;
  50}
  51
  52static struct skcipher_alg arc4_alg = {
  53        /*
  54         * For legacy reasons, this is named "ecb(arc4)", not "arc4".
  55         * Nevertheless it's actually a stream cipher, not a block cipher.
  56         */
  57        .base.cra_name          =       "ecb(arc4)",
  58        .base.cra_driver_name   =       "ecb(arc4)-generic",
  59        .base.cra_priority      =       100,
  60        .base.cra_blocksize     =       ARC4_BLOCK_SIZE,
  61        .base.cra_ctxsize       =       sizeof(struct arc4_ctx),
  62        .base.cra_module        =       THIS_MODULE,
  63        .min_keysize            =       ARC4_MIN_KEY_SIZE,
  64        .max_keysize            =       ARC4_MAX_KEY_SIZE,
  65        .setkey                 =       crypto_arc4_setkey,
  66        .encrypt                =       crypto_arc4_crypt,
  67        .decrypt                =       crypto_arc4_crypt,
  68        .init                   =       crypto_arc4_init,
  69};
  70
  71static int __init arc4_init(void)
  72{
  73        return crypto_register_skcipher(&arc4_alg);
  74}
  75
  76static void __exit arc4_exit(void)
  77{
  78        crypto_unregister_skcipher(&arc4_alg);
  79}
  80
  81subsys_initcall(arc4_init);
  82module_exit(arc4_exit);
  83
  84MODULE_LICENSE("GPL");
  85MODULE_DESCRIPTION("ARC4 Cipher Algorithm");
  86MODULE_AUTHOR("Jon Oberheide <jon@oberheide.org>");
  87MODULE_ALIAS_CRYPTO("ecb(arc4)");
  88