U
    +”}fJ  ã                   @   sÖ   d dl mZ d dlmZ d dlmZ d dlZd dlZd dlmZ d dlmZ ddl	T d dl
Z
d dlm  mZ ddlT d dlZd dlZd dlZdZd	d
„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )é    )Úpkcs12)Údatetime)ÚKeyUsageN)Úcryptoé   )Ú*éL   c           
      C   sš   t  ¡ }t | |¡\}}}g }g }|jt  ¡ kr:| |¡ |D ]}|j|kr>| |¡ q>|D ]4}|jD ](}	t|	jƒt	krf|	jj
dkrf| |¡ qfq\||fS )NT)r   Únowr   Zload_key_and_certificatesZnot_valid_afterÚappendÚ
extensionsÚtypeÚvaluer   Zdigital_signature)
ÚarchivoÚpasswordZfecha_hora_actualZprivate_keyZcertificateZadditional_certificatesZcertificados_no_caducadosZcertificados_validosÚcertÚext© r   ú:/tmp/pip-unpacked-wheel-ut9z9pyt/xades_bes_sri_ec/xades.pyÚget_certificados_validos   s    


r   c                 C   sâ   d }| |  ¡ dœ}djf |Ž}tj|dd}|  ¡ }d}d}t||dd}g }	|D ]0}
d	 ||¡}tj||
tjd
}|rR|	 |
¡ qRt	|	ƒdkr¨|	D ]}
d|
kr”|
}q”nt	|	ƒdkr¼|	d }t||dd}t	|ƒdkrÞ|d S |S )N)Zrutar   zX openssl pkcs12  -in '{ruta}' -nocerts -passin pass:{password} -passout pass:{password} T©Úshellz%-----BEGIN ENCRYPTED PRIVATE KEY-----z#-----END ENCRYPTED PRIVATE KEY-----F)Zappend_startz	{}(.+?){}©Úflagsr   zSigning Keyr   )
ÚdecodeÚformatÚ
subprocessÚcheck_outputZseparar_cadenaÚreÚsearchÚDOTALLr
   Úlen)Úruta_p12r   Zclave_privada_firmaÚdataZCMD_OPENSSLÚ
salida_cmdZdelimitador_inicioZdelimitador_finalZclaves_privadasZclaves_validasÚcpÚregexÚmr   r   r   Úget_clave_privada.   s4    þr'   c              	   C   s^   d  t ¡ ¡}t|dƒ}| | ¡ W 5 Q R X d  |¡}tj|dd}| d¡}t 	|¡ |S )Nz/tmp/{}.xmlÚwzxmllint --c14n {}Tr   zutf-8)
r   ÚuuidZuuid4ÚopenÚwriter   r   r   ÚosÚremove)ZcadZarchivo_tmpr   ZCMD_XMLLINTr#   r   r   r   Úget_c14nb   s    


r.   c                 C   s8   d  | ¡}| d¡}t t |d¡d¡ ¡ }| ¡ }|S )Nú{:X}é   ÚHEXÚBASE64)r   ÚzfillÚcodecsÚencoder   Ústrip)Zexp_intÚexponentr   r   r   Úget_exponentes   s
    

r8   c                 C   sF   d  | ¡}t d|¡}tdd„ |ƒ}d |¡}t|dƒ}t|tƒ}|S )Nr/   z(\w{2})c                 S   s   t t| dƒƒS )Né   )ÚchrÚint)Úxr   r   r   Ú<lambda>„   ó    zget_modulo.<locals>.<lambda>Ú zLATIN-1)r   r   ÚfindallÚmapÚjoinÚencode_base64Úsplit_string_every_nÚMAX_LINE_SIZE)Zmod_intÚmodulor   r   r   Ú
get_modulo}   s    



rG   c                 C   s@   t | ƒ}tjd|tjd}|d  dd¡ dd¡}t|tƒ}|S )Nz9-----BEGIN CERTIFICATE-----(.*?)-----END CERTIFICATE-----r   r   Ú
r?   z\n)Ústrr   r@   r   ÚreplacerD   rE   )r   Zcertificate_pem_tmpZcertX509r   r   r   Úget_certificate_x509Ž   s     þ
rK   c           ,   
   C   sB  t | |ƒ\}}t|ƒdkr"tdƒ‚|d }t tj|¡}t|ƒ}	t tj|¡}
t tj|
¡}t	|ƒ}t
| ¡  ¡ jƒ}t| ¡  ¡ jƒ}|
 ¡ }|
 ¡ }d dd„ | ¡ D ƒ¡}| d¡rÈ| ddd¡n|}t t |¡¡}t|ƒ}t	| ¡ ƒ}tƒ }tƒ }tƒ }tƒ }tƒ }tƒ }tƒ }tƒ }t||||||ƒ}| dd	t ¡}t|ƒ}t	| ¡ ƒ}t||	||ƒ}| d
dt ¡} t	|  d¡ƒ}!t|||||!||||ƒ	}"|" ddt ¡}#t|#ƒ}#t ||ƒ}$t !tj|$|¡}%t "|%|# ¡ d¡}&t#|&ƒ}'t$|'t%ƒ}'t&t||||"|'||ƒ}(t'|ƒ})| |)|(|) ¡}*t(|dƒ}+|+ )|*¡ W 5 Q R X d S )Nr   u*   No se han encontrado certificados vÃ¡lidosr?   c                 s   s&   | ]\}}d   | ¡ | ¡ ¡V  qdS )z,{0:s}={1:s}N)r   r   )Ú.0Únamer   r   r   r   Ú	<genexpr>³   s     z.procesar_firmar_comprobante.<locals>.<genexpr>ú,r   z<etsi:SignedPropertiesz<etsi:SignedProperties z<ds:KeyInfoz<ds:KeyInfo zUTF-8z<ds:SignedInfoz<ds:SignedInfo ÚSHA1r(   )*r   r    Ú	Exceptionr   Zdump_certificateZFILETYPE_PEMrK   Zload_certificateZFILETYPE_ASN1Zsha1_base64rG   Z
public_keyZpublic_numbersÚnr8   ÚeZget_serial_numberZ
get_issuerrB   Zget_componentsÚ
startswithrJ   ÚETÚElementTreeÚ
fromstringr.   r5   Zp_obtener_aleatorioZget_signed_propertiesÚxmlnsZget_key_infoZget_signed_infor'   Zload_privatekeyÚsignrC   rD   rE   Zget_xades_besZget_xml_nodo_finalr*   r+   ),Zarchivo_p12r!   r   ÚxmlÚruta_xml_authZcertificadosÚ_r   Zcertificate_pemZcertificateX509Zcert_pemZcert_derZcertificateX509_der_hashrF   Z	exponenteZserial_numberZissuer_nameZxml_element_treeZxml_no_headerZsha1_comprobanteZcertificate_numberZsignature_numberZsigned_properties_numberZsigned_info_numberZsigned_properties_id_numberZreference_id_numberZsignature_value_numberZobject_numberZsigned_propertiesZsigned_properties_para_hashZsha1_signed_propertiesZkey_infoZkey_info_para_hashZsha1_certificadoZsigned_infoZsigned_info_para_firmaZpriv_keyZpkeyrY   Ú	signatureZ	xades_besZtail_tagZcomprobanter   r   r   r   Úprocesar_firmar_comprobante   s~        þ      ý

r^   c                 C   s.   t | dƒ}t |ƒ}| ¡ }t|| |||ƒ d S )NÚrb)Zleer_archivor5   r^   )r!   r   Zruta_xmlr[   r   rZ   r   r   r   Úfirmar_comprobante÷   s    
r`   )Z,cryptography.hazmat.primitives.serializationr   r   Zcryptography.x509.extensionsr   r   r4   ZOpenSSLr   Zcadenasr   Úxml.etree.ElementTreeÚetreerV   rU   ÚutilsÚargparser)   r,   rE   r   r'   r.   r8   rG   rK   r^   r`   r   r   r   r   Ú<module>   s,   4
Z