Visual FoxPro
Visual FoxPro
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 Visual FoxPro Downloads
LOCAL lnSuccess
LOCAL loSbXml
LOCAL loDsig
LOCAL loJson
LOCAL loSbOut
LOCAL loVerifier
LOCAL lnNumSigs
LOCAL lnVerifyIdx
LOCAL lnVerified
lnSuccess = 0
* 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.
loSbXml = CreateObject('Chilkat.StringBuilder')
lnSuccess = loSbXml.LoadFile("qa_data/xml_dsig_valid_samples/encapsulatedTimestamp_not_yet_added.xml","utf-8")
IF (lnSuccess = 0) THEN
? "Failed to load the XML file."
RELEASE loSbXml
CANCEL
ENDIF
loDsig = CreateObject('Chilkat.XmlDSig')
lnSuccess = loDsig.LoadSignatureSb(loSbXml)
IF (lnSuccess = 0) THEN
? loDsig.LastErrorText
RELEASE loSbXml
RELEASE loDsig
CANCEL
ENDIF
IF (loDsig.HasEncapsulatedTimeStamp() = 1) THEN
? "This signed XML already has an EncapsulatedTimeStamp"
RELEASE loSbXml
RELEASE loDsig
CANCEL
ENDIF
* Specify the timestamping authority URL
loJson = CreateObject('Chilkat.JsonObject')
loJson.UpdateString("timestampToken.tsaUrl","http://timestamp.digicert.com")
loJson.UpdateBool("timestampToken.requestTsaCert",1)
* 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.
loSbOut = CreateObject('Chilkat.StringBuilder')
lnSuccess = loDsig.AddEncapsulatedTimeStamp(loJson,loSbOut)
IF (lnSuccess = 0) THEN
? loDsig.LastErrorText
RELEASE loSbXml
RELEASE loDsig
RELEASE loJson
RELEASE loSbOut
CANCEL
ENDIF
loSbOut.WriteFile("qa_output/addedEncapsulatedTimeStamp.xml","utf-8",0)
* The EncapsulatedTimeStamp can be validated when validating the signature by adding the VerifyEncapsulatedTimeStamp
* keyword to UncommonOptions. See here:
* ----------------------------------------
* Verify the signatures we just produced...
loVerifier = CreateObject('Chilkat.XmlDSig')
lnSuccess = loVerifier.LoadSignatureSb(loSbOut)
IF (lnSuccess <> 1) THEN
? loVerifier.LastErrorText
RELEASE loSbXml
RELEASE loDsig
RELEASE loJson
RELEASE loSbOut
RELEASE loVerifier
CANCEL
ENDIF
* Add "VerifyEncapsulatedTimeStamp" to the UncommonOptions to also verify any EncapsulatedTimeStamps
loVerifier.UncommonOptions = "VerifyEncapsulatedTimeStamp"
lnNumSigs = loVerifier.NumSignatures
lnVerifyIdx = 0
DO WHILE lnVerifyIdx < lnNumSigs
loVerifier.Selector = lnVerifyIdx
lnVerified = loVerifier.VerifySignature(1)
IF (lnVerified <> 1) THEN
? loVerifier.LastErrorText
RELEASE loSbXml
RELEASE loDsig
RELEASE loJson
RELEASE loSbOut
RELEASE loVerifier
CANCEL
ENDIF
lnVerifyIdx = lnVerifyIdx + 1
ENDDO
? "All signatures were successfully verified."
RELEASE loSbXml
RELEASE loDsig
RELEASE loJson
RELEASE loSbOut
RELEASE loVerifier