Author: dkulp
Date: Wed Feb 25 20:37:52 2009
New Revision: 747912

URL: http://svn.apache.org/viewvc?rev=747912&view=rev
Log:
[WSS-165] Try to match a CertificateFactory with the KeyStore provider to make 
sure the certs end up compatible

Modified:
    
webservices/wss4j/trunk/src/org/apache/ws/security/components/crypto/CryptoBase.java

Modified: 
webservices/wss4j/trunk/src/org/apache/ws/security/components/crypto/CryptoBase.java
URL: 
http://svn.apache.org/viewvc/webservices/wss4j/trunk/src/org/apache/ws/security/components/crypto/CryptoBase.java?rev=747912&r1=747911&r2=747912&view=diff
==============================================================================
--- 
webservices/wss4j/trunk/src/org/apache/ws/security/components/crypto/CryptoBase.java
 (original)
+++ 
webservices/wss4j/trunk/src/org/apache/ws/security/components/crypto/CryptoBase.java
 Wed Feb 25 20:37:52 2009
@@ -40,8 +40,10 @@
 import java.security.interfaces.RSAPublicKey;
 import java.util.Arrays;
 import java.util.Enumeration;
+import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
 import java.util.Vector;
 import javax.security.auth.x500.X500Principal;
 
@@ -54,7 +56,7 @@
  */
 public abstract class CryptoBase implements Crypto {
     private static Log log = LogFactory.getLog(CryptoBase.class);
-    protected static CertificateFactory certFact;
+    protected static Map certFactMap = new HashMap();
     protected KeyStore keystore = null;
     static String SKI_OID = "2.5.29.14";
     protected KeyStore cacerts = null;
@@ -72,6 +74,13 @@
      */
     protected abstract String getCryptoProvider();
     
+    
+    private String mapKeystoreProviderToCertProvider(String s) {
+        if ("SunJSSE".equals(s)) {
+            return "SUN";
+        }
+        return s;
+    }
     /**
      * Singleton certificate factory for this Crypto instance.
      * <p/>
@@ -82,14 +91,45 @@
      *
      */
     public synchronized CertificateFactory getCertificateFactory() throws 
WSSecurityException {
-        if (certFact == null) {
+        String provider = getCryptoProvider();
+        String keyStoreProvider = keystore == null ? null : 
keystore.getProvider().getName();
+
+        //Try to find a CertificateFactory that generates certs that are fully
+        //compatible with the certs in the KeyStore  (Sun -> Sun, BC -> BC, 
etc...)
+        CertificateFactory factory = null;
+        if (provider != null) {
+            factory = (CertificateFactory)certFactMap.get(provider);
+        } else if (keyStoreProvider != null) {
+            factory = 
(CertificateFactory)certFactMap.get(mapKeystoreProviderToCertProvider(keyStoreProvider));
+            if (factory == null) {
+                factory = 
(CertificateFactory)certFactMap.get(keyStoreProvider);                
+            }
+        } else {
+            factory = (CertificateFactory)certFactMap.get("DEFAULT");
+        }
+        if (factory == null) {
             try {
-                String provider = getCryptoProvider();
                 if (provider == null || provider.length() == 0) {
-                    certFact = CertificateFactory.getInstance("X.509");
+                    if (keyStoreProvider != null && keyStoreProvider.length() 
!= 0) {
+                        try {
+                            factory = CertificateFactory.getInstance("X.509", 
+                                                                 
mapKeystoreProviderToCertProvider(keyStoreProvider));
+                            certFactMap.put(keyStoreProvider, factory);
+                            
certFactMap.put(mapKeystoreProviderToCertProvider(keyStoreProvider), factory);
+                        } catch (Exception ex) {
+                            //Ignore, we'll just use the default since they 
didn't specify one.
+                            //Hopefully that will work for them.
+                        }
+                    }
+                    if (factory == null) {
+                        factory = CertificateFactory.getInstance("X.509");
+                        certFactMap.put("DEFAULT", factory);
+                    }
                 } else {
-                    certFact = CertificateFactory.getInstance("X.509", 
provider);
+                    factory = CertificateFactory.getInstance("X.509", 
provider);
+                    certFactMap.put(provider, factory);
                 }
+                certFactMap.put(factory.getProvider().getName(), factory);
             } catch (CertificateException e) {
                 throw new WSSecurityException(
                     WSSecurityException.SECURITY_TOKEN_UNAVAILABLE, 
"unsupportedCertType",
@@ -102,7 +142,7 @@
                 );
             }
         }
-        return certFact;
+        return factory;
     }
 
     /**



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to