package org.bouncycastle.jce.provider;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.math.BigInteger;
import javax.crypto.interfaces.DHPublicKey;
import javax.crypto.spec.DHParameterSpec;
import javax.crypto.spec.DHPublicKeySpec;
import org.bouncycastle.asn1.ASN1Integer;
import org.bouncycastle.asn1.oiw.ElGamalParameter;
import org.bouncycastle.asn1.oiw.OIWObjectIdentifiers;
import org.bouncycastle.asn1.x509.AlgorithmIdentifier;
import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo;
import org.bouncycastle.crypto.params.ElGamalPublicKeyParameters;
import org.bouncycastle.jcajce.provider.asymmetric.util.KeyUtil;
import org.bouncycastle.jce.interfaces.ElGamalPublicKey;
import org.bouncycastle.jce.spec.ElGamalParameterSpec;
import org.bouncycastle.jce.spec.ElGamalPublicKeySpec;
public class JCEElGamalPublicKey
implements ElGamalPublicKey, DHPublicKey
{
static final long serialVersionUID = 8712728417091216948L;
private BigInteger y;
private ElGamalParameterSpec elSpec;
JCEElGamalPublicKey(
ElGamalPublicKeySpec spec)
{
this.y = spec.getY();
this.elSpec = new ElGamalParameterSpec(spec.getParams().getP(), spec.getParams().getG());
}
JCEElGamalPublicKey(
DHPublicKeySpec spec)
{
this.y = spec.getY();
this.elSpec = new ElGamalParameterSpec(spec.getP(), spec.getG());
}
JCEElGamalPublicKey(
ElGamalPublicKey key)
{
this.y = key.getY();
this.elSpec = key.getParameters();
}
JCEElGamalPublicKey(
DHPublicKey key)
{
this.y = key.getY();
this.elSpec = new ElGamalParameterSpec(key.getParams().getP(), key.getParams().getG());
}
JCEElGamalPublicKey(
ElGamalPublicKeyParameters params)
{
this.y = params.getY();
this.elSpec = new ElGamalParameterSpec(params.getParameters().getP(), params.getParameters().getG());
}
JCEElGamalPublicKey(
BigInteger y,
ElGamalParameterSpec elSpec)
{
this.y = y;
this.elSpec = elSpec;
}
JCEElGamalPublicKey(
SubjectPublicKeyInfo info)
{
ElGamalParameter params = ElGamalParameter.getInstance(info.getAlgorithm().getParameters());
ASN1Integer derY = null;
try
{
derY = (ASN1Integer)info.parsePublicKey();
}
catch (IOException e)
{
throw new IllegalArgumentException("invalid info structure in DSA public key");
}
this.y = derY.getValue();
this.elSpec = new ElGamalParameterSpec(params.getP(), params.getG());
}
public String getAlgorithm()
{
return "ElGamal";
}
public String getFormat()
{
return "X.509";
}
public byte[] getEncoded()
{
return KeyUtil.getEncodedSubjectPublicKeyInfo(new AlgorithmIdentifier(OIWObjectIdentifiers.elGamalAlgorithm, new ElGamalParameter(elSpec.getP(), elSpec.getG())), new ASN1Integer(y));
}
public ElGamalParameterSpec getParameters()
{
return elSpec;
}
public DHParameterSpec getParams()
{
return new DHParameterSpec(elSpec.getP(), elSpec.getG());
}
public BigInteger getY()
{
return y;
}
private void readObject(
ObjectInputStream in)
throws IOException, ClassNotFoundException
{
this.y = (BigInteger)in.readObject();
this.elSpec = new ElGamalParameterSpec((BigInteger)in.readObject(), (BigInteger)in.readObject());
}
private void writeObject(
ObjectOutputStream out)
throws IOException
{
out.writeObject(this.getY());
out.writeObject(elSpec.getP());
out.writeObject(elSpec.getG());
}
}