Squid Web Cache master
Loading...
Searching...
No Matches
encrypt.c
Go to the documentation of this file.
1/*
2 * Copyright (C) 1996-2025 The Squid Software Foundation and contributors
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 */
8
9/* encrypt.c - providing 56 bit DES encryption
10 * Copyright (C) 1991 Jochen Obalek
11 *
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.
16 *
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.
21 *
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
26#include "squid.h"
27
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
41static char PC1[] = {
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
52static char PC2[] = {
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
61static char IP[] = {
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
72static char EP[] = {
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
83static char E0[] = {
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
92static char E[KS];
93
94static char PERM[] = {
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
101static char S_BOX[][64] = {
102 {
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
107 },
108 {
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
113 },
114 {
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
119 },
120 {
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
125 },
126 {
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
131 },
132 {
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
137 },
138 {
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
143 },
144 {
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
149 }
150};
151
152static void
153perm(a, e, pc, n)
154register char *a, *e;
155register char *pc;
156int n;
157{
158 for (; n--; pc++, a++)
159 *a = e[(int)*pc];
160}
161
162static void
163crypt_main(nachr_l, nachr_r, schl)
164register char *nachr_l, *nachr_r;
165register char *schl;
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++) {
174 for (j = 0, sbval = 0; j < 6; j++)
175 sbval = (sbval << 1) | (nachr_r[(int)*e++] ^ *schl++);
176 sbval = S_BOX[i][sbval];
177 for (tp += 4, j = 4; j--; sbval >>= 1)
178 *--tp = sbval & 1;
179 tp += 4;
180 }
181
182 e = PERM;
183 for (i = 0; i < BS2; i++)
184 *nachr_l++ ^= tmp[(int)*e++];
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--;) {
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++;
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++) {
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;
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++) {
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;
259 }
260
261 setkey(key);
262 memset(key, 0, BS + 2);
263
264 for (k = E, i = 0; i < 2; i++) {
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 }
279 }
280
281 for (i = 0; i < 25; i++)
282 encrypt(key, 0);
283
284 for (k = key, i = 0; i < 11; i++) {
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;
296 }
297
298 retkey[i + 2] = 0;
299
300 if (!retkey[1])
301 retkey[1] = *retkey;
302
303 return retkey;
304}
305
static char PC1[]
Definition encrypt.c:41
#define KS
Definition encrypt.c:34
static char IP[]
Definition encrypt.c:61
void encrypt(char *nachr, int decr)
Definition encrypt.c:188
static char PERM[]
Definition encrypt.c:94
void setkey(char *schl)
Definition encrypt.c:213
#define BS2
Definition encrypt.c:33
#define BS
Definition encrypt.c:32
static void perm(char *a, char *e, char *pc, int n)
Definition encrypt.c:153
static char PC2[]
Definition encrypt.c:52
static void crypt_main(char *nachr_l, char *nachr_r, char *schl)
Definition encrypt.c:163
static char S_BOX[][64]
Definition encrypt.c:101
char * crypt(const char *wort, const char *salt)
Definition encrypt.c:240
static char E0[]
Definition encrypt.c:83
static char E[KS]
Definition encrypt.c:92
static char EP[]
Definition encrypt.c:72
#define IS2
Definition encrypt.c:37
#define IS
Definition encrypt.c:36
static char schluessel[16][KS]
Definition encrypt.c:39
int unsigned int
Definition stub_fd.cc:19