ArchWizard

DGD/

source navigation ]
diff markup ]
identifier search ]
file search ]
Version: [ 1.0.a0 ] [ 1.1 ] [ 1.2 ] [ 1.2p1 ] [ 1.2p2 ] [ 1.2p3 ] [ 1.2p4 ] [ 1.2.151 ]

  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 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ file search ] ~

This page was automatically generated by the LXR engine.
Visit the LXR main site for more information.