public static final void main(String[] args) {
    try {
      IBlockCipher cipher = CipherFactory.getInstance(args[0]);

      int keySize = cipher.defaultKeySize() * 8;
      if (args.length > 1) {
        keySize = Integer.parseInt(args[1]);
      }

      long time = -System.currentTimeMillis();

      set1(cipher, keySize);
      set2(cipher, keySize);
      set3(cipher, keySize);
      set4(cipher, keySize);

      time += System.currentTimeMillis();
      System.out.println();
      System.out.println("End of test vectors");
      System.out.println();
      System.out.println("*** Tests lasted " + time + " ms...");

    } catch (Exception x) {
      x.printStackTrace(System.err);
    }
  }
  private static void set4(IBlockCipher cipher, int keySize) throws InvalidKeyException {
    // this is torture for low-speed CPUs. only execute if global env var
    // TORTURE is set!
    String dummy = System.getProperty("TORTURE");
    if (dummy == null) {
      return;
    }

    int kl = keySize / 8;
    int bl = cipher.defaultBlockSize();
    byte[] k = new byte[kl];
    byte[] p = new byte[bl];
    int j, t, x;
    System.out.println("Test vectors -- set 4");
    System.out.println("=====================");
    System.out.println();
    HashMap map = new HashMap();
    for (int i = 0; i < 4; i++) {
      System.out.println("Set 4, vector#  " + String.valueOf(i) + ":");
      for (j = 0; j < bl; j++) {
        k[j] = (byte) i;
        p[j] = (byte) i;
      }
      for (; j < kl; j++) {
        k[j] = (byte) i;
      }
      System.out.println("                      key=" + Util.toString(k));
      System.out.println("                    plain=" + Util.toString(p));
      x = i;
      for (j = 0; j < 100000000; j++) {
        for (t = 0; t < kl; t++) {
          k[t] = (byte) x;
        }
        map.put(IBlockCipher.KEY_MATERIAL, k);
        cipher.init(map);
        cipher.encryptBlock(p, 0, p, 0);
        cipher.reset();
        x = p[bl - 1] & 0xFF;
      }
      System.out.println("      Iterated 10^8 times=" + Util.toString(p));
      System.out.println();
    }
  }
  /** Test cloneability. */
  protected boolean cloneabilityTest() throws Exception {
    int blockSize = cipher.defaultBlockSize();
    int keySize = cipher.defaultKeySize();

    byte[] pt = new byte[blockSize];
    byte[] ct1 = new byte[blockSize];
    byte[] ct2 = new byte[blockSize];
    byte[] kb = new byte[keySize];
    HashMap attributes = new HashMap();
    attributes.put(IBlockCipher.KEY_MATERIAL, kb);

    cipher.reset();
    cipher.init(attributes);

    cipher.encryptBlock(pt, 0, pt, 0);
    IBlockCipher thomas = (IBlockCipher) cipher.clone();
    thomas.init(attributes);
    cipher.encryptBlock(pt, 0, ct1, 0);
    thomas.encryptBlock(pt, 0, ct2, 0);

    return Arrays.equals(ct1, ct2);
  }
 private static void set3(IBlockCipher cipher, int keySize) throws InvalidKeyException {
   String s;
   int kl = keySize / 8;
   int bl = cipher.defaultBlockSize();
   byte[] k = new byte[kl];
   byte[] p = new byte[bl];
   byte[] c = new byte[bl];
   byte[] d = new byte[bl];
   int j;
   System.out.println("Test vectors -- set 3");
   System.out.println("=====================");
   System.out.println();
   cipher.reset();
   HashMap map = new HashMap();
   for (int i = 0; i < 256; i++) {
     s = "   " + String.valueOf(i);
     s = s.substring(s.length() - 3);
     System.out.println("Set 3, vector#" + s + ":");
     for (j = 0; j < bl; j++) {
       k[j] = (byte) i;
       p[j] = (byte) i;
     }
     for (; j < kl; j++) {
       k[j] = (byte) i;
     }
     map.put(IBlockCipher.KEY_MATERIAL, k);
     cipher.init(map);
     System.out.println("                      key=" + Util.toString(k));
     System.out.println("                    plain=" + Util.toString(p));
     cipher.encryptBlock(p, 0, c, 0);
     System.out.println("                   cipher=" + Util.toString(c));
     cipher.decryptBlock(c, 0, d, 0);
     System.out.println("                decrypted=" + Util.toString(d));
     if (!Arrays.equals(p, d)) {
       throw new RuntimeException("Symmetric operation failure...");
     }
     for (j = 1; j < 100; j++) {
       cipher.encryptBlock(c, 0, c, 0);
     }
     System.out.println("       Iterated 100 times=" + Util.toString(c));
     for (j = 100; j < 1000; j++) {
       cipher.encryptBlock(c, 0, c, 0);
     }
     System.out.println("      Iterated 1000 times=" + Util.toString(c));
     System.out.println();
     cipher.reset();
   }
 }