5 changed files with 59 additions and 10 deletions
-
14pytrustnfe/nfse/bh/__init__.py
-
44pytrustnfe/nfse/bh/assinatura.py
-
8pytrustnfe/nfse/bh/templates/GerarNfse.xml
-
2pytrustnfe/nfse/bh/templates/Rps.xml
-
1setup.py
@ -0,0 +1,44 @@ |
|||
# -*- coding: utf-8 -*- |
|||
# © 2016 Danimar Ribeiro, Trustcode |
|||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). |
|||
|
|||
import signxml |
|||
from lxml import etree |
|||
from pytrustnfe.certificado import extract_cert_and_key_from_pfx |
|||
from signxml import XMLSigner |
|||
|
|||
|
|||
class Assinatura(object): |
|||
|
|||
def __init__(self, arquivo, senha): |
|||
self.arquivo = arquivo |
|||
self.senha = senha |
|||
|
|||
def assina_xml(self, xml_element, reference): |
|||
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=signxml.methods.enveloped, signature_algorithm="rsa-sha1", |
|||
digest_algorithm='sha1', |
|||
c14n_algorithm='http://www.w3.org/TR/2001/REC-xml-c14n-20010315') |
|||
|
|||
ns = {} |
|||
ns[None] = signer.namespaces['ds'] |
|||
signer.namespaces = ns |
|||
|
|||
ref_uri = ('#%s' % reference) if reference else None |
|||
signed_root = signer.sign( |
|||
xml_element, key=key.encode(), cert=cert.encode(), |
|||
reference_uri=ref_uri) |
|||
if reference: |
|||
element_signed = signed_root.find(".//*[@Id='%s']" % reference) |
|||
signature = signed_root.find(".//*[@URI='#%s']" % reference).getparent().getparent() |
|||
|
|||
if element_signed is not None and signature is not None: |
|||
parent = element_signed.getparent() |
|||
parent.append(signature) |
|||
return etree.tostring(signed_root, encoding=str) |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue