/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package java.security.spec; import java.math.BigInteger; /** * The key specification of a RSA multi-prime private key with the Chinese * Remainder Theorem (CRT) information values used. * <p> * Defined in the <a * href="http://www.rsa.com/rsalabs/pubs/PKCS/html/pkcs-1.html">PKCS #1 v2.1</a> * standard. */ public class RSAMultiPrimePrivateCrtKeySpec extends RSAPrivateKeySpec { // Public Exponent private final BigInteger publicExponent; // Prime P private final BigInteger primeP; // Prime Q private final BigInteger primeQ; // Prime Exponent P private final BigInteger primeExponentP; // Prime Exponent Q private final BigInteger primeExponentQ; // CRT Coefficient private final BigInteger crtCoefficient; // Other Prime Info private final RSAOtherPrimeInfo[] otherPrimeInfo; /** * Creates a new {@code RSAMultiPrimePrivateCrtKeySpec} with the specified * modulus, public exponent, private exponent, prime factors, prime * exponents, crt coefficient, and additional primes. * * @param modulus * the modulus {@code n}. * @param publicExponent * the public exponent {@code e}. * @param privateExponent * the private exponent {@code d}. * @param primeP * the prime factor {@code p} of {@code n}. * @param primeQ * the prime factor {@code q} of {@code n}. * @param primeExponentP * the exponent of the prime {@code p}. * @param primeExponentQ * the exponent of the prime {@code q}. * @param crtCoefficient * the CRT coefficient {@code q^-1 mod p}. * @param otherPrimeInfo * the information for the additional primes or {@code null} if * there are only the two primes ({@code p, q}). * @throws IllegalArgumentException * if {@code otherPrimeInfo} is not null but empty. */ public RSAMultiPrimePrivateCrtKeySpec( BigInteger modulus, BigInteger publicExponent, BigInteger privateExponent, BigInteger primeP, BigInteger primeQ, BigInteger primeExponentP, BigInteger primeExponentQ, BigInteger crtCoefficient, RSAOtherPrimeInfo[] otherPrimeInfo) { super(modulus, privateExponent); // Perform checks specified if (modulus == null) { throw new NullPointerException("modulus == null"); } if (privateExponent == null) { throw new NullPointerException("privateExponent == null"); } if (publicExponent == null) { throw new NullPointerException("publicExponent == null"); } if (primeP == null) { throw new NullPointerException("primeP == null"); } if (primeQ == null) { throw new NullPointerException("primeQ == null"); } if (primeExponentP == null) { throw new NullPointerException("primeExponentP == null"); } if (primeExponentQ == null) { throw new NullPointerException("primeExponentQ == null"); } if (crtCoefficient == null) { throw new NullPointerException("crtCoefficient == null"); } if (otherPrimeInfo != null) { if (otherPrimeInfo.length == 0) { throw new IllegalArgumentException("otherPrimeInfo.length == 0"); } // Clone array to prevent subsequent modification this.otherPrimeInfo = new RSAOtherPrimeInfo[otherPrimeInfo.length]; System.arraycopy(otherPrimeInfo, 0, this.otherPrimeInfo, 0, this.otherPrimeInfo.length); } else { this.otherPrimeInfo = null; } this.publicExponent = publicExponent; this.primeP = primeP; this.primeQ = primeQ; this.primeExponentP = primeExponentP; this.primeExponentQ = primeExponentQ; this.crtCoefficient = crtCoefficient; } /** * Returns the CRT coefficient, {@code q^-1 mod p}. * * @return the CRT coefficient, {@code q^-1 mod p}. */ public BigInteger getCrtCoefficient() { return crtCoefficient; } /** * Returns the information for the additional primes. * * @return the information for the additional primes, or {@code null} if * there are only the two primes ({@code p, q}). */ public RSAOtherPrimeInfo[] getOtherPrimeInfo() { // Clone array (if not null) to prevent subsequent modification if (otherPrimeInfo == null) { return null; } else { RSAOtherPrimeInfo[] ret = new RSAOtherPrimeInfo[otherPrimeInfo.length]; System.arraycopy(otherPrimeInfo, 0, ret, 0, ret.length); return ret; } } /** * Returns the exponent of the prime {@code p}. * * @return the exponent of the prime {@code p}. */ public BigInteger getPrimeExponentP() { return primeExponentP; } /** * Returns the exponent of the prime {@code q}. * * @return the exponent of the prime {@code q}. */ public BigInteger getPrimeExponentQ() { return primeExponentQ; } /** * Returns the prime factor {@code p}. * * @return the prime factor {@code p}. */ public BigInteger getPrimeP() { return primeP; } /** * Returns the prime factor {@code q}. * * @return the prime factor {@code q}. */ public BigInteger getPrimeQ() { return primeQ; } /** * Returns the public exponent {@code e}. * * @return the public exponent {@code e}. */ public BigInteger getPublicExponent() { return publicExponent; } }