]> git.ipfire.org Git - thirdparty/squid.git/blame - lib/encrypt.c
SourceFormat Enforcement
[thirdparty/squid.git] / lib / encrypt.c
CommitLineData
0545caaa 1/*
4ac4a490 2 * Copyright (C) 1996-2017 The Squid Software Foundation and contributors
0545caaa
AJ
3 *
4 * Squid software is distributed under GPLv2+ license and includes
5 * contributions from numerous individuals and organizations.
6 * Please see the COPYING and CONTRIBUTORS files for details.
7 */
75072239 8
63b81f13
GS
9/* encrypt.c - providing 56 bit DES encryption
10 * Copyright (C) 1991 Jochen Obalek
26ac0430 11 *
63b81f13
GS
12 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License as published by
14 * the Free Software Foundation; either version 2, or (at your option)
15 * any later version.
26ac0430 16 *
63b81f13
GS
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
26ac0430 21 *
63b81f13
GS
22 * You should have received a copy of the GNU General Public License
23 * along with this program; if not, write to the Free Software
24 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
25
0545caaa
AJ
26#include "squid.h"
27
63b81f13
GS
28#include <time.h>
29#include <string.h>
30#include <stdlib.h>
31
32#define BS 64
33#define BS2 32
34#define KS 48
35#define KS2 24
36#define IS 56
37#define IS2 28
38
39static char schluessel[16][KS];
40
26ac0430 41static char PC1[] = {
63b81f13
GS
42 56, 48, 40, 32, 24, 16, 8, 0,
43 57, 49, 41, 33, 25, 17, 9, 1,
44 58, 50, 42, 34, 26, 18, 10, 2,
45 59, 51, 43, 35,
46 62, 54, 46, 38, 30, 22, 14, 6,
47 61, 53, 45, 37, 29, 21, 13, 5,
48 60, 52, 44, 36, 28, 20, 12, 4,
49 27, 19, 11, 3
50};
51
26ac0430 52static char PC2[] = {
63b81f13
GS
53 13, 16, 10, 23, 0, 4, 2, 27,
54 14, 5, 20, 9, 22, 18, 11, 3,
55 25, 7, 15, 6, 26, 19, 12, 1,
56 40, 51, 30, 36, 46, 54, 29, 39,
57 50, 44, 32, 47, 43, 48, 38, 55,
58 33, 52, 45, 41, 49, 35, 28, 31
59};
60
26ac0430 61static char IP[] = {
63b81f13
GS
62 57, 49, 41, 33, 25, 17, 9, 1,
63 59, 51, 43, 35, 27, 19, 11, 3,
64 61, 53, 45, 37, 29, 21, 13, 5,
65 63, 55, 47, 39, 31, 23, 15, 7,
66 56, 48, 40, 32, 24, 16, 8, 0,
67 58, 50, 42, 34, 26, 18, 10, 2,
68 60, 52, 44, 36, 28, 20, 12, 4,
69 62, 54, 46, 38, 30, 22, 14, 6
70};
71
26ac0430 72static char EP[] = {
63b81f13
GS
73 7, 39, 15, 47, 23, 55, 31, 63,
74 6, 38, 14, 46, 22, 54, 30, 62,
75 5, 37, 13, 45, 21, 53, 29, 61,
76 4, 36, 12, 44, 20, 52, 28, 60,
77 3, 35, 11, 43, 19, 51, 27, 59,
78 2, 34, 10, 42, 18, 50, 26, 58,
79 1, 33, 9, 41, 17, 49, 25, 57,
80 0, 32, 8, 40, 16, 48, 24, 56
81};
82
26ac0430 83static char E0[] = {
63b81f13
GS
84 31, 0, 1, 2, 3, 4, 3, 4,
85 5, 6, 7, 8, 7, 8, 9, 10,
86 11, 12, 11, 12, 13, 14, 15, 16,
87 15, 16, 17, 18, 19, 20, 19, 20,
88 21, 22, 23, 24, 23, 24, 25, 26,
89 27, 28, 27, 28, 29, 30, 31, 0
90};
91
63b81f13
GS
92static char E[KS];
93
26ac0430 94static char PERM[] = {
63b81f13
GS
95 15, 6, 19, 20, 28, 11, 27, 16,
96 0, 14, 22, 25, 4, 17, 30, 9,
97 1, 7, 23, 13, 31, 26, 2, 8,
98 18, 12, 29, 5, 21, 10, 3, 24
99};
100
26ac0430 101static char S_BOX[][64] = {
63b81f13 102 {
26ac0430
AJ
103 14, 0, 4, 15, 13, 7, 1, 4, 2, 14, 15, 2, 11, 13, 8, 1,
104 3, 10, 10, 6, 6, 12, 12, 11, 5, 9, 9, 5, 0, 3, 7, 8,
105 4, 15, 1, 12, 14, 8, 8, 2, 13, 4, 6, 9, 2, 1, 11, 7,
106 15, 5, 12, 11, 9, 3, 7, 14, 3, 10, 10, 0, 5, 6, 0, 13
63b81f13
GS
107 },
108 {
26ac0430
AJ
109 15, 3, 1, 13, 8, 4, 14, 7, 6, 15, 11, 2, 3, 8, 4, 14,
110 9, 12, 7, 0, 2, 1, 13, 10, 12, 6, 0, 9, 5, 11, 10, 5,
111 0, 13, 14, 8, 7, 10, 11, 1, 10, 3, 4, 15, 13, 4, 1, 2,
112 5, 11, 8, 6, 12, 7, 6, 12, 9, 0, 3, 5, 2, 14, 15, 9
63b81f13
GS
113 },
114 {
26ac0430
AJ
115 10, 13, 0, 7, 9, 0, 14, 9, 6, 3, 3, 4, 15, 6, 5, 10,
116 1, 2, 13, 8, 12, 5, 7, 14, 11, 12, 4, 11, 2, 15, 8, 1,
117 13, 1, 6, 10, 4, 13, 9, 0, 8, 6, 15, 9, 3, 8, 0, 7,
118 11, 4, 1, 15, 2, 14, 12, 3, 5, 11, 10, 5, 14, 2, 7, 12
63b81f13
GS
119 },
120 {
26ac0430
AJ
121 7, 13, 13, 8, 14, 11, 3, 5, 0, 6, 6, 15, 9, 0, 10, 3,
122 1, 4, 2, 7, 8, 2, 5, 12, 11, 1, 12, 10, 4, 14, 15, 9,
123 10, 3, 6, 15, 9, 0, 0, 6, 12, 10, 11, 1, 7, 13, 13, 8,
124 15, 9, 1, 4, 3, 5, 14, 11, 5, 12, 2, 7, 8, 2, 4, 14
63b81f13
GS
125 },
126 {
26ac0430
AJ
127 2, 14, 12, 11, 4, 2, 1, 12, 7, 4, 10, 7, 11, 13, 6, 1,
128 8, 5, 5, 0, 3, 15, 15, 10, 13, 3, 0, 9, 14, 8, 9, 6,
129 4, 11, 2, 8, 1, 12, 11, 7, 10, 1, 13, 14, 7, 2, 8, 13,
130 15, 6, 9, 15, 12, 0, 5, 9, 6, 10, 3, 4, 0, 5, 14, 3
63b81f13
GS
131 },
132 {
26ac0430
AJ
133 12, 10, 1, 15, 10, 4, 15, 2, 9, 7, 2, 12, 6, 9, 8, 5,
134 0, 6, 13, 1, 3, 13, 4, 14, 14, 0, 7, 11, 5, 3, 11, 8,
135 9, 4, 14, 3, 15, 2, 5, 12, 2, 9, 8, 5, 12, 15, 3, 10,
136 7, 11, 0, 14, 4, 1, 10, 7, 1, 6, 13, 0, 11, 8, 6, 13
63b81f13
GS
137 },
138 {
26ac0430
AJ
139 4, 13, 11, 0, 2, 11, 14, 7, 15, 4, 0, 9, 8, 1, 13, 10,
140 3, 14, 12, 3, 9, 5, 7, 12, 5, 2, 10, 15, 6, 8, 1, 6,
141 1, 6, 4, 11, 11, 13, 13, 8, 12, 1, 3, 4, 7, 10, 14, 7,
142 10, 9, 15, 5, 6, 0, 8, 15, 0, 14, 5, 2, 9, 3, 2, 12
63b81f13
GS
143 },
144 {
26ac0430
AJ
145 13, 1, 2, 15, 8, 13, 4, 8, 6, 10, 15, 3, 11, 7, 1, 4,
146 10, 12, 9, 5, 3, 6, 14, 11, 5, 0, 0, 14, 12, 9, 7, 2,
147 7, 2, 11, 1, 4, 14, 1, 7, 9, 4, 12, 10, 14, 8, 2, 13,
148 0, 15, 6, 12, 10, 9, 13, 0, 15, 3, 3, 5, 5, 6, 8, 11
63b81f13
GS
149 }
150};
151
152static void
153perm(a, e, pc, n)
26ac0430
AJ
154register char *a, *e;
155register char *pc;
156int n;
63b81f13
GS
157{
158 for (; n--; pc++, a++)
8bd4e67e 159 *a = e[(int)*pc];
63b81f13
GS
160}
161
162static void
163crypt_main(nachr_l, nachr_r, schl)
26ac0430
AJ
164register char *nachr_l, *nachr_r;
165register char *schl;
63b81f13
GS
166{
167 char tmp[KS];
168 register int sbval;
169 register char *tp = tmp;
170 register char *e = E;
171 register int i, j;
172
173 for (i = 0; i < 8; i++) {
26ac0430 174 for (j = 0, sbval = 0; j < 6; j++)
8bd4e67e 175 sbval = (sbval << 1) | (nachr_r[(int)*e++] ^ *schl++);
26ac0430
AJ
176 sbval = S_BOX[i][sbval];
177 for (tp += 4, j = 4; j--; sbval >>= 1)
178 *--tp = sbval & 1;
179 tp += 4;
63b81f13
GS
180 }
181
182 e = PERM;
183 for (i = 0; i < BS2; i++)
8bd4e67e 184 *nachr_l++ ^= tmp[(int)*e++];
63b81f13
GS
185}
186
187void
188encrypt(char *nachr, int decr)
189{
190 char (*schl)[KS] = decr ? schluessel + 15 : schluessel;
191 char tmp[BS];
192 int i;
193
194 perm(tmp, nachr, IP, BS);
195
196 for (i = 8; i--;) {
26ac0430
AJ
197 crypt_main(tmp, tmp + BS2, *schl);
198 if (decr)
199 schl--;
200 else
201 schl++;
202 crypt_main(tmp + BS2, tmp, *schl);
203 if (decr)
204 schl--;
205 else
206 schl++;
63b81f13
GS
207 }
208
209 perm(nachr, tmp, EP, BS);
210}
211
212void
213setkey(char *schl)
214{
215 char tmp1[IS];
216 register unsigned int ls = 0x7efc;
217 register int i, j, k;
218 register int shval = 0;
219 register char *akt_schl;
220
221 memcpy(E, E0, KS);
222 perm(tmp1, schl, PC1, IS);
223
224 for (i = 0; i < 16; i++) {
26ac0430
AJ
225 shval += 1 + (ls & 1);
226 akt_schl = schluessel[i];
227 for (j = 0; j < KS; j++) {
228 if ((k = PC2[j]) >= IS2) {
229 if ((k += shval) >= IS)
230 k = (k - IS2) % IS2 + IS2;
231 } else if ((k += shval) >= IS2)
232 k %= IS2;
233 *akt_schl++ = tmp1[k];
234 }
235 ls >>= 1;
63b81f13
GS
236 }
237}
238
239char *
240crypt(const char *wort, const char *salt)
241{
242 static char retkey[14];
243 char key[BS + 2];
244 char *k;
245 int tmp, keybyte;
246 int i, j;
247
248 memset(key, 0, BS + 2);
249
250 for (k = key, i = 0; i < BS; i++) {
26ac0430
AJ
251 if (!(keybyte = *wort++))
252 break;
253 k += 7;
254 for (j = 0; j < 7; j++, i++) {
255 *--k = keybyte & 1;
256 keybyte >>= 1;
257 }
258 k += 8;
63b81f13
GS
259 }
260
261 setkey(key);
262 memset(key, 0, BS + 2);
263
264 for (k = E, i = 0; i < 2; i++) {
26ac0430
AJ
265 retkey[i] = keybyte = *salt++;
266 if (keybyte > 'Z')
267 keybyte -= 'a' - 'Z' - 1;
268 if (keybyte > '9')
269 keybyte -= 'A' - '9' - 1;
270 keybyte -= '.';
271
272 for (j = 0; j < 6; j++, keybyte >>= 1, k++) {
273 if (!(keybyte & 1))
274 continue;
275 tmp = *k;
276 *k = k[24];
277 k[24] = tmp;
278 }
63b81f13
GS
279 }
280
281 for (i = 0; i < 25; i++)
26ac0430 282 encrypt(key, 0);
63b81f13
GS
283
284 for (k = key, i = 0; i < 11; i++) {
26ac0430
AJ
285 for (j = keybyte = 0; j < 6; j++) {
286 keybyte <<= 1;
287 keybyte |= *k++;
288 }
289
290 keybyte += '.';
291 if (keybyte > '9')
292 keybyte += 'A' - '9' - 1;
293 if (keybyte > 'Z')
294 keybyte += 'a' - 'Z' - 1;
295 retkey[i + 2] = keybyte;
63b81f13
GS
296 }
297
298 retkey[i + 2] = 0;
299
300 if (!retkey[1])
26ac0430 301 retkey[1] = *retkey;
63b81f13
GS
302
303 return retkey;
304}
f53969cc 305