U
    =g!                     @   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-d1lgvatt/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   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'   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_fetch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engine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   ImportErrorr0   r(   )r   signerr3   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   OCSPResponser   r   r   )ZoscpsZ	list_oscprB   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_contextrA   ZocspsZtrust_rootsZextra_trust_rootsZother_certs)r   rC   rF   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_namerG   meta)r
   ZPADESr   rJ   rH   )r   rQ   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 )NrK   )rM   )r7   r>   timestamperT)r   r9   r   r2   r   sign_pdfPdfSignatureMetadata)r=   r>   r   r7   wrS   r   r   r   r<      s    


zPDFSignature.simple_signc                 C   sV   t |}t |}t| }t |}tjf |}|rR|rRtj|||||d dS d S )N)signature_metar7   rS   r>   T)r   r9   r2   r   rR   r   rU   rT   )r=   r>   r   r7   rS   rV   rQ   rW   r   r   r   r;      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)rY   rZ   r[   )getr   )r   rX   rY   rZ   r[   r   r   r   r-      s    zPDFSignature.get_sessionN)__name__
__module____qualname__staticmethodr   r$   r(   r+   r0   r2   r9   r?   rC   rF   rJ   rR   r<   r;   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   r6   Zxhtml2pdf.filesr   	getLoggerr]   logr   r   r   r   r   <module>   s   
