Sample code for 30+ languages & platforms
B4X

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

B4X
Dim success As Boolean = False

'  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...

Dim xml As ChilkatXml
xml.Initialize
success = xml.LoadXmlFile("qa_data/xml/govTalkMessageResponse.xml")
If success = False Then
    Log(xml.LastErrorText)
    Return
End If


Dim Body As String = xml.GetChildContent("Body|Message|Body")
Log(Body)

Dim cert As ChilkatCert
cert.Initialize("cert")
success = cert.LoadPfxFile("qa_data/pfx/govTalkMessage_aaa.pfx", "aaa")
If success = False Then
    Log(cert.LastErrorText)
    Return
End If


Dim crypt As ChilkatCrypt2
crypt.Initialize("crypt")
crypt.CryptAlgorithm = "pki"
success = crypt.SetDecryptCert(cert)
If success = False Then
    Log(crypt.LastErrorText)
    Return
End If


Dim bd As ChilkatBinData
bd.Initialize
'  Append the bytes to bd.
success = bd.AppendEncoded(Body, "base64")

'  Decrypt in-place.
success = crypt.DecryptBd(bd)
If success = False Then
    Log(crypt.LastErrorText)
    Return
End If


'  Save the decrypted data to a file.
success = bd.WriteFile("qa_output/out.dat")

'  If the decrypted data is non-text (binary) then we can examine it in an encoding, such as hex:
Log("Decrypted bytes as hex: " & bd.GetEncoded("hex"))