Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mobile
Path: blob/master/test/jdk/sun/security/ec/xec/TestXDH.java
41155 views
1
/*
2
* Copyright (c) 2018, 2021, 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 8171277 8206915
27
* @summary Test XDH key agreement
28
* @library /test/lib
29
* @build jdk.test.lib.Convert
30
* @run main TestXDH
31
*/
32
33
import java.security.*;
34
import java.security.spec.*;
35
import javax.crypto.*;
36
import java.util.Arrays;
37
import java.util.HexFormat;
38
39
import jdk.test.lib.Convert;
40
import jdk.test.lib.hexdump.ASN1Formatter;
41
import jdk.test.lib.hexdump.HexPrinter;
42
43
public class TestXDH {
44
45
public static void main(String[] args) throws Exception {
46
47
runBasicTests();
48
runKAT();
49
runSmallOrderTest();
50
runNonCanonicalTest();
51
runCurveMixTest();
52
}
53
54
private static void runBasicTests() throws Exception {
55
runBasicTest("XDH", null);
56
runBasicTest("XDH", 255);
57
runBasicTest("XDH", 448);
58
runBasicTest("XDH", "X25519");
59
runBasicTest("XDH", "X448");
60
runBasicTest("X25519", null);
61
runBasicTest("X448", null);
62
runBasicTest("1.3.101.110", null);
63
runBasicTest("1.3.101.111", null);
64
runBasicTest("OID.1.3.101.110", null);
65
runBasicTest("OID.1.3.101.111", null);
66
}
67
68
private static void runBasicTest(String name, Object param)
69
throws Exception {
70
71
KeyPairGenerator kpg = KeyPairGenerator.getInstance(name);
72
AlgorithmParameterSpec paramSpec = null;
73
if (param instanceof Integer) {
74
kpg.initialize((Integer) param);
75
} else if (param instanceof String) {
76
paramSpec = new NamedParameterSpec((String) param);
77
kpg.initialize(paramSpec);
78
}
79
KeyPair kp = kpg.generateKeyPair();
80
81
KeyAgreement ka = KeyAgreement.getInstance(name);
82
ka.init(kp.getPrivate(), paramSpec);
83
ka.doPhase(kp.getPublic(), true);
84
85
byte[] secret = ka.generateSecret();
86
87
KeyFactory kf = KeyFactory.getInstance(name);
88
// Test with X509 and PKCS8 key specs
89
X509EncodedKeySpec pubSpec =
90
kf.getKeySpec(kp.getPublic(), X509EncodedKeySpec.class);
91
PKCS8EncodedKeySpec priSpec =
92
kf.getKeySpec(kp.getPrivate(), PKCS8EncodedKeySpec.class);
93
94
PublicKey pubKey = kf.generatePublic(pubSpec);
95
PrivateKey priKey = kf.generatePrivate(priSpec);
96
97
ka.init(priKey);
98
ka.doPhase(pubKey, true);
99
byte[] secret2 = ka.generateSecret();
100
if (!Arrays.equals(secret, secret2)) {
101
throw new RuntimeException("Arrays not equal");
102
}
103
104
// make sure generateSecret() resets the state to after init()
105
try {
106
ka.generateSecret();
107
throw new RuntimeException("generateSecret does not reset state");
108
} catch (IllegalStateException ex) {
109
// do nothing---this is expected
110
}
111
ka.doPhase(pubKey, true);
112
ka.generateSecret();
113
114
// test with XDH key specs
115
XECPublicKeySpec xdhPublic =
116
kf.getKeySpec(kp.getPublic(), XECPublicKeySpec.class);
117
XECPrivateKeySpec xdhPrivate =
118
kf.getKeySpec(kp.getPrivate(), XECPrivateKeySpec.class);
119
PublicKey pubKey2 = kf.generatePublic(xdhPublic);
120
PrivateKey priKey2 = kf.generatePrivate(xdhPrivate);
121
ka.init(priKey2);
122
ka.doPhase(pubKey2, true);
123
byte[] secret3 = ka.generateSecret();
124
if (!Arrays.equals(secret, secret3)) {
125
throw new RuntimeException("Arrays not equal");
126
}
127
}
128
129
private static void runSmallOrderTest() throws Exception {
130
// Ensure that small-order points are rejected
131
132
// X25519
133
// 0
134
testSmallOrder(
135
"X25519",
136
"77076D0A7318A57D3C16C17251B26645DF4C2F87EBC0992AB177FBA51DB92C2A",
137
"0000000000000000000000000000000000000000000000000000000000000000",
138
"0000000000000000000000000000000000000000000000000000000000000000");
139
// 1 and -1
140
testSmallOrder(
141
"X25519",
142
"77076D0A7318A57D3C16C17251B26645DF4C2F87EBC0992AB177FBA51DB92C2A",
143
"0100000000000000000000000000000000000000000000000000000000000000",
144
"0000000000000000000000000000000000000000000000000000000000000000");
145
testSmallOrder(
146
"X25519",
147
"77076D0A7318A57D3C16C17251B26645DF4C2F87EBC0992AB177FBA51DB92C2A",
148
"ecffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f",
149
"0000000000000000000000000000000000000000000000000000000000000000");
150
151
// order 8 points
152
testSmallOrder(
153
"X25519",
154
"77076D0A7318A57D3C16C17251B26645DF4C2F87EBC0992AB177FBA51DB92C2A",
155
"5f9c95bca3508c24b1d0b1559c83ef5b04445cc4581c8e86d8224eddd09f1157",
156
"0000000000000000000000000000000000000000000000000000000000000000");
157
testSmallOrder(
158
"X25519",
159
"77076D0A7318A57D3C16C17251B26645DF4C2F87EBC0992AB177FBA51DB92C2A",
160
"e0eb7a7c3b41b8ae1656e3faf19fc46ada098deb9c32b1fd866205165f49b800",
161
"0000000000000000000000000000000000000000000000000000000000000000");
162
163
// X448
164
// 0
165
testSmallOrder(
166
"X448",
167
"9A8F4925D1519F5775CF46B04B5800D4EE9EE8BAE8BC5565D498C28DD9C9BA" +
168
"F574A9419744897391006382A6F127AB1D9AC2D8C0A598726B",
169
"00000000000000000000000000000000000000000000000000000000000000" +
170
"00000000000000000000000000000000000000000000000000",
171
"00000000000000000000000000000000000000000000000000000000000000" +
172
"00000000000000000000000000000000000000000000000000");
173
// 1 and -1
174
testSmallOrder(
175
"X448",
176
"9A8F4925D1519F5775CF46B04B5800D4EE9EE8BAE8BC5565D498C28DD9C9BA" +
177
"F574A9419744897391006382A6F127AB1D9AC2D8C0A598726B",
178
"01000000000000000000000000000000000000000000000000000000000000" +
179
"00000000000000000000000000000000000000000000000000",
180
"00000000000000000000000000000000000000000000000000000000000000" +
181
"00000000000000000000000000000000000000000000000000");
182
testSmallOrder(
183
"X448",
184
"9A8F4925D1519F5775CF46B04B5800D4EE9EE8BAE8BC5565D498C28DD9C9BAF" +
185
"574A9419744897391006382A6F127AB1D9AC2D8C0A598726B",
186
"fefffffffffffffffffffffffffffffffffffffffffffffffffffffffefffff" +
187
"fffffffffffffffffffffffffffffffffffffffffffffffff",
188
"000000000000000000000000000000000000000000000000000000000000000" +
189
"0000000000000000000000000000000000000000000000000");
190
}
191
192
private static void testSmallOrder(String name, String a_pri,
193
String b_pub, String result) throws Exception {
194
195
try {
196
runDiffieHellmanTest(name, a_pri, b_pub, result);
197
} catch (InvalidKeyException ex) {
198
return;
199
}
200
201
throw new RuntimeException("No exception on small-order point");
202
}
203
204
private static void runNonCanonicalTest() throws Exception {
205
// Test non-canonical values
206
207
// high bit of public key set
208
// X25519
209
runDiffieHellmanTest(
210
"X25519",
211
"77076D0A7318A57D3C16C17251B26645DF4C2F87EBC0992AB177FBA51DB92C2A",
212
"DE9EDB7D7B7DC1B4D35B61C2ECE435373F8343C85B78674DADFC7E146F882B8F",
213
"954e472439316f118ae158b65619eecff9e6bcf51ab29add66f3fd088681e233");
214
215
runDiffieHellmanTest(
216
"3030020100300706032b656e05000422042077076d0a7318a57d3c16c1725" +
217
"1b26645df4c2f87ebc0992ab177fba51db92c2a",
218
"302c300706032b656e0500032100de9edb7d7b7dc1b4d35b61c2ece435373f" +
219
"8343c85b78674dadfc7e146f882b8f",
220
"954e472439316f118ae158b65619eecff9e6bcf51ab29add66f3fd088681e233");
221
222
// large public key
223
224
// X25519
225
// public key value is 2^255-2
226
runDiffieHellmanTest(
227
"X25519",
228
"77076D0A7318A57D3C16C17251B26645DF4C2F87EBC0992AB177FBA51DB92C2A",
229
"FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F",
230
"81a02a45014594332261085128959869fc0540c6b12380f51db4b41380de2c2c");
231
232
runDiffieHellmanTest(
233
"3030020100300706032b656e05000422042077076d0a7318a57d3c16c17251" +
234
"b26645df4c2f87ebc0992ab177fba51db92c2a",
235
"302c300706032b656e0500032100FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" +
236
"FFFFFFFFFFFFFFFFFFFFFFFFFFFF7F",
237
"81a02a45014594332261085128959869fc0540c6b12380f51db4b41380de2c2c");
238
239
// X448
240
// public key value is 2^448-2
241
runDiffieHellmanTest(
242
"X448",
243
"9A8F4925D1519F5775CF46B04B5800D4EE9EE8BAE8BC5565D498C28DD9C9BA" +
244
"F574A9419744897391006382A6F127AB1D9AC2D8C0A598726B",
245
"FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" +
246
"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
247
"66e2e682b1f8e68c809f1bb3e406bd826921d9c1a5bfbfcbab7ae72feecee6" +
248
"3660eabd54934f3382061d17607f581a90bdac917a064959fb");
249
250
runDiffieHellmanTest(
251
"3048020100300706032B656F0500043A04389A8F4925D1519F5775CF46B04B" +
252
"5800D4EE9EE8BAE8BC5565D498C28DD9C9BAF574A9419744897391006382A6" +
253
"F127AB1D9AC2D8C0A598726B",
254
"3044300706032B656F0500033900FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" +
255
"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" +
256
"FFFFFFFFFFFFFFFF",
257
"66e2e682b1f8e68c809f1bb3e406bd826921d9c1a5bfbfcbab7ae72feecee6" +
258
"3660eabd54934f3382061d17607f581a90bdac917a064959fb");
259
260
}
261
262
private static void runKAT() throws Exception {
263
// Test both sides of the key exchange using vectors in RFC 7748
264
265
// X25519
266
// raw
267
runDiffieHellmanTest(
268
"X25519",
269
"77076D0A7318A57D3C16C17251B26645DF4C2F87EBC0992AB177FBA51DB92C2A",
270
"DE9EDB7D7B7DC1B4D35B61C2ECE435373F8343C85B78674DADFC7E146F882B4F",
271
"4a5d9d5ba4ce2de1728e3bf480350f25e07e21c947d19e3376f09b3c1e161742");
272
273
runDiffieHellmanTest(
274
"X25519",
275
"5DAB087E624A8A4B79E17F8B83800EE66F3BB1292618B6FD1C2F8B27FF88E0EB",
276
"8520F0098930A754748B7DDCB43EF75A0DBF3A0D26381AF4EBA4A98EAA9B4E6A",
277
"4a5d9d5ba4ce2de1728e3bf480350f25e07e21c947d19e3376f09b3c1e161742");
278
279
// encoded
280
runDiffieHellmanTest(
281
"3030020100300706032B656E05000422042077076D0A7318A57D3C16C17251" +
282
"B26645DF4C2F87EBC0992AB177FBA51DB92C2A",
283
"302C300706032B656E0500032100DE9EDB7D7B7DC1B4D35B61C2ECE435373F" +
284
"8343C85B78674DADFC7E146F882B4F",
285
"4a5d9d5ba4ce2de1728e3bf480350f25e07e21c947d19e3376f09b3c1e161742");
286
287
runDiffieHellmanTest(
288
"3030020100300706032B656E0500042204205DAB087E624A8A4B79E17F8B83" +
289
"800EE66F3BB1292618B6FD1C2F8B27FF88E0EB",
290
"302C300706032B656E05000321008520F0098930A754748B7DDCB43EF75A0D" +
291
"BF3A0D26381AF4EBA4A98EAA9B4E6A",
292
"4a5d9d5ba4ce2de1728e3bf480350f25e07e21c947d19e3376f09b3c1e161742");
293
294
// X448
295
//raw
296
runDiffieHellmanTest(
297
"X448",
298
"9A8F4925D1519F5775CF46B04B5800D4EE9EE8BAE8BC5565D498C28DD9C9BA" +
299
"F574A9419744897391006382A6F127AB1D9AC2D8C0A598726B",
300
"3EB7A829B0CD20F5BCFC0B599B6FECCF6DA4627107BDB0D4F345B43027D8B9" +
301
"72FC3E34FB4232A13CA706DCB57AEC3DAE07BDC1C67BF33609",
302
"07fff4181ac6cc95ec1c16a94a0f74d12da232ce40a77552281d282bb60c0b" +
303
"56fd2464c335543936521c24403085d59a449a5037514a879d");
304
305
runDiffieHellmanTest(
306
"X448",
307
"1C306A7AC2A0E2E0990B294470CBA339E6453772B075811D8FAD0D1D6927C1" +
308
"20BB5EE8972B0D3E21374C9C921B09D1B0366F10B65173992D",
309
"9B08F7CC31B7E3E67D22D5AEA121074A273BD2B83DE09C63FAA73D2C22C5D9" +
310
"BBC836647241D953D40C5B12DA88120D53177F80E532C41FA0",
311
"07fff4181ac6cc95ec1c16a94a0f74d12da232ce40a77552281d282bb60c0b" +
312
"56fd2464c335543936521c24403085d59a449a5037514a879d");
313
314
//encoded
315
runDiffieHellmanTest(
316
"3048020100300706032B656F0500043A04389A8F4925D1519F5775CF46B04B" +
317
"5800D4EE9EE8BAE8BC5565D498C28DD9C9BAF574A9419744897391006382A6" +
318
"F127AB1D9AC2D8C0A598726B",
319
"3044300706032B656F05000339003EB7A829B0CD20F5BCFC0B599B6FECCF6D" +
320
"A4627107BDB0D4F345B43027D8B972FC3E34FB4232A13CA706DCB57AEC3DAE" +
321
"07BDC1C67BF33609",
322
"07fff4181ac6cc95ec1c16a94a0f74d12da232ce40a77552281d282bb60c0b" +
323
"56fd2464c335543936521c24403085d59a449a5037514a879d");
324
325
runDiffieHellmanTest(
326
"3048020100300706032B656F0500043A04381C306A7AC2A0E2E0990B294470" +
327
"CBA339E6453772B075811D8FAD0D1D6927C120BB5EE8972B0D3E21374C9C92" +
328
"1B09D1B0366F10B65173992D",
329
"3044300706032B656F05000339009B08F7CC31B7E3E67D22D5AEA121074A27" +
330
"3BD2B83DE09C63FAA73D2C22C5D9BBC836647241D953D40C5B12DA88120D53" +
331
"177F80E532C41FA0",
332
"07fff4181ac6cc95ec1c16a94a0f74d12da232ce40a77552281d282bb60c0b" +
333
"56fd2464c335543936521c24403085d59a449a5037514a879d");
334
}
335
336
private static void runDiffieHellmanTest(String a_pri,
337
String b_pub, String result) throws Exception {
338
339
KeyFactory kf = KeyFactory.getInstance("XDH");
340
byte[] a_pri_ba = HexFormat.of().parseHex(a_pri);
341
KeySpec privateSpec = new PKCS8EncodedKeySpec(a_pri_ba);
342
PrivateKey privateKey = kf.generatePrivate(privateSpec);
343
byte[] b_pub_ba = HexFormat.of().parseHex(b_pub);
344
KeySpec publicSpec = new X509EncodedKeySpec(b_pub_ba);
345
PublicKey publicKey = kf.generatePublic(publicSpec);
346
347
KeyAgreement ka = KeyAgreement.getInstance("XDH");
348
ka.init(privateKey);
349
ka.doPhase(publicKey, true);
350
351
byte[] sharedSecret = ka.generateSecret();
352
byte[] expectedResult = HexFormat.of().parseHex(result);
353
if (!Arrays.equals(sharedSecret, expectedResult)) {
354
throw new RuntimeException("fail: expected=" + result + ", actual="
355
+ HexFormat.of().withUpperCase().formatHex(sharedSecret));
356
}
357
358
}
359
360
private static void runDiffieHellmanTest(String curveName, String a_pri,
361
String b_pub, String result) throws Exception {
362
363
NamedParameterSpec paramSpec = new NamedParameterSpec(curveName);
364
KeyFactory kf = KeyFactory.getInstance("XDH");
365
KeySpec privateSpec = new XECPrivateKeySpec(paramSpec,
366
HexFormat.of().parseHex(a_pri));
367
PrivateKey privateKey = kf.generatePrivate(privateSpec);
368
boolean clearHighBit = curveName.equals("X25519");
369
KeySpec publicSpec = new XECPublicKeySpec(paramSpec,
370
Convert.hexStringToBigInteger(clearHighBit, b_pub));
371
PublicKey publicKey = kf.generatePublic(publicSpec);
372
373
byte[] encodedPrivateKey = privateKey.getEncoded();
374
System.out.println("Encoded private: " +
375
HexFormat.of().withUpperCase().formatHex(encodedPrivateKey));
376
System.out.println(HexPrinter.simple()
377
.formatter(ASN1Formatter.formatter())
378
.toString(encodedPrivateKey));
379
byte[] encodedPublicKey = publicKey.getEncoded();
380
System.out.println("Encoded public: " +
381
HexFormat.of().withUpperCase().formatHex(encodedPublicKey));
382
System.out.println(HexPrinter.simple()
383
.formatter(ASN1Formatter.formatter())
384
.toString(encodedPublicKey));
385
KeyAgreement ka = KeyAgreement.getInstance("XDH");
386
ka.init(privateKey);
387
ka.doPhase(publicKey, true);
388
389
byte[] sharedSecret = ka.generateSecret();
390
byte[] expectedResult = HexFormat.of().parseHex(result);
391
if (!Arrays.equals(sharedSecret, expectedResult)) {
392
throw new RuntimeException("fail: expected=" + result + ", actual="
393
+ HexFormat.of().withUpperCase().formatHex(sharedSecret));
394
}
395
}
396
397
/*
398
* Ensure that SunEC rejects parameters/points for the wrong curve
399
* when the algorithm ID for a specific curve is specified.
400
*/
401
private static void runCurveMixTest() throws Exception {
402
runCurveMixTest("SunEC", "X25519", 448);
403
runCurveMixTest("SunEC", "X25519", "X448");
404
runCurveMixTest("SunEC", "X448", 255);
405
runCurveMixTest("SunEC", "X448", "X25519");
406
}
407
408
private static void runCurveMixTest(String providerName, String name,
409
Object param) throws Exception {
410
411
KeyPairGenerator kpg = KeyPairGenerator.getInstance(name,
412
providerName);
413
414
try {
415
if (param instanceof Integer) {
416
kpg.initialize((Integer) param);
417
} else if (param instanceof String) {
418
kpg.initialize(new NamedParameterSpec((String) param));
419
}
420
throw new RuntimeException(name + " KeyPairGenerator accepted "
421
+ param.toString() + " parameters");
422
} catch (InvalidParameterException ex) {
423
// expected
424
}
425
426
// the rest of the test uses the parameter as an algorithm name to
427
// produce keys
428
if (param instanceof Integer) {
429
return;
430
}
431
String otherName = (String) param;
432
KeyPairGenerator otherKpg = KeyPairGenerator.getInstance(otherName,
433
providerName);
434
KeyPair otherKp = otherKpg.generateKeyPair();
435
436
// ensure the KeyFactory rejects incorrect keys
437
KeyFactory kf = KeyFactory.getInstance(name, providerName);
438
try {
439
kf.getKeySpec(otherKp.getPublic(), XECPublicKeySpec.class);
440
throw new RuntimeException(name + " KeyFactory accepted "
441
+ param.toString() + " key");
442
} catch (InvalidKeySpecException ex) {
443
// expected
444
}
445
try {
446
kf.getKeySpec(otherKp.getPrivate(), XECPrivateKeySpec.class);
447
throw new RuntimeException(name + " KeyFactory accepted "
448
+ param.toString() + " key");
449
} catch (InvalidKeySpecException ex) {
450
// expected
451
}
452
453
try {
454
kf.translateKey(otherKp.getPublic());
455
throw new RuntimeException(name + " KeyFactory accepted "
456
+ param.toString() + " key");
457
} catch (InvalidKeyException ex) {
458
// expected
459
}
460
try {
461
kf.translateKey(otherKp.getPrivate());
462
throw new RuntimeException(name + " KeyFactory accepted "
463
+ param.toString() + " key");
464
} catch (InvalidKeyException ex) {
465
// expected
466
}
467
468
KeyFactory otherKf = KeyFactory.getInstance(otherName, providerName);
469
XECPublicKeySpec otherPubSpec = otherKf.getKeySpec(otherKp.getPublic(),
470
XECPublicKeySpec.class);
471
try {
472
kf.generatePublic(otherPubSpec);
473
throw new RuntimeException(name + " KeyFactory accepted "
474
+ param.toString() + " key");
475
} catch (InvalidKeySpecException ex) {
476
// expected
477
}
478
XECPrivateKeySpec otherPriSpec =
479
otherKf.getKeySpec(otherKp.getPrivate(), XECPrivateKeySpec.class);
480
try {
481
kf.generatePrivate(otherPriSpec);
482
throw new RuntimeException(name + " KeyFactory accepted "
483
+ param.toString() + " key");
484
} catch (InvalidKeySpecException ex) {
485
// expected
486
}
487
488
// ensure the KeyAgreement rejects incorrect keys
489
KeyAgreement ka = KeyAgreement.getInstance(name, providerName);
490
try {
491
ka.init(otherKp.getPrivate());
492
throw new RuntimeException(name + " KeyAgreement accepted "
493
+ param.toString() + " key");
494
} catch (InvalidKeyException ex) {
495
// expected
496
}
497
KeyPair kp = kpg.generateKeyPair();
498
ka.init(kp.getPrivate());
499
try {
500
// This should always be rejected because it doesn't match the key
501
// passed to init, but it is tested here for good measure.
502
ka.doPhase(otherKp.getPublic(), true);
503
throw new RuntimeException(name + " KeyAgreement accepted "
504
+ param.toString() + " key");
505
} catch (InvalidKeyException ex) {
506
// expected
507
}
508
}
509
}
510
511
512