Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mobile
Path: blob/master/test/jdk/sun/security/ec/ed/EdDSAKeyCompatibility.java
41152 views
1
/*
2
* Copyright (c) 2020, 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
import java.io.ByteArrayInputStream;
25
import java.io.IOException;
26
import java.math.BigInteger;
27
import java.security.InvalidKeyException;
28
import java.security.KeyFactory;
29
import java.security.NoSuchAlgorithmException;
30
import java.security.NoSuchProviderException;
31
import java.security.cert.Certificate;
32
import java.security.cert.CertificateException;
33
import java.security.cert.CertificateFactory;
34
import java.util.Base64;
35
import sun.security.util.DerValue;
36
import java.security.interfaces.EdECPrivateKey;
37
import java.security.interfaces.EdECPublicKey;
38
import java.security.spec.EdECPrivateKeySpec;
39
import java.security.spec.EdECPublicKeySpec;
40
import java.security.spec.InvalidKeySpecException;
41
import java.security.spec.NamedParameterSpec;
42
import java.security.spec.PKCS8EncodedKeySpec;
43
import java.security.spec.X509EncodedKeySpec;
44
45
/*
46
* @test
47
* @bug 8209632
48
* @summary OpenSSL generated compatibility test with EDDSA Java.
49
* @modules java.base/sun.security.util
50
* @run main EdDSAKeyCompatibility
51
*/
52
public class EdDSAKeyCompatibility {
53
54
private static final String EDDSA = "EdDSA";
55
private static final String ED25519 = "Ed25519";
56
private static final String ED448 = "Ed448";
57
private static final String PROVIDER = "SunEC";
58
59
public static void main(String[] args) throws Exception {
60
61
boolean result = true;
62
result &= validateCert(EDDSA, PROVIDER, ED25519CERT);
63
result &= validateCert(EDDSA, PROVIDER, ED448CERT);
64
result &= validateCert(ED25519, PROVIDER, ED25519CERT);
65
result &= validateCert(ED448, PROVIDER, ED448CERT);
66
67
result &= validatePrivate(ED25519, PROVIDER, ED25519KEY);
68
result &= validatePrivate(ED448, PROVIDER, ED448KEY);
69
70
if (!result) {
71
throw new RuntimeException("Some test cases failed");
72
}
73
}
74
75
private static boolean validatePrivate(String algorithm, String provider,
76
String key) {
77
78
try {
79
KeyFactory kf = KeyFactory.getInstance(algorithm, provider);
80
PKCS8EncodedKeySpec privSpec = new PKCS8EncodedKeySpec(
81
Base64.getMimeDecoder().decode(key));
82
EdECPrivateKey privKey
83
= (EdECPrivateKey) kf.generatePrivate(privSpec);
84
checkPrivKeyFormat(privKey.getEncoded());
85
86
NamedParameterSpec namedSpec = new NamedParameterSpec(algorithm);
87
EdECPrivateKeySpec edprivSpec = new EdECPrivateKeySpec(
88
namedSpec, privKey.getBytes().get());
89
EdECPrivateKey privKey1
90
= (EdECPrivateKey) kf.generatePrivate(edprivSpec);
91
checkPrivKeyFormat(privKey1.getEncoded());
92
EdECPrivateKey privKey2 = (EdECPrivateKey) kf.translateKey(privKey);
93
checkPrivKeyFormat(privKey2.getEncoded());
94
equals(privKey, privKey1);
95
equals(privKey, privKey2);
96
} catch (NoSuchAlgorithmException | InvalidKeySpecException | IOException
97
| NoSuchProviderException | InvalidKeyException e) {
98
e.printStackTrace(System.out);
99
return false;
100
}
101
System.out.println("PASSED - validatePrivate");
102
return true;
103
}
104
105
private static boolean validateCert(String algorithm, String provider,
106
String certificate) {
107
108
try {
109
CertificateFactory cf = CertificateFactory.getInstance("X.509");
110
Certificate cert = cf.generateCertificate(
111
new ByteArrayInputStream(certificate.getBytes()));
112
System.out.println(cert);
113
KeyFactory kf = KeyFactory.getInstance(algorithm, provider);
114
X509EncodedKeySpec pubSpec = kf.getKeySpec(
115
cert.getPublicKey(), X509EncodedKeySpec.class);
116
EdECPublicKey pubKey = (EdECPublicKey) kf.generatePublic(pubSpec);
117
EdECPublicKeySpec edpubSpec = kf.getKeySpec(
118
cert.getPublicKey(), EdECPublicKeySpec.class);
119
EdECPublicKey pubKey1 = (EdECPublicKey) kf.generatePublic(edpubSpec);
120
EdECPublicKey pubKey2 = (EdECPublicKey) kf.translateKey(pubKey);
121
equals(pubKey, pubKey1);
122
equals(pubKey, pubKey2);
123
equals(pubKey, cert.getPublicKey());
124
} catch (CertificateException | NoSuchAlgorithmException
125
| InvalidKeySpecException | NoSuchProviderException
126
| InvalidKeyException e) {
127
e.printStackTrace(System.out);
128
return false;
129
}
130
System.out.println("PASSED - validateCert");
131
return true;
132
}
133
134
private static void checkPrivKeyFormat(byte[] key) throws IOException {
135
136
// key value should be nested octet strings
137
DerValue val = new DerValue(new ByteArrayInputStream(key));
138
BigInteger version = val.data.getBigInteger();
139
DerValue algId = val.data.getDerValue();
140
byte[] keyValue = val.data.getOctetString();
141
val = new DerValue(new ByteArrayInputStream(keyValue));
142
if (val.tag != DerValue.tag_OctetString) {
143
throw new RuntimeException("incorrect format");
144
}
145
}
146
147
private static void equals(Object actual, Object expected) {
148
if (!actual.equals(expected)) {
149
throw new RuntimeException(String.format("Actual: %s, Expected: %s",
150
actual, expected));
151
}
152
}
153
154
// Following EdDSA Certificates/Keys are generated through openssl_1.1.1d
155
156
/*
157
* Certificate:
158
* Data:
159
* Version: 3 (0x2)
160
* Serial Number:
161
* 1d:d3:87:b9:e4:c6:9e:4a:5c:78:a8:f0:c7:9b:37:be:1e:31:dd:20
162
* Signature Algorithm: ED25519
163
* Issuer: C = US, ST = CA, L = SCA, O = test, OU = test, CN = localhost
164
* Validity
165
* Not Before: Mar 6 05:55:31 2020 GMT
166
* Not After : Mar 1 05:55:31 2040 GMT
167
* Subject: C = US, ST = CA, L = SCA, O = test, OU = test, CN = localhost
168
* Subject Public Key Info:
169
* Public Key Algorithm: ED25519
170
*/
171
private static final String ED25519KEY
172
= "MC4CAQAwBQYDK2VwBCIEIP8xGaQTMh+I+59I66AaN+B4qnY1oWGjPwbSY4r+D08f";
173
174
private static final String ED25519CERT
175
= "-----BEGIN CERTIFICATE-----\n"
176
+ "MIIByTCCAXugAwIBAgIUHdOHueTGnkpceKjwx5s3vh4x3SAwBQYDK2VwMFoxCzAJ\n"
177
+ "BgNVBAYTAlVTMQswCQYDVQQIDAJDQTEMMAoGA1UEBwwDU0NBMQ0wCwYDVQQKDAR0\n"
178
+ "ZXN0MQ0wCwYDVQQLDAR0ZXN0MRIwEAYDVQQDDAlsb2NhbGhvc3QwHhcNMjAwMzA2\n"
179
+ "MDU1NTMxWhcNNDAwMzAxMDU1NTMxWjBaMQswCQYDVQQGEwJVUzELMAkGA1UECAwC\n"
180
+ "Q0ExDDAKBgNVBAcMA1NDQTENMAsGA1UECgwEdGVzdDENMAsGA1UECwwEdGVzdDES\n"
181
+ "MBAGA1UEAwwJbG9jYWxob3N0MCowBQYDK2VwAyEAdqQ4Nduhbl+ShGeKdOryVMKy\n"
182
+ "1t1LjyjPyCBC+gSk0eCjUzBRMB0GA1UdDgQWBBS01/VQEzwkFNRW/esQxaB6+uId\n"
183
+ "8jAfBgNVHSMEGDAWgBS01/VQEzwkFNRW/esQxaB6+uId8jAPBgNVHRMBAf8EBTAD\n"
184
+ "AQH/MAUGAytlcANBAEJkLuNfyVws7HKqHL7oDqQkp5DSwh+bGjrr2p4zSvs5PZ8o\n"
185
+ "jRXWV0SMt/MB+90ubMD5tL7H7J6DR5PUFBIwGwc=\n"
186
+ "-----END CERTIFICATE-----";
187
188
/*
189
* Certificate:
190
* Data:
191
* Version: 3 (0x2)
192
* Serial Number:
193
* 42:eb:8c:a2:a0:6f:8e:5a:a5:f8:7c:72:c1:f1:8b:7e:44:1b:37:80
194
* Signature Algorithm: ED448
195
* Issuer: C = US, ST = CA, L = SCA, O = test, OU = test, CN = localhost
196
* Validity
197
* Not Before: Mar 6 05:57:42 2020 GMT
198
* Not After : Mar 1 05:57:42 2040 GMT
199
* Subject: C = US, ST = CA, L = SCA, O = test, OU = test, CN = localhost
200
* Subject Public Key Info:
201
* Public Key Algorithm: ED448
202
*/
203
private static final String ED448KEY
204
= "MEcCAQAwBQYDK2VxBDsEOdG4lrYO0xBaf3aJWYMZ8XAxitA1zV4/ghG8wPBag8HQ"
205
+ "XN+3OmS8wR1KfeGQysHQr3JHco3Mwiaz8w==";
206
207
private static final String ED448CERT
208
= "-----BEGIN CERTIFICATE-----\n"
209
+ "MIICFDCCAZSgAwIBAgIUQuuMoqBvjlql+HxywfGLfkQbN4AwBQYDK2VxMFoxCzAJ\n"
210
+ "BgNVBAYTAlVTMQswCQYDVQQIDAJDQTEMMAoGA1UEBwwDU0NBMQ0wCwYDVQQKDAR0\n"
211
+ "ZXN0MQ0wCwYDVQQLDAR0ZXN0MRIwEAYDVQQDDAlsb2NhbGhvc3QwHhcNMjAwMzA2\n"
212
+ "MDU1NzQyWhcNNDAwMzAxMDU1NzQyWjBaMQswCQYDVQQGEwJVUzELMAkGA1UECAwC\n"
213
+ "Q0ExDDAKBgNVBAcMA1NDQTENMAsGA1UECgwEdGVzdDENMAsGA1UECwwEdGVzdDES\n"
214
+ "MBAGA1UEAwwJbG9jYWxob3N0MEMwBQYDK2VxAzoAfKlXpT0ymcvz2Gp+8HLzBpaz\n"
215
+ "5mQqMaDbGmcq8gSIdeEUtVmv4OplE+4GSnrbJnEn99LQdbanL/MAo1MwUTAdBgNV\n"
216
+ "HQ4EFgQUXkm9LVUkB0f/1MiPFjQPHGJ8THIwHwYDVR0jBBgwFoAUXkm9LVUkB0f/\n"
217
+ "1MiPFjQPHGJ8THIwDwYDVR0TAQH/BAUwAwEB/zAFBgMrZXEDcwDvE3LKCg1bTjHi\n"
218
+ "MI1EiMqZN3PJYVBsztecBXm3ELDlT+F0Z1H2vjaROkJc8PdpUOxyed1xDjwq3IB/\n"
219
+ "nYYJNVyt6Dy3d12kl77ev+YMD83OuqM6F5O6MdDUxYQu9u3NasZAU5FQ6zklWWpI\n"
220
+ "8jCPtOvcAQA=\n"
221
+ "-----END CERTIFICATE-----";
222
}
223
224