Search in sources :

Example 6 with ObjectContainer

use of org.apache.xml.security.signature.ObjectContainer in project xades4j by luisgoncalves.

the class SignedDataObjectsProcessorTest method testProcess.

@Test
public void testProcess() throws Exception {
    System.out.println("process");
    Document doc = getNewDocument();
    SignedDataObjects dataObjsDescs = new SignedDataObjects().withSignedDataObject(new DataObjectReference("uri").withTransform(new EnvelopedSignatureTransform())).withSignedDataObject(new EnvelopedXmlObject(doc.createElement("test1"))).withSignedDataObject(new EnvelopedXmlObject(doc.createElement("test2"), "text/xml", null));
    XMLSignature xmlSignature = new XMLSignature(doc, "", XMLSignature.ALGO_ID_SIGNATURE_RSA_SHA256);
    xmlSignature.setId("sigId");
    AllwaysNullAlgsParamsMarshaller algsParamsMarshaller = new AllwaysNullAlgsParamsMarshaller();
    SignedDataObjectsProcessor processor = new SignedDataObjectsProcessor(new TestAlgorithmsProvider(), algsParamsMarshaller);
    Map<DataObjectDesc, Reference> result = processor.process(dataObjsDescs, xmlSignature);
    assertEquals(dataObjsDescs.getDataObjectsDescs().size(), result.size());
    assertEquals(2, xmlSignature.getObjectLength());
    assertEquals(xmlSignature.getSignedInfo().getLength(), dataObjsDescs.getDataObjectsDescs().size());
    assertEquals(1, algsParamsMarshaller.getInvokeCount());
    Reference ref = xmlSignature.getSignedInfo().item(0);
    assertEquals(1, ref.getTransforms().getLength());
    ObjectContainer obj = xmlSignature.getObjectItem(1);
    assertEquals("text/xml", obj.getMimeType());
    assertTrue(StringUtils.isNullOrEmptyString(obj.getEncoding()));
}
Also used : Reference(org.apache.xml.security.signature.Reference) EnvelopedSignatureTransform(xades4j.algorithms.EnvelopedSignatureTransform) Document(org.w3c.dom.Document) DataObjectDesc(xades4j.properties.DataObjectDesc) XMLSignature(org.apache.xml.security.signature.XMLSignature) ObjectContainer(org.apache.xml.security.signature.ObjectContainer) Test(org.junit.Test)

Example 7 with ObjectContainer

use of org.apache.xml.security.signature.ObjectContainer in project santuario-java by apache.

the class CreateSignatureTest method testEmptyNodeSet.

/**
 * Test for bug 36044 - Canonicalizing an empty node-set throws an
 * ArrayIndexOutOfBoundsException.
 */
@org.junit.Test
public void testEmptyNodeSet() throws Exception {
    Document doc = db.newDocument();
    Element envelope = doc.createElementNS("http://www.usps.gov/", "Envelope");
    envelope.appendChild(doc.createTextNode("\n"));
    doc.appendChild(envelope);
    XMLSignature sig = new XMLSignature(doc, null, XMLSignature.ALGO_ID_SIGNATURE_DSA);
    envelope.appendChild(sig.getElement());
    ObjectContainer object1 = new ObjectContainer(doc);
    object1.setId("object-1");
    object1.setMimeType("text/plain");
    sig.appendObject(object1);
    ObjectContainer object2 = new ObjectContainer(doc);
    object2.setId("object-2");
    object2.setMimeType("text/plain");
    object2.setEncoding("http://www.w3.org/2000/09/xmldsig#base64");
    object2.appendChild(doc.createTextNode("SSBhbSB0aGUgdGV4dC4="));
    sig.appendObject(object2);
    Transforms transforms = new Transforms(doc);
    XPathContainer xpathC = new XPathContainer(doc);
    xpathC.setXPath("self::text()");
    transforms.addTransform(Transforms.TRANSFORM_XPATH, xpathC.getElementPlusReturns());
    sig.addDocument("#object-1", transforms, Constants.ALGO_ID_DIGEST_SHA1, null, "http://www.w3.org/2000/09/xmldsig#Object");
    KeyStore ks = KeyStore.getInstance("JKS");
    FileInputStream fis = null;
    if (BASEDIR != null && !"".equals(BASEDIR)) {
        fis = new FileInputStream(BASEDIR + SEP + "src/test/resources/org/apache/xml/security/samples/input/keystore.jks");
    } else {
        fis = new FileInputStream("src/test/resources/org/apache/xml/security/samples/input/keystore.jks");
    }
    ks.load(fis, "xmlsecurity".toCharArray());
    PrivateKey privateKey = (PrivateKey) ks.getKey("test", "xmlsecurity".toCharArray());
    sig.sign(privateKey);
}
Also used : PrivateKey(java.security.PrivateKey) XMLSignature(org.apache.xml.security.signature.XMLSignature) Element(org.w3c.dom.Element) Transforms(org.apache.xml.security.transforms.Transforms) Document(org.w3c.dom.Document) ObjectContainer(org.apache.xml.security.signature.ObjectContainer) XPathContainer(org.apache.xml.security.transforms.params.XPathContainer) KeyStore(java.security.KeyStore) FileInputStream(java.io.FileInputStream)

Example 8 with ObjectContainer

use of org.apache.xml.security.signature.ObjectContainer in project santuario-java by apache.

the class CreateExclC14nInteropValues method main.

/**
 * Method main
 *
 * @param unused
 * @throws Exception
 */
public static void main(String[] unused) throws Exception {
    org.apache.xml.security.Init.init();
    DocumentBuilder db = XMLUtils.createDocumentBuilder(false);
    Document doc = db.newDocument();
    String directory = "data/org/apache/xml/security/c14n/outExcl/";
    File signatureFile = new File(directory + "apacheSignature.xml");
    XMLSignature xmlSignature = new XMLSignature(doc, signatureFile.toURI().toURL().toString(), XMLSignature.ALGO_ID_MAC_HMAC_SHA1);
    doc.appendChild(xmlSignature.getElement());
    {
        // ref 0
        Transforms tf = new Transforms(doc);
        {
            XPathContainer xc = new XPathContainer(doc);
            xc.setXPath("self::Parent or (parent::Parent and not(self::Child)) or self::GrandChild or parent::GrandChild");
            tf.addTransform(Transforms.TRANSFORM_XPATH, xc.getElement());
        }
        xmlSignature.addDocument("iaikTests.example1.xml", tf);
    }
    {
        // ref 1
        Transforms tf = new Transforms(doc);
        {
            XPathContainer xc = new XPathContainer(doc);
            xc.setXPath("self::Parent or (parent::Parent and not(self::Child)) or self::GrandChild or parent::GrandChild");
            tf.addTransform(Transforms.TRANSFORM_XPATH, xc.getElement());
        }
        tf.addTransform(Transforms.TRANSFORM_C14N_EXCL_OMIT_COMMENTS);
        xmlSignature.addDocument("iaikTests.example1.xml", tf);
    }
    {
        // ref 2
        Transforms tf = new Transforms(doc);
        {
            XPathContainer xc = new XPathContainer(doc);
            xc.setXPathNamespaceContext("xmlns:default", "http://example.org");
            xc.setXPath("self::Parent or (parent::Parent and not(self::default:Child)) or self::GrandChild or parent::GrandChild");
            tf.addTransform(Transforms.TRANSFORM_XPATH, xc.getElement());
        }
        xmlSignature.addDocument("iaikTests.example2.xml", tf);
    }
    {
        // ref 3
        Transforms tf = new Transforms(doc);
        {
            XPathContainer xc = new XPathContainer(doc);
            xc.setXPathNamespaceContext("xmlns:default", "http://example.org");
            xc.setXPath("self::Parent or (parent::Parent and not(self::default:Child)) or self::GrandChild or parent::GrandChild");
            tf.addTransform(Transforms.TRANSFORM_XPATH, xc.getElement());
        }
        tf.addTransform(Transforms.TRANSFORM_C14N_EXCL_OMIT_COMMENTS);
        xmlSignature.addDocument("iaikTests.example2.xml", tf);
    }
    {
        // ref 4
        Transforms tf = new Transforms(doc);
        {
            XPathContainer xc = new XPathContainer(doc);
            xc.setXPathNamespaceContext("xmlns:default", "http://example.org/default");
            xc.setXPathNamespaceContext("xmlns:ns1", "http://example.org/ns1");
            xc.setXPath("self::default:Parent or (parent::default:Parent and not(self::default:Child)) or self::ns1:GrandChild or parent::ns1:GrandChild or self::default:GrandChild or parent::default:GrandChild");
            tf.addTransform(Transforms.TRANSFORM_XPATH, xc.getElement());
        }
        xmlSignature.addDocument("iaikTests.example3.xml", tf);
    }
    {
        // ref 5
        Transforms tf = new Transforms(doc);
        {
            XPathContainer xc = new XPathContainer(doc);
            xc.setXPathNamespaceContext("xmlns:default", "http://example.org/default");
            xc.setXPathNamespaceContext("xmlns:ns1", "http://example.org/ns1");
            xc.setXPath("self::default:Parent or (parent::default:Parent and not(self::default:Child)) or self::ns1:GrandChild or parent::ns1:GrandChild or self::default:GrandChild or parent::default:GrandChild");
            tf.addTransform(Transforms.TRANSFORM_XPATH, xc.getElement());
        }
        tf.addTransform(Transforms.TRANSFORM_C14N_EXCL_OMIT_COMMENTS);
        xmlSignature.addDocument("iaikTests.example3.xml", tf);
    }
    {
        // ref 6
        Transforms tf = new Transforms(doc);
        {
            XPathContainer xc = new XPathContainer(doc);
            xc.setXPathNamespaceContext("xmlns:ns1", "http://example.org/ns1");
            xc.setXPath("self::Parent or (parent::Parent and not(self::Child)) or self::ns1:GrandChild or parent::ns1:GrandChild");
            tf.addTransform(Transforms.TRANSFORM_XPATH, xc.getElement());
        }
        xmlSignature.addDocument("iaikTests.example4.xml", tf);
    }
    {
        // ref 7
        Transforms tf = new Transforms(doc);
        {
            XPathContainer xc = new XPathContainer(doc);
            xc.setXPathNamespaceContext("xmlns:ns1", "http://example.org/ns1");
            xc.setXPath("self::Parent or (parent::Parent and not(self::Child)) or self::ns1:GrandChild or parent::ns1:GrandChild");
            tf.addTransform(Transforms.TRANSFORM_XPATH, xc.getElement());
        }
        {
            InclusiveNamespaces incNS = new InclusiveNamespaces(doc, "ns2");
            tf.addTransform(Transforms.TRANSFORM_C14N_EXCL_OMIT_COMMENTS, incNS.getElement());
        }
        xmlSignature.addDocument("iaikTests.example4.xml", tf);
    }
    {
        // ref 8
        ObjectContainer obj = new ObjectContainer(doc);
        String id = "object1";
        obj.setId(id);
        String xmlStr = "" + "<included    xml:lang='de'>" + "\n" + "<notIncluded xml:lang='de'>" + "\n" + "<notIncluded xml:lang='uk'>" + "\n" + "<included                 >" + "\n" + "</included>" + "\n" + "</notIncluded>" + "\n" + "</notIncluded>" + "\n" + "</included>";
        Document importDoc = null;
        try (InputStream is = new ByteArrayInputStream(xmlStr.getBytes(StandardCharsets.UTF_8))) {
            importDoc = db.parse(is);
        }
        obj.getElement().appendChild(doc.createTextNode("\n"));
        obj.getElement().appendChild(doc.importNode(importDoc.getDocumentElement(), true));
        obj.getElement().appendChild(doc.createTextNode("\n"));
        xmlSignature.appendObject(obj);
        // ref apache_8
        Transforms tf = new Transforms(doc);
        {
            XPathContainer xc = new XPathContainer(doc);
            xc.setXPath("self::node()[local-name()='included']");
            tf.addTransform(Transforms.TRANSFORM_XPATH, xc.getElement());
        }
        xmlSignature.addDocument("#" + id, tf);
    }
    {
        // ref 9
        ObjectContainer obj = new ObjectContainer(doc);
        String id = "object2";
        obj.setId(id);
        String xmlStr = "" + "<included    xml:lang='uk'>" + "\n" + "<notIncluded xml:lang='de'>" + "\n" + "<notIncluded xml:lang='uk'>" + "\n" + "<included                 >" + "\n" + "</included>" + "\n" + "</notIncluded>" + "\n" + "</notIncluded>" + "\n" + "</included>";
        Document importDoc = null;
        try (InputStream is = new ByteArrayInputStream(xmlStr.getBytes(StandardCharsets.UTF_8))) {
            importDoc = db.parse(is);
        }
        obj.getElement().appendChild(doc.createTextNode("\n"));
        obj.getElement().appendChild(doc.importNode(importDoc.getDocumentElement(), true));
        obj.getElement().appendChild(doc.createTextNode("\n"));
        xmlSignature.appendObject(obj);
        // ref apache_8
        Transforms tf = new Transforms(doc);
        {
            XPathContainer xc = new XPathContainer(doc);
            xc.setXPath("self::node()[local-name()='included']");
            tf.addTransform(Transforms.TRANSFORM_XPATH, xc.getElement());
        }
        xmlSignature.addDocument("#" + id, tf);
    }
    {
        // ref 10
        ObjectContainer obj = new ObjectContainer(doc);
        String id = "object3";
        obj.setId(id);
        String xmlStr = "" + "<included    xml:lang='de'>" + "\n" + "<notIncluded xml:lang='de'>" + "\n" + "<notIncluded xml:lang='uk'>" + "\n" + "<included xml:lang='de'>" + "\n" + "</included>" + "\n" + "</notIncluded>" + "\n" + "</notIncluded>" + "\n" + "</included>";
        Document importDoc = null;
        try (InputStream is = new ByteArrayInputStream(xmlStr.getBytes(StandardCharsets.UTF_8))) {
            importDoc = db.parse(is);
        }
        obj.getElement().appendChild(doc.createTextNode("\n"));
        obj.getElement().appendChild(doc.importNode(importDoc.getDocumentElement(), true));
        obj.getElement().appendChild(doc.createTextNode("\n"));
        xmlSignature.appendObject(obj);
        // ref apache_8
        Transforms tf = new Transforms(doc);
        {
            XPathContainer xc = new XPathContainer(doc);
            xc.setXPath("self::node()[local-name()='included']");
            tf.addTransform(Transforms.TRANSFORM_XPATH, xc.getElement());
        }
        xmlSignature.addDocument("#" + id, tf);
    }
    {
        // ref 11
        ObjectContainer obj = new ObjectContainer(doc);
        String id = "object4";
        obj.setId(id);
        String xmlStr = "" + "<included    xml:lang='de'>" + "\n" + "<included xml:lang='de'>" + "\n" + "<notIncluded xml:lang='uk'>" + "\n" + "<included                 >" + "\n" + "</included>" + "\n" + "</notIncluded>" + "\n" + "</included>" + "\n" + "</included>";
        Document importDoc = null;
        try (InputStream is = new ByteArrayInputStream(xmlStr.getBytes(StandardCharsets.UTF_8))) {
            importDoc = db.parse(is);
        }
        obj.getElement().appendChild(doc.createTextNode("\n"));
        obj.getElement().appendChild(doc.importNode(importDoc.getDocumentElement(), true));
        obj.getElement().appendChild(doc.createTextNode("\n"));
        xmlSignature.appendObject(obj);
        Transforms tf = new Transforms(doc);
        {
            XPathContainer xc = new XPathContainer(doc);
            xc.setXPath("self::node()[local-name()='included']");
            tf.addTransform(Transforms.TRANSFORM_XPATH, xc.getElement());
        }
        xmlSignature.addDocument("#" + id, tf);
    }
    {
        // ref 12
        ObjectContainer obj = new ObjectContainer(doc);
        String id = "object5";
        obj.setId(id);
        String xmlStr = "" + "<included                         xml:lang='de'>" + "\n" + "<included xml:lang='de'>" + "\n" + "<notIncluded xml:space='preserve' xml:lang='uk'>" + "\n" + "<included                 >" + "\n" + "</included>" + "\n" + "</notIncluded>" + "\n" + "</included>" + "\n" + "</included>";
        Document importDoc = null;
        try (InputStream is = new ByteArrayInputStream(xmlStr.getBytes(StandardCharsets.UTF_8))) {
            importDoc = db.parse(is);
        }
        obj.getElement().appendChild(doc.createTextNode("\n"));
        obj.getElement().appendChild(doc.importNode(importDoc.getDocumentElement(), true));
        obj.getElement().appendChild(doc.createTextNode("\n"));
        xmlSignature.appendObject(obj);
        Transforms tf = new Transforms(doc);
        {
            XPathContainer xc = new XPathContainer(doc);
            xc.setXPath("self::node()[local-name()='included']");
            tf.addTransform(Transforms.TRANSFORM_XPATH, xc.getElement());
        }
        xmlSignature.addDocument("#" + id, tf);
    }
    {
        // ref 13
        ObjectContainer obj = new ObjectContainer(doc);
        String id = "object6";
        obj.setId(id);
        String xmlStr = "" + "<included   xml:space='preserve'  xml:lang='de'>" + "\n" + "<included xml:lang='de'>" + "\n" + "<notIncluded xml:lang='uk'>" + "\n" + "<included>" + "\n" + "</included>" + "\n" + "</notIncluded>" + "\n" + "</included>" + "\n" + "</included>";
        Document importDoc = null;
        try (InputStream is = new ByteArrayInputStream(xmlStr.getBytes(StandardCharsets.UTF_8))) {
            importDoc = db.parse(is);
        }
        obj.getElement().appendChild(doc.createTextNode("\n"));
        obj.getElement().appendChild(doc.importNode(importDoc.getDocumentElement(), true));
        obj.getElement().appendChild(doc.createTextNode("\n"));
        xmlSignature.appendObject(obj);
        Transforms tf = new Transforms(doc);
        {
            XPathContainer xc = new XPathContainer(doc);
            xc.setXPath("self::node()[local-name()='included']");
            tf.addTransform(Transforms.TRANSFORM_XPATH, xc.getElement());
        }
        xmlSignature.addDocument("#" + id, tf);
    }
    {
        // ref 13b
        String id = "object6";
        Transforms tf = new Transforms(doc);
        {
            XPathContainer xc = new XPathContainer(doc);
            xc.setXPath("self::node()[local-name()='included']");
            tf.addTransform(Transforms.TRANSFORM_XPATH, xc.getElement());
            tf.addTransform(Transforms.TRANSFORM_C14N_OMIT_COMMENTS);
        }
        xmlSignature.addDocument("#" + id, tf);
    }
    {
        // ref 13c
        String id = "object6";
        Transforms tf = new Transforms(doc);
        {
            XPathContainer xc = new XPathContainer(doc);
            xc.setXPath("self::node()[local-name()='included']");
            tf.addTransform(Transforms.TRANSFORM_XPATH, xc.getElement());
            tf.addTransform(Transforms.TRANSFORM_C14N_OMIT_COMMENTS);
            tf.addTransform(Transforms.TRANSFORM_C14N_OMIT_COMMENTS);
        }
        xmlSignature.addDocument("#" + id, tf);
    // xmlSignature.addDocument("#" + id, tf, org.apache.xml.security.algorithms.MessageDigestAlgorithm.ALGO_ID_DIGEST_SHA1, "ref13c", null);
    }
    String secretKey = "secret";
    xmlSignature.getKeyInfo().addKeyName("The UTF-8 octets of \"" + secretKey + "\" are used for signing (" + secretKey.length() + " octets)");
    xmlSignature.sign(xmlSignature.createSecretKey(secretKey.getBytes()));
    FileOutputStream fos = new FileOutputStream(signatureFile);
    XMLUtils.outputDOM(doc, fos);
    fos.close();
    int length = xmlSignature.getSignedInfo().getLength();
    for (int i = 0; i < length; i++) {
        String fname = directory + "c14n-" + i + "-apache.xml";
        System.out.println(fname);
        JavaUtils.writeBytesToFilename(fname, xmlSignature.getSignedInfo().getReferencedContentAfterTransformsItem(i).getBytes());
    }
    XMLSignature s = new XMLSignature(doc.getDocumentElement(), signatureFile.toURI().toURL().toString());
    boolean verify = s.checkSignatureValue(s.createSecretKey("secret".getBytes()));
    System.out.println("verify=" + verify);
    System.out.println("");
    XMLUtils.outputDOMc14nWithComments(doc, System.out);
}
Also used : ByteArrayInputStream(java.io.ByteArrayInputStream) InputStream(java.io.InputStream) Transforms(org.apache.xml.security.transforms.Transforms) Document(org.w3c.dom.Document) XPathContainer(org.apache.xml.security.transforms.params.XPathContainer) DocumentBuilder(javax.xml.parsers.DocumentBuilder) ByteArrayInputStream(java.io.ByteArrayInputStream) XMLSignature(org.apache.xml.security.signature.XMLSignature) FileOutputStream(java.io.FileOutputStream) InclusiveNamespaces(org.apache.xml.security.transforms.params.InclusiveNamespaces) File(java.io.File) ObjectContainer(org.apache.xml.security.signature.ObjectContainer)

Aggregations

ObjectContainer (org.apache.xml.security.signature.ObjectContainer)8 Reference (org.apache.xml.security.signature.Reference)5 XMLSignature (org.apache.xml.security.signature.XMLSignature)5 Document (org.w3c.dom.Document)5 Transforms (org.apache.xml.security.transforms.Transforms)4 Element (org.w3c.dom.Element)4 PrivateKey (java.security.PrivateKey)3 DataObjectDesc (xades4j.properties.DataObjectDesc)3 FileInputStream (java.io.FileInputStream)2 KeyStore (java.security.KeyStore)2 X509Certificate (java.security.cert.X509Certificate)2 XMLSignatureException (org.apache.xml.security.signature.XMLSignatureException)2 XPathContainer (org.apache.xml.security.transforms.params.XPathContainer)2 UnsupportedAlgorithmException (xades4j.UnsupportedAlgorithmException)2 ByteArrayInputStream (java.io.ByteArrayInputStream)1 File (java.io.File)1 FileOutputStream (java.io.FileOutputStream)1 InputStream (java.io.InputStream)1 ArrayList (java.util.ArrayList)1 HashMap (java.util.HashMap)1