1 /* PSSParameterSpec.java --
2    Copyright (C) 2003, Free Software Foundation, Inc.
3 
4 This file is part of GNU Classpath.
5 
6 GNU Classpath is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
9 any later version.
10 
11 GNU Classpath is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 General Public License for more details.
15 
16 You should have received a copy of the GNU General Public License
17 along with GNU Classpath; see the file COPYING.  If not, write to the
18 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 02110-1301 USA.
20 
21 Linking this library statically or dynamically with other modules is
22 making a combined work based on this library.  Thus, the terms and
23 conditions of the GNU General Public License cover the whole
24 combination.
25 
26 As a special exception, the copyright holders of this library give you
27 permission to link this library with independent modules to produce an
28 executable, regardless of the license terms of these independent
29 modules, and to copy and distribute the resulting executable under
30 terms of your choice, provided that you also meet, for each linked
31 independent module, the terms and conditions of the license of that
32 module.  An independent module is a module which is not derived from
33 or based on this library.  If you modify this library, you may extend
34 this exception to your version of the library, but you are not
35 obligated to do so.  If you do not wish to do so, delete this
36 exception statement from your version. */
37 
38 package java.security.spec;
39 
40 import java.math.BigInteger;
41 
42 /**
43  * This class represents an RSA multi-prime private key, as defined in the
44  * PKCS#1 v2.1, using the <i>Chinese Remainder Theorem</i> (CRT) information
45  * values.
46  *
47  * @since 1.4
48  * @see java.security.Key
49  * @see java.security.KeyFactory
50  * @see KeySpec
51  * @see PKCS8EncodedKeySpec
52  * @see RSAPrivateKeySpec
53  * @see RSAPublicKeySpec
54  * @see RSAOtherPrimeInfo
55  */
56 public class RSAMultiPrimePrivateCrtKeySpec extends RSAPrivateKeySpec
57 {
58   // Constants and fields
59   // --------------------------------------------------------------------------
60 
61   private BigInteger publicExponent;
62   private BigInteger primeP;
63   private BigInteger primeQ;
64   private BigInteger primeExponentP;
65   private BigInteger primeExponentQ;
66   private BigInteger crtCoefficient;
67   private RSAOtherPrimeInfo[] otherPrimeInfo;
68 
69   // Constructor(s)
70   // --------------------------------------------------------------------------
71 
72   /**
73    * Constructs a new instance of <code>RSAMultiPrimePrivateCrtKeySpec</code>
74    * given the various PKCS#1 v2.1 parameters.
75    *
76    * <p>Note that <code>otherPrimeInfo</code> is cloned when constructing this
77    * object.</p>
78    *
79    * @param modulus
80    *          the modulus n.
81    * @param publicExponent
82    *          the public exponent e.
83    * @param privateExponent
84    *          the private exponent d.
85    * @param primeP
86    *          the prime factor p of n.
87    * @param primeQ
88    *          the prime factor q of n.
89    * @param primeExponentP
90    *          this is d mod (p-1).
91    * @param primeExponentQ
92    *          this is d mod (q-1).
93    * @param crtCoefficient
94    *          the Chinese Remainder Theorem coefficient q-1 mod p.
95    * @param otherPrimeInfo
96    *          triplets of the rest of primes, <code>null</code> can be
97    *          specified if there are only two prime factors (p and q).
98    * @throws NullPointerException
99    *           if any of the parameters is <code>null</code>.
100    * @throws IllegalArgumentException
101    *           if an empty <code>otherPrimeInfo</code> is specified.
102    */
RSAMultiPrimePrivateCrtKeySpec(BigInteger modulus, BigInteger publicExponent, BigInteger privateExponent, BigInteger primeP, BigInteger primeQ, BigInteger primeExponentP, BigInteger primeExponentQ, BigInteger crtCoefficient, RSAOtherPrimeInfo[] otherPrimeInfo)103   public RSAMultiPrimePrivateCrtKeySpec(BigInteger modulus,
104                                         BigInteger publicExponent,
105                                         BigInteger privateExponent,
106                                         BigInteger primeP,
107                                         BigInteger primeQ,
108                                         BigInteger primeExponentP,
109                                         BigInteger primeExponentQ,
110                                         BigInteger crtCoefficient,
111                                         RSAOtherPrimeInfo[] otherPrimeInfo)
112   {
113     super(modulus, privateExponent);
114 
115     if (modulus == null)
116       throw new NullPointerException("modulus");
117     if (publicExponent == null)
118       throw new NullPointerException("publicExponent");
119     if (privateExponent == null)
120       throw new NullPointerException("privateExponent");
121     if (primeP == null)
122       throw new NullPointerException("primeP");
123     if (primeQ == null)
124       throw new NullPointerException("primeQ");
125     if (primeExponentP == null)
126       throw new NullPointerException("primeExponentP");
127     if (primeExponentQ == null)
128       throw new NullPointerException("primeExponentQ");
129     if (crtCoefficient == null)
130       throw new NullPointerException("crtCoefficient");
131     if (otherPrimeInfo != null)
132       if (otherPrimeInfo.length == 0)
133         throw new IllegalArgumentException();
134       else
135         this.otherPrimeInfo = (RSAOtherPrimeInfo[]) otherPrimeInfo.clone();
136 
137     this.publicExponent = publicExponent;
138     this.primeP = primeP;
139     this.primeQ = primeQ;
140     this.primeExponentP = primeExponentP;
141     this.primeExponentQ = primeExponentQ;
142     this.crtCoefficient = crtCoefficient;
143   }
144 
145   // Class methods
146   // --------------------------------------------------------------------------
147 
148   // Instance methods
149   // --------------------------------------------------------------------------
150 
151   /**
152    * Returns the public exponent.
153    *
154    * @return the public exponent.
155    */
getPublicExponent()156   public BigInteger getPublicExponent()
157   {
158     return this.publicExponent;
159   }
160 
161   /**
162    * Returns the prime p.
163    *
164    * @return the prime p.
165    */
getPrimeP()166   public BigInteger getPrimeP()
167   {
168     return this.primeP;
169   }
170 
171   /**
172    * Returns the prime q.
173    *
174    * @return the prime q.
175    */
getPrimeQ()176   public BigInteger getPrimeQ()
177   {
178     return this.primeQ;
179   }
180 
181   /**
182    * Returns d mod (p-1).
183    *
184    * @return d mod (p-1).
185    */
getPrimeExponentP()186   public BigInteger getPrimeExponentP()
187   {
188     return this.primeExponentP;
189   }
190 
191   /**
192    * Returns d mod (q-1).
193    *
194    * @return d mod (q-1).
195    */
getPrimeExponentQ()196   public BigInteger getPrimeExponentQ()
197   {
198     return this.primeExponentQ;
199   }
200 
201   /**
202    * Returns the CRT Coefficient q-1 mod p.
203    *
204    * @return the CRT Coefficient q-1 mod p.
205    */
getCrtCoefficient()206   public BigInteger getCrtCoefficient()
207   {
208     return this.crtCoefficient;
209   }
210 
211   /**
212    * Returns a clone of <code>otherPrimeInfo</code> or <code>null</code> if
213    * it was <code>null</code> at construction time.
214    *
215    * @return a cloned copy of <code>otherPrimeInfo</code>.
216    */
getOtherPrimeInfo()217   public RSAOtherPrimeInfo[] getOtherPrimeInfo()
218   {
219     return this.otherPrimeInfo == null
220         ? null
221         : (RSAOtherPrimeInfo[]) this.otherPrimeInfo.clone();
222   }
223 }
224