8318096: Introduce AsymmetricKey interface with a getParams method

Reviewed-by: darcy, mullan, ascarpino
This commit is contained in:
Weijun Wang 2023-10-26 22:43:06 +00:00
parent 4a142c3b08
commit 9123961aaa
18 changed files with 313 additions and 20 deletions

View File

@ -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;
}
}

View File

@ -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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -57,7 +57,7 @@ package java.security;
* @since 1.1 * @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 // Declare serialVersionUID to be compatible with JDK1.1
/** /**

View File

@ -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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * 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 // Declare serialVersionUID to be compatible with JDK1.1
/** /**
* The class fingerprint that is set to indicate serialization * The class fingerprint that is set to indicate serialization

View File

@ -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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -26,6 +26,7 @@
package java.security.interfaces; package java.security.interfaces;
import java.math.BigInteger; import java.math.BigInteger;
import java.security.spec.AlgorithmParameterSpec;
/** /**
* Interface to a DSA-specific set of key parameters, which defines a * Interface to a DSA-specific set of key parameters, which defines a
@ -40,7 +41,7 @@ import java.math.BigInteger;
* @author Josh Bloch * @author Josh Bloch
* @since 1.1 * @since 1.1
*/ */
public interface DSAParams { public interface DSAParams extends AlgorithmParameterSpec {
/** /**
* Returns the prime, {@code p}. * Returns the prime, {@code p}.

View File

@ -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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * 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}. * @return the value of the private key, {@code x}.
*/ */
BigInteger getX(); 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;
}
} }

View File

@ -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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * 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}. * @return the value of the public key, {@code y}.
*/ */
BigInteger getY(); 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;
}
} }

View File

@ -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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * 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.math.BigInteger;
import java.security.PrivateKey; import java.security.PrivateKey;
import java.security.spec.ECParameterSpec;
/** /**
* The interface to an elliptic curve (EC) private key. * The interface to an elliptic curve (EC) private key.
@ -56,4 +57,18 @@ public interface ECPrivateKey extends PrivateKey, ECKey {
* @return the private value S. * @return the private value S.
*/ */
BigInteger getS(); 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;
}
} }

View File

@ -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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -25,6 +25,7 @@
package java.security.interfaces; package java.security.interfaces;
import java.security.PublicKey; import java.security.PublicKey;
import java.security.spec.ECParameterSpec;
import java.security.spec.ECPoint; import java.security.spec.ECPoint;
/** /**
@ -58,4 +59,18 @@ public interface ECPublicKey extends PublicKey, ECKey {
* @return the public point W. * @return the public point W.
*/ */
ECPoint getW(); 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;
}
} }

View File

@ -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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -25,6 +25,7 @@
package java.security.interfaces; package java.security.interfaces;
import java.security.PrivateKey; import java.security.PrivateKey;
import java.security.spec.NamedParameterSpec;
import java.util.Optional; 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}. * If the key is not available, then an empty {@code Optional}.
*/ */
Optional<byte[]> getBytes(); Optional<byte[]> 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;
}
} }

View File

@ -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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * 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.PublicKey;
import java.security.spec.EdECPoint; import java.security.spec.EdECPoint;
import java.security.spec.NamedParameterSpec;
/** /**
* An interface for an elliptic curve public key as defined by * 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. * @return the {@code EdECPoint} representing the public key.
*/ */
EdECPoint getPoint(); 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;
}
} }

View File

@ -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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -26,6 +26,7 @@
package java.security.interfaces; package java.security.interfaces;
import java.math.BigInteger; import java.math.BigInteger;
import java.security.spec.AlgorithmParameterSpec;
/** /**
* The interface to an RSA private key. * The interface to an RSA private key.
@ -59,4 +60,18 @@ public interface RSAPrivateKey extends java.security.PrivateKey, RSAKey
* @return the private exponent * @return the private exponent
*/ */
BigInteger getPrivateExponent(); 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;
}
} }

View File

@ -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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -26,6 +26,7 @@
package java.security.interfaces; package java.security.interfaces;
import java.math.BigInteger; import java.math.BigInteger;
import java.security.spec.AlgorithmParameterSpec;
/** /**
* The interface to an RSA public key. * The interface to an RSA public key.
@ -56,4 +57,18 @@ public interface RSAPublicKey extends java.security.PublicKey, RSAKey
* @return the public exponent * @return the public exponent
*/ */
BigInteger getPublicExponent(); 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;
}
} }

View File

@ -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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -25,6 +25,7 @@
package java.security.interfaces; package java.security.interfaces;
import java.security.PrivateKey; import java.security.PrivateKey;
import java.security.spec.AlgorithmParameterSpec;
import java.util.Optional; 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). * and the private key is not allowed to leave the crypto boundary).
*/ */
Optional<byte[]> getScalar(); Optional<byte[]> 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;
}
} }

View File

@ -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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * 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.math.BigInteger;
import java.security.PublicKey; import java.security.PublicKey;
import java.security.spec.AlgorithmParameterSpec;
/** /**
* An interface for an elliptic curve public key as defined by RFC 7748. * 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(); 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;
}
} }

View File

@ -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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -25,6 +25,7 @@
package javax.crypto.interfaces; package javax.crypto.interfaces;
import javax.crypto.spec.DHParameterSpec;
import java.math.BigInteger; import java.math.BigInteger;
/** /**
@ -56,4 +57,18 @@ public interface DHPrivateKey extends DHKey, java.security.PrivateKey {
* @return the private value, <code>x</code> * @return the private value, <code>x</code>
*/ */
BigInteger getX(); 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;
}
} }

View File

@ -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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -25,6 +25,7 @@
package javax.crypto.interfaces; package javax.crypto.interfaces;
import javax.crypto.spec.DHParameterSpec;
import java.math.BigInteger; import java.math.BigInteger;
/** /**
@ -56,4 +57,18 @@ public interface DHPublicKey extends DHKey, java.security.PublicKey {
* @return the public value, <code>y</code> * @return the public value, <code>y</code>
*/ */
BigInteger getY(); 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;
}
} }

View File

@ -899,7 +899,8 @@ abstract class P11Key implements Key, Length {
params = new DSAParameterSpec(res[0], res[1], res[2]); params = new DSAParameterSpec(res[0], res[1], res[2]);
} }
protected DSAParams getParams() { @Override
public DSAParams getParams() {
fetchValues(); fetchValues();
return params; return params;
} }
@ -1202,7 +1203,8 @@ abstract class P11Key implements Key, Length {
} }
} }
protected ECParameterSpec getParams() { @Override
public ECParameterSpec getParams() {
fetchValues(); fetchValues();
return params; return params;
} }

View File

@ -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<? extends AlgorithmParameterSpec> 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()));
}
}