org.bouncycastle.bcpg.RSASecretBCPGKey.java Source code

Java tutorial

Introduction

Here is the source code for org.bouncycastle.bcpg.RSASecretBCPGKey.java

Source

package org.bouncycastle.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.bouncycastle.bcpg.BCPGKey#getFormat()
     */
    public String getFormat() {
        return "PGP";
    }

    /**
     * return the standard PGP encoding of the key.
     * 
     * @see org.bouncycastle.bcpg.BCPGKey#getEncoded()
     */
    public byte[] getEncoded() {
        try {
            return super.getEncoded();
        } catch (IOException e) {
            return null;
        }
    }

    public void encode(BCPGOutputStream out) throws IOException {
        out.writeObject(d);
        out.writeObject(p);
        out.writeObject(q);
        out.writeObject(u);
    }
}