/* * Copyright 2009 The Apache Software Foundation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package org.apache.xml.security.test.c14n.implementations; import java.io.FileInputStream; import java.security.KeyStore; import java.security.PrivateKey; import java.security.cert.X509Certificate; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.apache.xml.security.Init; import org.apache.xml.security.c14n.Canonicalizer; import org.apache.xml.security.keys.KeyInfo; import org.apache.xml.security.signature.ObjectContainer; import org.apache.xml.security.signature.XMLSignature; import org.apache.xml.security.signature.XMLSignatureException; import org.apache.xml.security.transforms.Transforms; import org.apache.xml.security.utils.Constants; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; public class Bug45961Test extends TestCase { private static final String OBJECT_ID = "Object"; private static final String MOCK_CANONICALIZATION_METHOD = MockCanonicalizationMethod.MOCK_CANONICALIZATION_METHOD; private static final char[] PASSWORD = "changeit".toCharArray(); private static final String ALIAS = "mullan"; private DocumentBuilder _builder; private ObjectContainer object; public static Test suite() { return new TestSuite(Bug45961Test.class); } protected void setUp() throws Exception { Init.init(); Canonicalizer.register(MOCK_CANONICALIZATION_METHOD, MockCanonicalizationMethod.class.getName()); DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setNamespaceAware(true); _builder = factory.newDocumentBuilder(); } public void testBug() throws Exception { Document document = getSignedDocument(); NodeList list = document.getElementsByTagNameNS( Constants.SignatureSpecNS, Constants._TAG_SIGNATURE); Element element = (Element) list.item(0); XMLSignature signature = new XMLSignature(element, null); KeyInfo keyInfo = signature.getKeyInfo(); X509Certificate certificate = keyInfo.getX509Certificate(); assertNotNull(certificate); try { signature.checkSignatureValue(certificate); } catch (XMLSignatureException e) { fail(e.getMessage()); } } private Document getSignedDocument() throws Exception { KeyStore ks = KeyStore.getInstance("JKS"); FileInputStream fis = new FileInputStream(getAbsolutePath("data/test.jks")); ks.load(fis, PASSWORD); fis.close(); PrivateKey privateKey = (PrivateKey) ks.getKey(ALIAS, PASSWORD); X509Certificate signingCert = (X509Certificate) ks .getCertificate(ALIAS); Document document = _builder.newDocument(); XMLSignature signature = new XMLSignature(document, null, XMLSignature.ALGO_ID_SIGNATURE_DSA, MOCK_CANONICALIZATION_METHOD); Element root = document.createElementNS("", "RootElement"); root.appendChild(document.createTextNode("Some simple test\n")); root.appendChild(signature.getElement()); document.appendChild(root); // document.appendChild(signature.getElement()); Element root2 = document.createElementNS("", "RootElement"); root2.appendChild(document.createTextNode("Some simple test\n")); object = new ObjectContainer(document); object.appendChild(root2); object.setId(OBJECT_ID); signature.addDocument("#" + OBJECT_ID); signature.addDocument("", getTransforms(document)); signature.addKeyInfo(signingCert); signature.sign(privateKey); return document; } private Transforms getTransforms(Document document) throws Exception { Transforms transforms = new Transforms(document); transforms.addTransform(Transforms.TRANSFORM_ENVELOPED_SIGNATURE); return transforms; } private String getAbsolutePath(String path) { String basedir = System.getProperty("basedir"); if(basedir != null && !"".equals(basedir)) { path = basedir + "/" + path; } return path; } }