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");
}
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");
}
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);
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");
}
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());
}
}