Sample code for 30+ languages & platforms
AutoIt

SII Chile - FRMA Signature Computation and Add to XML

See more XML Digital Signatures Examples

Compute the FRMA signature of a <DA> element enclosed inside a <CAF> element of the XML to be signed.

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.

; Also see:  Compute the FRMT Signature and Add to XML

$oXml = ObjCreate("Chilkat.Xml")

; Load the unsigned XML that contains the following:

; <DTE version="1.0">
;   <Documento ID="F60T33">
;         <TED version="1.0">
;             <DD>
; 		...
;                 <CAF version="1.0">
;                     <DA>
; 			...
;                     </DA>
; 			... The FRMA will be added here ...
;                 </CAF>
;                 ...
;             </DD>
;             ... The FRMT will be added here in another example ...
;         </TED>
;   </Documento>
; </DTE>

$bSuccess = $oXml.LoadXmlFile("qa_data/xml_dsig/sii_cl/test_0.xml")
If ($bSuccess = False) Then
    ConsoleWrite("Failed to load initial XML file." & @CRLF)
    Exit
EndIf

; Get a reference to the "DA" element
Local $oDaXml = $oXml.FindChild("Documento|TED|DD|CAF|DA")
If ($oXml.LastMethodSuccess = False) Then
    ConsoleWrite("Failed to find DA element" & @CRLF)
    Exit
EndIf

;  We need to get the "flattened" DA XML where:
;    - No whitespace between elements.
;    - The 5 pre-defined entities are converted.
;    - The text is encoded in the ISO-8859-1 character set (Latin-1), 
$oSbFlattened = ObjCreate("Chilkat.StringBuilder")
$oDaXml.EmitCompact = True
$oDaXml.EmitXmlDecl = False
$oDaXml.GetXmlSb($oSbFlattened)

; Compute the SHA-1 message digest of the iso-8859-1 byte representation, 
; and sign it with our RSA private key, getting the result in base64 format.

$oPrivKey = ObjCreate("Chilkat.PrivateKey")
$bSuccess = $oPrivKey.LoadAnyFormatFile("qa_data/rsa/rsaPrivKey_pkcs8.pem","")
If ($bSuccess = False) Then
    ConsoleWrite($oPrivKey.LastErrorText & @CRLF)
    Exit
EndIf

$oRsa = ObjCreate("Chilkat.Rsa")
$oRsa.UsePrivateKey($oPrivKey)

$oRsa.EncodingMode = "base64"
$oRsa.Charset = "iso-8859-1"
Local $sig = $oRsa.SignStringENC($oSbFlattened.GetAsString(),"sha1")

; Add the FRMA signature element to the XML.
$oXml.UpdateChildContent "Documento|TED|DD|CAF|FRMA",$sig
$oXml.UpdateAttrAt("Documento|TED|DD|CAF|FRMA",True,"algoritmo","SHA1withRSA")

; See what we have:
$oXml.EmitCompact = False
$oXml.EmitXmlDecl = True
ConsoleWrite($oXml.GetXml() & @CRLF)

$oXml.SaveXml("qa_data/xml_dsig/sii_cl/test_1.xml")