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