U
    Nf!                     @   s   d dl Z d dlmZ d dlmZmZmZmZ d dlm	Z	 d dl
mZmZ d dlmZ d dlmZ zd dlmZmZ W n ek
r   d ZZY nX d d	lmZ e eZG d
d dZdS )    N)Path)crlocsppemx509)IncrementalPdfFileWriter)signers
timestamps)SigSeedSubFilter)ValidationContext)PKCS11Signeropen_pkcs11_session)getFilec                   @   s   e Zd Zedd Zedd Zedd Zedd Zed	d
 Zedd Z	edd Z
edd Zedd Zedd Zedd Zedd Zedd Zedd Zedd ZdS ) PDFSignaturec                 C   s*   d| kr&| d }t |tr"| }|S d S )N
passphrase)
isinstancestrencodeconfigr    r   </tmp/pip-unpacked-wheel-72cw954q/xhtml2pdf/builders/signs.pyget_passphrase   s    
zPDFSignature.get_passphrasec                 C   s   g }d| krv| d }t |ts$|g}|D ]L}t |ttfrjt|}t| \}}}|t	j
| q(|| q(|s~d S |S )Nca_chain)r   listr   r   r   r   ZunarmorgetDataappendr   ZCertificateload)r   _keyZchainschaincpisafile_Zdigicert_ca_bytesr   r   r   
get_chains   s    
zPDFSignature.get_chainsc                 C   sJ   t | }d| krFd| krF|rFt | d}tjj| d | d ||dS d S )Nkeycertr   )Zca_chain_filesZkey_passphrase)r   r   r#   r   SimpleSignerr   )r   r   r   r   r   r   test_simple_signer0   s    
zPDFSignature.test_simple_signerc                 C   s.   t | }d| kr*|r*tjj| d |dS d S )Npfx_file)r(   r   )r   r   r   r&   Zload_pkcs12r   r   r   r   test_pkcs12_signer=   s    
 zPDFSignature.test_pkcs12_signerc                 C   sn   t | }|d d d d ddddd d dd}|D ]6}|| kr,|dkrVt | d}|||< q,| | ||< q,tf |S )NFTr   )Zpkcs11_sessionZ
cert_labelZsigning_certr   Z	key_labelZ
prefer_pssZembed_rootsZother_certs_to_pullZ
bulk_fetchZkey_idZcert_idZuse_raw_mechanismr   )r   get_sessionr#   r   )r   sessionkeysr$   r   r   r   r   test_pkcs11_signerF   s*    

zPDFSignature.test_pkcs11_signerc                 C   s   d| krt j| d dS d S )NZtsa)url)r	   ZHTTPTimeStamper)r   r   r   r   get_timestampsb   s    zPDFSignature.get_timestampsc                 C   sj   d| krd S d }| d }|dkr,t | }n:|dkrTtd krHd}t|t | }n|dkrft | }|S )NengineZpkcs12Zpkcs11zpyhanko.sign.pkcs11 requires pyHanko to be installed with the [pkcs11] option. You can install missing dependencies by running "pip install 'pyHanko[pkcs11]'".simple)r   r)   r   ImportErrorr-   r'   )r   signerr0   msgr   r   r   get_signersh   s    
zPDFSignature.get_signersc                 C   s(   |d dkrt | ||S t | ||S )NtypeZlta)r   lta_signsimple_sign)	inputfileoutputr   r   r   r   sign   s    zPDFSignature.signc                 C   sN   g }| D ]@}t |ttfr>t|}tj| }|| q|| q|S N)	r   r   r   r   r   ZCertificateListr   r   r   )crlsZ	list_crlsxr!   Z	cert_listr   r   r   
parse_crls   s    zPDFSignature.parse_crlsc                 C   s4   g }| D ]&}t |}tj| }|| q|S r<   )r   r   ZOCSPResponser   r   r   )ZoscpsZ	list_oscpr>   r!   datar   r   r   
parse_oscp   s    zPDFSignature.parse_oscpc                 C   s   ddi}d| krd| d kr6t | d d | d d< d| d kr\t | d d | d d< d| d kr|t | d| d d< d| d krt | d| d d< d| d krt | d| d d< || d  tf |S )	NZallow_fetchingTvalidation_contextr=   ZocspsZtrust_rootsZextra_trust_rootsZother_certs)r   r?   rA   r#   updater   )r   contextr   r   r   get_validation_context   s2    

 

 z#PDFSignature.get_validation_contextc                 C   s>   ddd d d dddt jd t| d}d| kr:|| d  |S )N
Signature1sha256FT)
field_nameZmd_algorithmlocationreasonnameZcertifyZembed_validation_infoZuse_pades_ltaZ	subfilterZtimestamp_field_namerB   meta)r
   ZPADESr   rE   rC   )r   rL   r   r   r   get_signature_meta   s    zPDFSignature.get_signature_metac                 C   sD   t |}|r@t| }t |}tj|tjdd|||d dS d S )NrF   )rH   )r3   r:   timestamperT)r   r5   r   r/   r   sign_pdfPdfSignatureMetadata)r9   r:   r   r3   wrN   r   r   r   r8      s    


zPDFSignature.simple_signc                 C   sV   t |}t |}t| }t |}tjf |}|rR|rRtj|||||d dS d S )N)signature_metar3   rN   r:   T)r   r5   r/   r   rM   r   rP   rO   )r9   r:   r   r3   rN   rQ   rL   rR   r   r   r   r7      s    


zPDFSignature.lta_signc                 C   sh   |  dd }|  dd }|  dd }|  dd }|d k	rd|d k	rd|d k	sP|d k	r`t||||dS d S d S )Nlib_locationslot_notoken_labeluser_pin)rT   rU   rV   )getr   )r   rS   rT   rU   rV   r   r   r   r*      s    zPDFSignature.get_sessionN)__name__
__module____qualname__staticmethodr   r#   r'   r)   r-   r/   r5   r;   r?   rA   rE   rM   r8   r7   r*   r   r   r   r   r      s<   













r   )loggingpathlibr   Z
asn1cryptor   r   r   r   Z$pyhanko.pdf_utils.incremental_writerr   Zpyhanko.signr   r	   Zpyhanko.sign.fieldsr
   Zpyhanko_certvalidatorr   Zpyhanko.sign.pkcs11r   r   r2   Zxhtml2pdf.filesr   	getLoggerrX   logr   r   r   r   r   <module>   s   
