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