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/export.h> 12 #include <linux/module.h> 13 14 int arc4_setkey(struct arc4_ctx *ctx, const u8 *in_key, unsigned int key_len) 15 { 16 int i, j = 0, k = 0; 17 18 ctx->x = 1; 19 ctx->y = 0; 20 21 for (i = 0; i < 256; i++) 22 ctx->S[i] = i; 23 24 for (i = 0; i < 256; i++) { 25 u32 a = ctx->S[i]; 26 27 j = (j + in_key[k] + a) & 0xff; 28 ctx->S[i] = ctx->S[j]; 29 ctx->S[j] = a; 30 if (++k >= key_len) 31 k = 0; 32 } 33 34 return 0; 35 } 36 EXPORT_SYMBOL(arc4_setkey); 37 38 void arc4_crypt(struct arc4_ctx *ctx, u8 *out, const u8 *in, unsigned int len) 39 { 40 u32 *const S = ctx->S; 41 u32 x, y, a, b; 42 u32 ty, ta, tb; 43 44 if (len == 0) 45 return; 46 47 x = ctx->x; 48 y = ctx->y; 49 50 a = S[x]; 51 y = (y + a) & 0xff; 52 b = S[y]; 53 54 do { 55 S[y] = a; 56 a = (a + b) & 0xff; 57 S[x] = b; 58 x = (x + 1) & 0xff; 59 ta = S[x]; 60 ty = (y + ta) & 0xff; 61 tb = S[ty]; 62 *out++ = *in++ ^ S[a]; 63 if (--len == 0) 64 break; 65 y = ty; 66 a = ta; 67 b = tb; 68 } while (true); 69 70 ctx->x = x; 71 ctx->y = y; 72 } 73 EXPORT_SYMBOL(arc4_crypt); 74 75 MODULE_DESCRIPTION("ARC4 Cipher Algorithm"); 76 MODULE_LICENSE("GPL"); 77