Sample code for 30+ languages & platforms
AutoIt

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

AutoIt
Local $bSuccess = False

; 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.
$oSbXml = ObjCreate("Chilkat.StringBuilder")
$bSuccess = $oSbXml.LoadFile("qa_data/xml_dsig_valid_samples/encapsulatedTimestamp_not_yet_added.xml","utf-8")
If ($bSuccess = False) Then
    ConsoleWrite("Failed to load the XML file." & @CRLF)
    Exit
EndIf

$oDsig = ObjCreate("Chilkat.XmlDSig")
$bSuccess = $oDsig.LoadSignatureSb($oSbXml)
If ($bSuccess = False) Then
    ConsoleWrite($oDsig.LastErrorText & @CRLF)
    Exit
EndIf

If ($oDsig.HasEncapsulatedTimeStamp() = True) Then
    ConsoleWrite("This signed XML already has an EncapsulatedTimeStamp" & @CRLF)
    Exit
EndIf

; Specify the timestamping authority URL
$oJson = ObjCreate("Chilkat.JsonObject")
$oJson.UpdateString("timestampToken.tsaUrl","http://timestamp.digicert.com")
$oJson.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.
$oSbOut = ObjCreate("Chilkat.StringBuilder")
$bSuccess = $oDsig.AddEncapsulatedTimeStamp($oJson,$oSbOut)
If ($bSuccess = False) Then
    ConsoleWrite($oDsig.LastErrorText & @CRLF)
    Exit
EndIf

$oSbOut.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...
$oVerifier = ObjCreate("Chilkat.XmlDSig")
$bSuccess = $oVerifier.LoadSignatureSb($oSbOut)
If ($bSuccess <> True) Then
    ConsoleWrite($oVerifier.LastErrorText & @CRLF)
    Exit
EndIf

; Add "VerifyEncapsulatedTimeStamp" to the UncommonOptions to also verify any EncapsulatedTimeStamps
$oVerifier.UncommonOptions = "VerifyEncapsulatedTimeStamp"

Local $iNumSigs = $oVerifier.NumSignatures
Local $iVerifyIdx = 0
While $iVerifyIdx < $iNumSigs
    $oVerifier.Selector = $iVerifyIdx
Local $bVerified = $oVerifier.VerifySignature(True)
    If ($bVerified <> True) Then
        ConsoleWrite($oVerifier.LastErrorText & @CRLF)
        Exit
    EndIf

    $iVerifyIdx = $iVerifyIdx + 1
Wend
ConsoleWrite("All signatures were successfully verified." & @CRLF)