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