package org.spongycastle.openpgp;
import java.security.PrivateKey;
import java.security.interfaces.DSAPrivateKey;
import java.security.interfaces.RSAPrivateCrtKey;
import org.spongycastle.bcpg.BCPGKey;
import org.spongycastle.bcpg.DSASecretBCPGKey;
import org.spongycastle.bcpg.ElGamalSecretBCPGKey;
import org.spongycastle.bcpg.PublicKeyPacket;
import org.spongycastle.bcpg.RSASecretBCPGKey;
import org.spongycastle.jce.interfaces.ElGamalPrivateKey;
import org.spongycastle.openpgp.operator.jcajce.JcaPGPKeyConverter;
/**
* general class to contain a private key for use with other openPGP
* objects.
*/
public class PGPPrivateKey
{
private long keyID;
private PrivateKey privateKey;
private PublicKeyPacket publicKeyPacket;
private BCPGKey privateKeyDataPacket;
/**
* Create a PGPPrivateKey from a regular private key and the keyID of its associated
* public key.
*
* @param privateKey private key tu use.
* @param keyID keyID of the corresponding public key.
*/
public PGPPrivateKey(
PrivateKey privateKey,
long keyID)
{
this.privateKey = privateKey;
this.keyID = keyID;
if (privateKey instanceof RSAPrivateCrtKey)
{
RSAPrivateCrtKey rsK = (RSAPrivateCrtKey)privateKey;
privateKeyDataPacket = new RSASecretBCPGKey(rsK.getPrivateExponent(), rsK.getPrimeP(), rsK.getPrimeQ());
}
else if (privateKey instanceof DSAPrivateKey)
{
DSAPrivateKey dsK = (DSAPrivateKey)privateKey;
privateKeyDataPacket = new DSASecretBCPGKey(dsK.getX());
}
else if (privateKey instanceof ElGamalPrivateKey)
{
ElGamalPrivateKey esK = (ElGamalPrivateKey)privateKey;
privateKeyDataPacket = new ElGamalSecretBCPGKey(esK.getX());
}
else
{
throw new IllegalArgumentException("unknown key class");
}
}
public PGPPrivateKey(
long keyID,
PublicKeyPacket publicKeyPacket,
BCPGKey privateKeyDataPacket)
{
this.keyID = keyID;
this.publicKeyPacket = publicKeyPacket;
this.privateKeyDataPacket = privateKeyDataPacket;
}
/**
* Return the keyID associated with the contained private key.
*
* @return long
*/
public long getKeyID()
{
return keyID;
}
/**
* Return the contained private key.
*
* @return PrivateKey
* @deprecated use a JcaPGPKeyConverter
*/
public PrivateKey getKey()
{
if (privateKey != null)
{
return privateKey;
}
try
{
return new JcaPGPKeyConverter().setProvider(PGPUtil.getDefaultProvider()).getPrivateKey(this);
}
catch (PGPException e)
{
throw new IllegalStateException("unable to convert key: " + e.toString());
}
}
public PublicKeyPacket getPublicKeyPacket()
{
return publicKeyPacket;
}
public BCPGKey getPrivateKeyDataPacket()
{
return privateKeyDataPacket;
}
}