Sample code for 30+ languages & platforms
DataFlex

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 DataFlex Downloads

DataFlex
Use ChilkatAx-win32.pkg

Procedure Test
    Boolean iSuccess
    Variant vSbXml
    Handle hoSbXml
    Handle hoDsig
    Variant vJson
    Handle hoJson
    Variant vSbOut
    Handle hoSbOut
    Handle hoVerifier
    Integer iNumSigs
    Integer iVerifyIdx
    Boolean iVerified
    String sTemp1
    Boolean bTemp1

    Move False To iSuccess

    // 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.
    Get Create (RefClass(cComChilkatStringBuilder)) To hoSbXml
    If (Not(IsComObjectCreated(hoSbXml))) Begin
        Send CreateComObject of hoSbXml
    End
    Get ComLoadFile Of hoSbXml "qa_data/xml_dsig_valid_samples/encapsulatedTimestamp_not_yet_added.xml" "utf-8" To iSuccess
    If (iSuccess = False) Begin
        Showln "Failed to load the XML file."
        Procedure_Return
    End

    Get Create (RefClass(cComChilkatXmlDSig)) To hoDsig
    If (Not(IsComObjectCreated(hoDsig))) Begin
        Send CreateComObject of hoDsig
    End
    Get pvComObject of hoSbXml to vSbXml
    Get ComLoadSignatureSb Of hoDsig vSbXml To iSuccess
    If (iSuccess = False) Begin
        Get ComLastErrorText Of hoDsig To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    Get ComHasEncapsulatedTimeStamp Of hoDsig To bTemp1
    If (bTemp1 = True) Begin
        Showln "This signed XML already has an EncapsulatedTimeStamp"
        Procedure_Return
    End

    // Specify the timestamping authority URL
    Get Create (RefClass(cComChilkatJsonObject)) To hoJson
    If (Not(IsComObjectCreated(hoJson))) Begin
        Send CreateComObject of hoJson
    End
    Get ComUpdateString Of hoJson "timestampToken.tsaUrl" "http://timestamp.digicert.com" To iSuccess
    Get ComUpdateBool Of hoJson "timestampToken.requestTsaCert" True To iSuccess

    // 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.
    Get Create (RefClass(cComChilkatStringBuilder)) To hoSbOut
    If (Not(IsComObjectCreated(hoSbOut))) Begin
        Send CreateComObject of hoSbOut
    End
    Get pvComObject of hoJson to vJson
    Get pvComObject of hoSbOut to vSbOut
    Get ComAddEncapsulatedTimeStamp Of hoDsig vJson vSbOut To iSuccess
    If (iSuccess = False) Begin
        Get ComLastErrorText Of hoDsig To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    Get ComWriteFile Of hoSbOut "qa_output/addedEncapsulatedTimeStamp.xml" "utf-8" False To iSuccess

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

    // ----------------------------------------
    // Verify the signatures we just produced...
    Get Create (RefClass(cComChilkatXmlDSig)) To hoVerifier
    If (Not(IsComObjectCreated(hoVerifier))) Begin
        Send CreateComObject of hoVerifier
    End
    Get pvComObject of hoSbOut to vSbOut
    Get ComLoadSignatureSb Of hoVerifier vSbOut To iSuccess
    If (iSuccess <> True) Begin
        Get ComLastErrorText Of hoVerifier To sTemp1
        Showln sTemp1
        Procedure_Return
    End

    // Add "VerifyEncapsulatedTimeStamp" to the UncommonOptions to also verify any EncapsulatedTimeStamps
    Set ComUncommonOptions Of hoVerifier To "VerifyEncapsulatedTimeStamp"

    Get ComNumSignatures Of hoVerifier To iNumSigs
    Move 0 To iVerifyIdx
    While (iVerifyIdx < iNumSigs)
        Set ComSelector Of hoVerifier To iVerifyIdx
        Get ComVerifySignature Of hoVerifier True To iVerified
        If (iVerified <> True) Begin
            Get ComLastErrorText Of hoVerifier To sTemp1
            Showln sTemp1
            Procedure_Return
        End

        Move (iVerifyIdx + 1) To iVerifyIdx
    Loop

    Showln "All signatures were successfully verified."


End_Procedure