PureBasic
PureBasic
Decrypt a govtalk.gov.uk SOAP GovTalkMessage
See more Encryption Examples
Demonstrates how to decrypt the content contained in the XML of a GovTalkMessage SOAP response.Chilkat PureBasic Downloads
IncludeFile "CkBinData.pb"
IncludeFile "CkCert.pb"
IncludeFile "CkXml.pb"
IncludeFile "CkCrypt2.pb"
Procedure ChilkatExample()
success.i = 0
; This example assumes the Chilkat API to have been previously unlocked.
; See Global Unlock Sample for sample code.
; The GovTalkMessage response looks something like this:
; <?xml version="1.0" encoding="utf-8"?>
; <GovTalkMessage xmlns="http://www.govtalk.gov.uk/CM/envelope">
; <EnvelopeVersion>3.1</EnvelopeVersion>
; <Header>
; <MessageDetails>
; <Class>CSSZ_DZDPN</Class>
; <Qualifier>request</Qualifier>
; <Function>submit</Function>
; <TransactionID />
; <AuditID />
; <CorrelationID>aaaaa</CorrelationID>
; <ResponseEndPoint PollInterval="0" />
; <Transformation>XML</Transformation>
; <GatewayTest />
; <GatewayTimestamp />
; </MessageDetails>
; <SenderDetails>
; <IDAuthentication>
; <SenderID />
; <Authentication>
; <Method>clear</Method>
; <Role />
; <Value />
; </Authentication>
; </IDAuthentication>
; <X509Certificate />
; <EmailAddress>somebody@example.com</EmailAddress>
; </SenderDetails>
; </Header>
; <GovTalkDetails>
; <Keys>
; <Key Type="vars">9999999999</Key>
; </Keys>
; <GatewayAdditions>
; <Source>VREP</Source>
; </GatewayAdditions>
; </GovTalkDetails>
; <Body>
; <Message xmlns="http://www.cssz.cz/XMLSchema/envelope" version="1.2" eType="DZDPN20">
; <Header>
; <Signature xmlns:dt="urn:schemas-microsoft-com:datatypes" dt:dt="bin.base64">MIIJ0A ... UMw=
; </Signature>
; <Vendor productName="some product name" version="2019" />
; </Header>
; <Body xmlns:dt="urn:schemas-microsoft-com:datatypes" encrypted="yes" contentEncoding="gzip" dt:dt="bin.base64">MIIF2w ... N2vW</Body>
; </Message>
; </Body>
; </GovTalkMessage>
; We want to get the content of the Body and decrypt it.
; First, let's get the content of the Body XML element, which is a base64 string starting with MIIF2w...
xml.i = CkXml::ckCreate()
If xml.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
success = CkXml::ckLoadXmlFile(xml,"qa_data/xml/govTalkMessageResponse.xml")
If success = 0
Debug CkXml::ckLastErrorText(xml)
CkXml::ckDispose(xml)
ProcedureReturn
EndIf
Body.s = CkXml::ckGetChildContent(xml,"Body|Message|Body")
Debug Body
cert.i = CkCert::ckCreate()
If cert.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
success = CkCert::ckLoadPfxFile(cert,"qa_data/pfx/govTalkMessage_aaa.pfx","aaa")
If success = 0
Debug CkCert::ckLastErrorText(cert)
CkXml::ckDispose(xml)
CkCert::ckDispose(cert)
ProcedureReturn
EndIf
crypt.i = CkCrypt2::ckCreate()
If crypt.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
CkCrypt2::setCkCryptAlgorithm(crypt, "pki")
success = CkCrypt2::ckSetDecryptCert(crypt,cert)
If success = 0
Debug CkCrypt2::ckLastErrorText(crypt)
CkXml::ckDispose(xml)
CkCert::ckDispose(cert)
CkCrypt2::ckDispose(crypt)
ProcedureReturn
EndIf
bd.i = CkBinData::ckCreate()
If bd.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
; Append the bytes to bd.
success = CkBinData::ckAppendEncoded(bd,Body,"base64")
; Decrypt in-place.
success = CkCrypt2::ckDecryptBd(crypt,bd)
If success = 0
Debug CkCrypt2::ckLastErrorText(crypt)
CkXml::ckDispose(xml)
CkCert::ckDispose(cert)
CkCrypt2::ckDispose(crypt)
CkBinData::ckDispose(bd)
ProcedureReturn
EndIf
; Save the decrypted data to a file.
success = CkBinData::ckWriteFile(bd,"qa_output/out.dat")
; If the decrypted data is non-text (binary) then we can examine it in an encoding, such as hex:
Debug "Decrypted bytes as hex: " + CkBinData::ckGetEncoded(bd,"hex")
CkXml::ckDispose(xml)
CkCert::ckDispose(cert)
CkCrypt2::ckDispose(crypt)
CkBinData::ckDispose(bd)
ProcedureReturn
EndProcedure