]>
git.ipfire.org Git - thirdparty/squid.git/blob - lib/encrypt.c
3 /* encrypt.c - providing 56 bit DES encryption
4 * Copyright (C) 1991 Jochen Obalek
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)
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.
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. */
31 static char schluessel
[16][KS
];
35 56, 48, 40, 32, 24, 16, 8, 0,
36 57, 49, 41, 33, 25, 17, 9, 1,
37 58, 50, 42, 34, 26, 18, 10, 2,
39 62, 54, 46, 38, 30, 22, 14, 6,
40 61, 53, 45, 37, 29, 21, 13, 5,
41 60, 52, 44, 36, 28, 20, 12, 4,
47 13, 16, 10, 23, 0, 4, 2, 27,
48 14, 5, 20, 9, 22, 18, 11, 3,
49 25, 7, 15, 6, 26, 19, 12, 1,
50 40, 51, 30, 36, 46, 54, 29, 39,
51 50, 44, 32, 47, 43, 48, 38, 55,
52 33, 52, 45, 41, 49, 35, 28, 31
57 57, 49, 41, 33, 25, 17, 9, 1,
58 59, 51, 43, 35, 27, 19, 11, 3,
59 61, 53, 45, 37, 29, 21, 13, 5,
60 63, 55, 47, 39, 31, 23, 15, 7,
61 56, 48, 40, 32, 24, 16, 8, 0,
62 58, 50, 42, 34, 26, 18, 10, 2,
63 60, 52, 44, 36, 28, 20, 12, 4,
64 62, 54, 46, 38, 30, 22, 14, 6
69 7, 39, 15, 47, 23, 55, 31, 63,
70 6, 38, 14, 46, 22, 54, 30, 62,
71 5, 37, 13, 45, 21, 53, 29, 61,
72 4, 36, 12, 44, 20, 52, 28, 60,
73 3, 35, 11, 43, 19, 51, 27, 59,
74 2, 34, 10, 42, 18, 50, 26, 58,
75 1, 33, 9, 41, 17, 49, 25, 57,
76 0, 32, 8, 40, 16, 48, 24, 56
81 31, 0, 1, 2, 3, 4, 3, 4,
82 5, 6, 7, 8, 7, 8, 9, 10,
83 11, 12, 11, 12, 13, 14, 15, 16,
84 15, 16, 17, 18, 19, 20, 19, 20,
85 21, 22, 23, 24, 23, 24, 25, 26,
86 27, 28, 27, 28, 29, 30, 31, 0
93 static char PERM
[] = {
94 15, 6, 19, 20, 28, 11, 27, 16,
95 0, 14, 22, 25, 4, 17, 30, 9,
96 1, 7, 23, 13, 31, 26, 2, 8,
97 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
[*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
[*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
;