# HG changeset patch # User mullan # Date 1346362857 25200 # Node ID 7c894680910a3616444b770fbdbd7e78f9a6f108 # Parent 18f4e55bb34b81847c544f09c1dd8391f9ea1257 6995421: Eliminate the static dependency to sun.security.ec.ECKeyFactory Reviewed-by: mullan, vinnie Contributed-by: stephen.flores@oracle.com diff -r 18f4e55bb34b -r 7c894680910a jdk/make/sun/security/ec/Makefile --- 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 \ diff -r 18f4e55bb34b -r 7c894680910a jdk/make/sun/security/other/Makefile --- 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 \ diff -r 18f4e55bb34b -r 7c894680910a jdk/src/share/classes/sun/security/ec/ECKeyFactory.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() { - 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); } } diff -r 18f4e55bb34b -r 7c894680910a jdk/src/share/classes/sun/security/ec/ECParameters.java --- 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) { diff -r 18f4e55bb34b -r 7c894680910a jdk/src/share/classes/sun/security/ec/ECPublicKeyImpl.java --- 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) { diff -r 18f4e55bb34b -r 7c894680910a jdk/src/share/classes/sun/security/ec/SunECEntries.java --- 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"); diff -r 18f4e55bb34b -r 7c894680910a jdk/src/share/classes/sun/security/pkcs11/P11ECKeyFactory.java --- 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"); } } diff -r 18f4e55bb34b -r 7c894680910a jdk/src/share/classes/sun/security/x509/AlgorithmId.java --- 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()); } diff -r 18f4e55bb34b -r 7c894680910a jdk/test/sun/security/ec/TestEC.java --- 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(); diff -r 18f4e55bb34b -r 7c894680910a jdk/test/sun/security/pkcs11/ec/ReadCertificates.java --- 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"); } diff -r 18f4e55bb34b -r 7c894680910a jdk/test/sun/security/pkcs11/ec/ReadPKCS12.java --- 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"); } diff -r 18f4e55bb34b -r 7c894680910a jdk/test/sun/security/pkcs11/ec/TestECDH.java --- 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"); } diff -r 18f4e55bb34b -r 7c894680910a jdk/test/sun/security/pkcs11/ec/TestECDSA.java --- 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)."); }