6995421: Eliminate the static dependency to sun.security.ec.ECKeyFactory
authormullan
Thu, 30 Aug 2012 14:40:57 -0700
changeset 13661 7c894680910a
parent 13659 18f4e55bb34b
child 13662 2c0ad4f2168c
6995421: Eliminate the static dependency to sun.security.ec.ECKeyFactory Reviewed-by: mullan, vinnie Contributed-by: stephen.flores@oracle.com
jdk/make/sun/security/ec/Makefile
jdk/make/sun/security/other/Makefile
jdk/src/share/classes/sun/security/ec/ECKeyFactory.java
jdk/src/share/classes/sun/security/ec/ECParameters.java
jdk/src/share/classes/sun/security/ec/ECPublicKeyImpl.java
jdk/src/share/classes/sun/security/ec/SunECEntries.java
jdk/src/share/classes/sun/security/pkcs11/P11ECKeyFactory.java
jdk/src/share/classes/sun/security/x509/AlgorithmId.java
jdk/test/sun/security/ec/TestEC.java
jdk/test/sun/security/pkcs11/ec/ReadCertificates.java
jdk/test/sun/security/pkcs11/ec/ReadPKCS12.java
jdk/test/sun/security/pkcs11/ec/TestECDH.java
jdk/test/sun/security/pkcs11/ec/TestECDSA.java
--- 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).");
     }