提交 1bef8fe6 编写于 作者: M mullan

Merge

...@@ -192,6 +192,11 @@ final class Config { ...@@ -192,6 +192,11 @@ final class Config {
// works only for NSS providers created via the Secmod API // works only for NSS providers created via the Secmod API
private boolean nssUseSecmodTrust = false; 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 { private Config(String filename, InputStream in) throws IOException {
if (in == null) { if (in == null) {
if (filename.startsWith("--")) { if (filename.startsWith("--")) {
...@@ -320,6 +325,10 @@ final class Config { ...@@ -320,6 +325,10 @@ final class Config {
return nssUseSecmodTrust; return nssUseSecmodTrust;
} }
boolean getUseEcX963Encoding() {
return useEcX963Encoding;
}
private static String expand(final String s) throws IOException { private static String expand(final String s) throws IOException {
try { try {
return PropertyExpander.expand(s); return PropertyExpander.expand(s);
...@@ -440,6 +449,8 @@ final class Config { ...@@ -440,6 +449,8 @@ final class Config {
parseNSSArgs(word); parseNSSArgs(word);
} else if (word.equals("nssUseSecmodTrust")) { } else if (word.equals("nssUseSecmodTrust")) {
nssUseSecmodTrust = parseBooleanEntry(word); nssUseSecmodTrust = parseBooleanEntry(word);
} else if (word.equals("useEcX963Encoding")) {
useEcX963Encoding = parseBooleanEntry(word);
} else { } else {
throw new ConfigurationException throw new ConfigurationException
("Unknown keyword '" + word + "', line " + st.lineno()); ("Unknown keyword '" + word + "', line " + st.lineno());
......
...@@ -203,14 +203,20 @@ final class P11ECKeyFactory extends P11KeyFactory { ...@@ -203,14 +203,20 @@ final class P11ECKeyFactory extends P11KeyFactory {
private PublicKey generatePublic(ECPoint point, ECParameterSpec params) throws PKCS11Exception { private PublicKey generatePublic(ECPoint point, ECParameterSpec params) throws PKCS11Exception {
byte[] encodedParams = ECParameters.encodeParameters(params); byte[] encodedParams = ECParameters.encodeParameters(params);
byte[] encodedPoint = null; byte[] encodedPoint =
DerValue pkECPoint = new DerValue(DerValue.tag_OctetString, ECParameters.encodePoint(point, params.getCurve());
ECParameters.encodePoint(point, params.getCurve()));
try { // Check whether the X9.63 encoding of an EC point shall be wrapped
encodedPoint = pkECPoint.toByteArray(); // in an ASN.1 OCTET STRING
} catch (IOException e) { if (!token.config.getUseEcX963Encoding()) {
throw new IllegalArgumentException("Could not DER encode point", e); 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[] { CK_ATTRIBUTE[] attributes = new CK_ATTRIBUTE[] {
......
...@@ -1028,28 +1028,21 @@ abstract class P11Key implements Key { ...@@ -1028,28 +1028,21 @@ abstract class P11Key implements Key {
try { try {
params = P11ECKeyFactory.decodeParameters params = P11ECKeyFactory.decodeParameters
(attributes[1].getByteArray()); (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(); 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); 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 w = P11ECKeyFactory.decodePoint
(wECPoint.getDataBytes(), params.getCurve()); (wECPoint.getDataBytes(), params.getCurve());
} catch (IOException e) { } else {
// Failover
w = P11ECKeyFactory.decodePoint(ecKey, params.getCurve()); w = P11ECKeyFactory.decodePoint(ecKey, params.getCurve());
} }
......
...@@ -40,6 +40,7 @@ import java.util.ResourceBundle.Control; ...@@ -40,6 +40,7 @@ import java.util.ResourceBundle.Control;
import java.util.ServiceLoader; import java.util.ServiceLoader;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.spi.LocaleServiceProvider; import java.util.spi.LocaleServiceProvider;
import sun.util.logging.PlatformLogger; import sun.util.logging.PlatformLogger;
...@@ -57,8 +58,8 @@ public final class LocaleServiceProviderPool { ...@@ -57,8 +58,8 @@ public final class LocaleServiceProviderPool {
* A Map that holds singleton instances of this class. Each instance holds a * A Map that holds singleton instances of this class. Each instance holds a
* set of provider implementations of a particular locale sensitive service. * set of provider implementations of a particular locale sensitive service.
*/ */
private static Map<Class, LocaleServiceProviderPool> poolOfPools = private static ConcurrentMap<Class, LocaleServiceProviderPool> poolOfPools =
new ConcurrentHashMap<Class, LocaleServiceProviderPool>(); new ConcurrentHashMap<>();
/** /**
* A Set containing locale service providers that implement the * A Set containing locale service providers that implement the
...@@ -109,7 +110,7 @@ public final class LocaleServiceProviderPool { ...@@ -109,7 +110,7 @@ public final class LocaleServiceProviderPool {
if (pool == null) { if (pool == null) {
LocaleServiceProviderPool newPool = LocaleServiceProviderPool newPool =
new LocaleServiceProviderPool(providerClass); new LocaleServiceProviderPool(providerClass);
pool = poolOfPools.put(providerClass, newPool); pool = poolOfPools.putIfAbsent(providerClass, newPool);
if (pool == null) { if (pool == null) {
pool = newPool; pool = newPool;
} }
...@@ -257,10 +258,11 @@ public final class LocaleServiceProviderPool { ...@@ -257,10 +258,11 @@ public final class LocaleServiceProviderPool {
synchronized (LocaleServiceProviderPool.class) { synchronized (LocaleServiceProviderPool.class) {
if (availableJRELocales == null) { if (availableJRELocales == null) {
Locale[] allLocales = LocaleData.getAvailableLocales(); Locale[] allLocales = LocaleData.getAvailableLocales();
availableJRELocales = new ArrayList<Locale>(allLocales.length); List<Locale> tmpList = new ArrayList<>(allLocales.length);
for (Locale locale : allLocales) { for (Locale locale : allLocales) {
availableJRELocales.add(getLookupLocale(locale)); tmpList.add(getLookupLocale(locale));
} }
availableJRELocales = tmpList;
} }
} }
} }
......
...@@ -11,6 +11,9 @@ library = /usr/lib/$ISA/libpkcs11.so ...@@ -11,6 +11,9 @@ library = /usr/lib/$ISA/libpkcs11.so
handleStartupErrors = ignoreAll handleStartupErrors = ignoreAll
# Use the X9.63 encoding for EC points (do not wrap in an ASN.1 OctetString).
useEcX963Encoding = true
attributes = compatibility attributes = compatibility
disabledMechanisms = { disabledMechanisms = {
......
...@@ -517,9 +517,6 @@ sun/security/ssl/sanity/interop/ClientJSSEServerJSSE.java generic-all ...@@ -517,9 +517,6 @@ sun/security/ssl/sanity/interop/ClientJSSEServerJSSE.java generic-all
# 7079203 sun/security/tools/keytool/printssl.sh fails on solaris with timeout # 7079203 sun/security/tools/keytool/printssl.sh fails on solaris with timeout
sun/security/tools/keytool/printssl.sh solaris-all sun/security/tools/keytool/printssl.sh solaris-all
# 7054637
sun/security/tools/jarsigner/ec.sh solaris-all
# 7081817 # 7081817
sun/security/provider/certpath/X509CertPath/IllegalCertiticates.java generic-all sun/security/provider/certpath/X509CertPath/IllegalCertiticates.java generic-all
......
...@@ -37,26 +37,49 @@ import java.util.spi.TimeZoneNameProvider; ...@@ -37,26 +37,49 @@ import java.util.spi.TimeZoneNameProvider;
import sun.util.LocaleServiceProviderPool; import sun.util.LocaleServiceProviderPool;
public class Bug6989440 { public class Bug6989440 {
public static void main(String[] args) { static volatile boolean failed; // false
TestThread t1 = new TestThread(LocaleNameProvider.class); static final int THREADS = 50;
TestThread t2 = new TestThread(TimeZoneNameProvider.class);
TestThread t3 = new TestThread(DateFormatProvider.class); public static void main(String[] args) throws Exception {
Thread[] threads = new Thread[THREADS];
t1.start(); for (int i=0; i<threads.length; i++)
t2.start(); threads[i] = new TestThread();
t3.start(); 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 { static class TestThread extends Thread {
private Class<? extends LocaleServiceProvider> cls; private Class<? extends LocaleServiceProvider> cls;
private static int count;
public TestThread(Class<? extends LocaleServiceProvider> providerClass) { public TestThread(Class<? extends LocaleServiceProvider> providerClass) {
cls = 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() { public void run() {
LocaleServiceProviderPool pool = LocaleServiceProviderPool.getPool(cls); try {
pool.getAvailableLocales(); LocaleServiceProviderPool pool = LocaleServiceProviderPool.getPool(cls);
pool.getAvailableLocales();
} catch (Exception e) {
System.out.println(e);
e.printStackTrace();
failed = true;
}
} }
} }
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册