001 /*
002 * Copyright 2001-2003 Sun Microsystems, Inc. All Rights Reserved.
003 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
004 *
005 * This code is free software; you can redistribute it and/or modify it
006 * under the terms of the GNU General Public License version 2 only, as
007 * published by the Free Software Foundation. Sun designates this
008 * particular file as subject to the "Classpath" exception as provided
009 * by Sun in the LICENSE file that accompanied this code.
010 *
011 * This code is distributed in the hope that it will be useful, but WITHOUT
012 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
013 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
014 * version 2 for more details (a copy is included in the LICENSE file that
015 * accompanied this code).
016 *
017 * You should have received a copy of the GNU General Public License version
018 * 2 along with this work; if not, write to the Free Software Foundation,
019 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
020 *
021 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
022 * CA 95054 USA or visit www.sun.com if you need additional information or
023 * have any questions.
024 */
025
026 package java.security.spec;
027
028 import java.math.BigInteger;
029
030 /**
031 * This class specifies an RSA multi-prime private key, as defined in the
032 * PKCS#1 v2.1, using the Chinese Remainder Theorem (CRT) information
033 * values for efficiency.
034 *
035 * @author Valerie Peng
036 *
037 * @version 1.15 07/05/05
038 *
039 * @see java.security.Key
040 * @see java.security.KeyFactory
041 * @see KeySpec
042 * @see PKCS8EncodedKeySpec
043 * @see RSAPrivateKeySpec
044 * @see RSAPublicKeySpec
045 * @see RSAOtherPrimeInfo
046 *
047 * @since 1.4
048 */
049
050 public class RSAMultiPrimePrivateCrtKeySpec extends RSAPrivateKeySpec {
051
052 private final BigInteger publicExponent;
053 private final BigInteger primeP;
054 private final BigInteger primeQ;
055 private final BigInteger primeExponentP;
056 private final BigInteger primeExponentQ;
057 private final BigInteger crtCoefficient;
058 private final RSAOtherPrimeInfo otherPrimeInfo[];
059
060 /**
061 * Creates a new <code>RSAMultiPrimePrivateCrtKeySpec</code>
062 * given the modulus, publicExponent, privateExponent,
063 * primeP, primeQ, primeExponentP, primeExponentQ,
064 * crtCoefficient, and otherPrimeInfo as defined in PKCS#1 v2.1.
065 *
066 * <p>Note that the contents of <code>otherPrimeInfo</code>
067 * are copied to protect against subsequent modification when
068 * constructing this object.
069 *
070 * @param modulus the modulus n.
071 * @param publicExponent the public exponent e.
072 * @param privateExponent the private exponent d.
073 * @param primeP the prime factor p of n.
074 * @param primeQ the prime factor q of n.
075 * @param primeExponentP this is d mod (p-1).
076 * @param primeExponentQ this is d mod (q-1).
077 * @param crtCoefficient the Chinese Remainder Theorem
078 * coefficient q-1 mod p.
079 * @param otherPrimeInfo triplets of the rest of primes, null can be
080 * specified if there are only two prime factors (p and q).
081 * @exception NullPointerException if any of the parameters, i.e.
082 * <code>modulus</code>,
083 * <code>publicExponent</code>, <code>privateExponent</code>,
084 * <code>primeP</code>, <code>primeQ</code>,
085 * <code>primeExponentP</code>, <code>primeExponentQ</code>,
086 * <code>crtCoefficient</code>, is null.
087 * @exception IllegalArgumentException if an empty, i.e. 0-length,
088 * <code>otherPrimeInfo</code> is specified.
089 */
090 public RSAMultiPrimePrivateCrtKeySpec(BigInteger modulus,
091 BigInteger publicExponent, BigInteger privateExponent,
092 BigInteger primeP, BigInteger primeQ,
093 BigInteger primeExponentP, BigInteger primeExponentQ,
094 BigInteger crtCoefficient,
095 RSAOtherPrimeInfo[] otherPrimeInfo) {
096 super (modulus, privateExponent);
097 if (modulus == null) {
098 throw new NullPointerException(
099 "the modulus parameter must be " + "non-null");
100 }
101 if (publicExponent == null) {
102 throw new NullPointerException(
103 "the publicExponent parameter "
104 + "must be non-null");
105 }
106 if (privateExponent == null) {
107 throw new NullPointerException(
108 "the privateExponent parameter "
109 + "must be non-null");
110 }
111 if (primeP == null) {
112 throw new NullPointerException("the primeP parameter "
113 + "must be non-null");
114 }
115 if (primeQ == null) {
116 throw new NullPointerException("the primeQ parameter "
117 + "must be non-null");
118 }
119 if (primeExponentP == null) {
120 throw new NullPointerException(
121 "the primeExponentP parameter "
122 + "must be non-null");
123 }
124 if (primeExponentQ == null) {
125 throw new NullPointerException(
126 "the primeExponentQ parameter "
127 + "must be non-null");
128 }
129 if (crtCoefficient == null) {
130 throw new NullPointerException(
131 "the crtCoefficient parameter "
132 + "must be non-null");
133 }
134 this .publicExponent = publicExponent;
135 this .primeP = primeP;
136 this .primeQ = primeQ;
137 this .primeExponentP = primeExponentP;
138 this .primeExponentQ = primeExponentQ;
139 this .crtCoefficient = crtCoefficient;
140 if (otherPrimeInfo == null) {
141 this .otherPrimeInfo = null;
142 } else if (otherPrimeInfo.length == 0) {
143 throw new IllegalArgumentException("the otherPrimeInfo "
144 + "parameter must not be empty");
145 } else {
146 this .otherPrimeInfo = (RSAOtherPrimeInfo[]) otherPrimeInfo
147 .clone();
148 }
149 }
150
151 /**
152 * Returns the public exponent.
153 *
154 * @return the public exponent.
155 */
156 public BigInteger getPublicExponent() {
157 return this .publicExponent;
158 }
159
160 /**
161 * Returns the primeP.
162 *
163 * @return the primeP.
164 */
165 public BigInteger getPrimeP() {
166 return this .primeP;
167 }
168
169 /**
170 * Returns the primeQ.
171 *
172 * @return the primeQ.
173 */
174 public BigInteger getPrimeQ() {
175 return this .primeQ;
176 }
177
178 /**
179 * Returns the primeExponentP.
180 *
181 * @return the primeExponentP.
182 */
183 public BigInteger getPrimeExponentP() {
184 return this .primeExponentP;
185 }
186
187 /**
188 * Returns the primeExponentQ.
189 *
190 * @return the primeExponentQ.
191 */
192 public BigInteger getPrimeExponentQ() {
193 return this .primeExponentQ;
194 }
195
196 /**
197 * Returns the crtCoefficient.
198 *
199 * @return the crtCoefficient.
200 */
201 public BigInteger getCrtCoefficient() {
202 return this .crtCoefficient;
203 }
204
205 /**
206 * Returns a copy of the otherPrimeInfo or null if there are
207 * only two prime factors (p and q).
208 *
209 * @return the otherPrimeInfo. Returns a new array each
210 * time this method is called.
211 */
212 public RSAOtherPrimeInfo[] getOtherPrimeInfo() {
213 if (otherPrimeInfo == null)
214 return null;
215 return (RSAOtherPrimeInfo[]) otherPrimeInfo.clone();
216 }
217 }
|