From 9123961aaa47aa58ec436640590d2cceedb8cbb1 Mon Sep 17 00:00:00 2001 From: Weijun Wang Date: Thu, 26 Oct 2023 22:43:06 +0000 Subject: [PATCH] 8318096: Introduce AsymmetricKey interface with a getParams method Reviewed-by: darcy, mullan, ascarpino --- .../classes/java/security/AsymmetricKey.java | 52 ++++++++++++++++ .../classes/java/security/PrivateKey.java | 4 +- .../classes/java/security/PublicKey.java | 4 +- .../java/security/interfaces/DSAParams.java | 5 +- .../security/interfaces/DSAPrivateKey.java | 16 ++++- .../security/interfaces/DSAPublicKey.java | 16 ++++- .../security/interfaces/ECPrivateKey.java | 17 +++++- .../java/security/interfaces/ECPublicKey.java | 17 +++++- .../security/interfaces/EdECPrivateKey.java | 17 +++++- .../security/interfaces/EdECPublicKey.java | 17 +++++- .../security/interfaces/RSAPrivateKey.java | 17 +++++- .../security/interfaces/RSAPublicKey.java | 17 +++++- .../security/interfaces/XECPrivateKey.java | 17 +++++- .../security/interfaces/XECPublicKey.java | 16 ++++- .../javax/crypto/interfaces/DHPrivateKey.java | 17 +++++- .../javax/crypto/interfaces/DHPublicKey.java | 17 +++++- .../classes/sun/security/pkcs11/P11Key.java | 6 +- .../security/AsymmetricKey/GetParams.java | 61 +++++++++++++++++++ 18 files changed, 313 insertions(+), 20 deletions(-) create mode 100644 src/java.base/share/classes/java/security/AsymmetricKey.java create mode 100644 test/jdk/java/security/AsymmetricKey/GetParams.java diff --git a/src/java.base/share/classes/java/security/AsymmetricKey.java b/src/java.base/share/classes/java/security/AsymmetricKey.java new file mode 100644 index 00000000000..e96aeb4d84c --- /dev/null +++ b/src/java.base/share/classes/java/security/AsymmetricKey.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package java.security; + +import java.security.spec.AlgorithmParameterSpec; + +/** + * An asymmetric key, which can be either a public key or a private key. + * This interface contains methods that are common to either a public key or + * a private key. + * + * @since 22 + */ +public interface AsymmetricKey extends Key { + /** + * Returns the parameters associated with this key. + * The parameters are optional and may be either + * explicitly specified or implicitly created during + * key pair generation. + * + * @implSpec + * The default implementation returns {@code null}. + * + * @return the associated parameters, may be {@code null} + */ + default AlgorithmParameterSpec getParams() { + return null; + } +} diff --git a/src/java.base/share/classes/java/security/PrivateKey.java b/src/java.base/share/classes/java/security/PrivateKey.java index 5d15278cd48..045670ca008 100644 --- a/src/java.base/share/classes/java/security/PrivateKey.java +++ b/src/java.base/share/classes/java/security/PrivateKey.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2023, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -57,7 +57,7 @@ package java.security; * @since 1.1 */ -public interface PrivateKey extends Key, javax.security.auth.Destroyable { +public interface PrivateKey extends AsymmetricKey, javax.security.auth.Destroyable { // Declare serialVersionUID to be compatible with JDK1.1 /** diff --git a/src/java.base/share/classes/java/security/PublicKey.java b/src/java.base/share/classes/java/security/PublicKey.java index c44d0e7a2d9..e93efaf1c5b 100644 --- a/src/java.base/share/classes/java/security/PublicKey.java +++ b/src/java.base/share/classes/java/security/PublicKey.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2023, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -44,7 +44,7 @@ package java.security; * */ -public interface PublicKey extends Key { +public interface PublicKey extends AsymmetricKey { // Declare serialVersionUID to be compatible with JDK1.1 /** * The class fingerprint that is set to indicate serialization diff --git a/src/java.base/share/classes/java/security/interfaces/DSAParams.java b/src/java.base/share/classes/java/security/interfaces/DSAParams.java index c2572e984d7..020709dcc52 100644 --- a/src/java.base/share/classes/java/security/interfaces/DSAParams.java +++ b/src/java.base/share/classes/java/security/interfaces/DSAParams.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2023, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,6 +26,7 @@ package java.security.interfaces; import java.math.BigInteger; +import java.security.spec.AlgorithmParameterSpec; /** * Interface to a DSA-specific set of key parameters, which defines a @@ -40,7 +41,7 @@ import java.math.BigInteger; * @author Josh Bloch * @since 1.1 */ -public interface DSAParams { +public interface DSAParams extends AlgorithmParameterSpec { /** * Returns the prime, {@code p}. diff --git a/src/java.base/share/classes/java/security/interfaces/DSAPrivateKey.java b/src/java.base/share/classes/java/security/interfaces/DSAPrivateKey.java index a9682cd5e89..ea842b6e12e 100644 --- a/src/java.base/share/classes/java/security/interfaces/DSAPrivateKey.java +++ b/src/java.base/share/classes/java/security/interfaces/DSAPrivateKey.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -62,4 +62,18 @@ public interface DSAPrivateKey extends DSAKey, java.security.PrivateKey { * @return the value of the private key, {@code x}. */ BigInteger getX(); + + /** + * {@inheritDoc java.security.AsymmetricKey} + * + * @implSpec + * The default implementation returns {@code null}. + * + * @return {@inheritDoc java.security.AsymmetricKey} + * @since 22 + */ + @Override + default DSAParams getParams() { + return null; + } } diff --git a/src/java.base/share/classes/java/security/interfaces/DSAPublicKey.java b/src/java.base/share/classes/java/security/interfaces/DSAPublicKey.java index 5b05ed09b50..9ddf6d8406f 100644 --- a/src/java.base/share/classes/java/security/interfaces/DSAPublicKey.java +++ b/src/java.base/share/classes/java/security/interfaces/DSAPublicKey.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2023, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -62,4 +62,18 @@ public interface DSAPublicKey extends DSAKey, java.security.PublicKey { * @return the value of the public key, {@code y}. */ BigInteger getY(); + + /** + * {@inheritDoc java.security.AsymmetricKey} + * + * @implSpec + * The default implementation returns {@code null}. + * + * @return {@inheritDoc java.security.AsymmetricKey} + * @since 22 + */ + @Override + default DSAParams getParams() { + return null; + } } diff --git a/src/java.base/share/classes/java/security/interfaces/ECPrivateKey.java b/src/java.base/share/classes/java/security/interfaces/ECPrivateKey.java index 2dca546978d..1694f46d4ab 100644 --- a/src/java.base/share/classes/java/security/interfaces/ECPrivateKey.java +++ b/src/java.base/share/classes/java/security/interfaces/ECPrivateKey.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2023, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,6 +26,7 @@ package java.security.interfaces; import java.math.BigInteger; import java.security.PrivateKey; +import java.security.spec.ECParameterSpec; /** * The interface to an elliptic curve (EC) private key. @@ -56,4 +57,18 @@ public interface ECPrivateKey extends PrivateKey, ECKey { * @return the private value S. */ BigInteger getS(); + + /** + * {@inheritDoc java.security.AsymmetricKey} + * + * @implSpec + * The default implementation returns {@code null}. + * + * @return {@inheritDoc java.security.AsymmetricKey} + * @since 22 + */ + @Override + default ECParameterSpec getParams() { + return null; + } } diff --git a/src/java.base/share/classes/java/security/interfaces/ECPublicKey.java b/src/java.base/share/classes/java/security/interfaces/ECPublicKey.java index 4fec62eb3df..5e8efb90db5 100644 --- a/src/java.base/share/classes/java/security/interfaces/ECPublicKey.java +++ b/src/java.base/share/classes/java/security/interfaces/ECPublicKey.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2023, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,6 +25,7 @@ package java.security.interfaces; import java.security.PublicKey; +import java.security.spec.ECParameterSpec; import java.security.spec.ECPoint; /** @@ -58,4 +59,18 @@ public interface ECPublicKey extends PublicKey, ECKey { * @return the public point W. */ ECPoint getW(); + + /** + * {@inheritDoc java.security.AsymmetricKey} + * + * @implSpec + * The default implementation returns {@code null}. + * + * @return {@inheritDoc java.security.AsymmetricKey} + * @since 22 + */ + @Override + default ECParameterSpec getParams() { + return null; + } } diff --git a/src/java.base/share/classes/java/security/interfaces/EdECPrivateKey.java b/src/java.base/share/classes/java/security/interfaces/EdECPrivateKey.java index 826b52650ea..b3522fec4fe 100644 --- a/src/java.base/share/classes/java/security/interfaces/EdECPrivateKey.java +++ b/src/java.base/share/classes/java/security/interfaces/EdECPrivateKey.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,6 +25,7 @@ package java.security.interfaces; import java.security.PrivateKey; +import java.security.spec.NamedParameterSpec; import java.util.Optional; /** @@ -52,4 +53,18 @@ public interface EdECPrivateKey extends EdECKey, PrivateKey { * If the key is not available, then an empty {@code Optional}. */ Optional getBytes(); + + /** + * {@inheritDoc java.security.AsymmetricKey} + * + * @implSpec + * The default implementation returns {@code null}. + * + * @return {@inheritDoc java.security.AsymmetricKey} + * @since 22 + */ + @Override + default NamedParameterSpec getParams() { + return null; + } } diff --git a/src/java.base/share/classes/java/security/interfaces/EdECPublicKey.java b/src/java.base/share/classes/java/security/interfaces/EdECPublicKey.java index d2e26411651..664e76b6971 100644 --- a/src/java.base/share/classes/java/security/interfaces/EdECPublicKey.java +++ b/src/java.base/share/classes/java/security/interfaces/EdECPublicKey.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,6 +26,7 @@ package java.security.interfaces; import java.security.PublicKey; import java.security.spec.EdECPoint; +import java.security.spec.NamedParameterSpec; /** * An interface for an elliptic curve public key as defined by @@ -47,4 +48,18 @@ public interface EdECPublicKey extends EdECKey, PublicKey { * @return the {@code EdECPoint} representing the public key. */ EdECPoint getPoint(); + + /** + * {@inheritDoc java.security.AsymmetricKey} + * + * @implSpec + * The default implementation returns {@code null}. + * + * @return {@inheritDoc java.security.AsymmetricKey} + * @since 22 + */ + @Override + default NamedParameterSpec getParams() { + return null; + } } diff --git a/src/java.base/share/classes/java/security/interfaces/RSAPrivateKey.java b/src/java.base/share/classes/java/security/interfaces/RSAPrivateKey.java index 9d7823c84c1..6e4ea536e32 100644 --- a/src/java.base/share/classes/java/security/interfaces/RSAPrivateKey.java +++ b/src/java.base/share/classes/java/security/interfaces/RSAPrivateKey.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2023, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,6 +26,7 @@ package java.security.interfaces; import java.math.BigInteger; +import java.security.spec.AlgorithmParameterSpec; /** * The interface to an RSA private key. @@ -59,4 +60,18 @@ public interface RSAPrivateKey extends java.security.PrivateKey, RSAKey * @return the private exponent */ BigInteger getPrivateExponent(); + + /** + * {@inheritDoc java.security.AsymmetricKey} + * + * @implSpec + * The default implementation returns {@code null}. + * + * @return {@inheritDoc java.security.AsymmetricKey} + * @since 22 + */ + @Override + default AlgorithmParameterSpec getParams() { + return null; + } } diff --git a/src/java.base/share/classes/java/security/interfaces/RSAPublicKey.java b/src/java.base/share/classes/java/security/interfaces/RSAPublicKey.java index cd1c44393f9..2e1d89723e4 100644 --- a/src/java.base/share/classes/java/security/interfaces/RSAPublicKey.java +++ b/src/java.base/share/classes/java/security/interfaces/RSAPublicKey.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2023, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,6 +26,7 @@ package java.security.interfaces; import java.math.BigInteger; +import java.security.spec.AlgorithmParameterSpec; /** * The interface to an RSA public key. @@ -56,4 +57,18 @@ public interface RSAPublicKey extends java.security.PublicKey, RSAKey * @return the public exponent */ BigInteger getPublicExponent(); + + /** + * {@inheritDoc java.security.AsymmetricKey} + * + * @implSpec + * The default implementation returns {@code null}. + * + * @return {@inheritDoc java.security.AsymmetricKey} + * @since 22 + */ + @Override + default AlgorithmParameterSpec getParams() { + return null; + } } diff --git a/src/java.base/share/classes/java/security/interfaces/XECPrivateKey.java b/src/java.base/share/classes/java/security/interfaces/XECPrivateKey.java index 547677786ae..b555f587fb6 100644 --- a/src/java.base/share/classes/java/security/interfaces/XECPrivateKey.java +++ b/src/java.base/share/classes/java/security/interfaces/XECPrivateKey.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,6 +25,7 @@ package java.security.interfaces; import java.security.PrivateKey; +import java.security.spec.AlgorithmParameterSpec; import java.util.Optional; /** @@ -53,5 +54,19 @@ public interface XECPrivateKey extends XECKey, PrivateKey { * and the private key is not allowed to leave the crypto boundary). */ Optional getScalar(); + + /** + * {@inheritDoc java.security.AsymmetricKey} + * + * @implSpec + * The default implementation returns {@code null}. + * + * @return {@inheritDoc java.security.AsymmetricKey} + * @since 22 + */ + @Override + default AlgorithmParameterSpec getParams() { + return null; + } } diff --git a/src/java.base/share/classes/java/security/interfaces/XECPublicKey.java b/src/java.base/share/classes/java/security/interfaces/XECPublicKey.java index 6ec200beeb9..6b1806df0eb 100644 --- a/src/java.base/share/classes/java/security/interfaces/XECPublicKey.java +++ b/src/java.base/share/classes/java/security/interfaces/XECPublicKey.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,6 +26,7 @@ package java.security.interfaces; import java.math.BigInteger; import java.security.PublicKey; +import java.security.spec.AlgorithmParameterSpec; /** * An interface for an elliptic curve public key as defined by RFC 7748. @@ -52,5 +53,18 @@ public interface XECPublicKey extends XECKey, PublicKey { */ BigInteger getU(); + /** + * {@inheritDoc java.security.AsymmetricKey} + * + * @implSpec + * The default implementation returns {@code null}. + * + * @return {@inheritDoc java.security.AsymmetricKey} + * @since 22 + */ + @Override + default AlgorithmParameterSpec getParams() { + return null; + } } diff --git a/src/java.base/share/classes/javax/crypto/interfaces/DHPrivateKey.java b/src/java.base/share/classes/javax/crypto/interfaces/DHPrivateKey.java index 67deb7245a1..fb7d2f83108 100644 --- a/src/java.base/share/classes/javax/crypto/interfaces/DHPrivateKey.java +++ b/src/java.base/share/classes/javax/crypto/interfaces/DHPrivateKey.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,6 +25,7 @@ package javax.crypto.interfaces; +import javax.crypto.spec.DHParameterSpec; import java.math.BigInteger; /** @@ -56,4 +57,18 @@ public interface DHPrivateKey extends DHKey, java.security.PrivateKey { * @return the private value, x */ BigInteger getX(); + + /** + * {@inheritDoc java.security.AsymmetricKey} + * + * @implSpec + * The default implementation returns {@code null}. + * + * @return {@inheritDoc java.security.AsymmetricKey} + * @since 22 + */ + @Override + default DHParameterSpec getParams() { + return null; + } } diff --git a/src/java.base/share/classes/javax/crypto/interfaces/DHPublicKey.java b/src/java.base/share/classes/javax/crypto/interfaces/DHPublicKey.java index f0799bcc402..8785b8dfec8 100644 --- a/src/java.base/share/classes/javax/crypto/interfaces/DHPublicKey.java +++ b/src/java.base/share/classes/javax/crypto/interfaces/DHPublicKey.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,6 +25,7 @@ package javax.crypto.interfaces; +import javax.crypto.spec.DHParameterSpec; import java.math.BigInteger; /** @@ -56,4 +57,18 @@ public interface DHPublicKey extends DHKey, java.security.PublicKey { * @return the public value, y */ BigInteger getY(); + + /** + * {@inheritDoc java.security.AsymmetricKey} + * + * @implSpec + * The default implementation returns {@code null}. + * + * @return {@inheritDoc java.security.AsymmetricKey} + * @since 22 + */ + @Override + default DHParameterSpec getParams() { + return null; + } } diff --git a/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/P11Key.java b/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/P11Key.java index 6d0e7f7353e..4406a77eafe 100644 --- a/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/P11Key.java +++ b/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/P11Key.java @@ -899,7 +899,8 @@ abstract class P11Key implements Key, Length { params = new DSAParameterSpec(res[0], res[1], res[2]); } - protected DSAParams getParams() { + @Override + public DSAParams getParams() { fetchValues(); return params; } @@ -1202,7 +1203,8 @@ abstract class P11Key implements Key, Length { } } - protected ECParameterSpec getParams() { + @Override + public ECParameterSpec getParams() { fetchValues(); return params; } diff --git a/test/jdk/java/security/AsymmetricKey/GetParams.java b/test/jdk/java/security/AsymmetricKey/GetParams.java new file mode 100644 index 00000000000..5864ddc2e2c --- /dev/null +++ b/test/jdk/java/security/AsymmetricKey/GetParams.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import jdk.test.lib.Asserts; + +import javax.crypto.spec.DHParameterSpec; +import java.security.KeyPair; +import java.security.KeyPairGenerator; +import java.security.interfaces.DSAParams; +import java.security.spec.AlgorithmParameterSpec; +import java.security.spec.ECParameterSpec; +import java.security.spec.NamedParameterSpec; + +/** + * @test + * @bug 8318096 + * @summary Introduce AsymmetricKey interface with a getParams method + * @library /test/lib + */ + +public class GetParams { + public static void main(String[] args) throws Exception { + test("DSA", DSAParams.class); + test("RSA", AlgorithmParameterSpec.class); + test("RSASSA-PSS", AlgorithmParameterSpec.class); + test("EC", ECParameterSpec.class); + test("DH", DHParameterSpec.class); + test("EdDSA", NamedParameterSpec.class); + test("XDH", NamedParameterSpec.class); + } + + static void test(String alg, Class clazz) + throws Exception { + KeyPairGenerator g = KeyPairGenerator.getInstance(alg); + KeyPair kp = g.generateKeyPair(); + AlgorithmParameterSpec spec1 = kp.getPrivate().getParams(); + Asserts.assertTrue(spec1 == null || clazz.isAssignableFrom(spec1.getClass())); + AlgorithmParameterSpec spec2 = kp.getPublic().getParams(); + Asserts.assertTrue(spec2 == null || clazz.isAssignableFrom(spec2.getClass())); + } +}