diff options
Diffstat (limited to 'libraries/spongycastle/prov/src/test/jdk1.4/org/spongycastle/jce/provider/test/ECIESTest.java')
-rw-r--r-- | libraries/spongycastle/prov/src/test/jdk1.4/org/spongycastle/jce/provider/test/ECIESTest.java | 248 |
1 files changed, 248 insertions, 0 deletions
diff --git a/libraries/spongycastle/prov/src/test/jdk1.4/org/spongycastle/jce/provider/test/ECIESTest.java b/libraries/spongycastle/prov/src/test/jdk1.4/org/spongycastle/jce/provider/test/ECIESTest.java new file mode 100644 index 000000000..25af8f54a --- /dev/null +++ b/libraries/spongycastle/prov/src/test/jdk1.4/org/spongycastle/jce/provider/test/ECIESTest.java @@ -0,0 +1,248 @@ +package org.spongycastle.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 org.spongycastle.jce.provider.BouncyCastleProvider; +import org.spongycastle.jce.spec.ECParameterSpec; +import org.spongycastle.jce.spec.IEKeySpec; +import org.spongycastle.jce.spec.IESParameterSpec; +import org.spongycastle.math.ec.ECCurve; +import org.spongycastle.util.encoders.Hex; +import org.spongycastle.util.test.SimpleTestResult; +import org.spongycastle.util.test.Test; +import org.spongycastle.util.test.TestResult; + +/** + * test for ECIES - Elliptic Curve Integrated Encryption Scheme + */ +public class ECIESTest + implements Test +{ + ECIESTest() + { + } + + public String getName() + { + return "ECIES"; + } + + private boolean sameAs( + byte[] a, + byte[] b) + { + if (a.length != b.length) + { + return false; + } + + for (int i = 0; i != a.length; i++) + { + if (a[i] != b[i]) + { + return false; + } + } + + return true; + } + + public TestResult perform() + { + TestResult res; + + try + { + KeyPairGenerator g = KeyPairGenerator.getInstance("ECIES", "SC"); + + ECCurve curve = new ECCurve.Fp( + new BigInteger("883423532389192164791648750360308885314476597252960362792450860609699839"), // q + new BigInteger("7fffffffffffffffffffffff7fffffffffff8000000000007ffffffffffc", 16), // a + new BigInteger("6b016c3bdcf18941d0d654921475ca71a9db2fb27d1d37796185c2942c0a", 16)); // b + + ECParameterSpec ecSpec = new ECParameterSpec( + curve, + curve.decodePoint(Hex.decode("020ffa963cdca8816ccc33b8642bedf905c3d358573d3f27fbbd3b3cb9aaaf")), // G + new BigInteger("883423532389192164791648750360308884807550341691627752275345424702807307")); // n + + g.initialize(ecSpec, new SecureRandom()); + + res = performTest(g); + if (!res.isSuccessful()) + { + return res; + } + + g = KeyPairGenerator.getInstance("ECIES", "SC"); + + g.initialize(192, new SecureRandom()); + + res = performTest(g); + if (!res.isSuccessful()) + { + return res; + } + + g = KeyPairGenerator.getInstance("ECIES", "SC"); + + g.initialize(239, new SecureRandom()); + + res = performTest(g); + if (!res.isSuccessful()) + { + return res; + } + + g = KeyPairGenerator.getInstance("ECIES", "SC"); + + g.initialize(256, new SecureRandom()); + + res = performTest(g); + if (!res.isSuccessful()) + { + return res; + } + + res = performDefTest(g); + if (!res.isSuccessful()) + { + return res; + } + } + catch (Exception ex) + { + return new SimpleTestResult(false, this.getName() + ": stream cipher test exception " + ex.toString()); + } + + return new SimpleTestResult(true, this.getName() + ": Okay"); + } + + public TestResult performTest( + KeyPairGenerator g) + { + try + { + // + // 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 + // + Cipher c1 = Cipher.getInstance("ECIES", "SC"); + Cipher c2 = Cipher.getInstance("ECIES", "SC"); + + 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"); + + byte[] out1 = c1.doFinal(message, 0, message.length); + + byte[] out2 = c2.doFinal(out1, 0, out1.length); + + if (!sameAs(out2, message)) + { + return new SimpleTestResult(false, this.getName() + ": stream cipher test failed"); + } + } + catch (Exception ex) + { + return new SimpleTestResult(false, this.getName() + ": stream cipher test exception " + ex.toString()); + } + + return new SimpleTestResult(true, this.getName() + ": Okay"); + } + + public TestResult performDefTest( + KeyPairGenerator g) + { + try + { + // + // 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 + // + Cipher c1 = Cipher.getInstance("ECIES", "SC"); + Cipher c2 = Cipher.getInstance("ECIES", "SC"); + + 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"); + + byte[] out1 = c1.doFinal(message, 0, message.length); + + byte[] out2 = c2.doFinal(out1, 0, out1.length); + + if (!sameAs(out2, message)) + { + return new SimpleTestResult(false, this.getName() + ": stream cipher test failed"); + } + } + catch (Exception ex) + { + return new SimpleTestResult(false, this.getName() + ": stream cipher test exception " + ex.toString()); + } + + return new SimpleTestResult(true, this.getName() + ": Okay"); + } + + public static void main( + String[] args) + { + Security.addProvider(new BouncyCastleProvider()); + + ECIESTest test = new ECIESTest(); + TestResult result = test.perform(); + + System.out.println(result); + } +} |