--- 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());
--- 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[] {
--- 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 <length> 04 <X-coordinate> <Y-coordinate>
- *
- * Otherwise try the raw encoding:
- * 04 <X-coordinate> <Y-coordinate>
- */
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());
}
--- 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<Class, LocaleServiceProviderPool> poolOfPools =
- new ConcurrentHashMap<Class, LocaleServiceProviderPool>();
+ private static ConcurrentMap<Class, LocaleServiceProviderPool> 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<Locale>(allLocales.length);
+ List<Locale> tmpList = new ArrayList<>(allLocales.length);
for (Locale locale : allLocales) {
- availableJRELocales.add(getLookupLocale(locale));
+ tmpList.add(getLookupLocale(locale));
}
+ availableJRELocales = tmpList;
}
}
}
--- 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 = {
--- 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
--- 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<threads.length; i++)
+ threads[i] = new TestThread();
+ for (int i=0; i<threads.length; i++)
+ threads[i].start();
+ for (int i=0; i<threads.length; i++)
+ threads[i].join();
+
+ if (failed)
+ throw new RuntimeException("Failed: check output");
}
static class TestThread extends Thread {
private Class<? extends LocaleServiceProvider> cls;
+ private static int count;
public TestThread(Class<? extends LocaleServiceProvider> 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;
+ }
}
}
}