Chilkat HOME .NET Core C# Android™ AutoIt C C# C++ Chilkat2-Python CkPython Classic ASP DataFlex Delphi ActiveX Delphi DLL Go Java Lianja Mono C# Node.js Objective-C PHP ActiveX PHP Extension Perl PowerBuilder PowerShell PureBasic Ruby SQL Server Swift 2 Swift 3,4,5... Tcl Unicode C Unicode C++ VB.NET VBScript Visual Basic 6.0 Visual FoxPro Xojo Plugin
(PureBasic) SII Chile - FRMT Signature Computation and Add to XMLCompute the FRMT signature and add to the XML. This is the RSA signature of the SHA-1 digest of the "flattened" DD element.
IncludeFile "CkXml.pb" IncludeFile "CkStringBuilder.pb" IncludeFile "CkPrivateKey.pb" IncludeFile "CkRsa.pb" Procedure ChilkatExample() ; 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 xml.i = CkXml::ckCreate() If xml.i = 0 Debug "Failed to create object." ProcedureReturn EndIf ; 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> success.i = CkXml::ckLoadXmlFile(xml,"qa_data/xml_dsig/sii_cl/test_1.xml") If success = 0 Debug "Failed to load initial XML file." CkXml::ckDispose(xml) ProcedureReturn EndIf ; Get a reference to the "DD" element ddXml.i = CkXml::ckFindChild(xml,"Documento|TED|DD") If CkXml::ckLastMethodSuccess(xml) = 0 Debug "Failed to find DD element" CkXml::ckDispose(xml) ProcedureReturn 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), sbFlattened.i = CkStringBuilder::ckCreate() If sbFlattened.i = 0 Debug "Failed to create object." ProcedureReturn EndIf CkXml::setCkEmitCompact(ddXml, 1) CkXml::setCkEmitXmlDecl(ddXml, 0) CkXml::ckGetXmlSb(ddXml,sbFlattened) ; 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. privKey.i = CkPrivateKey::ckCreate() If privKey.i = 0 Debug "Failed to create object." ProcedureReturn EndIf success = CkPrivateKey::ckLoadAnyFormatFile(privKey,"qa_data/rsa/rsaPrivKey_pkcs8.pem","") If success = 0 Debug CkPrivateKey::ckLastErrorText(privKey) CkXml::ckDispose(xml) CkStringBuilder::ckDispose(sbFlattened) CkPrivateKey::ckDispose(privKey) ProcedureReturn EndIf rsa.i = CkRsa::ckCreate() If rsa.i = 0 Debug "Failed to create object." ProcedureReturn EndIf CkRsa::ckImportPrivateKeyObj(rsa,privKey) CkRsa::setCkEncodingMode(rsa, "base64") CkRsa::setCkCharset(rsa, "iso-8859-1") sig.s = CkRsa::ckSignStringENC(rsa,CkStringBuilder::ckGetAsString(sbFlattened),"sha1") ; Add the FRMT signature element to the XML. CkXml::ckUpdateChildContent(xml,"Documento|TED|FRMT",sig) CkXml::ckUpdateAttrAt(xml,"Documento|TED|FRMT",1,"algoritmo","SHA1withRSA") CkXml::ckDispose(ddXml) ; See what we have: CkXml::setCkEmitCompact(xml, 0) CkXml::setCkEmitXmlDecl(xml, 1) Debug CkXml::ckGetXml(xml) CkXml::ckDispose(xml) CkStringBuilder::ckDispose(sbFlattened) CkPrivateKey::ckDispose(privKey) CkRsa::ckDispose(rsa) ProcedureReturn EndProcedure |
© 2000-2024 Chilkat Software, Inc. All Rights Reserved.