Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit dc51f257 authored by Ard Biesheuvel's avatar Ard Biesheuvel Committed by Herbert Xu
Browse files

crypto: arc4 - refactor arc4 core code into separate library



Refactor the core rc4 handling so we can move most users to a library
interface, permitting us to drop the cipher interface entirely in a
future patch. This is part of an effort to simplify the crypto API
and improve its robustness against incorrect use.

Signed-off-by: default avatarArd Biesheuvel <ard.biesheuvel@linaro.org>
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent 192125ed
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -4229,6 +4229,7 @@ F: crypto/
F:	drivers/crypto/
F:	include/crypto/
F:	include/linux/crypto*
F:	lib/crypto/

CRYPTOGRAPHIC RANDOM NUMBER GENERATOR
M:	Neil Horman <nhorman@tuxdriver.com>
+4 −0
Original line number Diff line number Diff line
@@ -1237,9 +1237,13 @@ config CRYPTO_ANUBIS
	  <https://www.cosic.esat.kuleuven.be/nessie/reports/>
	  <http://www.larc.usp.br/~pbarreto/AnubisPage.html>

config CRYPTO_LIB_ARC4
	tristate

config CRYPTO_ARC4
	tristate "ARC4 cipher algorithm"
	select CRYPTO_BLKCIPHER
	select CRYPTO_LIB_ARC4
	help
	  ARC4 cipher algorithm.

+1 −59
Original line number Diff line number Diff line
@@ -18,33 +18,12 @@
#include <linux/init.h>
#include <linux/module.h>

struct arc4_ctx {
	u32 S[256];
	u32 x, y;
};

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);
	int i, j = 0, k = 0;

	ctx->x = 1;
	ctx->y = 0;

	for (i = 0; i < 256; i++)
		ctx->S[i] = i;

	for (i = 0; i < 256; i++) {
		u32 a = ctx->S[i];
		j = (j + in_key[k] + a) & 0xff;
		ctx->S[i] = ctx->S[j];
		ctx->S[j] = a;
		if (++k >= key_len)
			k = 0;
	}

	return 0;
	return arc4_setkey(ctx, in_key, key_len);
}

static int arc4_set_key_skcipher(struct crypto_skcipher *tfm, const u8 *in_key,
@@ -53,43 +32,6 @@ static int arc4_set_key_skcipher(struct crypto_skcipher *tfm, const u8 *in_key,
	return arc4_set_key(&tfm->base, in_key, key_len);
}

static void arc4_crypt(struct arc4_ctx *ctx, u8 *out, const u8 *in,
		       unsigned int len)
{
	u32 *const S = ctx->S;
	u32 x, y, a, b;
	u32 ty, ta, tb;

	if (len == 0)
		return;

	x = ctx->x;
	y = ctx->y;

	a = S[x];
	y = (y + a) & 0xff;
	b = S[y];

	do {
		S[y] = a;
		a = (a + b) & 0xff;
		S[x] = b;
		x = (x + 1) & 0xff;
		ta = S[x];
		ty = (y + ta) & 0xff;
		tb = S[ty];
		*out++ = *in++ ^ S[a];
		if (--len == 0)
			break;
		y = ty;
		a = ta;
		b = tb;
	} while (true);

	ctx->x = x;
	ctx->y = y;
}

static void arc4_crypt_one(struct crypto_tfm *tfm, u8 *out, const u8 *in)
{
	arc4_crypt(crypto_tfm_ctx(tfm), out, in, 1);
+10 −0
Original line number Diff line number Diff line
@@ -6,8 +6,18 @@
#ifndef _CRYPTO_ARC4_H
#define _CRYPTO_ARC4_H

#include <linux/types.h>

#define ARC4_MIN_KEY_SIZE	1
#define ARC4_MAX_KEY_SIZE	256
#define ARC4_BLOCK_SIZE		1

struct arc4_ctx {
	u32 S[256];
	u32 x, y;
};

int arc4_setkey(struct arc4_ctx *ctx, const u8 *in_key, unsigned int key_len);
void arc4_crypt(struct arc4_ctx *ctx, u8 *out, const u8 *in, unsigned int len);

#endif /* _CRYPTO_ARC4_H */
+1 −1
Original line number Diff line number Diff line
@@ -102,7 +102,7 @@ endif
obj-$(CONFIG_DEBUG_INFO_REDUCED) += debug_info.o
CFLAGS_debug_info.o += $(call cc-option, -femit-struct-debug-detailed=any)

obj-y += math/
obj-y += math/ crypto/

obj-$(CONFIG_GENERIC_IOMAP) += iomap.o
obj-$(CONFIG_GENERIC_PCI_IOMAP) += pci_iomap.o
Loading