org.spongycastle.bcpg.RSASecretBCPGKey Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of scprov-jdk15 Show documentation
Show all versions of scprov-jdk15 Show documentation
Spongy Castle is a package-rename (org.bouncycastle.* to org.spongycastle.*) of Bouncy Castle intended for Android.
Android ships with a stripped-down version of Bouncy Castle - this causes classloader collisions if you try to add
an alternative (updated/complete) Bouncy Castle jar.
This jar contains JCE provider and lightweight API for the Bouncy Castle Cryptography APIs for JDK 1.5.
package org.spongycastle.bcpg;
import java.io.*;
import java.math.BigInteger;
/**
* base class for an RSA Secret (or Private) Key.
*/
public class RSASecretBCPGKey
extends BCPGObject implements BCPGKey
{
MPInteger d;
MPInteger p;
MPInteger q;
MPInteger u;
BigInteger expP, expQ, crt;
/**
*
* @param in
* @throws IOException
*/
public RSASecretBCPGKey(
BCPGInputStream in)
throws IOException
{
this.d = new MPInteger(in);
this.p = new MPInteger(in);
this.q = new MPInteger(in);
this.u = new MPInteger(in);
expP = d.getValue().remainder(p.getValue().subtract(BigInteger.valueOf(1)));
expQ = d.getValue().remainder(q.getValue().subtract(BigInteger.valueOf(1)));
crt = q.getValue().modInverse(p.getValue());
}
/**
*
* @param d
* @param p
* @param q
*/
public RSASecretBCPGKey(
BigInteger d,
BigInteger p,
BigInteger q)
{
//
// pgp requires (p < q)
//
int cmp = p.compareTo(q);
if (cmp >= 0)
{
if (cmp == 0)
{
throw new IllegalArgumentException("p and q cannot be equal");
}
BigInteger tmp = p;
p = q;
q = tmp;
}
this.d = new MPInteger(d);
this.p = new MPInteger(p);
this.q = new MPInteger(q);
this.u = new MPInteger(p.modInverse(q));
expP = d.remainder(p.subtract(BigInteger.valueOf(1)));
expQ = d.remainder(q.subtract(BigInteger.valueOf(1)));
crt = q.modInverse(p);
}
/**
* return the modulus for this key.
*
* @return BigInteger
*/
public BigInteger getModulus()
{
return p.getValue().multiply(q.getValue());
}
/**
* return the private exponent for this key.
*
* @return BigInteger
*/
public BigInteger getPrivateExponent()
{
return d.getValue();
}
/**
* return the prime P
*/
public BigInteger getPrimeP()
{
return p.getValue();
}
/**
* return the prime Q
*/
public BigInteger getPrimeQ()
{
return q.getValue();
}
/**
* return the prime exponent of p
*/
public BigInteger getPrimeExponentP()
{
return expP;
}
/**
* return the prime exponent of q
*/
public BigInteger getPrimeExponentQ()
{
return expQ;
}
/**
* return the crt coefficient
*/
public BigInteger getCrtCoefficient()
{
return crt;
}
/**
* return "PGP"
*
* @see org.spongycastle.bcpg.BCPGKey#getFormat()
*/
public String getFormat()
{
return "PGP";
}
/**
* return the standard PGP encoding of the key.
*
* @see org.spongycastle.bcpg.BCPGKey#getEncoded()
*/
public byte[] getEncoded()
{
try
{
ByteArrayOutputStream bOut = new ByteArrayOutputStream();
BCPGOutputStream pgpOut = new BCPGOutputStream(bOut);
pgpOut.writeObject(this);
return bOut.toByteArray();
}
catch (IOException e)
{
return null;
}
}
public void encode(
BCPGOutputStream out)
throws IOException
{
out.writeObject(d);
out.writeObject(p);
out.writeObject(q);
out.writeObject(u);
}
}