1 /*
2  * Copyright (c) 2001, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.
8  *
9  * This code is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12  * version 2 for more details (a copy is included in the LICENSE file that
13  * accompanied this code).
14  *
15  * You should have received a copy of the GNU General Public License version
16  * 2 along with this work; if not, write to the Free Software Foundation,
17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18  *
19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20  * or visit www.oracle.com if you need additional information or have any
21  * questions.
22  */
23 
24 /*
25  * @test
26  * @bug 4413634
27  * @summary Make sure that RSA Private CRT Key factory generation using
28  * java.security.spec.RSAPrivateCrtKeySpec passes
29  */
30 
31 import java.math.BigInteger;
32 import java.security.KeyFactory;
33 import java.security.interfaces.RSAPrivateCrtKey;
34 import java.security.spec.PKCS8EncodedKeySpec;
35 import java.security.spec.RSAPrivateCrtKeySpec;
36 import java.util.Arrays;
37 
38 public class GenerateRSAPrivateCrtKey {
39 
main(String[] args)40     public static void main(String[] args) throws Exception {
41 
42         // Create an RSA Private Key from the CRT information
43         RSAPrivateCrtKeySpec rsaCrtSpec =
44             new RSAPrivateCrtKeySpec(new BigInteger(1, modulus),
45                                      new BigInteger(1, pubExpo),
46                                      new BigInteger(1, priExpo),
47                                      new BigInteger(1, primeP),
48                                      new BigInteger(1, primeQ),
49                                      new BigInteger(1, expoP),
50                                      new BigInteger(1, expoQ),
51                                      new BigInteger(1, coeff));
52 
53         // Create an RSA private key from the CRT specification
54         KeyFactory kf = KeyFactory.getInstance("RSA", "SunRsaSign");
55         RSAPrivateCrtKey rsaPriKey =
56             (RSAPrivateCrtKey) kf.generatePrivate(rsaCrtSpec);
57 
58         // test resulting key against original specification
59         if (!rsaPriKey.getCrtCoefficient().equals(rsaCrtSpec.getCrtCoefficient()))
60             throw new Exception("coefficients not equal");
61         if (!rsaPriKey.getPrimeExponentP().equals(rsaCrtSpec.getPrimeExponentP()))
62             throw new Exception("primeExponentPs not equal");
63         if (!rsaPriKey.getPrimeExponentQ().equals(rsaCrtSpec.getPrimeExponentQ()))
64             throw new Exception("primeExponentQs not equal");
65         if (!rsaPriKey.getPrimeP().equals(rsaCrtSpec.getPrimeP()))
66             throw new Exception("primePs not equal");
67         if (!rsaPriKey.getPrimeQ().equals(rsaCrtSpec.getPrimeQ()))
68             throw new Exception("primeQs not equal");
69         if (!rsaPriKey.getPublicExponent().equals(rsaCrtSpec.getPublicExponent()))
70             throw new Exception("public exponents not equal");
71         if (!rsaPriKey.getPrivateExponent().equals(rsaCrtSpec.getPrivateExponent()))
72             throw new Exception("private exponents not equal");
73         if (!rsaPriKey.getModulus().equals(rsaCrtSpec.getModulus()))
74             throw new Exception("modulus not equal");
75         if (!rsaPriKey.getFormat().equals("PKCS#8") &&
76             !rsaPriKey.getFormat().equals("PKCS8"))
77             throw new Exception("format not PKCS#8");
78         if (!rsaPriKey.getAlgorithm().equals("RSA"))
79             throw new Exception("algorithm not RSA");
80         if (rsaPriKey.getEncoded() == null)
81             throw new Exception("encoded key is null");
82 
83         PKCS8EncodedKeySpec pkcs8Key =
84             new PKCS8EncodedKeySpec(rsaPriKey.getEncoded());
85 
86         RSAPrivateCrtKey rsaPriKey2
87             = (RSAPrivateCrtKey) kf.generatePrivate(pkcs8Key);
88         if (!Arrays.equals(rsaPriKey.getEncoded(), rsaPriKey2.getEncoded()))
89             throw new Exception("encoded keys not equal");
90     }
91 
92     static byte[] modulus = {
93         (byte)0xab, (byte)0x38, (byte)0x39, (byte)0x40,
94         (byte)0x54, (byte)0x2c, (byte)0xac, (byte)0x9a,
95         (byte)0xc0, (byte)0x37, (byte)0x40, (byte)0xd0,
96         (byte)0x49, (byte)0x04, (byte)0xed, (byte)0x51,
97         (byte)0x0e, (byte)0x95, (byte)0x72, (byte)0x02,
98         (byte)0x51, (byte)0xc2, (byte)0xad, (byte)0x9d,
99         (byte)0xa7, (byte)0xeb, (byte)0xba, (byte)0x29,
100         (byte)0xae, (byte)0xd4, (byte)0x49, (byte)0x79,
101         (byte)0x53, (byte)0xfa, (byte)0xdf, (byte)0x01,
102         (byte)0x6c, (byte)0xbc, (byte)0x69, (byte)0x46,
103         (byte)0x4c, (byte)0x83, (byte)0x1b, (byte)0xd9,
104         (byte)0x3b, (byte)0x59, (byte)0x42, (byte)0x04,
105         (byte)0x99, (byte)0x0f, (byte)0x63, (byte)0x24,
106         (byte)0x75, (byte)0xa0, (byte)0xbe, (byte)0x6f,
107         (byte)0x92, (byte)0x4d, (byte)0x9d, (byte)0xa2,
108         (byte)0x40, (byte)0xda, (byte)0xf8, (byte)0x49
109     };
110 
111     static byte[] pubExpo = {
112         (byte)0x01, (byte)0x00, (byte)0x01
113     };
114 
115     static byte[] priExpo = {
116         (byte)0x4a, (byte)0xd2, (byte)0xe7, (byte)0x32,
117         (byte)0x15, (byte)0x96, (byte)0xf0, (byte)0x57,
118         (byte)0x30, (byte)0x68, (byte)0xf5, (byte)0x0a,
119         (byte)0x10, (byte)0xde, (byte)0xf6, (byte)0x56,
120         (byte)0xd5, (byte)0xe8, (byte)0xb9, (byte)0x4a,
121         (byte)0x0a, (byte)0x30, (byte)0xe9, (byte)0x6e,
122         (byte)0x5c, (byte)0x53, (byte)0xc7, (byte)0xa7,
123         (byte)0x2f, (byte)0x9f, (byte)0xd5, (byte)0xfb,
124         (byte)0x58, (byte)0x9b, (byte)0x1e, (byte)0x5b,
125         (byte)0xe8, (byte)0x6e, (byte)0xae, (byte)0x02,
126         (byte)0xaa, (byte)0x15, (byte)0x23, (byte)0x67,
127         (byte)0xaa, (byte)0x20, (byte)0x9e, (byte)0x82,
128         (byte)0x76, (byte)0x4c, (byte)0xad, (byte)0xe1,
129         (byte)0x95, (byte)0xde, (byte)0xe3, (byte)0x25,
130         (byte)0x66, (byte)0x2f, (byte)0xb0, (byte)0xab,
131         (byte)0x1c, (byte)0xe5, (byte)0xa0, (byte)0x01
132     };
133 
134     static byte[] primeP = {
135         (byte)0xd1, (byte)0xeb, (byte)0x51, (byte)0xbd,
136         (byte)0x09, (byte)0x26, (byte)0x7e, (byte)0xe7,
137         (byte)0x12, (byte)0x8c, (byte)0xeb, (byte)0x5c,
138         (byte)0x32, (byte)0x18, (byte)0xd1, (byte)0x60,
139         (byte)0x0b, (byte)0x49, (byte)0x67, (byte)0x8f,
140         (byte)0x78, (byte)0x3c, (byte)0x58, (byte)0xc5,
141         (byte)0xb0, (byte)0x01, (byte)0x70, (byte)0xee,
142         (byte)0x1a, (byte)0xcf, (byte)0x6e, (byte)0xe1
143     };
144 
145     static byte[] primeQ = {
146         (byte)0xd0, (byte)0xce, (byte)0x21, (byte)0x83,
147         (byte)0x41, (byte)0x73, (byte)0xf6, (byte)0x84,
148         (byte)0x32, (byte)0x06, (byte)0xa8, (byte)0xa6,
149         (byte)0xad, (byte)0x13, (byte)0x2b, (byte)0x65,
150         (byte)0x27, (byte)0x86, (byte)0x28, (byte)0xef,
151         (byte)0x0e, (byte)0x8c, (byte)0xca, (byte)0x4f,
152         (byte)0x20, (byte)0xc0, (byte)0x19, (byte)0x95,
153         (byte)0xfe, (byte)0x6c, (byte)0x3e, (byte)0x69
154     };
155 
156     static byte[] expoP = {
157         (byte)0x1a, (byte)0x49, (byte)0x9c, (byte)0xb7,
158         (byte)0xce, (byte)0x80, (byte)0x8a, (byte)0x9d,
159         (byte)0xc7, (byte)0x3d, (byte)0xec, (byte)0x6f,
160         (byte)0x64, (byte)0x3a, (byte)0xa5, (byte)0x65,
161         (byte)0xa0, (byte)0xa4, (byte)0x35, (byte)0x9a,
162         (byte)0xca, (byte)0xd4, (byte)0xcb, (byte)0xcd,
163         (byte)0x1d, (byte)0xc8, (byte)0x60, (byte)0x6b,
164         (byte)0x00, (byte)0xe2, (byte)0x7f, (byte)0x21
165     };
166 
167     static byte[] expoQ = {
168         (byte)0xa7, (byte)0x93, (byte)0xd7, (byte)0x77,
169         (byte)0x94, (byte)0xef, (byte)0x31, (byte)0x78,
170         (byte)0x55, (byte)0x01, (byte)0xdd, (byte)0x16,
171         (byte)0xaf, (byte)0xae, (byte)0xc3, (byte)0xd4,
172         (byte)0x12, (byte)0x0d, (byte)0x6d, (byte)0x0a,
173         (byte)0xb6, (byte)0xdd, (byte)0xad, (byte)0x7c,
174         (byte)0x25, (byte)0xe7, (byte)0xa6, (byte)0x61,
175         (byte)0x27, (byte)0xe8, (byte)0xcd, (byte)0x89
176     };
177 
178     static byte[] coeff = {
179         (byte)0x0b, (byte)0xdb, (byte)0x90, (byte)0x7f,
180         (byte)0x33, (byte)0xc5, (byte)0x1f, (byte)0x5b,
181         (byte)0x4d, (byte)0xa4, (byte)0x86, (byte)0xda,
182         (byte)0x77, (byte)0xd4, (byte)0xb3, (byte)0x1d,
183         (byte)0xbc, (byte)0xc3, (byte)0xae, (byte)0x0b,
184         (byte)0xac, (byte)0x91, (byte)0xf3, (byte)0x38,
185         (byte)0x4a, (byte)0xcf, (byte)0x10, (byte)0xb1,
186         (byte)0x5e, (byte)0x5a, (byte)0xd1, (byte)0x86
187     };
188 }
189