o
    3[c                  
   @   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yP Z z
d ZZW Y dZ[ndZ[ww 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)getFile	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| v r| d }t |tr| }|S d S )N
passphrase)
isinstancestrencode)configr    r   N/var/www/chikooza/env/lib/python3.10/site-packages/xhtml2pdf/builders/signs.pyget_passphrase   s   
zPDFSignature.get_passphrasec                 C   s   g }d| v r>| d }t |ts|g}|D ])}t |ts t |tr8t|}t| \}}}|t	j
| q|| q|sBd S |S )Nca_chain)r   listr   r   r   r   unarmorgetDataappendr   Certificateload)r   keychainschaincpisafile_digicert_ca_bytesr   r   r   
get_chains   s   
zPDFSignature.get_chainsc                 C   sV   t | }d| v r%d| v r'|r)t | d}tjj| d | d ||d}|S d S d S d S )Nr    certr   )ca_chain_fileskey_passphrase)r   r   r'   r   SimpleSignerr   )r   r   r"   signerr   r   r   test_simple_signer/   s   
zPDFSignature.test_simple_signerc                 C   s6   t | }d| v r|rtjj| d |d}|S d S d S )Npfx_file)r.   r   )r   r   r   r+   load_pkcs12)r   r   r,   r   r   r   test_pkcs12_signer;   s   
zPDFSignature.test_pkcs12_signerc                 C   sx   t | }t|d d d d ddddd d dd}|D ]}|| v r2|dkr,t | d}|||< q| | ||< qtdi |}|S )NFTr   )pkcs11_session
cert_labelsigning_certr   	key_label
prefer_pssembed_rootsother_certs_to_pull
bulk_fetchkey_idcert_id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| v rt j| d d}|S d S )Ntsa)url)r	   HTTPTimeStamper)r   
tst_clientr   r   r   get_timestamps\   s   zPDFSignature.get_timestampsc                 C   sl   d| vrd S d }| d }|dkrt | }|S |dkr+td u r$tdtt | }|S |dkr4t | }|S )Nenginepkcs12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   r0   r   ImportErrorer@   r-   )r   r,   rF   r   r   r   get_signersb   s$   


zPDFSignature.get_signersc                 C   s(   |d dkrt | ||S t | ||S )Ntypelta)r   lta_signsimple_sign)	inputfileoutputr   r   r   r   signx   s   zPDFSignature.signc                 C   sT   g }| D ]#}t |tst |tr"t|}tj| }|| q|| q|S N)	r   r   r   r   r   CertificateListr   r   r   )crls	list_crlsxr$   	cert_listr   r   r   
parse_crls   s   zPDFSignature.parse_crlsc                 C   s4   g }| D ]}t |}tj| }|| q|S rT   )r   r   OCSPResponser   r   r   )oscps	list_oscprX   r$   datar   r   r   
parse_oscp   s   zPDFSignature.parse_oscpc                 C   s   t dd}d| v rfd| d v rt| d d | d d< d| d v r/t| d d | d d< d| d v r?t| d| d d< d| d v rOt| d| d d< d| d v r_t| d| d d< || d  td	i |S )
NT)allow_fetchingvalidation_contextrV   ocspstrust_rootsextra_trust_rootsother_certsr   )r=   r   rZ   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| v r|| d  |S )N
Signature1sha256FT)
field_namemd_algorithmlocationreasonnamecertifyembed_validation_infouse_pades_lta	subfiltertimestamp_field_namera   meta)r=   r
   PADESr   rh   rf   )r   ru   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 )Nri   )rk   )r,   rR   timestamperT)r   rL   r   rE   r   sign_pdfPdfSignatureMetadata)rQ   rR   r   r,   wrx   r   r   r   rP      s   

zPDFSignature.simple_signc                 C   s^   t |}t |}t| }t |}tjdi |}|r+|r-tj|||||d dS d S d S )N)signature_metar,   rx   rR   Tr   )r   rL   rE   r   rw   r   rz   ry   )rQ   rR   r   r,   rx   r{   ru   r|   r   r   r   rO      s   



zPDFSignature.lta_signc                 C   sp   |  dd }|  dd }|  dd }|  dd }|d ur2|d ur4|d us(|d ur6t||||d}|S d S d S d S )Nlib_locationslot_notoken_labeluser_pin)r~   r   r   )getr   )r   r}   r~   r   r   r>   r   r   r   r<      s   zPDFSignature.get_sessionN)__name__
__module____qualname__staticmethodr   r'   r-   r0   r@   rE   rL   rS   rZ   r_   rh   rw   rP   rO   r<   r   r   r   r   r      s>    













r   )loggingpathlibr   
asn1cryptor   r   r   r   $pyhanko.pdf_utils.incremental_writerr   pyhanko.signr   r	   pyhanko.sign.fieldsr
   pyhanko_certvalidatorr   pyhanko.sign.pkcs11r   r   rJ   rK   xhtml2pdf.filesr   	getLoggerlogr   r   r   r   r   <module>   s     
