/* DES.java --
   Copyright (C) 2002, 2003, 2006 Free Software Foundation, Inc.

This file is a part of GNU Classpath.

GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or (at
your option) any later version.

GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
General Public License for more details.

You should have received a copy of the GNU General Public License
along with GNU Classpath; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
USA

Linking this library statically or dynamically with other modules is
making a combined work based on this library.  Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.

As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module.  An independent module is a module which is not derived from
or based on this library.  If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so.  If you do not wish to do so, delete this
exception statement from your version.  */


package gnu.javax.crypto.cipher;

import gnu.java.security.Registry;
import gnu.java.security.Properties;
import gnu.java.security.util.Util;

import java.security.InvalidKeyException;
import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;

/**
 * The Data Encryption Standard. DES is a 64-bit block cipher with a 56-bit
 * key, developed by IBM in the 1970's for the standardization process begun by
 * the National Bureau of Standards (now NIST).
 * <p>
 * New applications should not use DES except for compatibility.
 * <p>
 * This version is based upon the description and sample implementation in
 * [1].
 * <p>
 * References:
 * <ol>
 *    <li>Bruce Schneier, <i>Applied Cryptography: Protocols, Algorithms, and
 *    Source Code in C, Second Edition</i>. (1996 John Wiley and Sons) ISBN
 *    0-471-11709-9. Pages 265--301, 623--632.</li>
 * </ol>
 */
public class DES
    extends BaseCipher
{
  /** DES operates on 64 bit blocks. */
  public static final int BLOCK_SIZE = 8;
  /** DES uses 56 bits of a 64 bit parity-adjusted key. */
  public static final int KEY_SIZE = 8;
  // S-Boxes 1 through 8.
  private static final int[] SP1 = new int[] {
      0x01010400, 0x00000000, 0x00010000, 0x01010404, 0x01010004, 0x00010404,
      0x00000004, 0x00010000, 0x00000400, 0x01010400, 0x01010404, 0x00000400,
      0x01000404, 0x01010004, 0x01000000, 0x00000004, 0x00000404, 0x01000400,
      0x01000400, 0x00010400, 0x00010400, 0x01010000, 0x01010000, 0x01000404,
      0x00010004, 0x01000004, 0x01000004, 0x00010004, 0x00000000, 0x00000404,
      0x00010404, 0x01000000, 0x00010000, 0x01010404, 0x00000004, 0x01010000,
      0x01010400, 0x01000000, 0x01000000, 0x00000400, 0x01010004, 0x00010000,
      0x00010400, 0x01000004, 0x00000400, 0x00000004, 0x01000404, 0x00010404,
      0x01010404, 0x00010004, 0x01010000, 0x01000404, 0x01000004, 0x00000404,
      0x00010404, 0x01010400, 0x00000404, 0x01000400, 0x01000400, 0x00000000,
      0x00010004, 0x00010400, 0x00000000, 0x01010004 };
  private static final int[] SP2 = new int[] {
      0x80108020, 0x80008000, 0x00008000, 0x00108020, 0x00100000, 0x00000020,
      0x80100020, 0x80008020, 0x80000020, 0x80108020, 0x80108000, 0x80000000,
      0x80008000, 0x00100000, 0x00000020, 0x80100020, 0x00108000, 0x00100020,
      0x80008020, 0x00000000, 0x80000000, 0x00008000, 0x00108020, 0x80100000,
      0x00100020, 0x80000020, 0x00000000, 0x00108000, 0x00008020, 0x80108000,
      0x80100000, 0x00008020, 0x00000000, 0x00108020, 0x80100020, 0x00100000,
      0x80008020, 0x80100000, 0x80108000, 0x00008000, 0x80100000, 0x80008000,
      0x00000020, 0x80108020, 0x00108020, 0x00000020, 0x00008000, 0x80000000,
      0x00008020, 0x80108000, 0x00100000, 0x80000020, 0x00100020, 0x80008020,
      0x80000020, 0x00100020, 0x00108000, 0x00000000, 0x80008000, 0x00008020,
      0x80000000, 0x80100020, 0x80108020, 0x00108000 };
  private static final int[] SP3 = new int[] {
      0x00000208, 0x08020200, 0x00000000, 0x08020008, 0x08000200, 0x00000000,
      0x00020208, 0x08000200, 0x00020008, 0x08000008, 0x08000008, 0x00020000,
      0x08020208, 0x00020008, 0x08020000, 0x00000208, 0x08000000, 0x00000008,
      0x08020200, 0x00000200, 0x00020200, 0x08020000, 0x08020008, 0x00020208,
      0x08000208, 0x00020200, 0x00020000, 0x08000208, 0x00000008, 0x08020208,
      0x00000200, 0x08000000, 0x08020200, 0x08000000, 0x00020008, 0x00000208,
      0x00020000, 0x08020200, 0x08000200, 0x00000000, 0x00000200, 0x00020008,
      0x08020208, 0x08000200, 0x08000008, 0x00000200, 0x00000000, 0x08020008,
      0x08000208, 0x00020000, 0x08000000, 0x08020208, 0x00000008, 0x00020208,
      0x00020200, 0x08000008, 0x08020000, 0x08000208, 0x00000208, 0x08020000,
      0x00020208, 0x00000008, 0x08020008, 0x00020200 };
  private static final int[] SP4 = new int[] {
      0x00802001, 0x00002081, 0x00002081, 0x00000080, 0x00802080, 0x00800081,
      0x00800001, 0x00002001, 0x00000000, 0x00802000, 0x00802000, 0x00802081,
      0x00000081, 0x00000000, 0x00800080, 0x00800001, 0x00000001, 0x00002000,
      0x00800000, 0x00802001, 0x00000080, 0x00800000, 0x00002001, 0x00002080,
      0x00800081, 0x00000001, 0x00002080, 0x00800080, 0x00002000, 0x00802080,
      0x00802081, 0x00000081, 0x00800080, 0x00800001, 0x00802000, 0x00802081,
      0x00000081, 0x00000000, 0x00000000, 0x00802000, 0x00002080, 0x00800080,
      0x00800081, 0x00000001, 0x00802001, 0x00002081, 0x00002081, 0x00000080,
      0x00802081, 0x00000081, 0x00000001, 0x00002000, 0x00800001, 0x00002001,
      0x00802080, 0x00800081, 0x00002001, 0x00002080, 0x00800000, 0x00802001,
      0x00000080, 0x00800000, 0x00002000, 0x00802080 };
  private static final int[] SP5 = new int[] {
      0x00000100, 0x02080100, 0x02080000, 0x42000100, 0x00080000, 0x00000100,
      0x40000000, 0x02080000, 0x40080100, 0x00080000, 0x02000100, 0x40080100,
      0x42000100, 0x42080000, 0x00080100, 0x40000000, 0x02000000, 0x40080000,
      0x40080000, 0x00000000, 0x40000100, 0x42080100, 0x42080100, 0x02000100,
      0x42080000, 0x40000100, 0x00000000, 0x42000000, 0x02080100, 0x02000000,
      0x42000000, 0x00080100, 0x00080000, 0x42000100, 0x00000100, 0x02000000,
      0x40000000, 0x02080000, 0x42000100, 0x40080100, 0x02000100, 0x40000000,
      0x42080000, 0x02080100, 0x40080100, 0x00000100, 0x02000000, 0x42080000,
      0x42080100, 0x00080100, 0x42000000, 0x42080100, 0x02080000, 0x00000000,
      0x40080000, 0x42000000, 0x00080100, 0x02000100, 0x40000100, 0x00080000,
      0x00000000, 0x40080000, 0x02080100, 0x40000100 };
  private static final int[] SP6 = new int[] {
      0x20000010, 0x20400000, 0x00004000, 0x20404010, 0x20400000, 0x00000010,
      0x20404010, 0x00400000, 0x20004000, 0x00404010, 0x00400000, 0x20000010,
      0x00400010, 0x20004000, 0x20000000, 0x00004010, 0x00000000, 0x00400010,
      0x20004010, 0x00004000, 0x00404000, 0x20004010, 0x00000010, 0x20400010,
      0x20400010, 0x00000000, 0x00404010, 0x20404000, 0x00004010, 0x00404000,
      0x20404000, 0x20000000, 0x20004000, 0x00000010, 0x20400010, 0x00404000,
      0x20404010, 0x00400000, 0x00004010, 0x20000010, 0x00400000, 0x20004000,
      0x20000000, 0x00004010, 0x20000010, 0x20404010, 0x00404000, 0x20400000,
      0x00404010, 0x20404000, 0x00000000, 0x20400010, 0x00000010, 0x00004000,
      0x20400000, 0x00404010, 0x00004000, 0x00400010, 0x20004010, 0x00000000,
      0x20404000, 0x20000000, 0x00400010, 0x20004010 };
  private static final int[] SP7 = new int[] {
      0x00200000, 0x04200002, 0x04000802, 0x00000000, 0x00000800, 0x04000802,
      0x00200802, 0x04200800, 0x04200802, 0x00200000, 0x00000000, 0x04000002,
      0x00000002, 0x04000000, 0x04200002, 0x00000802, 0x04000800, 0x00200802,
      0x00200002, 0x04000800, 0x04000002, 0x04200000, 0x04200800, 0x00200002,
      0x04200000, 0x00000800, 0x00000802, 0x04200802, 0x00200800, 0x00000002,
      0x04000000, 0x00200800, 0x04000000, 0x00200800, 0x00200000, 0x04000802,
      0x04000802, 0x04200002, 0x04200002, 0x00000002, 0x00200002, 0x04000000,
      0x04000800, 0x00200000, 0x04200800, 0x00000802, 0x00200802, 0x04200800,
      0x00000802, 0x04000002, 0x04200802, 0x04200000, 0x00200800, 0x00000000,
      0x00000002, 0x04200802, 0x00000000, 0x00200802, 0x04200000, 0x00000800,
      0x04000002, 0x04000800, 0x00000800, 0x00200002 };
  private static final int[] SP8 = new int[] {
      0x10001040, 0x00001000, 0x00040000, 0x10041040, 0x10000000, 0x10001040,
      0x00000040, 0x10000000, 0x00040040, 0x10040000, 0x10041040, 0x00041000,
      0x10041000, 0x00041040, 0x00001000, 0x00000040, 0x10040000, 0x10000040,
      0x10001000, 0x00001040, 0x00041000, 0x00040040, 0x10040040, 0x10041000,
      0x00001040, 0x00000000, 0x00000000, 0x10040040, 0x10000040, 0x10001000,
      0x00041040, 0x00040000, 0x00041040, 0x00040000, 0x10041000, 0x00001000,
      0x00000040, 0x10040040, 0x00001000, 0x00041040, 0x10001000, 0x00000040,
      0x10000040, 0x10040000, 0x10040040, 0x10000000, 0x00040000, 0x10001040,
      0x00000000, 0x10041040, 0x00040040, 0x10000040, 0x10040000, 0x10001000,
      0x10001040, 0x00000000, 0x10041040, 0x00041000, 0x00041000, 0x00001040,
      0x00001040, 0x00040040, 0x10000000, 0x10041000 };
  /**
   * Constants that help in determining whether or not a byte array is parity
   * adjusted.
   */
  private static final byte[] PARITY = {
      8, 1, 0, 8, 0, 8, 8, 0, 0, 8, 8, 0, 8, 0, 2, 8,
      0, 8, 8, 0, 8, 0, 0, 8, 8, 0, 0, 8, 0, 8, 8, 3,
      0, 8, 8, 0, 8, 0, 0, 8, 8, 0, 0, 8, 0, 8, 8, 0,
      8, 0, 0, 8, 0, 8, 8, 0, 0, 8, 8, 0, 8, 0, 0, 8,
      0, 8, 8, 0, 8, 0, 0, 8, 8, 0, 0, 8, 0, 8, 8, 0,
      8, 0, 0, 8, 0, 8, 8, 0, 0, 8, 8, 0, 8, 0, 0, 8,
      8, 0, 0, 8, 0, 8, 8, 0, 0, 8, 8, 0, 8, 0, 0, 8,
      0, 8, 8, 0, 8, 0, 0, 8, 8, 0, 0, 8, 0, 8, 8, 0,
      0, 8, 8, 0, 8, 0, 0, 8, 8, 0, 0, 8, 0, 8, 8, 0,
      8, 0, 0, 8, 0, 8, 8, 0, 0, 8, 8, 0, 8, 0, 0, 8,
      8, 0, 0, 8, 0, 8, 8, 0, 0, 8, 8, 0, 8, 0, 0, 8,
      0, 8, 8, 0, 8, 0, 0, 8, 8, 0, 0, 8, 0, 8, 8, 0,
      8, 0, 0, 8, 0, 8, 8, 0, 0, 8, 8, 0, 8, 0, 0, 8,
      0, 8, 8, 0, 8, 0, 0, 8, 8, 0, 0, 8, 0, 8, 8, 0,
      4, 8, 8, 0, 8, 0, 0, 8, 8, 0, 0, 8, 0, 8, 8, 0,
      8, 5, 0, 8, 0, 8, 8, 0, 0, 8, 8, 0, 8, 0, 6, 8 };
  // Key schedule constants.
  private static final byte[] ROTARS = {
      1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28 };
  private static final byte[] PC1 = {
      56, 48, 40, 32, 24, 16,  8,  0, 57, 49, 41, 33, 25, 17,  9,  1,
      58, 50, 42, 34, 26, 18, 10,  2, 59, 51, 43, 35, 62, 54, 46, 38,
      30, 22, 14,  6, 61, 53, 45, 37, 29, 21, 13,  5, 60, 52, 44, 36,
      28, 20, 12,  4, 27, 19, 11,  3 };
  private static final byte[] PC2 = {
      13, 16, 10, 23,  0,  4,  2, 27, 14,  5, 20,  9, 22, 18, 11,  3,
      25,  7, 15,  6, 26, 19, 12,  1, 40, 51, 30, 36, 46, 54, 29, 39,
      50, 44, 32, 47, 43, 48, 38, 55, 33, 52, 45, 41, 49, 35, 28, 31 };
  /**
   * Weak keys (parity adjusted): If all the bits in each half are either 0
   * or 1, then the key used for any cycle of the algorithm is the same as
   * all other cycles.
   */
  public static final byte[][] WEAK_KEYS = {
      Util.toBytesFromString("0101010101010101"),
      Util.toBytesFromString("01010101FEFEFEFE"),
      Util.toBytesFromString("FEFEFEFE01010101"),
      Util.toBytesFromString("FEFEFEFEFEFEFEFE") };
  /**
   * Semi-weak keys (parity adjusted):  Some pairs of keys encrypt plain text
   * to identical cipher text. In other words, one key in the pair can decrypt
   * messages that were encrypted with the other key. These keys are called
   * semi-weak keys. This occurs because instead of 16 different sub-keys being
   * generated, these semi-weak keys produce only two different sub-keys.
   */
  public static final byte[][] SEMIWEAK_KEYS = {
      Util.toBytesFromString("01FE01FE01FE01FE"),
      Util.toBytesFromString("FE01FE01FE01FE01"),
      Util.toBytesFromString("1FE01FE00EF10EF1"),
      Util.toBytesFromString("E01FE01FF10EF10E"),
      Util.toBytesFromString("01E001E001F101F1"),
      Util.toBytesFromString("E001E001F101F101"),
      Util.toBytesFromString("1FFE1FFE0EFE0EFE"),
      Util.toBytesFromString("FE1FFE1FFE0EFE0E"),
      Util.toBytesFromString("011F011F010E010E"),
      Util.toBytesFromString("1F011F010E010E01"),
      Util.toBytesFromString("E0FEE0FEF1FEF1FE"),
      Util.toBytesFromString("FEE0FEE0FEF1FEF1") };
  /** Possible weak keys (parity adjusted) --produce 4 instead of 16 subkeys. */
  public static final byte[][] POSSIBLE_WEAK_KEYS = {
      Util.toBytesFromString("1F1F01010E0E0101"),
      Util.toBytesFromString("011F1F01010E0E01"),
      Util.toBytesFromString("1F01011F0E01010E"),
      Util.toBytesFromString("01011F1F01010E0E"),
      Util.toBytesFromString("E0E00101F1F10101"),
      Util.toBytesFromString("FEFE0101FEFE0101"),
      Util.toBytesFromString("FEE01F01FEF10E01"),
      Util.toBytesFromString("E0FE1F01F1FE0E01"),
      Util.toBytesFromString("FEE0011FFEF1010E"),
      Util.toBytesFromString("E0FE011FF1FE010E"),
      Util.toBytesFromString("E0E01F1FF1F10E0E"),
      Util.toBytesFromString("FEFE1F1FFEFE0E0E"),
      Util.toBytesFromString("1F1F01010E0E0101"),
      Util.toBytesFromString("011F1F01010E0E01"),
      Util.toBytesFromString("1F01011F0E01010E"),
      Util.toBytesFromString("01011F1F01010E0E"),
      Util.toBytesFromString("01E0E00101F1F101"),
      Util.toBytesFromString("1FFEE0010EFEF001"),
      Util.toBytesFromString("1FE0FE010EF1FE01"),
      Util.toBytesFromString("01FEFE0101FEFE01"),
      Util.toBytesFromString("1FE0E01F0EF1F10E"),
      Util.toBytesFromString("01FEE01F01FEF10E"),
      Util.toBytesFromString("01E0FE1F01F1FE0E"),
      Util.toBytesFromString("1FFEFE1F0EFEFE0E"),

      Util.toBytesFromString("E00101E0F10101F1"),
      Util.toBytesFromString("FE1F01E0FE0E0EF1"),
      Util.toBytesFromString("FE011FE0FE010EF1"),
      Util.toBytesFromString("E01F1FE0F10E0EF1"),
      Util.toBytesFromString("FE0101FEFE0101FE"),
      Util.toBytesFromString("E01F01FEF10E01FE"),
      Util.toBytesFromString("E0011FFEF1010EFE"),
      Util.toBytesFromString("FE1F1FFEFE0E0EFE"),
      Util.toBytesFromString("1FFE01E00EFE01F1"),
      Util.toBytesFromString("01FE1FE001FE0EF1"),
      Util.toBytesFromString("1FE001FE0EF101FE"),
      Util.toBytesFromString("01E01FFE01F10EFE"),
      Util.toBytesFromString("0101E0E00101F1F1"),
      Util.toBytesFromString("1F1FE0E00E0EF1F1"),
      Util.toBytesFromString("1F01FEE00E01FEF1"),
      Util.toBytesFromString("011FFEE0010EFEF1"),
      Util.toBytesFromString("1F01E0FE0E01F1FE"),
      Util.toBytesFromString("011FE0FE010EF1FE"),
      Util.toBytesFromString("0101FEFE0001FEFE"),
      Util.toBytesFromString("1F1FFEFE0E0EFEFE"),
      Util.toBytesFromString("FEFEE0E0FEFEF1F1"),
      Util.toBytesFromString("E0FEFEE0F1FEFEF1"),
      Util.toBytesFromString("FEE0E0FEFEF1F1FE"),
      Util.toBytesFromString("E0E0FEFEF1F1FEFE") };

  /** Default 0-argument constructor. */
  public DES()
  {
    super(Registry.DES_CIPHER, BLOCK_SIZE, KEY_SIZE);
  }

  /**
   * Adjust the parity for a raw key array. This essentially means that each
   * byte in the array will have an odd number of '1' bits (the last bit in
   * each byte is unused.
   *
   * @param kb The key array, to be parity-adjusted.
   * @param offset The starting index into the key bytes.
   */
  public static void adjustParity(byte[] kb, int offset)
  {
    for (int i = offset; i < offset + KEY_SIZE; i++)
      kb[i] ^= (PARITY[kb[i] & 0xff] == 8) ? 1 : 0;
  }

  /**
   * Test if a byte array, which must be at least 8 bytes long, is parity
   * adjusted.
   *
   * @param kb The key bytes.
   * @param offset The starting index into the key bytes.
   * @return <code>true</code> if the first 8 bytes of <i>kb</i> have been
   * parity adjusted. <code>false</code> otherwise.
   */
  public static boolean isParityAdjusted(byte[] kb, int offset)
  {
    int w = 0x88888888;
    int n = PARITY[kb[offset + 0] & 0xff];
    n <<= 4;
    n |= PARITY[kb[offset + 1] & 0xff];
    n <<= 4;
    n |= PARITY[kb[offset + 2] & 0xff];
    n <<= 4;
    n |= PARITY[kb[offset + 3] & 0xff];
    n <<= 4;
    n |= PARITY[kb[offset + 4] & 0xff];
    n <<= 4;
    n |= PARITY[kb[offset + 5] & 0xff];
    n <<= 4;
    n |= PARITY[kb[offset + 6] & 0xff];
    n <<= 4;
    n |= PARITY[kb[offset + 7] & 0xff];
    return (n & w) == 0;
  }

  /**
   * Test if a key is a weak key.
   *
   * @param kb The key to test.
   * @return <code>true</code> if the key is weak.
   */
  public static boolean isWeak(byte[] kb)
  {
    for (int i = 0; i < WEAK_KEYS.length; i++)
      if (Arrays.equals(WEAK_KEYS[i], kb))
        return true;
    return false;
  }

  /**
   * Test if a key is a semi-weak key.
   *
   * @param kb The key to test.
   * @return <code>true</code> if this key is semi-weak.
   */
  public static boolean isSemiWeak(byte[] kb)
  {
    for (int i = 0; i < SEMIWEAK_KEYS.length; i++)
      if (Arrays.equals(SEMIWEAK_KEYS[i], kb))
        return true;
    return false;
  }

  /**
   * Test if the designated byte array represents a possibly weak key.
   *
   * @param kb the byte array to test.
   * @return <code>true</code> if <code>kb</code>represents a possibly weak key.
   * Returns <code>false</code> otherwise.
   */
  public static boolean isPossibleWeak(byte[] kb)
  {
    for (int i = 0; i < POSSIBLE_WEAK_KEYS.length; i++)
      if (Arrays.equals(POSSIBLE_WEAK_KEYS[i], kb))
        return true;
    return false;
  }

  /**
   * The core DES function. This is used for both encryption and decryption,
   * the only difference being the key.
   *
   * @param in The input bytes.
   * @param i The starting offset into the input bytes.
   * @param out The output bytes.
   * @param o The starting offset into the output bytes.
   * @param key The working key.
   */
  private static void desFunc(byte[] in, int i, byte[] out, int o, int[] key)
  {
    int right, left, work;
    // Load.
    left =  (in[i++] & 0xff) << 24
          | (in[i++] & 0xff) << 16
          | (in[i++] & 0xff) << 8
          |  in[i++] & 0xff;
    right = (in[i++] & 0xff) << 24
          | (in[i++] & 0xff) << 16
          | (in[i++] & 0xff) << 8
          |  in[i  ] & 0xff;
    // Initial permutation.
    work = ((left >>> 4) ^ right) & 0x0F0F0F0F;
    left ^= work << 4;
    right ^= work;

    work = ((left >>> 16) ^ right) & 0x0000FFFF;
    left ^= work << 16;
    right ^= work;

    work = ((right >>> 2) ^ left) & 0x33333333;
    right ^= work << 2;
    left ^= work;

    work = ((right >>> 8) ^ left) & 0x00FF00FF;
    right ^= work << 8;
    left ^= work;

    right = ((right << 1) | ((right >>> 31) & 1)) & 0xFFFFFFFF;
    work = (left ^ right) & 0xAAAAAAAA;
    left ^= work;
    right ^= work;
    left = ((left << 1) | ((left >>> 31) & 1)) & 0xFFFFFFFF;

    int k = 0, t;
    for (int round = 0; round < 8; round++)
      {
        work = right >>> 4 | right << 28;
        work ^= key[k++];
        t = SP7[work & 0x3F];
        work >>>= 8;
        t |= SP5[work & 0x3F];
        work >>>= 8;
        t |= SP3[work & 0x3F];
        work >>>= 8;
        t |= SP1[work & 0x3F];
        work = right ^ key[k++];
        t |= SP8[work & 0x3F];
        work >>>= 8;
        t |= SP6[work & 0x3F];
        work >>>= 8;
        t |= SP4[work & 0x3F];
        work >>>= 8;
        t |= SP2[work & 0x3F];
        left ^= t;

        work = left >>> 4 | left << 28;
        work ^= key[k++];
        t = SP7[work & 0x3F];
        work >>>= 8;
        t |= SP5[work & 0x3F];
        work >>>= 8;
        t |= SP3[work & 0x3F];
        work >>>= 8;
        t |= SP1[work & 0x3F];
        work = left ^ key[k++];
        t |= SP8[work & 0x3F];
        work >>>= 8;
        t |= SP6[work & 0x3F];
        work >>>= 8;
        t |= SP4[work & 0x3F];
        work >>>= 8;
        t |= SP2[work & 0x3F];
        right ^= t;
      }
    // The final permutation.
    right = (right << 31) | (right >>> 1);
    work = (left ^ right) & 0xAAAAAAAA;
    left ^= work;
    right ^= work;
    left = (left << 31) | (left >>> 1);

    work = ((left >>> 8) ^ right) & 0x00FF00FF;
    left ^= work << 8;
    right ^= work;

    work = ((left >>> 2) ^ right) & 0x33333333;
    left ^= work << 2;
    right ^= work;

    work = ((right >>> 16) ^ left) & 0x0000FFFF;
    right ^= work << 16;
    left ^= work;

    work = ((right >>> 4) ^ left) & 0x0F0F0F0F;
    right ^= work << 4;
    left ^= work;

    out[o++] = (byte)(right >>> 24);
    out[o++] = (byte)(right >>> 16);
    out[o++] = (byte)(right >>> 8);
    out[o++] = (byte) right;
    out[o++] = (byte)(left >>> 24);
    out[o++] = (byte)(left >>> 16);
    out[o++] = (byte)(left >>> 8);
    out[o  ] = (byte) left;
  }

  public Object clone()
  {
    return new DES();
  }

  public Iterator blockSizes()
  {
    return Collections.singleton(Integer.valueOf(BLOCK_SIZE)).iterator();
  }

  public Iterator keySizes()
  {
    return Collections.singleton(Integer.valueOf(KEY_SIZE)).iterator();
  }

  public Object makeKey(byte[] kb, int bs) throws InvalidKeyException
  {
    if (kb == null || kb.length != KEY_SIZE)
      throw new InvalidKeyException("DES keys must be 8 bytes long");

    if (Properties.checkForWeakKeys()
        && (isWeak(kb) || isSemiWeak(kb) || isPossibleWeak(kb)))
      throw new WeakKeyException();

    int i, j, l, m, n;
    long pc1m = 0, pcr = 0;

    for (i = 0; i < 56; i++)
      {
        l = PC1[i];
        pc1m |= ((kb[l >>> 3] & (0x80 >>> (l & 7))) != 0) ? (1L << (55 - i))
                                                          : 0;
      }
    Context ctx = new Context();
    // Encryption key first.
    for (i = 0; i < 16; i++)
      {
        pcr = 0;
        m = i << 1;
        n = m + 1;
        for (j = 0; j < 28; j++)
          {
            l = j + ROTARS[i];
            if (l < 28)
              pcr |= ((pc1m & 1L << (55 - l)) != 0) ? (1L << (55 - j)) : 0;
            else
              pcr |= ((pc1m & 1L << (55 - (l - 28))) != 0) ? (1L << (55 - j))
                                                           : 0;
          }
        for (j = 28; j < 56; j++)
          {
            l = j + ROTARS[i];
            if (l < 56)
              pcr |= ((pc1m & 1L << (55 - l)) != 0) ? (1L << (55 - j)) : 0;
            else
              pcr |= ((pc1m & 1L << (55 - (l - 28))) != 0) ? (1L << (55 - j))
                                                           : 0;
          }
        for (j = 0; j < 24; j++)
          {
            if ((pcr & 1L << (55 - PC2[j])) != 0)
              ctx.ek[m] |= 1 << (23 - j);
            if ((pcr & 1L << (55 - PC2[j + 24])) != 0)
              ctx.ek[n] |= 1 << (23 - j);
          }
      }
    // The decryption key is the same, but in reversed order.
    for (i = 0; i < Context.EXPANDED_KEY_SIZE; i += 2)
      {
        ctx.dk[30 - i] = ctx.ek[i];
        ctx.dk[31 - i] = ctx.ek[i + 1];
      }
    // "Cook" the keys.
    for (i = 0; i < 32; i += 2)
      {
        int x, y;
        x = ctx.ek[i];
        y = ctx.ek[i + 1];
        ctx.ek[i    ] = ((x & 0x00FC0000)  <<  6)
                      | ((x & 0x00000FC0)  << 10)
                      | ((y & 0x00FC0000) >>> 10)
                      | ((y & 0x00000FC0) >>>  6);
        ctx.ek[i + 1] = ((x & 0x0003F000)  << 12)
                      | ((x & 0x0000003F)  << 16)
                      | ((y & 0x0003F000) >>>  4)
                      |  (y & 0x0000003F);
        x = ctx.dk[i];
        y = ctx.dk[i + 1];
        ctx.dk[i    ] = ((x & 0x00FC0000)  <<  6)
                      | ((x & 0x00000FC0)  << 10)
                      | ((y & 0x00FC0000) >>> 10)
                      | ((y & 0x00000FC0) >>>  6);
        ctx.dk[i + 1] = ((x & 0x0003F000)  << 12)
                      | ((x & 0x0000003F)  << 16)
                      | ((y & 0x0003F000) >>>  4)
                      |  (y & 0x0000003F);
      }
    return ctx;
  }

  public void encrypt(byte[] in, int i, byte[] out, int o, Object K, int bs)
  {
    desFunc(in, i, out, o, ((Context) K).ek);
  }

  public void decrypt(byte[] in, int i, byte[] out, int o, Object K, int bs)
  {
    desFunc(in, i, out, o, ((Context) K).dk);
  }

  /**
   * Simple wrapper class around the session keys. Package-private so TripleDES
   * can see it.
   */
  final class Context
  {
    private static final int EXPANDED_KEY_SIZE = 32;

    /** The encryption key. */
    int[] ek;

    /** The decryption key. */
    int[] dk;

    /** Default 0-arguments constructor. */
    Context()
    {
      ek = new int[EXPANDED_KEY_SIZE];
      dk = new int[EXPANDED_KEY_SIZE];
    }

    byte[] getEncryptionKeyBytes()
    {
      return toByteArray(ek);
    }

    byte[] getDecryptionKeyBytes()
    {
      return toByteArray(dk);
    }

    byte[] toByteArray(int[] k)
    {
      byte[] result = new byte[4 * k.length];
      for (int i = 0, j = 0; i < k.length; i++)
        {
          result[j++] = (byte)(k[i] >>> 24);
          result[j++] = (byte)(k[i] >>> 16);
          result[j++] = (byte)(k[i] >>> 8);
          result[j++] = (byte) k[i];
        }
      return result;
    }
  }
}
