1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195
/* * @(#)RSAMultiPrimePrivateCrtKeySpec.java 1.9 05/11/17 * * Copyright 2006 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */ 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. * * @author Valerie Peng * * @version 1.9 05/11/17 * * @see java.security.Key * @see java.security.KeyFactory * @see KeySpec * @see PKCS8EncodedKeySpec * @see RSAPrivateKeySpec * @see RSAPublicKeySpec * @see RSAOtherPrimeInfo * * @since 1.4 */ public class RSAMultiPrimePrivateCrtKeySpec extends RSAPrivateKeySpec { private final BigInteger publicExponent; private final BigInteger primeP; private final BigInteger primeQ; private final BigInteger primeExponentP; private final BigInteger primeExponentQ; private final BigInteger crtCoefficient; private final RSAOtherPrimeInfo otherPrimeInfo[]; /** * Creates a new <code>RSAMultiPrimePrivateCrtKeySpec</code> * given the modulus, publicExponent, privateExponent, * primeP, primeQ, primeExponentP, primeExponentQ, * crtCoefficient, and otherPrimeInfo as defined in PKCS#1 v2.1. * * <p>Note that the contents of <code>otherPrimeInfo</code> * are copied to protect against subsequent modification 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). * @exception NullPointerException if any of the parameters, i.e. * <code>modulus</code>, * <code>publicExponent</code>, <code>privateExponent</code>, * <code>primeP</code>, <code>primeQ</code>, * <code>primeExponentP</code>, <code>primeExponentQ</code>, * <code>crtCoefficient</code>, is null. * @exception IllegalArgumentException if an empty, i.e. 0-length, * <code>otherPrimeInfo</code> 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 (modulus == null) { throw new NullPointerException("the modulus parameter must be " + "non-null"); } if (publicExponent == null) { throw new NullPointerException("the publicExponent parameter " + "must be non-null"); } if (privateExponent == null) { throw new NullPointerException("the privateExponent parameter " + "must be non-null"); } if (primeP == null) { throw new NullPointerException("the primeP parameter " + "must be non-null"); } if (primeQ == null) { throw new NullPointerException("the primeQ parameter " + "must be non-null"); } if (primeExponentP == null) { throw new NullPointerException("the primeExponentP parameter " + "must be non-null"); } if (primeExponentQ == null) { throw new NullPointerException("the primeExponentQ parameter " + "must be non-null"); } if (crtCoefficient == null) { throw new NullPointerException("the crtCoefficient parameter " + "must be non-null"); } this.publicExponent = publicExponent; this.primeP = primeP; this.primeQ = primeQ; this.primeExponentP = primeExponentP; this.primeExponentQ = primeExponentQ; this.crtCoefficient = crtCoefficient; if (otherPrimeInfo == null) { this.otherPrimeInfo = null; } else if (otherPrimeInfo.length == 0) { throw new IllegalArgumentException("the otherPrimeInfo " + "parameter must not be empty"); } else { this.otherPrimeInfo = (RSAOtherPrimeInfo[])otherPrimeInfo.clone(); } } /** * Returns the public exponent. * * @return the public exponent. */ public BigInteger getPublicExponent() { return this.publicExponent; } /** * Returns the primeP. * * @return the primeP. */ public BigInteger getPrimeP() { return this.primeP; } /** * Returns the primeQ. * * @return the primeQ. */ public BigInteger getPrimeQ() { return this.primeQ; } /** * Returns the primeExponentP. * * @return the primeExponentP. */ public BigInteger getPrimeExponentP() { return this.primeExponentP; } /** * Returns the primeExponentQ. * * @return the primeExponentQ. */ public BigInteger getPrimeExponentQ() { return this.primeExponentQ; } /** * Returns the crtCoefficient. * * @return the crtCoefficient. */ public BigInteger getCrtCoefficient() { return this.crtCoefficient; } /** * Returns a copy of the otherPrimeInfo or null if there are * only two prime factors (p and q). * * @return the otherPrimeInfo. Returns a new array each * time this method is called. */ public RSAOtherPrimeInfo[] getOtherPrimeInfo() { if (otherPrimeInfo == null) return null; return (RSAOtherPrimeInfo[]) otherPrimeInfo.clone(); } }