6995421: Eliminate the static dependency to sun.security.ec.ECKeyFactory
Reviewed-by: mullan, vinnie
Contributed-by: stephen.flores@oracle.com
--- a/jdk/make/sun/security/ec/Makefile Thu Aug 30 12:55:40 2012 +0100
+++ b/jdk/make/sun/security/ec/Makefile Thu Aug 30 14:40:57 2012 -0700
@@ -128,7 +128,6 @@
# Exclude the sources that get built by ../other/Makefile
#
AUTO_JAVA_PRUNE = \
- ECKeyFactory.java \
ECParameters.java \
ECPrivateKeyImpl.java \
ECPublicKeyImpl.java \
--- a/jdk/make/sun/security/other/Makefile Thu Aug 30 12:55:40 2012 +0100
+++ b/jdk/make/sun/security/other/Makefile Thu Aug 30 14:40:57 2012 -0700
@@ -53,7 +53,6 @@
# EC classes used by the packages above
#
FILES_java += \
- sun/security/ec/ECKeyFactory.java \
sun/security/ec/ECParameters.java \
sun/security/ec/ECPrivateKeyImpl.java \
sun/security/ec/ECPublicKeyImpl.java \
--- a/jdk/src/share/classes/sun/security/ec/ECKeyFactory.java Thu Aug 30 12:55:40 2012 +0100
+++ b/jdk/src/share/classes/sun/security/ec/ECKeyFactory.java Thu Aug 30 14:40:57 2012 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 2012, 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
@@ -51,33 +51,21 @@
*/
public final class ECKeyFactory extends KeyFactorySpi {
- // Used by translateKey() and the SunPKCS11 provider
- public final static KeyFactory INSTANCE;
-
- // Internal provider object we can obtain the KeyFactory and
- // AlgorithmParameters from. Used by ECParameters and AlgorithmId.
- // This can go away once we have EC always available in the SUN provider.
- // Used by ECParameters and AlgorithmId.
- public final static Provider ecInternalProvider;
+ // Used by translateKey()
+ private static KeyFactory instance;
- static {
- final Provider p = new Provider("SunEC-Internal", 1.0d, null) {
- private static final long serialVersionUID = 970685700309471261L;
- };
- AccessController.doPrivileged(new PrivilegedAction<Void>() {
- public Void run() {
- p.put("KeyFactory.EC", "sun.security.ec.ECKeyFactory");
- p.put("AlgorithmParameters.EC", "sun.security.ec.ECParameters");
- p.put("Alg.Alias.AlgorithmParameters.1.2.840.10045.2.1", "EC");
- return null;
+ private static KeyFactory getInstance() {
+ if (instance == null) {
+ try {
+ instance = KeyFactory.getInstance("EC", "SunEC");
+ } catch (NoSuchProviderException e) {
+ throw new RuntimeException(e);
+ } catch (NoSuchAlgorithmException e) {
+ throw new RuntimeException(e);
}
- });
- try {
- INSTANCE = KeyFactory.getInstance("EC", p);
- } catch (NoSuchAlgorithmException e) {
- throw new RuntimeException(e);
}
- ecInternalProvider = p;
+
+ return instance;
}
public ECKeyFactory() {
@@ -102,7 +90,12 @@
checkKey(ecKey);
return ecKey;
} else {
- return (ECKey)INSTANCE.translateKey(key);
+ /*
+ * We don't call the engineTranslateKey method directly
+ * because KeyFactory.translateKey adds code to loop through
+ * all key factories.
+ */
+ return (ECKey)getInstance().translateKey(key);
}
}
--- a/jdk/src/share/classes/sun/security/ec/ECParameters.java Thu Aug 30 12:55:40 2012 +0100
+++ b/jdk/src/share/classes/sun/security/ec/ECParameters.java Thu Aug 30 14:40:57 2012 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 2012, 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
@@ -276,8 +276,8 @@
static AlgorithmParameters getAlgorithmParameters(ECParameterSpec spec)
throws InvalidKeyException {
try {
- AlgorithmParameters params = AlgorithmParameters.getInstance
- ("EC", ECKeyFactory.ecInternalProvider);
+ AlgorithmParameters params =
+ AlgorithmParameters.getInstance("EC", "SunEC");
params.init(spec);
return params;
} catch (GeneralSecurityException e) {
--- a/jdk/src/share/classes/sun/security/ec/ECPublicKeyImpl.java Thu Aug 30 12:55:40 2012 +0100
+++ b/jdk/src/share/classes/sun/security/ec/ECPublicKeyImpl.java Thu Aug 30 14:40:57 2012 -0700
@@ -96,8 +96,13 @@
*/
@SuppressWarnings("deprecation")
protected void parseKeyBits() throws InvalidKeyException {
+ AlgorithmParameters algParams = this.algid.getParameters();
+ if (algParams == null) {
+ throw new InvalidKeyException("EC domain parameters must be " +
+ "encoded in the algorithm identifier");
+ }
+
try {
- AlgorithmParameters algParams = this.algid.getParameters();
params = algParams.getParameterSpec(ECParameterSpec.class);
w = ECParameters.decodePoint(key, params.getCurve());
} catch (IOException e) {
--- a/jdk/src/share/classes/sun/security/ec/SunECEntries.java Thu Aug 30 12:55:40 2012 +0100
+++ b/jdk/src/share/classes/sun/security/ec/SunECEntries.java Thu Aug 30 14:40:57 2012 -0700
@@ -54,6 +54,7 @@
*/
map.put("AlgorithmParameters.EC", "sun.security.ec.ECParameters");
map.put("Alg.Alias.AlgorithmParameters.EllipticCurve", "EC");
+ map.put("Alg.Alias.AlgorithmParameters.1.2.840.10045.2.1", "EC");
map.put("AlgorithmParameters.EC KeySize", "256");
--- a/jdk/src/share/classes/sun/security/pkcs11/P11ECKeyFactory.java Thu Aug 30 12:55:40 2012 +0100
+++ b/jdk/src/share/classes/sun/security/pkcs11/P11ECKeyFactory.java Thu Aug 30 14:40:57 2012 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 2012, 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
@@ -304,7 +304,7 @@
}
KeyFactory implGetSoftwareFactory() throws GeneralSecurityException {
- return sun.security.ec.ECKeyFactory.INSTANCE;
+ return KeyFactory.getInstance("EC", "SunEC");
}
}
--- a/jdk/src/share/classes/sun/security/x509/AlgorithmId.java Thu Aug 30 12:55:40 2012 +0100
+++ b/jdk/src/share/classes/sun/security/x509/AlgorithmId.java Thu Aug 30 14:40:57 2012 -0700
@@ -120,21 +120,14 @@
try {
algParams = AlgorithmParameters.getInstance(algidString);
} catch (NoSuchAlgorithmException e) {
- try {
- // Try the internal EC code so that we can fully parse EC
- // keys even if the provider is not registered.
- // This code can go away once we have EC in the SUN provider.
- algParams = AlgorithmParameters.getInstance(algidString,
- sun.security.ec.ECKeyFactory.ecInternalProvider);
- } catch (NoSuchAlgorithmException ee) {
- /*
- * This algorithm parameter type is not supported, so we cannot
- * parse the parameters.
- */
- algParams = null;
- return;
- }
+ /*
+ * This algorithm parameter type is not supported, so we cannot
+ * parse the parameters.
+ */
+ algParams = null;
+ return;
}
+
// Decode (parse) the parameters
algParams.init(params.toByteArray());
}
--- a/jdk/test/sun/security/ec/TestEC.java Thu Aug 30 12:55:40 2012 +0100
+++ b/jdk/test/sun/security/ec/TestEC.java Thu Aug 30 14:40:57 2012 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, 2012, 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
@@ -33,6 +33,7 @@
* @run main TestEC
*/
+import java.security.NoSuchProviderException;
import java.security.Provider;
import java.security.Security;
@@ -62,7 +63,12 @@
}
public static void main0(String[] args) throws Exception {
- Provider p = new sun.security.ec.SunEC();
+ Provider p = Security.getProvider("SunEC");
+
+ if (p == null) {
+ throw new NoSuchProviderException("Can't get SunEC provider");
+ }
+
System.out.println("Running tests with " + p.getName() +
" provider...\n");
long start = System.currentTimeMillis();
--- a/jdk/test/sun/security/pkcs11/ec/ReadCertificates.java Thu Aug 30 12:55:40 2012 +0100
+++ b/jdk/test/sun/security/pkcs11/ec/ReadCertificates.java Thu Aug 30 14:40:57 2012 -0700
@@ -63,6 +63,10 @@
System.out.println("Provider does not support ECDSA, skipping...");
return;
}
+
+ /*
+ * PKCS11Test.main will remove this provider if needed
+ */
Providers.setAt(p, 1);
random = new SecureRandom();
@@ -132,7 +136,6 @@
}
}
- Security.removeProvider(p.getName());
System.out.println("OK");
}
--- a/jdk/test/sun/security/pkcs11/ec/ReadPKCS12.java Thu Aug 30 12:55:40 2012 +0100
+++ b/jdk/test/sun/security/pkcs11/ec/ReadPKCS12.java Thu Aug 30 14:40:57 2012 -0700
@@ -53,6 +53,10 @@
System.out.println("Provider does not support ECDSA, skipping...");
return;
}
+
+ /*
+ * PKCS11Test.main will remove this provider if needed
+ */
Providers.setAt(p, 1);
CertificateFactory factory = CertificateFactory.getInstance("X.509");
@@ -147,7 +151,6 @@
out.close();
}
- Security.removeProvider(p.getName());
System.out.println("OK");
}
--- a/jdk/test/sun/security/pkcs11/ec/TestECDH.java Thu Aug 30 12:55:40 2012 +0100
+++ b/jdk/test/sun/security/pkcs11/ec/TestECDH.java Thu Aug 30 14:40:57 2012 -0700
@@ -60,6 +60,10 @@
System.out.println("Provider does not support ECDH, skipping");
return;
}
+
+ /*
+ * PKCS11Test.main will remove this provider if needed
+ */
Providers.setAt(p, 1);
if (false) {
@@ -77,7 +81,6 @@
test(p, pub192a, priv192a, pub192b, priv192b, secret192);
test(p, pub163a, priv163a, pub163b, priv163b, secret163);
- Security.removeProvider(p.getName());
System.out.println("OK");
}
--- a/jdk/test/sun/security/pkcs11/ec/TestECDSA.java Thu Aug 30 12:55:40 2012 +0100
+++ b/jdk/test/sun/security/pkcs11/ec/TestECDSA.java Thu Aug 30 14:40:57 2012 -0700
@@ -116,6 +116,10 @@
System.out.println("ECDSA not supported, skipping");
return;
}
+
+ /*
+ * PKCS11Test.main will remove this provider if needed
+ */
Providers.setAt(provider, 1);
if (false) {
@@ -137,7 +141,6 @@
test(provider, pub521, priv521, sig521);
test(provider, pub571, priv571, sig571);
- Security.removeProvider(provider.getName());
long stop = System.currentTimeMillis();
System.out.println("All tests passed (" + (stop - start) + " ms).");
}