def gen_digital_seal(contract, path_to_cer, path_to_pem, password, partner_id=None, taxpayer_id=None): today = timezone.now() signed_date = datetime.datetime.strftime(today, '%Y-%m-%dT%H:%M:%S') certificate = X509.load_cert(str(path_to_cer), M2Crypto.X509.FORMAT_DER) private_key = cryptoRSA.importKey(open(path_to_pem).read()) der_key = private_key.exportKey("DER") results_of_operations = [] for file_type in ["privacy_notice_file", "service_contract_file"]: try: document_filled = fill_content_templates(contract=contract, signed_date=signed_date, file_type=file_type, finkok_legal_person=settings.FINKOK_LEGAL_PERSON, finkok_taxpayer_id=settings.FINKOK_TAXPAYER_ID, finkok_address=settings.FINKOK_ADDRESS, finkok_url=settings.FINKOK_URL, finkok_email=settings.FINKOK_MAIL) manifiesto = etree.fromstring(document_filled).getroottree() xml_signed = XMLDSig.sign(manifiesto.getroot(), certificate, der_key, passphrase=password) xml_validity = XMLDSig.verify(xml_signed) write_xmls_signed(contract, xml_signed, file_type, partner_id, taxpayer_id) if xml_validity and (file_type == "service_contract_file"): contract.signed_date = signed_date contract.original_string = etree.tostring(xml_signed, pretty_print=True) contract.status = 'I' contract.save() results_of_operations.append(xml_validity) except Exception as e: print(e) return all(results_of_operations)
def get_text_from_seal(xml_signed): manifest = xml_signed.xpath('/documento/contrato')[0].text signature = XMLDSig._get_signature_x509_for_rml(xml_signed) cert = XMLDSig._get_cer_from_public_key_x509(xml_signed) return manifest, signature, cert