package java.security.spec; import java.math.BigInteger; /** * This class specifies an RSA multi-prime private key, as defined in * the PKCS#1 v2.1, using the Chinese Remainder Theorem (CRT) information * values for efficiency. * * @since 1.4 * @see Key, KeyFactory, KeySpec, PKCS8EncodedKeySpec, RSAPrivateKeySpec, * RSAPublicKeySpec, RSAOtherPrimeInfo */ public class RSAMultiPrimePrivateCrtKeySpec extends RSAPrivateKeySpec { private BigInteger publicExponent; private BigInteger privateExponent; private BigInteger primeP; private BigInteger primeQ; private BigInteger primeExponentP; private BigInteger primeExponentQ; private BigInteger crtCoefficient; private RSAOtherPrimeInfo[] otherPrimeInfo; /** * Creates a new RSAMultiPrimePrivateCrtKeySpec given the modulus, * publicExponent, privateExponent, primeP, primeQ, primeExponentP, * primeExponentQ, crtCoefficient, and otherPrimeInfo as defined in * PKCS#1 v2.1. * * Note that otherPrimeInfo is cloned when constructing this object. * * @param modulus - the modulus n. * @param publicExponent - the public exponent e. * @param privateExponent - the private exponent d. * @param primeP - the prime factor p of n. * @param primeQ - the prime factor q of n. * @param primeExponentP - this is d mod (p-1). * @param primeExponentQ - this is d mod (q-1). * @param crtCoefficient - the Chinese Remainder Theorem coefficient q-1 * mod p. * @param otherPrimeInfo - triplets of the rest of primes, null can be * specified if there are only two prime factors (p and q). * @throws NullPointerException - if any of the parameters, i.e. modulus, * publicExponent, privateExponent, primeP, primeQ, primeExponentP, * primeExponentQ, crtCoefficient, is null. * @throws IllegalArgumentException - if an empty, i.e. 0-length, * otherPrimeInfo is specified. */ public RSAMultiPrimePrivateCrtKeySpec( BigInteger modulus, BigInteger publicExponent, BigInteger privateExponent, BigInteger primeP, BigInteger primeQ, BigInteger primeExponentP, BigInteger primeExponentQ, BigInteger crtCoefficient, RSAOtherPrimeInfo[] otherPrimeInfo) { super(modulus, privateExponent); if ( publicExponent == null || primeP == null || primeQ == null || primeExponentP == null || primeExponentQ == null || crtCoefficient == null ) { throw new NullPointerException("Invalid null argument"); } if ( otherPrimeInfo != null ) { if ( otherPrimeInfo.length == 0 ) { throw new IllegalArgumentException("Invalid length for otherPrimeInfo"); } this.otherPrimeInfo = (RSAOtherPrimeInfo[])otherPrimeInfo.clone(); } } /** * Returns the public exponent. * * @returns the public exponent. */ public BigInteger getPublicExponent() { return publicExponent; } /** * Returns the primeP. * * @returns the primeP. */ public BigInteger getPrimeP() { return primeP; } /** * Returns the primeQ. * * @returns the primeQ. */ public BigInteger getPrimeQ() { return primeQ; } /** * Returns the primeExponentP. * * @returns the primeExponentP. */ public BigInteger getPrimeExponentP() { return primeExponentP; } /** * Returns the primeExponentQ. * * @returns the primeExponentQ. */ public BigInteger getPrimeExponentQ() { return primeExponentQ; } /** * Returns the crtCofficient. * * @returns the crtCofficient. */ public BigInteger getCrtCoefficient() { return crtCoefficient; } /** * Returns a copy of the otherPrimeInfo or null if there are only * two prime factors (p and q). * * @returns the otherPrimeInfo. */ public RSAOtherPrimeInfo[] getOtherPrimeInfo() { if ( otherPrimeInfo != null ) { return (RSAOtherPrimeInfo[])otherPrimeInfo.clone(); } return null; } }