U
    ?e                  
   @   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 Z zd ZZW 5 dZ[X Y nX d d	lmZ e d
ZG dd dZdS )    N)Path)x509pemcrlocsp)IncrementalPdfFileWriter)signers
timestamps)SigSeedSubFilter)ValidationContext)open_pkcs11_sessionPKCS11Signer)getFileZ	xhtml2pdfc                   @   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-35p66c5k/xhtml2pdf/builders/signs.pyget_passphrase   s
    
zPDFSignature.get_passphrasec                 C   s   g }d| kr|| d }t |ts$|g}|D ]R}t |ts@t |trpt|}t| \}}}|t	j
| q(|| q(|sd 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   sN   t | }d| krJd| krJ|rJt | d}tjj| d | d ||d}|S d S )Nr   certr   )Zca_chain_filesZkey_passphrase)r   r   r"   r   SimpleSignerr   )r   r   r   signerr   r   r   test_simple_signer/   s    
 zPDFSignature.test_simple_signerc                 C   s2   t | }d| kr.|r.tjj| d |d}|S d S )Npfx_file)r'   r   )r   r   r   r$   Zload_pkcs12)r   r   r%   r   r   r   test_pkcs12_signer;   s    
 zPDFSignature.test_pkcs12_signerc                 C   st   t | }t|d d d d ddddd d dd}|D ]6}|| kr.|dkrXt | 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_sessiondictr"   r   )r   sessionkeysr   r   r%   r   r   r   test_pkcs11_signerD   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   Z
tst_clientr   r   r   get_timestamps\   s    zPDFSignature.get_timestampsc                 C   sh   d| krd S d }| d }|dkr,t | }n8|dkrRtd krFtdtt | }n|dkrdt | }|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   ImportErrorer-   r&   )r   r%   r0   r   r   r   get_signersb   s     
zPDFSignature.get_signersc                 C   s,   |d dkrt | ||S t | ||S d S )NtypeZlta)r   lta_signsimple_sign)	inputfileoutputr   r   r   r   signx   s    zPDFSignature.signc                 C   sT   g }| D ]F}t |ts t |trDt|}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   t dd}d| krd| d kr8t| 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 )	NT)Zallow_fetchingvalidation_contextr<   ZocspsZtrust_rootsZextra_trust_rootsZother_certs)r*   r   r>   r@   r"   updater   )r   contextr   r   r   get_validation_context   s    
z#PDFSignature.get_validation_contextc                 C   s@   t 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_namerA   meta)r*   r
   ZPADESr   rD   rB   )r   rK   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 )NrE   )rG   )r%   r9   timestamperT)r   r4   IncrementalPdfWriterr/   r   sign_pdfPdfSignatureMetadata)r8   r9   r   r%   wrM   r   r   r   r7      s    

 
  zPDFSignature.simple_signc                 C   sV   t |}t |}t| }t |}tjf |}|rR|rRtj|||||d dS d S )N)signature_metar%   rM   r9   T)r   r4   r/   rN   rL   r   rP   rO   )r8   r9   r   r%   rM   rQ   rK   rR   r   r   r   r6      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	rdt||||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   r)      s      zPDFSignature.get_sessionN)__name__
__module____qualname__staticmethodr   r"   r&   r(   r-   r/   r4   r:   r>   r@   rD   rL   r7   r6   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   r3   Zxhtml2pdf.filesr   	getLoggerlogr   r   r   r   r   <module>   s   
