]> Git Repo - J-linux.git/blob - fs/smb/common/cifs_arc4.c
Merge tag 'vfs-6.13-rc7.fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs
[J-linux.git] / fs / smb / common / cifs_arc4.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * Cryptographic API
4  *
5  * ARC4 Cipher Algorithm
6  *
7  * Jon Oberheide <[email protected]>
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);
This page took 0.029333 seconds and 4 git commands to generate.