Sample code for 30+ languages & platforms
SQL Server

Paraguay E-Invoicing Signed XML (SIFEN)

See more XML Digital Signatures Examples

Demonstrates how to sign XML for e-invoicing -- SISTEMA INTEGRADO DE FACTURACIÓN ELECTRÓNICA NACIONAL (SIFEN). This is for signing XML files that need to be submitted to a government agency (Country Paraguay, SIFEN / EKUATIA, Sistema Nacional de Facturacion Electrónica).

Chilkat SQL Server Downloads

SQL Server
-- Important: See this note about string length limitations for strings returned by sp_OAMethod calls.
--
CREATE PROCEDURE ChilkatSample
AS
BEGIN
    DECLARE @hr int
    -- Important: Do not use nvarchar(max).  See the warning about using nvarchar(max).
    DECLARE @sTmp0 nvarchar(4000)
    DECLARE @success int
    SELECT @success = 0

    SELECT @success = 1

    -- Create the XML to be signed...

    -- Use this online tool to generate code from sample XML: 
    -- Generate Code to Create XML

    DECLARE @xmlToSign int
    EXEC @hr = sp_OACreate 'Chilkat.Xml', @xmlToSign OUT
    IF @hr <> 0
    BEGIN
        PRINT 'Failed to create ActiveX component'
        RETURN
    END

    EXEC sp_OASetProperty @xmlToSign, 'Tag', 'rDE'
    EXEC sp_OAMethod @xmlToSign, 'AddAttribute', @success OUT, 'xmlns', 'http://ekuatia.set.gov.py/sifen/xsd'
    EXEC sp_OAMethod @xmlToSign, 'AddAttribute', @success OUT, 'xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance'
    EXEC sp_OAMethod @xmlToSign, 'AddAttribute', @success OUT, 'xsi:schemaLocation', 'http://ekuatia.set.gov.py/sifen/xsd siRecepDE_v150.xsd'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'dVerFor', '150'
    EXEC sp_OAMethod @xmlToSign, 'UpdateAttrAt', @success OUT, 'DE', 1, 'Id', '01800228774059001001501012022091519999999990'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|dDVId', '0'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|dFecFirma', '2022-09-15T10:23:05'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|dSisFact', '1'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gOpeDE|iTipEmi', '1'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gOpeDE|dDesTipEmi', 'Normal'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gOpeDE|dCodSeg', '999999999'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gOpeDE|dInfoEmi', 'GENERADA DE PEDIDO 131043202'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gTimb|iTiDE', '1'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gTimb|dDesTiDE', 'Factura electr�nica'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gTimb|dNumTim', '18889014'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gTimb|dEst', '059'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gTimb|dPunExp', '001'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gTimb|dNumDoc', '0015010'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gTimb|dFeIniT', '2022-05-25'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gDatGralOpe|dFeEmiDE', '2022-09-15T10:22:57'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gDatGralOpe|gOpeCom|iTipTra', '1'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gDatGralOpe|gOpeCom|dDesTipTra', 'Venta de mercader�a'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gDatGralOpe|gOpeCom|iTImp', '1'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gDatGralOpe|gOpeCom|dDesTImp', 'IVA'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gDatGralOpe|gOpeCom|cMoneOpe', 'PYG'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gDatGralOpe|gOpeCom|dDesMoneOpe', 'Guarani'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gDatGralOpe|gEmis|dRucEm', '80022877'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gDatGralOpe|gEmis|dDVEmi', '4'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gDatGralOpe|gEmis|iTipCont', '1'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gDatGralOpe|gEmis|cTipReg', '1'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gDatGralOpe|gEmis|dNomEmi', 'ABCDEF SA'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gDatGralOpe|gEmis|dNomFanEmi', 'ABCDEF SA'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gDatGralOpe|gEmis|dDirEmi', 'Jos� Abcde Xyz N� 666 e/Abxyz123'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gDatGralOpe|gEmis|dNumCas', '0'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gDatGralOpe|gEmis|dCompDir1', 'N/A'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gDatGralOpe|gEmis|dCompDir2', 'N/A'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gDatGralOpe|gEmis|cDepEmi', '12'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gDatGralOpe|gEmis|dDesDepEmi', 'CENTRAL'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gDatGralOpe|gEmis|cDisEmi', '153'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gDatGralOpe|gEmis|dDesDisEmi', 'CAPIATA'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gDatGralOpe|gEmis|cCiuEmi', '1234'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gDatGralOpe|gEmis|dDesCiuEmi', 'CAPIATA'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gDatGralOpe|gEmis|dTelEmi', '(022) 1111 000'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gDatGralOpe|gEmis|dEmailE', 'somebody@example.com.py'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gDatGralOpe|gEmis|dDenSuc', 'PUNTO 99'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gDatGralOpe|gEmis|gActEco|cActEco', '47721'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gDatGralOpe|gEmis|gActEco|dDesActEco', 'COMERCIO AL POR MENOR DE PRODUCTOS'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gDatGralOpe|gDatRec|iNatRec', '1'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gDatGralOpe|gDatRec|iTiOpe', '2'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gDatGralOpe|gDatRec|cPaisRec', 'PRY'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gDatGralOpe|gDatRec|dDesPaisRe', 'Paraguay'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gDatGralOpe|gDatRec|iTiContRec', '2'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gDatGralOpe|gDatRec|dRucRec', '80082971'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gDatGralOpe|gDatRec|dDVRec', '9'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gDatGralOpe|gDatRec|dNomRec', 'XXXXXXX'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gDatGralOpe|gDatRec|dNomFanRec', 'XXXXXXX'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gDatGralOpe|gDatRec|dNumCasRec', '0'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gDatGralOpe|gDatRec|dCodCliente', '9999999'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gDtipDE|gCamFE|iIndPres', '1'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gDtipDE|gCamFE|dDesIndPres', 'Operaci�n presencial'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gDtipDE|gCamCond|iCondOpe', '1'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gDtipDE|gCamCond|dDCondOpe', 'Contado'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gDtipDE|gCamCond|gPaConEIni|iTiPago', '1'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gDtipDE|gCamCond|gPaConEIni|dDesTiPag', 'Efectivo'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gDtipDE|gCamCond|gPaConEIni|dMonTiPag', '100000.0000'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gDtipDE|gCamCond|gPaConEIni|cMoneTiPag', 'PYG'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gDtipDE|gCamCond|gPaConEIni|dDMoneTiPag', 'Guarani'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gDtipDE|gCamCond|gPaConEIni[1]|iTiPago', '1'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gDtipDE|gCamCond|gPaConEIni[1]|dDesTiPag', 'Efectivo'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gDtipDE|gCamCond|gPaConEIni[1]|dMonTiPag', '73600.0000'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gDtipDE|gCamCond|gPaConEIni[1]|cMoneTiPag', 'PYG'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gDtipDE|gCamCond|gPaConEIni[1]|dDMoneTiPag', 'Guarani'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gDtipDE|gCamItem|dCodInt', '818181'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gDtipDE|gCamItem|dDesProSer', 'Widget Abc Xyz'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gDtipDE|gCamItem|cUniMed', '77'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gDtipDE|gCamItem|dDesUniMed', 'UNI'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gDtipDE|gCamItem|dCantProSer', '2.0000'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gDtipDE|gCamItem|gValorItem|dPUniProSer', '16500.0000'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gDtipDE|gCamItem|gValorItem|dTotBruOpeItem', '33000.0000'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gDtipDE|gCamItem|gValorItem|gValorRestaItem|dDescItem', '3300.0000'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gDtipDE|gCamItem|gValorItem|gValorRestaItem|dPorcDesIt', '20.0000'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gDtipDE|gCamItem|gValorItem|gValorRestaItem|dTotOpeItem', '26400.0000'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gDtipDE|gCamItem|gCamIVA|iAfecIVA', '1'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gDtipDE|gCamItem|gCamIVA|dDesAfecIVA', 'Gravado IVA'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gDtipDE|gCamItem|gCamIVA|dPropIVA', '100'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gDtipDE|gCamItem|gCamIVA|dTasaIVA', '5'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gDtipDE|gCamItem|gCamIVA|dBasGravIVA', '25142.8571'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gDtipDE|gCamItem|gCamIVA|dLiqIVAItem', '1257.1429'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gTotSub|dSubExe', '0.0000'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gTotSub|dSub5', '26400.0000'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gTotSub|dSub10', '0.0000'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gTotSub|dTotOpe', '26400.0000'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gTotSub|dTotDesc', '6600.0000'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gTotSub|dTotDescGlotem', '0.0000'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gTotSub|dTotAntItem', '0.0000'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gTotSub|dTotAnt', '0.0000'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gTotSub|dPorcDescTotal', '0.0000'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gTotSub|dDescTotal', '6600.0000'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gTotSub|dAnticipo', '0.0000'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gTotSub|dRedon', '0.0000'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gTotSub|dTotGralOpe', '26400.0000'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gTotSub|dIVA5', '1257.1429'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gTotSub|dIVA10', '0.0000'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gTotSub|dTotIVA', '1257.1429'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gTotSub|dBaseGrav5', '25142.8571'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gTotSub|dBaseGrav10', '0.0000'
    EXEC sp_OAMethod @xmlToSign, 'UpdateChildContent', NULL, 'DE|gTotSub|dTBasGraIVA', '25142.8571'

    DECLARE @gen int
    EXEC @hr = sp_OACreate 'Chilkat.XmlDSigGen', @gen OUT

    EXEC sp_OASetProperty @gen, 'SigLocation', 'rDE'
    EXEC sp_OASetProperty @gen, 'SigLocationMod', 0
    EXEC sp_OASetProperty @gen, 'SigNamespacePrefix', ''
    EXEC sp_OASetProperty @gen, 'SigNamespaceUri', 'http://www.w3.org/2000/09/xmldsig#'
    EXEC sp_OASetProperty @gen, 'SignedInfoCanonAlg', 'C14N'
    EXEC sp_OASetProperty @gen, 'SignedInfoDigestMethod', 'sha256'

    -- -------- Reference 1 --------
    DECLARE @xml1 int
    EXEC @hr = sp_OACreate 'Chilkat.Xml', @xml1 OUT

    EXEC sp_OASetProperty @xml1, 'Tag', 'Transforms'
    EXEC sp_OAMethod @xml1, 'UpdateAttrAt', @success OUT, 'Transform', 1, 'Algorithm', 'http://www.w3.org/2000/09/xmldsig#enveloped-signature'
    EXEC sp_OAMethod @xml1, 'UpdateAttrAt', @success OUT, 'Transform[1]', 1, 'Algorithm', 'http://www.w3.org/2001/10/xml-exc-c14n#'

    EXEC sp_OAMethod @gen, 'AddSameDocRef2', @success OUT, '01800228774059001001501012022091516941989060', 'sha256', @xml1, ''

    -- Provide a certificate + private key. (PFX password is test123)
    DECLARE @cert int
    EXEC @hr = sp_OACreate 'Chilkat.Cert', @cert OUT

    EXEC sp_OAMethod @cert, 'LoadPfxFile', @success OUT, 'qa_data/pfx/cert_test123.pfx', 'test123'
    IF @success <> 1
      BEGIN
        EXEC sp_OAGetProperty @cert, 'LastErrorText', @sTmp0 OUT
        PRINT @sTmp0
        EXEC @hr = sp_OADestroy @xmlToSign
        EXEC @hr = sp_OADestroy @gen
        EXEC @hr = sp_OADestroy @xml1
        EXEC @hr = sp_OADestroy @cert
        RETURN
      END
    EXEC sp_OAMethod @gen, 'SetX509Cert', @success OUT, @cert, 1

    EXEC sp_OASetProperty @gen, 'KeyInfoType', 'X509Data'
    EXEC sp_OASetProperty @gen, 'X509Type', 'Certificate'

    -- Load XML to be signed...
    DECLARE @sbXml int
    EXEC @hr = sp_OACreate 'Chilkat.StringBuilder', @sbXml OUT

    EXEC sp_OAMethod @xmlToSign, 'GetXmlSb', @success OUT, @sbXml

    EXEC sp_OASetProperty @gen, 'Behaviors', 'IndentedSignature'

    -- Sign the XML...
    EXEC sp_OAMethod @gen, 'CreateXmlDSigSb', @success OUT, @sbXml
    IF @success <> 1
      BEGIN
        EXEC sp_OAGetProperty @gen, 'LastErrorText', @sTmp0 OUT
        PRINT @sTmp0
        EXEC @hr = sp_OADestroy @xmlToSign
        EXEC @hr = sp_OADestroy @gen
        EXEC @hr = sp_OADestroy @xml1
        EXEC @hr = sp_OADestroy @cert
        EXEC @hr = sp_OADestroy @sbXml
        RETURN
      END
    -- -----------------------------------------------

    -- Save the signed XML to a file.
    EXEC sp_OAMethod @sbXml, 'WriteFile', @success OUT, 'c:/temp/qa_output/signedXml.xml', 'utf-8', 0

    EXEC sp_OAMethod @sbXml, 'GetAsString', @sTmp0 OUT
    PRINT @sTmp0

    -- ----------------------------------------
    -- Verify the signatures we just produced...
    DECLARE @verifier int
    EXEC @hr = sp_OACreate 'Chilkat.XmlDSig', @verifier OUT

    EXEC sp_OAMethod @verifier, 'LoadSignatureSb', @success OUT, @sbXml
    IF @success <> 1
      BEGIN
        EXEC sp_OAGetProperty @verifier, 'LastErrorText', @sTmp0 OUT
        PRINT @sTmp0
        EXEC @hr = sp_OADestroy @xmlToSign
        EXEC @hr = sp_OADestroy @gen
        EXEC @hr = sp_OADestroy @xml1
        EXEC @hr = sp_OADestroy @cert
        EXEC @hr = sp_OADestroy @sbXml
        EXEC @hr = sp_OADestroy @verifier
        RETURN
      END

    DECLARE @numSigs int
    EXEC sp_OAGetProperty @verifier, 'NumSignatures', @numSigs OUT
    DECLARE @verifyIdx int
    SELECT @verifyIdx = 0
    WHILE @verifyIdx < @numSigs
      BEGIN
        EXEC sp_OASetProperty @verifier, 'Selector', @verifyIdx
        DECLARE @verified int
        EXEC sp_OAMethod @verifier, 'VerifySignature', @verified OUT, 1
        IF @verified <> 1
          BEGIN
            EXEC sp_OAGetProperty @verifier, 'LastErrorText', @sTmp0 OUT
            PRINT @sTmp0
            EXEC @hr = sp_OADestroy @xmlToSign
            EXEC @hr = sp_OADestroy @gen
            EXEC @hr = sp_OADestroy @xml1
            EXEC @hr = sp_OADestroy @cert
            EXEC @hr = sp_OADestroy @sbXml
            EXEC @hr = sp_OADestroy @verifier
            RETURN
          END
        SELECT @verifyIdx = @verifyIdx + 1
      END

    PRINT 'All signatures were successfully verified.'

    EXEC @hr = sp_OADestroy @xmlToSign
    EXEC @hr = sp_OADestroy @gen
    EXEC @hr = sp_OADestroy @xml1
    EXEC @hr = sp_OADestroy @cert
    EXEC @hr = sp_OADestroy @sbXml
    EXEC @hr = sp_OADestroy @verifier


END
GO