|
|
1 # include "dgd.h"
2
3 /*
4 * A crypt function tailored to DGD, small but reasonably fast.
5 */
6
7 static char Salt[256] = {
8 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
9 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
10 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,32,
11 16,48, 8,40,24,56, 4,36,20,52,40,24,56, 4,36,20,
12 52,12,44,28,60, 2,34,18,50,10,42,26,58, 6,38,22,
13 54,14,46,30,62, 1,33,17,49, 9,41, 1,33,17,49, 9,
14 41,25,57, 5,37,21,53,13,45,29,61, 3,35,19,51,11,
15 43,27,59, 7,39,23,55,15,47,31,63, 0, 0, 0, 0, 0,
16 };
17
18 static char Rot[] = {
19 0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,0,
20 };
21
22 static Uint PC2[14][16] = { {
23 0x00000000, 0x00040000, 0x00002000, 0x00042000, 0x00000001, 0x00040001,
24 0x00002001, 0x00042001, 0x02000000, 0x02040000, 0x02002000, 0x02042000,
25 0x02000001, 0x02040001, 0x02002001, 0x02042001,
26 }, {
27 0x00000000, 0x00010000, 0x00000010, 0x00010010, 0x00000400, 0x00010400,
28 0x00000410, 0x00010410, 0x01000000, 0x01010000, 0x01000010, 0x01010010,
29 0x01000400, 0x01010400, 0x01000410, 0x01010410,
30 }, {
31 0x00000000, 0x00080000, 0x08000000, 0x08080000, 0x00000100, 0x00080100,
32 0x08000100, 0x08080100, 0x00000000, 0x00080000, 0x08000000, 0x08080000,
33 0x00000100, 0x00080100, 0x08000100, 0x08080100,
34 }, {
35 0x00000000, 0x00000020, 0x00000800, 0x00000820, 0x20000000, 0x20000020,
36 0x20000800, 0x20000820, 0x00000002, 0x00000022, 0x00000802, 0x00000822,
37 0x20000002, 0x20000022, 0x20000802, 0x20000822,
38 }, {
39 0x00000000, 0x00000004, 0x00100000, 0x00100004, 0x00000000, 0x00000004,
40 0x00100000, 0x00100004, 0x10000000, 0x10000004, 0x10100000, 0x10100004,
41 0x10000000, 0x10000004, 0x10100000, 0x10100004,
42 }, {
43 0x00000000, 0x04000000, 0x00200000, 0x04200000, 0x00000000, 0x04000000,
44 0x00200000, 0x04200000, 0x00000200, 0x04000200, 0x00200200, 0x04200200,
45 0x00000200, 0x04000200, 0x00200200, 0x04200200,
46 }, {
47 0x00000000, 0x00001000, 0x00000008, 0x00001008, 0x00020000, 0x00021000,
48 0x00020008, 0x00021008, 0x00000000, 0x00001000, 0x00000008, 0x00001008,
49 0x00020000, 0x00021000, 0x00020008, 0x00021008,
50 }, {
51 0x00000000, 0x00000001, 0x08000000, 0x08000001, 0x00002000, 0x00002001,
52 0x08002000, 0x08002001, 0x00000002, 0x00000003, 0x08000002, 0x08000003,
53 0x00002002, 0x00002003, 0x08002002, 0x08002003,
54 }, {
55 0x00000000, 0x00000004, 0x00000000, 0x00000004, 0x00020000, 0x00020004,
56 0x00020000, 0x00020004, 0x00000200, 0x00000204, 0x00000200, 0x00000204,
57 0x00020200, 0x00020204, 0x00020200, 0x00020204,
58 }, {
59 0x00000000, 0x00001000, 0x00080000, 0x00081000, 0x00000000, 0x00001000,
60 0x00080000, 0x00081000, 0x04000000, 0x04001000, 0x04080000, 0x04081000,
61 0x04000000, 0x04001000, 0x04080000, 0x04081000,
62 }, {
63 0x00000000, 0x00200000, 0x00000000, 0x00200000, 0x00000010, 0x00200010,
64 0x00000010, 0x00200010, 0x20000000, 0x20200000, 0x20000000, 0x20200000,
65 0x20000010, 0x20200010, 0x20000010, 0x20200010,
66 }, {
67 0x00000000, 0x00000100, 0x02000000, 0x02000100, 0x00000020, 0x00000120,
68 0x02000020, 0x02000120, 0x00000400, 0x00000500, 0x02000400, 0x02000500,
69 0x00000420, 0x00000520, 0x02000420, 0x02000520,
70 }, {
71 0x00000000, 0x10000000, 0x00000800, 0x10000800, 0x00000008, 0x10000008,
72 0x00000808, 0x10000808, 0x00100000, 0x10100000, 0x00100800, 0x10100800,
73 0x00100008, 0x10100008, 0x00100808, 0x10100808,
74 }, {
75 0x00000000, 0x00040000, 0x01000000, 0x01040000, 0x00000000, 0x00040000,
76 0x01000000, 0x01040000, 0x00010000, 0x00050000, 0x01010000, 0x01050000,
77 0x00010000, 0x00050000, 0x01010000, 0x01050000,
78 } };
79
80 static char S[8][64] = { {
81 14, 0, 4,15,13, 7, 1, 4, 2,14,15, 2,11,13, 8, 1,
82 3,10,10, 6, 6,12,12,11, 5, 9, 9, 5, 0, 3, 7, 8,
83 4,15, 1,12,14, 8, 8, 2,13, 4, 6, 9, 2, 1,11, 7,
84 15, 5,12,11, 9, 3, 7,14, 3,10,10, 0, 5, 6, 0,13,
85 }, {
86 15, 3, 1,13, 8, 4,14, 7, 6,15,11, 2, 3, 8, 4,14,
87 9,12, 7, 0, 2, 1,13,10,12, 6, 0, 9, 5,11,10, 5,
88 0,13,14, 8, 7,10,11, 1,10, 3, 4,15,13, 4, 1, 2,
89 5,11, 8, 6,12, 7, 6,12, 9, 0, 3, 5, 2,14,15, 9,
90 }, {
91 10,13, 0, 7, 9, 0,14, 9, 6, 3, 3, 4,15, 6, 5,10,
92 1, 2,13, 8,12, 5, 7,14,11,12, 4,11, 2,15, 8, 1,
93 13, 1, 6,10, 4,13, 9, 0, 8, 6,15, 9, 3, 8, 0, 7,
94 11, 4, 1,15, 2,14,12, 3, 5,11,10, 5,14, 2, 7,12,
95 }, {
96 7,13,13, 8,14,11, 3, 5, 0, 6, 6,15, 9, 0,10, 3,
97 1, 4, 2, 7, 8, 2, 5,12,11, 1,12,10, 4,14,15, 9,
98 10, 3, 6,15, 9, 0, 0, 6,12,10,11, 1, 7,13,13, 8,
99 15, 9, 1, 4, 3, 5,14,11, 5,12, 2, 7, 8, 2, 4,14,
100 }, {
101 2,14,12,11, 4, 2, 1,12, 7, 4,10, 7,11,13, 6, 1,
102 8, 5, 5, 0, 3,15,15,10,13, 3, 0, 9,14, 8, 9, 6,
103 4,11, 2, 8, 1,12,11, 7,10, 1,13,14, 7, 2, 8,13,
104 15, 6, 9,15,12, 0, 5, 9, 6,10, 3, 4, 0, 5,14, 3,
105 }, {
106 12,10, 1,15,10, 4,15, 2, 9, 7, 2,12, 6, 9, 8, 5,
107 0, 6,13, 1, 3,13, 4,14,14, 0, 7,11, 5, 3,11, 8,
108 9, 4,14, 3,15, 2, 5,12, 2, 9, 8, 5,12,15, 3,10,
109 7,11, 0,14, 4, 1,10, 7, 1, 6,13, 0,11, 8, 6,13,
110 }, {
111 4,13,11, 0, 2,11,14, 7,15, 4, 0, 9, 8, 1,13,10,
112 3,14,12, 3, 9, 5, 7,12, 5, 2,10,15, 6, 8, 1, 6,
113 1, 6, 4,11,11,13,13, 8,12, 1, 3, 4, 7,10,14, 7,
114 10, 9,15, 5, 6, 0, 8,15, 0,14, 5, 2, 9, 3, 2,12,
115 }, {
116 13, 1, 2,15, 8,13, 4, 8, 6,10,15, 3,11, 7, 1, 4,
117 10,12, 9, 5, 3, 6,14,11, 5, 0, 0,14,12, 9, 7, 2,
118 7, 2,11, 1, 4,14, 1, 7, 9, 4,12,10,14, 8, 2,13,
119 0,15, 6,12,10, 9,13, 0,15, 3, 3, 5, 5, 6, 8,11,
120 } };
121
122 static Uint PM[8][16] = { {
123 0x00000000, 0x00000002, 0x00000200, 0x00000202,
124 0x00008000, 0x00008002, 0x00008200, 0x00008202,
125 0x00800000, 0x00800002, 0x00800200, 0x00800202,
126 0x00808000, 0x00808002, 0x00808200, 0x00808202,
127 }, {
128 0x00000000, 0x00004000, 0x40000000, 0x40004000,
129 0x00000010, 0x00004010, 0x40000010, 0x40004010,
130 0x00080000, 0x00084000, 0x40080000, 0x40084000,
131 0x00080010, 0x00084010, 0x40080010, 0x40084010,
132 }, {
133 0x00000000, 0x04000000, 0x00000004, 0x04000004,
134 0x00010000, 0x04010000, 0x00010004, 0x04010004,
135 0x00000100, 0x04000100, 0x00000104, 0x04000104,
136 0x00010100, 0x04010100, 0x00010104, 0x04010104,
137 }, {
138 0x00000000, 0x80000000, 0x00400000, 0x80400000,
139 0x00001000, 0x80001000, 0x00401000, 0x80401000,
140 0x00000040, 0x80000040, 0x00400040, 0x80400040,
141 0x00001040, 0x80001040, 0x00401040, 0x80401040,
142 }, {
143 0x00000000, 0x20000000, 0x00000080, 0x20000080,
144 0x00040000, 0x20040000, 0x00040080, 0x20040080,
145 0x01000000, 0x21000000, 0x01000080, 0x21000080,
146 0x01040000, 0x21040000, 0x01040080, 0x21040080,
147 }, {
148 0x00000000, 0x00002000, 0x00200000, 0x00202000,
149 0x00000008, 0x00002008, 0x00200008, 0x00202008,
150 0x10000000, 0x10002000, 0x10200000, 0x10202000,
151 0x10000008, 0x10002008, 0x10200008, 0x10202008,
152 }, {
153 0x00000000, 0x02000000, 0x00000400, 0x02000400,
154 0x00100000, 0x02100000, 0x00100400, 0x02100400,
155 0x00000001, 0x02000001, 0x00000401, 0x02000401,
156 0x00100001, 0x02100001, 0x00100401, 0x02100401,
157 }, {
158 0x00000000, 0x00000800, 0x00020000, 0x00020800,
159 0x00000020, 0x00000820, 0x00020020, 0x00020820,
160 0x08000000, 0x08000800, 0x08020000, 0x08020800,
161 0x08000020, 0x08000820, 0x08020020, 0x08020820,
162 } };
163
164 static char out[64] = {
165 '.', '/', '', '1', '2', '3', '4', '5',
166 '6', '7', '8', '9', 'A', 'B', 'C', 'D',
167 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L',
168 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
169 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b',
170 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
171 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r',
172 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
173 };
174
175 # define EXG1(a, t, n, m) ((t) = (((a) >> (n)) ^ (a)) & (m), \
176 (a) ^= (t), (a) ^= ((t) << (n)))
177 # define EXG2(a, b, t, n, m) ((t) = (((a) >> (n)) ^ (b)) & (m), \
178 (b) ^= (t), (a) ^= (t) << (n))
179
180 /*
181 * NAME: P->crypt()
182 * DESCRIPTION: Unix password encryption.
183 */
184 char *P_crypt(passwd, salt)
185 char *passwd, *salt;
186 {
187 static char result[14];
188 register Uint L, R, T, A, B;
189 register int i, j;
190 register char *p;
191 Uint keys[16][2], E[2];
192
193 /* fetch password data */
194 memset(result, '\0', 8);
195 strncpy(result, passwd, 8);
196 p = result;
197 L = UCHAR(*p++) << 1; L <<= 8;
198 L |= UCHAR(*p++) << 1; L <<= 8;
199 L |= UCHAR(*p++) << 1; L <<= 8;
200 L |= UCHAR(*p++) << 1;
201 R = UCHAR(*p++) << 1; R <<= 8;
202 R |= UCHAR(*p++) << 1; R <<= 8;
203 R |= UCHAR(*p++) << 1; R <<= 8;
204 R |= UCHAR(*p) << 1;
205
206 /* PC1 */
207 EXG2(R, L, T, 4, 0x0f0f0f0f);
208 EXG1(L, T, 14, 0xcccc);
209 EXG1(L, T, 7, 0xaa00aa);
210 EXG1(L, T, 4, 0x0f0f0f0f);
211 EXG1(L, T, 2, 0x33333333);
212 EXG1(L, T, 1, 0x55555555);
213 EXG1(R, T, 18, 0x3333);
214 EXG1(R, T, 9, 0x550055);
215 EXG1(R, T, 4, 0x0f0f0f0f);
216 R = (R << 4) | (L & 0xf);
217 L >>= 4;
218
219 /* PC2 */
220 for (i = 15; i >= 0; --i) {
221 if (Rot[i] == 0) {
222 L = (L << 1) | (L >> 27);
223 R = (R << 1) | (R >> 27);
224 } else {
225 L = (L << 2) | (L >> 26);
226 R = (R << 2) | (R >> 26);
227 }
228 L &= 0x0fffffff;
229 R &= 0x0fffffff;
230
231 A = PC2[ 0][ L >> 24 ] |
232 PC2[ 1][(L >> 20) & 0xf] |
233 PC2[ 2][(L >> 16) & 0xf] |
234 PC2[ 3][(L >> 12) & 0xf] |
235 PC2[ 4][(L >> 8) & 0xf] |
236 PC2[ 5][(L >> 4) & 0xf] |
237 PC2[ 6][ L & 0xf];
238 B = PC2[ 7][ R >> 24 ] |
239 PC2[ 8][(R >> 20) & 0xf] |
240 PC2[ 9][(R >> 16) & 0xf] |
241 PC2[10][(R >> 12) & 0xf] |
242 PC2[11][(R >> 8) & 0xf] |
243 PC2[12][(R >> 4) & 0xf] |
244 PC2[13][ R & 0xf];
245 EXG2(B, A, T, 16, 0x3f3f);
246 keys[i][0] = A;
247 keys[i][1] = B;
248 }
249
250 /* prepare salt */
251 E[0] = UCHAR(Salt[UCHAR(result[0] = *salt++)]) << 8;
252 E[1] = UCHAR(Salt[UCHAR(result[1] = *salt++)]) << 4;
253
254 /* encrypt */
255 L = 0;
256 R = 0;
257 for (i = 25; i > 0; --i) {
258 for (j = 15; j >= 0; --j) {
259 T = L;
260 L = R;
261 A = (R >> 3) | (R << 29);
262 R = T;
263 T = A ^ (A >> 16);
264 B = T & E[0];
265 B ^= (B << 16) ^ A ^ keys[j][0];
266 R ^= PM[6][UCHAR(S[6][B & 0x3f])]; B >>= 8;
267 R ^= PM[4][UCHAR(S[4][B & 0x3f])]; B >>= 8;
268 R ^= PM[2][UCHAR(S[2][B & 0x3f])]; B >>= 8;
269 R ^= PM[0][UCHAR(S[0][B & 0x3f])];
270 B = T & E[1];
271 B ^= (B << 16) ^ A;
272 B = ((B << 4) | (B >> 28)) ^ keys[j][1];
273 R ^= PM[7][UCHAR(S[7][B & 0x3f])]; B >>= 8;
274 R ^= PM[5][UCHAR(S[5][B & 0x3f])]; B >>= 8;
275 R ^= PM[3][UCHAR(S[3][B & 0x3f])]; B >>= 8;
276 R ^= PM[1][UCHAR(S[1][B & 0x3f])];
277 }
278 T = L;
279 L = R;
280 R = T;
281 }
282
283 /* FP */
284 EXG2(L, R, T, 1, 0x55555555);
285 EXG2(R, L, T, 8, 0xff00ff);
286 EXG2(R, L, T, 2, 0x33333333);
287 EXG2(L, R, T, 16, 0xffff);
288 EXG2(L, R, T, 4, 0x0f0f0f0f);
289
290 /* put result in static buffer */
291 p = result + 13;
292 *p = '\0';
293 *--p = out[(R << 2) & 0x3f]; R >>= 4;
294 *--p = out[R & 0x3f]; R >>= 6;
295 *--p = out[R & 0x3f]; R >>= 6;
296 *--p = out[R & 0x3f]; R >>= 6;
297 *--p = out[R & 0x3f]; R >>= 6;
298 *--p = out[((L << 4) | R) & 0x3f]; L >>= 2;
299 *--p = out[L & 0x3f]; L >>= 6;
300 *--p = out[L & 0x3f]; L >>= 6;
301 *--p = out[L & 0x3f]; L >>= 6;
302 *--p = out[L & 0x3f]; L >>= 6;
303 *--p = out[L & 0x3f];
304
305 return result;
306 }
307
This page was automatically generated by the
LXR engine.
Visit the LXR main site for more
information.