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