cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

arc4.c (1116B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3 * Cryptographic API
      4 *
      5 * ARC4 Cipher Algorithm
      6 *
      7 * Jon Oberheide <jon@oberheide.org>
      8 */
      9
     10#include <crypto/arc4.h>
     11#include <linux/module.h>
     12
     13int arc4_setkey(struct arc4_ctx *ctx, const u8 *in_key, unsigned int key_len)
     14{
     15	int i, j = 0, k = 0;
     16
     17	ctx->x = 1;
     18	ctx->y = 0;
     19
     20	for (i = 0; i < 256; i++)
     21		ctx->S[i] = i;
     22
     23	for (i = 0; i < 256; i++) {
     24		u32 a = ctx->S[i];
     25
     26		j = (j + in_key[k] + a) & 0xff;
     27		ctx->S[i] = ctx->S[j];
     28		ctx->S[j] = a;
     29		if (++k >= key_len)
     30			k = 0;
     31	}
     32
     33	return 0;
     34}
     35EXPORT_SYMBOL(arc4_setkey);
     36
     37void arc4_crypt(struct arc4_ctx *ctx, u8 *out, const u8 *in, unsigned int len)
     38{
     39	u32 *const S = ctx->S;
     40	u32 x, y, a, b;
     41	u32 ty, ta, tb;
     42
     43	if (len == 0)
     44		return;
     45
     46	x = ctx->x;
     47	y = ctx->y;
     48
     49	a = S[x];
     50	y = (y + a) & 0xff;
     51	b = S[y];
     52
     53	do {
     54		S[y] = a;
     55		a = (a + b) & 0xff;
     56		S[x] = b;
     57		x = (x + 1) & 0xff;
     58		ta = S[x];
     59		ty = (y + ta) & 0xff;
     60		tb = S[ty];
     61		*out++ = *in++ ^ S[a];
     62		if (--len == 0)
     63			break;
     64		y = ty;
     65		a = ta;
     66		b = tb;
     67	} while (true);
     68
     69	ctx->x = x;
     70	ctx->y = y;
     71}
     72EXPORT_SYMBOL(arc4_crypt);
     73
     74MODULE_LICENSE("GPL");