blob: 5b97960c72a14c09282829d60f2c36e398463c95 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.dom.transforms.implementations;
import static org.junit.Assert.assertEquals;
import java.io.ByteArrayInputStream;
import org.apache.xml.security.Init;
import org.apache.xml.security.signature.XMLSignature;
import org.apache.xml.security.utils.Constants;
import org.apache.xml.security.utils.XMLUtils;
import org.w3c.dom.Element;
public class Xpath2TransformationTest {
static {
Init.init();
}
@org.junit.Test
public void testXpath2Transform() throws Exception {
String sig="<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n" +
"<edoc:EDOC xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:dcterms=\"http://purl.org/dc/terms/\" xmlns:edoc=\"http://www.imtf.com/hypersuite/edoc/2.0/\" sysid=\"CC9CC230-C0A8024E01A3CA10-AC154F78\">\r\n" +
" <edoc:Version>2.0</edoc:Version>\r\n" +
" <edoc:Object edocVersion=\"2.0\">\r\n" +
" <edoc:ObjectMetadata>\r\n" +
" <edoc:ObjectType>Record</edoc:ObjectType>\r\n" +
" <edoc:ObjectCreationDate>2004-12-13T14:27:35</edoc:ObjectCreationDate>\r\n" +
" </edoc:ObjectMetadata>\r\n" +
" <edoc:ObjectContent>\r\n" +
" <edoc:Record>\r\n" +
" <edoc:RecordMetadata></edoc:RecordMetadata>\r\n" +
" <edoc:Document id=\"Revision-1-Document-1\">\r\n" +
" <edoc:DocumentMetadata>\r\n" +
" <dc:date>2003-07-20</dc:date>\r\n" +
" <dc:type>20</dc:type>\r\n" +
" <dc:format>PDF</dc:format>\r\n" +
" <edoc:customer-number>222222</edoc:customer-number>\r\n" +
" </edoc:DocumentMetadata>\r\n" +
" <edoc:Encoding id=\"Revision-1-Document-1-Encoding-1\">\r\n" +
" <edoc:EncodingMetadata>\r\n" +
" </edoc:EncodingMetadata>\r\n" +
" <edoc:ContentData encapsulation=\"Base64\" id=\"Revision-1-Document-1-Encoding-1-ContentData-1\" sourceFileSize=\"102550\">AAA</edoc:ContentData>\r\n" +
" </edoc:Encoding>\r\n" +
" </edoc:Document>\r\n" +
" </edoc:Record>\r\n" +
" </edoc:ObjectContent>\r\n" +
" </edoc:Object>\r\n" +
"<edoc:SignatureBlock id=\"Revision-1-Signature-1\"><edoc:SignatureDate>2006-08-09T17:21:35</edoc:SignatureDate><edoc:Signer>Hess Yvan (first signature)</edoc:Signer><ds:Signature xmlns:ds=\"http://www.w3.org/2000/09/xmldsig#\">\r\n" +
"<ds:SignedInfo>\r\n" +
"<ds:CanonicalizationMethod Algorithm=\"http://www.w3.org/TR/2001/REC-xml-c14n-20010315\"></ds:CanonicalizationMethod>\r\n" +
"<ds:SignatureMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#rsa-sha1\"></ds:SignatureMethod>\r\n" +
"<ds:Reference URI=\"\">\r\n" +
"<ds:Transforms>\r\n" +
"<ds:Transform Algorithm=\"http://www.w3.org/2002/06/xmldsig-filter2\">\r\n" +
"<dsig-xpath:XPath xmlns:dsig-xpath=\"http://www.w3.org/2002/06/xmldsig-filter2\" Filter=\"intersect\">/edoc:EDOC/edoc:Object</dsig-xpath:XPath>\r\n" +
"</ds:Transform>\r\n" +
"</ds:Transforms>\r\n" +
"<ds:DigestMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#sha1\"></ds:DigestMethod>\r\n" +
"<ds:DigestValue>YMXHTYArDBcWDG99epurfdSEAWM=</ds:DigestValue>\r\n" +
"</ds:Reference>\r\n" +
"</ds:SignedInfo>\r\n" +
"<ds:SignatureValue>\r\n" +
"Un2HBIOcwGe36k8eDEJISKP8/EmCp813JlmV0qqxIPVgdMsIJXR5Wky6uqwP+E3wAXj4NykW76GV\r\n" +
"1eSD9dTKw/M/bFMbId0nBp0ZFaFE5DKU/My4956qr2oyJqiFRKOokCxds0jMQvGcKeWVC9oAROxR\r\n" +
"byZQbrtjGw9YS+D5afY=\r\n" +
"</ds:SignatureValue>\r\n" +
"<ds:KeyInfo>\r\n" +
"<ds:X509Data>\r\n" +
"<ds:X509Certificate>\r\n" +
"MIIDADCCAmmgAwIBAgIGAQpEtx7tMA0GCSqGSIb3DQEBBQUAMIGXMRQwEgYDVQQGEwtTd2l0emVy\r\n" +
"bGFuZDERMA8GA1UECBMIRnJpYm91cmcxETAPBgNVBAcTCEdpdmlzaWV6MRUwEwYDVQQLEwxIeXBl\r\n" +
"cnN1aXRlIDUxGTAXBgNVBAoTEEluZm9ybWF0aXF1ZS1NVEYxJzAlBgNVBAMTHklNVEYgUm9vdENl\r\n" +
"cnRpZmljYXRlIEF1dGhvcml0eTAeFw0wNjAzMjgyMjAwMDBaFw0xNjAzMTcyMzAwMDBaMIGMMRQw\r\n" +
"EgYDVQQGEwtTd2l0emVybGFuZDERMA8GA1UECBMIRnJpYm91cmcxETAPBgNVBAcTCEdpdmlzaWV6\r\n" +
"MRUwEwYDVQQLEwxIeXBlcnN1aXRlIDUxGTAXBgNVBAoTEEluZm9ybWF0aXF1ZS1NVEYxHDAaBgNV\r\n" +
"BAMTE0lNVEYgRW5kQ2VydGlmaWNhdGUwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAOxpALzU\r\n" +
"r8TjtFB7ghScWXdaDuHHRM7bPOoyuDSCxCznCBQitrwT/Un/vkZjDxSTG1bLWObqUMf1Yf6ul30n\r\n" +
"nU9NsHO2fr7+YwtGnCV5vZ+qzWSQBY7qS+Gg8Ft9z0PluNRe84ukcQt7mdqSYet2qKbYWLP8tyFc\r\n" +
"XCYs0JL5E6aTAgMBAAGjYDBeMB8GA1UdIwQYMBaAFIeIxHkuiPSRw5OArsqR7wZYgVPlMB0GA1Ud\r\n" +
"DgQWBBRrfNhYheJHag+VBqDPWEOQyt3rqDAMBgNVHRMBAf8EAjAAMA4GA1UdDwEB/wQEAwIFoDAN\r\n" +
"BgkqhkiG9w0BAQUFAAOBgQB4OVKzObDkpadteusbvcEin2GdK3B2qz/HwqH07AEt/pQbJ/oQOsYL\r\n" +
"qVyDFt3umJ5uHon15nkps3HRE4MoYNfVbtz1G+0nMcAbxVYJDIfC4YBJRUAm/aA0twfkiH6gFmLi\r\n" +
"V8o5YRtkjXvZQKUtJ/Ps/m0DAC4A935jTHDd6F4FCw==\r\n" +
"</ds:X509Certificate>\r\n" +
"</ds:X509Data>\r\n" +
"</ds:KeyInfo>\r\n" +
"</ds:Signature></edoc:SignatureBlock></edoc:EDOC>";
String correctC14n="<edoc:Object xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:dcterms=\"http://purl.org/dc/terms/\" xmlns:edoc=\"http://www.imtf.com/hypersuite/edoc/2.0/\" edocVersion=\"2.0\">\n" +
" <edoc:ObjectMetadata>\n" +
" <edoc:ObjectType>Record</edoc:ObjectType>\n" +
" <edoc:ObjectCreationDate>2004-12-13T14:27:35</edoc:ObjectCreationDate>\n" +
" </edoc:ObjectMetadata>\n" +
" <edoc:ObjectContent>\n" +
" <edoc:Record>\n" +
" <edoc:RecordMetadata></edoc:RecordMetadata>\n" +
" <edoc:Document id=\"Revision-1-Document-1\">\n" +
" <edoc:DocumentMetadata>\n" +
" <dc:date>2003-07-20</dc:date>\n" +
" <dc:type>20</dc:type>\n" +
" <dc:format>PDF</dc:format>\n" +
" <edoc:customer-number>222222</edoc:customer-number>\n" +
" </edoc:DocumentMetadata>\n" +
" <edoc:Encoding id=\"Revision-1-Document-1-Encoding-1\">\n" +
" <edoc:EncodingMetadata>\n" +
" </edoc:EncodingMetadata>\n" +
" <edoc:ContentData encapsulation=\"Base64\" id=\"Revision-1-Document-1-Encoding-1-ContentData-1\" sourceFileSize=\"102550\">AAA</edoc:ContentData>\n" +
" </edoc:Encoding>\n" +
" </edoc:Document>\n" +
" </edoc:Record>\n" +
" </edoc:ObjectContent>\n" +
" </edoc:Object>";
javax.xml.parsers.DocumentBuilder db = XMLUtils.createDocumentBuilder(false);
org.w3c.dom.Document doc = null;
try (ByteArrayInputStream is = new ByteArrayInputStream(sig.getBytes())) {
doc = db.parse(is);
}
Element sigElement =
(Element) doc.getElementsByTagNameNS(
Constants.SignatureSpecNS, Constants._TAG_SIGNATURE).item(0);
XMLSignature sign = new XMLSignature(sigElement, "");
boolean verify =
sign.checkSignatureValue(sign.getKeyInfo().getPublicKey());
if (!verify) {
for (int i = 0; i < sign.getSignedInfo().getLength(); i++) {
boolean refVerify =
sign.getSignedInfo().getVerificationResult(i);
if (!refVerify) {
byte[] contentBytes =
sign.getSignedInfo().item(i).getContentsAfterTransformation().getBytes();
assertEquals(
correctC14n,
new String(contentBytes)
);
}
}
}
}
}