drm/panthor: Don't add write fences to the shared BOs
[drm/drm-misc.git] / fs / smb / common / cifs_arc4.c
blobdf360ca47826ab7fa62f284ec6c71017732c6455
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3 * Cryptographic API
5 * ARC4 Cipher Algorithm
7 * Jon Oberheide <jon@oberheide.org>
8 */
10 #include <linux/module.h>
11 #include "arc4.h"
13 MODULE_DESCRIPTION("ARC4 Cipher Algorithm");
14 MODULE_LICENSE("GPL");
16 int cifs_arc4_setkey(struct arc4_ctx *ctx, const u8 *in_key, unsigned int key_len)
18 int i, j = 0, k = 0;
20 ctx->x = 1;
21 ctx->y = 0;
23 for (i = 0; i < 256; i++)
24 ctx->S[i] = i;
26 for (i = 0; i < 256; i++) {
27 u32 a = ctx->S[i];
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;
36 return 0;
38 EXPORT_SYMBOL_GPL(cifs_arc4_setkey);
40 void cifs_arc4_crypt(struct arc4_ctx *ctx, u8 *out, const u8 *in, unsigned int len)
42 u32 *const S = ctx->S;
43 u32 x, y, a, b;
44 u32 ty, ta, tb;
46 if (len == 0)
47 return;
49 x = ctx->x;
50 y = ctx->y;
52 a = S[x];
53 y = (y + a) & 0xff;
54 b = S[y];
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);
72 ctx->x = x;
73 ctx->y = y;
75 EXPORT_SYMBOL_GPL(cifs_arc4_crypt);