SQL Server
SQL Server
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 SQL Server Downloads
-- Important: See this note about string length limitations for strings returned by sp_OAMethod calls.
--
CREATE PROCEDURE ChilkatSample
AS
BEGIN
DECLARE @hr int
DECLARE @iTmp0 int
-- Important: Do not use nvarchar(max). See the warning about using nvarchar(max).
DECLARE @sTmp0 nvarchar(4000)
DECLARE @success int
SELECT @success = 0
-- 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
DECLARE @xml int
EXEC @hr = sp_OACreate 'Chilkat.Xml', @xml OUT
IF @hr <> 0
BEGIN
PRINT 'Failed to create ActiveX component'
RETURN
END
-- 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>
EXEC sp_OAMethod @xml, 'LoadXmlFile', @success OUT, 'qa_data/xml_dsig/sii_cl/test_1.xml'
IF @success = 0
BEGIN
PRINT 'Failed to load initial XML file.'
EXEC @hr = sp_OADestroy @xml
RETURN
END
-- Get a reference to the "DD" element
DECLARE @ddXml int
EXEC sp_OAMethod @xml, 'FindChild', @ddXml OUT, 'Documento|TED|DD'
EXEC sp_OAGetProperty @xml, 'LastMethodSuccess', @iTmp0 OUT
IF @iTmp0 = 0
BEGIN
PRINT 'Failed to find DD element'
EXEC @hr = sp_OADestroy @xml
RETURN
END
-- 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),
DECLARE @sbFlattened int
EXEC @hr = sp_OACreate 'Chilkat.StringBuilder', @sbFlattened OUT
EXEC sp_OASetProperty @ddXml, 'EmitCompact', 1
EXEC sp_OASetProperty @ddXml, 'EmitXmlDecl', 0
EXEC sp_OAMethod @ddXml, 'GetXmlSb', @success OUT, @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.
DECLARE @privKey int
EXEC @hr = sp_OACreate 'Chilkat.PrivateKey', @privKey OUT
EXEC sp_OAMethod @privKey, 'LoadAnyFormatFile', @success OUT, 'qa_data/rsa/rsaPrivKey_pkcs8.pem', ''
IF @success = 0
BEGIN
EXEC sp_OAGetProperty @privKey, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @xml
EXEC @hr = sp_OADestroy @sbFlattened
EXEC @hr = sp_OADestroy @privKey
RETURN
END
DECLARE @rsa int
EXEC @hr = sp_OACreate 'Chilkat.Rsa', @rsa OUT
EXEC sp_OAMethod @rsa, 'UsePrivateKey', @success OUT, @privKey
EXEC sp_OASetProperty @rsa, 'EncodingMode', 'base64'
EXEC sp_OASetProperty @rsa, 'Charset', 'iso-8859-1'
DECLARE @sig nvarchar(4000)
EXEC sp_OAMethod @sbFlattened, 'GetAsString', @sTmp0 OUT
EXEC sp_OAMethod @rsa, 'SignStringENC', @sig OUT, @sTmp0, 'sha1'
-- Add the FRMT signature element to the XML.
EXEC sp_OAMethod @xml, 'UpdateChildContent', NULL, 'Documento|TED|FRMT', @sig
EXEC sp_OAMethod @xml, 'UpdateAttrAt', @success OUT, 'Documento|TED|FRMT', 1, 'algoritmo', 'SHA1withRSA'
EXEC @hr = sp_OADestroy @ddXml
-- See what we have:
EXEC sp_OASetProperty @xml, 'EmitCompact', 0
EXEC sp_OASetProperty @xml, 'EmitXmlDecl', 1
EXEC sp_OAMethod @xml, 'GetXml', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @xml
EXEC @hr = sp_OADestroy @sbFlattened
EXEC @hr = sp_OADestroy @privKey
EXEC @hr = sp_OADestroy @rsa
END
GO