Merge branch 'cpufreq/qcom-updates' into cpufreq/arm/linux-next
[linux-2.6-block.git] / crypto / des_generic.c
CommitLineData
2874c5fd 1// SPDX-License-Identifier: GPL-2.0-or-later
e1d5dea1 2/*
1da177e4
LT
3 * Cryptographic API.
4 *
5 * DES & Triple DES EDE Cipher Algorithms.
6 *
e1d5dea1 7 * Copyright (c) 2005 Dag Arne Osvik <da@osvik.no>
1da177e4 8 */
e1d5dea1 9
06ace7a9 10#include <asm/byteorder.h>
e1d5dea1 11#include <linux/bitops.h>
1da177e4
LT
12#include <linux/init.h>
13#include <linux/module.h>
1da177e4 14#include <linux/errno.h>
1da177e4 15#include <linux/crypto.h>
06ace7a9 16#include <linux/types.h>
1da177e4 17
16d004a2 18#include <crypto/des.h>
1da177e4 19
e1d5dea1
DAO
20#define ROL(x, r) ((x) = rol32((x), (r)))
21#define ROR(x, r) ((x) = ror32((x), (r)))
1da177e4
LT
22
23struct des_ctx {
1da177e4
LT
24 u32 expkey[DES_EXPKEY_WORDS];
25};
26
27struct des3_ede_ctx {
1da177e4
LT
28 u32 expkey[DES3_EDE_EXPKEY_WORDS];
29};
30
e1d5dea1
DAO
31/* Lookup tables for key expansion */
32
33static const u8 pc1[256] = {
34 0x00, 0x00, 0x40, 0x04, 0x10, 0x10, 0x50, 0x14,
35 0x04, 0x40, 0x44, 0x44, 0x14, 0x50, 0x54, 0x54,
36 0x02, 0x02, 0x42, 0x06, 0x12, 0x12, 0x52, 0x16,
37 0x06, 0x42, 0x46, 0x46, 0x16, 0x52, 0x56, 0x56,
38 0x80, 0x08, 0xc0, 0x0c, 0x90, 0x18, 0xd0, 0x1c,
39 0x84, 0x48, 0xc4, 0x4c, 0x94, 0x58, 0xd4, 0x5c,
40 0x82, 0x0a, 0xc2, 0x0e, 0x92, 0x1a, 0xd2, 0x1e,
41 0x86, 0x4a, 0xc6, 0x4e, 0x96, 0x5a, 0xd6, 0x5e,
42 0x20, 0x20, 0x60, 0x24, 0x30, 0x30, 0x70, 0x34,
43 0x24, 0x60, 0x64, 0x64, 0x34, 0x70, 0x74, 0x74,
44 0x22, 0x22, 0x62, 0x26, 0x32, 0x32, 0x72, 0x36,
45 0x26, 0x62, 0x66, 0x66, 0x36, 0x72, 0x76, 0x76,
46 0xa0, 0x28, 0xe0, 0x2c, 0xb0, 0x38, 0xf0, 0x3c,
47 0xa4, 0x68, 0xe4, 0x6c, 0xb4, 0x78, 0xf4, 0x7c,
48 0xa2, 0x2a, 0xe2, 0x2e, 0xb2, 0x3a, 0xf2, 0x3e,
49 0xa6, 0x6a, 0xe6, 0x6e, 0xb6, 0x7a, 0xf6, 0x7e,
50 0x08, 0x80, 0x48, 0x84, 0x18, 0x90, 0x58, 0x94,
51 0x0c, 0xc0, 0x4c, 0xc4, 0x1c, 0xd0, 0x5c, 0xd4,
52 0x0a, 0x82, 0x4a, 0x86, 0x1a, 0x92, 0x5a, 0x96,
53 0x0e, 0xc2, 0x4e, 0xc6, 0x1e, 0xd2, 0x5e, 0xd6,
54 0x88, 0x88, 0xc8, 0x8c, 0x98, 0x98, 0xd8, 0x9c,
55 0x8c, 0xc8, 0xcc, 0xcc, 0x9c, 0xd8, 0xdc, 0xdc,
56 0x8a, 0x8a, 0xca, 0x8e, 0x9a, 0x9a, 0xda, 0x9e,
57 0x8e, 0xca, 0xce, 0xce, 0x9e, 0xda, 0xde, 0xde,
58 0x28, 0xa0, 0x68, 0xa4, 0x38, 0xb0, 0x78, 0xb4,
59 0x2c, 0xe0, 0x6c, 0xe4, 0x3c, 0xf0, 0x7c, 0xf4,
60 0x2a, 0xa2, 0x6a, 0xa6, 0x3a, 0xb2, 0x7a, 0xb6,
61 0x2e, 0xe2, 0x6e, 0xe6, 0x3e, 0xf2, 0x7e, 0xf6,
62 0xa8, 0xa8, 0xe8, 0xac, 0xb8, 0xb8, 0xf8, 0xbc,
63 0xac, 0xe8, 0xec, 0xec, 0xbc, 0xf8, 0xfc, 0xfc,
64 0xaa, 0xaa, 0xea, 0xae, 0xba, 0xba, 0xfa, 0xbe,
65 0xae, 0xea, 0xee, 0xee, 0xbe, 0xfa, 0xfe, 0xfe
1da177e4
LT
66};
67
e1d5dea1
DAO
68static const u8 rs[256] = {
69 0x00, 0x00, 0x80, 0x80, 0x02, 0x02, 0x82, 0x82,
70 0x04, 0x04, 0x84, 0x84, 0x06, 0x06, 0x86, 0x86,
71 0x08, 0x08, 0x88, 0x88, 0x0a, 0x0a, 0x8a, 0x8a,
72 0x0c, 0x0c, 0x8c, 0x8c, 0x0e, 0x0e, 0x8e, 0x8e,
73 0x10, 0x10, 0x90, 0x90, 0x12, 0x12, 0x92, 0x92,
74 0x14, 0x14, 0x94, 0x94, 0x16, 0x16, 0x96, 0x96,
75 0x18, 0x18, 0x98, 0x98, 0x1a, 0x1a, 0x9a, 0x9a,
76 0x1c, 0x1c, 0x9c, 0x9c, 0x1e, 0x1e, 0x9e, 0x9e,
77 0x20, 0x20, 0xa0, 0xa0, 0x22, 0x22, 0xa2, 0xa2,
78 0x24, 0x24, 0xa4, 0xa4, 0x26, 0x26, 0xa6, 0xa6,
79 0x28, 0x28, 0xa8, 0xa8, 0x2a, 0x2a, 0xaa, 0xaa,
80 0x2c, 0x2c, 0xac, 0xac, 0x2e, 0x2e, 0xae, 0xae,
81 0x30, 0x30, 0xb0, 0xb0, 0x32, 0x32, 0xb2, 0xb2,
82 0x34, 0x34, 0xb4, 0xb4, 0x36, 0x36, 0xb6, 0xb6,
83 0x38, 0x38, 0xb8, 0xb8, 0x3a, 0x3a, 0xba, 0xba,
84 0x3c, 0x3c, 0xbc, 0xbc, 0x3e, 0x3e, 0xbe, 0xbe,
85 0x40, 0x40, 0xc0, 0xc0, 0x42, 0x42, 0xc2, 0xc2,
86 0x44, 0x44, 0xc4, 0xc4, 0x46, 0x46, 0xc6, 0xc6,
87 0x48, 0x48, 0xc8, 0xc8, 0x4a, 0x4a, 0xca, 0xca,
88 0x4c, 0x4c, 0xcc, 0xcc, 0x4e, 0x4e, 0xce, 0xce,
89 0x50, 0x50, 0xd0, 0xd0, 0x52, 0x52, 0xd2, 0xd2,
90 0x54, 0x54, 0xd4, 0xd4, 0x56, 0x56, 0xd6, 0xd6,
91 0x58, 0x58, 0xd8, 0xd8, 0x5a, 0x5a, 0xda, 0xda,
92 0x5c, 0x5c, 0xdc, 0xdc, 0x5e, 0x5e, 0xde, 0xde,
93 0x60, 0x60, 0xe0, 0xe0, 0x62, 0x62, 0xe2, 0xe2,
94 0x64, 0x64, 0xe4, 0xe4, 0x66, 0x66, 0xe6, 0xe6,
95 0x68, 0x68, 0xe8, 0xe8, 0x6a, 0x6a, 0xea, 0xea,
96 0x6c, 0x6c, 0xec, 0xec, 0x6e, 0x6e, 0xee, 0xee,
97 0x70, 0x70, 0xf0, 0xf0, 0x72, 0x72, 0xf2, 0xf2,
98 0x74, 0x74, 0xf4, 0xf4, 0x76, 0x76, 0xf6, 0xf6,
99 0x78, 0x78, 0xf8, 0xf8, 0x7a, 0x7a, 0xfa, 0xfa,
100 0x7c, 0x7c, 0xfc, 0xfc, 0x7e, 0x7e, 0xfe, 0xfe
1da177e4
LT
101};
102
e1d5dea1
DAO
103static const u32 pc2[1024] = {
104 0x00000000, 0x00000000, 0x00000000, 0x00000000,
105 0x00040000, 0x00000000, 0x04000000, 0x00100000,
106 0x00400000, 0x00000008, 0x00000800, 0x40000000,
107 0x00440000, 0x00000008, 0x04000800, 0x40100000,
108 0x00000400, 0x00000020, 0x08000000, 0x00000100,
109 0x00040400, 0x00000020, 0x0c000000, 0x00100100,
110 0x00400400, 0x00000028, 0x08000800, 0x40000100,
111 0x00440400, 0x00000028, 0x0c000800, 0x40100100,
112 0x80000000, 0x00000010, 0x00000000, 0x00800000,
113 0x80040000, 0x00000010, 0x04000000, 0x00900000,
114 0x80400000, 0x00000018, 0x00000800, 0x40800000,
115 0x80440000, 0x00000018, 0x04000800, 0x40900000,
116 0x80000400, 0x00000030, 0x08000000, 0x00800100,
117 0x80040400, 0x00000030, 0x0c000000, 0x00900100,
118 0x80400400, 0x00000038, 0x08000800, 0x40800100,
119 0x80440400, 0x00000038, 0x0c000800, 0x40900100,
120 0x10000000, 0x00000000, 0x00200000, 0x00001000,
121 0x10040000, 0x00000000, 0x04200000, 0x00101000,
122 0x10400000, 0x00000008, 0x00200800, 0x40001000,
123 0x10440000, 0x00000008, 0x04200800, 0x40101000,
124 0x10000400, 0x00000020, 0x08200000, 0x00001100,
125 0x10040400, 0x00000020, 0x0c200000, 0x00101100,
126 0x10400400, 0x00000028, 0x08200800, 0x40001100,
127 0x10440400, 0x00000028, 0x0c200800, 0x40101100,
128 0x90000000, 0x00000010, 0x00200000, 0x00801000,
129 0x90040000, 0x00000010, 0x04200000, 0x00901000,
130 0x90400000, 0x00000018, 0x00200800, 0x40801000,
131 0x90440000, 0x00000018, 0x04200800, 0x40901000,
132 0x90000400, 0x00000030, 0x08200000, 0x00801100,
133 0x90040400, 0x00000030, 0x0c200000, 0x00901100,
134 0x90400400, 0x00000038, 0x08200800, 0x40801100,
135 0x90440400, 0x00000038, 0x0c200800, 0x40901100,
136 0x00000200, 0x00080000, 0x00000000, 0x00000004,
137 0x00040200, 0x00080000, 0x04000000, 0x00100004,
138 0x00400200, 0x00080008, 0x00000800, 0x40000004,
139 0x00440200, 0x00080008, 0x04000800, 0x40100004,
140 0x00000600, 0x00080020, 0x08000000, 0x00000104,
141 0x00040600, 0x00080020, 0x0c000000, 0x00100104,
142 0x00400600, 0x00080028, 0x08000800, 0x40000104,
143 0x00440600, 0x00080028, 0x0c000800, 0x40100104,
144 0x80000200, 0x00080010, 0x00000000, 0x00800004,
145 0x80040200, 0x00080010, 0x04000000, 0x00900004,
146 0x80400200, 0x00080018, 0x00000800, 0x40800004,
147 0x80440200, 0x00080018, 0x04000800, 0x40900004,
148 0x80000600, 0x00080030, 0x08000000, 0x00800104,
149 0x80040600, 0x00080030, 0x0c000000, 0x00900104,
150 0x80400600, 0x00080038, 0x08000800, 0x40800104,
151 0x80440600, 0x00080038, 0x0c000800, 0x40900104,
152 0x10000200, 0x00080000, 0x00200000, 0x00001004,
153 0x10040200, 0x00080000, 0x04200000, 0x00101004,
154 0x10400200, 0x00080008, 0x00200800, 0x40001004,
155 0x10440200, 0x00080008, 0x04200800, 0x40101004,
156 0x10000600, 0x00080020, 0x08200000, 0x00001104,
157 0x10040600, 0x00080020, 0x0c200000, 0x00101104,
158 0x10400600, 0x00080028, 0x08200800, 0x40001104,
159 0x10440600, 0x00080028, 0x0c200800, 0x40101104,
160 0x90000200, 0x00080010, 0x00200000, 0x00801004,
161 0x90040200, 0x00080010, 0x04200000, 0x00901004,
162 0x90400200, 0x00080018, 0x00200800, 0x40801004,
163 0x90440200, 0x00080018, 0x04200800, 0x40901004,
164 0x90000600, 0x00080030, 0x08200000, 0x00801104,
165 0x90040600, 0x00080030, 0x0c200000, 0x00901104,
166 0x90400600, 0x00080038, 0x08200800, 0x40801104,
167 0x90440600, 0x00080038, 0x0c200800, 0x40901104,
168 0x00000002, 0x00002000, 0x20000000, 0x00000001,
169 0x00040002, 0x00002000, 0x24000000, 0x00100001,
170 0x00400002, 0x00002008, 0x20000800, 0x40000001,
171 0x00440002, 0x00002008, 0x24000800, 0x40100001,
172 0x00000402, 0x00002020, 0x28000000, 0x00000101,
173 0x00040402, 0x00002020, 0x2c000000, 0x00100101,
174 0x00400402, 0x00002028, 0x28000800, 0x40000101,
175 0x00440402, 0x00002028, 0x2c000800, 0x40100101,
176 0x80000002, 0x00002010, 0x20000000, 0x00800001,
177 0x80040002, 0x00002010, 0x24000000, 0x00900001,
178 0x80400002, 0x00002018, 0x20000800, 0x40800001,
179 0x80440002, 0x00002018, 0x24000800, 0x40900001,
180 0x80000402, 0x00002030, 0x28000000, 0x00800101,
181 0x80040402, 0x00002030, 0x2c000000, 0x00900101,
182 0x80400402, 0x00002038, 0x28000800, 0x40800101,
183 0x80440402, 0x00002038, 0x2c000800, 0x40900101,
184 0x10000002, 0x00002000, 0x20200000, 0x00001001,
185 0x10040002, 0x00002000, 0x24200000, 0x00101001,
186 0x10400002, 0x00002008, 0x20200800, 0x40001001,
187 0x10440002, 0x00002008, 0x24200800, 0x40101001,
188 0x10000402, 0x00002020, 0x28200000, 0x00001101,
189 0x10040402, 0x00002020, 0x2c200000, 0x00101101,
190 0x10400402, 0x00002028, 0x28200800, 0x40001101,
191 0x10440402, 0x00002028, 0x2c200800, 0x40101101,
192 0x90000002, 0x00002010, 0x20200000, 0x00801001,
193 0x90040002, 0x00002010, 0x24200000, 0x00901001,
194 0x90400002, 0x00002018, 0x20200800, 0x40801001,
195 0x90440002, 0x00002018, 0x24200800, 0x40901001,
196 0x90000402, 0x00002030, 0x28200000, 0x00801101,
197 0x90040402, 0x00002030, 0x2c200000, 0x00901101,
198 0x90400402, 0x00002038, 0x28200800, 0x40801101,
199 0x90440402, 0x00002038, 0x2c200800, 0x40901101,
200 0x00000202, 0x00082000, 0x20000000, 0x00000005,
201 0x00040202, 0x00082000, 0x24000000, 0x00100005,
202 0x00400202, 0x00082008, 0x20000800, 0x40000005,
203 0x00440202, 0x00082008, 0x24000800, 0x40100005,
204 0x00000602, 0x00082020, 0x28000000, 0x00000105,
205 0x00040602, 0x00082020, 0x2c000000, 0x00100105,
206 0x00400602, 0x00082028, 0x28000800, 0x40000105,
207 0x00440602, 0x00082028, 0x2c000800, 0x40100105,
208 0x80000202, 0x00082010, 0x20000000, 0x00800005,
209 0x80040202, 0x00082010, 0x24000000, 0x00900005,
210 0x80400202, 0x00082018, 0x20000800, 0x40800005,
211 0x80440202, 0x00082018, 0x24000800, 0x40900005,
212 0x80000602, 0x00082030, 0x28000000, 0x00800105,
213 0x80040602, 0x00082030, 0x2c000000, 0x00900105,
214 0x80400602, 0x00082038, 0x28000800, 0x40800105,
215 0x80440602, 0x00082038, 0x2c000800, 0x40900105,
216 0x10000202, 0x00082000, 0x20200000, 0x00001005,
217 0x10040202, 0x00082000, 0x24200000, 0x00101005,
218 0x10400202, 0x00082008, 0x20200800, 0x40001005,
219 0x10440202, 0x00082008, 0x24200800, 0x40101005,
220 0x10000602, 0x00082020, 0x28200000, 0x00001105,
221 0x10040602, 0x00082020, 0x2c200000, 0x00101105,
222 0x10400602, 0x00082028, 0x28200800, 0x40001105,
223 0x10440602, 0x00082028, 0x2c200800, 0x40101105,
224 0x90000202, 0x00082010, 0x20200000, 0x00801005,
225 0x90040202, 0x00082010, 0x24200000, 0x00901005,
226 0x90400202, 0x00082018, 0x20200800, 0x40801005,
227 0x90440202, 0x00082018, 0x24200800, 0x40901005,
228 0x90000602, 0x00082030, 0x28200000, 0x00801105,
229 0x90040602, 0x00082030, 0x2c200000, 0x00901105,
230 0x90400602, 0x00082038, 0x28200800, 0x40801105,
231 0x90440602, 0x00082038, 0x2c200800, 0x40901105,
232
233 0x00000000, 0x00000000, 0x00000000, 0x00000000,
234 0x00000000, 0x00000008, 0x00080000, 0x10000000,
235 0x02000000, 0x00000000, 0x00000080, 0x00001000,
236 0x02000000, 0x00000008, 0x00080080, 0x10001000,
237 0x00004000, 0x00000000, 0x00000040, 0x00040000,
238 0x00004000, 0x00000008, 0x00080040, 0x10040000,
239 0x02004000, 0x00000000, 0x000000c0, 0x00041000,
240 0x02004000, 0x00000008, 0x000800c0, 0x10041000,
241 0x00020000, 0x00008000, 0x08000000, 0x00200000,
242 0x00020000, 0x00008008, 0x08080000, 0x10200000,
243 0x02020000, 0x00008000, 0x08000080, 0x00201000,
244 0x02020000, 0x00008008, 0x08080080, 0x10201000,
245 0x00024000, 0x00008000, 0x08000040, 0x00240000,
246 0x00024000, 0x00008008, 0x08080040, 0x10240000,
247 0x02024000, 0x00008000, 0x080000c0, 0x00241000,
248 0x02024000, 0x00008008, 0x080800c0, 0x10241000,
249 0x00000000, 0x01000000, 0x00002000, 0x00000020,
250 0x00000000, 0x01000008, 0x00082000, 0x10000020,
251 0x02000000, 0x01000000, 0x00002080, 0x00001020,
252 0x02000000, 0x01000008, 0x00082080, 0x10001020,
253 0x00004000, 0x01000000, 0x00002040, 0x00040020,
254 0x00004000, 0x01000008, 0x00082040, 0x10040020,
255 0x02004000, 0x01000000, 0x000020c0, 0x00041020,
256 0x02004000, 0x01000008, 0x000820c0, 0x10041020,
257 0x00020000, 0x01008000, 0x08002000, 0x00200020,
258 0x00020000, 0x01008008, 0x08082000, 0x10200020,
259 0x02020000, 0x01008000, 0x08002080, 0x00201020,
260 0x02020000, 0x01008008, 0x08082080, 0x10201020,
261 0x00024000, 0x01008000, 0x08002040, 0x00240020,
262 0x00024000, 0x01008008, 0x08082040, 0x10240020,
263 0x02024000, 0x01008000, 0x080020c0, 0x00241020,
264 0x02024000, 0x01008008, 0x080820c0, 0x10241020,
265 0x00000400, 0x04000000, 0x00100000, 0x00000004,
266 0x00000400, 0x04000008, 0x00180000, 0x10000004,
267 0x02000400, 0x04000000, 0x00100080, 0x00001004,
268 0x02000400, 0x04000008, 0x00180080, 0x10001004,
269 0x00004400, 0x04000000, 0x00100040, 0x00040004,
270 0x00004400, 0x04000008, 0x00180040, 0x10040004,
271 0x02004400, 0x04000000, 0x001000c0, 0x00041004,
272 0x02004400, 0x04000008, 0x001800c0, 0x10041004,
273 0x00020400, 0x04008000, 0x08100000, 0x00200004,
274 0x00020400, 0x04008008, 0x08180000, 0x10200004,
275 0x02020400, 0x04008000, 0x08100080, 0x00201004,
276 0x02020400, 0x04008008, 0x08180080, 0x10201004,
277 0x00024400, 0x04008000, 0x08100040, 0x00240004,
278 0x00024400, 0x04008008, 0x08180040, 0x10240004,
279 0x02024400, 0x04008000, 0x081000c0, 0x00241004,
280 0x02024400, 0x04008008, 0x081800c0, 0x10241004,
281 0x00000400, 0x05000000, 0x00102000, 0x00000024,
282 0x00000400, 0x05000008, 0x00182000, 0x10000024,
283 0x02000400, 0x05000000, 0x00102080, 0x00001024,
284 0x02000400, 0x05000008, 0x00182080, 0x10001024,
285 0x00004400, 0x05000000, 0x00102040, 0x00040024,
286 0x00004400, 0x05000008, 0x00182040, 0x10040024,
287 0x02004400, 0x05000000, 0x001020c0, 0x00041024,
288 0x02004400, 0x05000008, 0x001820c0, 0x10041024,
289 0x00020400, 0x05008000, 0x08102000, 0x00200024,
290 0x00020400, 0x05008008, 0x08182000, 0x10200024,
291 0x02020400, 0x05008000, 0x08102080, 0x00201024,
292 0x02020400, 0x05008008, 0x08182080, 0x10201024,
293 0x00024400, 0x05008000, 0x08102040, 0x00240024,
294 0x00024400, 0x05008008, 0x08182040, 0x10240024,
295 0x02024400, 0x05008000, 0x081020c0, 0x00241024,
296 0x02024400, 0x05008008, 0x081820c0, 0x10241024,
297 0x00000800, 0x00010000, 0x20000000, 0x00000010,
298 0x00000800, 0x00010008, 0x20080000, 0x10000010,
299 0x02000800, 0x00010000, 0x20000080, 0x00001010,
300 0x02000800, 0x00010008, 0x20080080, 0x10001010,
301 0x00004800, 0x00010000, 0x20000040, 0x00040010,
302 0x00004800, 0x00010008, 0x20080040, 0x10040010,
303 0x02004800, 0x00010000, 0x200000c0, 0x00041010,
304 0x02004800, 0x00010008, 0x200800c0, 0x10041010,
305 0x00020800, 0x00018000, 0x28000000, 0x00200010,
306 0x00020800, 0x00018008, 0x28080000, 0x10200010,
307 0x02020800, 0x00018000, 0x28000080, 0x00201010,
308 0x02020800, 0x00018008, 0x28080080, 0x10201010,
309 0x00024800, 0x00018000, 0x28000040, 0x00240010,
310 0x00024800, 0x00018008, 0x28080040, 0x10240010,
311 0x02024800, 0x00018000, 0x280000c0, 0x00241010,
312 0x02024800, 0x00018008, 0x280800c0, 0x10241010,
313 0x00000800, 0x01010000, 0x20002000, 0x00000030,
314 0x00000800, 0x01010008, 0x20082000, 0x10000030,
315 0x02000800, 0x01010000, 0x20002080, 0x00001030,
316 0x02000800, 0x01010008, 0x20082080, 0x10001030,
317 0x00004800, 0x01010000, 0x20002040, 0x00040030,
318 0x00004800, 0x01010008, 0x20082040, 0x10040030,
319 0x02004800, 0x01010000, 0x200020c0, 0x00041030,
320 0x02004800, 0x01010008, 0x200820c0, 0x10041030,
321 0x00020800, 0x01018000, 0x28002000, 0x00200030,
322 0x00020800, 0x01018008, 0x28082000, 0x10200030,
323 0x02020800, 0x01018000, 0x28002080, 0x00201030,
324 0x02020800, 0x01018008, 0x28082080, 0x10201030,
325 0x00024800, 0x01018000, 0x28002040, 0x00240030,
326 0x00024800, 0x01018008, 0x28082040, 0x10240030,
327 0x02024800, 0x01018000, 0x280020c0, 0x00241030,
328 0x02024800, 0x01018008, 0x280820c0, 0x10241030,
329 0x00000c00, 0x04010000, 0x20100000, 0x00000014,
330 0x00000c00, 0x04010008, 0x20180000, 0x10000014,
331 0x02000c00, 0x04010000, 0x20100080, 0x00001014,
332 0x02000c00, 0x04010008, 0x20180080, 0x10001014,
333 0x00004c00, 0x04010000, 0x20100040, 0x00040014,
334 0x00004c00, 0x04010008, 0x20180040, 0x10040014,
335 0x02004c00, 0x04010000, 0x201000c0, 0x00041014,
336 0x02004c00, 0x04010008, 0x201800c0, 0x10041014,
337 0x00020c00, 0x04018000, 0x28100000, 0x00200014,
338 0x00020c00, 0x04018008, 0x28180000, 0x10200014,
339 0x02020c00, 0x04018000, 0x28100080, 0x00201014,
340 0x02020c00, 0x04018008, 0x28180080, 0x10201014,
341 0x00024c00, 0x04018000, 0x28100040, 0x00240014,
342 0x00024c00, 0x04018008, 0x28180040, 0x10240014,
343 0x02024c00, 0x04018000, 0x281000c0, 0x00241014,
344 0x02024c00, 0x04018008, 0x281800c0, 0x10241014,
345 0x00000c00, 0x05010000, 0x20102000, 0x00000034,
346 0x00000c00, 0x05010008, 0x20182000, 0x10000034,
347 0x02000c00, 0x05010000, 0x20102080, 0x00001034,
348 0x02000c00, 0x05010008, 0x20182080, 0x10001034,
349 0x00004c00, 0x05010000, 0x20102040, 0x00040034,
350 0x00004c00, 0x05010008, 0x20182040, 0x10040034,
351 0x02004c00, 0x05010000, 0x201020c0, 0x00041034,
352 0x02004c00, 0x05010008, 0x201820c0, 0x10041034,
353 0x00020c00, 0x05018000, 0x28102000, 0x00200034,
354 0x00020c00, 0x05018008, 0x28182000, 0x10200034,
355 0x02020c00, 0x05018000, 0x28102080, 0x00201034,
356 0x02020c00, 0x05018008, 0x28182080, 0x10201034,
357 0x00024c00, 0x05018000, 0x28102040, 0x00240034,
358 0x00024c00, 0x05018008, 0x28182040, 0x10240034,
359 0x02024c00, 0x05018000, 0x281020c0, 0x00241034,
360 0x02024c00, 0x05018008, 0x281820c0, 0x10241034
1da177e4
LT
361};
362
e1d5dea1
DAO
363/* S-box lookup tables */
364
365static const u32 S1[64] = {
366 0x01010400, 0x00000000, 0x00010000, 0x01010404,
367 0x01010004, 0x00010404, 0x00000004, 0x00010000,
368 0x00000400, 0x01010400, 0x01010404, 0x00000400,
369 0x01000404, 0x01010004, 0x01000000, 0x00000004,
370 0x00000404, 0x01000400, 0x01000400, 0x00010400,
371 0x00010400, 0x01010000, 0x01010000, 0x01000404,
372 0x00010004, 0x01000004, 0x01000004, 0x00010004,
373 0x00000000, 0x00000404, 0x00010404, 0x01000000,
374 0x00010000, 0x01010404, 0x00000004, 0x01010000,
375 0x01010400, 0x01000000, 0x01000000, 0x00000400,
376 0x01010004, 0x00010000, 0x00010400, 0x01000004,
377 0x00000400, 0x00000004, 0x01000404, 0x00010404,
378 0x01010404, 0x00010004, 0x01010000, 0x01000404,
379 0x01000004, 0x00000404, 0x00010404, 0x01010400,
380 0x00000404, 0x01000400, 0x01000400, 0x00000000,
381 0x00010004, 0x00010400, 0x00000000, 0x01010004
382};
1da177e4 383
e1d5dea1
DAO
384static const u32 S2[64] = {
385 0x80108020, 0x80008000, 0x00008000, 0x00108020,
386 0x00100000, 0x00000020, 0x80100020, 0x80008020,
387 0x80000020, 0x80108020, 0x80108000, 0x80000000,
388 0x80008000, 0x00100000, 0x00000020, 0x80100020,
389 0x00108000, 0x00100020, 0x80008020, 0x00000000,
390 0x80000000, 0x00008000, 0x00108020, 0x80100000,
391 0x00100020, 0x80000020, 0x00000000, 0x00108000,
392 0x00008020, 0x80108000, 0x80100000, 0x00008020,
393 0x00000000, 0x00108020, 0x80100020, 0x00100000,
394 0x80008020, 0x80100000, 0x80108000, 0x00008000,
395 0x80100000, 0x80008000, 0x00000020, 0x80108020,
396 0x00108020, 0x00000020, 0x00008000, 0x80000000,
397 0x00008020, 0x80108000, 0x00100000, 0x80000020,
398 0x00100020, 0x80008020, 0x80000020, 0x00100020,
399 0x00108000, 0x00000000, 0x80008000, 0x00008020,
400 0x80000000, 0x80100020, 0x80108020, 0x00108000
401};
1da177e4 402
e1d5dea1
DAO
403static const u32 S3[64] = {
404 0x00000208, 0x08020200, 0x00000000, 0x08020008,
405 0x08000200, 0x00000000, 0x00020208, 0x08000200,
406 0x00020008, 0x08000008, 0x08000008, 0x00020000,
407 0x08020208, 0x00020008, 0x08020000, 0x00000208,
408 0x08000000, 0x00000008, 0x08020200, 0x00000200,
409 0x00020200, 0x08020000, 0x08020008, 0x00020208,
410 0x08000208, 0x00020200, 0x00020000, 0x08000208,
411 0x00000008, 0x08020208, 0x00000200, 0x08000000,
412 0x08020200, 0x08000000, 0x00020008, 0x00000208,
413 0x00020000, 0x08020200, 0x08000200, 0x00000000,
414 0x00000200, 0x00020008, 0x08020208, 0x08000200,
415 0x08000008, 0x00000200, 0x00000000, 0x08020008,
416 0x08000208, 0x00020000, 0x08000000, 0x08020208,
417 0x00000008, 0x00020208, 0x00020200, 0x08000008,
418 0x08020000, 0x08000208, 0x00000208, 0x08020000,
419 0x00020208, 0x00000008, 0x08020008, 0x00020200
420};
421
422static const u32 S4[64] = {
423 0x00802001, 0x00002081, 0x00002081, 0x00000080,
424 0x00802080, 0x00800081, 0x00800001, 0x00002001,
425 0x00000000, 0x00802000, 0x00802000, 0x00802081,
426 0x00000081, 0x00000000, 0x00800080, 0x00800001,
427 0x00000001, 0x00002000, 0x00800000, 0x00802001,
428 0x00000080, 0x00800000, 0x00002001, 0x00002080,
429 0x00800081, 0x00000001, 0x00002080, 0x00800080,
430 0x00002000, 0x00802080, 0x00802081, 0x00000081,
431 0x00800080, 0x00800001, 0x00802000, 0x00802081,
432 0x00000081, 0x00000000, 0x00000000, 0x00802000,
433 0x00002080, 0x00800080, 0x00800081, 0x00000001,
434 0x00802001, 0x00002081, 0x00002081, 0x00000080,
435 0x00802081, 0x00000081, 0x00000001, 0x00002000,
436 0x00800001, 0x00002001, 0x00802080, 0x00800081,
437 0x00002001, 0x00002080, 0x00800000, 0x00802001,
438 0x00000080, 0x00800000, 0x00002000, 0x00802080
439};
440
441static const u32 S5[64] = {
442 0x00000100, 0x02080100, 0x02080000, 0x42000100,
443 0x00080000, 0x00000100, 0x40000000, 0x02080000,
444 0x40080100, 0x00080000, 0x02000100, 0x40080100,
445 0x42000100, 0x42080000, 0x00080100, 0x40000000,
446 0x02000000, 0x40080000, 0x40080000, 0x00000000,
447 0x40000100, 0x42080100, 0x42080100, 0x02000100,
448 0x42080000, 0x40000100, 0x00000000, 0x42000000,
449 0x02080100, 0x02000000, 0x42000000, 0x00080100,
450 0x00080000, 0x42000100, 0x00000100, 0x02000000,
451 0x40000000, 0x02080000, 0x42000100, 0x40080100,
452 0x02000100, 0x40000000, 0x42080000, 0x02080100,
453 0x40080100, 0x00000100, 0x02000000, 0x42080000,
454 0x42080100, 0x00080100, 0x42000000, 0x42080100,
455 0x02080000, 0x00000000, 0x40080000, 0x42000000,
456 0x00080100, 0x02000100, 0x40000100, 0x00080000,
457 0x00000000, 0x40080000, 0x02080100, 0x40000100
458};
459
460static const u32 S6[64] = {
461 0x20000010, 0x20400000, 0x00004000, 0x20404010,
462 0x20400000, 0x00000010, 0x20404010, 0x00400000,
463 0x20004000, 0x00404010, 0x00400000, 0x20000010,
464 0x00400010, 0x20004000, 0x20000000, 0x00004010,
465 0x00000000, 0x00400010, 0x20004010, 0x00004000,
466 0x00404000, 0x20004010, 0x00000010, 0x20400010,
467 0x20400010, 0x00000000, 0x00404010, 0x20404000,
468 0x00004010, 0x00404000, 0x20404000, 0x20000000,
469 0x20004000, 0x00000010, 0x20400010, 0x00404000,
470 0x20404010, 0x00400000, 0x00004010, 0x20000010,
471 0x00400000, 0x20004000, 0x20000000, 0x00004010,
472 0x20000010, 0x20404010, 0x00404000, 0x20400000,
473 0x00404010, 0x20404000, 0x00000000, 0x20400010,
474 0x00000010, 0x00004000, 0x20400000, 0x00404010,
475 0x00004000, 0x00400010, 0x20004010, 0x00000000,
476 0x20404000, 0x20000000, 0x00400010, 0x20004010
477};
478
479static const u32 S7[64] = {
480 0x00200000, 0x04200002, 0x04000802, 0x00000000,
481 0x00000800, 0x04000802, 0x00200802, 0x04200800,
482 0x04200802, 0x00200000, 0x00000000, 0x04000002,
483 0x00000002, 0x04000000, 0x04200002, 0x00000802,
484 0x04000800, 0x00200802, 0x00200002, 0x04000800,
485 0x04000002, 0x04200000, 0x04200800, 0x00200002,
486 0x04200000, 0x00000800, 0x00000802, 0x04200802,
487 0x00200800, 0x00000002, 0x04000000, 0x00200800,
488 0x04000000, 0x00200800, 0x00200000, 0x04000802,
489 0x04000802, 0x04200002, 0x04200002, 0x00000002,
490 0x00200002, 0x04000000, 0x04000800, 0x00200000,
491 0x04200800, 0x00000802, 0x00200802, 0x04200800,
492 0x00000802, 0x04000002, 0x04200802, 0x04200000,
493 0x00200800, 0x00000000, 0x00000002, 0x04200802,
494 0x00000000, 0x00200802, 0x04200000, 0x00000800,
495 0x04000002, 0x04000800, 0x00000800, 0x00200002
496};
497
498static const u32 S8[64] = {
499 0x10001040, 0x00001000, 0x00040000, 0x10041040,
500 0x10000000, 0x10001040, 0x00000040, 0x10000000,
501 0x00040040, 0x10040000, 0x10041040, 0x00041000,
502 0x10041000, 0x00041040, 0x00001000, 0x00000040,
503 0x10040000, 0x10000040, 0x10001000, 0x00001040,
504 0x00041000, 0x00040040, 0x10040040, 0x10041000,
505 0x00001040, 0x00000000, 0x00000000, 0x10040040,
506 0x10000040, 0x10001000, 0x00041040, 0x00040000,
507 0x00041040, 0x00040000, 0x10041000, 0x00001000,
508 0x00000040, 0x10040040, 0x00001000, 0x00041040,
509 0x10001000, 0x00000040, 0x10000040, 0x10040000,
510 0x10040040, 0x10000000, 0x00040000, 0x10001040,
511 0x00000000, 0x10041040, 0x00040040, 0x10000040,
512 0x10040000, 0x10001000, 0x10001040, 0x00000000,
513 0x10041040, 0x00041000, 0x00041000, 0x00001040,
514 0x00001040, 0x00040040, 0x10000000, 0x10041000
515};
516
517/* Encryption components: IP, FP, and round function */
518
519#define IP(L, R, T) \
520 ROL(R, 4); \
521 T = L; \
522 L ^= R; \
523 L &= 0xf0f0f0f0; \
524 R ^= L; \
525 L ^= T; \
526 ROL(R, 12); \
527 T = L; \
528 L ^= R; \
529 L &= 0xffff0000; \
530 R ^= L; \
531 L ^= T; \
532 ROR(R, 14); \
533 T = L; \
534 L ^= R; \
535 L &= 0xcccccccc; \
536 R ^= L; \
537 L ^= T; \
538 ROL(R, 6); \
539 T = L; \
540 L ^= R; \
541 L &= 0xff00ff00; \
542 R ^= L; \
543 L ^= T; \
544 ROR(R, 7); \
545 T = L; \
546 L ^= R; \
547 L &= 0xaaaaaaaa; \
548 R ^= L; \
549 L ^= T; \
550 ROL(L, 1);
551
552#define FP(L, R, T) \
553 ROR(L, 1); \
554 T = L; \
555 L ^= R; \
556 L &= 0xaaaaaaaa; \
557 R ^= L; \
558 L ^= T; \
559 ROL(R, 7); \
560 T = L; \
561 L ^= R; \
562 L &= 0xff00ff00; \
563 R ^= L; \
564 L ^= T; \
565 ROR(R, 6); \
566 T = L; \
567 L ^= R; \
568 L &= 0xcccccccc; \
569 R ^= L; \
570 L ^= T; \
571 ROL(R, 14); \
572 T = L; \
573 L ^= R; \
574 L &= 0xffff0000; \
575 R ^= L; \
576 L ^= T; \
577 ROR(R, 12); \
578 T = L; \
579 L ^= R; \
580 L &= 0xf0f0f0f0; \
581 R ^= L; \
582 L ^= T; \
583 ROR(R, 4);
584
585#define ROUND(L, R, A, B, K, d) \
586 B = K[0]; A = K[1]; K += d; \
587 B ^= R; A ^= R; \
588 B &= 0x3f3f3f3f; ROR(A, 4); \
589 L ^= S8[0xff & B]; A &= 0x3f3f3f3f; \
590 L ^= S6[0xff & (B >> 8)]; B >>= 16; \
591 L ^= S7[0xff & A]; \
592 L ^= S5[0xff & (A >> 8)]; A >>= 16; \
593 L ^= S4[0xff & B]; \
594 L ^= S2[0xff & (B >> 8)]; \
595 L ^= S3[0xff & A]; \
596 L ^= S1[0xff & (A >> 8)];
597
598/*
599 * PC2 lookup tables are organized as 2 consecutive sets of 4 interleaved
600 * tables of 128 elements. One set is for C_i and the other for D_i, while
601 * the 4 interleaved tables correspond to four 7-bit subsets of C_i or D_i.
602 *
603 * After PC1 each of the variables a,b,c,d contains a 7 bit subset of C_i
604 * or D_i in bits 7-1 (bit 0 being the least significant).
605 */
606
607#define T1(x) pt[2 * (x) + 0]
608#define T2(x) pt[2 * (x) + 1]
609#define T3(x) pt[2 * (x) + 2]
610#define T4(x) pt[2 * (x) + 3]
611
db36b906 612#define DES_PC2(a, b, c, d) (T4(d) | T3(c) | T2(b) | T1(a))
1da177e4
LT
613
614/*
e1d5dea1
DAO
615 * Encryption key expansion
616 *
1da177e4 617 * RFC2451: Weak key checks SHOULD be performed.
e1d5dea1
DAO
618 *
619 * FIPS 74:
620 *
621 * Keys having duals are keys which produce all zeros, all ones, or
622 * alternating zero-one patterns in the C and D registers after Permuted
623 * Choice 1 has operated on the key.
624 *
1da177e4 625 */
c3041f9c 626unsigned long des_ekey(u32 *pe, const u8 *k)
1da177e4 627{
e1d5dea1
DAO
628 /* K&R: long is at least 32 bits */
629 unsigned long a, b, c, d, w;
630 const u32 *pt = pc2;
631
632 d = k[4]; d &= 0x0e; d <<= 4; d |= k[0] & 0x1e; d = pc1[d];
633 c = k[5]; c &= 0x0e; c <<= 4; c |= k[1] & 0x1e; c = pc1[c];
634 b = k[6]; b &= 0x0e; b <<= 4; b |= k[2] & 0x1e; b = pc1[b];
635 a = k[7]; a &= 0x0e; a <<= 4; a |= k[3] & 0x1e; a = pc1[a];
636
db36b906
DH
637 pe[15 * 2 + 0] = DES_PC2(a, b, c, d); d = rs[d];
638 pe[14 * 2 + 0] = DES_PC2(d, a, b, c); c = rs[c]; b = rs[b];
639 pe[13 * 2 + 0] = DES_PC2(b, c, d, a); a = rs[a]; d = rs[d];
640 pe[12 * 2 + 0] = DES_PC2(d, a, b, c); c = rs[c]; b = rs[b];
641 pe[11 * 2 + 0] = DES_PC2(b, c, d, a); a = rs[a]; d = rs[d];
642 pe[10 * 2 + 0] = DES_PC2(d, a, b, c); c = rs[c]; b = rs[b];
643 pe[ 9 * 2 + 0] = DES_PC2(b, c, d, a); a = rs[a]; d = rs[d];
644 pe[ 8 * 2 + 0] = DES_PC2(d, a, b, c); c = rs[c];
645 pe[ 7 * 2 + 0] = DES_PC2(c, d, a, b); b = rs[b]; a = rs[a];
646 pe[ 6 * 2 + 0] = DES_PC2(a, b, c, d); d = rs[d]; c = rs[c];
647 pe[ 5 * 2 + 0] = DES_PC2(c, d, a, b); b = rs[b]; a = rs[a];
648 pe[ 4 * 2 + 0] = DES_PC2(a, b, c, d); d = rs[d]; c = rs[c];
649 pe[ 3 * 2 + 0] = DES_PC2(c, d, a, b); b = rs[b]; a = rs[a];
650 pe[ 2 * 2 + 0] = DES_PC2(a, b, c, d); d = rs[d]; c = rs[c];
651 pe[ 1 * 2 + 0] = DES_PC2(c, d, a, b); b = rs[b];
652 pe[ 0 * 2 + 0] = DES_PC2(b, c, d, a);
e1d5dea1
DAO
653
654 /* Check if first half is weak */
655 w = (a ^ c) | (b ^ d) | (rs[a] ^ c) | (b ^ rs[d]);
656
657 /* Skip to next table set */
658 pt += 512;
659
660 d = k[0]; d &= 0xe0; d >>= 4; d |= k[4] & 0xf0; d = pc1[d + 1];
661 c = k[1]; c &= 0xe0; c >>= 4; c |= k[5] & 0xf0; c = pc1[c + 1];
662 b = k[2]; b &= 0xe0; b >>= 4; b |= k[6] & 0xf0; b = pc1[b + 1];
663 a = k[3]; a &= 0xe0; a >>= 4; a |= k[7] & 0xf0; a = pc1[a + 1];
664
665 /* Check if second half is weak */
666 w |= (a ^ c) | (b ^ d) | (rs[a] ^ c) | (b ^ rs[d]);
667
db36b906
DH
668 pe[15 * 2 + 1] = DES_PC2(a, b, c, d); d = rs[d];
669 pe[14 * 2 + 1] = DES_PC2(d, a, b, c); c = rs[c]; b = rs[b];
670 pe[13 * 2 + 1] = DES_PC2(b, c, d, a); a = rs[a]; d = rs[d];
671 pe[12 * 2 + 1] = DES_PC2(d, a, b, c); c = rs[c]; b = rs[b];
672 pe[11 * 2 + 1] = DES_PC2(b, c, d, a); a = rs[a]; d = rs[d];
673 pe[10 * 2 + 1] = DES_PC2(d, a, b, c); c = rs[c]; b = rs[b];
674 pe[ 9 * 2 + 1] = DES_PC2(b, c, d, a); a = rs[a]; d = rs[d];
675 pe[ 8 * 2 + 1] = DES_PC2(d, a, b, c); c = rs[c];
676 pe[ 7 * 2 + 1] = DES_PC2(c, d, a, b); b = rs[b]; a = rs[a];
677 pe[ 6 * 2 + 1] = DES_PC2(a, b, c, d); d = rs[d]; c = rs[c];
678 pe[ 5 * 2 + 1] = DES_PC2(c, d, a, b); b = rs[b]; a = rs[a];
679 pe[ 4 * 2 + 1] = DES_PC2(a, b, c, d); d = rs[d]; c = rs[c];
680 pe[ 3 * 2 + 1] = DES_PC2(c, d, a, b); b = rs[b]; a = rs[a];
681 pe[ 2 * 2 + 1] = DES_PC2(a, b, c, d); d = rs[d]; c = rs[c];
682 pe[ 1 * 2 + 1] = DES_PC2(c, d, a, b); b = rs[b];
683 pe[ 0 * 2 + 1] = DES_PC2(b, c, d, a);
e1d5dea1
DAO
684
685 /* Fixup: 2413 5768 -> 1357 2468 */
686 for (d = 0; d < 16; ++d) {
687 a = pe[2 * d];
688 b = pe[2 * d + 1];
689 c = a ^ b;
690 c &= 0xffff0000;
691 a ^= c;
692 b ^= c;
693 ROL(b, 18);
694 pe[2 * d] = a;
695 pe[2 * d + 1] = b;
1da177e4
LT
696 }
697
e1d5dea1
DAO
698 /* Zero if weak key */
699 return w;
700}
c3041f9c 701EXPORT_SYMBOL_GPL(des_ekey);
1da177e4 702
e1d5dea1
DAO
703/*
704 * Decryption key expansion
705 *
706 * No weak key checking is performed, as this is only used by triple DES
707 *
708 */
709static void dkey(u32 *pe, const u8 *k)
710{
711 /* K&R: long is at least 32 bits */
712 unsigned long a, b, c, d;
713 const u32 *pt = pc2;
714
715 d = k[4]; d &= 0x0e; d <<= 4; d |= k[0] & 0x1e; d = pc1[d];
716 c = k[5]; c &= 0x0e; c <<= 4; c |= k[1] & 0x1e; c = pc1[c];
717 b = k[6]; b &= 0x0e; b <<= 4; b |= k[2] & 0x1e; b = pc1[b];
718 a = k[7]; a &= 0x0e; a <<= 4; a |= k[3] & 0x1e; a = pc1[a];
719
db36b906
DH
720 pe[ 0 * 2] = DES_PC2(a, b, c, d); d = rs[d];
721 pe[ 1 * 2] = DES_PC2(d, a, b, c); c = rs[c]; b = rs[b];
722 pe[ 2 * 2] = DES_PC2(b, c, d, a); a = rs[a]; d = rs[d];
723 pe[ 3 * 2] = DES_PC2(d, a, b, c); c = rs[c]; b = rs[b];
724 pe[ 4 * 2] = DES_PC2(b, c, d, a); a = rs[a]; d = rs[d];
725 pe[ 5 * 2] = DES_PC2(d, a, b, c); c = rs[c]; b = rs[b];
726 pe[ 6 * 2] = DES_PC2(b, c, d, a); a = rs[a]; d = rs[d];
727 pe[ 7 * 2] = DES_PC2(d, a, b, c); c = rs[c];
728 pe[ 8 * 2] = DES_PC2(c, d, a, b); b = rs[b]; a = rs[a];
729 pe[ 9 * 2] = DES_PC2(a, b, c, d); d = rs[d]; c = rs[c];
730 pe[10 * 2] = DES_PC2(c, d, a, b); b = rs[b]; a = rs[a];
731 pe[11 * 2] = DES_PC2(a, b, c, d); d = rs[d]; c = rs[c];
732 pe[12 * 2] = DES_PC2(c, d, a, b); b = rs[b]; a = rs[a];
733 pe[13 * 2] = DES_PC2(a, b, c, d); d = rs[d]; c = rs[c];
734 pe[14 * 2] = DES_PC2(c, d, a, b); b = rs[b];
735 pe[15 * 2] = DES_PC2(b, c, d, a);
e1d5dea1
DAO
736
737 /* Skip to next table set */
738 pt += 512;
739
740 d = k[0]; d &= 0xe0; d >>= 4; d |= k[4] & 0xf0; d = pc1[d + 1];
741 c = k[1]; c &= 0xe0; c >>= 4; c |= k[5] & 0xf0; c = pc1[c + 1];
742 b = k[2]; b &= 0xe0; b >>= 4; b |= k[6] & 0xf0; b = pc1[b + 1];
743 a = k[3]; a &= 0xe0; a >>= 4; a |= k[7] & 0xf0; a = pc1[a + 1];
744
db36b906
DH
745 pe[ 0 * 2 + 1] = DES_PC2(a, b, c, d); d = rs[d];
746 pe[ 1 * 2 + 1] = DES_PC2(d, a, b, c); c = rs[c]; b = rs[b];
747 pe[ 2 * 2 + 1] = DES_PC2(b, c, d, a); a = rs[a]; d = rs[d];
748 pe[ 3 * 2 + 1] = DES_PC2(d, a, b, c); c = rs[c]; b = rs[b];
749 pe[ 4 * 2 + 1] = DES_PC2(b, c, d, a); a = rs[a]; d = rs[d];
750 pe[ 5 * 2 + 1] = DES_PC2(d, a, b, c); c = rs[c]; b = rs[b];
751 pe[ 6 * 2 + 1] = DES_PC2(b, c, d, a); a = rs[a]; d = rs[d];
752 pe[ 7 * 2 + 1] = DES_PC2(d, a, b, c); c = rs[c];
753 pe[ 8 * 2 + 1] = DES_PC2(c, d, a, b); b = rs[b]; a = rs[a];
754 pe[ 9 * 2 + 1] = DES_PC2(a, b, c, d); d = rs[d]; c = rs[c];
755 pe[10 * 2 + 1] = DES_PC2(c, d, a, b); b = rs[b]; a = rs[a];
756 pe[11 * 2 + 1] = DES_PC2(a, b, c, d); d = rs[d]; c = rs[c];
757 pe[12 * 2 + 1] = DES_PC2(c, d, a, b); b = rs[b]; a = rs[a];
758 pe[13 * 2 + 1] = DES_PC2(a, b, c, d); d = rs[d]; c = rs[c];
759 pe[14 * 2 + 1] = DES_PC2(c, d, a, b); b = rs[b];
760 pe[15 * 2 + 1] = DES_PC2(b, c, d, a);
e1d5dea1
DAO
761
762 /* Fixup: 2413 5768 -> 1357 2468 */
763 for (d = 0; d < 16; ++d) {
764 a = pe[2 * d];
765 b = pe[2 * d + 1];
766 c = a ^ b;
767 c &= 0xffff0000;
768 a ^= c;
769 b ^= c;
770 ROL(b, 18);
771 pe[2 * d] = a;
772 pe[2 * d + 1] = b;
773 }
1da177e4
LT
774}
775
6c2bb98b 776static int des_setkey(struct crypto_tfm *tfm, const u8 *key,
560c06ae 777 unsigned int keylen)
1da177e4 778{
6c2bb98b 779 struct des_ctx *dctx = crypto_tfm_ctx(tfm);
560c06ae 780 u32 *flags = &tfm->crt_flags;
e1d5dea1
DAO
781 u32 tmp[DES_EXPKEY_WORDS];
782 int ret;
783
784 /* Expand to tmp */
c3041f9c 785 ret = des_ekey(tmp, key);
e1d5dea1 786
231baecd 787 if (unlikely(ret == 0) && (*flags & CRYPTO_TFM_REQ_FORBID_WEAK_KEYS)) {
e1d5dea1
DAO
788 *flags |= CRYPTO_TFM_RES_WEAK_KEY;
789 return -EINVAL;
790 }
791
792 /* Copy to output */
793 memcpy(dctx->expkey, tmp, sizeof(dctx->expkey));
794
795 return 0;
1da177e4
LT
796}
797
6c2bb98b 798static void des_encrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
1da177e4 799{
6c2bb98b
HX
800 struct des_ctx *ctx = crypto_tfm_ctx(tfm);
801 const u32 *K = ctx->expkey;
e1d5dea1
DAO
802 const __le32 *s = (const __le32 *)src;
803 __le32 *d = (__le32 *)dst;
804 u32 L, R, A, B;
805 int i;
806
807 L = le32_to_cpu(s[0]);
808 R = le32_to_cpu(s[1]);
809
810 IP(L, R, A);
811 for (i = 0; i < 8; i++) {
812 ROUND(L, R, A, B, K, 2);
813 ROUND(R, L, A, B, K, 2);
814 }
815 FP(R, L, A);
816
817 d[0] = cpu_to_le32(R);
818 d[1] = cpu_to_le32(L);
1da177e4
LT
819}
820
6c2bb98b 821static void des_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
1da177e4 822{
6c2bb98b
HX
823 struct des_ctx *ctx = crypto_tfm_ctx(tfm);
824 const u32 *K = ctx->expkey + DES_EXPKEY_WORDS - 2;
e1d5dea1
DAO
825 const __le32 *s = (const __le32 *)src;
826 __le32 *d = (__le32 *)dst;
827 u32 L, R, A, B;
828 int i;
829
830 L = le32_to_cpu(s[0]);
831 R = le32_to_cpu(s[1]);
832
833 IP(L, R, A);
834 for (i = 0; i < 8; i++) {
835 ROUND(L, R, A, B, K, -2);
836 ROUND(R, L, A, B, K, -2);
837 }
838 FP(R, L, A);
839
840 d[0] = cpu_to_le32(R);
841 d[1] = cpu_to_le32(L);
1da177e4
LT
842}
843
e1d5dea1 844/*
1da177e4
LT
845 * RFC2451:
846 *
847 * For DES-EDE3, there is no known need to reject weak or
848 * complementation keys. Any weakness is obviated by the use of
849 * multiple keys.
850 *
851 * However, if the first two or last two independent 64-bit keys are
852 * equal (k1 == k2 or k2 == k3), then the DES3 operation is simply the
853 * same as DES. Implementers MUST reject keys that exhibit this
854 * property.
855 *
856 */
6574e6c6
JK
857int __des3_ede_setkey(u32 *expkey, u32 *flags, const u8 *key,
858 unsigned int keylen)
1da177e4 859{
d7198ce4 860 int err;
1da177e4 861
d7198ce4
HX
862 err = __des3_verify_key(flags, key);
863 if (unlikely(err))
864 return err;
e1d5dea1 865
c3041f9c 866 des_ekey(expkey, key); expkey += DES_EXPKEY_WORDS; key += DES_KEY_SIZE;
e1d5dea1 867 dkey(expkey, key); expkey += DES_EXPKEY_WORDS; key += DES_KEY_SIZE;
c3041f9c 868 des_ekey(expkey, key);
e1d5dea1 869
1da177e4
LT
870 return 0;
871}
6574e6c6
JK
872EXPORT_SYMBOL_GPL(__des3_ede_setkey);
873
874static int des3_ede_setkey(struct crypto_tfm *tfm, const u8 *key,
875 unsigned int keylen)
876{
877 struct des3_ede_ctx *dctx = crypto_tfm_ctx(tfm);
878 u32 *flags = &tfm->crt_flags;
879 u32 *expkey = dctx->expkey;
880
881 return __des3_ede_setkey(expkey, flags, key, keylen);
882}
1da177e4 883
6c2bb98b 884static void des3_ede_encrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
1da177e4 885{
6c2bb98b 886 struct des3_ede_ctx *dctx = crypto_tfm_ctx(tfm);
e1d5dea1
DAO
887 const u32 *K = dctx->expkey;
888 const __le32 *s = (const __le32 *)src;
889 __le32 *d = (__le32 *)dst;
890 u32 L, R, A, B;
891 int i;
892
893 L = le32_to_cpu(s[0]);
894 R = le32_to_cpu(s[1]);
895
896 IP(L, R, A);
897 for (i = 0; i < 8; i++) {
898 ROUND(L, R, A, B, K, 2);
899 ROUND(R, L, A, B, K, 2);
900 }
901 for (i = 0; i < 8; i++) {
902 ROUND(R, L, A, B, K, 2);
903 ROUND(L, R, A, B, K, 2);
904 }
905 for (i = 0; i < 8; i++) {
906 ROUND(L, R, A, B, K, 2);
907 ROUND(R, L, A, B, K, 2);
908 }
909 FP(R, L, A);
910
911 d[0] = cpu_to_le32(R);
912 d[1] = cpu_to_le32(L);
1da177e4
LT
913}
914
6c2bb98b 915static void des3_ede_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
1da177e4 916{
6c2bb98b 917 struct des3_ede_ctx *dctx = crypto_tfm_ctx(tfm);
e1d5dea1
DAO
918 const u32 *K = dctx->expkey + DES3_EDE_EXPKEY_WORDS - 2;
919 const __le32 *s = (const __le32 *)src;
920 __le32 *d = (__le32 *)dst;
921 u32 L, R, A, B;
922 int i;
923
924 L = le32_to_cpu(s[0]);
925 R = le32_to_cpu(s[1]);
926
927 IP(L, R, A);
928 for (i = 0; i < 8; i++) {
929 ROUND(L, R, A, B, K, -2);
930 ROUND(R, L, A, B, K, -2);
931 }
932 for (i = 0; i < 8; i++) {
933 ROUND(R, L, A, B, K, -2);
934 ROUND(L, R, A, B, K, -2);
935 }
936 for (i = 0; i < 8; i++) {
937 ROUND(L, R, A, B, K, -2);
938 ROUND(R, L, A, B, K, -2);
939 }
940 FP(R, L, A);
1da177e4 941
e1d5dea1
DAO
942 d[0] = cpu_to_le32(R);
943 d[1] = cpu_to_le32(L);
1da177e4
LT
944}
945
9935e6d2 946static struct crypto_alg des_algs[2] = { {
1da177e4 947 .cra_name = "des",
6574e6c6
JK
948 .cra_driver_name = "des-generic",
949 .cra_priority = 100,
1da177e4
LT
950 .cra_flags = CRYPTO_ALG_TYPE_CIPHER,
951 .cra_blocksize = DES_BLOCK_SIZE,
952 .cra_ctxsize = sizeof(struct des_ctx),
953 .cra_module = THIS_MODULE,
a429d260 954 .cra_alignmask = 3,
1da177e4
LT
955 .cra_u = { .cipher = {
956 .cia_min_keysize = DES_KEY_SIZE,
957 .cia_max_keysize = DES_KEY_SIZE,
e1d5dea1 958 .cia_setkey = des_setkey,
1da177e4
LT
959 .cia_encrypt = des_encrypt,
960 .cia_decrypt = des_decrypt } }
9935e6d2 961}, {
1da177e4 962 .cra_name = "des3_ede",
6574e6c6
JK
963 .cra_driver_name = "des3_ede-generic",
964 .cra_priority = 100,
1da177e4
LT
965 .cra_flags = CRYPTO_ALG_TYPE_CIPHER,
966 .cra_blocksize = DES3_EDE_BLOCK_SIZE,
967 .cra_ctxsize = sizeof(struct des3_ede_ctx),
968 .cra_module = THIS_MODULE,
20ea3404 969 .cra_alignmask = 3,
1da177e4
LT
970 .cra_u = { .cipher = {
971 .cia_min_keysize = DES3_EDE_KEY_SIZE,
972 .cia_max_keysize = DES3_EDE_KEY_SIZE,
e1d5dea1
DAO
973 .cia_setkey = des3_ede_setkey,
974 .cia_encrypt = des3_ede_encrypt,
975 .cia_decrypt = des3_ede_decrypt } }
9935e6d2 976} };
1da177e4 977
3af5b90b 978static int __init des_generic_mod_init(void)
1da177e4 979{
9935e6d2 980 return crypto_register_algs(des_algs, ARRAY_SIZE(des_algs));
1da177e4
LT
981}
982
3af5b90b 983static void __exit des_generic_mod_fini(void)
1da177e4 984{
9935e6d2 985 crypto_unregister_algs(des_algs, ARRAY_SIZE(des_algs));
1da177e4
LT
986}
987
c4741b23 988subsys_initcall(des_generic_mod_init);
3af5b90b 989module_exit(des_generic_mod_fini);
1da177e4
LT
990
991MODULE_LICENSE("GPL");
992MODULE_DESCRIPTION("DES & Triple DES EDE Cipher Algorithms");
e1d5dea1 993MODULE_AUTHOR("Dag Arne Osvik <da@osvik.no>");
3e14dcf7
MK
994MODULE_ALIAS_CRYPTO("des");
995MODULE_ALIAS_CRYPTO("des-generic");
996MODULE_ALIAS_CRYPTO("des3_ede");
997MODULE_ALIAS_CRYPTO("des3_ede-generic");