Sample code for 30+ languages & platforms
Java

Add EncapsulatedTimestamp to Already-Signed XML

See more XML Digital Signatures Examples

Demonstrates how to add an EncapsulatedTimestamp to an existing XML signature.

Note: This example requires Chilkat v9.5.0.90 or greater.

Chilkat Java Downloads

Chilkat2 Java
import com.chilkatsoft.chilkat2.ChilkatException;
import com.chilkatsoft.chilkat2.JsonObject;
import com.chilkatsoft.chilkat2.StringBuilder;
import com.chilkatsoft.chilkat2.XmlDSig;

public class ChilkatExample {

    public static void main(String[] args) {
        // This example requires the Chilkat API to have been previously unlocked.
        // See Global Unlock Sample for sample code.

        // Note: We cannot load the already-signed XML into a Chilkat XML object because it would re-format the XML when re-emitted.
        // (i.e. indentation and whitespace could change, and it would invalidate the existing signature.)
        // We must use a StringBuilder.
        StringBuilder sbXml = new StringBuilder();
        try {
            sbXml.loadFile("qa_data/xml_dsig_valid_samples/encapsulatedTimestamp_not_yet_added.xml", "utf-8");
        } catch (ChilkatException e) {
            System.out.println("Failed to load the XML file.");
            return;
        }

        XmlDSig dsig = new XmlDSig();
        try {
            dsig.loadSignatureSb(sbXml);
        } catch (ChilkatException e) {
            System.out.println(e.getLastErrorText());
            return;
        }

        if (dsig.hasEncapsulatedTimeStamp()) {
            System.out.println("This signed XML already has an EncapsulatedTimeStamp");
            return;
        }

        // Specify the timestamping authority URL
        JsonObject json = new JsonObject();
        json.updateString("timestampToken.tsaUrl", "http://timestamp.digicert.com");
        json.updateBool("timestampToken.requestTsaCert", true);

        // Call AddEncapsulatedTimeStamp to add the EncapsulatedTimeStamp to the signature.
        // Note: If the signed XML contains multiple signatures, the signature modified is the one
        // indicated by the dsig.Selector property.
        StringBuilder sbOut = new StringBuilder();
        try {
            dsig.addEncapsulatedTimeStamp(json, sbOut);
        } catch (ChilkatException e) {
            System.out.println(e.getLastErrorText());
            return;
        }

        sbOut.writeFile("qa_output/addedEncapsulatedTimeStamp.xml", "utf-8", false);

        // The EncapsulatedTimeStamp can be validated when validating the signature by adding the VerifyEncapsulatedTimeStamp
        // keyword to UncommonOptions.  See here:

        // ----------------------------------------
        // Verify the signatures we just produced...
        XmlDSig verifier = new XmlDSig();
        try {
            verifier.loadSignatureSb(sbOut);
        } catch (ChilkatException e) {
            System.out.println(e.getLastErrorText());
            return;
        }

        // Add "VerifyEncapsulatedTimeStamp" to the UncommonOptions to also verify any EncapsulatedTimeStamps
        verifier.setUncommonOptions("VerifyEncapsulatedTimeStamp");

        int numSigs = verifier.getNumSignatures();
        int verifyIdx = 0;
        while (verifyIdx < numSigs) {
            verifier.setSelector(verifyIdx);
            try {
                verifier.verifySignature(true);
            } catch (ChilkatException e) {
                System.out.println(e.getLastErrorText());
                return;
            }

            verifyIdx = verifyIdx + 1;
        }

        System.out.println("All signatures were successfully verified.");
    }
}