]>
Commit | Line | Data |
---|---|---|
0545caaa AJ |
1 | /* |
2 | * Copyright (C) 1996-2014 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 | */ | |
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 | ||
39 | static char schluessel[16][KS]; | |
40 | ||
26ac0430 | 41 | static 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 | 52 | static 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 | 61 | static 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 | 72 | static 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 | 83 | static 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 |
92 | static char E[KS]; |
93 | ||
26ac0430 | 94 | static 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 | 101 | static 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 | ||
152 | static void | |
153 | perm(a, e, pc, n) | |
26ac0430 AJ |
154 | register char *a, *e; |
155 | register char *pc; | |
156 | int n; | |
63b81f13 GS |
157 | { |
158 | for (; n--; pc++, a++) | |
8bd4e67e | 159 | *a = e[(int)*pc]; |
63b81f13 GS |
160 | } |
161 | ||
162 | static void | |
163 | crypt_main(nachr_l, nachr_r, schl) | |
26ac0430 AJ |
164 | register char *nachr_l, *nachr_r; |
165 | register 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 | ||
187 | void | |
188 | encrypt(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 | ||
212 | void | |
213 | setkey(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 | ||
239 | char * | |
240 | crypt(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 |