brintos

brintos / linux-shallow public Read only

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