Fwd: Pasar Vb.net a Windev

146 views
Skip to first unread message

Daniel Sánchez

unread,
Dec 4, 2017, 5:58:50 PM12/4/17
to wind...@googlegroups.com
Estoy intentando pasar el siguiente código para firmar un documento xml de vb.net a windev me he trabado en las siguientes lineas en las que me marca error windev los cuales están marcados de color amarillo, agradezco su colaboración. Lo marcado windev no lo reconoce como método o propiedad de la clase .net, otra cosa no se si estoy usando correctamente el comando for each, ya que por el error todavía no llego hasta esa línea de código.

scertificado  ="C:\My projects\My_FElectronica\Exe\64-bit Windows executable\Certificados\mycertificado.pfx"
sClave ="MPS20160603328599"
sRutaArchivo="C:\My projects\My_FElectronica\Exe\64-bit Windows executable\"+sarchivo


sRpta is string
sLocal_typodocumento is string =Middle(sarchivo,13,2)
sPath is string = ""
sCertificat is string= scertificado
sPwd is string = sClave
sXmlfile is string = sRutaArchivo
clMoncertificat is X509Certificate2(sCertificat,sPwd)

xmldoc is System.Xml.XmlDocument()
xmldoc.PreserveWhitespace=True
xmldoc.Load(sXmlfile)
vrSignedXml is SignedXml(xmldoc)
vrSignedXml.SigningKey=clMoncertificat.PrivateKey
clVkeyinfo is KeyInfo()
clReferencia is Reference
clReferencia.uri=""
clEnv is XmlDsigEnvelopedSignatureTransform
vrSignedXml.AddReference(clReferencia)
clVx509chain is X509Chain()
clVx509chain.Build(clMoncertificat)
clLocal_element is X509ChainElement = X509Chain.chainelements(0)

x509data is KeyInfoX509Data(clLocal_element.Certificate)
subjectname is string = clLocal_element.Certificate.Subject
x509data.AddSubjectName(subjectname)
clVkeyinfo.AddClause(x509data)
vrSignedXml.KeyInfo=KeyInfo
vrSignedXml.ComputeSignature()
vrsignature is XmlElement<- vrSignedXml.GetXml()
vrsignature.Prefix="ds"
vrSignedXml.ComputeSignature()
mainnode   is XmlNode
FOR EACH mainnode OF vrsignature.SelectNodes("descendant-or-self::*[namespace-uri()='http://www.w3.org/2000/09/xmldsig#']")
IF mainnode.localname()="Signature" THEN
newattribute is XmlAttribute <- new xmldoc.CreateAttribute("id")
newattribute.value="SignatureSP"
mainnode.attributes.append(newattribute)
END
END

clNsmgr is XmlNamespaceManager<- new XmlNamespaceManager(xmldoc.NameTable)
clNsmgr.AddNamespace("sac", "urn:sunat:names:specification:ubl:peru:schema:xsd:SunatAggregateComponents-1")
clNsmgr.AddNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance")

SWITCH sLocal_typodocumento
CASE "01", "03" //factura y boleta
clNsmgr.AddNamespace("tns", "urn:oasis:names:specification:ubl:schema:xsd:Invoice-2")
sPath = "/tns:Invoice/ext:UBLExtensions/ext:UBLExtension[2]/ext:ExtensionContent"
CASE "07" //n ota de credito
clNsmgr.AddNamespace("tns", "urn:oasis:names:specification:ubl:schema:xsd:CreditNote-2")
sPath = "/tns:CreditNote/ext:UBLExtensions/ext:UBLExtension[2]/ext:ExtensionContent"
CASE "08" //nota de debito
clNsmgr.AddNamespace("tns", "urn:oasis:names:specification:ubl:schema:xsd:DebitNote-2")
sPath = "/tns:DebitNote/ext:UBLExtensions/ext:UBLExtension[2]/ext:ExtensionContent"
CASE "RA" // COMUNICACION DE BAJA
clNsmgr.AddNamespace("tns", "urn:sunat:names:specification:ubl:peru:schema:xsd:VoidedDocuments-1")
sPath = "/tns:VoidedDocuments/ext:UBLExtensions/ext:UBLExtension/ext:ExtensionContent"
CASE "RC" // RESUMEN DIARIO
clNsmgr.AddNamespace("tns", "urn:sunat:names:specification:ubl:peru:schema:xsd:SummaryDocuments-1")
sPath = "/tns:SummaryDocuments/ext:UBLExtensions/ext:UBLExtension/ext:ExtensionContent"
OTHER CASE
END
clNsmgr.AddNamespace("udt", "urn:un:unece:uncefact:data:specification:UnqualifiedDataTypesSchemaModule:2")
clNsmgr.AddNamespace("qdt", "urn:oasis:names:specification:ubl:schema:xsd:QualifiedDatatypes-2")
clNsmgr.AddNamespace("ds", "http://www.w3.org/2000/09/xmldsig#")

xmldoc.SelectSingleNode(sPath, clNsmgr).AppendChild(xmldoc.ImportNode(Signature, True))
xmldoc.Save(sXmlfile)

clNodelist is XmlNodeList<-xmldoc.GetElementsByTagName("ds:Signature")
IF clNodelist.Count<>1 THEN
sRpta="Se produjo error en la firma"
END
//vrSignedXml.LoadXml(clNodelist(0) is XmlElement)
//if vrSignedXml.CheckSignature()=False THEN
// sRpta="Se produjo un error en la firma de documento"
//else 
// sRpta="Ok"
//END

RESULT sRpta

****************
*Aqui el código original vb.net
****************
Imports System.IO
Imports System.IO.Compression
Imports System
Imports System.Security.Cryptography
Imports System.Security.Cryptography.Xml
Imports System.Security.Cryptography.X509Certificates
Imports System.Xml
Imports System.Data
Imports System.Data.SqlClient
Imports System.Text
Imports System.Runtime.InteropServices

Namespace firmadoCE
    <ClassInterface(ClassInterfaceType.AutoDual)> _
    <ProgId("firmadoCE.firmado")> _
    Public Class firmado
        Public Function firmar(ByVal cRutaArchivo As String, ByVal cArchivo As String, ByVal cCertificado As String, ByVal cClave As String) As String
            Dim cRpta As String
            Dim local_typoDocumento As String = cArchivo.Substring(12, 2) ' retorna 01 o 03 0 ...
            Dim l_xpath As String = ""
            Dim f_certificat As String = cCertificado
            Dim f_pwd As String = cClave
            Dim xmlFile As String = cRutaArchivo & cArchivo
            Dim MonCertificat As X509Certificate2 = New X509Certificate2(f_certificat, f_pwd)
            Dim xmlDoc As XmlDocument = New XmlDocument()
            xmlDoc.PreserveWhitespace = True
            xmlDoc.Load(xmlFile)
            Dim signedXml As SignedXml = New SignedXml(xmlDoc)
            signedXml.SigningKey = MonCertificat.PrivateKey
            Dim KeyInfo As KeyInfo = New KeyInfo()
            Dim Reference As Reference = New Reference()
            Reference.Uri = ""
            Reference.AddTransform(New XmlDsigEnvelopedSignatureTransform())
            signedXml.AddReference(Reference)
            Dim X509Chain As X509Chain = New X509Chain()
            X509Chain.Build(MonCertificat)
            Dim local_element As X509ChainElement = X509Chain.ChainElements(0)
            Dim x509Data As KeyInfoX509Data = New KeyInfoX509Data(local_element.Certificate)
            Dim subjectName As String = local_element.Certificate.Subject
            x509Data.AddSubjectName(subjectName)
            KeyInfo.AddClause(x509Data)
            signedXml.KeyInfo = KeyInfo
            signedXml.ComputeSignature()
            Dim signature As XmlElement = signedXml.GetXml()
            signature.Prefix = "ds"
            signedXml.ComputeSignature()
            For Each node As XmlNode In signature.SelectNodes("descendant-or-self::*[namespace-uri()='http://www.w3.org/2000/09/xmldsig#']")
                ' node.Prefix = "ds"
                If node.LocalName = "Signature" Then
                    Dim newAttribute As XmlAttribute = xmlDoc.CreateAttribute("Id")
                    newAttribute.Value = "SignatureSP"
                    node.Attributes.Append(newAttribute)
                End If
            Next node
            Dim nsMgr As XmlNamespaceManager
            nsMgr = New XmlNamespaceManager(xmlDoc.NameTable)
            nsMgr.AddNamespace("sac", "urn:sunat:names:specification:ubl:peru:schema:xsd:SunatAggregateComponents-1")
            nsMgr.AddNamespace("ccts", "urn:un:unece:uncefact:documentation:2")
            nsMgr.AddNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance")

            Select Case local_typoDocumento
                Case "01", "03" 'factura y boleta
                    nsMgr.AddNamespace("tns", "urn:oasis:names:specification:ubl:schema:xsd:Invoice-2")
                    l_xpath = "/tns:Invoice/ext:UBLExtensions/ext:UBLExtension[2]/ext:ExtensionContent"
                Case "07" 'n ota de credito
                    nsMgr.AddNamespace("tns", "urn:oasis:names:specification:ubl:schema:xsd:CreditNote-2")
                    l_xpath = "/tns:CreditNote/ext:UBLExtensions/ext:UBLExtension[2]/ext:ExtensionContent"
                Case "08" 'nota de debito
                    nsMgr.AddNamespace("tns", "urn:oasis:names:specification:ubl:schema:xsd:DebitNote-2")
                    l_xpath = "/tns:DebitNote/ext:UBLExtensions/ext:UBLExtension[2]/ext:ExtensionContent"
                Case "RA" ' COMUNICACION DE BAJA
                    nsMgr.AddNamespace("tns", "urn:sunat:names:specification:ubl:peru:schema:xsd:VoidedDocuments-1")
                    l_xpath = "/tns:VoidedDocuments/ext:UBLExtensions/ext:UBLExtension/ext:ExtensionContent"
                Case "RC" ' RESUMEN DIARIO
                    nsMgr.AddNamespace("tns", "urn:sunat:names:specification:ubl:peru:schema:xsd:SummaryDocuments-1")
                    l_xpath = "/tns:SummaryDocuments/ext:UBLExtensions/ext:UBLExtension/ext:ExtensionContent"
            End Select
            nsMgr.AddNamespace("cac", "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2")
            nsMgr.AddNamespace("udt", "urn:un:unece:uncefact:data:specification:UnqualifiedDataTypesSchemaModule:2")
            nsMgr.AddNamespace("ext", "urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2")
            nsMgr.AddNamespace("qdt", "urn:oasis:names:specification:ubl:schema:xsd:QualifiedDatatypes-2")
            nsMgr.AddNamespace("cbc", "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2")
            nsMgr.AddNamespace("ds", "http://www.w3.org/2000/09/xmldsig#")

            xmlDoc.SelectSingleNode(l_xpath, nsMgr).AppendChild(xmlDoc.ImportNode(signature, True))
            xmlDoc.Save(xmlFile)
            Dim nodeList As XmlNodeList = xmlDoc.GetElementsByTagName("ds:Signature")
            If (nodeList.Count <> 1) Then
                cRpta = "SE PRODUJO ERROR EN LA FIRMA"
            End If
            signedXml.LoadXml(CType(nodeList(0), XmlElement))
            If (signedXml.CheckSignature()) = False Then            ' verificacion de la firma generada
                cRpta = "SE PRODUJO UN ERROR EN LA FIRMA  DE DOCUMENTO"
            Else
                cRpta = "OK"
            End If
            Return cRpta
        End Function

    End Class
End Namespace

Ya hace días le estoy dando vuelta al tema y no logro encontrar la solución.

Saludos

--
Daniel Sánchez Escobar
Investigación y Desarrollo
Reset Software & Sistemas
Móvil +051-949398047 RPM #948615385
Trujillo - Perú

P  Sugerimos no imprimir este e-mail a menos que sea absolutamente necesario. Protejamos el medio ambiente.
Reply all
Reply to author
Forward
0 new messages