/*
* Copyright 1999-2008 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.signature;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.PublicKey;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerException;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
import junit.textui.TestRunner;
import org.apache.xml.security.Init;
import org.apache.xml.security.c14n.InvalidCanonicalizerException;
import org.apache.xml.security.exceptions.XMLSecurityException;
import org.apache.xml.security.signature.XMLSignature;
import org.apache.xml.security.signature.XMLSignatureException;
import org.apache.xml.security.test.TestUtils;
import org.apache.xml.security.utils.Constants;
import org.apache.xpath.XPathAPI;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.SAXException;
/**
* Tests cases where signature algorithms are unknown.
*
* The source documents are based on that created by the class
* org.apache.xml.security.samples.signature.CreateEnvelopingSignature
*
*/
public class UnknownAlgoSignatureTest extends TestCase {
private static final String BASEDIR = System.getProperty("basedir");
private static final String SEP = System.getProperty("file.separator");
protected static final String KEYSTORE_TYPE = "JKS";
protected static final String KEYSTORE_FILE = "data/org/apache/xml/security/samples/input/keystore.jks";
protected static final String CERT_ALIAS = "test";
protected static final String SIGNATURE_SOURCE_PATH = "data/org/apache/xml/security/temp/signature";
protected PublicKey publicKey;
static {
Init.init();
}
public static Test suite() {
return new TestSuite(UnknownAlgoSignatureTest.class);
}
public UnknownAlgoSignatureTest(String name) {
super(name);
}
public static void main(String[] args) {
String[] testCaseName = { "-noloading",
UnknownAlgoSignatureTest.class.getName() };
TestRunner.main(testCaseName);
}
public void setUp() throws KeyStoreException, NoSuchAlgorithmException,
CertificateException, IOException {
FileInputStream fis = null;
if (BASEDIR != null && !"".equals(BASEDIR)) {
fis = new FileInputStream(BASEDIR + SEP + KEYSTORE_FILE);
} else {
fis = new FileInputStream(KEYSTORE_FILE);
}
KeyStore keyStore = KeyStore.getInstance(KEYSTORE_TYPE);
keyStore.load(fis, null);
X509Certificate cert = (X509Certificate) keyStore
.getCertificate(CERT_ALIAS);
publicKey = cert.getPublicKey();
}
public void testGood() throws ParserConfigurationException, SAXException,
IOException, TransformerException, XMLSignatureException,
XMLSecurityException {
assertTrue(checkSignature("signature-good.xml"));
}
public void testBadC14NAlgo() throws ParserConfigurationException,
SAXException, IOException, TransformerException,
XMLSecurityException {
try {
assertTrue(checkSignature("signature-bad-c14n-algo.xml"));
fail("Exception not caught");
} catch (InvalidCanonicalizerException e) {
// succeed
}
}
public void testBadSigAlgo() throws ParserConfigurationException,
SAXException, IOException, TransformerException,
XMLSecurityException {
try {
assertTrue(checkSignature("signature-bad-sig-algo.xml"));
fail("Exception not caught");
} catch (XMLSignatureException e) {
// succeed
}
}
public void testBadTransformAlgo() throws ParserConfigurationException,
SAXException, IOException, TransformerException,
XMLSecurityException {
try {
assertTrue(checkReferences("signature-bad-transform-algo.xml"));
fail("Exception not caught");
} catch (XMLSignatureException e) {
// succeed
}
}
protected boolean checkSignature(String fileName)
throws ParserConfigurationException, SAXException, IOException,
TransformerException, XMLSecurityException {
XMLSignature signature = unmarshalXMLSignature(fileName);
return signature.checkSignatureValue(publicKey);
}
protected boolean checkReferences(String fileName)
throws ParserConfigurationException, SAXException, IOException,
TransformerException, XMLSecurityException {
XMLSignature signature = unmarshalXMLSignature(fileName);
return signature.getSignedInfo().verify(false);
}
private XMLSignature unmarshalXMLSignature(String fileName)
throws ParserConfigurationException, SAXException, IOException,
TransformerException, XMLSecurityException {
File file = null;
if (BASEDIR != null && !"".equals(BASEDIR)) {
file = new File(BASEDIR + SEP + SIGNATURE_SOURCE_PATH, fileName);
} else {
file = new File(SIGNATURE_SOURCE_PATH, fileName);
}
Document doc = getDocument(file);
Element nscontext = TestUtils.createDSctx(doc, "ds",
Constants.SignatureSpecNS);
Element signatureEl = (Element) XPathAPI.selectSingleNode(doc,
"//ds:Signature[1]", nscontext);
XMLSignature signature = new XMLSignature(signatureEl, file.toURL()
.toString());
return signature;
}
public static Document getDocument(File file)
throws ParserConfigurationException, SAXException, IOException {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(new FileInputStream(file));
return doc;
}
}