package com.sun.midp.crypto;
import gnu.testlet.TestHarness;
import gnu.testlet.Testlet;
public class TestDES implements Testlet {
public int getExpectedPass() { return 20; }
public int getExpectedFail() { return 0; }
public int getExpectedKnownFail() { return 0; }
public static byte[] hexToBytes(String s) {
int len = s.length();
byte[] data = new byte[len / 2];
for (int i = 0; i < len; i += 2) {
data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
+ Character.digit(s.charAt(i+1), 16));
}
return data;
}
public void testDESECB(TestHarness th, String keyStr, String messageStr) throws NoSuchAlgorithmException,
InvalidKeyException,
ShortBufferException,
NoSuchPaddingException,
IllegalBlockSizeException,
BadPaddingException {
byte[] message = messageStr.getBytes();
byte[] key = keyStr.getBytes();
Cipher encodeCipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
encodeCipher.init(Cipher.ENCRYPT_MODE, new SecretKey(key, 0, key.length, "DES"));
byte[] encMessage = new byte[1024];
int encMessageLen = encodeCipher.doFinal(message, 0, message.length, encMessage, 0);
Cipher decodeCipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
decodeCipher.init(Cipher.DECRYPT_MODE, new SecretKey(key, 0, key.length, "DES"));
byte[] decMessage = new byte[1024];
int decMessageLen = decodeCipher.doFinal(encMessage, 0, encMessageLen, decMessage, 0);
th.check(message.length, decMessageLen);
for (int i = 0; i < decMessageLen; i++) {
th.check(decMessage[i], message[i]);
}
}
public void testDESCBC(TestHarness th, String keyStr, String messageStr) throws NoSuchAlgorithmException,
InvalidKeyException,
ShortBufferException,
NoSuchPaddingException,
IllegalBlockSizeException,
BadPaddingException,
InvalidAlgorithmParameterException {
byte[] message = messageStr.getBytes();
byte[] key = keyStr.getBytes();
byte[] iv = hexToBytes("8E12399C07726F5A");
IvParameter ivparam = new IvParameter(iv, 0, iv.length);
Cipher encodeCipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
encodeCipher.init(Cipher.ENCRYPT_MODE, new SecretKey(key, 0, key.length, "DES"), ivparam);
byte[] encMessage = new byte[1024];
int encMessageLen = encodeCipher.doFinal(message, 0, message.length, encMessage, 0);
Cipher decodeCipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
decodeCipher.init(Cipher.DECRYPT_MODE, new SecretKey(key, 0, key.length, "DES"), ivparam);
byte[] decMessage = new byte[1024];
int decMessageLen = decodeCipher.doFinal(encMessage, 0, encMessageLen, decMessage, 0);
th.check(message.length, decMessageLen);
for (int i = 0; i < decMessageLen; i++) {
th.check(decMessage[i], message[i]);
}
}
public void test(TestHarness th) {
try {
testDESECB(th, "eightkey", "Plaintext");
} catch (Exception e) {
th.fail("Unexpected exception: " + e);
e.printStackTrace();
}
try {
testDESCBC(th, "eightkey", "Plaintext");
} catch (Exception e) {
th.fail("Unexpected exception: " + e);
e.printStackTrace();
}
}
}