changeset 8634:c84d183b30e0

6995421: Eliminate the static dependency to sun.security.ec.ECKeyFactory Reviewed-by: mullan, vinnie Contributed-by: stephen.flores@oracle.com
author mullan
date Fri, 03 Feb 2017 03:16:15 +0000
parents c55f541c7c13
children 68ad32c4a345
files make/sun/security/ec/Makefile make/sun/security/other/Makefile src/share/classes/sun/security/ec/ECKeyFactory.java src/share/classes/sun/security/ec/ECParameters.java src/share/classes/sun/security/ec/ECPublicKeyImpl.java src/share/classes/sun/security/ec/SunECEntries.java src/share/classes/sun/security/pkcs11/P11ECKeyFactory.java src/share/classes/sun/security/x509/AlgorithmId.java test/sun/security/ec/TestEC.java test/sun/security/pkcs11/ec/ReadCertificates.java test/sun/security/pkcs11/ec/ReadPKCS12.java test/sun/security/pkcs11/ec/TestECDH.java test/sun/security/pkcs11/ec/TestECDSA.java
diffstat 13 files changed, 62 insertions(+), 54 deletions(-) [+]
line wrap: on
line diff
--- a/make/sun/security/ec/Makefile	Fri Feb 03 02:48:43 2017 +0000
+++ b/make/sun/security/ec/Makefile	Fri Feb 03 03:16:15 2017 +0000
@@ -127,7 +127,6 @@
 # Exclude the sources that get built by ../other/Makefile
 #
 AUTO_JAVA_PRUNE = \
-    ECKeyFactory.java \
     ECParameters.java \
     ECPrivateKeyImpl.java \
     ECPublicKeyImpl.java \
--- a/make/sun/security/other/Makefile	Fri Feb 03 02:48:43 2017 +0000
+++ b/make/sun/security/other/Makefile	Fri Feb 03 03:16:15 2017 +0000
@@ -52,7 +52,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/src/share/classes/sun/security/ec/ECKeyFactory.java	Fri Feb 03 02:48:43 2017 +0000
+++ b/src/share/classes/sun/security/ec/ECKeyFactory.java	Fri Feb 03 03:16:15 2017 +0000
@@ -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;
+    // Used by translateKey()
+    private 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;
+    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);
+            }
+        }
 
-    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;
-            }
-        });
-        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/src/share/classes/sun/security/ec/ECParameters.java	Fri Feb 03 02:48:43 2017 +0000
+++ b/src/share/classes/sun/security/ec/ECParameters.java	Fri Feb 03 03:16:15 2017 +0000
@@ -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/src/share/classes/sun/security/ec/ECPublicKeyImpl.java	Fri Feb 03 02:48:43 2017 +0000
+++ b/src/share/classes/sun/security/ec/ECPublicKeyImpl.java	Fri Feb 03 03:16:15 2017 +0000
@@ -93,8 +93,13 @@
      * Parse the key. Called by X509Key.
      */
     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/src/share/classes/sun/security/ec/SunECEntries.java	Fri Feb 03 02:48:43 2017 +0000
+++ b/src/share/classes/sun/security/ec/SunECEntries.java	Fri Feb 03 03:16:15 2017 +0000
@@ -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/src/share/classes/sun/security/pkcs11/P11ECKeyFactory.java	Fri Feb 03 02:48:43 2017 +0000
+++ b/src/share/classes/sun/security/pkcs11/P11ECKeyFactory.java	Fri Feb 03 03:16:15 2017 +0000
@@ -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/src/share/classes/sun/security/x509/AlgorithmId.java	Fri Feb 03 02:48:43 2017 +0000
+++ b/src/share/classes/sun/security/x509/AlgorithmId.java	Fri Feb 03 03:16:15 2017 +0000
@@ -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/test/sun/security/ec/TestEC.java	Fri Feb 03 02:48:43 2017 +0000
+++ b/test/sun/security/ec/TestEC.java	Fri Feb 03 03:16:15 2017 +0000
@@ -33,6 +33,7 @@
  * @run main/othervm -Djdk.tls.namedGroups="secp256r1,sect193r1" TestEC
  */
 
+import java.security.NoSuchProviderException;
 import java.security.Provider;
 import java.security.Security;
 
@@ -67,7 +68,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/test/sun/security/pkcs11/ec/ReadCertificates.java	Fri Feb 03 02:48:43 2017 +0000
+++ b/test/sun/security/pkcs11/ec/ReadCertificates.java	Fri Feb 03 03:16:15 2017 +0000
@@ -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/test/sun/security/pkcs11/ec/ReadPKCS12.java	Fri Feb 03 02:48:43 2017 +0000
+++ b/test/sun/security/pkcs11/ec/ReadPKCS12.java	Fri Feb 03 03:16:15 2017 +0000
@@ -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/test/sun/security/pkcs11/ec/TestECDH.java	Fri Feb 03 02:48:43 2017 +0000
+++ b/test/sun/security/pkcs11/ec/TestECDH.java	Fri Feb 03 03:16:15 2017 +0000
@@ -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/test/sun/security/pkcs11/ec/TestECDSA.java	Fri Feb 03 02:48:43 2017 +0000
+++ b/test/sun/security/pkcs11/ec/TestECDSA.java	Fri Feb 03 03:16:15 2017 +0000
@@ -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).");
     }