Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mobile
Path: blob/master/test/jdk/sun/security/rsa/TestKeyPairGenerator.java
41152 views
1
/*
2
* Copyright (c) 2003, 2018, 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 4853305 4865198 4888410 4963723 8146293
27
* @summary Verify that the RSA KeyPairGenerator works
28
* @library /test/lib
29
* @build jdk.test.lib.SigTestUtil
30
* @run main TestKeyPairGenerator
31
* @author Andreas Sterbenz
32
* @key randomness
33
*/
34
35
import java.io.*;
36
import java.util.*;
37
import java.math.BigInteger;
38
39
import java.security.*;
40
import java.security.interfaces.*;
41
import java.security.spec.*;
42
43
import jdk.test.lib.SigTestUtil;
44
import static jdk.test.lib.SigTestUtil.SignatureType;
45
46
public class TestKeyPairGenerator {
47
48
private static Provider provider;
49
50
private static byte[] data;
51
52
private static void testSignature(SignatureType type, String mdAlg,
53
PrivateKey privateKey, PublicKey publicKey) throws
54
NoSuchAlgorithmException, InvalidKeyException, SignatureException {
55
System.out.println("Testing against " + mdAlg + "...");
56
String sigAlg = SigTestUtil.generateSigAlg(type, mdAlg);
57
Signature s = Signature.getInstance(sigAlg, provider);
58
s.initSign(privateKey);
59
s.update(data);
60
byte[] sig = s.sign();
61
s.initVerify(publicKey);
62
s.update(data);
63
boolean result = s.verify(sig);
64
if (result == false) {
65
throw new RuntimeException("Verification failed");
66
}
67
}
68
69
private static void test(PrivateKey privateKey, PublicKey publicKey) throws Exception {
70
71
int testSize = ((RSAPublicKey)publicKey).getModulus().bitLength();
72
System.out.println("modulus size = " + testSize);
73
74
Iterable<String> md_alg_pkcs15 =
75
SigTestUtil.getDigestAlgorithms(SignatureType.RSA, testSize);
76
md_alg_pkcs15.forEach(mdAlg -> {
77
try {
78
testSignature(SignatureType.RSA, mdAlg, privateKey, publicKey);
79
} catch (NoSuchAlgorithmException | InvalidKeyException |
80
SignatureException ex) {
81
throw new RuntimeException(ex);
82
}
83
}
84
);
85
}
86
87
// regression test for 4865198
88
private static void testInvalidSignature(KeyPair kp1, KeyPair kp2) throws Exception {
89
System.out.println("Testing signature with incorrect key...");
90
Signature sig = Signature.getInstance("MD5withRSA", provider);
91
sig.initSign(kp1.getPrivate());
92
byte[] data = new byte[100];
93
sig.update(data);
94
byte[] signature = sig.sign();
95
sig.initVerify(kp1.getPublic());
96
sig.update(data);
97
if (sig.verify(signature) == false) {
98
throw new Exception("verification failed");
99
}
100
sig.initVerify(kp2.getPublic());
101
sig.update(data);
102
// verify needs to return false and not throw an Exception
103
try {
104
if (sig.verify(signature)) {
105
throw new Exception("verification unexpectedly succeeded");
106
}
107
} catch (SignatureException se) {
108
// Yet another kind of failure, OK.
109
}
110
}
111
112
public static void main(String[] args) throws Exception {
113
long start = System.currentTimeMillis();
114
provider = Security.getProvider("SunRsaSign");
115
data = new byte[2048];
116
// keypair generation is very slow, test only a few short keys
117
int[] keyLengths = {512, 512, 1024};
118
BigInteger[] pubExps = {null, BigInteger.valueOf(3), null};
119
KeyPair[] keyPairs = new KeyPair[3];
120
new Random().nextBytes(data);
121
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA", provider);
122
for (int i = 0; i < keyLengths.length; i++) {
123
int len = keyLengths[i];
124
BigInteger exp = pubExps[i];
125
System.out.println("Generating " + len + " bit keypair...");
126
if (exp == null) {
127
kpg.initialize(len);
128
} else {
129
kpg.initialize(new RSAKeyGenParameterSpec(len, exp));
130
}
131
KeyPair kp = kpg.generateKeyPair();
132
keyPairs[i] = kp;
133
RSAPublicKey publicKey = (RSAPublicKey)kp.getPublic();
134
System.out.println(publicKey);
135
RSAPrivateCrtKey privateKey = (RSAPrivateCrtKey)kp.getPrivate();
136
if (publicKey.getModulus().equals(privateKey.getModulus()) == false) {
137
throw new Exception("Moduli do not match");
138
}
139
if (publicKey.getPublicExponent().equals(privateKey.getPublicExponent()) == false) {
140
throw new Exception("Exponents do not match");
141
}
142
int keyLen = publicKey.getModulus().bitLength();
143
if ((keyLen > len) || (keyLen < len - 1)) {
144
throw new Exception("Incorrect key length: " + keyLen);
145
}
146
if (exp != null) {
147
if (exp.equals(publicKey.getPublicExponent()) == false) {
148
throw new Exception("Incorrect exponent");
149
}
150
}
151
test(privateKey, publicKey);
152
}
153
testInvalidSignature(keyPairs[0], keyPairs[1]);
154
testInvalidSignature(keyPairs[0], keyPairs[2]);
155
testInvalidSignature(keyPairs[2], keyPairs[0]);
156
long stop = System.currentTimeMillis();
157
System.out.println("All tests passed (" + (stop - start) + " ms).");
158
}
159
}
160
161