Sample code for 30+ languages & platforms
AutoIt

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

AutoIt
Local $bSuccess = 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...

$oXml = ObjCreate("Chilkat.Xml")
$bSuccess = $oXml.LoadXmlFile("qa_data/xml/govTalkMessageResponse.xml")
If ($bSuccess = False) Then
    ConsoleWrite($oXml.LastErrorText & @CRLF)
    Exit
EndIf

Local $sBody = $oXml.GetChildContent("Body|Message|Body")
ConsoleWrite($sBody & @CRLF)

$oCert = ObjCreate("Chilkat.Cert")
$bSuccess = $oCert.LoadPfxFile("qa_data/pfx/govTalkMessage_aaa.pfx","aaa")
If ($bSuccess = False) Then
    ConsoleWrite($oCert.LastErrorText & @CRLF)
    Exit
EndIf

$oCrypt = ObjCreate("Chilkat.Crypt2")
$oCrypt.CryptAlgorithm = "pki"
$bSuccess = $oCrypt.SetDecryptCert($oCert)
If ($bSuccess = False) Then
    ConsoleWrite($oCrypt.LastErrorText & @CRLF)
    Exit
EndIf

$oBd = ObjCreate("Chilkat.BinData")
; Append the bytes to bd.
$bSuccess = $oBd.AppendEncoded($sBody,"base64")

; Decrypt in-place.
$bSuccess = $oCrypt.DecryptBd($oBd)
If ($bSuccess = False) Then
    ConsoleWrite($oCrypt.LastErrorText & @CRLF)
    Exit
EndIf

; Save the decrypted data to a file.
$bSuccess = $oBd.WriteFile("qa_output/out.dat")

; If the decrypted data is non-text (binary) then we can examine it in an encoding, such as hex:
ConsoleWrite("Decrypted bytes as hex: " & $oBd.GetEncoded("hex") & @CRLF)