
    Wwg                        d dl Z 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 d dlm	Z	m
Z
 d dlmZ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 d dlmZmZ d dlmZmZmZ d d	l m!Z!m"Z"m#Z# d d
l$m%Z%m&Z&m'Z' d dl$m(Z) d dl*m+Z+m,Z,m-Z-m.Z. d dl/m0Z0m1Z1 d dl2m3Z3m4Z4 d dl5m6Z6m7Z7 d dl8m9Z9 d dl:m;Z; d dl<m=Z= ddl>m?Z?m@Z@ ddlAmBZBmCZCmDZD ddlEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZN ddlOmPZPmQZQ ddlRmSZSmTZTmUZU ddlVmWZW  ej                  eY      ZZ ed       G d d             Z[ G d d eHe j                        Z] G d! d"e]eS      Z^ G d# d$e]eT      Z_ G d% d&e]eU      Z`	  e?j                  d'      Zb	  e?j                  d(      Zc	 	 d`d)Zdd`d*Zed`d+Zfej                   G d, d-ej                               Zi	 dad.ejd/eWfd0Zkd1ed2ej                  d3ejfd4Zmd1ed2ej                  d3ejfd5Znd2ej                  d6ej4                  d7ejfd8Zod1ed9ee!j                  eef   fd:Zqd1ed2ej                  d3ejfd;Zsd2ej                  d<ed6ej4                  d=ejd7ejf
d>Ztd3ejd?ej                  d@e[fdAZv	 dadBeej                     d.ejd/eWd@e[d9ej                  f
dCZx G dD dEey      Zz G dF dG      Z{ G dH dIej                        Z} G dJ dKej                        Z~ ej                  dL      ZdMe!j                  dNej4                  dOeej   d9e9fdPZ G dQ dRe{eP      Z ePj                  e       dSej                  dTe{d9eej   fdUZdVej                  dTe{d9eeej   eeW   f   fdWZdXe?j                  fdYZdZ Zd[ Zd\ Zd] ZeLj                   G d^ d_eL             Zy)b    N)	dataclass)sha1sha256)DictListOptionalSetTupleUnion)algoscmscorex509)RSAESOAEPParams)KeyEncryptionAlgorithmKeyEncryptionAlgorithmId)PrivateKeyInfoPublicKeyAlgorithmPublicKeyInfo)hasheskeywrapserialization)ECDHEllipticCurvePrivateKeyEllipticCurvePublicKey)generate_private_key)MGF1OAEPAsymmetricPaddingPKCS1v15)RSAPrivateKeyRSAPublicKey)X448PrivateKeyX448PublicKey)X25519PrivateKeyX25519PublicKey)KeyDerivationFunction)X963KDF)pkcs12   )genericmisc   )aes_cbc_decryptaes_cbc_encryptrc4_encrypt)	
AuthResult
AuthStatusCryptFilterCryptFilterBuilderCryptFilterConfigurationIdentityCryptFilterSecurityHandlerSecurityHandlerVersionbuild_crypt_filter)SerialisableCredentialSerialisedCredential)AESCryptFilterMixinAESGCMCryptFilterMixinRC4CryptFilterMixin)PubKeyPermissionsT)frozenc                   ,    e Zd ZU dZeed<   	 dZeed<   y)RecipientEncryptionPolicyFignore_key_usageprefer_oaepN)__name__
__module____qualname__rC   bool__annotations__rD        U/var/www/horilla/myenv/lib/python3.12/site-packages/pyhanko/pdf_utils/crypt/pubkey.pyrB   rB   F   s#    "d" KrK   rB   c                        e Zd ZU dZdZed   ed<   dddd fd
Zed	e	fd
       Z
 fdZ ej                         fdeej                      dedefdZd	efdZd	efdZ fdZ x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                x    || _         || _        || _        d| _        d x| _        | _        t        |   di | y )NFrJ   )rQ   rR   rS   _pubkey_auth_failed_shared_key_recp_key_seedsuper__init__)selfrQ   rR   rS   kwargs	__class__s        rL   rY   zPubKeyCryptFilter.__init__m   sD     %. 0#( 1554."6"rK   returnc                     | j                   S N)rU   rZ   s    rL   _auth_failedzPubKeyCryptFilter._auth_failed|   s    '''rK   c                 l    t        |t              st        t        |   |       d x| _        | _        y r_   )
isinstancerO   	TypeErrorrX   _set_security_handlerrV   rW   )rZ   handlerr\   s     rL   re   z'PubKeyCryptFilter._set_security_handler   s0    '#89O%g.1554.rK   certspolicypermsc                    | j                   s!| j                  rt        j                  d      | j                  !t	        j
                  d      | _        g | _        | j                  | j                  t        j                  d      t        || j                  ||| j                         }| j                  j                  |       y)ay  
        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 policy:
            Encryption policy choices for the chosen set of recipients.
        :param perms:
            The permission bits to assign to the listed recipients.
        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.)rh   include_permissions)
rR   rQ   r,   PdfErrorsecretstoken_bytesrW   rV   construct_recipient_cmsappend)rZ   rg   rh   ri   new_cmss        rL   add_recipientsz PubKeyCryptFilter.add_recipients   s    $ ##--  ??" #*"5"5b"9D DO'4+>+>+F--9  * $ 4 4
 	w'rK   c                     | j                   D ]6  }t        ||      \  }}||| _        t        t        j
                  |      c S  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.
        )rQ   read_seed_from_recipient_cmsrW   r1   r2   USERFAILED)rZ   
credentialrecpseedri   s        rL   authenticatezPubKeyCryptFilter.authenticate   sY     OO 	:D6tZHKD%&*#!*//599		:
 *++,,rK   c                    | j                   J | j                  t        j                  d      | j                   j                  t
        j                  k\  rt               }n
t               }|j                  | j                         | j                  D ]!  }|j                  |j                                # | j                  s| j                  r|j                  d       |j                         d | j                   S )Nz&No seed available; authenticate first.s   )rP   rW   r,   rm   versionr8   AES256r   r   updaterQ   dumprS   rR   digestkeylen)rZ   mdry   s      rL   derive_shared_encryption_keyz.PubKeyCryptFilter.derive_shared_encryption_key   s    }}(((&-- HII==  $:$A$AABB
		$%%&OO 	#DIIdiik"	#$$)=)=II)*yy{=T[[))rK   c                 2   t         |          }t        j                  | j                  dz        |d<   t        j
                  d | j                  D              }| j                  r||d<   n|d   |d<   t        j                  | j                        |d<   |S )N   /Lengthc              3   b   K   | ]'  }t        j                  |j                                ) y wr_   r+   ByteStringObjectr   .0ry   s     rL   	<genexpr>z2PubKeyCryptFilter.as_pdf_object.<locals>.<genexpr>   s&      )
6:G$$TYY[1)
   -//Recipientsr   /EncryptMetadata)
rX   as_pdf_objectr+   NumberObjectr   ArrayObjectrQ   rR   BooleanObjectrS   )rZ   resultrQ   r\   s      rL   r   zPubKeyCryptFilter.as_pdf_object   s    &(#00qAy(( )
>Boo)
 

 $.F=! %/qMF=!%,%:%:!!&
!" rK   )rE   rF   rG   __doc__rP   r   rI   rY   propertyrH   ra   re   r?   allow_everythingr   r   CertificaterB   rs   r1   r{   bytesr   r   __classcell__r\   s   @rL   rN   rN   V   s    ( 37Hh./6
 # (d ( (6 $F#4#E#E#G	)(D$$%)( *)( !	)(V-* -&*e * rK   rN   c                       e Zd ZdZy)PubKeyAESCryptFilterz<
    AES crypt filter for public key security handlers.
    NrE   rF   rG   r   rJ   rK   rL   r   r           	rK   r   c                       e Zd ZdZy)PubKeyAESGCMCryptFilterz@
    AES-GCM crypt filter for public key security handlers.
    Nr   rJ   rK   rL   r   r      r   rK   r   c                       e Zd ZdZy)PubKeyRC4CryptFilterz<
    RC4 crypt filter for public key security handlers.
    Nr   rJ   rK   rL   r   r      r   rK   r   z/DefaultCryptFilterz/DefEmbeddedFilec           	      T    t        t        t        | d||      it        t              S NT)r   rR   rQ   rS   default_stream_filterdefault_string_filter)r5   DEFAULT_CRYPT_FILTERr   r   rQ   rS   s      rL   _pubkey_rc4_configr     3    # "6 $%!1	#	
 32 rK   c           	      T    t        t        t        | d||      it        t              S r   )r5   r   r   r   s      rL   _pubkey_aes_configr   !  r   rK   c                 R    t        t        t        d| |      it        t              S )NT)rR   rQ   rS   r   )r5   r   r   rQ   rS   s     rL   _pubkey_gcm_configr   0  s0    # "9 $%!1#	
 32
 
rK   c                   |    e Zd ZdZ ej
                  d      Z ej
                  d      Z ej
                  d      Zy)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)	rE   rF   rG   r   r+   
NameObjectS3S4S5rJ   rK   rL   r   r   >  sB    
 
		,	-B			,	-B			,	-BrK   r   rz   ri   c                 T    t        |       dk(  sJ | |r|j                         z   S dz   S )Nrk   rK   )lenas_bytes)rz   ri   rl   s      rL   construct_envelope_contentr   J  s1     t9??':5>>#DDDDrK   pub_key_inforidenvelope_keyc                    t               }t        j                  dt        j                  d      i      }t	        j
                  | j                               }t        |t              sJ |j                  ||      }t        |||      S )N	algorithmrsaes_pkcs1v15paddingr   algoencrypted_data)r    r   r   r   r   load_der_public_keyr   rc   r"   encrypt_format_ktri)r   r   r   r   r   pub_keyr   s          rL   _rsaes_pkcs1v15_recipientr   Q  s{    
 jG%%	c223CDED //0A0A0CDGg|,,,__\7_CNCd>JJrK   c           	         ddl m} ddlm}  ||       } ||      }t	        j
                  t	        j                  d      t        d|idd|idd      d      }t        t        |      |d 	      }t        j                  | j                               }	t        |	t              sJ |	j                  ||
      }
t!        |||
      S )Nr   get_pyca_cryptography_hash)select_suitable_signing_md
rsaes_oaepr   mgf1r   
parameters)hash_algorithmmask_gen_algorithmmgfr   labelr   r   )pyhanko.sign.generalr   pyhanko.sign.signers.pdf_cmsr   r   r   r   r   r   r   r   r   r   rc   r"   r   r   )r   r   r   r   r   digest_function_namedigest_specr   r   r   r   s              rL   _rsaes_oaep_recipientr   b  s     @G5lC,-ABK%%55lC)'24H&I%+'24H&I+	
D tK(KtLG//0A0A0CDGg|,,,__\7_CNCd>JJrK   r   r   c           
      `    t        j                  dt        j                  d| ||d      i      S )Nktrir   )r}   r   key_encryption_algorithmencrypted_key)r   RecipientInfoKeyTransRecipientInfor   s      rL   r   r     s=    
 C-- 04%3			
 rK   r]   c                 b   | j                   }|dk(  r| j                  dz  }n
|dk(  rd}nd}|dk  r)t        j                         t	        d      t	        d      fS |dk  r)t        j
                         t	        d	      t	        d
      fS t        j                         t	        d      t	        d      fS )Necr*   x25519      aes128_wrapz1.3.132.1.11.1   aes192_wrapz1.3.132.1.11.2aes256_wrapz1.3.132.1.11.3)r   bit_sizer   SHA256r   SHA384SHA512)r   	algo_nameapprox_sec_levels      rL   _choose_ecdh_settingsr     s    
 &&ID'00A5	h	3MMO$]3$%56
 	

 
S	 MMO$]3$%56
 	
 MMO$]3$%56
 	
rK   c           	         t        |       \  }}}t        d|i      }t        j                  | j	                               }t        |t              r0t        |j                        }|j                  t               |      }	nrt        |t              r&t        j                         }|j                  |      }	n<t        |t              r&t        j                         }|j                  |      }	nt         t#        j$                  |j'                         j)                  t        j*                  j,                  t        j.                  j0                              }
t3        j4                  d      }t7        |||      }|j9                  |	      }t;        j<                  ||      }t?        ||
tA        j                  ||d      ||      S )Nr      
kdf_digestkey_wrap_algouser_keying_material)wrapping_keykey_to_wrapr   r   originator_keyr   ukmr   )!r   r   r   r   r   rc   r   generate_ec_private_keycurveexchanger   r&   r%   generater$   r#   NotImplementedErrorr   load
public_keypublic_bytesEncodingDERPublicFormatSubjectPublicKeyInforn   ro   _kdf_for_exchangederiver   aes_key_wrap_format_karir   )r   r   r   r   key_wrap_algo_idkey_exch_algo_idr   r   r   
ecdh_valueoriginator_key_infor   kdfkekr   s                  rL   _ecdh_recipientr    s    7L73K!#3 +K9I+JKM//0A0A0CDG
 '120?#,,TVW=
	G_	-)224#,,W5
	G]	+'002#,,W5
!!',,!!#00""&&&&;;	
 

b
!C
# C
 **Z
 C))lN *''-+
 % rK   r   r   c                     t        j                  dt        j                  dt        j                  d|      ||t        j                  | |d      gd            S )Nkari   r   )namevalue)r   r   )r}   
originatorr   r   recipient_encrypted_keys)r   r   KeyAgreeRecipientInfoOriginatorIdentifierOrKeyRecipientEncryptedKeyr   s        rL   r  r    sf     ''!;;) ,0-- #nE-
 rK   certrh   c                 V   |j                   }|d   }|d   j                  }t        |       dk(  sJ |j                  sI|j                  }|d|j                  vr-t        j                  d|j                  j                   d      t        j                  |j                  |j                  d      }|dk(  r=t        j                  d|i      }|j                  rt        |||       S t!        |||       S |d	v r$t        j"                  d|i      }	t%        ||	|       S t'        d
| d      )Nr       key_enciphermentzCertificate for subject z8 does not have the 'key_encipherment' key usage bit set.)issuerserial_numberrsaissuer_and_serial_number)r   r   x448zCannot encrypt for key type '')r  nativer   rC   key_usage_valuer,   PdfWriteErrorsubjecthuman_friendlyr   IssuerAndSerialNumberr%  r&  RecipientIdentifierrD   r   r   KeyAgreementRecipientIdentifierr  r  )
r   r!  rh   r   pubkey_algo_infoalgorithm_name	key_usageiss_serial_ridr   ka_rids
             rL   _recipient_infor8    sP   
 ??L+7+D%k299N|"""""((	 2):J:J J$$*4<<+F+F*G HE F  ..;;1C1CDN %%'8
 (sLII,\3MM	3	344'8
 |V\BB!+N+;1=
 	
rK   certificatesc                    t        |||      }t        j                  d      }t        ||d       \  }}| D 	cg c]  }	t	        ||	|       }
}	t        j                  t        j                  d      |d      }t        j                  t        j                  d      ||d      }t        j                  d	|
|d
      }t        j                  t        j                  d      |d      S c c}	w )N)rl   r#  )iv)rh   
aes256_cbcr   data)content_typecontent_encryption_algorithmencrypted_contentr   )r}   recipient_infosencrypted_content_infoenveloped_data)r>  content)r   rn   ro   r/   r8  r   EncryptionAlgorithmr   EncryptionAlgorithmIdEncryptedContentInfoContentTypeEnvelopedDataContentInfo)r9  rz   ri   rh   rl   envelope_contentr   r;  encrypted_envelope_contentr!  	rec_infosr   rB  rC  s                 rL   rp   rp   7  s   , 2e)< &&r*L%4&4&"B" ! 	d6:I 
 ""44\B	
D !55OOF3,0!;	
 &&(&<	
N ??OO,<=%	
 =s   C+c                       e Zd Zy)InappropriateCredentialErrorN)rE   rF   rG   rJ   rK   rL   rO  rO  ~  s    rK   rO  c            
           e Zd ZdZedej                  fd       Zdede	j                  defdZdede	j                  de	j                  dedef
d	Zy
)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.
    r]   c                     t         )zI
        :return:
            Return the recipient's certificate
        r  r`   s    rL   r!  zEnvelopeKeyDecrypter.cert  s
     "!rK   r   algo_paramsc                     t         )a  
        Invoke the actual key decryption algorithm.
        Used with key transport.

        :param encrypted_key:
            Payload to decrypt.
        :param algo_params:
            Specification of the encryption algorithm as a CMS object.
        :raises InappropriateCredentialError:
            if the credential cannot be used for key transport.
        :return:
            The decrypted payload.
        rS  )rZ   r   rT  s      rL   decryptzEnvelopeKeyDecrypter.decrypt  s
      "!rK   originator_identifierr   c                     t         )a"  
        Decrypt an envelope key using a key derived from a key exchange.

        :param encrypted_key:
            Payload to decrypt.
        :param algo_params:
            Specification of the encryption algorithm as a CMS object.
        :param originator_identifier:
            Information about the originator necessary to complete the key
            exchange.
        :param user_keying_material:
            The user keying material that will be used in the key derivation.
        :return:
            The decrypted payload.
        rS  )rZ   r   rT  rW  r   s        rL   decrypt_with_exchangez*EnvelopeKeyDecrypter.decrypt_with_exchange  s
    , "!rK   N)rE   rF   rG   r   r   r   r   r!  r   r   r   rV  r  rY  rJ   rK   rL   rQ  rQ    s     "d&& " """"141K1K"	"$"" //"  #<<	"
 $" 
"rK   rQ  c                   0    e Zd Zdefdej
                  fgZy)_PrivKeyAndCertkeyr!  N)rE   rF   rG   r   r   r   _fieldsrJ   rK   rL   r[  r[    s    ~&1A1A(BCGrK   r[  c                   X    e Zd Zdefdej
                  dddfdej
                  ddifgZy	)
ECCCMSSharedInfokey_infoentityUInfor   T)explicitoptionalsuppPubInforb  r*   N)rE   rF   rG   r   r   OctetStringr]  rJ   rK   rL   r_  r_    sA    	+,-	

 
((:q/:GrK   r_  zaes(\d+)_wrap(_pad)?r   r   r   c                    |d   j                   }t        j                  |      }|st        | d      t	        |j                  d            }t        | |dz  t        ||t        j                  d|      d      j                               S )Nr   * is not a supported key wrapping algorithmr-   r   z>I)r`  ra  rd  )r   length
sharedinfo)r+  AES_WRAP_PATTERN	fullmatchr  intgroupr(   r_  structpackr   )r   r   r   r  
wrap_matchkek_bit_lens         rL   r  r    s     *+6==!++,<=J!  JK
 	
 j&&q)*Ka#)3%{{4=
 $&
 
rK   c            
       P   e Zd ZdZ ej
                  d      Zedefd       Z	de
fdZede
fd       Zdej                  d	efd
Zedej                  fd       Zedd       Zedd       Zde
dej.                  de
fdZde
dej.                  dej2                  dee
   de
f
dZy)SimpleEnvelopeKeyDecrypterz
    Implementation of :class:`.EnvelopeKeyDecrypter` where the private key
    is an RSA or ECC key residing in memory.

    :param cert:
        The recipient's certificate.
    :param private_key:
        The recipient's private key.
    z1\.3\.132\.1\.11\.(\d+)r]   c                      y)Nraw_privkeyrJ   clss    rL   get_namez#SimpleEnvelopeKeyDecrypter.get_name  s    rK   c                 f    | j                   | j                  d}t        |      j                         S )N)r\  r!  )private_keyr!  r[  r   )rZ   valuess     rL   
_ser_valuez%SimpleEnvelopeKeyDecrypter._ser_value  s*    ))499=v&++--rK   r=  c                     	 t         j                  |      }|d   }|d   }t        ||      S # t        $ r}t        j                  d      |d }~ww xY w)Nr\  r!  z-Failed to decode serialised pubkey credentialr!  rz  )r[  r  
ValueErrorr,   PdfReadErrorrs  )rw  r=  decodedr\  r!  es         rL   _deser_valuez'SimpleEnvelopeKeyDecrypter._deser_value   sc    	%**40G%.C6?D
 *tEE	  	##?	s   . 	AAAr!  rz  c                      || _         || _        y r_   )rz  _cert)rZ   r!  rz  s      rL   rY   z#SimpleEnvelopeKeyDecrypter.__init__  s    +6
rK   c                     | j                   S r_   )r  r`   s    rL   r!  zSimpleEnvelopeKeyDecrypter.cert  s    zzrK   Nc                     ddl m} 	  || |      }ddl m}  ||      }t        ||      S # t        t        t
        f$ r!}t        j                  d|       Y d}~yd}~ww xY w)	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~  )	keysr  r  IOErrorr  rd   loggererrorrs  )key_file	cert_filekey_passphraser  rz  r  r!  r  s           rL   r  zSimpleEnvelopeKeyDecrypter.load  sf     	9		6^K 6(3D *tMM Y/ 	LL@1LM	s   - A"AA"c                 \   	 t        |d      5 }|j                         }ddd       t        j                  |      \  }}}ddlm}m}	  ||      } |	|      }t        ||      S # 1 sw Y   HxY w# t        t        t        f$ r%}
t        j                  d| d|
       Y d}
~
yd}
~
ww xY w)	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`.
        rbNr  ))_translate_pyca_cryptography_cert_to_asn1(_translate_pyca_cryptography_key_to_asn1zCould not open PKCS#12 file .r  r~  )openreadr)   load_key_and_certificatesr  r  r  r  r  rd   r  r  rs  )rw  pfx_filer  f	pfx_bytesrz  r!  other_certsr  r  r  s              rL   load_pkcs12z&SimpleEnvelopeKeyDecrypter.load_pkcs120  s    	h% %FFH	%/5/O/O:0,[$
 =TBDB;OK
 *tMM#% % Y/ 	LL7zCaLP	s-   A2 A&:A2 &A/+A2 2B+B&&B+r   rT  c                    |d   j                   }|dk(  rt               }n|dk(  rxddlm} |d   }|d   }|d   j                   }|dk7  rt	        d	| d
      t        t         ||d   d   j                                ||d   d   j                         d      }nt	        d| d      t        j                  | j                  j                         d      }	t        |	t              st        d      |	j                  ||      S )a  
        Decrypt the payload using RSA with PKCS#1 v1.5 padding or OAEP.
        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`` or ``rsaes_oaep``.
        :return:
            The decrypted payload.
        r   r   r   r   r   r   r   r   z#Only MGF1 is implemented, but got 'r*  )r   r   Nr   zSOnly 'rsaes_pkcs1v15' and 'rsaes_oaep' are supported for envelope decryption, not 'z'.passwordz5The loaded key does not seem to be an RSA private keyr   )r+  r    r   r   r  r   r   r   load_der_private_keyrz  r   rc   r!   rO  rV  )
rZ   r   rT  r   r   r   oaep_paramsr   mgf_namepriv_keys
             rL   rV  z"SimpleEnvelopeKeyDecrypter.decryptQ  sA     ,33	((jG,&G+6|+DK23C;'..H6!)9(1E  8L)+6==
 5 01+>EE 
G &--6Kr;  !55!!#d
 (M2.G  w??rK   rW  r   c                    |d   }| j                   j                  |j                        }d}|rnt        j                         t        j
                         t        j                         t        j                         dj                  |j                  d      d      }|st        d      t        j                  j                  |d   j                               }|d   j                  }	t         j                  |	      st        |	 d      |	j#                  d      rt$        j&                  nt$        j(                  }
t+        |||	      }|j,                  d
k7  rt        d      |j.                  j1                         }t3        j4                  |j                               }t3        j6                  | j8                  j                         d      }d}t;        |t<              rct;        |t>              r-|j@                  j,                  |j@                  j,                  k7  rtC        |      |jE                  tG               |      }nt;        |tH              r-t;        |tJ              stC        |      |jE                  |      }nHt;        |tL              r-t;        |tN              stC        |      |jE                  |      }ntQ        d      |jS                  |      } |
||      S )am  
        Decrypt the payload using a key agreed via ephemeral-static
        standard (non-cofactor) ECDH with X9.63 key derivation.
        Other schemes aer not supported at this time.


        :param encrypted_key:
            Payload to decrypt.
        :param algo_params:
            Specification of the encryption algorithm as a CMS object.
        :param originator_identifier:
            The originator info, which must be an EC key.
        :param user_keying_material:
            The user keying material that will be used in the key derivation.
        :return:
            The decrypted payload.
        r   N)0123r-   zGOnly dhSinglePass-stdDH algorithms from SEC 1 / RFC 5753 are supported.r   rg  _padr   r   z Only originator_key is supportedr  zCOriginator's public key is not compatible with selected private keyz4The loaded key does not seem to be an EC private key)r   wrapped_key)*dhsinglepass_stddh_arc_patternrk  dottedr   SHA224r   r   r   getrm  r  r   r   r  r   r+  rj  endswithr   aes_key_unwrap_with_paddingaes_key_unwrapr  r  chosenuntagr   r   r  rz  rc   r   r   r  r  r  r   r%   r&   r#   r$   rO  r  )rZ   r   rT  rW  r   oidmatchr   r   r  
unwrap_keyr  originator_pub_key_infooriginator_pub_keyr  mismatch_msgr  derived_keks                     rL   rY  z0SimpleEnvelopeKeyDecrypter.decrypt_with_exchange  s   2 +&33==cjjI59
]]_]]_]]_]]_	
 c%++a.$'  % 
 2277%**,
 !.k : A A))*:;%#$$NO 
  ((0 //'' 	
  !'!5
 !%%)99%&HII "((..0 	  +>>#((*
 !55!!#d

( 	 h 78 13IJ%++00HNN4G4GG ..!**463EFJ"230/B ..!**+=>J.10-@ ..!**+=>J.F  jj,{NNrK   r_   )rE   rF   rG   r   recompiler  classmethodstrrx  r   r|  r  r   r   r   rY   r   r!  staticmethodr  r  r   r   rV  r  r   rY  rJ   rK   rL   rs  rs    s>    &0RZZ0J%K"  .E . 	F 	F 	FT-- N  d&&   N N6 N N@4@"4@141K1K4@	4@lfOfO //fO  #<<	fO
 'uofO 
fOrK   rs  ed	decrypterc           	      2   | d   D ]  }|j                   dk(  r|j                  }|d   j                  }t        |t        j                        st        d      |d   }|d   j                  }|j                  j                  |k(  s|j                  j                  |k(  s	 |j                  |d   j                  |d         c S |j                   d
k(  r|j                  }|d   D ]  }	|	d   j                  }t        |t        j                        st        d      |d   }|d   j                  }|j                  j                  |k(  se|j                  j                  |k(  s	 |j                  |	d   j                  |d   |d   |d   j                        c c S  t        d       y # t        $ r}|d }~wt        $ r}t        j                  d	      |d }~ww xY w# t        $ r}|d }~wt        $ r}t        j                  d	      |d }~ww xY w)NrA  r   r   z;Recipient identifier must be of type IssuerAndSerialNumber.r%  r&  r   r   zFailed to decrypt envelope keyr  r  r  r   )rW  r   zLRecipientInfo must be of type KeyTransRecipientInfo or KeyAgreeRecipientInfo)r  r  rc   r   r0  r  r+  r!  r%  r&  rV  rO  	Exceptionr,   r  rY  )
r  r  rec_infor   issuer_and_serialr%  serialr  r  recipient_enc_keys
             rL   read_envelope_keyr    sC    () 9==F"??D $U 2 2/1J1JK)Q  'x0F&7>>F%%/NN00F:
$,,_-4478  ]]f$??D%)*D%E !!$5e$<$C$C!!"3S5N5NO-U  +84*?;BBNN))V3!44>!(>>-o>EE !;<26|2D15e1C1C	  ?   !6 &+ m9v Q 4 G  ++84 8  $ !"//< !!sH   "!F/&4G$/	G!8F::G!GG!$	H-G//H;HHrecipient_cmsc                    | d   j                   }|dk7  rt        j                  d|z         | d   }|d   }t        ||      }|y|d   }|d   j                   }	 |j                  }d
t        i}		 ddlm	}
 |	j                  |
j                  |
j                  |
j                  d       ||	v r|	|   }|j                   } ||||      }n+|dk(  rt#        ||      }nt        j                  d| d      |d d }d }t%        |      dk(  rt'        j(                  |dd        }||fS # t
        t        f$ r |d	   j                   }Y w xY w# t        $ r}|dv rt        d      |Y d }~d }~ww xY w)Nr>  rC  z7Recipient CMS content type must be enveloped data, not rD  rB  )NNr?  r@  r   aesr   )	symmetric)des	tripledesrc2z0DES, 3DES and RC2 require oscrypto to be presentrc4zCipher z is not allowed in PDF 2.0.rk      )r+  r,   r  r  encryption_cipherr  KeyErrorr.   oscryptor  r   des_cbc_pkcs5_decrypttripledes_cbc_pkcs5_decryptrc2_cbc_pkcs5_decryptr  r  encryption_ivr0   r   r?   
from_bytes)r  r  r>  r  rB  r   r   rL  cipher_namewith_ivr  r  decryption_funr;  rD  rz   ri   s                    rL   ru   ru   5  s    !077L''E
 	
 *)4B 89$R3L
 %;&%D "8"f /,, o&G& 	 66&BB 66	
 g - /I2N		l,FGk]"=>
 	
 3B<D)-E
7|r!,,WRS\:;S ! /;'../&  55%B 6s*   D% 09E	 %EE		E,E''E,cfdictc                 0   	 | d   }t        |t        j
                        r|f}|D cg c]+  }t        j                  j                  |j                        - }}| j                  dd      }||dS # t         $ r t        j                  d      w xY wc c}w )Nr   z.PubKey CF dictionary must have /Recipients keyr   Tr   )r  r,   r  rc   r+   r   r   rJ  r  original_bytesr  )r  rQ   xrecipient_objsrS   s        rL   _read_generic_pubkey_cf_infor    s    
M*

 *g667 ]
8B34Q--.N  zz"4d;(>NOO  
<
 	

s   A1 0B1Bc                 Z    | j                  dd      }t        d|dz  |dt        |       S )Nr   (   r   r   rR   rJ   )r  r   r  )r  rR   keylen_bitss      rL   _build_legacy_pubkey_cfr    s>    **Y+K a' 'v
. rK   c                 0    t        dd|dt        |       S )Nr   r  rJ   r   r  r  rR   s     rL   _build_aes128_pubkey_cfr    )     ' 'v
. rK   c                 0    t        dd|dt        |       S )Nr#  r  rJ   r  r  s     rL   _build_aes256_pubkey_cfr    r  rK   c                 .    t        dd|it        |       S )NrR   rJ   )r   r  r  s     rL   _build_aesgcm_pubkey_cfr    s$    " '+G+O rK   c                   n    e Zd ZU dZ ej
                  d      e ej
                  d      e ej
                  d      e ej
                  d      e	 ej
                  d      d iZ
eej
                  ef   ed<   ed	ej                   d
d
 ej$                         d
 e       d
fdeej,                     dedededd f
d       Z	 	 	 	 	 d'dededed   dee   dee   f
 fdZedefd       Zede e   fd       Z!edejD                  dede#fd       Z$edejD                  ded   f fd       Z%edejD                  fd       Z&edejD                  fd        Z'edejD                  fd!       Z(d" Z) ej$                          e       fdeej,                     dedefd#Z*	 d(d$e+e,e-f   de.fd%Z/defd&Z0 xZ1S ))rO   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`).
    z/V2z/AESV2z/AESV3z/AESV4z	/Identityc                     t               S r_   )r6   )___s     rL   <lambda>zPubKeySecurityHandler.<lambda>  s
    7J7L rK   _known_crypt_filtersr   Trg   ri   rh   pdf_macr]   c
                 |   |rt         j                  nt         j                  }d}|t        j                  k(  r|rt        d|d      }nt        |d|      }|	r=|t        j                  k\  r*|t        j                   z  }t        j                  d      }nd} | |||f||d|d|
}|j                  |||       |S )aO  
        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.
        :param encrypt_metadata:
            Whether to encrypt document metadata.

            .. warning::
                See :class:`.SecurityHandler` for some background on the
                way pyHanko interprets this value.
        :param pdf_mac:
            Include an ISO 32004 MAC.

            .. warning::
                Only works for PDF 2.0 security handlers.
        :param policy:
            Encryption policy choices for the chosen set of recipients.
        :return:
            An instance of :class:`.PubKeySecurityHandler`.
        Nr   )rS   rQ   r   r#  )rS   crypt_filter_configr  kdf_saltri   rh   )r   r   r   r8   RC4_OR_AES128r   r   r~   r?   TOLERATE_MISSING_PDF_MACrn   ro   rs   )rw  rg   keylen_bytesr}   use_aesuse_crypt_filtersri   rS   rh   r  r[   	subfiltercfcr  shs                  rL   build_from_certsz&PubKeySecurityHandler.build_from_certs  s    p !  ""$'' 	
 ,::: ()9d ) #%5
 w"8"?"??'@@@@E**2.HH	
 . #	
 	
 	%uV<	rK   r}   pubkey_handler_subfilterr  r5   r  r  c	                    |t         j                  k\  r(|t        j                  k7  rt	        j
                  d      ||t         j                  k(  rt        d||      }nz|t         j                  k(  rt        |||      }nX|t         j                  k(  rt        ||      }n7|t         j                  k\  rt        d||      }nt	        j
                  d      t        	| 9  ||||||       || _        || _        d | _        y )NzESubfilter /adbe.pkcs7.s5 is required for security handlers beyond V4.   )r   rS   rQ   r   r#  z1Failed to impute a reasonable crypt filter config)rS   compat_entriesr  )r8   r   r   r   r,   rm   RC4_40r   RC4_LONGER_KEYSAES_GCMr   r~   r   rX   rY   r  rS   rV   )
rZ   r}   r	  legacy_keylenrS   r  r  r  r  r\   s
            rL   rY   zPubKeySecurityHandler.__init__  s'    -;;;(,?,B,BB-- 
 &0777&8%5-'#
 2BBB&8(%5-'#
 2:::&8-@P'# 2999 '9%5-'# mmG  	-) 	 	
 2 0rK   c                 ,    t        j                  d      S )Nz/Adobe.PubSec)r+   r   rv  s    rL   rx  zPubKeySecurityHandler.get_name^  s    !!/22rK   c                 H    t         D ch c]  }|j                   c}S c c}w r_   )r   r  )rw  r  s     rL   support_generic_subfiltersz0PubKeySecurityHandler.support_generic_subfiltersb  s    !45A555s   r  rR   c                 b    t        | j                  ||      }|t        j                  d      |S )NzJAn absent CFM or CFM of /None doesn't make sense in a PubSec CF dictionary)r9   r  r,   r  )rw  r  rR   cfs       rL   read_cf_dictionaryz(PubKeySecurityHandler.read_cf_dictionaryf  sA      $$fo
 :##'  	rK   encrypt_dictc                     t         |   |      }| j                  |      }|(|t        j                  k7  rt        j                  d      |(|t        j                  k(  rt        j                  d      |S )Nz=Crypt filters require /adbe.pkcs7.s5 as the declared handler.z./adbe.pkcs7.s5 handler requires crypt filters.)rX   process_crypt_filters_determine_subfilterr   r   r,   r  )rw  r  r  r  r\   s       rL   r  z+PubKeySecurityHandler.process_crypt_filterst  s     g+L9,,\:	?y,?,B,BB##  [Y*=*@*@@##@  
rK   c           	      
   |j                  dd      }|dz  dk7  rt        j                  d      |dz  }t        j                  |dd       }|j                  dt        d	
      }t        ||||j                  dd             S )Nr   r   r   r   z"Key length must be a multiple of 8r   c                 z    | D cg c]+  }t         j                  j                  |j                        - c}S c c}w r_   )r   rJ  r  r  )lstr  s     rL   r  z?PubKeySecurityHandler.gather_pub_key_metadata.<locals>.<lambda>  s)    MA--a.>.>?M Ms   08r   Tdefault/KDFSaltc                 r    t        | t        j                  t        j                  f      r| j                  S d S r_   )rc   r+   TextStringObjectr   r  )r  s    rL   r  z?PubKeySecurityHandler.gather_pub_key_metadata.<locals>.<lambda>  s:    !G44g6N6NO $$ 
  rK   )r  r  rS   r  )r  r,   rm   get_and_applyrH   dict)rw  r  r  r   rQ   rS   s         rL   gather_pub_key_metadataz-PubKeySecurityHandler.gather_pub_key_metadata  s    "&&y#6!O!-- DEE!''M

 (55d 6 
  %-!//		
 	
rK   c                     	 t        j                  |dt        d|v rt        j                        S t        j                        S # t
        $ r t        j                  d|d   z         w xY w)N
/SubFilterz/CFr  z8Invalid /SubFilter in public key encryption dictionary: )r,   r#  r   r   r   r  r  )rw  r  s     rL   r  z*PubKeySecurityHandler._determine_subfilter  s    	%%# , (**	 	 -//	 	  	##J|,- 	s   .A A %A+c                     t        j                  |d         }t        d|| j                  |      | j	                  |      d| j                  |      S )N/V)r}   r	  r  rJ   )r8   from_numberrO   r  r  r%  )rw  r  vs      rL   instantiate_from_pdf_objectz1PubKeySecurityHandler.instantiate_from_pdf_object  s_     #..|D/AB$ 
%(%=%=l%K # 9 9, G
 )),7	
 	
rK   c                    t        j                         }t        j                  | j                               |d<   | j                  j
                  |d<   | j                  j                         |d<   | j                  r"t        j                  | j                        |d<   | j                  s| j                  t        j                  k(  r%t        j                  | j                  dz        |d<   | j                  t        j                  kD  r"t        j                  | j                         |d<   | j                  t"        j$                  k(  r+|j'                  | j(                  j                                |S | j+                         }t-        |t.              st0        t        j2                  d |j4                  D              |d	<   |S )
Nz/Filterr'  r)  r   r   r   r   c              3   b   K   | ]'  }t        j                  |j                                ) y wr_   r   r   s     rL   r   z6PubKeySecurityHandler.as_pdf_object.<locals>.<genexpr>  s)      8 ((58r   r   )r+   DictionaryObjectr   rx  r  r  r}   r   	_kdf_saltr   _compat_entriesr8   r  r   r   r   rS   r   r   r   r  get_stream_filterrc   rN   rd   r   rQ   )rZ   r   
default_cfs      rL   r   z#PubKeySecurityHandler.as_pdf_object  sf   ))+#..t}}?y#~~33|||113t>>!(!9!9$..!IF:  ||5EEE ' 4 4T[[1_ EF9<<0@@@)0)>)>%%*F%& >>0333MM$22@@BC  //1Jj*;<$+$7$7 8&118 %F=! rK   c                     | j                   j                         D ]'  }t        |t              s|j	                  |||       ) y )Nr  )r  standard_filtersrc   rN   rs   )rZ   rg   ri   rh   r  s        rL   rs   z$PubKeySecurityHandler.add_recipients  sG     **;;= 	ABb"34e5@	ArK   rx   c                 T   t        |t              rJt        j                  |      }t        |t              s"t        j                  dt        |       d      |}n|}t        j                         }| j                  j                         D ]k  }t        |t              s|j                  |      }|j                  t        j                   k(  r|c S |j"                  }|Ut        |t              sJ ||z  }m t        |t              r|| _        t'        t        j(                  |      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  )rc   r;   r:   deserialiserQ  r,   r  typer?   r   r  r5  rN   r{   statusr2   rw   permission_flags_credentialr1   rv   )	rZ   rx   id1deser_credentialactual_credentialri   r  r   cf_flagss	            rL   r{   z"PubKeySecurityHandler.authenticate  s   ( j"675AA*M.0DE''1156F1G0HK  !1 *!224**;;= 	"Bb"34__%67F}}
 1 11 ..H#!(,=>>>!	" ')?@0D*//511rK   c                 J    | j                   j                         j                  S r_   )r  get_for_stream
shared_keyr`   s    rL   get_file_encryption_keyz-PubKeySecurityHandler.get_file_encryption_key'  s    ''668CCCrK   )TNNTNr_   )2rE   rF   rG   r   r+   r   r  r  r  r  r  r   r4   rI   r  r8   r~   r?   r   rB   r   r   r   rH   r  r   r   listr   rY   r  rx  r	   r  r/  r3   r  r  r%  r  r,  r   rs   r   rQ  r;   r1   r{   rC  r   r   s   @rL   rO   rO     s    	5!#:8$&=8$&=8$&=;')LJ$w113EEF   &--#E#4#E#E#G,E,GYD$$%Y !Y *Y Y 
!Y Y@ DH)-$(A 'A  #6A  &&@AA  !A  5/A F 3 3 3 63s8 6 6 --@D	  "33	,	- " 
73K3K 
 
B 0H0H  $ 

"33

 

B $F#4#E#E#G,E,G	AD$$%A !A *	A$ 02.0DDE02 
	02dD DrK   rO   )NT)T)abcenumloggingr  rn   rn  dataclassesr   hashlibr   r   typingr   r   r   r	   r
   r   
asn1cryptor   r   r   r   asn1crypto.algosr   asn1crypto.cmsr   r   asn1crypto.keysr   r   r   cryptography.hazmat.primitivesr   r   r   ,cryptography.hazmat.primitives.asymmetric.ecr   r   r   r   r   1cryptography.hazmat.primitives.asymmetric.paddingr   r   r   r    -cryptography.hazmat.primitives.asymmetric.rsar!   r"   .cryptography.hazmat.primitives.asymmetric.x448r#   r$   0cryptography.hazmat.primitives.asymmetric.x25519r%   r&   "cryptography.hazmat.primitives.kdfr'   *cryptography.hazmat.primitives.kdf.x963kdfr(   ,cryptography.hazmat.primitives.serializationr)    r+   r,   _utilr.   r/   r0   apir1   r2   r3   r4   r5   r6   r7   r8   r9   cred_serr:   r;   filter_mixinsr<   r=   r>   permissionsr?   	getLoggerrE   r  rB   ABCrN   r   r   r   r   r   DEF_EMBEDDED_FILEr   r   r   uniqueEnumr   r   r   r1  r   r   r   HashAlgorithmr   r2  r  r  r   r8  rJ  rp   rd   rO  rQ  Sequencer[  r_  r  rj  r  rs  registerrI  r  ru   r/  r  r  r  r  r  rO   rJ   rK   rL   <module>rf     s   
   	   !   : : - - , K M M I I 
  E > ?  @ @
 
 
 C 
 +			8	$ $  KSWW K\	,.A 		/1G 		,.A 	
 *w))*?@ 
 'G&&'9: 

 .$)) . . @DE
E)EKK		 	 K K"KK		 	 K KB		 	 

$
$ &



24LL
B77		,	,7 7t		,	,! 
$
$ 
	
 6(
(



(
 &(
` Dt''(D
D D &	D 	__DN	9 	
8" 8"vDdmm D	t}} 	 2::56 $$ -- #5/	
 4BO!57M BOJ      : ;??&:?e_?DG??G/CG
8E?H%6778GTP)A)A P  zDO zD zDrK   