Docjar: A Java Source and Docuemnt Enginecom.*    java.*    javax.*    org.*    all    new    plug-in

Quick Search    Search Deep

Source code: mindbright/security/DES.java


1   /******************************************************************************
2    *
3    * Copyright (c) 1998,99 by Mindbright Technology AB, Stockholm, Sweden.
4    *                 www.mindbright.se, info@mindbright.se
5    *
6    *****************************************************************************
7    * $Author: nallen $
8    * $Date: 2001/11/12 16:31:15 $
9    * $Name:  $
10   *****************************************************************************/
11  /*
12   * !!! Author's comment: The contents of this file is heavily based
13   * upon Tatu Ylonen's c-code (from the ssh1.2.26 package). That code
14   * in its turn (as stated) is based upon Eric Young's libdes-3.06. The
15   * original code is hence nowadays under a stricter license than
16   * stated in the ssh1.2.26 package so you might want to look into Eric
17   * Young's recent copyright-notice (which is enclosed below for
18   * correctness).
19   */
20  /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
21   * All rights reserved.
22   *
23   * This package is an SSL implementation written
24   * by Eric Young (eay@cryptsoft.com).
25   * The implementation was written so as to conform with Netscapes SSL.
26   * 
27   * This library is free for commercial and non-commercial use as long as
28   * the following conditions are aheared to.  The following conditions
29   * apply to all code found in this distribution, be it the RC4, RSA,
30   * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
31   * included with this distribution is covered by the same copyright terms
32   * except that the holder is Tim Hudson (tjh@cryptsoft.com).
33   * 
34   * Copyright remains Eric Young's, and as such any Copyright notices in
35   * the code are not to be removed.
36   * If this package is used in a product, Eric Young should be given attribution
37   * as the author of the parts of the library used.
38   * This can be in the form of a textual message at program startup or
39   * in documentation (online or textual) provided with the package.
40   * 
41   * Redistribution and use in source and binary forms, with or without
42   * modification, are permitted provided that the following conditions
43   * are met:
44   * 1. Redistributions of source code must retain the copyright
45   *    notice, this list of conditions and the following disclaimer.
46   * 2. Redistributions in binary form must reproduce the above copyright
47   *    notice, this list of conditions and the following disclaimer in the
48   *    documentation and/or other materials provided with the distribution.
49   * 3. All advertising materials mentioning features or use of this software
50   *    must display the following acknowledgement:
51   *    "This product includes cryptographic software written by
52   *     Eric Young (eay@cryptsoft.com)"
53   *    The word 'cryptographic' can be left out if the rouines from the library
54   *    being used are not cryptographic related :-).
55   * 4. If you include any Windows specific code (or a derivative thereof) from 
56   *    the apps directory (application code) you must include an acknowledgement:
57   *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
58   * 
59   * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
60   * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
61   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
62   * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
63   * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
64   * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
65   * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
66   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
67   * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
68   * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
69   * SUCH DAMAGE.
70   * 
71   * The licence and distribution terms for any publically available version or
72   * derivative of this code cannot be changed.  i.e. this code cannot simply be
73   * copied and put under another distribution licence
74   * [including the GNU Public Licence.]
75   */
76  package mindbright.security;
77  
78  public final class DES extends Cipher {
79  
80    protected int[] key_schedule = new int[32];
81    protected int   IV0 = 0;
82    protected int   IV1 = 0;
83  
84    public synchronized void encrypt(byte[] src, int srcOff, byte[] dest, int destOff, int len) {
85      int[]  out = new int[2];
86      int iv0 = IV0;
87      int iv1 = IV1;
88      int end = srcOff + len;
89  
90      for(int si = srcOff, di = destOff; si < end; si += 8, di += 8) {
91        iv0 ^= ((src[si] & 0xff) | ((src[si + 1] & 0xff) << 8) |
92          ((src[si + 2] & 0xff) << 16) | ((src[si + 3] & 0xff) << 24));
93        iv1 ^= ((src[si + 4] & 0xff) | ((src[si + 5] & 0xff) << 8) |
94          ((src[si + 6] & 0xff) << 16) | ((src[si + 7] & 0xff) << 24));
95        encrypt(iv0, iv1, out);
96        iv0 = out[0];
97        iv1 = out[1];
98        dest[di]   = (byte)( iv0         & 0xff);
99        dest[di+1] = (byte)((iv0 >>> 8 ) & 0xff);
100       dest[di+2] = (byte)((iv0 >>> 16) & 0xff);
101       dest[di+3] = (byte)((iv0 >>> 24) & 0xff);
102       dest[di+4] = (byte)( iv1         & 0xff);
103       dest[di+5] = (byte)((iv1 >>> 8 ) & 0xff);
104       dest[di+6] = (byte)((iv1 >>> 16) & 0xff);
105       dest[di+7] = (byte)((iv1 >>> 24) & 0xff);
106     }
107     IV0 = iv0;
108     IV1 = iv1;
109   }
110 
111   public synchronized void decrypt(byte[] src, int srcOff, byte[] dest, int destOff, int len) {
112     int[]  out = new int[2];
113     int iv0 = IV0;
114     int iv1 = IV1;
115     int d0;
116     int d1;
117     int end = srcOff + len;
118 
119     for(int si = srcOff, di = destOff; si < end; si += 8, di += 8) {
120       d0 = ((src[si] & 0xff) | ((src[si + 1] & 0xff) << 8) |
121       ((src[si + 2] & 0xff) << 16) | ((src[si + 3] & 0xff) << 24));
122       d1 = ((src[si + 4] & 0xff) | ((src[si + 5] & 0xff) << 8) | 
123       ((src[si + 6] & 0xff) << 16) | ((src[si + 7] & 0xff) << 24));
124       decrypt(d0, d1, out);
125       iv0 ^= out[0];
126       iv1 ^= out[1];
127       dest[di]   = (byte)( iv0         & 0xff);
128       dest[di+1] = (byte)((iv0 >>> 8 ) & 0xff);
129       dest[di+2] = (byte)((iv0 >>> 16) & 0xff);
130       dest[di+3] = (byte)((iv0 >>> 24) & 0xff);
131       dest[di+4] = (byte)( iv1         & 0xff);
132       dest[di+5] = (byte)((iv1 >>> 8 ) & 0xff);
133       dest[di+6] = (byte)((iv1 >>> 16) & 0xff);
134       dest[di+7] = (byte)((iv1 >>> 24) & 0xff);
135       iv0 = d0;
136       iv1 = d1;
137     }
138     IV0 = iv0;
139     IV1 = iv1;
140   }
141 
142   public void setKey(byte[] key) {
143     int i, c, d, t, s, shifts;
144 
145     c = ((key[0] & 0xff) | ((key[1] & 0xff) << 8) |
146    ((key[2] & 0xff) << 16) | ((key[3] & 0xff) << 24));
147     d = ((key[4] & 0xff) | ((key[5] & 0xff) << 8) |
148    ((key[6] & 0xff) << 16) | ((key[7] & 0xff) << 24));
149 
150     t  = ((d >>> 4) ^ c)  & 0x0f0f0f0f;
151     c ^= t;
152     d ^= t << 4;
153     t = (((c << (16 - (-2))) ^ c) & 0xcccc0000);
154     c = c ^ t ^ (t >>> (16 - (-2)));
155     t = (((d << (16 - (-2))) ^ d) & 0xcccc0000);
156     d = d ^ t ^ (t >>> (16 - (-2)));
157     t  = ((d >>> 1) ^ c)  & 0x55555555;
158     c ^= t;
159     d ^= t << 1;
160     t  = ((c >>> 8) ^ d)  & 0x00ff00ff;
161     d ^= t;
162     c ^= t << 8;
163     t  = ((d >>> 1) ^ c)  & 0x55555555;
164     c ^= t;
165     d ^= t << 1;
166 
167     d  = ((d & 0xff) << 16) | (d & 0xff00) |
168       ((d >>> 16) & 0xff) | ((c >>> 4) & 0xf000000);
169     c &= 0x0fffffff;
170     shifts = 0x7efc;
171 
172     for(i = 0; i < 16; i++) {
173       if((shifts & 1) != 0) {
174   c = ((c >>> 2) | (c << 26));
175   d = ((d >>> 2) | (d << 26));
176       } else {
177   c = ((c >>> 1) | (c << 27));
178   d = ((d >>> 1) | (d << 27));
179       }
180       shifts >>>= 1;
181       c &= 0x0fffffff;
182       d &= 0x0fffffff;
183 
184       s = des_skb[0][ (c) & 0x3f] |
185   des_skb[1][((c >>> 6 ) & 0x03)|((c >>> 7 ) & 0x3c)] |
186   des_skb[2][((c >>> 13) & 0x0f)|((c >>> 14) & 0x30)] |
187   des_skb[3][((c >>> 20) & 0x01)|((c >>> 21) & 0x06) | ((c >>> 22) & 0x38)];
188 
189       t = des_skb[4][ (d) & 0x3f] |
190   des_skb[5][((d >>> 7 ) & 0x03) | ((d >>> 8 ) & 0x3c)] |
191   des_skb[6][ (d >>> 15) & 0x3f                ] |
192   des_skb[7][((d >>> 21) & 0x0f) | ((d >>> 22) & 0x30)];
193 
194       key_schedule[i * 2]       = ((t << 16) | (s & 0xffff));
195       s                         = ((s >>> 16) | (t & 0xffff0000));
196       key_schedule[(i * 2) + 1] =  (s << 4)  | (s >>> 28);
197     }
198   }
199 
200   public void encrypt(int l, int r, int[] out) {
201     int t = 0, u = 0, i;
202 
203     t  = ((r >>> 4) ^ l)  & 0x0f0f0f0f;
204     l ^= t;
205     r ^= t << 4;
206     t  = ((l >>> 16) ^ r) & 0x0000ffff;
207     r ^= t;
208     l ^= t << 16;
209     t  = ((r >>> 2) ^ l)  & 0x33333333;
210     l ^= t;
211     r ^= t << 2;
212     t  = ((l >>> 8) ^ r)  & 0x00ff00ff;
213     r ^= t;
214     l ^= t << 8;
215     t  = ((r >>> 1) ^ l)  & 0x55555555;
216     l ^= t;
217     r ^= t << 1;
218 
219     t = (r << 1) | (r >>> 31);
220     r = (l << 1) | (l >>> 31);
221     l = t;
222 
223     for (i = 0; i < 32; i += 4) {
224       u = r ^ key_schedule[i    ];
225       t = r ^ key_schedule[i + 1];
226       t = ((t >>> 4) + (t << 28));
227       l ^=
228   (des_SPtrans[1][(t       ) & 0x3f] | des_SPtrans[3][(t >>> 8 ) & 0x3f] |
229    des_SPtrans[5][(t >>> 16) & 0x3f] | des_SPtrans[7][(t >>> 24) & 0x3f] |
230    des_SPtrans[0][(u       ) & 0x3f] | des_SPtrans[2][(u >>> 8 ) & 0x3f] |
231    des_SPtrans[4][(u >>> 16) & 0x3f] | des_SPtrans[6][(u >>> 24) & 0x3f]);
232 
233       u = l ^ key_schedule[i + 2];
234       t = l ^ key_schedule[i + 3];
235       t = ((t >>> 4) + (t << 28));
236       r ^=
237   (des_SPtrans[1][(t       ) & 0x3f] | des_SPtrans[3][(t >>> 8 ) & 0x3f] |
238    des_SPtrans[5][(t >>> 16) & 0x3f] | des_SPtrans[7][(t >>> 24) & 0x3f] |
239    des_SPtrans[0][(u       ) & 0x3f] | des_SPtrans[2][(u >>> 8 ) & 0x3f] |
240    des_SPtrans[4][(u >>> 16) & 0x3f] | des_SPtrans[6][(u >>> 24) & 0x3f]);
241     }
242 
243     l = (l >>> 1) | (l << 31);
244     r = (r >>> 1) | (r << 31);
245 
246     t  = ((r >>> 1) ^ l)  & 0x55555555;
247     l ^= t;
248     r ^= t << 1;
249     t  = ((l >>> 8) ^ r)  & 0x00ff00ff;
250     r ^= t;
251     l ^= t << 8;
252     t  = ((r >>> 2) ^ l)  & 0x33333333;
253     l ^= t;
254     r ^= t << 2;
255     t  = ((l >>> 16) ^ r) & 0x0000ffff;
256     r ^= t;
257     l ^= t << 16;
258     t  = ((r >>> 4) ^ l)  & 0x0f0f0f0f;
259     l ^= t;
260     r ^= t << 4;
261 
262     out[0] = l;
263     out[1] = r;
264   }
265 
266   public void decrypt(int l, int r, int[] out) {
267     int t, u, i;
268 
269     t  = ((r >>> 4) ^ l)  & 0x0f0f0f0f;
270     l ^= t;
271     r ^= t << 4;
272     t  = ((l >>> 16) ^ r) & 0x0000ffff;
273     r ^= t;
274     l ^= t << 16;
275     t  = ((r >>> 2) ^ l)  & 0x33333333;
276     l ^= t;
277     r ^= t << 2;
278     t  = ((l >>> 8) ^ r)  & 0x00ff00ff;
279     r ^= t;
280     l ^= t << 8;
281     t  = ((r >>> 1) ^ l)  & 0x55555555;
282     l ^= t;
283     r ^= t << 1;
284 
285     t = (r << 1) | (r >>> 31);
286     r = (l << 1) | (l >>> 31);
287     l = t;
288 
289     for (i = 30; i > 0; i -= 4) {
290       u = r ^ key_schedule[i    ];
291       t = r ^ key_schedule[i + 1];
292       t = ((t >>> 4) + (t << 28));
293       l ^=
294   (des_SPtrans[1][(t       ) & 0x3f] | des_SPtrans[3][(t >>> 8 ) & 0x3f] |
295    des_SPtrans[5][(t >>> 16) & 0x3f] | des_SPtrans[7][(t >>> 24) & 0x3f] |
296    des_SPtrans[0][(u       ) & 0x3f] | des_SPtrans[2][(u >>> 8 ) & 0x3f] |
297    des_SPtrans[4][(u >>> 16) & 0x3f] | des_SPtrans[6][(u >>> 24) & 0x3f]);
298 
299       u = l ^ key_schedule[i - 2];
300       t = l ^ key_schedule[i - 1];
301       t = ((t >>> 4) + (t << 28));
302       r ^=
303   (des_SPtrans[1][(t       ) & 0x3f] | des_SPtrans[3][(t >>> 8 ) & 0x3f] |
304    des_SPtrans[5][(t >>> 16) & 0x3f] | des_SPtrans[7][(t >>> 24) & 0x3f] |
305    des_SPtrans[0][(u       ) & 0x3f] | des_SPtrans[2][(u >>> 8 ) & 0x3f] |
306    des_SPtrans[4][(u >>> 16) & 0x3f] | des_SPtrans[6][(u >>> 24) & 0x3f]);
307     }
308 
309     l = (l >>> 1) | (l << 31);
310     r = (r >>> 1) | (r << 31);
311 
312     t  = ((r >>> 1) ^ l)  & 0x55555555;
313     l ^= t;
314     r ^= t << 1;
315     t  = ((l >>> 8) ^ r)  & 0x00ff00ff;
316     r ^= t;
317     l ^= t << 8;
318     t  = ((r >>> 2) ^ l)  & 0x33333333;
319     l ^= t;
320     r ^= t << 2;
321     t  = ((l >>> 16) ^ r) & 0x0000ffff;
322     r ^= t;
323     l ^= t << 16;
324     t  = ((r >>> 4) ^ l)  & 0x0f0f0f0f;
325     l ^= t;
326     r ^= t << 4;
327 
328     out[0] = l;
329     out[1] = r;
330   }
331   
332   /* Table for key generation.  This used to be in sk.h.
333    * Copyright (C) 1993 Eric Young - see README for more details
334    */
335   final static int des_skb[][] = {
336     /* for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 */
337     { 0x00000000,0x00000010,0x20000000,0x20000010,
338       0x00010000,0x00010010,0x20010000,0x20010010,
339       0x00000800,0x00000810,0x20000800,0x20000810,
340       0x00010800,0x00010810,0x20010800,0x20010810,
341       0x00000020,0x00000030,0x20000020,0x20000030,
342       0x00010020,0x00010030,0x20010020,0x20010030,
343       0x00000820,0x00000830,0x20000820,0x20000830,
344       0x00010820,0x00010830,0x20010820,0x20010830,
345       0x00080000,0x00080010,0x20080000,0x20080010,
346       0x00090000,0x00090010,0x20090000,0x20090010,
347       0x00080800,0x00080810,0x20080800,0x20080810,
348       0x00090800,0x00090810,0x20090800,0x20090810,
349       0x00080020,0x00080030,0x20080020,0x20080030,
350       0x00090020,0x00090030,0x20090020,0x20090030,
351       0x00080820,0x00080830,0x20080820,0x20080830,
352       0x00090820,0x00090830,0x20090820,0x20090830 },
353     /* for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 */
354     { 0x00000000,0x02000000,0x00002000,0x02002000,
355       0x00200000,0x02200000,0x00202000,0x02202000,
356       0x00000004,0x02000004,0x00002004,0x02002004,
357       0x00200004,0x02200004,0x00202004,0x02202004,
358       0x00000400,0x02000400,0x00002400,0x02002400,
359       0x00200400,0x02200400,0x00202400,0x02202400,
360       0x00000404,0x02000404,0x00002404,0x02002404,
361       0x00200404,0x02200404,0x00202404,0x02202404,
362       0x10000000,0x12000000,0x10002000,0x12002000,
363       0x10200000,0x12200000,0x10202000,0x12202000,
364       0x10000004,0x12000004,0x10002004,0x12002004,
365       0x10200004,0x12200004,0x10202004,0x12202004,
366       0x10000400,0x12000400,0x10002400,0x12002400,
367       0x10200400,0x12200400,0x10202400,0x12202400,
368       0x10000404,0x12000404,0x10002404,0x12002404,
369       0x10200404,0x12200404,0x10202404,0x12202404 },
370     /* for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 */
371     { 0x00000000,0x00000001,0x00040000,0x00040001,
372       0x01000000,0x01000001,0x01040000,0x01040001,
373       0x00000002,0x00000003,0x00040002,0x00040003,
374       0x01000002,0x01000003,0x01040002,0x01040003,
375       0x00000200,0x00000201,0x00040200,0x00040201,
376       0x01000200,0x01000201,0x01040200,0x01040201,
377       0x00000202,0x00000203,0x00040202,0x00040203,
378       0x01000202,0x01000203,0x01040202,0x01040203,
379       0x08000000,0x08000001,0x08040000,0x08040001,
380       0x09000000,0x09000001,0x09040000,0x09040001,
381       0x08000002,0x08000003,0x08040002,0x08040003,
382       0x09000002,0x09000003,0x09040002,0x09040003,
383       0x08000200,0x08000201,0x08040200,0x08040201,
384       0x09000200,0x09000201,0x09040200,0x09040201,
385       0x08000202,0x08000203,0x08040202,0x08040203,
386       0x09000202,0x09000203,0x09040202,0x09040203 },
387     /* for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 */
388     { 0x00000000,0x00100000,0x00000100,0x00100100,
389       0x00000008,0x00100008,0x00000108,0x00100108,
390       0x00001000,0x00101000,0x00001100,0x00101100,
391       0x00001008,0x00101008,0x00001108,0x00101108,
392       0x04000000,0x04100000,0x04000100,0x04100100,
393       0x04000008,0x04100008,0x04000108,0x04100108,
394       0x04001000,0x04101000,0x04001100,0x04101100,
395       0x04001008,0x04101008,0x04001108,0x04101108,
396       0x00020000,0x00120000,0x00020100,0x00120100,
397       0x00020008,0x00120008,0x00020108,0x00120108,
398       0x00021000,0x00121000,0x00021100,0x00121100,
399       0x00021008,0x00121008,0x00021108,0x00121108,
400       0x04020000,0x04120000,0x04020100,0x04120100,
401       0x04020008,0x04120008,0x04020108,0x04120108,
402       0x04021000,0x04121000,0x04021100,0x04121100,
403       0x04021008,0x04121008,0x04021108,0x04121108 },
404     /* for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 */
405     { 0x00000000,0x10000000,0x00010000,0x10010000,
406       0x00000004,0x10000004,0x00010004,0x10010004,
407       0x20000000,0x30000000,0x20010000,0x30010000,
408       0x20000004,0x30000004,0x20010004,0x30010004,
409       0x00100000,0x10100000,0x00110000,0x10110000,
410       0x00100004,0x10100004,0x00110004,0x10110004,
411       0x20100000,0x30100000,0x20110000,0x30110000,
412       0x20100004,0x30100004,0x20110004,0x30110004,
413       0x00001000,0x10001000,0x00011000,0x10011000,
414       0x00001004,0x10001004,0x00011004,0x10011004,
415       0x20001000,0x30001000,0x20011000,0x30011000,
416       0x20001004,0x30001004,0x20011004,0x30011004,
417       0x00101000,0x10101000,0x00111000,0x10111000,
418       0x00101004,0x10101004,0x00111004,0x10111004,
419       0x20101000,0x30101000,0x20111000,0x30111000,
420       0x20101004,0x30101004,0x20111004,0x30111004 },
421     /* for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 */
422     { 0x00000000,0x08000000,0x00000008,0x08000008,
423       0x00000400,0x08000400,0x00000408,0x08000408,
424       0x00020000,0x08020000,0x00020008,0x08020008,
425       0x00020400,0x08020400,0x00020408,0x08020408,
426       0x00000001,0x08000001,0x00000009,0x08000009,
427       0x00000401,0x08000401,0x00000409,0x08000409,
428       0x00020001,0x08020001,0x00020009,0x08020009,
429       0x00020401,0x08020401,0x00020409,0x08020409,
430       0x02000000,0x0A000000,0x02000008,0x0A000008,
431       0x02000400,0x0A000400,0x02000408,0x0A000408,
432       0x02020000,0x0A020000,0x02020008,0x0A020008,
433       0x02020400,0x0A020400,0x02020408,0x0A020408,
434       0x02000001,0x0A000001,0x02000009,0x0A000009,
435       0x02000401,0x0A000401,0x02000409,0x0A000409,
436       0x02020001,0x0A020001,0x02020009,0x0A020009,
437       0x02020401,0x0A020401,0x02020409,0x0A020409 },
438     /* for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 */
439     { 0x00000000,0x00000100,0x00080000,0x00080100,
440       0x01000000,0x01000100,0x01080000,0x01080100,
441       0x00000010,0x00000110,0x00080010,0x00080110,
442       0x01000010,0x01000110,0x01080010,0x01080110,
443       0x00200000,0x00200100,0x00280000,0x00280100,
444       0x01200000,0x01200100,0x01280000,0x01280100,
445       0x00200010,0x00200110,0x00280010,0x00280110,
446       0x01200010,0x01200110,0x01280010,0x01280110,
447       0x00000200,0x00000300,0x00080200,0x00080300,
448       0x01000200,0x01000300,0x01080200,0x01080300,
449       0x00000210,0x00000310,0x00080210,0x00080310,
450       0x01000210,0x01000310,0x01080210,0x01080310,
451       0x00200200,0x00200300,0x00280200,0x00280300,
452       0x01200200,0x01200300,0x01280200,0x01280300,
453       0x00200210,0x00200310,0x00280210,0x00280310,
454       0x01200210,0x01200310,0x01280210,0x01280310 },
455     /* for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 */
456     { 0x00000000,0x04000000,0x00040000,0x04040000,
457       0x00000002,0x04000002,0x00040002,0x04040002,
458       0x00002000,0x04002000,0x00042000,0x04042000,
459       0x00002002,0x04002002,0x00042002,0x04042002,
460       0x00000020,0x04000020,0x00040020,0x04040020,
461       0x00000022,0x04000022,0x00040022,0x04040022,
462       0x00002020,0x04002020,0x00042020,0x04042020,
463       0x00002022,0x04002022,0x00042022,0x04042022,
464       0x00000800,0x04000800,0x00040800,0x04040800,
465       0x00000802,0x04000802,0x00040802,0x04040802,
466       0x00002800,0x04002800,0x00042800,0x04042800,
467       0x00002802,0x04002802,0x00042802,0x04042802,
468       0x00000820,0x04000820,0x00040820,0x04040820,
469       0x00000822,0x04000822,0x00040822,0x04040822,
470       0x00002820,0x04002820,0x00042820,0x04042820,
471       0x00002822,0x04002822,0x00042822,0x04042822 }
472   };
473 
474   /* Tables used for executing des.  This used to be in spr.h.
475    * Copyright (C) 1993 Eric Young - see README for more details
476    */
477   final static int des_SPtrans[][] = {
478     /* nibble 0 */
479     { 0x00820200, 0x00020000, 0x80800000, 0x80820200,
480       0x00800000, 0x80020200, 0x80020000, 0x80800000,
481       0x80020200, 0x00820200, 0x00820000, 0x80000200,
482       0x80800200, 0x00800000, 0x00000000, 0x80020000,
483       0x00020000, 0x80000000, 0x00800200, 0x00020200,
484       0x80820200, 0x00820000, 0x80000200, 0x00800200,
485       0x80000000, 0x00000200, 0x00020200, 0x80820000,
486       0x00000200, 0x80800200, 0x80820000, 0x00000000,
487       0x00000000, 0x80820200, 0x00800200, 0x80020000,
488       0x00820200, 0x00020000, 0x80000200, 0x00800200,
489       0x80820000, 0x00000200, 0x00020200, 0x80800000,
490       0x80020200, 0x80000000, 0x80800000, 0x00820000,
491       0x80820200, 0x00020200, 0x00820000, 0x80800200,
492       0x00800000, 0x80000200, 0x80020000, 0x00000000,
493       0x00020000, 0x00800000, 0x80800200, 0x00820200,
494       0x80000000, 0x80820000, 0x00000200, 0x80020200 },
495 
496     /* nibble 1 */
497     { 0x10042004, 0x00000000, 0x00042000, 0x10040000,
498       0x10000004, 0x00002004, 0x10002000, 0x00042000,
499       0x00002000, 0x10040004, 0x00000004, 0x10002000,
500       0x00040004, 0x10042000, 0x10040000, 0x00000004,
501       0x00040000, 0x10002004, 0x10040004, 0x00002000,
502       0x00042004, 0x10000000, 0x00000000, 0x00040004,
503       0x10002004, 0x00042004, 0x10042000, 0x10000004,
504       0x10000000, 0x00040000, 0x00002004, 0x10042004,
505       0x00040004, 0x10042000, 0x10002000, 0x00042004,
506       0x10042004, 0x00040004, 0x10000004, 0x00000000,
507       0x10000000, 0x00002004, 0x00040000, 0x10040004,
508       0x00002000, 0x10000000, 0x00042004, 0x10002004,
509       0x10042000, 0x00002000, 0x00000000, 0x10000004,
510       0x00000004, 0x10042004, 0x00042000, 0x10040000,
511       0x10040004, 0x00040000, 0x00002004, 0x10002000,
512       0x10002004, 0x00000004, 0x10040000, 0x00042000 },
513 
514     /* nibble 2 */
515     { 0x41000000, 0x01010040, 0x00000040, 0x41000040,
516       0x40010000, 0x01000000, 0x41000040, 0x00010040,
517       0x01000040, 0x00010000, 0x01010000, 0x40000000,
518       0x41010040, 0x40000040, 0x40000000, 0x41010000,
519       0x00000000, 0x40010000, 0x01010040, 0x00000040,
520       0x40000040, 0x41010040, 0x00010000, 0x41000000,
521       0x41010000, 0x01000040, 0x40010040, 0x01010000,
522       0x00010040, 0x00000000, 0x01000000, 0x40010040,
523       0x01010040, 0x00000040, 0x40000000, 0x00010000,
524       0x40000040, 0x40010000, 0x01010000, 0x41000040,
525       0x00000000, 0x01010040, 0x00010040, 0x41010000,
526       0x40010000, 0x01000000, 0x41010040, 0x40000000,
527       0x40010040, 0x41000000, 0x01000000, 0x41010040,
528       0x00010000, 0x01000040, 0x41000040, 0x00010040,
529       0x01000040, 0x00000000, 0x41010000, 0x40000040,
530       0x41000000, 0x40010040, 0x00000040, 0x01010000 },
531 
532     /* nibble 3 */
533     { 0x00100402, 0x04000400, 0x00000002, 0x04100402,
534       0x00000000, 0x04100000, 0x04000402, 0x00100002,
535       0x04100400, 0x04000002, 0x04000000, 0x00000402,
536       0x04000002, 0x00100402, 0x00100000, 0x04000000,
537       0x04100002, 0x00100400, 0x00000400, 0x00000002,
538       0x00100400, 0x04000402, 0x04100000, 0x00000400,
539       0x00000402, 0x00000000, 0x00100002, 0x04100400,
540       0x04000400, 0x04100002, 0x04100402, 0x00100000,
541       0x04100002, 0x00000402, 0x00100000, 0x04000002,
542       0x00100400, 0x04000400, 0x00000002, 0x04100000,
543       0x04000402, 0x00000000, 0x00000400, 0x00100002,
544       0x00000000, 0x04100002, 0x04100400, 0x00000400,
545       0x04000000, 0x04100402, 0x00100402, 0x00100000,
546       0x04100402, 0x00000002, 0x04000400, 0x00100402,
547       0x00100002, 0x00100400, 0x04100000, 0x04000402,
548       0x00000402, 0x04000000, 0x04000002, 0x04100400 },
549 
550     /* nibble 4 */
551     { 0x02000000, 0x00004000, 0x00000100, 0x02004108,
552       0x02004008, 0x02000100, 0x00004108, 0x02004000,
553       0x00004000, 0x00000008, 0x02000008, 0x00004100,
554       0x02000108, 0x02004008, 0x02004100, 0x00000000,
555       0x00004100, 0x02000000, 0x00004008, 0x00000108,
556       0x02000100, 0x00004108, 0x00000000, 0x02000008,
557       0x00000008, 0x02000108, 0x02004108, 0x00004008,
558       0x02004000, 0x00000100, 0x00000108, 0x02004100,
559       0x02004100, 0x02000108, 0x00004008, 0x02004000,
560       0x00004000, 0x00000008, 0x02000008, 0x02000100,
561       0x02000000, 0x00004100, 0x02004108, 0x00000000,
562       0x00004108, 0x02000000, 0x00000100, 0x00004008,
563       0x02000108, 0x00000100, 0x00000000, 0x02004108,
564       0x02004008, 0x02004100, 0x00000108, 0x00004000,
565       0x00004100, 0x02004008, 0x02000100, 0x00000108,
566       0x00000008, 0x00004108, 0x02004000, 0x02000008 },
567 
568     /* nibble 5 */
569     { 0x20000010, 0x00080010, 0x00000000, 0x20080800,
570       0x00080010, 0x00000800, 0x20000810, 0x00080000,
571       0x00000810, 0x20080810, 0x00080800, 0x20000000,
572       0x20000800, 0x20000010, 0x20080000, 0x00080810,
573       0x00080000, 0x20000810, 0x20080010, 0x00000000,
574       0x00000800, 0x00000010, 0x20080800, 0x20080010,
575       0x20080810, 0x20080000, 0x20000000, 0x00000810,
576       0x00000010, 0x00080800, 0x00080810, 0x20000800,
577       0x00000810, 0x20000000, 0x20000800, 0x00080810,
578       0x20080800, 0x00080010, 0x00000000, 0x20000800,
579       0x20000000, 0x00000800, 0x20080010, 0x00080000,
580       0x00080010, 0x20080810, 0x00080800, 0x00000010,
581       0x20080810, 0x00080800, 0x00080000, 0x20000810,
582       0x20000010, 0x20080000, 0x00080810, 0x00000000,
583       0x00000800, 0x20000010, 0x20000810, 0x20080800,
584       0x20080000, 0x00000810, 0x00000010, 0x20080010 },
585 
586     /* nibble 6 */
587     { 0x00001000, 0x00000080, 0x00400080, 0x00400001,
588       0x00401081, 0x00001001, 0x00001080, 0x00000000,
589       0x00400000, 0x00400081, 0x00000081, 0x00401000,
590       0x00000001, 0x00401080, 0x00401000, 0x00000081,
591       0x00400081, 0x00001000, 0x00001001, 0x00401081,
592       0x00000000, 0x00400080, 0x00400001, 0x00001080,
593       0x00401001, 0x00001081, 0x00401080, 0x00000001,
594       0x00001081, 0x00401001, 0x00000080, 0x00400000,
595       0x00001081, 0x00401000, 0x00401001, 0x00000081,
596       0x00001000, 0x00000080, 0x00400000, 0x00401001,
597       0x00400081, 0x00001081, 0x00001080, 0x00000000,
598       0x00000080, 0x00400001, 0x00000001, 0x00400080,
599       0x00000000, 0x00400081, 0x00400080, 0x00001080,
600       0x00000081, 0x00001000, 0x00401081, 0x00400000,
601       0x00401080, 0x00000001, 0x00001001, 0x00401081,
602       0x00400001, 0x00401080, 0x00401000, 0x00001001 },
603 
604     /* nibble 7 */
605     { 0x08200020, 0x08208000, 0x00008020, 0x00000000,
606       0x08008000, 0x00200020, 0x08200000, 0x08208020,
607       0x00000020, 0x08000000, 0x00208000, 0x00008020,
608       0x00208020, 0x08008020, 0x08000020, 0x08200000,
609       0x00008000, 0x00208020, 0x00200020, 0x08008000,
610       0x08208020, 0x08000020, 0x00000000, 0x00208000,
611       0x08000000, 0x00200000, 0x08008020, 0x08200020,
612       0x00200000, 0x00008000, 0x08208000, 0x00000020,
613       0x00200000, 0x00008000, 0x08000020, 0x08208020,
614       0x00008020, 0x08000000, 0x00000000, 0x00208000,
615       0x08200020, 0x08008020, 0x08008000, 0x00200020,
616       0x08208000, 0x00000020, 0x00200020, 0x08008000,
617       0x08208020, 0x00200000, 0x08200000, 0x08000020,
618       0x00208000, 0x00008020, 0x08008020, 0x08200000,
619       0x00000020, 0x08208000, 0x00208020, 0x00000000,
620       0x08000000, 0x08200020, 0x00008000, 0x00208020 }
621   };
622 
623 }