You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@santuario.apache.org by co...@apache.org on 2011/04/14 18:07:31 UTC

svn commit: r1092372 - in /santuario/xml-security-java/trunk/src: main/java/org/apache/xml/security/ main/java/org/apache/xml/security/algorithms/ main/java/org/apache/xml/security/algorithms/implementations/ main/java/org/apache/xml/security/signature...

Author: coheigea
Date: Thu Apr 14 16:07:31 2011
New Revision: 1092372

URL: http://svn.apache.org/viewvc?rev=1092372&view=rev
Log:
Refactoring of SignatureAlgorithm

Modified:
    santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/Init.java
    santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/algorithms/SignatureAlgorithm.java
    santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/algorithms/implementations/IntegrityHmac.java
    santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/signature/XMLSignature.java
    santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/transforms/Transform.java
    santuario/xml-security-java/trunk/src/test/java/org/apache/xml/security/test/signature/KeyValueTest.java
    santuario/xml-security-java/trunk/src/test/java/org/apache/xml/security/test/signature/NoKeyInfoTest.java

Modified: santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/Init.java
URL: http://svn.apache.org/viewvc/santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/Init.java?rev=1092372&r1=1092371&r2=1092372&view=diff
==============================================================================
--- santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/Init.java (original)
+++ santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/Init.java Thu Apr 14 16:07:31 2011
@@ -27,8 +27,14 @@ import javax.xml.parsers.DocumentBuilder
 
 import org.apache.xml.security.algorithms.JCEMapper;
 import org.apache.xml.security.algorithms.SignatureAlgorithm;
+import org.apache.xml.security.algorithms.SignatureAlgorithmSpi;
+import org.apache.xml.security.algorithms.implementations.IntegrityHmac;
+import org.apache.xml.security.algorithms.implementations.SignatureBaseRSA;
+import org.apache.xml.security.algorithms.implementations.SignatureDSA;
+import org.apache.xml.security.algorithms.implementations.SignatureECDSA;
 import org.apache.xml.security.c14n.Canonicalizer;
 import org.apache.xml.security.keys.keyresolver.KeyResolver;
+import org.apache.xml.security.signature.XMLSignature;
 import org.apache.xml.security.transforms.Transform;
 import org.apache.xml.security.transforms.TransformSpi;
 import org.apache.xml.security.transforms.Transforms;
@@ -74,6 +80,8 @@ public class Init {
     private static Map<String, String> defaultNamespacePrefixes = new HashMap<String, String>();
     private static Map<String, Class<? extends TransformSpi>> defaultTransforms = 
         new HashMap<String, Class<? extends TransformSpi>>();
+    private static Map<String, Class<? extends SignatureAlgorithmSpi>> defaultSignatures = 
+        new HashMap<String, Class<? extends SignatureAlgorithmSpi>>();
     
     static {
         //
@@ -128,6 +136,61 @@ public class Init {
         defaultTransforms.put(
             Transforms.TRANSFORM_XPATH2FILTER04, TransformXPath2Filter.class
         );
+        
+        //
+        // default URI-SignatureAlgorithmSpi class pairs
+        //
+        defaultSignatures.put(SignatureDSA.URI, SignatureDSA.class);
+        defaultSignatures.put(
+            XMLSignature.ALGO_ID_SIGNATURE_RSA_SHA1, SignatureBaseRSA.SignatureRSASHA1.class
+        );
+        defaultSignatures.put(
+            XMLSignature.ALGO_ID_MAC_HMAC_SHA1, IntegrityHmac.IntegrityHmacSHA1.class
+        );
+        defaultSignatures.put(
+            XMLSignature.ALGO_ID_SIGNATURE_NOT_RECOMMENDED_RSA_MD5, 
+            SignatureBaseRSA.SignatureRSAMD5.class
+        );
+        defaultSignatures.put(
+            XMLSignature.ALGO_ID_SIGNATURE_RSA_RIPEMD160, 
+            SignatureBaseRSA.SignatureRSARIPEMD160.class
+        );
+        defaultSignatures.put(
+            XMLSignature.ALGO_ID_SIGNATURE_RSA_SHA256, SignatureBaseRSA.SignatureRSASHA256.class
+        );
+        defaultSignatures.put(
+            XMLSignature.ALGO_ID_SIGNATURE_RSA_SHA384, SignatureBaseRSA.SignatureRSASHA384.class
+        );
+        defaultSignatures.put(
+            XMLSignature.ALGO_ID_SIGNATURE_RSA_SHA512, SignatureBaseRSA.SignatureRSASHA512.class
+        );
+        defaultSignatures.put(
+            XMLSignature.ALGO_ID_SIGNATURE_ECDSA_SHA1, SignatureECDSA.SignatureECDSASHA1.class
+        );
+        defaultSignatures.put(
+            XMLSignature.ALGO_ID_SIGNATURE_ECDSA_SHA256, SignatureECDSA.SignatureECDSASHA256.class
+        );
+        defaultSignatures.put(
+            XMLSignature.ALGO_ID_SIGNATURE_ECDSA_SHA384, SignatureECDSA.SignatureECDSASHA384.class
+        );
+        defaultSignatures.put(
+            XMLSignature.ALGO_ID_SIGNATURE_ECDSA_SHA512, SignatureECDSA.SignatureECDSASHA512.class
+        );
+        defaultSignatures.put(
+            XMLSignature.ALGO_ID_MAC_HMAC_NOT_RECOMMENDED_MD5, IntegrityHmac.IntegrityHmacMD5.class
+        );
+        defaultSignatures.put(
+            XMLSignature.ALGO_ID_MAC_HMAC_RIPEMD160, IntegrityHmac.IntegrityHmacRIPEMD160.class
+        );
+        defaultSignatures.put(
+            XMLSignature.ALGO_ID_MAC_HMAC_SHA256, IntegrityHmac.IntegrityHmacSHA256.class
+        );
+        defaultSignatures.put(
+            XMLSignature.ALGO_ID_MAC_HMAC_SHA384, IntegrityHmac.IntegrityHmacSHA384.class
+        );
+        defaultSignatures.put(
+            XMLSignature.ALGO_ID_MAC_HMAC_SHA512, IntegrityHmac.IntegrityHmacSHA512.class
+        );
     }
     
     /**
@@ -378,6 +441,15 @@ public class Init {
                 Transform.register(key, (Class<TransformSpi>)defaultTransforms.get(key));
             }
             
+            //
+            // Set the default signature algorithms
+            //
+            for (String key : defaultSignatures.keySet()) {
+                SignatureAlgorithm.register(
+                    key, (Class<SignatureAlgorithmSpi>)defaultSignatures.get(key)
+                );
+            }
+            
         } catch (Exception ex) {
             log.error(ex);
             ex.printStackTrace();

Modified: santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/algorithms/SignatureAlgorithm.java
URL: http://svn.apache.org/viewvc/santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/algorithms/SignatureAlgorithm.java?rev=1092372&r1=1092371&r2=1092372&view=diff
==============================================================================
--- santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/algorithms/SignatureAlgorithm.java (original)
+++ santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/algorithms/SignatureAlgorithm.java Thu Apr 14 16:07:31 2011
@@ -19,13 +19,14 @@ package org.apache.xml.security.algorith
 import java.security.Key;
 import java.security.SecureRandom;
 import java.security.spec.AlgorithmParameterSpec;
-import java.util.HashMap;
 import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
 
 import org.apache.xml.security.algorithms.implementations.IntegrityHmac;
 import org.apache.xml.security.exceptions.AlgorithmAlreadyRegisteredException;
 import org.apache.xml.security.exceptions.XMLSecurityException;
 import org.apache.xml.security.signature.XMLSignatureException;
+import org.apache.xml.security.utils.ClassLoaderUtils;
 import org.apache.xml.security.utils.Constants;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
@@ -43,40 +44,13 @@ public class SignatureAlgorithm extends 
         org.apache.commons.logging.LogFactory.getLog(SignatureAlgorithm.class);
 
     /** All available algorithm classes are registered here */
-    private static Map<String, Class<?>> algorithmHash = new HashMap<String, Class<?>>(10);
+    private static Map<String, Class<SignatureAlgorithmSpi>> algorithmHash = 
+        new ConcurrentHashMap<String, Class<SignatureAlgorithmSpi>>();
    
-    private static ThreadLocal<Map<String, SignatureAlgorithmSpi>> instancesSigning = 
-        new ThreadLocal<Map<String, SignatureAlgorithmSpi>>() {
-        protected Map<String, SignatureAlgorithmSpi> initialValue() {
-            return new HashMap<String, SignatureAlgorithmSpi>();
-        };
-    };
-   
-    private static ThreadLocal<Map<String, SignatureAlgorithmSpi>> instancesVerify = 
-        new ThreadLocal<Map<String, SignatureAlgorithmSpi>>() {
-        protected Map<String, SignatureAlgorithmSpi> initialValue() {
-            return new HashMap<String, SignatureAlgorithmSpi>();
-        };
-    };
-   
-    private static ThreadLocal<Map<String, Key>> keysSigning = 
-        new ThreadLocal<Map<String, Key>>() {
-        protected Map<String, Key> initialValue() {
-            return new HashMap<String, Key>();
-        };
-    };
-
-    private static ThreadLocal<Map<String, Key>> keysVerify = 
-        new ThreadLocal<Map<String, Key>>() {
-        protected Map<String, Key> initialValue() {
-            return new HashMap<String, Key>();
-        };
-    };
-
     /** Field signatureAlgorithm */
-    private SignatureAlgorithmSpi signatureAlgorithm = null;
+    private final SignatureAlgorithmSpi signatureAlgorithm;
 
-    private String algorithmURI;
+    private final String algorithmURI;
 
     /**
      * Constructor SignatureAlgorithm
@@ -88,58 +62,9 @@ public class SignatureAlgorithm extends 
     public SignatureAlgorithm(Document doc, String algorithmURI) throws XMLSecurityException {
         super(doc, algorithmURI);
         this.algorithmURI = algorithmURI;
-    }
-
-    private void initializeAlgorithm(boolean isForSigning) throws XMLSignatureException {
-        signatureAlgorithm = isForSigning ? getInstanceForSigning(algorithmURI) 
-            : getInstanceForVerify(algorithmURI);	   
-        this.signatureAlgorithm.engineGetContextFromElement(this.constructionElement);
-    }
-
-    private static SignatureAlgorithmSpi getInstanceForSigning(String algorithmURI) 
-        throws XMLSignatureException {
-        SignatureAlgorithmSpi result = (instancesSigning.get()).get(algorithmURI);
-        if (result != null) {
-            result.reset();
-            return result;
-        }
-        result = buildSigner(algorithmURI);
-        (instancesSigning.get()).put(algorithmURI, result);
-        return result;
-    }
-
-    private static SignatureAlgorithmSpi getInstanceForVerify(String algorithmURI) 
-        throws XMLSignatureException {
-        SignatureAlgorithmSpi result = (instancesVerify.get()).get(algorithmURI);
-        if (result != null) {
-            result.reset();
-            return result;
-        }
-        result = buildSigner(algorithmURI);
-        (instancesVerify.get()).put(algorithmURI, result);
-        return result;
-    }
-
-    private static SignatureAlgorithmSpi buildSigner(String algorithmURI) 
-        throws XMLSignatureException {
-        try {
-            Class<?> implementingClass =
-                SignatureAlgorithm.getImplementingClass(algorithmURI);
-            if (log.isDebugEnabled()) {
-                log.debug("Create URI \"" + algorithmURI + "\" class \""
-                   + implementingClass + "\"");
-            }
-            return (SignatureAlgorithmSpi)implementingClass.newInstance();   
-        }  catch (IllegalAccessException ex) {
-            Object exArgs[] = { algorithmURI, ex.getMessage() };
-            throw new XMLSignatureException("algorithms.NoSuchAlgorithm", exArgs, ex);
-        } catch (InstantiationException ex) {
-            Object exArgs[] = { algorithmURI, ex.getMessage() };
-            throw new XMLSignatureException("algorithms.NoSuchAlgorithm", exArgs, ex);
-        } catch (NullPointerException ex) {
-            Object exArgs[] = { algorithmURI, ex.getMessage() };
-            throw new XMLSignatureException("algorithms.NoSuchAlgorithm", exArgs, ex);
-        }
+        
+        signatureAlgorithm = getSignatureAlgorithmSpi(algorithmURI);
+        signatureAlgorithm.engineGetContextFromElement(this.constructionElement);
     }
 
     /**
@@ -153,13 +78,14 @@ public class SignatureAlgorithm extends 
     public SignatureAlgorithm(
         Document doc, String algorithmURI, int HMACOutputLength
     ) throws XMLSecurityException {
-        this(doc, algorithmURI);
+        super(doc, algorithmURI);
         this.algorithmURI = algorithmURI;
-        initializeAlgorithm(true);
-        this.signatureAlgorithm.engineSetHMACOutputLength(HMACOutputLength);
-        ((IntegrityHmac)this.signatureAlgorithm).engineAddContextToElement(
-            this.constructionElement
-        );
+        
+        signatureAlgorithm = getSignatureAlgorithmSpi(algorithmURI);
+        signatureAlgorithm.engineGetContextFromElement(this.constructionElement);
+        
+        signatureAlgorithm.engineSetHMACOutputLength(HMACOutputLength);
+        ((IntegrityHmac)signatureAlgorithm).engineAddContextToElement(constructionElement);
     }
 
     /**
@@ -171,9 +97,37 @@ public class SignatureAlgorithm extends 
      */
     public SignatureAlgorithm(Element element, String BaseURI) throws XMLSecurityException {
         super(element, BaseURI);      
-        algorithmURI = this.getURI();           
+        algorithmURI = this.getURI();
+        
+        signatureAlgorithm = getSignatureAlgorithmSpi(algorithmURI);
+        signatureAlgorithm.engineGetContextFromElement(this.constructionElement);
+    }
+
+    /**
+     * Get a SignatureAlgorithmSpi object corresponding to the algorithmURI argument
+     */
+    private static SignatureAlgorithmSpi getSignatureAlgorithmSpi(String algorithmURI) 
+        throws XMLSignatureException {
+        try {
+            Class<SignatureAlgorithmSpi> implementingClass = algorithmHash.get(algorithmURI);
+            if (log.isDebugEnabled()) {
+                log.debug("Create URI \"" + algorithmURI + "\" class \""
+                   + implementingClass + "\"");
+            }
+            return implementingClass.newInstance();   
+        }  catch (IllegalAccessException ex) {
+            Object exArgs[] = { algorithmURI, ex.getMessage() };
+            throw new XMLSignatureException("algorithms.NoSuchAlgorithm", exArgs, ex);
+        } catch (InstantiationException ex) {
+            Object exArgs[] = { algorithmURI, ex.getMessage() };
+            throw new XMLSignatureException("algorithms.NoSuchAlgorithm", exArgs, ex);
+        } catch (NullPointerException ex) {
+            Object exArgs[] = { algorithmURI, ex.getMessage() };
+            throw new XMLSignatureException("algorithms.NoSuchAlgorithm", exArgs, ex);
+        }
     }
 
+
     /**
      * Proxy method for {@link java.security.Signature#sign()}
      * which is executed on the internal {@link java.security.Signature} object.
@@ -182,7 +136,7 @@ public class SignatureAlgorithm extends 
      * @throws XMLSignatureException
      */
     public byte[] sign() throws XMLSignatureException {
-        return this.signatureAlgorithm.engineSign();
+        return signatureAlgorithm.engineSign();
     }
 
     /**
@@ -192,12 +146,7 @@ public class SignatureAlgorithm extends 
      * @return the result of the {@link java.security.Signature#getAlgorithm} method
      */
     public String getJCEAlgorithmString() {
-        try {
-            return getInstanceForVerify(algorithmURI).engineGetJCEAlgorithmString();
-        } catch (XMLSignatureException e) {
-            //Ignore.
-            return null;
-        }
+        return signatureAlgorithm.engineGetJCEAlgorithmString();
     }
 
     /**
@@ -206,11 +155,7 @@ public class SignatureAlgorithm extends 
      * @return The Provider of this Signature Algorithm
      */
     public String getJCEProviderName() {
-        try {
-            return getInstanceForVerify(algorithmURI).engineGetJCEProviderName();
-        } catch (XMLSignatureException e) {
-            return null;
-        }
+        return signatureAlgorithm.engineGetJCEProviderName();
     }
 
     /**
@@ -221,7 +166,7 @@ public class SignatureAlgorithm extends 
      * @throws XMLSignatureException
      */
     public void update(byte[] input) throws XMLSignatureException {
-        this.signatureAlgorithm.engineUpdate(input);
+        signatureAlgorithm.engineUpdate(input);
     }
 
     /**
@@ -232,7 +177,7 @@ public class SignatureAlgorithm extends 
      * @throws XMLSignatureException
      */
     public void update(byte input) throws XMLSignatureException {
-        this.signatureAlgorithm.engineUpdate(input);
+        signatureAlgorithm.engineUpdate(input);
     }
 
     /**
@@ -245,7 +190,7 @@ public class SignatureAlgorithm extends 
      * @throws XMLSignatureException
      */
     public void update(byte buf[], int offset, int len) throws XMLSignatureException {
-        this.signatureAlgorithm.engineUpdate(buf, offset, len);
+        signatureAlgorithm.engineUpdate(buf, offset, len);
     }
 
     /**
@@ -256,13 +201,7 @@ public class SignatureAlgorithm extends 
      * @throws XMLSignatureException
      */
     public void initSign(Key signingKey) throws XMLSignatureException {	   
-        initializeAlgorithm(true);
-        Map<String, Key> map = keysSigning.get();
-        if (map.get(this.algorithmURI) == signingKey) {
-            return;
-        }
-        map.put(this.algorithmURI, signingKey);
-        this.signatureAlgorithm.engineInitSign(signingKey);
+        signatureAlgorithm.engineInitSign(signingKey);
     }
 
     /**
@@ -275,8 +214,7 @@ public class SignatureAlgorithm extends 
      * @throws XMLSignatureException
      */
     public void initSign(Key signingKey, SecureRandom secureRandom) throws XMLSignatureException {
-        initializeAlgorithm(true);
-        this.signatureAlgorithm.engineInitSign(signingKey, secureRandom);
+        signatureAlgorithm.engineInitSign(signingKey, secureRandom);
     }
 
     /**
@@ -290,8 +228,7 @@ public class SignatureAlgorithm extends 
     public void initSign(
         Key signingKey, AlgorithmParameterSpec algorithmParameterSpec
     ) throws XMLSignatureException {
-        initializeAlgorithm(true);
-        this.signatureAlgorithm.engineInitSign(signingKey, algorithmParameterSpec);
+        signatureAlgorithm.engineInitSign(signingKey, algorithmParameterSpec);
     }
 
     /**
@@ -303,7 +240,7 @@ public class SignatureAlgorithm extends 
      * @throws XMLSignatureException
      */
     public void setParameter(AlgorithmParameterSpec params) throws XMLSignatureException {
-        this.signatureAlgorithm.engineSetParameter(params);
+        signatureAlgorithm.engineSetParameter(params);
     }
 
     /**
@@ -314,32 +251,10 @@ public class SignatureAlgorithm extends 
      * @throws XMLSignatureException
      */
     public void initVerify(Key verificationKey) throws XMLSignatureException {
-        initializeAlgorithm(false);
-        Map<String, Key> map = keysVerify.get();
-        if (map.get(this.algorithmURI) == verificationKey) {
-            return;
-        }
-        map.put(this.algorithmURI, verificationKey);
-        this.signatureAlgorithm.engineInitVerify(verificationKey);
+        signatureAlgorithm.engineInitVerify(verificationKey);
     }
     
     /**
-     * Clear the verification caches keysVerify and instancesVerify.
-     */
-    public void clearVerificationCache() {
-        keysVerify.get().clear();
-        instancesVerify.get().clear();
-    }
-    
-    /**
-     * Clear the signature caches keysSigning and instancesSigning.
-     */
-    public void clearSignatureCache() {
-        keysSigning.get().clear();
-        instancesSigning.get().clear();
-    }
-
-    /**
      * Proxy method for {@link java.security.Signature#verify(byte[])}
      * which is executed on the internal {@link java.security.Signature} object.
      *
@@ -349,7 +264,7 @@ public class SignatureAlgorithm extends 
      * @throws XMLSignatureException
      */
     public boolean verify(byte[] signature) throws XMLSignatureException {
-        return this.signatureAlgorithm.engineVerify(signature);
+        return signatureAlgorithm.engineVerify(signature);
     }
 
     /**
@@ -358,7 +273,7 @@ public class SignatureAlgorithm extends 
      * @return the URI representation of Transformation algorithm
      */
     public final String getURI() {
-        return this.constructionElement.getAttributeNS(null, Constants._ATT_ALGORITHM);
+        return constructionElement.getAttributeNS(null, Constants._ATT_ALGORITHM);
     }
 
     /**
@@ -370,6 +285,7 @@ public class SignatureAlgorithm extends 
      * @throws AlgorithmAlreadyRegisteredException if specified algorithmURI is already registered
      * @throws XMLSignatureException 
      */
+    @SuppressWarnings("unchecked")
     public static void register(String algorithmURI, String implementingClass)
        throws AlgorithmAlreadyRegisteredException, ClassNotFoundException, 
            XMLSignatureException {
@@ -378,39 +294,49 @@ public class SignatureAlgorithm extends 
         }
 
         // are we already registered?
-        Class<?> registeredClassClass =
-            SignatureAlgorithm.getImplementingClass(algorithmURI);
-        if (registeredClassClass != null) {
-            String registeredClass = registeredClassClass.getName();
-
-            if ((registeredClass != null) && (registeredClass.length() != 0)) {
-                Object exArgs[] = { algorithmURI, registeredClass };
-                throw new AlgorithmAlreadyRegisteredException(
-                    "algorithm.alreadyRegistered", exArgs
-                );
-            }
+        Class<SignatureAlgorithmSpi> registeredClass = algorithmHash.get(algorithmURI);
+        if (registeredClass != null) {
+            Object exArgs[] = { algorithmURI, registeredClass };
+            throw new AlgorithmAlreadyRegisteredException(
+                "algorithm.alreadyRegistered", exArgs
+            );
         }
         try {
-            Class<?> clazz = Class.forName(implementingClass);
+            Class<SignatureAlgorithmSpi> clazz = 
+                (Class<SignatureAlgorithmSpi>)
+                    ClassLoaderUtils.loadClass(implementingClass, SignatureAlgorithm.class);
             algorithmHash.put(algorithmURI, clazz);
         } catch (NullPointerException ex) {
             Object exArgs[] = { algorithmURI, ex.getMessage() };
             throw new XMLSignatureException("algorithms.NoSuchAlgorithm", exArgs, ex);
         }
     }
-
+    
     /**
-     * Method getImplementingClass
+     * Registers implementing class of the Transform algorithm with algorithmURI
      *
-     * @param URI
-     * @return the class that implements the URI
+     * @param algorithmURI algorithmURI URI representation of <code>Transform algorithm</code>.
+     * @param implementingClass <code>implementingClass</code> the implementing class of 
+     * {@link SignatureAlgorithmSpi}
+     * @throws AlgorithmAlreadyRegisteredException if specified algorithmURI is already registered
+     * @throws XMLSignatureException 
      */
-    private static Class<?> getImplementingClass(String URI) {
-        if (SignatureAlgorithm.algorithmHash == null) {
-            return null;
+    public static void register(String algorithmURI, Class<SignatureAlgorithmSpi> implementingClass)
+       throws AlgorithmAlreadyRegisteredException, ClassNotFoundException, 
+           XMLSignatureException {
+        if (log.isDebugEnabled()) {
+            log.debug("Try to register " + algorithmURI + " " + implementingClass);
         }
 
-        return SignatureAlgorithm.algorithmHash.get(URI);
+        // are we already registered?
+        Class<SignatureAlgorithmSpi> registeredClass = algorithmHash.get(algorithmURI);
+        if (registeredClass != null) {
+            Object exArgs[] = { algorithmURI, registeredClass };
+            throw new AlgorithmAlreadyRegisteredException(
+                "algorithm.alreadyRegistered", exArgs
+            );
+        }
+        algorithmHash.put(algorithmURI, implementingClass);
     }
 
     /**

Modified: santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/algorithms/implementations/IntegrityHmac.java
URL: http://svn.apache.org/viewvc/santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/algorithms/implementations/IntegrityHmac.java?rev=1092372&r1=1092371&r2=1092372&view=diff
==============================================================================
--- santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/algorithms/implementations/IntegrityHmac.java (original)
+++ santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/algorithms/implementations/IntegrityHmac.java Thu Apr 14 16:07:31 2011
@@ -46,7 +46,7 @@ public abstract class IntegrityHmac exte
     private Mac macAlgorithm = null;
 
     /** Field HMACOutputLength */
-    int HMACOutputLength = 0;
+    private int HMACOutputLength = 0;
     private boolean HMACOutputLengthSet = false;
     
     /**

Modified: santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/signature/XMLSignature.java
URL: http://svn.apache.org/viewvc/santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/signature/XMLSignature.java?rev=1092372&r1=1092371&r2=1092372&view=diff
==============================================================================
--- santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/signature/XMLSignature.java (original)
+++ santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/signature/XMLSignature.java Thu Apr 14 16:07:31 2011
@@ -545,10 +545,8 @@ public final class XMLSignature extends 
 
                 so.close();
             } catch (IOException ex) {
-                // Impossible...but clear the signature cache anyway
-                sa.clearSignatureCache();
+                // Impossible...
             } catch (XMLSecurityException ex) {
-                sa.clearSignatureCache();
                 throw ex;
             }
 
@@ -652,10 +650,8 @@ public final class XMLSignature extends 
                 // retrieve the byte[] from the stored signature
                 sigBytes = this.getSignatureValue();
             } catch (IOException ex) {
-                // Impossible...but clear the verification cache anyway
-                sa.clearVerificationCache();
+                // Impossible...
             } catch (XMLSecurityException ex) {
-                sa.clearVerificationCache();
                 throw ex;
             }
 

Modified: santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/transforms/Transform.java
URL: http://svn.apache.org/viewvc/santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/transforms/Transform.java?rev=1092372&r1=1092371&r2=1092372&view=diff
==============================================================================
--- santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/transforms/Transform.java (original)
+++ santuario/xml-security-java/trunk/src/main/java/org/apache/xml/security/transforms/Transform.java Thu Apr 14 16:07:31 2011
@@ -60,7 +60,7 @@ public final class Transform extends Sig
     private static Map<String, Class<TransformSpi>> transformSpiHash = 
         new ConcurrentHashMap<String, Class<TransformSpi>>();
     
-    private TransformSpi transformSpi;
+    private final TransformSpi transformSpi;
     
     /**
      * Generates a Transform object that implements the specified 
@@ -102,7 +102,7 @@ public final class Transform extends Sig
             XMLUtils.addReturnToElement(doc, contextNodes);
         }
 
-        initializeTransform(doc, algorithmURI, contextNodes);
+        transformSpi = initializeTransform(doc, algorithmURI, contextNodes);
     }
 
     /**
@@ -119,7 +119,7 @@ public final class Transform extends Sig
     public Transform(Document doc, String algorithmURI, NodeList contextNodes)
         throws InvalidTransformException {
         super(doc);
-        initializeTransform(doc, algorithmURI, contextNodes);
+        transformSpi = initializeTransform(doc, algorithmURI, contextNodes);
     }
 
     /**
@@ -278,7 +278,7 @@ public final class Transform extends Sig
     /**
      * Initialize the transform object.
      */
-    private void initializeTransform(Document doc, String algorithmURI, NodeList contextNodes)
+    private TransformSpi initializeTransform(Document doc, String algorithmURI, NodeList contextNodes)
         throws InvalidTransformException {
 
         this.constructionElement.setAttributeNS(null, Constants._ATT_ALGORITHM, algorithmURI);
@@ -288,8 +288,9 @@ public final class Transform extends Sig
             Object exArgs[] = { algorithmURI };
             throw new InvalidTransformException("signature.Transform.UnknownTransform", exArgs);
         }
+        TransformSpi newTransformSpi = null;
         try {
-            transformSpi = transformSpiClass.newInstance();
+            newTransformSpi = transformSpiClass.newInstance();
         } catch (InstantiationException ex) {
             Object exArgs[] = { algorithmURI };
             throw new InvalidTransformException(
@@ -304,7 +305,7 @@ public final class Transform extends Sig
 
         if (log.isDebugEnabled()) {
             log.debug("Create URI \"" + algorithmURI + "\" class \""
-                      + transformSpi.getClass() + "\"");
+                      + newTransformSpi.getClass() + "\"");
             log.debug("The NodeList is " + contextNodes);
         }
 
@@ -314,6 +315,7 @@ public final class Transform extends Sig
                 this.constructionElement.appendChild(contextNodes.item(i).cloneNode(true));
             }
         }
+        return newTransformSpi;
     }
 
 }

Modified: santuario/xml-security-java/trunk/src/test/java/org/apache/xml/security/test/signature/KeyValueTest.java
URL: http://svn.apache.org/viewvc/santuario/xml-security-java/trunk/src/test/java/org/apache/xml/security/test/signature/KeyValueTest.java?rev=1092372&r1=1092371&r2=1092372&view=diff
==============================================================================
--- santuario/xml-security-java/trunk/src/test/java/org/apache/xml/security/test/signature/KeyValueTest.java (original)
+++ santuario/xml-security-java/trunk/src/test/java/org/apache/xml/security/test/signature/KeyValueTest.java Thu Apr 14 16:07:31 2011
@@ -26,6 +26,7 @@ import javax.xml.parsers.DocumentBuilder
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.NodeList;
+import org.apache.xml.security.Init;
 import org.apache.xml.security.keys.KeyInfo;
 import org.apache.xml.security.keys.content.KeyValue;
 import org.apache.xml.security.signature.XMLSignature;
@@ -37,6 +38,10 @@ public class KeyValueTest extends org.ju
     private static final String SEP = System.getProperty("file.separator");
 
     private DocumentBuilder db;
+    
+    static {
+        Init.init();
+    }
 
     public KeyValueTest() throws Exception {
         DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

Modified: santuario/xml-security-java/trunk/src/test/java/org/apache/xml/security/test/signature/NoKeyInfoTest.java
URL: http://svn.apache.org/viewvc/santuario/xml-security-java/trunk/src/test/java/org/apache/xml/security/test/signature/NoKeyInfoTest.java?rev=1092372&r1=1092371&r2=1092372&view=diff
==============================================================================
--- santuario/xml-security-java/trunk/src/test/java/org/apache/xml/security/test/signature/NoKeyInfoTest.java (original)
+++ santuario/xml-security-java/trunk/src/test/java/org/apache/xml/security/test/signature/NoKeyInfoTest.java Thu Apr 14 16:07:31 2011
@@ -25,6 +25,7 @@ import javax.xml.parsers.DocumentBuilder
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.NodeList;
+import org.apache.xml.security.Init;
 import org.apache.xml.security.keys.KeyInfo;
 import org.apache.xml.security.signature.XMLSignature;
 import org.apache.xml.security.utils.Constants;
@@ -33,6 +34,10 @@ public class NoKeyInfoTest extends org.j
 
     private static final String BASEDIR = System.getProperty("basedir");
     private static final String SEP = System.getProperty("file.separator");
+    
+    static {
+        Init.init();
+    }
 
     private DocumentBuilder db;