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