U
    c-                     @   s  d dl Z d dlZd dlZd dlZd dlZd dlmZmZ d dlm	Z	m
Z
mZmZmZ d dlmZmZmZmZ d dlmZmZ d dlmZ d dlmZ d dlmZmZ d d	lmZ d
dlm Z m!Z! ddl"m#Z#m$Z$m%Z%m&Z& ddl'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1 ddl2m3Z3m4Z4 ddl5m6Z6m7Z7 e8e9Z:G dd de+e j;Z<G dd de<e6Z=G dd de<e7Z>e ?dZ@e ?dZAd>ddZBd?ddZCejDG dd dejEZFd@eGeHd d!d"ZIdAeGejJd$d%d&ZKdBe
ejJ eGeHejLd'd(d)ZMG d*d+ d+ZNG d,d- d-ejOZPG d.d/ d/eNe3ZQe3ReQ ejLeNeeeG eeH f d0d1d2ZSe jTd3d4d5ZUd6d7 ZVd8d9 ZWd:d; ZXe/jRG d<d= d=e/ZYdS )C    N)sha1sha256)DictListOptionalSetTuple)algoscmscorex509)PrivateKeyInfoPublicKeyAlgorithm)serialization)PKCS1v15)RSAPrivateKeyRSAPublicKey)pkcs12   )genericmisc   )aes_cbc_decryptaes_cbc_encrypt	as_signedrc4_encrypt)
	ALL_PERMS
AuthResult
AuthStatusCryptFilterCryptFilterBuilderCryptFilterConfigurationIdentityCryptFilterSecurityHandlerSecurityHandlerVersionbuild_crypt_filter)SerialisableCredentialSerialisedCredential)AESCryptFilterMixinRC4CryptFilterMixinc                       s   e Zd ZU dZdZded< dddd fdd	
Zeed
ddZ	 fddZ
edfeej dddZed
ddZed
ddZ fddZ  ZS )PubKeyCryptFiltera  
    Crypt filter for use with public key security handler.
    These are a little more independent than their counterparts for
    the standard security handlers, since different crypt filters
    can cater to different sets of recipients.

    :param recipients:
        List of CMS objects encoding recipient information for this crypt
        filters.
    :param acts_as_default:
        Indicates whether this filter is intended to be used in
        ``/StrF`` or ``/StmF``.
    :param encrypt_metadata:
        Whether this crypt filter should encrypt document-level metadata.

        .. warning::
            See :class:`.SecurityHandler` for some background on the
            way pyHanko interprets this value.
    NPubKeySecurityHandler_handlerFT)
recipientsacts_as_defaultencrypt_metadatac                   s6   || _ || _|| _d| _d  | _| _t jf | d S )NF)r-   r.   r/   _pubkey_auth_failed_shared_key_recp_key_seedsuper__init__)selfr-   r.   r/   kwargs	__class__ B/tmp/pip-unpacked-wheel-0kb_yl26/pyhanko/pdf_utils/crypt/pubkey.pyr4   =   s    zPubKeyCryptFilter.__init__returnc                 C   s   | j S N)r0   r5   r9   r9   r:   _auth_failedF   s    zPubKeyCryptFilter._auth_failedc                    s*   t |tstt | d  | _| _d S r=   )
isinstancer+   	TypeErrorr3   _set_security_handlerr1   r2   )r5   handlerr7   r9   r:   rB   J   s    
z'PubKeyCryptFilter._set_security_handlercertsc                 C   sz   | j s| jrtd| jdkr2td| _g | _| jdk	sF| jdkrPtdt|| jt	|| j |d}| j
| dS )a  
        Add recipients to this crypt filter.
        This always adds one full CMS object to the Recipients array

        :param certs:
            A list of recipient certificates.
        :param perms:
            The permission bits to assign to the listed recipients.
        :param ignore_key_usage:
            If ``False``, the *keyEncipherment* key usage extension is required.
        zCA non-default crypt filter cannot have multiple sets of recipients.N   zYAdding recipients after deriving the shared key or before authenticating is not possible.)include_permissionsignore_key_usage)r.   r-   r   PdfErrorsecretstoken_bytesr2   r1   construct_recipient_cmsr   append)r5   rE   permsrH   Znew_cmsr9   r9   r:   add_recipientsP   s&    
  z PubKeyCryptFilter.add_recipientsc                 C   sB   | j D ]0}t||\}}|dk	r|| _ttj|  S qttjS )a  
        Authenticate to this crypt filter in particular.
        If used in ``/StmF`` or ``/StrF``, you don't need to worry about
        calling this method directly.

        :param credential:
            The :class:`.EnvelopeKeyDecrypter` to authenticate with.
        :return:
            An :class:`AuthResult` object indicating the level of access
            obtained.
        N)r-   read_seed_from_recipient_cmsr2   r   r   USERFAILED)r5   
credentialrecpseedrN   r9   r9   r:   authenticateu   s    
zPubKeyCryptFilter.authenticatec                 C   s~   | j d krtd| jjtjkr*t }nt }|	| j  | j
D ]}|	|  qB| jsl| jrl|	d | d | j S )Nz&No seed available; authenticate first.s   )r2   r   rI   r,   versionr$   AES256r   r   updater-   dumpr/   r.   digestkeylen)r5   ZmdrT   r9   r9   r:   derive_shared_encryption_key   s    



z.PubKeyCryptFilter.derive_shared_encryption_keyc                    sd   t   }t| jd |d< tdd | jD }| jrD||d< n|d |d< t| j	|d< |S )N   /Lengthc                 s   s   | ]}t | V  qd S r=   r   ByteStringObjectrZ   .0rT   r9   r9   r:   	<genexpr>   s   z2PubKeyCryptFilter.as_pdf_object.<locals>.<genexpr>/Recipientsr   /EncryptMetadata)
r3   as_pdf_objectr   NumberObjectr\   ArrayObjectr-   r.   BooleanObjectr/   )r5   resultr-   r7   r9   r:   rg      s    



zPubKeyCryptFilter.as_pdf_object)__name__
__module____qualname____doc__r,   __annotations__r4   propertyboolr?   rB   r   r   r   CertificaterO   r   rV   bytesr]   rg   __classcell__r9   r9   r7   r:   r*   '   s   
	%r*   c                   @   s   e Zd ZdZdS )PubKeyAESCryptFilterz<
    AES crypt filter for public key security handlers.
    Nrl   rm   rn   ro   r9   r9   r9   r:   rv      s   rv   c                   @   s   e Zd ZdZdS )PubKeyRC4CryptFilterz<
    RC4 crypt filter for public key security handlers.
    Nrw   r9   r9   r9   r:   rx      s   rx   z/DefaultCryptFilterz/DefEmbeddedFileTc                 C   s   t tt| d||dittdS NT)r\   r.   r-   r/   )Zdefault_stream_filterZdefault_string_filter)r!   DEFAULT_CRYPT_FILTERrx   r\   r-   r/   r9   r9   r:   _pubkey_rc4_config   s      r|   c                 C   s   t tt| d||dittdS ry   )r!   rz   rv   r{   r9   r9   r:   _pubkey_aes_config   s      r}   c                   @   s.   e Zd ZdZedZedZedZdS )PubKeyAdbeSubFilterz{
    Enum describing the different subfilters that can be used for public key
    encryption in the PDF specification.
    z/adbe.pkcs7.s3z/adbe.pkcs7.s4z/adbe.pkcs7.s5N)	rl   rm   rn   ro   r   
NameObjectZS3S4S5r9   r9   r9   r:   r~      s   

r~   )rU   rN   c                 C   s(   t | dkst| |r"td|nd S )NrF   <i    )lenAssertionErrorstructpack)rU   rN   rG   r9   r9   r:   construct_envelope_content   s    r   F)envelope_keycertc              
   C   s   |j }|d }|d j}|dkr0td| dt| dks@t|sr|j}|d ks\d|jkrrtd|jj	 dt
|j  }t|tst|j| t d	}td
t|j|jdi}	tdtdi}
tdtd|	|
|diS )N	algorithmrsaz3Certificate public key must be of type 'rsa', not ''.    Zkey_enciphermentzCertificate for subject z8 does not have the 'key_encipherment' key usage bit set.paddingZissuer_and_serial_number)issuerserial_numberrsaes_pkcs1v15ktrir   )rW   ridkey_encryption_algorithmencrypted_key)Z
public_keynativeNotImplementedErrorr   r   Zkey_usage_valuer   ZPdfWriteErrorsubjectZhuman_friendlyr   Zload_der_public_keyrZ   r@   r   Zencryptr   r
   ZRecipientIdentifierIssuerAndSerialNumberr   r   KeyEncryptionAlgorithmZKeyEncryptionAlgorithmIdZRecipientInfoKeyTransRecipientInfo)r   r   rH   ZpubkeyZpubkey_algo_infoZalgorithm_nameZ	key_usageZpub_keyZencrypted_datar   algor9   r9   r:   _recipient_info   sN    

      r   )certificatesrU   rN   r<   c                    s   t |||d}td t |d d\}} fdd| D }ttd|d}	tt	d|	|d	}
t
d
||
d}tt	d|dS )N)rG   r   )ivc                    s   g | ]}t  |d qS ))rH   )r   )rc   r   r   rH   r9   r:   
<listcomp>F  s   z+construct_recipient_cms.<locals>.<listcomp>Z
aes256_cbc)r   
parametersdata)content_typecontent_encryption_algorithmencrypted_contentr   )rW   recipient_infosencrypted_content_infoenveloped_data)r   content)r   rJ   rK   r   r
   ZEncryptionAlgorithmr	   ZEncryptionAlgorithmIdZEncryptedContentInfoZContentTypeZEnvelopedDataContentInfo)r   rU   rN   rG   rH   Zenvelope_contentr   encrypted_envelope_contentZ	rec_infosr   r   r   r9   r   r:   rL   '  s@      
  
 rL   c                   @   s4   e Zd ZdZejdddZeej	edddZ
dS )	EnvelopeKeyDecrypterz
    General credential class for use with public key security handlers.

    This allows the key decryption process to happen offline, e.g. on a smart
    card.

    :param cert:
        The recipient's certificate.
    r   c                 C   s
   || _ d S r=   r   )r5   r   r9   r9   r:   r4   o  s    zEnvelopeKeyDecrypter.__init__r   algo_paramsr<   c                 C   s   t dS )a  
        Invoke the actual key decryption algorithm.

        :param encrypted_key:
            Payload to decrypt.
        :param algo_params:
            Specification of the encryption algorithm as a CMS object.
        :return:
            The decrypted payload.
        N)r   )r5   r   r   r9   r9   r:   decryptr  s    zEnvelopeKeyDecrypter.decryptN)rl   rm   rn   ro   r   rs   r4   rt   r
   r   r   r9   r9   r9   r:   r   d  s   
 r   c                   @   s   e Zd ZdefdejfgZdS )_PrivKeyAndCertkeyr   N)rl   rm   rn   r   r   rs   _fieldsr9   r9   r9   r:   r     s   r   c                       s   e Zd ZdZeedddZedddZeeddd	Z	e
jed
 fddZedddZedddZeejedddZ  ZS )SimpleEnvelopeKeyDecrypterz
    Implementation of :class:`.EnvelopeKeyDecrypter` where the private key
    is an RSA key residing in memory.

    :param cert:
        The recipient's certificate.
    :param private_key:
        The recipient's private key.
    r;   c                 C   s   dS )NZraw_privkeyr9   clsr9   r9   r:   get_name  s    z#SimpleEnvelopeKeyDecrypter.get_namec                 C   s   | j | jd}t| S )N)r   r   )private_keyr   r   rZ   )r5   valuesr9   r9   r:   
_ser_value  s    z%SimpleEnvelopeKeyDecrypter._ser_value)r   c              
   C   sZ   zt |}|d }|d }W n. tk
rL } ztd|W 5 d }~X Y nX t||dS )Nr   r   z-Failed to decode serialised pubkey credentialr   r   )r   load
ValueErrorr   PdfReadErrorr   )r   r   decodedr   r   er9   r9   r:   _deser_value  s    
z'SimpleEnvelopeKeyDecrypter._deser_valuer   c                    s   t  | || _d S r=   )r3   r4   r   )r5   r   r   r7   r9   r:   r4     s    z#SimpleEnvelopeKeyDecrypter.__init__Nc              
   C   sz   ddl m} z$|| |d}ddl m} ||}W n< tttfk
rl } ztjd|d W Y dS d}~X Y nX t||dS )	a  
        Load a key decrypter using key material from files on disk.

        :param key_file:
            File containing the recipient's private key.
        :param cert_file:
            File containing the recipient's certificate.
        :param key_passphrase:
            Passphrase for the key file, if applicable.
        :return:
            An instance of :class:`.SimpleEnvelopeKeyDecrypter`.
        r   )load_private_key_from_pemder)
passphrase)load_cert_from_pemderz%Could not load cryptographic materialexc_infoNr   )	Zpyhanko.sign.generalr   r   IOErrorr   rA   loggererrorr   )key_file	cert_fileZkey_passphraser   r   r   r   r   r9   r9   r:   r     s     zSimpleEnvelopeKeyDecrypter.loadc              
   C   s   zTt |d}| }W 5 Q R X t||\}}}ddlm}m}	 ||}|	|}W nD ttt	fk
r }
 z t
jd| d|
d W Y dS d}
~
X Y nX t||dS )	aZ  
        Load a key decrypter using key material from a PKCS#12 file on disk.

        :param pfx_file:
            Path to the PKCS#12 file containing the key material.
        :param passphrase:
            Passphrase for the private key, if applicable.
        :return:
            An instance of :class:`.SimpleEnvelopeKeyDecrypter`.
        rb   ))_translate_pyca_cryptography_cert_to_asn1(_translate_pyca_cryptography_key_to_asn1zCould not open PKCS#12 file .r   Nr   )openreadr   Zload_key_and_certificatesZsign.generalr   r   r   r   rA   r   r   r   )r   Zpfx_filer   fZ	pfx_bytesr   r   Zother_certsr   r   r   r9   r9   r:   load_pkcs12  s     
z&SimpleEnvelopeKeyDecrypter.load_pkcs12r   c                 C   sF   |d j }|dkr"td| dtj| j dd}|j|t dS )a  
        Decrypt the payload using RSA with PKCS#1 v1.5 padding.
        Other schemes are not (currently) supported by this implementation.

        :param encrypted_key:
            Payload to decrypt.
        :param algo_params:
            Specification of the encryption algorithm as a CMS object.
            Must use ``rsaes_pkcs1v15``.
        :return:
            The decrypted payload.
        r   r   zAOnly 'rsaes_pkcs1v15' is supported for envelope encryption, not 'r   N)passwordr   )r   r   r   Zload_der_private_keyr   rZ   r   r   )r5   r   r   Z	algo_nameZpriv_keyr9   r9   r:   r     s    

 z"SimpleEnvelopeKeyDecrypter.decrypt)N)N)rl   rm   rn   ro   classmethodstrr   rt   r   r   r   rs   r   r4   staticmethodr   r   r
   r   r   ru   r9   r9   r7   r:   r     s   
 r   )recipient_cms	decrypterr<   c                 C   s  | d j }|dkr td| | d }|d }|d D ]}|j}t|tjsVtd|d j}t|tjsttd	|d
 }|d j }	|j	j
|kr8|j	j|	kr8z||d j |d }
W n. tk
r } ztd|W 5 d }~X Y nX  qq8dS |d }|d j }z
|j}W n$ ttfk
r2   |d j }Y nX dti}z(ddlm} ||j|j|jd W n( tk
r   |dkrtdY nX ||kr|| }|j}||
||}n(|dkrt|
|}ntd| d|d d }d }t|dkrtd|dd  d }||fS )Nr   r   z7Recipient CMS content type must be enveloped data, not r   r   r   z4RecipientInfo must be of type KeyTransRecipientInfo.r   z;Recipient identifier must be of type IssuerAndSerialNumber.r   r   r   r   zFailed to decrypt envelope key)NNr   r   r   Zaesr   )	symmetric)ZdesZ	tripledesZrc2z0DES, 3DES and RC2 require oscrypto to be presentZrc4zCipher z is not allowed in PDF 2.0.rF      r   )r   r   r   Zchosenr@   r
   r   r   r   r   r   r   r   	ExceptionZencryption_cipherr   KeyErrorr   Zoscryptor   rY   Zdes_cbc_pkcs5_decryptZtripledes_cbc_pkcs5_decryptZrc2_cbc_pkcs5_decryptImportErrorZencryption_ivr   r   r   unpack)r   r   r   Zedr   Zrec_infor   Zissuer_and_serialr   serialr   r   r   r   Zcipher_nameZwith_ivr   Zdecryption_funr   r   rU   rN   r9   r9   r:   rP      s    








 
rP   )cfdictc                 C   sb   z| d }W n t k
r*   tdY nX t|tjr>|f}dd |D }| dd}||dS )Nre   z.PubKey CF dictionary must have /Recipients keyc                 S   s   g | ]}t j|jqS r9   r
   r   r   original_bytesrc   xr9   r9   r:   r   k  s    z0_read_generic_pubkey_cf_info.<locals>.<listcomp>rf   Tr-   r/   )r   r   r   r@   r   ra   get)r   r-   recipient_objsr/   r9   r9   r:   _read_generic_pubkey_cf_infob  s    
r   c                 C   s(   |  dd}tf |d |dt| S )Nr_   (   r^   r\   r.   )r   rx   r   )r   r.   keylen_bitsr9   r9   r:   _build_legacy_pubkey_cfr  s     r   c                 C   s   t f d|dt| S )N   r   rv   r   r   r.   r9   r9   r:   _build_aes128_pubkey_cfz  s     r   c                 C   s   t f d|dt| S )Nr   r   r   r   r9   r9   r:   _build_aes256_pubkey_cf  s     r   c                       s^  e Zd ZU dZeeedd dZee	j
ef ed< edejddeddfeej ed d	d
dZd-eeded fddZeedddZeee dddZee	jeedddZ ee	je!d d fddZ"ee	jdddZ#ee	jddd Z$ee	jdd!d"Z%d#d$ Z&edfeej d%d&d'Z'd.e(e)d(d)d*Z*e+dd+d,Z,  Z-S )/r+   z
    Security handler for public key encryption in PDF.

    As with the standard security handler, you essentially shouldn't ever
    have to instantiate these yourself (see :meth:`build_from_certs`).
    c                 C   s   t  S r=   )r"   )___r9   r9   r:   <lambda>  r   zPubKeySecurityHandler.<lambda>)z/V2z/AESV2z/AESV3z	/Identity_known_crypt_filtersr   TF)rE   rN   r<   c	                 K   sp   |r
t jnt j}
d}|tjkr@|r2td|dd}nt|d|d}| ||
|f||dd|	}|j|||d |S )a  
        Create a new public key security handler.

        This method takes many parameters, but only ``certs`` is mandatory.
        The default behaviour is to create a public key encryption handler
        where the underlying symmetric encryption is provided by AES-256.
        Any remaining keyword arguments will be passed to the constructor.

        :param certs:
            The recipients' certificates.
        :param keylen_bytes:
            The key length (in bytes). This is only relevant for legacy
            security handlers.
        :param version:
            The security handler version to use.
        :param use_aes:
            Use AES-128 instead of RC4 (only meaningful if the ``version``
            parameter is :attr:`~.SecurityHandlerVersion.RC4_OR_AES128`).
        :param use_crypt_filters:
            Whether to use crypt filters. This is mandatory for security
            handlers of version :attr:`~.SecurityHandlerVersion.RC4_OR_AES128`
            or higher.
        :param perms:
            Permission flags (as a 4-byte signed integer).
        :param encrypt_metadata:
            Whether to encrypt document metadata.

            .. warning::
                See :class:`.SecurityHandler` for some background on the
                way pyHanko interprets this value.
        :param ignore_key_usage:
            If ``False``, the *keyEncipherment* key usage extension is required.
        :return:
            An instance of :class:`.PubKeySecurityHandler`.
        Nr   )r/   r-   r   )r/   crypt_filter_configr   rN   rH   )r~   r   r   r$   RC4_OR_AES128r}   r|   rO   )r   rE   Zkeylen_bytesrW   Zuse_aesZuse_crypt_filtersrN   r/   rH   r6   	subfiltercfcshr9   r9   r:   build_from_certs  s:    ,

     z&PubKeySecurityHandler.build_from_certsNr!   )rW   pubkey_handler_subfilterr   r   c                    s   |t jkr|tjkrtd|d krr|t jkr@td||d}n2|t jkrZt|||d}n|t j	krrt
d||d}t j|||||d || _|| _d | _d S )NzESubfilter /adbe.pkcs7.s5 is required for security handlers beyond V4.   )r\   r/   r-   r   )r/   compat_entries)r$   r   r~   r   r   rI   ZRC4_40r|   RC4_LONGER_KEYSrX   r}   r3   r4   r   r/   r1   )r5   rW   r  legacy_keylenr/   r   r   r  r7   r9   r:   r4     sF    


 
 
    zPubKeySecurityHandler.__init__r;   c                 C   s
   t dS )Nz/Adobe.PubSec)r   r   r   r9   r9   r:   r   	  s    zPubKeySecurityHandler.get_namec                 C   s   dd t D S )Nc                 S   s   h | ]
}|j qS r9   )valuer   r9   r9   r:   	<setcomp>  s     zCPubKeySecurityHandler.support_generic_subfilters.<locals>.<setcomp>)r~   r   r9   r9   r:   support_generic_subfilters  s    z0PubKeySecurityHandler.support_generic_subfilters)r   r.   r<   c                 C   s$   t | j||}|d kr td|S )NzJAn absent CFM or CFM of /None doesn't make sense in a PubSec CF dictionary)r%   r   r   r   )r   r   r.   cfr9   r9   r:   read_cf_dictionary  s      z(PubKeySecurityHandler.read_cf_dictionary)encrypt_dictr<   c                    sT   t  |}| |}|d k	r4|tjkr4tdn|d krP|tjkrPtd|S )Nz=Crypt filters require /adbe.pkcs7.s5 as the declared handler.z./adbe.pkcs7.s5 handler requires crypt filters.)r3   process_crypt_filters_determine_subfilterr~   r   r   r   )r   r  r   r   r7   r9   r:   r    s    
z+PubKeySecurityHandler.process_crypt_filters)r  c                 C   sZ   | dd}|d dkr"td|d }t|ddd }|jd	td
d}t|||dS )Nr_      r^   r   z"Key length must be a multiple of 8re   c                 S   s   dd | D S )Nc                 S   s   g | ]}t j|jqS r9   r   r   r9   r9   r:   r   9  s     zSPubKeySecurityHandler.gather_pub_key_metadata.<locals>.<lambda>.<locals>.<listcomp>r9   )lstr9   r9   r:   r   9  r   z?PubKeySecurityHandler.gather_pub_key_metadata.<locals>.<lambda>rf   Tdefault)r  r   r/   )r   r   rI   get_and_applyrr   dict)r   r  r   r\   r-   r/   r9   r9   r:   gather_pub_key_metadata0  s&    
    z-PubKeySecurityHandler.gather_pub_key_metadatac                 C   sP   z$t j|dtd|krtjntjdW S  tk
rJ   t d|d  Y nX d S )N
/SubFilterz/CFr  z8Invalid /SubFilter in public key encryption dictionary: )r   r  r~   r   r   r   r   )r   r  r9   r9   r:   r  F  s      z*PubKeySecurityHandler._determine_subfilterc                 C   s6   t |d }tf || || |d| |S )N/V)rW   r  r   )r$   Zfrom_numberr+   r  r  r  )r   r  vr9   r9   r:   instantiate_from_pdf_objectU  s    z1PubKeySecurityHandler.instantiate_from_pdf_objectc                 C   s   t  }t |  |d< | jj|d< | j |d< | jsF| jt	j
krZt | jd |d< | jt	j
krvt | j|d< | jtjkr|| j  n0|  }t|tstt dd |jD |d	< |S )
Nz/Filterr  r  r^   r_   rf   c                 s   s   | ]}t | V  qd S r=   r`   rb   r9   r9   r:   rd   t  s   z6PubKeySecurityHandler.as_pdf_object.<locals>.<genexpr>re   )r   DictionaryObjectr   r   r   r  rW   rg   Z_compat_entriesr$   r  rh   r\   rj   r/   r~   r   rY   r   Zget_stream_filterr@   r*   rA   ri   r-   )r5   rk   Z
default_cfr9   r9   r:   rg   a  s(    



z#PubKeySecurityHandler.as_pdf_objectrD   c                 C   s0   | j  D ] }t|tsq
|j|||d q
d S )Nr   )r   standard_filtersr@   r*   rO   )r5   rE   rN   rH   r
  r9   r9   r:   rO   z  s    
  z$PubKeySecurityHandler.add_recipients)rS   r<   c                 C   s   t |trt|}t |ts4tdt| dd}| j	 D ]B}t |t
sRqB||}|jtjkrp|  S |jdk	rB||jM }qBt |tr|| _ttjt|S )a  
        Authenticate a user to this security handler.

        :param credential:
            The credential to use (an instance of :class:`.EnvelopeKeyDecrypter`
            in this case).
        :param id1:
            First part of the document ID.
            Public key encryption handlers ignore this key.
        :return:
            An :class:`AuthResult` object indicating the level of access
            obtained.
        zRPubkey authentication credential must be an instance of EnvelopeKeyDecrypter, not r   l    N)r@   r'   r&   Zdeserialiser   r   r   typer   r  r*   rV   statusr   rR   Zpermission_flagsZ_credentialr   rQ   r   )r5   rS   Zid1rN   r
  rk   r9   r9   r:   rV     s$    






z"PubKeySecurityHandler.authenticatec                 C   s   | j  jS r=   )r   Zget_for_streamZ
shared_keyr>   r9   r9   r:   get_file_encryption_key  s    z-PubKeySecurityHandler.get_file_encryption_key)TNNT)N).rl   rm   rn   ro   r   r   r   r   r   r   r   r    rp   r   r$   rX   r   r   r   rs   intr  r~   listr4   r   r   r   r	  r  rr   r   r  r   r  r  r  r  rg   rO   r   r   rV   rt   r  ru   r9   r9   r7   r:   r+     sn   
  
G    + )r+   )NT)NT)T)F)TF)ZabcenumloggingrJ   r   hashlibr   r   typingr   r   r   r   r   Z
asn1cryptor	   r
   r   r   Zasn1crypto.keysr   r   Zcryptography.hazmat.primitivesr   Z1cryptography.hazmat.primitives.asymmetric.paddingr   Z-cryptography.hazmat.primitives.asymmetric.rsar   r   Z,cryptography.hazmat.primitives.serializationr    r   r   Z_utilr   r   r   r   apir   r   r   r   r    r!   r"   r#   r$   r%   Zcred_serr&   r'   Zfilter_mixinsr(   r)   	getLoggerrl   r   ABCr*   rv   rx   r   rz   ZDEF_EMBEDDED_FILEr|   r}   uniqueEnumr~   rt   r  r   rs   r   r   rL   r   Sequencer   r   registerrP   r  r   r   r   r   r+   r9   r9   r9   r:   <module>   sh   0
 



  1  =x
b