1 package org.rosuda.REngine.Rserve.protocol;
3 /****************************************************************************
6 * Java-based implementation of the unix crypt command
8 * Based upon C source code written by Eric Young, eay@psych.uq.oz.au
10 ****************************************************************************/
14 private static final int ITERATIONS = 16;
16 private static final int con_salt[] =
18 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
19 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
20 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
21 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
22 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
23 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
24 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
25 0x0A, 0x0B, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A,
26 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12,
27 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A,
28 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22,
29 0x23, 0x24, 0x25, 0x20, 0x21, 0x22, 0x23, 0x24,
30 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C,
31 0x2D, 0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34,
32 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C,
33 0x3D, 0x3E, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00,
36 private static final boolean shifts2[] =
38 false, false, true, true, true, true, true, true,
39 false, true, true, true, true, true, true, false
42 private static final int skb[][] =
45 /* for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 */
46 0x00000000, 0x00000010, 0x20000000, 0x20000010,
47 0x00010000, 0x00010010, 0x20010000, 0x20010010,
48 0x00000800, 0x00000810, 0x20000800, 0x20000810,
49 0x00010800, 0x00010810, 0x20010800, 0x20010810,
50 0x00000020, 0x00000030, 0x20000020, 0x20000030,
51 0x00010020, 0x00010030, 0x20010020, 0x20010030,
52 0x00000820, 0x00000830, 0x20000820, 0x20000830,
53 0x00010820, 0x00010830, 0x20010820, 0x20010830,
54 0x00080000, 0x00080010, 0x20080000, 0x20080010,
55 0x00090000, 0x00090010, 0x20090000, 0x20090010,
56 0x00080800, 0x00080810, 0x20080800, 0x20080810,
57 0x00090800, 0x00090810, 0x20090800, 0x20090810,
58 0x00080020, 0x00080030, 0x20080020, 0x20080030,
59 0x00090020, 0x00090030, 0x20090020, 0x20090030,
60 0x00080820, 0x00080830, 0x20080820, 0x20080830,
61 0x00090820, 0x00090830, 0x20090820, 0x20090830,
64 /* for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 */
65 0x00000000, 0x02000000, 0x00002000, 0x02002000,
66 0x00200000, 0x02200000, 0x00202000, 0x02202000,
67 0x00000004, 0x02000004, 0x00002004, 0x02002004,
68 0x00200004, 0x02200004, 0x00202004, 0x02202004,
69 0x00000400, 0x02000400, 0x00002400, 0x02002400,
70 0x00200400, 0x02200400, 0x00202400, 0x02202400,
71 0x00000404, 0x02000404, 0x00002404, 0x02002404,
72 0x00200404, 0x02200404, 0x00202404, 0x02202404,
73 0x10000000, 0x12000000, 0x10002000, 0x12002000,
74 0x10200000, 0x12200000, 0x10202000, 0x12202000,
75 0x10000004, 0x12000004, 0x10002004, 0x12002004,
76 0x10200004, 0x12200004, 0x10202004, 0x12202004,
77 0x10000400, 0x12000400, 0x10002400, 0x12002400,
78 0x10200400, 0x12200400, 0x10202400, 0x12202400,
79 0x10000404, 0x12000404, 0x10002404, 0x12002404,
80 0x10200404, 0x12200404, 0x10202404, 0x12202404,
83 /* for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 */
84 0x00000000, 0x00000001, 0x00040000, 0x00040001,
85 0x01000000, 0x01000001, 0x01040000, 0x01040001,
86 0x00000002, 0x00000003, 0x00040002, 0x00040003,
87 0x01000002, 0x01000003, 0x01040002, 0x01040003,
88 0x00000200, 0x00000201, 0x00040200, 0x00040201,
89 0x01000200, 0x01000201, 0x01040200, 0x01040201,
90 0x00000202, 0x00000203, 0x00040202, 0x00040203,
91 0x01000202, 0x01000203, 0x01040202, 0x01040203,
92 0x08000000, 0x08000001, 0x08040000, 0x08040001,
93 0x09000000, 0x09000001, 0x09040000, 0x09040001,
94 0x08000002, 0x08000003, 0x08040002, 0x08040003,
95 0x09000002, 0x09000003, 0x09040002, 0x09040003,
96 0x08000200, 0x08000201, 0x08040200, 0x08040201,
97 0x09000200, 0x09000201, 0x09040200, 0x09040201,
98 0x08000202, 0x08000203, 0x08040202, 0x08040203,
99 0x09000202, 0x09000203, 0x09040202, 0x09040203,
102 /* for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 */
103 0x00000000, 0x00100000, 0x00000100, 0x00100100,
104 0x00000008, 0x00100008, 0x00000108, 0x00100108,
105 0x00001000, 0x00101000, 0x00001100, 0x00101100,
106 0x00001008, 0x00101008, 0x00001108, 0x00101108,
107 0x04000000, 0x04100000, 0x04000100, 0x04100100,
108 0x04000008, 0x04100008, 0x04000108, 0x04100108,
109 0x04001000, 0x04101000, 0x04001100, 0x04101100,
110 0x04001008, 0x04101008, 0x04001108, 0x04101108,
111 0x00020000, 0x00120000, 0x00020100, 0x00120100,
112 0x00020008, 0x00120008, 0x00020108, 0x00120108,
113 0x00021000, 0x00121000, 0x00021100, 0x00121100,
114 0x00021008, 0x00121008, 0x00021108, 0x00121108,
115 0x04020000, 0x04120000, 0x04020100, 0x04120100,
116 0x04020008, 0x04120008, 0x04020108, 0x04120108,
117 0x04021000, 0x04121000, 0x04021100, 0x04121100,
118 0x04021008, 0x04121008, 0x04021108, 0x04121108,
121 /* for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 */
122 0x00000000, 0x10000000, 0x00010000, 0x10010000,
123 0x00000004, 0x10000004, 0x00010004, 0x10010004,
124 0x20000000, 0x30000000, 0x20010000, 0x30010000,
125 0x20000004, 0x30000004, 0x20010004, 0x30010004,
126 0x00100000, 0x10100000, 0x00110000, 0x10110000,
127 0x00100004, 0x10100004, 0x00110004, 0x10110004,
128 0x20100000, 0x30100000, 0x20110000, 0x30110000,
129 0x20100004, 0x30100004, 0x20110004, 0x30110004,
130 0x00001000, 0x10001000, 0x00011000, 0x10011000,
131 0x00001004, 0x10001004, 0x00011004, 0x10011004,
132 0x20001000, 0x30001000, 0x20011000, 0x30011000,
133 0x20001004, 0x30001004, 0x20011004, 0x30011004,
134 0x00101000, 0x10101000, 0x00111000, 0x10111000,
135 0x00101004, 0x10101004, 0x00111004, 0x10111004,
136 0x20101000, 0x30101000, 0x20111000, 0x30111000,
137 0x20101004, 0x30101004, 0x20111004, 0x30111004,
140 /* for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 */
141 0x00000000, 0x08000000, 0x00000008, 0x08000008,
142 0x00000400, 0x08000400, 0x00000408, 0x08000408,
143 0x00020000, 0x08020000, 0x00020008, 0x08020008,
144 0x00020400, 0x08020400, 0x00020408, 0x08020408,
145 0x00000001, 0x08000001, 0x00000009, 0x08000009,
146 0x00000401, 0x08000401, 0x00000409, 0x08000409,
147 0x00020001, 0x08020001, 0x00020009, 0x08020009,
148 0x00020401, 0x08020401, 0x00020409, 0x08020409,
149 0x02000000, 0x0A000000, 0x02000008, 0x0A000008,
150 0x02000400, 0x0A000400, 0x02000408, 0x0A000408,
151 0x02020000, 0x0A020000, 0x02020008, 0x0A020008,
152 0x02020400, 0x0A020400, 0x02020408, 0x0A020408,
153 0x02000001, 0x0A000001, 0x02000009, 0x0A000009,
154 0x02000401, 0x0A000401, 0x02000409, 0x0A000409,
155 0x02020001, 0x0A020001, 0x02020009, 0x0A020009,
156 0x02020401, 0x0A020401, 0x02020409, 0x0A020409,
159 /* for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 */
160 0x00000000, 0x00000100, 0x00080000, 0x00080100,
161 0x01000000, 0x01000100, 0x01080000, 0x01080100,
162 0x00000010, 0x00000110, 0x00080010, 0x00080110,
163 0x01000010, 0x01000110, 0x01080010, 0x01080110,
164 0x00200000, 0x00200100, 0x00280000, 0x00280100,
165 0x01200000, 0x01200100, 0x01280000, 0x01280100,
166 0x00200010, 0x00200110, 0x00280010, 0x00280110,
167 0x01200010, 0x01200110, 0x01280010, 0x01280110,
168 0x00000200, 0x00000300, 0x00080200, 0x00080300,
169 0x01000200, 0x01000300, 0x01080200, 0x01080300,
170 0x00000210, 0x00000310, 0x00080210, 0x00080310,
171 0x01000210, 0x01000310, 0x01080210, 0x01080310,
172 0x00200200, 0x00200300, 0x00280200, 0x00280300,
173 0x01200200, 0x01200300, 0x01280200, 0x01280300,
174 0x00200210, 0x00200310, 0x00280210, 0x00280310,
175 0x01200210, 0x01200310, 0x01280210, 0x01280310,
178 /* for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 */
179 0x00000000, 0x04000000, 0x00040000, 0x04040000,
180 0x00000002, 0x04000002, 0x00040002, 0x04040002,
181 0x00002000, 0x04002000, 0x00042000, 0x04042000,
182 0x00002002, 0x04002002, 0x00042002, 0x04042002,
183 0x00000020, 0x04000020, 0x00040020, 0x04040020,
184 0x00000022, 0x04000022, 0x00040022, 0x04040022,
185 0x00002020, 0x04002020, 0x00042020, 0x04042020,
186 0x00002022, 0x04002022, 0x00042022, 0x04042022,
187 0x00000800, 0x04000800, 0x00040800, 0x04040800,
188 0x00000802, 0x04000802, 0x00040802, 0x04040802,
189 0x00002800, 0x04002800, 0x00042800, 0x04042800,
190 0x00002802, 0x04002802, 0x00042802, 0x04042802,
191 0x00000820, 0x04000820, 0x00040820, 0x04040820,
192 0x00000822, 0x04000822, 0x00040822, 0x04040822,
193 0x00002820, 0x04002820, 0x00042820, 0x04042820,
194 0x00002822, 0x04002822, 0x00042822, 0x04042822,
198 private static final int SPtrans[][] =
202 0x00820200, 0x00020000, 0x80800000, 0x80820200,
203 0x00800000, 0x80020200, 0x80020000, 0x80800000,
204 0x80020200, 0x00820200, 0x00820000, 0x80000200,
205 0x80800200, 0x00800000, 0x00000000, 0x80020000,
206 0x00020000, 0x80000000, 0x00800200, 0x00020200,
207 0x80820200, 0x00820000, 0x80000200, 0x00800200,
208 0x80000000, 0x00000200, 0x00020200, 0x80820000,
209 0x00000200, 0x80800200, 0x80820000, 0x00000000,
210 0x00000000, 0x80820200, 0x00800200, 0x80020000,
211 0x00820200, 0x00020000, 0x80000200, 0x00800200,
212 0x80820000, 0x00000200, 0x00020200, 0x80800000,
213 0x80020200, 0x80000000, 0x80800000, 0x00820000,
214 0x80820200, 0x00020200, 0x00820000, 0x80800200,
215 0x00800000, 0x80000200, 0x80020000, 0x00000000,
216 0x00020000, 0x00800000, 0x80800200, 0x00820200,
217 0x80000000, 0x80820000, 0x00000200, 0x80020200,
221 0x10042004, 0x00000000, 0x00042000, 0x10040000,
222 0x10000004, 0x00002004, 0x10002000, 0x00042000,
223 0x00002000, 0x10040004, 0x00000004, 0x10002000,
224 0x00040004, 0x10042000, 0x10040000, 0x00000004,
225 0x00040000, 0x10002004, 0x10040004, 0x00002000,
226 0x00042004, 0x10000000, 0x00000000, 0x00040004,
227 0x10002004, 0x00042004, 0x10042000, 0x10000004,
228 0x10000000, 0x00040000, 0x00002004, 0x10042004,
229 0x00040004, 0x10042000, 0x10002000, 0x00042004,
230 0x10042004, 0x00040004, 0x10000004, 0x00000000,
231 0x10000000, 0x00002004, 0x00040000, 0x10040004,
232 0x00002000, 0x10000000, 0x00042004, 0x10002004,
233 0x10042000, 0x00002000, 0x00000000, 0x10000004,
234 0x00000004, 0x10042004, 0x00042000, 0x10040000,
235 0x10040004, 0x00040000, 0x00002004, 0x10002000,
236 0x10002004, 0x00000004, 0x10040000, 0x00042000,
240 0x41000000, 0x01010040, 0x00000040, 0x41000040,
241 0x40010000, 0x01000000, 0x41000040, 0x00010040,
242 0x01000040, 0x00010000, 0x01010000, 0x40000000,
243 0x41010040, 0x40000040, 0x40000000, 0x41010000,
244 0x00000000, 0x40010000, 0x01010040, 0x00000040,
245 0x40000040, 0x41010040, 0x00010000, 0x41000000,
246 0x41010000, 0x01000040, 0x40010040, 0x01010000,
247 0x00010040, 0x00000000, 0x01000000, 0x40010040,
248 0x01010040, 0x00000040, 0x40000000, 0x00010000,
249 0x40000040, 0x40010000, 0x01010000, 0x41000040,
250 0x00000000, 0x01010040, 0x00010040, 0x41010000,
251 0x40010000, 0x01000000, 0x41010040, 0x40000000,
252 0x40010040, 0x41000000, 0x01000000, 0x41010040,
253 0x00010000, 0x01000040, 0x41000040, 0x00010040,
254 0x01000040, 0x00000000, 0x41010000, 0x40000040,
255 0x41000000, 0x40010040, 0x00000040, 0x01010000,
259 0x00100402, 0x04000400, 0x00000002, 0x04100402,
260 0x00000000, 0x04100000, 0x04000402, 0x00100002,
261 0x04100400, 0x04000002, 0x04000000, 0x00000402,
262 0x04000002, 0x00100402, 0x00100000, 0x04000000,
263 0x04100002, 0x00100400, 0x00000400, 0x00000002,
264 0x00100400, 0x04000402, 0x04100000, 0x00000400,
265 0x00000402, 0x00000000, 0x00100002, 0x04100400,
266 0x04000400, 0x04100002, 0x04100402, 0x00100000,
267 0x04100002, 0x00000402, 0x00100000, 0x04000002,
268 0x00100400, 0x04000400, 0x00000002, 0x04100000,
269 0x04000402, 0x00000000, 0x00000400, 0x00100002,
270 0x00000000, 0x04100002, 0x04100400, 0x00000400,
271 0x04000000, 0x04100402, 0x00100402, 0x00100000,
272 0x04100402, 0x00000002, 0x04000400, 0x00100402,
273 0x00100002, 0x00100400, 0x04100000, 0x04000402,
274 0x00000402, 0x04000000, 0x04000002, 0x04100400,
278 0x02000000, 0x00004000, 0x00000100, 0x02004108,
279 0x02004008, 0x02000100, 0x00004108, 0x02004000,
280 0x00004000, 0x00000008, 0x02000008, 0x00004100,
281 0x02000108, 0x02004008, 0x02004100, 0x00000000,
282 0x00004100, 0x02000000, 0x00004008, 0x00000108,
283 0x02000100, 0x00004108, 0x00000000, 0x02000008,
284 0x00000008, 0x02000108, 0x02004108, 0x00004008,
285 0x02004000, 0x00000100, 0x00000108, 0x02004100,
286 0x02004100, 0x02000108, 0x00004008, 0x02004000,
287 0x00004000, 0x00000008, 0x02000008, 0x02000100,
288 0x02000000, 0x00004100, 0x02004108, 0x00000000,
289 0x00004108, 0x02000000, 0x00000100, 0x00004008,
290 0x02000108, 0x00000100, 0x00000000, 0x02004108,
291 0x02004008, 0x02004100, 0x00000108, 0x00004000,
292 0x00004100, 0x02004008, 0x02000100, 0x00000108,
293 0x00000008, 0x00004108, 0x02004000, 0x02000008,
297 0x20000010, 0x00080010, 0x00000000, 0x20080800,
298 0x00080010, 0x00000800, 0x20000810, 0x00080000,
299 0x00000810, 0x20080810, 0x00080800, 0x20000000,
300 0x20000800, 0x20000010, 0x20080000, 0x00080810,
301 0x00080000, 0x20000810, 0x20080010, 0x00000000,
302 0x00000800, 0x00000010, 0x20080800, 0x20080010,
303 0x20080810, 0x20080000, 0x20000000, 0x00000810,
304 0x00000010, 0x00080800, 0x00080810, 0x20000800,
305 0x00000810, 0x20000000, 0x20000800, 0x00080810,
306 0x20080800, 0x00080010, 0x00000000, 0x20000800,
307 0x20000000, 0x00000800, 0x20080010, 0x00080000,
308 0x00080010, 0x20080810, 0x00080800, 0x00000010,
309 0x20080810, 0x00080800, 0x00080000, 0x20000810,
310 0x20000010, 0x20080000, 0x00080810, 0x00000000,
311 0x00000800, 0x20000010, 0x20000810, 0x20080800,
312 0x20080000, 0x00000810, 0x00000010, 0x20080010,
316 0x00001000, 0x00000080, 0x00400080, 0x00400001,
317 0x00401081, 0x00001001, 0x00001080, 0x00000000,
318 0x00400000, 0x00400081, 0x00000081, 0x00401000,
319 0x00000001, 0x00401080, 0x00401000, 0x00000081,
320 0x00400081, 0x00001000, 0x00001001, 0x00401081,
321 0x00000000, 0x00400080, 0x00400001, 0x00001080,
322 0x00401001, 0x00001081, 0x00401080, 0x00000001,
323 0x00001081, 0x00401001, 0x00000080, 0x00400000,
324 0x00001081, 0x00401000, 0x00401001, 0x00000081,
325 0x00001000, 0x00000080, 0x00400000, 0x00401001,
326 0x00400081, 0x00001081, 0x00001080, 0x00000000,
327 0x00000080, 0x00400001, 0x00000001, 0x00400080,
328 0x00000000, 0x00400081, 0x00400080, 0x00001080,
329 0x00000081, 0x00001000, 0x00401081, 0x00400000,
330 0x00401080, 0x00000001, 0x00001001, 0x00401081,
331 0x00400001, 0x00401080, 0x00401000, 0x00001001,
335 0x08200020, 0x08208000, 0x00008020, 0x00000000,
336 0x08008000, 0x00200020, 0x08200000, 0x08208020,
337 0x00000020, 0x08000000, 0x00208000, 0x00008020,
338 0x00208020, 0x08008020, 0x08000020, 0x08200000,
339 0x00008000, 0x00208020, 0x00200020, 0x08008000,
340 0x08208020, 0x08000020, 0x00000000, 0x00208000,
341 0x08000000, 0x00200000, 0x08008020, 0x08200020,
342 0x00200000, 0x00008000, 0x08208000, 0x00000020,
343 0x00200000, 0x00008000, 0x08000020, 0x08208020,
344 0x00008020, 0x08000000, 0x00000000, 0x00208000,
345 0x08200020, 0x08008020, 0x08008000, 0x00200020,
346 0x08208000, 0x00000020, 0x00200020, 0x08008000,
347 0x08208020, 0x00200000, 0x08200000, 0x08000020,
348 0x00208000, 0x00008020, 0x08008020, 0x08200000,
349 0x00000020, 0x08208000, 0x00208020, 0x00000000,
350 0x08000000, 0x08200020, 0x00008000, 0x00208020
354 private static final int cov_2char[] =
356 0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35,
357 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44,
358 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C,
359 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54,
360 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x61, 0x62,
361 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A,
362 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72,
363 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A
366 private static final int byteToUnsigned(byte b)
370 return(value >= 0 ? value : value + 256);
373 private static int fourBytesToInt(byte b[], int offset)
377 value = byteToUnsigned(b[offset++]);
378 value |= (byteToUnsigned(b[offset++]) << 8);
379 value |= (byteToUnsigned(b[offset++]) << 16);
380 value |= (byteToUnsigned(b[offset++]) << 24);
385 private static final void intToFourBytes(int iValue, byte b[], int offset)
387 b[offset++] = (byte)((iValue) & 0xff);
388 b[offset++] = (byte)((iValue >>> 8 ) & 0xff);
389 b[offset++] = (byte)((iValue >>> 16) & 0xff);
390 b[offset++] = (byte)((iValue >>> 24) & 0xff);
393 private static final void PERM_OP(int a, int b, int n, int m, int results[])
397 t = ((a >>> n) ^ b) & m;
405 private static final int HPERM_OP(int a, int n, int m)
409 t = ((a << (16 - n)) ^ a) & m;
410 a = a ^ t ^ (t >>> (16 - n));
415 private static int [] des_set_key(byte key[])
417 int schedule[] = new int[ITERATIONS * 2];
419 int c = fourBytesToInt(key, 0);
420 int d = fourBytesToInt(key, 4);
422 int results[] = new int[2];
424 PERM_OP(d, c, 4, 0x0f0f0f0f, results);
425 d = results[0]; c = results[1];
427 c = HPERM_OP(c, -2, 0xcccc0000);
428 d = HPERM_OP(d, -2, 0xcccc0000);
430 PERM_OP(d, c, 1, 0x55555555, results);
431 d = results[0]; c = results[1];
433 PERM_OP(c, d, 8, 0x00ff00ff, results);
434 c = results[0]; d = results[1];
436 PERM_OP(d, c, 1, 0x55555555, results);
437 d = results[0]; c = results[1];
439 d = (((d & 0x000000ff) << 16) | (d & 0x0000ff00) |
440 ((d & 0x00ff0000) >>> 16) | ((c & 0xf0000000) >>> 4));
446 for(int i = 0; i < ITERATIONS; i ++)
450 c = (c >>> 2) | (c << 26);
451 d = (d >>> 2) | (d << 26);
455 c = (c >>> 1) | (c << 27);
456 d = (d >>> 1) | (d << 27);
462 s = skb[0][ (c ) & 0x3f ]|
463 skb[1][((c >>> 6) & 0x03) | ((c >>> 7) & 0x3c)]|
464 skb[2][((c >>> 13) & 0x0f) | ((c >>> 14) & 0x30)]|
465 skb[3][((c >>> 20) & 0x01) | ((c >>> 21) & 0x06) |
466 ((c >>> 22) & 0x38)];
468 t = skb[4][ (d ) & 0x3f ]|
469 skb[5][((d >>> 7) & 0x03) | ((d >>> 8) & 0x3c)]|
470 skb[6][ (d >>>15) & 0x3f ]|
471 skb[7][((d >>>21) & 0x0f) | ((d >>> 22) & 0x30)];
473 schedule[j++] = ((t << 16) | (s & 0x0000ffff)) & 0xffffffff;
474 s = ((s >>> 16) | (t & 0xffff0000));
476 s = (s << 4) | (s >>> 28);
477 schedule[j++] = s & 0xffffffff;
482 private static final int D_ENCRYPT
484 int L, int R, int S, int E0, int E1, int s[]
492 u = (u ^ (u << 16)) ^ R ^ s[S];
493 t = (v ^ (v << 16)) ^ R ^ s[S + 1];
494 t = (t >>> 4) | (t << 28);
496 L ^= SPtrans[1][(t ) & 0x3f] |
497 SPtrans[3][(t >>> 8) & 0x3f] |
498 SPtrans[5][(t >>> 16) & 0x3f] |
499 SPtrans[7][(t >>> 24) & 0x3f] |
500 SPtrans[0][(u ) & 0x3f] |
501 SPtrans[2][(u >>> 8) & 0x3f] |
502 SPtrans[4][(u >>> 16) & 0x3f] |
503 SPtrans[6][(u >>> 24) & 0x3f];
508 private static final int [] body(int schedule[], int Eswap0, int Eswap1)
514 for(int j = 0; j < 25; j ++)
516 for(int i = 0; i < ITERATIONS * 2; i += 4)
518 left = D_ENCRYPT(left, right, i, Eswap0, Eswap1, schedule);
519 right = D_ENCRYPT(right, left, i + 2, Eswap0, Eswap1, schedule);
528 right = (left >>> 1) | (left << 31);
529 left = (t >>> 1) | (t << 31);
534 int results[] = new int[2];
536 PERM_OP(right, left, 1, 0x55555555, results);
537 right = results[0]; left = results[1];
539 PERM_OP(left, right, 8, 0x00ff00ff, results);
540 left = results[0]; right = results[1];
542 PERM_OP(right, left, 2, 0x33333333, results);
543 right = results[0]; left = results[1];
545 PERM_OP(left, right, 16, 0x0000ffff, results);
546 left = results[0]; right = results[1];
548 PERM_OP(right, left, 4, 0x0f0f0f0f, results);
549 right = results[0]; left = results[1];
551 int out[] = new int[2];
553 out[0] = left; out[1] = right;
558 public static final String crypt(String salt, String original)
560 while(salt.length() < 2)
563 StringBuffer buffer = new StringBuffer(" ");
565 char charZero = salt.charAt(0);
566 char charOne = salt.charAt(1);
568 buffer.setCharAt(0, charZero);
569 buffer.setCharAt(1, charOne);
571 int Eswap0 = con_salt[(int)charZero];
572 int Eswap1 = con_salt[(int)charOne] << 4;
574 byte key[] = new byte[8];
576 for(int i = 0; i < key.length; i ++)
579 for(int i = 0; i < key.length && i < original.length(); i ++)
581 int iChar = (int)original.charAt(i);
583 key[i] = (byte)(iChar << 1);
586 int schedule[] = des_set_key(key);
587 int out[] = body(schedule, Eswap0, Eswap1);
589 byte b[] = new byte[9];
591 intToFourBytes(out[0], b, 0);
592 intToFourBytes(out[1], b, 4);
595 for(int i = 2, y = 0, u = 0x80; i < 13; i ++)
597 for(int j = 0, c = 0; j < 6; j ++)
601 if(((int)b[y] & u) != 0)
611 buffer.setCharAt(i, (char)cov_2char[c]);
614 return(buffer.toString());