Hi,

I have an issue with digest verification when using SAAJ versions newer than 
1.3. In general my issue is very similar to 
SANTUARIO-576<https://issues.apache.org/jira/browse/SANTUARIO-576>.

With SAAJ 1.3 everything works as intended, but if I use SAAJ 1.4 (or any newer 
version, e.g. 3.0.4), the digest verification fails. After some investigation, 
I noticed that with the new versions there is a type mismatch in 
org.apache.xml.security.c14n.implementations.CanonicalizerBase which leads to 
the Signature element not being removed, thus calculating a wrong digest value.
The relevant code is from line 242 onwards:
            case Node.ELEMENT_NODE :
                documentLevel = NODE_NOT_BEFORE_OR_AFTER_DOCUMENT_ELEMENT;
                if (currentNode == excludeNode) {
                    break;
                }

In my case excludeNode is of type 
com.sun.xml.messaging.saaj.soap.impl.ElementImpl and currentNode is of type 
com.sun.org.apache.xerces.internal.dom.ElementNSImpl. Therefore, the condition 
currentNode == excludeNode is not true and the excludeNode is not removed.
The behaviour seems to have changed with SAAJ 1.4 because ElementImpl is no 
longer extending com.sun.org.apache.xerces.internal.dom.ElementNSImpl. It now 
has a private element field to store a reference to the actual Element.

A fix for my issue would be replacing
                if (currentNode == excludeNode)
with
               if (excludeNode != null && excludeNode.isSameNode(currentNode))

but maybe there are better fixes. Especially the case from the Jira Ticket, 
where the class types of currentNode and excludeNode are swapped, would not be 
fixed with my approach.

Is it possible to fix this in a future version of Santuario? This issue is 
blocking the JBoss EAP8 migration of our application.

Kind regards,
Lukas Fabian

Reply via email to