Subversion Repositories general

Rev

Rev 1015 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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