blob: 60c071f9a29006492384d7f50d693262d27ec43b [file] [log] [blame]
package org.bouncycastle.jce.provider.test;
import java.math.BigInteger;
import java.security.AlgorithmParameters;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.SecureRandom;
import java.security.Security;
import javax.crypto.Cipher;
import javax.crypto.spec.DHParameterSpec;
import org.bouncycastle.asn1.x9.ECNamedCurveTable;
import org.bouncycastle.asn1.x9.X9ECParameters;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.jce.spec.ECParameterSpec;
import org.bouncycastle.jce.spec.IEKeySpec;
import org.bouncycastle.jce.spec.IESParameterSpec;
import org.bouncycastle.util.encoders.Hex;
import org.bouncycastle.util.test.SimpleTest;
/**
* test for ECIES - Elliptic Curve Integrated Encryption Scheme
*/
public class IESTest
extends SimpleTest
{
private BigInteger g512 = new BigInteger("153d5d6172adb43045b68ae8e1de1070b6137005686d29d3d73a7749199681ee5b212c9b96bfdcfa5b20cd5e3fd2044895d609cf9b410b7a0f12ca1cb9a428cc", 16);
private BigInteger p512 = new BigInteger("9494fec095f3b85ee286542b3836fc81a5dd0a0349b4c239dd38744d488cf8e31db8bcb7d33b41abb9e5a33cca9144b1cef332c94bf0573bf047a3aca98cdf3b", 16);
IESTest()
{
}
public String getName()
{
return "IES";
}
public void performTest()
throws Exception
{
KeyPairGenerator g = KeyPairGenerator.getInstance("ECIES", "BC");
X9ECParameters x9 = ECNamedCurveTable.getByName("prime239v1");
ECParameterSpec ecSpec = new ECParameterSpec(x9.getCurve(), x9.getG(),x9.getN(), x9.getH());
g.initialize(ecSpec, new SecureRandom());
Cipher c1 = Cipher.getInstance("ECIES", "BC");
Cipher c2 = Cipher.getInstance("ECIES", "BC");
doTest(g, c1, c2);
g = KeyPairGenerator.getInstance("ECIES", "BC");
g.initialize(192, new SecureRandom());
doTest(g, c1, c2);
g = KeyPairGenerator.getInstance("ECIES", "BC");
g.initialize(239, new SecureRandom());
doTest(g, c1, c2);
g = KeyPairGenerator.getInstance("ECIES", "BC");
g.initialize(256, new SecureRandom());
doTest(g, c1, c2);
doDefTest(g, c1, c2);
DHParameterSpec dhParams = new DHParameterSpec(p512, g512);
c1 = Cipher.getInstance("IES", "BC");
c2 = Cipher.getInstance("IES", "BC");
g = KeyPairGenerator.getInstance("DH", "BC");
g.initialize(dhParams);
doTest(g, c1, c2);
doDefTest(g, c1, c2);
}
public void doTest(
KeyPairGenerator g,
Cipher c1,
Cipher c2)
throws Exception
{
//
// a side
//
KeyPair aKeyPair = g.generateKeyPair();
PublicKey aPub = aKeyPair.getPublic();
PrivateKey aPriv = aKeyPair.getPrivate();
//
// b side
//
KeyPair bKeyPair = g.generateKeyPair();
PublicKey bPub = bKeyPair.getPublic();
PrivateKey bPriv = bKeyPair.getPrivate();
//
// stream test
//
IEKeySpec c1Key = new IEKeySpec(aPriv, bPub);
IEKeySpec c2Key = new IEKeySpec(bPriv, aPub);
byte[] d = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };
byte[] e = new byte[] { 8, 7, 6, 5, 4, 3, 2, 1 };
IESParameterSpec param = new IESParameterSpec(d, e, 128);
c1.init(Cipher.ENCRYPT_MODE, c1Key, param);
c2.init(Cipher.DECRYPT_MODE, c2Key, param);
byte[] message = Hex.decode("1234567890abcdef");
int estLen1 = c1.getOutputSize(message.length);
byte[] out1 = c1.doFinal(message, 0, message.length);
if (estLen1 < out1.length)
{
fail("output size incorrect");
}
int estLen2 = c2.getOutputSize(out1.length);
byte[] out2 = c2.doFinal(out1, 0, out1.length);
if (estLen2 < out2.length)
{
fail("output size incorrect");
}
if (!areEqual(out2, message))
{
fail("stream cipher test failed");
}
}
public void doDefTest(
KeyPairGenerator g,
Cipher c1,
Cipher c2)
throws Exception
{
//
// a side
//
KeyPair aKeyPair = g.generateKeyPair();
PublicKey aPub = aKeyPair.getPublic();
PrivateKey aPriv = aKeyPair.getPrivate();
//
// b side
//
KeyPair bKeyPair = g.generateKeyPair();
PublicKey bPub = bKeyPair.getPublic();
PrivateKey bPriv = bKeyPair.getPrivate();
//
// stream test
//
IEKeySpec c1Key = new IEKeySpec(aPriv, bPub);
IEKeySpec c2Key = new IEKeySpec(bPriv, aPub);
c1.init(Cipher.ENCRYPT_MODE, c1Key);
AlgorithmParameters param = c1.getParameters();
c2.init(Cipher.DECRYPT_MODE, c2Key, param);
byte[] message = Hex.decode("1234567890abcdef");
int estLen1 = c1.getOutputSize(message.length);
byte[] out1 = c1.doFinal(message, 0, message.length);
if (estLen1 < out1.length)
{
fail("output size incorrect");
}
int estLen2 = c2.getOutputSize(out1.length);
byte[] out2 = c2.doFinal(out1, 0, out1.length);
if (estLen2 < out2.length)
{
fail("output size incorrect");
}
if (!areEqual(out2, message))
{
fail("stream cipher test failed");
}
//
// int doFinal
//
int len1 = c1.doFinal(message, 0, message.length, out1, 0);
if (len1 != out1.length)
{
fail("encryption length wrong");
}
int len2 = c2.doFinal(out1, 0, out1.length, out2, 0);
if (len2 != out2.length)
{
fail("decryption length wrong");
}
if (!areEqual(out2, message))
{
fail("stream cipher test failed");
}
//
// int doFinal with update
//
len1 = c1.update(message, 0, 2, out1, 0);
len1 += c1.doFinal(message, 2, message.length - 2, out1, len1);
if (len1 != out1.length)
{
fail("update encryption length wrong");
}
len2 = c2.update(out1, 0, 2, out2, 0);
len2 += c2.doFinal(out1, 2, out1.length - 2, out2, len2);
if (len2 != out2.length)
{
fail("update decryption length wrong");
}
if (!areEqual(out2, message))
{
fail("update stream cipher test failed");
}
}
public static void main(
String[] args)
{
Security.addProvider(new BouncyCastleProvider());
runTest(new IESTest());
}
}