You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
38 lines
1.3 KiB
38 lines
1.3 KiB
from lxml import etree
|
|
from pytrustnfe.certificado import extract_cert_and_key_from_pfx
|
|
from signxml import XMLSigner, methods
|
|
from pytrustnfe.nfe.assinatura import Assinatura as _Assinatura
|
|
|
|
|
|
class Assinatura(_Assinatura):
|
|
|
|
def assina_xml(self, xml_element):
|
|
cert, key = extract_cert_and_key_from_pfx(self.arquivo, self.senha)
|
|
|
|
for element in xml_element.iter("*"):
|
|
if element.text is not None and not element.text.strip():
|
|
element.text = None
|
|
|
|
signer = XMLSigner(
|
|
method=methods.enveloped,
|
|
signature_algorithm=u"rsa-sha1",
|
|
digest_algorithm=u"sha1",
|
|
c14n_algorithm=u"http://www.w3.org/TR/2001/REC-xml-c14n-20010315",
|
|
)
|
|
|
|
ns = {}
|
|
ns[None] = signer.namespaces["ds"]
|
|
signer.namespaces = ns
|
|
element_signed = xml_element.find(".//{http://nfse.goiania.go.gov.br/xsd/nfse_gyn_v02.xsd}Rps")
|
|
signed_root = signer.sign(
|
|
xml_element, key=key.encode(), cert=cert.encode()
|
|
)
|
|
signature = signed_root.find(
|
|
".//{http://www.w3.org/2000/09/xmldsig#}Signature"
|
|
)
|
|
|
|
if element_signed is not None and signature is not None:
|
|
parent = xml_element.getchildren()[0]
|
|
parent.append(signature)
|
|
|
|
return etree.tostring(xml_element, encoding=str)
|