]>
git.ipfire.org Git - thirdparty/squid.git/blob - lib/encrypt.c
2 * Copyright (C) 1996-2014 The Squid Software Foundation and contributors
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.
9 /* encrypt.c - providing 56 bit DES encryption
10 * Copyright (C) 1991 Jochen Obalek
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)
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.
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. */
39 static char schluessel
[16][KS
];
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,
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,
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
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
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
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
94 static 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
101 static char S_BOX
[][64] = {
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
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
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
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
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
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
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
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
154 register char *a
, *e
;
158 for (; n
--; pc
++, a
++)
163 crypt_main(nachr_l
, nachr_r
, schl
)
164 register char *nachr_l
, *nachr_r
;
169 register char *tp
= tmp
;
170 register char *e
= E
;
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)
183 for (i
= 0; i
< BS2
; i
++)
184 *nachr_l
++ ^= tmp
[(int)*e
++];
188 encrypt(char *nachr
, int decr
)
190 char (*schl
)[KS
] = decr
? schluessel
+ 15 : schluessel
;
194 perm(tmp
, nachr
, IP
, BS
);
197 crypt_main(tmp
, tmp
+ BS2
, *schl
);
202 crypt_main(tmp
+ BS2
, tmp
, *schl
);
209 perm(nachr
, tmp
, EP
, BS
);
216 register unsigned int ls
= 0x7efc;
217 register int i
, j
, k
;
218 register int shval
= 0;
219 register char *akt_schl
;
222 perm(tmp1
, schl
, PC1
, IS
);
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
)
233 *akt_schl
++ = tmp1
[k
];
240 crypt(const char *wort
, const char *salt
)
242 static char retkey
[14];
248 memset(key
, 0, BS
+ 2);
250 for (k
= key
, i
= 0; i
< BS
; i
++) {
251 if (!(keybyte
= *wort
++))
254 for (j
= 0; j
< 7; j
++, i
++) {
262 memset(key
, 0, BS
+ 2);
264 for (k
= E
, i
= 0; i
< 2; i
++) {
265 retkey
[i
] = keybyte
= *salt
++;
267 keybyte
-= 'a' - 'Z' - 1;
269 keybyte
-= 'A' - '9' - 1;
272 for (j
= 0; j
< 6; j
++, keybyte
>>= 1, k
++) {
281 for (i
= 0; i
< 25; i
++)
284 for (k
= key
, i
= 0; i
< 11; i
++) {
285 for (j
= keybyte
= 0; j
< 6; j
++) {
292 keybyte
+= 'A' - '9' - 1;
294 keybyte
+= 'a' - 'Z' - 1;
295 retkey
[i
+ 2] = keybyte
;