]> gerrit.simantics Code Review - simantics/r.git/blob - bundles/org.simantics.r.scl/src/org/rosuda/REngine/Rserve/protocol/jcrypt.java
(refs #6833) Test RExp inheritance in SCL
[simantics/r.git] / bundles / org.simantics.r.scl / src / org / rosuda / REngine / Rserve / protocol / jcrypt.java
1 package org.rosuda.REngine.Rserve.protocol;
2
3 /****************************************************************************
4  * jcrypt.java
5  *
6  * Java-based implementation of the unix crypt command
7  *
8  * Based upon C source code written by Eric Young, eay@psych.uq.oz.au
9  *
10  ****************************************************************************/
11
12 public class jcrypt
13 {
14    private static final int ITERATIONS = 16;
15
16    private static final int con_salt[] =
17    {
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, 
34    };
35
36    private static final boolean shifts2[] =
37    {
38       false, false, true, true, true, true, true, true,
39       false, true,  true, true, true, true, true, false
40    };
41
42    private static final int skb[][] =
43    {
44       {
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, 
62       },
63       {
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, 
81       },
82       {
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, 
100       },
101       {
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, 
119       },
120       {
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, 
138       },
139       {
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, 
157       },
158       {
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, 
176       },
177       {
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, 
195       },
196    };
197
198    private static final int SPtrans[][] =
199    {
200       {
201          /* nibble 0 */
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,
218       },
219       {
220          /* nibble 1 */
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,
237       },
238       {
239          /* nibble 2 */
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,
256       },
257       {
258          /* nibble 3 */
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,
275       },
276       {
277          /* nibble 4 */
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,
294       },
295       {
296          /* nibble 5 */
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,
313       },
314       {
315          /* nibble 6 */
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,
332       },
333       {
334          /* nibble 7 */
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
351       }
352    };
353
354    private static final int cov_2char[] =
355    {
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
364    };
365
366    private static final int byteToUnsigned(byte b)
367    {
368       int value = (int)b;
369
370       return(value >= 0 ? value : value + 256);
371    }
372
373    private static int fourBytesToInt(byte b[], int offset)
374    {
375       int value;
376
377       value  =  byteToUnsigned(b[offset++]);
378       value |= (byteToUnsigned(b[offset++]) <<  8);
379       value |= (byteToUnsigned(b[offset++]) << 16);
380       value |= (byteToUnsigned(b[offset++]) << 24);
381
382       return(value);
383    }
384
385    private static final void intToFourBytes(int iValue, byte b[], int offset)
386    {
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);
391    }
392
393    private static final void PERM_OP(int a, int b, int n, int m, int results[])
394    {
395       int t;
396
397       t = ((a >>> n) ^ b) & m;
398       a ^= t << n;
399       b ^= t;
400
401       results[0] = a;
402       results[1] = b;
403    }
404
405    private static final int HPERM_OP(int a, int n, int m)
406    {
407       int t;
408
409       t = ((a << (16 - n)) ^ a) & m;
410       a = a ^ t ^ (t >>> (16 - n));
411
412       return(a);
413    }
414
415    private static int [] des_set_key(byte key[])
416    {
417       int schedule[] = new int[ITERATIONS * 2];
418
419       int c = fourBytesToInt(key, 0);
420       int d = fourBytesToInt(key, 4);
421
422       int results[] = new int[2];
423
424       PERM_OP(d, c, 4, 0x0f0f0f0f, results);
425       d = results[0]; c = results[1];
426
427       c = HPERM_OP(c, -2, 0xcccc0000);
428       d = HPERM_OP(d, -2, 0xcccc0000);
429
430       PERM_OP(d, c, 1, 0x55555555, results);
431       d = results[0]; c = results[1];
432
433       PERM_OP(c, d, 8, 0x00ff00ff, results);
434       c = results[0]; d = results[1];
435
436       PERM_OP(d, c, 1, 0x55555555, results);
437       d = results[0]; c = results[1];
438
439       d = (((d & 0x000000ff) <<  16) |  (d & 0x0000ff00)     |
440            ((d & 0x00ff0000) >>> 16) | ((c & 0xf0000000) >>> 4));
441       c &= 0x0fffffff;
442
443       int s, t;
444       int j = 0;
445
446       for(int i = 0; i < ITERATIONS; i ++)
447       {
448          if(shifts2[i])
449          {
450             c = (c >>> 2) | (c << 26);
451             d = (d >>> 2) | (d << 26);
452          }
453          else
454          {
455             c = (c >>> 1) | (c << 27);
456             d = (d >>> 1) | (d << 27);
457          }
458
459          c &= 0x0fffffff;
460          d &= 0x0fffffff;
461
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)];
467
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)];
472
473          schedule[j++] = ((t <<  16) | (s & 0x0000ffff)) & 0xffffffff;
474          s             = ((s >>> 16) | (t & 0xffff0000));
475
476          s             = (s << 4) | (s >>> 28);
477          schedule[j++] = s & 0xffffffff;
478       }
479       return(schedule);
480    }
481
482    private static final int D_ENCRYPT
483    (
484       int L, int R, int S, int E0, int E1, int s[]
485    )
486    {
487       int t, u, v;
488
489       v = R ^ (R >>> 16);
490       u = v & E0;
491       v = v & E1;
492       u = (u ^ (u << 16)) ^ R ^ s[S];
493       t = (v ^ (v << 16)) ^ R ^ s[S + 1];
494       t = (t >>> 4) | (t << 28);
495
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];
504
505       return(L);
506    }
507
508    private static final int [] body(int schedule[], int Eswap0, int Eswap1)
509    {
510       int left = 0;
511       int right = 0;
512       int t     = 0;
513
514       for(int j = 0; j < 25; j ++)
515       {
516          for(int i = 0; i < ITERATIONS * 2; i += 4)
517          {
518             left  = D_ENCRYPT(left,  right, i,     Eswap0, Eswap1, schedule);
519             right = D_ENCRYPT(right, left,  i + 2, Eswap0, Eswap1, schedule);
520          }
521          t     = left; 
522          left  = right; 
523          right = t;
524       }
525
526       t = right;
527
528       right = (left >>> 1) | (left << 31);
529       left  = (t    >>> 1) | (t    << 31);
530
531       left  &= 0xffffffff;
532       right &= 0xffffffff;
533
534       int results[] = new int[2];
535
536       PERM_OP(right, left, 1, 0x55555555, results); 
537       right = results[0]; left = results[1];
538
539       PERM_OP(left, right, 8, 0x00ff00ff, results); 
540       left = results[0]; right = results[1];
541
542       PERM_OP(right, left, 2, 0x33333333, results); 
543       right = results[0]; left = results[1];
544
545       PERM_OP(left, right, 16, 0x0000ffff, results);
546       left = results[0]; right = results[1];
547
548       PERM_OP(right, left, 4, 0x0f0f0f0f, results);
549       right = results[0]; left = results[1];
550
551       int out[] = new int[2];
552
553       out[0] = left; out[1] = right;
554
555       return(out);
556    }
557
558    public static final String crypt(String salt, String original)
559    {
560       while(salt.length() < 2)
561          salt += "A";
562
563       StringBuffer buffer = new StringBuffer("             ");
564
565       char charZero = salt.charAt(0);
566       char charOne  = salt.charAt(1);
567
568       buffer.setCharAt(0, charZero);
569       buffer.setCharAt(1, charOne);
570
571       int Eswap0 = con_salt[(int)charZero];
572       int Eswap1 = con_salt[(int)charOne] << 4;
573  
574       byte key[] = new byte[8];
575
576       for(int i = 0; i < key.length; i ++)
577          key[i] = (byte)0;
578
579       for(int i = 0; i < key.length && i < original.length(); i ++)
580       {
581          int iChar = (int)original.charAt(i);
582
583          key[i] = (byte)(iChar << 1);
584       }
585
586       int schedule[] = des_set_key(key);
587       int out[]      = body(schedule, Eswap0, Eswap1);
588
589       byte b[] = new byte[9];
590
591       intToFourBytes(out[0], b, 0);
592       intToFourBytes(out[1], b, 4);
593       b[8] = 0;
594
595       for(int i = 2, y = 0, u = 0x80; i < 13; i ++)
596       {
597          for(int j = 0, c = 0; j < 6; j ++)
598          {
599             c <<= 1;
600
601             if(((int)b[y] & u) != 0)
602                c |= 1;
603
604             u >>>= 1;
605
606             if(u == 0)
607             {
608                y++;
609                u = 0x80;
610             }
611             buffer.setCharAt(i, (char)cov_2char[c]);
612          }
613       }
614       return(buffer.toString());
615    }
616 }
617