se adiciona fe.DianXmlExtensionSigner.from_bytes para firmado usando bytes
FossilOrigin-Name: 39ed96abb30b2559e72d4948f2fd65de8f0e5e0f9004f0f1d4e88135b950bd61
This commit is contained in:
parent
ead21bd4f2
commit
4e68025e48
@ -283,15 +283,23 @@ class DianXMLExtensionSoftwareSecurityCode(FachoXMLExtension):
|
|||||||
class DianXMLExtensionSigner:
|
class DianXMLExtensionSigner:
|
||||||
|
|
||||||
def __init__(self, pkcs12_path, passphrase=None, mockpolicy=False):
|
def __init__(self, pkcs12_path, passphrase=None, mockpolicy=False):
|
||||||
self._pkcs12_path = pkcs12_path
|
self._pkcs12_data = open(pkcs12_path, 'rb').read()
|
||||||
self._passphrase = None
|
self._passphrase = None
|
||||||
self._mockpolicy = mockpolicy
|
self._mockpolicy = mockpolicy
|
||||||
if passphrase:
|
if passphrase:
|
||||||
self._passphrase = passphrase.encode('utf-8')
|
self._passphrase = passphrase.encode('utf-8')
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_pkcs12(self, filepath, password=None):
|
def from_bytes(cls, data, passphrase=None, mockpolicy=False):
|
||||||
p12 = OpenSSL.crypto.load_pkcs12(open(filepath, 'rb').read(), password)
|
self = cls.__new__(cls)
|
||||||
|
|
||||||
|
self._pkcs12_data = data
|
||||||
|
self._passphrase = None
|
||||||
|
self._mockpolicy = mockpolicy
|
||||||
|
if passphrase:
|
||||||
|
self._passphrase = passphrase.encode('utf-8')
|
||||||
|
|
||||||
|
return self
|
||||||
|
|
||||||
def sign_xml_string(self, document):
|
def sign_xml_string(self, document):
|
||||||
xml = LXMLBuilder.from_string(document)
|
xml = LXMLBuilder.from_string(document)
|
||||||
@ -347,7 +355,7 @@ class DianXMLExtensionSigner:
|
|||||||
POLICY_NAME,
|
POLICY_NAME,
|
||||||
xmlsig.constants.TransformSha256)
|
xmlsig.constants.TransformSha256)
|
||||||
ctx = xades.XAdESContext(policy)
|
ctx = xades.XAdESContext(policy)
|
||||||
ctx.load_pkcs12(OpenSSL.crypto.load_pkcs12(open(self._pkcs12_path, 'rb').read(),
|
ctx.load_pkcs12(OpenSSL.crypto.load_pkcs12(self._pkcs12_data,
|
||||||
self._passphrase))
|
self._passphrase))
|
||||||
|
|
||||||
if self._mockpolicy:
|
if self._mockpolicy:
|
||||||
@ -459,8 +467,8 @@ class DianZIP:
|
|||||||
|
|
||||||
class DianXMLExtensionSignerVerifier:
|
class DianXMLExtensionSignerVerifier:
|
||||||
|
|
||||||
def __init__(self, pkcs12_path, passphrase=None, mockpolicy=False):
|
def __init__(self, pkcs12_path_or_bytes, passphrase=None, mockpolicy=False):
|
||||||
self._pkcs12_path = pkcs12_path
|
self._pkcs12_path_or_bytes = pkcs12_path_or_bytes
|
||||||
self._passphrase = None
|
self._passphrase = None
|
||||||
self._mockpolicy = mockpolicy
|
self._mockpolicy = mockpolicy
|
||||||
if passphrase:
|
if passphrase:
|
||||||
@ -477,7 +485,12 @@ class DianXMLExtensionSignerVerifier:
|
|||||||
fachoxml.root.append(signature)
|
fachoxml.root.append(signature)
|
||||||
|
|
||||||
ctx = xades.XAdESContext()
|
ctx = xades.XAdESContext()
|
||||||
ctx.load_pkcs12(OpenSSL.crypto.load_pkcs12(open(self._pkcs12_path, 'rb').read(),
|
|
||||||
|
pkcs12_data = self._pkcs12_path_or_bytes
|
||||||
|
if isinstance(self._pkcs12_path_or_bytes, str):
|
||||||
|
pkcs12_data = open(self._pkcs12_path_or_bytes, 'rb').read()
|
||||||
|
|
||||||
|
ctx.load_pkcs12(OpenSSL.crypto.load_pkcs12(pkcs12_data,
|
||||||
self._passphrase))
|
self._passphrase))
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
@ -110,3 +110,19 @@ def test_xml_sign_dian(monkeypatch):
|
|||||||
helpers.mock_urlopen(m)
|
helpers.mock_urlopen(m)
|
||||||
xmlsigned = signer.sign_xml_string(xmlstring)
|
xmlsigned = signer.sign_xml_string(xmlstring)
|
||||||
assert "Signature" in xmlsigned
|
assert "Signature" in xmlsigned
|
||||||
|
|
||||||
|
def test_xml_sign_dian_using_bytes(monkeypatch):
|
||||||
|
xml = fe.FeXML('Invoice',
|
||||||
|
'http://www.dian.gov.co/contratos/facturaelectronica/v1')
|
||||||
|
xml.find_or_create_element('/fe:Invoice/ext:UBLExtensions/ext:UBLExtension/ext:ExtensionContent')
|
||||||
|
ublextension = xml.fragment('/fe:Invoice/ext:UBLExtensions/ext:UBLExtension', append=True)
|
||||||
|
extcontent = ublextension.find_or_create_element('/ext:UBLExtension/ext:ExtensionContent')
|
||||||
|
|
||||||
|
xmlstring = xml.tostring()
|
||||||
|
p12_data = open('./tests/example.p12', 'rb').read()
|
||||||
|
signer = fe.DianXMLExtensionSigner.from_bytes(p12_data)
|
||||||
|
|
||||||
|
with monkeypatch.context() as m:
|
||||||
|
helpers.mock_urlopen(m)
|
||||||
|
xmlsigned = signer.sign_xml_string(xmlstring)
|
||||||
|
assert "Signature" in xmlsigned
|
||||||
|
Loading…
Reference in New Issue
Block a user