2011-06-08 17:26:00 +04:00
/*
2005-04-17 02:20:36 +04:00
* Cryptographic API
*
* ARC4 Cipher Algorithm
*
* Jon Oberheide < jon @ oberheide . org >
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 2 of the License , or
* ( at your option ) any later version .
*
*/
# include <linux/module.h>
# include <linux/init.h>
# include <linux/crypto.h>
# define ARC4_MIN_KEY_SIZE 1
# define ARC4_MAX_KEY_SIZE 256
# define ARC4_BLOCK_SIZE 1
struct arc4_ctx {
u8 S [ 256 ] ;
u8 x , y ;
} ;
2006-05-16 16:09:29 +04:00
static int arc4_set_key ( struct crypto_tfm * tfm , const u8 * in_key ,
2006-08-13 08:16:39 +04:00
unsigned int key_len )
2005-04-17 02:20:36 +04:00
{
2006-05-16 16:09:29 +04:00
struct arc4_ctx * ctx = crypto_tfm_ctx ( tfm ) ;
2005-04-17 02:20:36 +04:00
int i , j = 0 , k = 0 ;
ctx - > x = 1 ;
ctx - > y = 0 ;
2011-06-08 17:26:00 +04:00
for ( i = 0 ; i < 256 ; i + + )
2005-04-17 02:20:36 +04:00
ctx - > S [ i ] = i ;
2011-06-08 17:26:00 +04:00
for ( i = 0 ; i < 256 ; i + + ) {
2005-04-17 02:20:36 +04:00
u8 a = ctx - > S [ i ] ;
j = ( j + in_key [ k ] + a ) & 0xff ;
ctx - > S [ i ] = ctx - > S [ j ] ;
ctx - > S [ j ] = a ;
2011-06-08 17:26:00 +04:00
if ( + + k > = key_len )
2005-04-17 02:20:36 +04:00
k = 0 ;
}
return 0 ;
}
2006-05-16 16:09:29 +04:00
static void arc4_crypt ( struct crypto_tfm * tfm , u8 * out , const u8 * in )
2005-04-17 02:20:36 +04:00
{
2006-05-16 16:09:29 +04:00
struct arc4_ctx * ctx = crypto_tfm_ctx ( tfm ) ;
2005-04-17 02:20:36 +04:00
u8 * const S = ctx - > S ;
u8 x = ctx - > x ;
u8 y = ctx - > y ;
u8 a , b ;
a = S [ x ] ;
y = ( y + a ) & 0xff ;
b = S [ y ] ;
S [ x ] = b ;
S [ y ] = a ;
x = ( x + 1 ) & 0xff ;
* out + + = * in ^ S [ ( a + b ) & 0xff ] ;
ctx - > x = x ;
ctx - > y = y ;
}
static struct crypto_alg arc4_alg = {
. cra_name = " arc4 " ,
. cra_flags = CRYPTO_ALG_TYPE_CIPHER ,
. cra_blocksize = ARC4_BLOCK_SIZE ,
. cra_ctxsize = sizeof ( struct arc4_ctx ) ,
. cra_module = THIS_MODULE ,
. cra_list = LIST_HEAD_INIT ( arc4_alg . cra_list ) ,
. cra_u = { . cipher = {
. cia_min_keysize = ARC4_MIN_KEY_SIZE ,
. cia_max_keysize = ARC4_MAX_KEY_SIZE ,
2011-06-08 17:26:00 +04:00
. cia_setkey = arc4_set_key ,
. cia_encrypt = arc4_crypt ,
. cia_decrypt = arc4_crypt } }
2005-04-17 02:20:36 +04:00
} ;
static int __init arc4_init ( void )
{
return crypto_register_alg ( & arc4_alg ) ;
}
static void __exit arc4_exit ( void )
{
crypto_unregister_alg ( & arc4_alg ) ;
}
module_init ( arc4_init ) ;
module_exit ( arc4_exit ) ;
MODULE_LICENSE ( " GPL " ) ;
MODULE_DESCRIPTION ( " ARC4 Cipher Algorithm " ) ;
MODULE_AUTHOR ( " Jon Oberheide <jon@oberheide.org> " ) ;