se adiciona fe.DianXmlExtensionSigner.from_bytes para firmado usando bytes
FossilOrigin-Name: 39ed96abb30b2559e72d4948f2fd65de8f0e5e0f9004f0f1d4e88135b950bd61
This commit is contained in:
		| @@ -283,16 +283,24 @@ 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) | ||||||
|         signature = self.sign_xml_element(xml) |         signature = self.sign_xml_element(xml) | ||||||
| @@ -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 | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user