diff mbox series

[v3,5/7] crypto: arc4 - remove cipher implementation

Message ID 20190611134750.2974-6-ard.biesheuvel@linaro.org
State New
Headers show
Series crypto: rc4 cleanup | expand

Commit Message

Ard Biesheuvel June 11, 2019, 1:47 p.m. UTC
There are no remaining users of the cipher implementation, and there
are no meaningful ways in which the arc4 cipher can be combined with
templates other than ECB (and the way we do provide that combination
is highly dubious to begin with).

So let's drop the arc4 cipher altogether, and only keep the ecb(arc4)
skcipher, which is used in various places in the kernel.

Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>

---
 crypto/arc4.c | 46 ++------------------
 1 file changed, 4 insertions(+), 42 deletions(-)

-- 
2.20.1

Comments

Eric Biggers June 11, 2019, 5:39 p.m. UTC | #1
On Tue, Jun 11, 2019 at 03:47:48PM +0200, Ard Biesheuvel wrote:
> There are no remaining users of the cipher implementation, and there

> are no meaningful ways in which the arc4 cipher can be combined with

> templates other than ECB (and the way we do provide that combination

> is highly dubious to begin with).

> 

> So let's drop the arc4 cipher altogether, and only keep the ecb(arc4)

> skcipher, which is used in various places in the kernel.

> 

> Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>

> ---

>  crypto/arc4.c | 46 ++------------------

>  1 file changed, 4 insertions(+), 42 deletions(-)

> 

> diff --git a/crypto/arc4.c b/crypto/arc4.c

> index 6974dba1b7b9..79a51e9f90ae 100644

> --- a/crypto/arc4.c

> +++ b/crypto/arc4.c

> @@ -13,23 +13,12 @@

>  #include <linux/init.h>

>  #include <linux/module.h>

>  

> -static int arc4_set_key(struct crypto_tfm *tfm, const u8 *in_key,

> -			unsigned int key_len)

> -{

> -	struct arc4_ctx *ctx = crypto_tfm_ctx(tfm);

> -

> -	return arc4_setkey(ctx, in_key, key_len);

> -}

> -

>  static int arc4_set_key_skcipher(struct crypto_skcipher *tfm, const u8 *in_key,

>  				 unsigned int key_len)

>  {

> -	return arc4_set_key(&tfm->base, in_key, key_len);

> -}

> +	struct arc4_ctx *ctx = crypto_tfm_ctx(&tfm->base);

>  

> -static void arc4_crypt_one(struct crypto_tfm *tfm, u8 *out, const u8 *in)

> -{

> -	arc4_crypt(crypto_tfm_ctx(tfm), out, in, 1);

> +	return arc4_setkey(ctx, in_key, key_len);

>  }

>  

>  static int ecb_arc4_crypt(struct skcipher_request *req)


Can you clean up the naming here?

	arc4_set_key_skcipher() => crypto_arc4_setkey()
	ecb_arc4_crypt() => crypto_arc4_crypt()

The current names were intended to distinguish the "skcipher" functions from the
"cipher" functions, but that will no longer be needed.

Also, crypto_arc4_setkey() should use crypto_skcipher_ctx() rather than
crypto_tfm_ctx(), now that it only handles "skcipher".

> @@ -50,23 +39,6 @@ static int ecb_arc4_crypt(struct skcipher_request *req)

>  	return err;

>  }

>  

> -static struct crypto_alg arc4_cipher = {

> -	.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_u			=	{

> -		.cipher = {

> -			.cia_min_keysize	=	ARC4_MIN_KEY_SIZE,

> -			.cia_max_keysize	=	ARC4_MAX_KEY_SIZE,

> -			.cia_setkey		=	arc4_set_key,

> -			.cia_encrypt		=	arc4_crypt_one,

> -			.cia_decrypt		=	arc4_crypt_one,

> -		},

> -	},

> -};

> -

>  static struct skcipher_alg arc4_skcipher = {


Similarly this could be renamed from arc4_skcipher to arc4_alg, now that the
skcipher algorithm doesn't need to be distinguished from the cipher algorithm.

>  	.base.cra_name		=	"ecb(arc4)",


Given the confusion this name causes, can you leave a comment?  Like:

        /*
         * For legacy reasons, this is named "ecb(arc4)", not "arc4".
         * Nevertheless it's actually a stream cipher, not a block cipher.
         */
	 .base.cra_name          =       "ecb(arc4)",


Also, due to removing the cipher algorithm, we need the following testmgr change
so that the comparison self-tests consider the generic implementation of this
algorithm to be itself rather than "ecb(arc4-generic)":

diff --git a/crypto/testmgr.c b/crypto/testmgr.c
index 658a7eeebab28..5d3eb8577605f 100644
--- a/crypto/testmgr.c
+++ b/crypto/testmgr.c
@@ -4125,6 +4125,7 @@ static const struct alg_test_desc alg_test_descs[] = {
 		}
 	}, {
 		.alg = "ecb(arc4)",
+		.generic_driver = "ecb(arc4)-generic",
 		.test = alg_test_skcipher,
 		.suite = {
 			.cipher = __VECS(arc4_tv_template)

- Eric
Eric Biggers June 12, 2019, 3:33 p.m. UTC | #2
On Tue, Jun 11, 2019 at 10:39:39AM -0700, Eric Biggers wrote:
> > -

> >  static struct skcipher_alg arc4_skcipher = {

> 

> Similarly this could be renamed from arc4_skcipher to arc4_alg, now that the

> skcipher algorithm doesn't need to be distinguished from the cipher algorithm.

> 

> >  	.base.cra_name		=	"ecb(arc4)",

> 

> Given the confusion this name causes, can you leave a comment?  Like:

> 

>         /*

>          * For legacy reasons, this is named "ecb(arc4)", not "arc4".

>          * Nevertheless it's actually a stream cipher, not a block cipher.

>          */

> 	 .base.cra_name          =       "ecb(arc4)",

> 

> 

> Also, due to removing the cipher algorithm, we need the following testmgr change

> so that the comparison self-tests consider the generic implementation of this

> algorithm to be itself rather than "ecb(arc4-generic)":

> 

> diff --git a/crypto/testmgr.c b/crypto/testmgr.c

> index 658a7eeebab28..5d3eb8577605f 100644

> --- a/crypto/testmgr.c

> +++ b/crypto/testmgr.c

> @@ -4125,6 +4125,7 @@ static const struct alg_test_desc alg_test_descs[] = {

>  		}

>  	}, {

>  		.alg = "ecb(arc4)",

> +		.generic_driver = "ecb(arc4)-generic",

>  		.test = alg_test_skcipher,

>  		.suite = {

>  			.cipher = __VECS(arc4_tv_template)

> 

> - Eric


Hi Ard, did you see these comments?  They weren't addressed in v4.  We need at
least the testmgr change, otherwise there's a warning when booting with
CONFIG_CRYPTO_MANAGER_EXTRA_TESTS=y:

[    0.542610] alg: skcipher: skipping comparison tests for ecb(arc4)-generic because ecb(arc4-generic) is unavailable

- Eric
Ard Biesheuvel June 12, 2019, 3:39 p.m. UTC | #3
On Wed, 12 Jun 2019 at 17:33, Eric Biggers <ebiggers@kernel.org> wrote:
>

> On Tue, Jun 11, 2019 at 10:39:39AM -0700, Eric Biggers wrote:

> > > -

> > >  static struct skcipher_alg arc4_skcipher = {

> >

> > Similarly this could be renamed from arc4_skcipher to arc4_alg, now that the

> > skcipher algorithm doesn't need to be distinguished from the cipher algorithm.

> >

> > >     .base.cra_name          =       "ecb(arc4)",

> >

> > Given the confusion this name causes, can you leave a comment?  Like:

> >

> >         /*

> >          * For legacy reasons, this is named "ecb(arc4)", not "arc4".

> >          * Nevertheless it's actually a stream cipher, not a block cipher.

> >          */

> >        .base.cra_name          =       "ecb(arc4)",

> >

> >

> > Also, due to removing the cipher algorithm, we need the following testmgr change

> > so that the comparison self-tests consider the generic implementation of this

> > algorithm to be itself rather than "ecb(arc4-generic)":

> >

> > diff --git a/crypto/testmgr.c b/crypto/testmgr.c

> > index 658a7eeebab28..5d3eb8577605f 100644

> > --- a/crypto/testmgr.c

> > +++ b/crypto/testmgr.c

> > @@ -4125,6 +4125,7 @@ static const struct alg_test_desc alg_test_descs[] = {

> >               }

> >       }, {

> >               .alg = "ecb(arc4)",

> > +             .generic_driver = "ecb(arc4)-generic",

> >               .test = alg_test_skcipher,

> >               .suite = {

> >                       .cipher = __VECS(arc4_tv_template)

> >

> > - Eric

>

> Hi Ard, did you see these comments?  They weren't addressed in v4.  We need at

> least the testmgr change, otherwise there's a warning when booting with

> CONFIG_CRYPTO_MANAGER_EXTRA_TESTS=y:

>

> [    0.542610] alg: skcipher: skipping comparison tests for ecb(arc4)-generic because ecb(arc4-generic) is unavailable

>


Oops, no, I didn't

I'll fix it up and resend. I forgot to add a MODULE_LICENSE() to
libarc4.ko as well, so I needed to do this anyway.
diff mbox series

Patch

diff --git a/crypto/arc4.c b/crypto/arc4.c
index 6974dba1b7b9..79a51e9f90ae 100644
--- a/crypto/arc4.c
+++ b/crypto/arc4.c
@@ -13,23 +13,12 @@ 
 #include <linux/init.h>
 #include <linux/module.h>
 
-static int arc4_set_key(struct crypto_tfm *tfm, const u8 *in_key,
-			unsigned int key_len)
-{
-	struct arc4_ctx *ctx = crypto_tfm_ctx(tfm);
-
-	return arc4_setkey(ctx, in_key, key_len);
-}
-
 static int arc4_set_key_skcipher(struct crypto_skcipher *tfm, const u8 *in_key,
 				 unsigned int key_len)
 {
-	return arc4_set_key(&tfm->base, in_key, key_len);
-}
+	struct arc4_ctx *ctx = crypto_tfm_ctx(&tfm->base);
 
-static void arc4_crypt_one(struct crypto_tfm *tfm, u8 *out, const u8 *in)
-{
-	arc4_crypt(crypto_tfm_ctx(tfm), out, in, 1);
+	return arc4_setkey(ctx, in_key, key_len);
 }
 
 static int ecb_arc4_crypt(struct skcipher_request *req)
@@ -50,23 +39,6 @@  static int ecb_arc4_crypt(struct skcipher_request *req)
 	return err;
 }
 
-static struct crypto_alg arc4_cipher = {
-	.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_u			=	{
-		.cipher = {
-			.cia_min_keysize	=	ARC4_MIN_KEY_SIZE,
-			.cia_max_keysize	=	ARC4_MAX_KEY_SIZE,
-			.cia_setkey		=	arc4_set_key,
-			.cia_encrypt		=	arc4_crypt_one,
-			.cia_decrypt		=	arc4_crypt_one,
-		},
-	},
-};
-
 static struct skcipher_alg arc4_skcipher = {
 	.base.cra_name		=	"ecb(arc4)",
 	.base.cra_priority	=	100,
@@ -82,21 +54,11 @@  static struct skcipher_alg arc4_skcipher = {
 
 static int __init arc4_init(void)
 {
-	int err;
-
-	err = crypto_register_alg(&arc4_cipher);
-	if (err)
-		return err;
-
-	err = crypto_register_skcipher(&arc4_skcipher);
-	if (err)
-		crypto_unregister_alg(&arc4_cipher);
-	return err;
+	return crypto_register_skcipher(&arc4_skcipher);
 }
 
 static void __exit arc4_exit(void)
 {
-	crypto_unregister_alg(&arc4_cipher);
 	crypto_unregister_skcipher(&arc4_skcipher);
 }
 
@@ -106,4 +68,4 @@  module_exit(arc4_exit);
 MODULE_LICENSE("GPL");
 MODULE_DESCRIPTION("ARC4 Cipher Algorithm");
 MODULE_AUTHOR("Jon Oberheide <jon@oberheide.org>");
-MODULE_ALIAS_CRYPTO("arc4");
+MODULE_ALIAS_CRYPTO("ecb(arc4)");