Monday, December 19, 2011

Apache Santuario (XML Security for Java) 1.5.0 RC1

A release candidate for Apache Santuario (XML Security for Java) 1.5.0 has been published. Please download it and post any issues that are found to the mailing list. The 1.5.0 release is not binary compatible with the 1.4.x code due to extensive refactoring. Some of the more significant changes are as follows:

1) JDK 1.4.x support dropped

The 1.5.0 release drops support for JDK 1.4.x (see here and here). The APIs have been updated to use generics where possible.

2) Xalan is no longer a required dependency

Xalan/Xerces/Xml-apis are now optional dependencies, and have been marked as such in the pom. These libraries are only required if you want to support the XPath here() function, which is not supported by the XPath API in the JDK.

3) GCM support added

Support for GCM algorithms has been added via a third-party provider. See here for an example of how this is done in Apache WSS4J via BouncyCastle.

4) JSR-105 provider has been renamed

The Santuario JSR-105 provider "" has been renamed as "". This is to avoid conflict with the JDK provider of the same name. In addition, the XMLDSigRI provider's name has changed from "XMLDSig" to "ApacheXMLDSig". See here for more details.

Please note that it won't be possible to drop in the xmlsec.jar in the endorsed directory anymore and expect it to override the JDK's JSR 105 provider. You will need to edit the file to register the new provider, or hard-code the provider name in your application code.

5) Secure Validation property

A new property has been added to enable "secure validation". This property is false by default. When set to true, it enforces the following processing rules:
  • Limits the number of Transforms per Reference to a maximum of 5.
  • Does not allow XSLT transforms. 
  • Does not allow a RetrievalMethod to reference another RetrievalMethod. 
  • Does not allow a Reference to call the ResolverLocalFilesystem or the ResolverDirectHTTP (references to local files and HTTP resources are forbidden). 
  • Limits the number of references per Manifest (SignedInfo) to a maximum of 30. 
  • MD5 is not allowed as a SignatureAlgorithm or DigestAlgorithm. 
This functionality is supported in the core library through additional method signatures which take a boolean, and in the JSR-105 API via the property ", e.g.:

XMLValidateContext context = new DOMValidateContext(key, elem);
context.setProperty("", Boolean.TRUE); 

6) Dynamic registration of default algorithms

The 1.4.x release loads all supported algorithms/implementations by reading and parsing an xml configuration file. This gives the user the power to override the default configuration file by setting the appropriate system property, and to add/remove algorithms as desired.

The downside to the current configuration approach is the performance issue of reading a file from the filesystem, parsing it, and then class-loading all of the implementations. Given that the majority of users probably just use the default algorithms that come with the library, this represents a performance issue on start-up.

In 1.5.0, the default algorithms are loaded dynamically. To revert to the older behaviour of loading algorithms from a properties file then set the System property "" to point to the file. 

7) The IdResolver no longer searches for Elements in "known" namespaces

The IdResolver class is responsible for retrieving Elements for a given Id. In the 1.5.0 release it will no longer attempt to search the current Document for an Element matching the requested Id in certain "known" namespaces (e.g. SOAP Message Security). It is the responsibility of the user to register Elements by Id in the IdResolver, if they are required as part of the signature validation process. This can be done via the "setIdAttributeNS" method in the DOMCryptoContext for users of the JSR-105 API.


  1. Because of point

    7) The IdResolver no longer searches for Elements in "known" namespaces

    I have been pushed to do something like

    private void recursiveIdBrowse(DOMValidateContext context, Element element) {
    for(int i = 0 ; i < element.getChildNodes().getLength() ; i++) {
    Node node = element.getChildNodes().item(i);
    if(node.getNodeType() == Node.ELEMENT_NODE) {
    Element childEl = (Element) node;
    if(childEl.hasAttribute("Id")) {
    context.setIdAttributeNS(childEl, null, "Id");
    recursiveIdBrowse(context, childEl);

    Is this the expected work for the user?

  2. Essentially yes, unless you are using XML Schema.