Version:  2.6.24 2.6.25 2.6.26 2.6.27 2.6.28

Architecture:  x86 m68k m68knommu mips powerpc sh blackfin

Linux/crypto/arc4.c

  1 /* 
  2  * Cryptographic API
  3  *
  4  * ARC4 Cipher Algorithm
  5  *
  6  * Jon Oberheide <jon@oberheide.org>
  7  *
  8  * This program is free software; you can redistribute it and/or modify
  9  * it under the terms of the GNU General Public License as published by
 10  * the Free Software Foundation; either version 2 of the License, or
 11  * (at your option) any later version.
 12  *
 13  */
 14 #include <linux/module.h>
 15 #include <linux/init.h>
 16 #include <linux/crypto.h>
 17 
 18 #define ARC4_MIN_KEY_SIZE       1
 19 #define ARC4_MAX_KEY_SIZE       256
 20 #define ARC4_BLOCK_SIZE         1
 21 
 22 struct arc4_ctx {
 23         u8 S[256];
 24         u8 x, y;
 25 };
 26 
 27 static int arc4_set_key(struct crypto_tfm *tfm, const u8 *in_key,
 28                         unsigned int key_len)
 29 {
 30         struct arc4_ctx *ctx = crypto_tfm_ctx(tfm);
 31         int i, j = 0, k = 0;
 32 
 33         ctx->x = 1;
 34         ctx->y = 0;
 35 
 36         for(i = 0; i < 256; i++)
 37                 ctx->S[i] = i;
 38 
 39         for(i = 0; i < 256; i++)
 40         {
 41                 u8 a = ctx->S[i];
 42                 j = (j + in_key[k] + a) & 0xff;
 43                 ctx->S[i] = ctx->S[j];
 44                 ctx->S[j] = a;
 45                 if(++k >= key_len)
 46                         k = 0;
 47         }
 48 
 49         return 0;
 50 }
 51 
 52 static void arc4_crypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)
 53 {
 54         struct arc4_ctx *ctx = crypto_tfm_ctx(tfm);
 55 
 56         u8 *const S = ctx->S;
 57         u8 x = ctx->x;
 58         u8 y = ctx->y;
 59         u8 a, b;
 60 
 61         a = S[x];
 62         y = (y + a) & 0xff;
 63         b = S[y];
 64         S[x] = b;
 65         S[y] = a;
 66         x = (x + 1) & 0xff;
 67         *out++ = *in ^ S[(a + b) & 0xff];
 68 
 69         ctx->x = x;
 70         ctx->y = y;
 71 }
 72 
 73 static struct crypto_alg arc4_alg = {
 74         .cra_name               =       "arc4",
 75         .cra_flags              =       CRYPTO_ALG_TYPE_CIPHER,
 76         .cra_blocksize          =       ARC4_BLOCK_SIZE,
 77         .cra_ctxsize            =       sizeof(struct arc4_ctx),
 78         .cra_module             =       THIS_MODULE,
 79         .cra_list               =       LIST_HEAD_INIT(arc4_alg.cra_list),
 80         .cra_u                  =       { .cipher = {
 81         .cia_min_keysize        =       ARC4_MIN_KEY_SIZE,
 82         .cia_max_keysize        =       ARC4_MAX_KEY_SIZE,
 83         .cia_setkey             =       arc4_set_key,
 84         .cia_encrypt            =       arc4_crypt,
 85         .cia_decrypt            =       arc4_crypt } }
 86 };
 87 
 88 static int __init arc4_init(void)
 89 {
 90         return crypto_register_alg(&arc4_alg);
 91 }
 92 
 93 
 94 static void __exit arc4_exit(void)
 95 {
 96         crypto_unregister_alg(&arc4_alg);
 97 }
 98 
 99 module_init(arc4_init);
100 module_exit(arc4_exit);
101 
102 MODULE_LICENSE("GPL");
103 MODULE_DESCRIPTION("ARC4 Cipher Algorithm");
104 MODULE_AUTHOR("Jon Oberheide <jon@oberheide.org>");
105 

This page was automatically generated by LXR 0.3.1.  •  Linux is a registered trademark of Linus Torvalds