o
    �)%a·Q  ã                
   @   sn  d dl Z d dl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 d dlmZ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	ed
e jeef dejde fdd„Z!d
e jd de"dede"fdd„Z#d
e jd de"de dede"f
dd„Z$dd„ Z%dd„ Z&dd„ Z'dd„ Z(dd „ Z)G d!d"„ d"eƒZ*G d#d$„ d$eƒZ+G d%d&„ d&eƒZ,G d'd(„ d(eƒZ-dS ))é    N)Úutils)ÚInvalidSignatureÚUnsupportedAlgorithmÚ_Reasons)Ú_calculate_digest_and_algorithmÚ_check_not_prehashedÚ_warn_sign_verify_deprecated)ÚhashesÚserialization)ÚAsymmetricSignatureContextÚAsymmetricVerificationContextr   )ÚAsymmetricPaddingÚMGF1ÚOAEPÚPKCS1v15ÚPSSÚcalculate_max_pss_salt_length)ÚRSAPrivateKeyÚRSAPrivateNumbersÚRSAPublicKeyÚRSAPublicNumbersÚpssÚkeyÚhash_algorithmÚreturnc                 C   s(   | j }|tju s|tju rt||ƒS |S ©N)Ú_salt_lengthr   Ú
MAX_LENGTHr   r   )r   r   r   Úsalt© r   úJ/usr/lib/python3/dist-packages/cryptography/hazmat/backends/openssl/rsa.pyÚ_get_rsa_pss_salt_length)   s   
r!   )Ú_RSAPrivateKeyÚ_RSAPublicKeyÚdataÚpaddingc                 C   sŒ   t |tƒs	tdƒ‚t |tƒr| jj}n+t |tƒr4| jj}t |jt	ƒs(t
dtjƒ‚|  |¡s3t
dtjƒ‚n
t
d |j¡tjƒ‚t| ||||ƒS )Nz1Padding must be an instance of AsymmetricPadding.ú'Only MGF1 is supported by this backend.zPThis combination of padding and hash algorithm is not supported by this backend.ú${} is not supported by this backend.)Ú
isinstancer   Ú	TypeErrorr   Ú_libÚRSA_PKCS1_PADDINGr   ÚRSA_PKCS1_OAEP_PADDINGÚ_mgfr   r   r   ÚUNSUPPORTED_MGFÚrsa_padding_supportedÚUNSUPPORTED_PADDINGÚformatÚnameÚ_enc_dec_rsa_pkey_ctx)Úbackendr   r$   r%   Úpadding_enumr   r   r    Ú_enc_dec_rsa6   s,   



þ
ýÿ
þr6   r5   c                 C   sþ  t |tƒr| jj}| jj}n| jj}| jj}| j |j| j	j
¡}|  || j	j
k¡ | j	 || jj¡}||ƒ}|  |dk¡ | j ||¡}|  |dk¡ | j |j¡}	|  |	dk¡ t |tƒr‹| jjr‹|  |jj¡}
| j ||
¡}|  |dk¡ |  |j¡}| j ||¡}|  |dk¡ t |tƒrÌ|jd urÌt|jƒdkrÌ| j t|jƒ¡}|  || j	j
k¡ | j	 ||jt|jƒ¡ | j ||t|jƒ¡}|  |dk¡ | j	 d|	¡}| j	 d|	¡}|||||t|ƒƒ}| j	 |¡d |d … }| j ¡  |dkrýtdƒ‚|S )Né   r   úsize_t *úunsigned char[]zEncryption/decryption failed.) r(   r#   r*   ÚEVP_PKEY_encrypt_initÚEVP_PKEY_encryptÚEVP_PKEY_decrypt_initÚEVP_PKEY_decryptÚEVP_PKEY_CTX_newÚ	_evp_pkeyÚ_ffiÚNULLÚopenssl_assertÚgcÚEVP_PKEY_CTX_freeÚEVP_PKEY_CTX_set_rsa_paddingÚEVP_PKEY_sizer   ÚCryptography_HAS_RSA_OAEP_MDÚ_evp_md_non_null_from_algorithmr-   Ú
_algorithmÚEVP_PKEY_CTX_set_rsa_mgf1_mdÚEVP_PKEY_CTX_set_rsa_oaep_mdÚ_labelÚlenÚOPENSSL_mallocÚmemmoveÚ EVP_PKEY_CTX_set0_rsa_oaep_labelÚnewÚbufferÚERR_clear_errorÚ
ValueError)r4   r   r$   r5   r%   ÚinitÚcryptÚpkey_ctxÚresÚbuf_sizeÚmgf1_mdÚoaep_mdÚlabelptrÚoutlenÚbufÚresbufr   r   r    r3   Z   sT   

ÿÿ
ÿ
r3   c                 C   s´   t |tƒs	tdƒ‚| j |j¡}|  |dk¡ t |tƒr"| jj}|S t |t	ƒrPt |j
tƒs3tdtjƒ‚t |tjƒs=tdƒ‚||j d dk rJtdƒ‚| jj}|S td |j¡tjƒ‚)Nz'Expected provider of AsymmetricPadding.r   r&   z*Expected instance of hashes.HashAlgorithm.é   zDDigest too large for key size. Use a larger key or different digest.r'   )r(   r   r)   r*   rF   r?   rB   r   r+   r   r-   r   r   r   r.   r	   ÚHashAlgorithmÚdigest_sizerT   ÚRSA_PKCS1_PSS_PADDINGr1   r2   r0   )r4   r   r%   Ú	algorithmÚ	pkey_sizer5   r   r   r    Ú_rsa_sig_determine_padding›   s2   


æþÿû
þrf   c           
      C   s.  t | |||ƒ}| j |j| jj¡}|  || jjk¡ | j || jj¡}||ƒ}|  |dk¡ |d urP|  	|¡}| j 
||¡}|dkrP|  ¡  td |j¡tjƒ‚| j ||¡}|dkri|  ¡  td |j¡tjƒ‚t|tƒr•| j |t|||ƒ¡}|  |dk¡ |  	|jj¡}	| j ||	¡}|  |dk¡ |S )Nr7   r   z4{} is not supported by this backend for RSA signing.z4{} is not supported for the RSA signature operation.)rf   r*   r>   r?   r@   rA   rB   rC   rD   rH   ÚEVP_PKEY_CTX_set_signature_mdÚ_consume_errorsr   r1   r2   r   ÚUNSUPPORTED_HASHrE   r0   r(   r   Ú EVP_PKEY_CTX_set_rsa_pss_saltlenr!   r-   rI   rJ   )
r4   r%   rd   r   Ú	init_funcr5   rW   rX   Úevp_mdrZ   r   r   r    Ú_rsa_sig_setupÆ   sJ   
ÿüÿü
ÿÿrm   c           
      C   s¢   t | |||| jjƒ}| j d¡}| j || jj||t|ƒ¡}|  |dk¡ | j d|d ¡}| j ||||t|ƒ¡}|dkrG|  	¡ }	t
d|	ƒ‚| j |¡d d … S )Nr8   r7   r9   r   zuDigest or salt length too long for key size. Use a larger key or shorter salt length if you are specifying a PSS salt)rm   r*   ÚEVP_PKEY_sign_initr@   rQ   ÚEVP_PKEY_signrA   rM   rB   Ú_consume_errors_with_textrT   rR   )
r4   r%   rd   Úprivate_keyr$   rW   ÚbuflenrX   r^   Úerrorsr   r   r    Ú_rsa_sig_signð   s*   ûÿýrt   c                 C   sV   t | |||| jjƒ}| j ||t|ƒ|t|ƒ¡}|  |dk¡ |dkr)|  ¡  t‚d S )Nr   )rm   r*   ÚEVP_PKEY_verify_initÚEVP_PKEY_verifyrM   rB   rh   r   )r4   r%   rd   Ú
public_keyÚ	signaturer$   rW   rX   r   r   r    Ú_rsa_sig_verify
  s   ûÿþry   c                 C   s–   t | |||| jjƒ}| j |j¡}|  |dk¡ | j d|¡}| j d|¡}| j ||||t	|ƒ¡}	| j 
|¡d |d … }
| j ¡  |	dkrIt‚|
S )Nr   r9   r8   r7   )rm   r*   ÚEVP_PKEY_verify_recover_initrF   r?   rB   r@   rQ   ÚEVP_PKEY_verify_recoverrM   rR   rS   r   )r4   r%   rd   rw   rx   rW   Úmaxlenr^   rr   rX   r_   r   r   r    Ú_rsa_sig_recover  s&   ûÿ
r}   c                   @   sD   e Zd Zdededejfdd„Zdeddfd	d
„Z	defdd„Z
dS )Ú_RSASignatureContextrq   r%   rd   c                 C   s<   || _ || _t||||ƒ || _|| _t | j| j ¡| _d S r   )Ú_backendÚ_private_keyrf   Ú_paddingrI   r	   ÚHashÚ	_hash_ctx)Úselfr4   rq   r%   rd   r   r   r    Ú__init__=  s   z_RSASignatureContext.__init__r$   r   Nc                 C   ó   | j  |¡ d S r   ©rƒ   Úupdate©r„   r$   r   r   r    rˆ   O  ó   z_RSASignatureContext.updatec                 C   s   t | j| j| j| j| j ¡ ƒS r   )rt   r   r�   rI   r€   rƒ   Úfinalize©r„   r   r   r    r‹   R  s   ûz_RSASignatureContext.finalize)Ú__name__Ú
__module__Ú__qualname__r   r   r	   ra   r…   Úbytesrˆ   r‹   r   r   r   r    r~   <  s    ýü
ûr~   c                   @   sD   e Zd Zdedededejfdd„Zdedd	fd
d„Z	ddd„Z
d	S )Ú_RSAVerificationContextrw   rx   r%   rd   c                 C   sF   || _ || _|| _|| _t||||ƒ |}|| _t | j| j ¡| _d S r   )	r   Ú_public_keyÚ
_signaturer�   rf   rI   r	   r‚   rƒ   )r„   r4   rw   rx   r%   rd   r   r   r    r…   ]  s   z _RSAVerificationContext.__init__r$   r   Nc                 C   r†   r   r‡   r‰   r   r   r    rˆ   r  rŠ   z_RSAVerificationContext.updatec                 C   s"   t | j| j| j| j| j| j ¡ ƒS r   )ry   r   r�   rI   r’   r“   rƒ   r‹   rŒ   r   r   r    Úverifyu  s   úz_RSAVerificationContext.verify)r   N)r�   rŽ   r�   r   r�   r   r	   ra   r…   rˆ   r”   r   r   r   r    r‘   \  s    ýüû
úr‘   c                   @   s°   e Zd Zdd„ Ze d¡Zdedej	de
fdd„Zd	ededefd
d„Zdefdd„Zdefdd„Zdejdejdejdefdd„Zdededejejej	f defdd„ZdS )r"   c                 C   sº   |j  |¡}|dkr| ¡ }td|ƒ‚|j  ||jj¡}| |dk¡ || _|| _	|| _
| jj d¡}| jj  | j	|| jjj| jjj¡ | j |d | jjjk¡ | jj  |d ¡| _d S )Nr7   zInvalid private keyú	BIGNUM **r   )r*   ÚRSA_check_keyrp   rT   ÚRSA_blinding_onr@   rA   rB   r   Ú
_rsa_cdatar?   rQ   ÚRSA_get0_keyÚBN_num_bitsÚ	_key_size)r„   r4   Ú	rsa_cdataÚevp_pkeyrX   rs   Únr   r   r    r…   �  s$   
üz_RSAPrivateKey.__init__r›   r%   rd   r   c                 C   s   t ƒ  t|ƒ t| j| ||ƒS r   )r   r   r~   r   )r„   r%   rd   r   r   r    Úsignerœ  s   z_RSAPrivateKey.signerÚ
ciphertextc                 C   s2   | j d d }|t|ƒkrtdƒ‚t| j| ||ƒS )Né   é   z,Ciphertext length must be equal to key size.)Úkey_sizerM   rT   r6   r   )r„   r    r%   Úkey_size_bytesr   r   r    Údecrypt£  s   z_RSAPrivateKey.decryptc                 C   sV   | j j | j¡}| j  || j jjk¡ | j j || j jj¡}| j  	|¡}t
| j ||ƒS r   )r   r*   ÚRSAPublicKey_dupr˜   rB   r@   rA   rC   ÚRSA_freeÚ_rsa_cdata_to_evp_pkeyr#   )r„   Úctxr�   r   r   r    rw   ª  s
   z_RSAPrivateKey.public_keyc           	      C   sþ  | j j d¡}| j j d¡}| j j d¡}| j j d¡}| j j d¡}| j j d¡}| j j d¡}| j j d¡}| j j | j|||¡ | j  |d | j jjk¡ | j  |d | j jjk¡ | j  |d | j jjk¡ | j j | j||¡ | j  |d | j jjk¡ | j  |d | j jjk¡ | j j 	| j|||¡ | j  |d | j jjk¡ | j  |d | j jjk¡ | j  |d | j jjk¡ t
| j  |d ¡| j  |d ¡| j  |d ¡| j  |d ¡| j  |d ¡| j  |d ¡t| j  |d ¡| j  |d ¡d�d�S )Nr•   r   ©Úerž   )ÚpÚqÚdÚdmp1Údmq1ÚiqmpÚpublic_numbers)r   r@   rQ   r*   r™   r˜   rB   rA   ÚRSA_get0_factorsÚRSA_get0_crt_paramsr   Ú
_bn_to_intr   )	r„   rž   r«   r®   r¬   r­   r¯   r°   r±   r   r   r    Úprivate_numbers±  sB   
ÿþùz_RSAPrivateKey.private_numbersÚencodingr1   Úencryption_algorithmc                 C   s   | j  |||| | j| j¡S r   )r   Ú_private_key_bytesr?   r˜   )r„   r·   r1   r¸   r   r   r    Úprivate_bytesÔ  s   úz_RSAPrivateKey.private_bytesr$   c                 C   s$   t | j||ƒ\}}t| j||| |ƒS r   )r   r   rt   )r„   r$   r%   rd   r   r   r    Úsignã  s   ÿz_RSAPrivateKey.signN)r�   rŽ   r�   r…   r   Úread_only_propertyr£   r   r	   ra   r   rŸ   r�   r¥   r   rw   r   r¶   r
   ÚEncodingÚPrivateFormatÚKeySerializationEncryptionrº   ÚtypingÚUnionÚ
asym_utilsÚ	Prehashedr»   r   r   r   r    r"   €  s>    
ÿÿ
þ#þýü
ûþýüûr"   c                
   @   sÆ   e Zd Zdd„ Ze d¡Zdedede	j
defdd	„Zd
ededefdd„Zdefdd„Zdejdejdefdd„Zdedededejeje	j
f ddf
dd„Zdededeje	j
 defdd„ZdS )r#   c                 C   st   || _ || _|| _| j j d¡}| j j | j|| j jj| j jj¡ | j  |d | j jjk¡ | j j 	|d ¡| _
d S )Nr•   r   )r   r˜   r?   r@   rQ   r*   r™   rA   rB   rš   r›   )r„   r4   rœ   r�   rž   r   r   r    r…   ð  s   üz_RSAPublicKey.__init__r›   rx   r%   rd   r   c                 C   s,   t ƒ  t d|¡ t|ƒ t| j| |||ƒS )Nrx   )r   r   Ú_check_bytesr   r‘   r   ©r„   rx   r%   rd   r   r   r    Úverifier  s   ÿz_RSAPublicKey.verifierÚ	plaintextc                 C   s   t | j| ||ƒS r   )r6   r   )r„   rÇ   r%   r   r   r    Úencrypt  rŠ   z_RSAPublicKey.encryptc                 C   s�   | j j d¡}| j j d¡}| j j | j||| j jj¡ | j  |d | j jjk¡ | j  |d | j jjk¡ t| j  	|d ¡| j  	|d ¡d�S )Nr•   r   rª   )
r   r@   rQ   r*   r™   r˜   rA   rB   r   rµ   )r„   rž   r«   r   r   r    r²     s   ÿþz_RSAPublicKey.public_numbersr·   r1   c                 C   s   | j  ||| | j| j¡S r   )r   Ú_public_key_bytesr?   r˜   )r„   r·   r1   r   r   r    Úpublic_bytes  s   ÿz_RSAPublicKey.public_bytesr$   Nc                 C   s&   t | j||ƒ\}}t| j||| ||ƒS r   )r   r   ry   )r„   rx   r$   r%   rd   r   r   r    r”   (  s   ÿÿz_RSAPublicKey.verifyc                 C   s   t |ƒ t| j||| |ƒS r   )r   r}   r   rÅ   r   r   r    Úrecover_data_from_signature6  s   ÿz)_RSAPublicKey.recover_data_from_signature)r�   rŽ   r�   r…   r   r¼   r£   r�   r   r	   ra   r   rÆ   rÈ   r   r²   r
   r½   ÚPublicFormatrÊ   rÀ   rÁ   rÂ   rÃ   r”   ÚOptionalrË   r   r   r   r    r#   ï  sR    
þýü
ûþý
ü	þýüû
úþý
üûr#   ).rÀ   Úcryptographyr   Úcryptography.exceptionsr   r   r   Ú*cryptography.hazmat.backends.openssl.utilsr   r   r   Úcryptography.hazmat.primitivesr	   r
   Ú)cryptography.hazmat.primitives.asymmetricr   r   rÂ   Ú1cryptography.hazmat.primitives.asymmetric.paddingr   r   r   r   r   r   Ú-cryptography.hazmat.primitives.asymmetric.rsar   r   r   r   rÁ   ra   Úintr!   r�   r6   r3   rf   rm   rt   ry   r}   r~   r‘   r"   r#   r   r   r   r    Ú<module>   s\    ÿþý
üþýü
û$þýüû
úA+* $o