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 <linux/module.h> 11 #include "arc4.h" 12 13 MODULE_DESCRIPTION("ARC4 Cipher Algorithm"); 14 MODULE_LICENSE("GPL"); 15 16 int 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 } 38 EXPORT_SYMBOL_GPL(cifs_arc4_setkey); 39 40 void 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 } 75 EXPORT_SYMBOL_GPL(cifs_arc4_crypt); 76