package org.bouncycastle.asn1.test; import java.math.BigInteger; import org.bouncycastle.asn1.ASN1OctetString; import org.bouncycastle.asn1.ASN1Primitive; import org.bouncycastle.asn1.DEROctetString; import org.bouncycastle.asn1.pkcs.PrivateKeyInfo; import org.bouncycastle.asn1.sec.ECPrivateKey; import org.bouncycastle.asn1.x509.AlgorithmIdentifier; import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo; import org.bouncycastle.asn1.x9.X962NamedCurves; import org.bouncycastle.asn1.x9.X962Parameters; import org.bouncycastle.asn1.x9.X9ECParameters; import org.bouncycastle.asn1.x9.X9ECPoint; import org.bouncycastle.asn1.x9.X9IntegerConverter; import org.bouncycastle.asn1.x9.X9ObjectIdentifiers; import org.bouncycastle.math.ec.ECPoint; import org.bouncycastle.util.Arrays; import org.bouncycastle.util.encoders.Base64; import org.bouncycastle.util.test.SimpleTest; public class X9Test extends SimpleTest { private byte[] namedPub = Base64.decode("MDcwEwYHKoZIzj0CAQYIKoZIzj0DAQEDIAADG5xRI+Iki/JrvL20hoDUa7Cggzorv5B9yyqSMjYu"); private byte[] expPub = Base64.decode( "MIH8MIHXBgcqhkjOPQIBMIHLAgEBMCkGByqGSM49AQECHn///////////////3///////4AAAA" + "AAAH///////zBXBB5///////////////9///////+AAAAAAAB///////wEHiVXBfoqMGZUsfTL" + "A9anUKMMJQEC1JiHF9m6FattPgMVAH1zdBaP/jRxtgqFdoahlHXTv6L/BB8DZ2iujhi7ks/PAF" + "yUmqLG2UhT0OZgu/hUsclQX+laAh5///////////////9///+XXetBs6YFfDxDIUZSZVECAQED" + "IAADG5xRI+Iki/JrvL20hoDUa7Cggzorv5B9yyqSMjYu"); private byte[] namedPriv = Base64.decode("MDkCAQAwEwYHKoZIzj0CAQYIKoZIzj0DAQEEHzAdAgEBBB" + "gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAo="); private byte[] expPriv = Base64.decode( "MIIBBAIBADCB1wYHKoZIzj0CATCBywIBATApBgcqhkjOPQEBAh5///////////////9///////" + "+AAAAAAAB///////8wVwQef///////////////f///////gAAAAAAAf//////8BB4lVwX6KjBmVL" + "H0ywPWp1CjDCUBAtSYhxfZuhWrbT4DFQB9c3QWj/40cbYKhXaGoZR107+i/wQfA2doro4Yu5LPzw" + "BclJqixtlIU9DmYLv4VLHJUF/pWgIef///////////////f///l13rQbOmBXw8QyFGUmVRAgEBBC" + "UwIwIBAQQeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAU"); private void encodePublicKey() throws Exception { X9ECParameters ecP = X962NamedCurves.getByOID(X9ObjectIdentifiers.prime239v3); X9IntegerConverter conv = new X9IntegerConverter(); if (conv.getByteLength(ecP.getCurve()) != 30) { fail("wrong byte length reported for curve"); } if (ecP.getCurve().getFieldSize() != 239) { fail("wrong field size reported for curve"); } // // named curve // X962Parameters params = new X962Parameters(X9ObjectIdentifiers.prime192v1); ECPoint point = ecP.getG().multiply(BigInteger.valueOf(100)); ASN1OctetString p = new DEROctetString(point.getEncoded(true)); SubjectPublicKeyInfo info = new SubjectPublicKeyInfo(new AlgorithmIdentifier(X9ObjectIdentifiers.id_ecPublicKey, params), p.getOctets()); if (!areEqual(info.getEncoded(), namedPub)) { fail("failed public named generation"); } X9ECPoint x9P = new X9ECPoint(ecP.getCurve(), p); if (!Arrays.areEqual(p.getOctets(), x9P.getPoint().getEncoded())) { fail("point encoding not preserved"); } ASN1Primitive o = ASN1Primitive.fromByteArray(namedPub); if (!info.equals(o)) { fail("failed public named equality"); } // // explicit curve parameters // params = new X962Parameters(ecP); info = new SubjectPublicKeyInfo(new AlgorithmIdentifier(X9ObjectIdentifiers.id_ecPublicKey, params), p.getOctets()); if (!areEqual(info.getEncoded(), expPub)) { fail("failed public explicit generation"); } o = ASN1Primitive.fromByteArray(expPub); if (!info.equals(o)) { fail("failed public explicit equality"); } } private void encodePrivateKey() throws Exception { X9ECParameters ecP = X962NamedCurves.getByOID(X9ObjectIdentifiers.prime192v1); // // named curve // X962Parameters params = new X962Parameters(X9ObjectIdentifiers.prime192v1); PrivateKeyInfo info = new PrivateKeyInfo(new AlgorithmIdentifier(X9ObjectIdentifiers.id_ecPublicKey, params), new ECPrivateKey(ecP.getN().bitLength(), BigInteger.valueOf(10))); if (!areEqual(info.getEncoded(), namedPriv)) { fail("failed private named generation"); } ASN1Primitive o = ASN1Primitive.fromByteArray(namedPriv); if (!info.equals(o)) { fail("failed private named equality"); } // // explicit curve parameters // ecP = X962NamedCurves.getByOID(X9ObjectIdentifiers.prime239v3); params = new X962Parameters(ecP); info = new PrivateKeyInfo(new AlgorithmIdentifier(X9ObjectIdentifiers.id_ecPublicKey, params), new ECPrivateKey(ecP.getN().bitLength(), BigInteger.valueOf(20))); if (!areEqual(info.getEncoded(), expPriv)) { fail("failed private explicit generation"); } o = ASN1Primitive.fromByteArray(expPriv); if (!info.equals(o)) { fail("failed private explicit equality"); } } public void performTest() throws Exception { encodePublicKey(); encodePrivateKey(); } public String getName() { return "X9"; } public static void main( String[] args) { runTest(new X9Test()); } }