Sample code for 30+ languages & platforms
AutoIt

SII Chile - FRMT Signature Computation and Add to XML

See more XML Digital Signatures Examples

Compute the FRMT signature and add to the XML. This is the RSA signature of the SHA-1 digest of the "flattened" DD element.

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 FRMA 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>
;                     <FRMA algoritmo="SHA1withRSA">...</FRMA>
;                 </CAF>
;                 ...
;             </DD>
;             ... The FRMT will be added here in another example ...
;         </TED>
;   </Documento>
; </DTE>

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

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

;  We need to get the "flattened" DD 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")
$oDdXml.EmitCompact = True
$oDdXml.EmitXmlDecl = False
$oDdXml.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 FRMT signature element to the XML.
$oXml.UpdateChildContent "Documento|TED|FRMT",$sig
$oXml.UpdateAttrAt("Documento|TED|FRMT",True,"algoritmo","SHA1withRSA")

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