package org.ripple.bouncycastle.jcajce.provider.asymmetric.ec;
import java.io.IOException;
import java.security.spec.AlgorithmParameterSpec;
import java.security.spec.ECGenParameterSpec;
import java.security.spec.ECParameterSpec;
import java.security.spec.InvalidParameterSpecException;
import org.ripple.bouncycastle.asn1.DERNull;
import org.ripple.bouncycastle.asn1.x9.ECNamedCurveTable;
import org.ripple.bouncycastle.asn1.x9.X962Parameters;
import org.ripple.bouncycastle.asn1.x9.X9ECParameters;
import org.ripple.bouncycastle.jcajce.provider.asymmetric.util.EC5Util;
import org.ripple.bouncycastle.jce.provider.BouncyCastleProvider;
import org.ripple.bouncycastle.math.ec.ECCurve;
public class AlgorithmParametersSpi
extends java.security.AlgorithmParametersSpi
{
private ECParameterSpec ecParameterSpec;
private String curveName;
protected boolean isASN1FormatString(String format)
{
return format == null || format.equals("ASN.1");
}
@Override
protected void engineInit(AlgorithmParameterSpec algorithmParameterSpec)
throws InvalidParameterSpecException
{
if (algorithmParameterSpec instanceof ECGenParameterSpec)
{
ECGenParameterSpec ecGenParameterSpec = (ECGenParameterSpec)algorithmParameterSpec;
X9ECParameters params = ECNamedCurveTable.getByName(ecGenParameterSpec.getName());
curveName = ecGenParameterSpec.getName();
ecParameterSpec = EC5Util.convertToSpec(params);
}
}
@Override
protected void engineInit(byte[] bytes)
throws IOException
{
engineInit(bytes, "ASN.1");
}
@Override
protected void engineInit(byte[] bytes, String format)
throws IOException
{
if (isASN1FormatString(format))
{
X962Parameters params = X962Parameters.getInstance(bytes);
ECCurve curve = EC5Util.getCurve(BouncyCastleProvider.CONFIGURATION, params);
ecParameterSpec = EC5Util.convertToSpec(params, curve);
}
else
{
throw new IOException("Unknown encoded parameters format in AlgorithmParameters object: " + format);
}
}
@Override
protected <T extends AlgorithmParameterSpec> T engineGetParameterSpec(Class<T> paramSpec)
throws InvalidParameterSpecException
{
if (ECParameterSpec.class.isAssignableFrom(paramSpec))
{
return (T)ecParameterSpec;
}
else if (ECGenParameterSpec.class.isAssignableFrom(paramSpec) && curveName != null)
{
return (T)new ECGenParameterSpec(curveName);
}
throw new InvalidParameterSpecException("EC AlgorithmParameters cannot convert to " + paramSpec.getName());
}
@Override
protected byte[] engineGetEncoded()
throws IOException
{
return engineGetEncoded("ASN.1");
}
@Override
protected byte[] engineGetEncoded(String format)
throws IOException
{
if (isASN1FormatString(format))
{
X962Parameters params;
if (ecParameterSpec == null) // implicitly CA
{
params = new X962Parameters(DERNull.INSTANCE);
}
else
{
org.ripple.bouncycastle.jce.spec.ECParameterSpec ecSpec = EC5Util.convertSpec(ecParameterSpec, false);
X9ECParameters ecP = new X9ECParameters(
ecSpec.getCurve(),
ecSpec.getG(),
ecSpec.getN(),
ecSpec.getH(),
ecSpec.getSeed());
params = new X962Parameters(ecP);
}
return params.getEncoded();
}
throw new IOException("Unknown parameters format in AlgorithmParameters object: " + format);
}
@Override
protected String engineToString()
{
return "EC AlgorithmParameters ";
}
}