]>
git.ipfire.org Git - thirdparty/squid.git/blob - lib/encrypt.c
1 /* encrypt.c - providing 56 bit DES encryption
2 * Copyright (C) 1991 Jochen Obalek
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2, or (at your option)
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
29 static char schluessel
[16][KS
];
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,
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,
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
58 57, 49, 41, 33, 25, 17, 9, 1,
59 59, 51, 43, 35, 27, 19, 11, 3,
60 61, 53, 45, 37, 29, 21, 13, 5,
61 63, 55, 47, 39, 31, 23, 15, 7,
62 56, 48, 40, 32, 24, 16, 8, 0,
63 58, 50, 42, 34, 26, 18, 10, 2,
64 60, 52, 44, 36, 28, 20, 12, 4,
65 62, 54, 46, 38, 30, 22, 14, 6
71 7, 39, 15, 47, 23, 55, 31, 63,
72 6, 38, 14, 46, 22, 54, 30, 62,
73 5, 37, 13, 45, 21, 53, 29, 61,
74 4, 36, 12, 44, 20, 52, 28, 60,
75 3, 35, 11, 43, 19, 51, 27, 59,
76 2, 34, 10, 42, 18, 50, 26, 58,
77 1, 33, 9, 41, 17, 49, 25, 57,
78 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
98 15, 6, 19, 20, 28, 11, 27, 16,
99 0, 14, 22, 25, 4, 17, 30, 9,
100 1, 7, 23, 13, 31, 26, 2, 8,
101 18, 12, 29, 5, 21, 10, 3, 24
105 static char S_BOX
[][64] =
108 14, 0, 4, 15, 13, 7, 1, 4, 2, 14, 15, 2, 11, 13, 8, 1,
109 3, 10, 10, 6, 6, 12, 12, 11, 5, 9, 9, 5, 0, 3, 7, 8,
110 4, 15, 1, 12, 14, 8, 8, 2, 13, 4, 6, 9, 2, 1, 11, 7,
111 15, 5, 12, 11, 9, 3, 7, 14, 3, 10, 10, 0, 5, 6, 0, 13
114 15, 3, 1, 13, 8, 4, 14, 7, 6, 15, 11, 2, 3, 8, 4, 14,
115 9, 12, 7, 0, 2, 1, 13, 10, 12, 6, 0, 9, 5, 11, 10, 5,
116 0, 13, 14, 8, 7, 10, 11, 1, 10, 3, 4, 15, 13, 4, 1, 2,
117 5, 11, 8, 6, 12, 7, 6, 12, 9, 0, 3, 5, 2, 14, 15, 9
120 10, 13, 0, 7, 9, 0, 14, 9, 6, 3, 3, 4, 15, 6, 5, 10,
121 1, 2, 13, 8, 12, 5, 7, 14, 11, 12, 4, 11, 2, 15, 8, 1,
122 13, 1, 6, 10, 4, 13, 9, 0, 8, 6, 15, 9, 3, 8, 0, 7,
123 11, 4, 1, 15, 2, 14, 12, 3, 5, 11, 10, 5, 14, 2, 7, 12
126 7, 13, 13, 8, 14, 11, 3, 5, 0, 6, 6, 15, 9, 0, 10, 3,
127 1, 4, 2, 7, 8, 2, 5, 12, 11, 1, 12, 10, 4, 14, 15, 9,
128 10, 3, 6, 15, 9, 0, 0, 6, 12, 10, 11, 1, 7, 13, 13, 8,
129 15, 9, 1, 4, 3, 5, 14, 11, 5, 12, 2, 7, 8, 2, 4, 14
132 2, 14, 12, 11, 4, 2, 1, 12, 7, 4, 10, 7, 11, 13, 6, 1,
133 8, 5, 5, 0, 3, 15, 15, 10, 13, 3, 0, 9, 14, 8, 9, 6,
134 4, 11, 2, 8, 1, 12, 11, 7, 10, 1, 13, 14, 7, 2, 8, 13,
135 15, 6, 9, 15, 12, 0, 5, 9, 6, 10, 3, 4, 0, 5, 14, 3
138 12, 10, 1, 15, 10, 4, 15, 2, 9, 7, 2, 12, 6, 9, 8, 5,
139 0, 6, 13, 1, 3, 13, 4, 14, 14, 0, 7, 11, 5, 3, 11, 8,
140 9, 4, 14, 3, 15, 2, 5, 12, 2, 9, 8, 5, 12, 15, 3, 10,
141 7, 11, 0, 14, 4, 1, 10, 7, 1, 6, 13, 0, 11, 8, 6, 13
144 4, 13, 11, 0, 2, 11, 14, 7, 15, 4, 0, 9, 8, 1, 13, 10,
145 3, 14, 12, 3, 9, 5, 7, 12, 5, 2, 10, 15, 6, 8, 1, 6,
146 1, 6, 4, 11, 11, 13, 13, 8, 12, 1, 3, 4, 7, 10, 14, 7,
147 10, 9, 15, 5, 6, 0, 8, 15, 0, 14, 5, 2, 9, 3, 2, 12
150 13, 1, 2, 15, 8, 13, 4, 8, 6, 10, 15, 3, 11, 7, 1, 4,
151 10, 12, 9, 5, 3, 6, 14, 11, 5, 0, 0, 14, 12, 9, 7, 2,
152 7, 2, 11, 1, 4, 14, 1, 7, 9, 4, 12, 10, 14, 8, 2, 13,
153 0, 15, 6, 12, 10, 9, 13, 0, 15, 3, 3, 5, 5, 6, 8, 11
159 register char *a
, *e
;
163 for (; n
--; pc
++, a
++)
168 crypt_main(nachr_l
, nachr_r
, schl
)
169 register char *nachr_l
, *nachr_r
;
174 register char *tp
= tmp
;
175 register char *e
= E
;
178 for (i
= 0; i
< 8; i
++) {
179 for (j
= 0, sbval
= 0; j
< 6; j
++)
180 sbval
= (sbval
<< 1) | (nachr_r
[*e
++] ^ *schl
++);
181 sbval
= S_BOX
[i
][sbval
];
182 for (tp
+= 4, j
= 4; j
--; sbval
>>= 1)
188 for (i
= 0; i
< BS2
; i
++)
189 *nachr_l
++ ^= tmp
[*e
++];
193 encrypt(char *nachr
, int decr
)
195 char (*schl
)[KS
] = decr
? schluessel
+ 15 : schluessel
;
199 perm(tmp
, nachr
, IP
, BS
);
202 crypt_main(tmp
, tmp
+ BS2
, *schl
);
207 crypt_main(tmp
+ BS2
, tmp
, *schl
);
214 perm(nachr
, tmp
, EP
, BS
);
221 register unsigned int ls
= 0x7efc;
222 register int i
, j
, k
;
223 register int shval
= 0;
224 register char *akt_schl
;
227 perm(tmp1
, schl
, PC1
, IS
);
229 for (i
= 0; i
< 16; i
++) {
230 shval
+= 1 + (ls
& 1);
231 akt_schl
= schluessel
[i
];
232 for (j
= 0; j
< KS
; j
++) {
233 if ((k
= PC2
[j
]) >= IS2
) {
234 if ((k
+= shval
) >= IS
)
235 k
= (k
- IS2
) % IS2
+ IS2
;
236 } else if ((k
+= shval
) >= IS2
)
238 *akt_schl
++ = tmp1
[k
];
245 crypt(const char *wort
, const char *salt
)
247 static char retkey
[14];
253 memset(key
, 0, BS
+ 2);
255 for (k
= key
, i
= 0; i
< BS
; i
++) {
256 if (!(keybyte
= *wort
++))
259 for (j
= 0; j
< 7; j
++, i
++) {
267 memset(key
, 0, BS
+ 2);
269 for (k
= E
, i
= 0; i
< 2; i
++) {
270 retkey
[i
] = keybyte
= *salt
++;
272 keybyte
-= 'a' - 'Z' - 1;
274 keybyte
-= 'A' - '9' - 1;
277 for (j
= 0; j
< 6; j
++, keybyte
>>= 1, k
++) {
286 for (i
= 0; i
< 25; i
++)
289 for (k
= key
, i
= 0; i
< 11; i
++) {
290 for (j
= keybyte
= 0; j
< 6; j
++) {
297 keybyte
+= 'A' - '9' - 1;
299 keybyte
+= 'a' - 'Z' - 1;
300 retkey
[i
+ 2] = keybyte
;