o
    &zh!                     @   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yG   d ZZY nw 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| v r| d }t |tr| }|S d S )N
passphrase)
isinstancestrencodeconfigr    r   S/var/www/html/kangema/venv/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tfr5t|}t| \}}}|t	j
| q|| q|s?d 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   sJ   t | }d| v r#d| v r#|r#t | d}tjj| d | d ||dS d S )Nkeycertr   )ca_chain_files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| v 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   sr   t | }|d d d d ddddd d dd}|D ]}|| v r1|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_sessionr'   r   )r   sessionkeysr(   r"   r   r   r   test_pkcs11_signerF   s,   

zPDFSignature.test_pkcs11_signerc                 C   s   d| v rt j| d dS d S )Ntsa)url)r	   HTTPTimeStamper)r   r   r   r   get_timestampsb   s   zPDFSignature.get_timestampsc                 C   sn   d| vrd S d }| d }|dkrt | }|S |dkr,td u r%d}t|t | }|S |dkr5t | }|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   ImportErrorr?   r-   )r   signerrD   msgr   r   r   get_signersh   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   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   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 rS   )r   r   OCSPResponser   r   r   )oscps	list_oscprW   r$   datar   r   r   
parse_oscp   s   zPDFSignature.parse_oscpc                 C   s   ddi}d| v red| 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 rNt | d| d d< d| d v r^t | d| d d< || d  td	i |S )
Nallow_fetchingTvalidation_contextrU   ocspstrust_rootsextra_trust_rootsother_certsr   )r   rY   r^   r'   updater   )r   contextr   r   r   get_validation_context   s.   



z#PDFSignature.get_validation_contextc                 C   s>   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_namer`   meta)r
   PADESr   rg   re   )r   rt   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 )Nrh   )rj   )rI   rQ   timestamperT)r   rK   r   rC   r   sign_pdfPdfSignatureMetadata)rP   rQ   r   rI   wrw   r   r   r   rO      s   


zPDFSignature.simple_signc                 C   sZ   t |}t |}t| }t |}tjdi |}|r+|r+tj|||||d dS d S )N)signature_metarI   rw   rQ   Tr   )r   rK   rC   r   rv   r   ry   rx   )rP   rQ   r   rI   rw   rz   rt   r{   r   r   r   rN      s   


zPDFSignature.lta_signc                 C   sh   |  dd }|  dd }|  dd }|  dd }|d ur2|d ur2|d us(|d ur0t||||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<      s   zPDFSignature.get_sessionN)__name__
__module____qualname__staticmethodr   r'   r-   r0   r?   rC   rK   rR   rY   r^   rg   rv   rO   rN   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   rH   xhtml2pdf.filesr   	getLoggerr   logr   r   r   r   r   <module>   s    
