]> git.ipfire.org Git - thirdparty/squid.git/blame - lib/smblib/smbdes.c
SourceFormat Enforcement
[thirdparty/squid.git] / lib / smblib / smbdes.c
CommitLineData
26ac0430 1/*
94439e4e 2 * Unix SMB/Netbios implementation.
3 * Version 1.9.
26ac0430
AJ
4 *
5 * a partial implementation of DES designed for use in the
94439e4e 6 * SMB authentication protocol
26ac0430 7 *
94439e4e 8 * Copyright (C) Andrew Tridgell 1997
26ac0430 9 *
94439e4e 10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
26ac0430 14 *
94439e4e 15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
26ac0430 19 *
94439e4e 20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23 */
24
25
26ac0430
AJ
26/* NOTES:
27 *
94439e4e 28 * This code makes no attempt to be fast! In fact, it is a very
26ac0430
AJ
29 * slow implementation
30 *
94439e4e 31 * This code is NOT a complete DES implementation. It implements only
32 * the minimum necessary for SMB authentication, as used by all SMB
33 * products (including every copy of Microsoft Windows95 ever sold)
26ac0430 34 *
94439e4e 35 * In particular, it can only do a unchained forward DES pass. This
36 * means it is not possible to use this code for encryption/decryption
37 * of data, instead it is only useful as a "hash" algorithm.
26ac0430 38 *
94439e4e 39 * There is no entry point into this code that allows normal DES operation.
26ac0430 40 *
94439e4e 41 * I believe this means that this code does not come under ITAR
42 * regulations but this is NOT a legal opinion. If you are concerned
43 * about the applicability of ITAR regulations to this code then you
44 * should confirm it for yourself (and maybe let me know if you come
45 * up with a different answer to the one above)
46 */
47
c06f9773 48#include "smbdes.h"
94439e4e 49
26ac0430
AJ
50static int perm1[56] = {57, 49, 41, 33, 25, 17, 9,
51 1, 58, 50, 42, 34, 26, 18,
52 10, 2, 59, 51, 43, 35, 27,
53 19, 11, 3, 60, 52, 44, 36,
54 63, 55, 47, 39, 31, 23, 15,
55 7, 62, 54, 46, 38, 30, 22,
56 14, 6, 61, 53, 45, 37, 29,
57 21, 13, 5, 28, 20, 12, 4
58 };
59
60static int perm2[48] = {14, 17, 11, 24, 1, 5,
61 3, 28, 15, 6, 21, 10,
62 23, 19, 12, 4, 26, 8,
63 16, 7, 27, 20, 13, 2,
64 41, 52, 31, 37, 47, 55,
65 30, 40, 51, 45, 33, 48,
66 44, 49, 39, 56, 34, 53,
67 46, 42, 50, 36, 29, 32
68 };
69
70static int perm3[64] = {58, 50, 42, 34, 26, 18, 10, 2,
71 60, 52, 44, 36, 28, 20, 12, 4,
72 62, 54, 46, 38, 30, 22, 14, 6,
73 64, 56, 48, 40, 32, 24, 16, 8,
74 57, 49, 41, 33, 25, 17, 9, 1,
75 59, 51, 43, 35, 27, 19, 11, 3,
76 61, 53, 45, 37, 29, 21, 13, 5,
77 63, 55, 47, 39, 31, 23, 15, 7
78 };
79
80static int perm4[48] = {32, 1, 2, 3, 4, 5,
81 4, 5, 6, 7, 8, 9,
82 8, 9, 10, 11, 12, 13,
83 12, 13, 14, 15, 16, 17,
84 16, 17, 18, 19, 20, 21,
85 20, 21, 22, 23, 24, 25,
86 24, 25, 26, 27, 28, 29,
87 28, 29, 30, 31, 32, 1
88 };
89
90static int perm5[32] = {16, 7, 20, 21,
91 29, 12, 28, 17,
92 1, 15, 23, 26,
93 5, 18, 31, 10,
94 2, 8, 24, 14,
95 32, 27, 3, 9,
96 19, 13, 30, 6,
97 22, 11, 4, 25
98 };
99
100
101static int perm6[64] = {40, 8, 48, 16, 56, 24, 64, 32,
102 39, 7, 47, 15, 55, 23, 63, 31,
103 38, 6, 46, 14, 54, 22, 62, 30,
104 37, 5, 45, 13, 53, 21, 61, 29,
105 36, 4, 44, 12, 52, 20, 60, 28,
106 35, 3, 43, 11, 51, 19, 59, 27,
107 34, 2, 42, 10, 50, 18, 58, 26,
108 33, 1, 41, 9, 49, 17, 57, 25
109 };
110
111
112static int sc[16] = {1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1};
113
114static int sbox[8][4][16] = {
94439e4e 115 {
26ac0430
AJ
116 {14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7},
117 {0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8},
118 {4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0},
119 {15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13}},
94439e4e 120
121 {
26ac0430
AJ
122 {15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10},
123 {3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5},
124 {0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15},
125 {13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9}},
94439e4e 126
127 {
26ac0430
AJ
128 {10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8},
129 {13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1},
130 {13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7},
131 {1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12}},
94439e4e 132
133 {
26ac0430
AJ
134 {7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15},
135 {13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9},
136 {10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4},
137 {3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14}},
94439e4e 138
139 {
26ac0430
AJ
140 {2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9},
141 {14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6},
142 {4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14},
143 {11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3}},
94439e4e 144
145 {
26ac0430
AJ
146 {12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11},
147 {10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8},
148 {9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6},
149 {4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13}},
94439e4e 150
151 {
26ac0430
AJ
152 {4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1},
153 {13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6},
154 {1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2},
155 {6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12}},
94439e4e 156
157 {
26ac0430
AJ
158 {13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7},
159 {1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2},
160 {7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8},
161 {2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11}}
162};
94439e4e 163
164static void
165permute(char *out, char *in, int *p, int n)
166{
167 int i;
168 for (i = 0; i < n; i++)
26ac0430 169 out[i] = in[p[i] - 1];
94439e4e 170}
171
172static void
173lshift(char *d, int count, int n)
174{
175 char out[64];
176 int i;
177 for (i = 0; i < n; i++)
26ac0430 178 out[i] = d[(i + count) % n];
94439e4e 179 for (i = 0; i < n; i++)
26ac0430 180 d[i] = out[i];
94439e4e 181}
182
183static void
184concat(char *out, char *in1, char *in2, int l1, int l2)
185{
186 while (l1--)
26ac0430 187 *out++ = *in1++;
94439e4e 188 while (l2--)
26ac0430 189 *out++ = *in2++;
94439e4e 190}
191
192static void
193xor(char *out, char *in1, char *in2, int n)
194{
195 int i;
196 for (i = 0; i < n; i++)
26ac0430 197 out[i] = in1[i] ^ in2[i];
94439e4e 198}
199
200static void
201dohash(char *out, char *in, char *key)
202{
203 int i, j, k;
204 char pk1[56];
205 char c[28];
206 char d[28];
207 char cd[56];
208 char ki[16][48];
209 char pd1[64];
210 char l[32], r[32];
211 char rl[64];
212
213 permute(pk1, key, perm1, 56);
214
215 for (i = 0; i < 28; i++)
26ac0430 216 c[i] = pk1[i];
94439e4e 217 for (i = 0; i < 28; i++)
26ac0430 218 d[i] = pk1[i + 28];
94439e4e 219
220 for (i = 0; i < 16; i++) {
26ac0430
AJ
221 lshift(c, sc[i], 28);
222 lshift(d, sc[i], 28);
94439e4e 223
26ac0430
AJ
224 concat(cd, c, d, 28, 28);
225 permute(ki[i], cd, perm2, 48);
94439e4e 226 }
227
228 permute(pd1, in, perm3, 64);
229
230 for (j = 0; j < 32; j++) {
26ac0430
AJ
231 l[j] = pd1[j];
232 r[j] = pd1[j + 32];
94439e4e 233 }
234
235 for (i = 0; i < 16; i++) {
26ac0430
AJ
236 char er[48];
237 char erk[48];
238 char b[8][6];
239 char cb[32];
240 char pcb[32];
241 char r2[32];
94439e4e 242
26ac0430 243 permute(er, r, perm4, 48);
94439e4e 244
26ac0430 245 xor(erk, er, ki[i], 48);
94439e4e 246
26ac0430
AJ
247 for (j = 0; j < 8; j++)
248 for (k = 0; k < 6; k++)
249 b[j][k] = erk[j * 6 + k];
94439e4e 250
26ac0430
AJ
251 for (j = 0; j < 8; j++) {
252 int m, n;
253 m = (b[j][0] << 1) | b[j][5];
94439e4e 254
26ac0430 255 n = (b[j][1] << 3) | (b[j][2] << 2) | (b[j][3] << 1) | b[j][4];
94439e4e 256
26ac0430
AJ
257 for (k = 0; k < 4; k++)
258 b[j][k] = (sbox[j][m][n] & (1 << (3 - k))) ? 1 : 0;
259 }
94439e4e 260
26ac0430
AJ
261 for (j = 0; j < 8; j++)
262 for (k = 0; k < 4; k++)
263 cb[j * 4 + k] = b[j][k];
264 permute(pcb, cb, perm5, 32);
94439e4e 265
26ac0430 266 xor(r2, l, pcb, 32);
94439e4e 267
26ac0430
AJ
268 for (j = 0; j < 32; j++)
269 l[j] = r[j];
94439e4e 270
26ac0430
AJ
271 for (j = 0; j < 32; j++)
272 r[j] = r2[j];
94439e4e 273 }
274
275 concat(rl, r, l, 32, 32);
276
277 permute(out, rl, perm6, 64);
278}
279
280static void
281str_to_key(unsigned char *str, unsigned char *key)
282{
283 int i;
284
285 key[0] = str[0] >> 1;
286 key[1] = ((str[0] & 0x01) << 6) | (str[1] >> 2);
287 key[2] = ((str[1] & 0x03) << 5) | (str[2] >> 3);
288 key[3] = ((str[2] & 0x07) << 4) | (str[3] >> 4);
289 key[4] = ((str[3] & 0x0F) << 3) | (str[4] >> 5);
290 key[5] = ((str[4] & 0x1F) << 2) | (str[5] >> 6);
291 key[6] = ((str[5] & 0x3F) << 1) | (str[6] >> 7);
292 key[7] = str[6] & 0x7F;
293 for (i = 0; i < 8; i++) {
26ac0430 294 key[i] = (key[i] << 1);
94439e4e 295 }
296}
297
298
299static void
300smbhash(unsigned char *out, unsigned char *in, unsigned char *key)
301{
302 int i;
303 char outb[64];
304 char inb[64];
305 char keyb[64];
306 unsigned char key2[8];
307
308 str_to_key(key, key2);
309
310 for (i = 0; i < 64; i++) {
26ac0430
AJ
311 inb[i] = (in[i / 8] & (1 << (7 - (i % 8)))) ? 1 : 0;
312 keyb[i] = (key2[i / 8] & (1 << (7 - (i % 8)))) ? 1 : 0;
313 outb[i] = 0;
94439e4e 314 }
315
316 dohash(outb, inb, keyb);
317
318 for (i = 0; i < 8; i++) {
26ac0430 319 out[i] = 0;
94439e4e 320 }
321
322 for (i = 0; i < 64; i++) {
26ac0430
AJ
323 if (outb[i])
324 out[i / 8] |= (1 << (7 - (i % 8)));
94439e4e 325 }
326}
327
328void
329E_P16(unsigned char *p14, unsigned char *p16)
330{
26ac0430 331 unsigned char sp8[8] = {0x4b, 0x47, 0x53, 0x21, 0x40, 0x23, 0x24, 0x25};
94439e4e 332 smbhash(p16, sp8, p14);
333 smbhash(p16 + 8, sp8, p14 + 7);
334}
335
336void
337E_P24(unsigned char *p21, unsigned char *c8, unsigned char *p24)
338{
339 smbhash(p24, c8, p21);
340 smbhash(p24 + 8, c8, p21 + 7);
341 smbhash(p24 + 16, c8, p21 + 14);
342}
343
344void
345cred_hash1(unsigned char *out, unsigned char *in, unsigned char *key)
346{
347 unsigned char buf[8];
348
349 smbhash(buf, in, key);
350 smbhash(out, buf, key + 9);
351}
352
353void
354cred_hash2(unsigned char *out, unsigned char *in, unsigned char *key)
355{
356 unsigned char buf[8];
357 static unsigned char key2[8];
358
359 smbhash(buf, in, key);
360 key2[0] = key[7];
361 smbhash(out, buf, key2);
362}