]>
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
];
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,
45 13, 16, 10, 23, 0, 4, 2, 27,
46 14, 5, 20, 9, 22, 18, 11, 3,
47 25, 7, 15, 6, 26, 19, 12, 1,
48 40, 51, 30, 36, 46, 54, 29, 39,
49 50, 44, 32, 47, 43, 48, 38, 55,
50 33, 52, 45, 41, 49, 35, 28, 31
54 57, 49, 41, 33, 25, 17, 9, 1,
55 59, 51, 43, 35, 27, 19, 11, 3,
56 61, 53, 45, 37, 29, 21, 13, 5,
57 63, 55, 47, 39, 31, 23, 15, 7,
58 56, 48, 40, 32, 24, 16, 8, 0,
59 58, 50, 42, 34, 26, 18, 10, 2,
60 60, 52, 44, 36, 28, 20, 12, 4,
61 62, 54, 46, 38, 30, 22, 14, 6
65 7, 39, 15, 47, 23, 55, 31, 63,
66 6, 38, 14, 46, 22, 54, 30, 62,
67 5, 37, 13, 45, 21, 53, 29, 61,
68 4, 36, 12, 44, 20, 52, 28, 60,
69 3, 35, 11, 43, 19, 51, 27, 59,
70 2, 34, 10, 42, 18, 50, 26, 58,
71 1, 33, 9, 41, 17, 49, 25, 57,
72 0, 32, 8, 40, 16, 48, 24, 56
76 31, 0, 1, 2, 3, 4, 3, 4,
77 5, 6, 7, 8, 7, 8, 9, 10,
78 11, 12, 11, 12, 13, 14, 15, 16,
79 15, 16, 17, 18, 19, 20, 19, 20,
80 21, 22, 23, 24, 23, 24, 25, 26,
81 27, 28, 27, 28, 29, 30, 31, 0
86 static char PERM
[] = {
87 15, 6, 19, 20, 28, 11, 27, 16,
88 0, 14, 22, 25, 4, 17, 30, 9,
89 1, 7, 23, 13, 31, 26, 2, 8,
90 18, 12, 29, 5, 21, 10, 3, 24
93 static char S_BOX
[][64] = {
95 14, 0, 4, 15, 13, 7, 1, 4, 2, 14, 15, 2, 11, 13, 8, 1,
96 3, 10, 10, 6, 6, 12, 12, 11, 5, 9, 9, 5, 0, 3, 7, 8,
97 4, 15, 1, 12, 14, 8, 8, 2, 13, 4, 6, 9, 2, 1, 11, 7,
98 15, 5, 12, 11, 9, 3, 7, 14, 3, 10, 10, 0, 5, 6, 0, 13
101 15, 3, 1, 13, 8, 4, 14, 7, 6, 15, 11, 2, 3, 8, 4, 14,
102 9, 12, 7, 0, 2, 1, 13, 10, 12, 6, 0, 9, 5, 11, 10, 5,
103 0, 13, 14, 8, 7, 10, 11, 1, 10, 3, 4, 15, 13, 4, 1, 2,
104 5, 11, 8, 6, 12, 7, 6, 12, 9, 0, 3, 5, 2, 14, 15, 9
107 10, 13, 0, 7, 9, 0, 14, 9, 6, 3, 3, 4, 15, 6, 5, 10,
108 1, 2, 13, 8, 12, 5, 7, 14, 11, 12, 4, 11, 2, 15, 8, 1,
109 13, 1, 6, 10, 4, 13, 9, 0, 8, 6, 15, 9, 3, 8, 0, 7,
110 11, 4, 1, 15, 2, 14, 12, 3, 5, 11, 10, 5, 14, 2, 7, 12
113 7, 13, 13, 8, 14, 11, 3, 5, 0, 6, 6, 15, 9, 0, 10, 3,
114 1, 4, 2, 7, 8, 2, 5, 12, 11, 1, 12, 10, 4, 14, 15, 9,
115 10, 3, 6, 15, 9, 0, 0, 6, 12, 10, 11, 1, 7, 13, 13, 8,
116 15, 9, 1, 4, 3, 5, 14, 11, 5, 12, 2, 7, 8, 2, 4, 14
119 2, 14, 12, 11, 4, 2, 1, 12, 7, 4, 10, 7, 11, 13, 6, 1,
120 8, 5, 5, 0, 3, 15, 15, 10, 13, 3, 0, 9, 14, 8, 9, 6,
121 4, 11, 2, 8, 1, 12, 11, 7, 10, 1, 13, 14, 7, 2, 8, 13,
122 15, 6, 9, 15, 12, 0, 5, 9, 6, 10, 3, 4, 0, 5, 14, 3
125 12, 10, 1, 15, 10, 4, 15, 2, 9, 7, 2, 12, 6, 9, 8, 5,
126 0, 6, 13, 1, 3, 13, 4, 14, 14, 0, 7, 11, 5, 3, 11, 8,
127 9, 4, 14, 3, 15, 2, 5, 12, 2, 9, 8, 5, 12, 15, 3, 10,
128 7, 11, 0, 14, 4, 1, 10, 7, 1, 6, 13, 0, 11, 8, 6, 13
131 4, 13, 11, 0, 2, 11, 14, 7, 15, 4, 0, 9, 8, 1, 13, 10,
132 3, 14, 12, 3, 9, 5, 7, 12, 5, 2, 10, 15, 6, 8, 1, 6,
133 1, 6, 4, 11, 11, 13, 13, 8, 12, 1, 3, 4, 7, 10, 14, 7,
134 10, 9, 15, 5, 6, 0, 8, 15, 0, 14, 5, 2, 9, 3, 2, 12
137 13, 1, 2, 15, 8, 13, 4, 8, 6, 10, 15, 3, 11, 7, 1, 4,
138 10, 12, 9, 5, 3, 6, 14, 11, 5, 0, 0, 14, 12, 9, 7, 2,
139 7, 2, 11, 1, 4, 14, 1, 7, 9, 4, 12, 10, 14, 8, 2, 13,
140 0, 15, 6, 12, 10, 9, 13, 0, 15, 3, 3, 5, 5, 6, 8, 11
146 register char *a
, *e
;
150 for (; n
--; pc
++, a
++)
155 crypt_main(nachr_l
, nachr_r
, schl
)
156 register char *nachr_l
, *nachr_r
;
161 register char *tp
= tmp
;
162 register char *e
= E
;
165 for (i
= 0; i
< 8; i
++) {
166 for (j
= 0, sbval
= 0; j
< 6; j
++)
167 sbval
= (sbval
<< 1) | (nachr_r
[(int)*e
++] ^ *schl
++);
168 sbval
= S_BOX
[i
][sbval
];
169 for (tp
+= 4, j
= 4; j
--; sbval
>>= 1)
175 for (i
= 0; i
< BS2
; i
++)
176 *nachr_l
++ ^= tmp
[(int)*e
++];
180 encrypt(char *nachr
, int decr
)
182 char (*schl
)[KS
] = decr
? schluessel
+ 15 : schluessel
;
186 perm(tmp
, nachr
, IP
, BS
);
189 crypt_main(tmp
, tmp
+ BS2
, *schl
);
194 crypt_main(tmp
+ BS2
, tmp
, *schl
);
201 perm(nachr
, tmp
, EP
, BS
);
208 register unsigned int ls
= 0x7efc;
209 register int i
, j
, k
;
210 register int shval
= 0;
211 register char *akt_schl
;
214 perm(tmp1
, schl
, PC1
, IS
);
216 for (i
= 0; i
< 16; i
++) {
217 shval
+= 1 + (ls
& 1);
218 akt_schl
= schluessel
[i
];
219 for (j
= 0; j
< KS
; j
++) {
220 if ((k
= PC2
[j
]) >= IS2
) {
221 if ((k
+= shval
) >= IS
)
222 k
= (k
- IS2
) % IS2
+ IS2
;
223 } else if ((k
+= shval
) >= IS2
)
225 *akt_schl
++ = tmp1
[k
];
232 crypt(const char *wort
, const char *salt
)
234 static char retkey
[14];
240 memset(key
, 0, BS
+ 2);
242 for (k
= key
, i
= 0; i
< BS
; i
++) {
243 if (!(keybyte
= *wort
++))
246 for (j
= 0; j
< 7; j
++, i
++) {
254 memset(key
, 0, BS
+ 2);
256 for (k
= E
, i
= 0; i
< 2; i
++) {
257 retkey
[i
] = keybyte
= *salt
++;
259 keybyte
-= 'a' - 'Z' - 1;
261 keybyte
-= 'A' - '9' - 1;
264 for (j
= 0; j
< 6; j
++, keybyte
>>= 1, k
++) {
273 for (i
= 0; i
< 25; i
++)
276 for (k
= key
, i
= 0; i
< 11; i
++) {
277 for (j
= keybyte
= 0; j
< 6; j
++) {
284 keybyte
+= 'A' - '9' - 1;
286 keybyte
+= 'a' - 'Z' - 1;
287 retkey
[i
+ 2] = keybyte
;