2019-05-27 09:55:01 +03:00
// SPDX-License-Identifier: GPL-2.0-or-later
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 >
*/
2012-06-09 19:25:40 +04:00
# include <crypto/algapi.h>
2019-02-08 16:50:08 +03:00
# include <crypto/arc4.h>
2019-01-04 07:16:23 +03:00
# include <crypto/internal/skcipher.h>
# include <linux/init.h>
# include <linux/module.h>
2005-04-17 02:20:36 +04:00
2019-06-12 19:19:57 +03:00
static int crypto_arc4_setkey ( struct crypto_skcipher * tfm , const u8 * in_key ,
unsigned int key_len )
2019-01-04 07:16:23 +03:00
{
2019-06-12 19:19:57 +03:00
struct arc4_ctx * ctx = crypto_skcipher_ctx ( tfm ) ;
2005-04-17 02:20:36 +04:00
2019-06-12 19:19:53 +03:00
return arc4_setkey ( ctx , in_key , key_len ) ;
2012-06-09 19:25:40 +04:00
}
2019-06-12 19:19:57 +03:00
static int crypto_arc4_crypt ( struct skcipher_request * req )
2012-06-09 19:25:40 +04:00
{
2019-01-04 07:16:23 +03:00
struct crypto_skcipher * tfm = crypto_skcipher_reqtfm ( req ) ;
struct arc4_ctx * ctx = crypto_skcipher_ctx ( tfm ) ;
struct skcipher_walk walk ;
2012-06-09 19:25:40 +04:00
int err ;
2019-01-04 07:16:23 +03:00
err = skcipher_walk_virt ( & walk , req , false ) ;
2012-06-09 19:25:40 +04:00
while ( walk . nbytes > 0 ) {
2019-01-04 07:16:23 +03:00
arc4_crypt ( ctx , walk . dst . virt . addr , walk . src . virt . addr ,
walk . nbytes ) ;
err = skcipher_walk_done ( & walk , 0 ) ;
2012-06-09 19:25:40 +04:00
}
return err ;
}
2019-06-12 19:19:57 +03:00
static struct skcipher_alg arc4_alg = {
/*
* For legacy reasons , this is named " ecb(arc4) " , not " arc4 " .
* Nevertheless it ' s actually a stream cipher , not a block cipher .
*/
2019-01-04 07:16:23 +03:00
. base . cra_name = " ecb(arc4) " ,
2019-06-03 08:40:57 +03:00
. base . cra_driver_name = " ecb(arc4)-generic " ,
2019-01-04 07:16:23 +03:00
. base . cra_priority = 100 ,
. base . cra_blocksize = ARC4_BLOCK_SIZE ,
. base . cra_ctxsize = sizeof ( struct arc4_ctx ) ,
. base . cra_module = THIS_MODULE ,
. min_keysize = ARC4_MIN_KEY_SIZE ,
. max_keysize = ARC4_MAX_KEY_SIZE ,
2019-06-12 19:19:57 +03:00
. setkey = crypto_arc4_setkey ,
. encrypt = crypto_arc4_crypt ,
. decrypt = crypto_arc4_crypt ,
2019-01-04 07:16:23 +03:00
} ;
2005-04-17 02:20:36 +04:00
static int __init arc4_init ( void )
{
2019-06-12 19:19:57 +03:00
return crypto_register_skcipher ( & arc4_alg ) ;
2005-04-17 02:20:36 +04:00
}
static void __exit arc4_exit ( void )
{
2019-06-12 19:19:57 +03:00
crypto_unregister_skcipher ( & arc4_alg ) ;
2005-04-17 02:20:36 +04:00
}
2019-04-12 07:57:42 +03:00
subsys_initcall ( arc4_init ) ;
2005-04-17 02:20:36 +04:00
module_exit ( arc4_exit ) ;
MODULE_LICENSE ( " GPL " ) ;
MODULE_DESCRIPTION ( " ARC4 Cipher Algorithm " ) ;
MODULE_AUTHOR ( " Jon Oberheide <jon@oberheide.org> " ) ;
2019-06-12 19:19:57 +03:00
MODULE_ALIAS_CRYPTO ( " ecb(arc4) " ) ;