# HG changeset patch # User mullan # Date 1318528393 14400 # Node ID de98ed66757c5689ae12d828fd053d86dd6d2ebb # Parent 01689c7b34ac4cd213350d7e6a25c1c3707929ed# Parent f8a00c400655bbf8bfd086aaf176b8eecc596942 Merge diff -r 01689c7b34ac -r de98ed66757c jdk/src/share/classes/sun/security/pkcs11/Config.java --- a/jdk/src/share/classes/sun/security/pkcs11/Config.java Thu Oct 13 13:50:17 2011 -0400 +++ b/jdk/src/share/classes/sun/security/pkcs11/Config.java Thu Oct 13 13:53:13 2011 -0400 @@ -192,6 +192,11 @@ // works only for NSS providers created via the Secmod API private boolean nssUseSecmodTrust = false; + // Flag to indicate whether the X9.63 encoding for EC points shall be used + // (true) or whether that encoding shall be wrapped in an ASN.1 OctetString + // (false). + private boolean useEcX963Encoding = false; + private Config(String filename, InputStream in) throws IOException { if (in == null) { if (filename.startsWith("--")) { @@ -320,6 +325,10 @@ return nssUseSecmodTrust; } + boolean getUseEcX963Encoding() { + return useEcX963Encoding; + } + private static String expand(final String s) throws IOException { try { return PropertyExpander.expand(s); @@ -440,6 +449,8 @@ parseNSSArgs(word); } else if (word.equals("nssUseSecmodTrust")) { nssUseSecmodTrust = parseBooleanEntry(word); + } else if (word.equals("useEcX963Encoding")) { + useEcX963Encoding = parseBooleanEntry(word); } else { throw new ConfigurationException ("Unknown keyword '" + word + "', line " + st.lineno()); diff -r 01689c7b34ac -r de98ed66757c jdk/src/share/classes/sun/security/pkcs11/P11ECKeyFactory.java --- a/jdk/src/share/classes/sun/security/pkcs11/P11ECKeyFactory.java Thu Oct 13 13:50:17 2011 -0400 +++ b/jdk/src/share/classes/sun/security/pkcs11/P11ECKeyFactory.java Thu Oct 13 13:53:13 2011 -0400 @@ -203,14 +203,20 @@ private PublicKey generatePublic(ECPoint point, ECParameterSpec params) throws PKCS11Exception { byte[] encodedParams = ECParameters.encodeParameters(params); - byte[] encodedPoint = null; - DerValue pkECPoint = new DerValue(DerValue.tag_OctetString, - ECParameters.encodePoint(point, params.getCurve())); + byte[] encodedPoint = + ECParameters.encodePoint(point, params.getCurve()); - try { - encodedPoint = pkECPoint.toByteArray(); - } catch (IOException e) { - throw new IllegalArgumentException("Could not DER encode point", e); + // Check whether the X9.63 encoding of an EC point shall be wrapped + // in an ASN.1 OCTET STRING + if (!token.config.getUseEcX963Encoding()) { + try { + encodedPoint = + new DerValue(DerValue.tag_OctetString, encodedPoint) + .toByteArray(); + } catch (IOException e) { + throw new + IllegalArgumentException("Could not DER encode point", e); + } } CK_ATTRIBUTE[] attributes = new CK_ATTRIBUTE[] { diff -r 01689c7b34ac -r de98ed66757c jdk/src/share/classes/sun/security/pkcs11/P11Key.java --- a/jdk/src/share/classes/sun/security/pkcs11/P11Key.java Thu Oct 13 13:50:17 2011 -0400 +++ b/jdk/src/share/classes/sun/security/pkcs11/P11Key.java Thu Oct 13 13:53:13 2011 -0400 @@ -1028,28 +1028,21 @@ try { params = P11ECKeyFactory.decodeParameters (attributes[1].getByteArray()); - - /* - * An uncompressed EC point may be in either of two formats. - * First try the OCTET STRING encoding: - * 04 04 - * - * Otherwise try the raw encoding: - * 04 - */ byte[] ecKey = attributes[0].getByteArray(); - try { + // Check whether the X9.63 encoding of an EC point is wrapped + // in an ASN.1 OCTET STRING + if (!token.config.getUseEcX963Encoding()) { DerValue wECPoint = new DerValue(ecKey); - if (wECPoint.getTag() != DerValue.tag_OctetString) - throw new IOException("Unexpected tag: " + - wECPoint.getTag()); + if (wECPoint.getTag() != DerValue.tag_OctetString) { + throw new IOException("Could not DER decode EC point." + + " Unexpected tag: " + wECPoint.getTag()); + } w = P11ECKeyFactory.decodePoint (wECPoint.getDataBytes(), params.getCurve()); - } catch (IOException e) { - // Failover + } else { w = P11ECKeyFactory.decodePoint(ecKey, params.getCurve()); } diff -r 01689c7b34ac -r de98ed66757c jdk/src/share/classes/sun/util/LocaleServiceProviderPool.java --- a/jdk/src/share/classes/sun/util/LocaleServiceProviderPool.java Thu Oct 13 13:50:17 2011 -0400 +++ b/jdk/src/share/classes/sun/util/LocaleServiceProviderPool.java Thu Oct 13 13:53:13 2011 -0400 @@ -40,6 +40,7 @@ import java.util.ServiceLoader; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; import java.util.spi.LocaleServiceProvider; import sun.util.logging.PlatformLogger; @@ -57,8 +58,8 @@ * A Map that holds singleton instances of this class. Each instance holds a * set of provider implementations of a particular locale sensitive service. */ - private static Map poolOfPools = - new ConcurrentHashMap(); + private static ConcurrentMap poolOfPools = + new ConcurrentHashMap<>(); /** * A Set containing locale service providers that implement the @@ -109,7 +110,7 @@ if (pool == null) { LocaleServiceProviderPool newPool = new LocaleServiceProviderPool(providerClass); - pool = poolOfPools.put(providerClass, newPool); + pool = poolOfPools.putIfAbsent(providerClass, newPool); if (pool == null) { pool = newPool; } @@ -257,10 +258,11 @@ synchronized (LocaleServiceProviderPool.class) { if (availableJRELocales == null) { Locale[] allLocales = LocaleData.getAvailableLocales(); - availableJRELocales = new ArrayList(allLocales.length); + List tmpList = new ArrayList<>(allLocales.length); for (Locale locale : allLocales) { - availableJRELocales.add(getLookupLocale(locale)); + tmpList.add(getLookupLocale(locale)); } + availableJRELocales = tmpList; } } } diff -r 01689c7b34ac -r de98ed66757c jdk/src/share/lib/security/sunpkcs11-solaris.cfg --- a/jdk/src/share/lib/security/sunpkcs11-solaris.cfg Thu Oct 13 13:50:17 2011 -0400 +++ b/jdk/src/share/lib/security/sunpkcs11-solaris.cfg Thu Oct 13 13:53:13 2011 -0400 @@ -11,6 +11,9 @@ handleStartupErrors = ignoreAll +# Use the X9.63 encoding for EC points (do not wrap in an ASN.1 OctetString). +useEcX963Encoding = true + attributes = compatibility disabledMechanisms = { diff -r 01689c7b34ac -r de98ed66757c jdk/test/ProblemList.txt --- a/jdk/test/ProblemList.txt Thu Oct 13 13:50:17 2011 -0400 +++ b/jdk/test/ProblemList.txt Thu Oct 13 13:53:13 2011 -0400 @@ -517,9 +517,6 @@ # 7079203 sun/security/tools/keytool/printssl.sh fails on solaris with timeout sun/security/tools/keytool/printssl.sh solaris-all -# 7054637 -sun/security/tools/jarsigner/ec.sh solaris-all - # 7081817 sun/security/provider/certpath/X509CertPath/IllegalCertiticates.java generic-all diff -r 01689c7b34ac -r de98ed66757c jdk/test/java/util/Locale/Bug6989440.java --- a/jdk/test/java/util/Locale/Bug6989440.java Thu Oct 13 13:50:17 2011 -0400 +++ b/jdk/test/java/util/Locale/Bug6989440.java Thu Oct 13 13:53:13 2011 -0400 @@ -37,26 +37,49 @@ import sun.util.LocaleServiceProviderPool; public class Bug6989440 { - public static void main(String[] args) { - TestThread t1 = new TestThread(LocaleNameProvider.class); - TestThread t2 = new TestThread(TimeZoneNameProvider.class); - TestThread t3 = new TestThread(DateFormatProvider.class); + static volatile boolean failed; // false + static final int THREADS = 50; - t1.start(); - t2.start(); - t3.start(); + public static void main(String[] args) throws Exception { + Thread[] threads = new Thread[THREADS]; + for (int i=0; i cls; + private static int count; public TestThread(Class providerClass) { cls = providerClass; } + public TestThread() { + int which = count++ % 3; + switch (which) { + case 0 : cls = LocaleNameProvider.class; break; + case 1 : cls = TimeZoneNameProvider.class; break; + case 2 : cls = DateFormatProvider.class; break; + default : throw new AssertionError("Should not reach here"); + } + } + public void run() { - LocaleServiceProviderPool pool = LocaleServiceProviderPool.getPool(cls); - pool.getAvailableLocales(); + try { + LocaleServiceProviderPool pool = LocaleServiceProviderPool.getPool(cls); + pool.getAvailableLocales(); + } catch (Exception e) { + System.out.println(e); + e.printStackTrace(); + failed = true; + } } } }