o
    ™¨ÊhOF  ã                   @   sL  d dl mZmZmZ 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 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 d
d„ Zdd„ Z dd„ Z!dd„ Z"dd„ Z#dd„ Z$dd„ Z%dd„ Z&e 'e¡G dd„ de(ƒƒZ)e 'e¡G dd„ de(ƒƒZ*e 'e¡G dd„ de(ƒƒZ+e 'e¡G d d!„ d!e(ƒƒZ,dS )"é    )Úabsolute_importÚdivisionÚprint_functionN)Úutils)ÚInvalidSignatureÚUnsupportedAlgorithmÚ_Reasons)Ú_calculate_digest_and_algorithmÚ_check_not_prehashedÚ_warn_sign_verify_deprecated)Úhashes)ÚAsymmetricSignatureContextÚAsymmetricVerificationContextÚrsa)ÚAsymmetricPaddingÚMGF1ÚOAEPÚPKCS1v15ÚPSSÚcalculate_max_pss_salt_length)ÚRSAPrivateKeyWithSerializationÚRSAPublicKeyWithSerializationc                 C   s(   | j }|tju s|tju rt||ƒS |S ©N)Ú_salt_lengthr   Ú
MAX_LENGTHr   r   )ÚpssÚkeyÚhash_algorithmÚsalt© r   úZ/var/www/html/env/lib/python3.10/site-packages/cryptography/hazmat/backends/openssl/rsa.pyÚ_get_rsa_pss_salt_length   s   
r!   c                 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.ú%{0} 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   ÚdataÚpaddingÚpadding_enumr   r   r    Ú_enc_dec_rsa&   s0   



þ
ýÿÿür4   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|ƒƒ}|dkrít| |ƒ | j	 |¡d |d … S )Né   r   úsize_t *úunsigned char[])r$   Ú_RSAPublicKeyr&   Ú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Ú_handle_rsa_enc_dec_errorÚbuffer)r0   r   r1   r3   r2   ÚinitÚcryptÚpkey_ctxÚresÚbuf_sizeÚmgf1_mdÚoaep_mdÚlabelptrÚoutlenÚbufr   r   r    r/   G   s^   


ÿÿÿþÿÿ
ÿ
r/   c                 C   sœ   |   ¡ }|  |¡ |d j| jjksJ ‚t|tƒr(|d j| jjks$J ‚t	dƒ‚| jj
| jj| jj| jjg}| jjrA| | jj¡ |d j|v sJJ ‚t	dƒ‚)Nr   zGData too long for key size. Encrypt less data or use a larger key size.zDecryption failed.)Ú_consume_errorsrA   Úlibr&   ÚERR_LIB_RSAr$   r8   ÚreasonÚ!RSA_R_DATA_TOO_LARGE_FOR_KEY_SIZEÚ
ValueErrorÚRSA_R_BLOCK_TYPE_IS_NOT_01ÚRSA_R_BLOCK_TYPE_IS_NOT_02ÚRSA_R_OAEP_DECODING_ERRORÚ RSA_R_DATA_TOO_LARGE_FOR_MODULUSÚ*Cryptography_HAS_RSA_R_PKCS_DECODING_ERRORÚappendÚRSA_R_PKCS_DECODING_ERROR)r0   r   ÚerrorsÚdecoding_errorsr   r   r    rQ      s&   

ÿÿù	rQ   c                 C   s    t |tƒs	tdƒ‚| j |j¡}|  |dk¡ t |tƒr"| jj}|S t |t	ƒrFt |j
tƒs3tdtjƒ‚||j d dk r@tdƒ‚| jj}|S td |j¡tjƒ‚)Nz'Expected provider of AsymmetricPadding.r   r"   é   zDDigest too large for key size. Use a larger key or different digest.r#   )r$   r   r%   r&   rE   r>   rA   r   r'   r   r)   r   r   r   r*   Údigest_sizerb   ÚRSA_PKCS1_PSS_PADDINGr-   r.   r,   )r0   r   r2   Ú	algorithmÚ	pkey_sizer3   r   r   r    Ú_rsa_sig_determine_padding›   s*   


ìþû
þrq   c                 C   s  t | |||ƒ}|  |¡}| j |j| jj¡}|  || jjk¡ | j || jj	¡}||ƒ}	|  |	dk¡ | j 
||¡}	|	dkrL|  ¡  td |j¡tjƒ‚| j ||¡}	|  |	dk¡ t|tƒr†| j |t|||ƒ¡}	|  |	dk¡ |  |jj¡}
| j ||
¡}	|  |	dk¡ |S )Nr5   r   z5{0} is not supported by this backend for RSA signing.)rq   rG   r&   r=   r>   r?   r@   rA   rB   rC   ÚEVP_PKEY_CTX_set_signature_mdr]   r   r-   r.   r   ÚUNSUPPORTED_HASHrD   r$   r   Ú EVP_PKEY_CTX_set_rsa_pss_saltlenr!   r)   rH   rI   )r0   r2   ro   r   r1   Ú	init_funcr3   Úevp_mdrU   rV   rX   r   r   r    Ú_rsa_sig_setup»   s:   
ÿü
ÿÿrw   c                 C   sú   t | ||||| jjƒ}| j d¡}| j || jj||t|ƒ¡}|  |dk¡ | j d|d ¡}| j ||||t|ƒ¡}|dkrs|  	¡ }	|	d j
| jjksNJ ‚d }
|	d j| jjkr\d}
n|	d j| jjksgJ ‚d}
|
d usoJ ‚t|
ƒ‚| j |¡d d … S )Nr6   r5   r7   r   z@Salt length too long for key size. Try using MAX_LENGTH instead.z0Digest too large for key size. Use a larger key.)rw   r&   ÚEVP_PKEY_sign_initr?   rP   ÚEVP_PKEY_signr@   rL   rA   r]   r^   r_   r`   ra   Ú RSA_R_DIGEST_TOO_BIG_FOR_RSA_KEYrb   rR   )r0   r2   ro   Úprivate_keyr1   rU   ÚbuflenrV   r\   rj   r`   r   r   r    Ú_rsa_sig_signÜ   s@   
þûÿÿÿr}   c                 C   sX   t | ||||| jjƒ}| j ||t|ƒ|t|ƒ¡}|  |dk¡ |dkr*|  ¡  t‚d S )Nr   )rw   r&   ÚEVP_PKEY_verify_initÚEVP_PKEY_verifyrL   rA   r]   r   )r0   r2   ro   Ú
public_keyÚ	signaturer1   rU   rV   r   r   r    Ú_rsa_sig_verifyÿ   s   
þÿþr‚   c                   @   ó$   e Zd Zdd„ Zdd„ Zdd„ ZdS )Ú_RSASignatureContextc                 C   s<   || _ || _t||||ƒ || _|| _t | j| j ¡| _d S r   )Ú_backendÚ_private_keyrq   Ú_paddingrH   r   ÚHashÚ	_hash_ctx)Úselfr0   r{   r2   ro   r   r   r    Ú__init__  s   z_RSASignatureContext.__init__c                 C   ó   | j  |¡ d S r   ©r‰   Úupdate©rŠ   r1   r   r   r    rŽ     ó   z_RSASignatureContext.updatec                 C   s   t | j| j| j| j| j ¡ ƒS r   )r}   r…   r‡   rH   r†   r‰   Úfinalize©rŠ   r   r   r    r‘   !  s   ûz_RSASignatureContext.finalizeN)Ú__name__Ú
__module__Ú__qualname__r‹   rŽ   r‘   r   r   r   r    r„     s    r„   c                   @   rƒ   )Ú_RSAVerificationContextc                 C   sF   || _ || _|| _|| _t||||ƒ |}|| _t | j| j ¡| _d S r   )	r…   Ú_public_keyÚ
_signaturer‡   rq   rH   r   rˆ   r‰   )rŠ   r0   r€   r�   r2   ro   r   r   r    r‹   -  s   z _RSAVerificationContext.__init__c                 C   rŒ   r   r�   r�   r   r   r    rŽ   ;  r�   z_RSAVerificationContext.updatec                 C   s"   t | j| j| j| j| j| j ¡ ƒS r   )r‚   r…   r‡   rH   r—   r˜   r‰   r‘   r’   r   r   r    Úverify>  s   úz_RSAVerificationContext.verifyN)r“   r”   r•   r‹   rŽ   r™   r   r   r   r    r–   +  s    r–   c                   @   sN   e Zd Zdd„ Ze d¡Zdd„ Zdd„ Zdd	„ Z	d
d„ Z
dd„ Zdd„ ZdS )Ú_RSAPrivateKeyc                 C   ót   || _ || _|| _| j j d¡}| j j | j|| j jj| j jj¡ | j  |d | j jjk¡ | j j 	|d ¡| _
d S ©Nú	BIGNUM **r   ©r…   Ú
_rsa_cdatar>   r?   rP   r&   ÚRSA_get0_keyr@   rA   ÚBN_num_bitsÚ	_key_size©rŠ   r0   Ú	rsa_cdataÚevp_pkeyÚnr   r   r    r‹   K  ó   þz_RSAPrivateKey.__init__r¢   c                 C   s   t ƒ  t|ƒ t| j| ||ƒS r   )r   r
   r„   r…   )rŠ   r2   ro   r   r   r    ÚsignerZ  s   z_RSAPrivateKey.signerc                 C   s8   t t | jd ¡ƒ}|t|ƒkrtdƒ‚t| j| ||ƒS )Ng       @z,Ciphertext length must be equal to key size.)ÚintÚmathÚceilÚkey_sizerL   rb   r4   r…   )rŠ   Ú
ciphertextr2   Úkey_size_bytesr   r   r    Údecrypt_  s   z_RSAPrivateKey.decryptc                 C   s|   | j j | j¡}| j  || j jjk¡ | j j || j jj¡}| j j 	|| j jj¡}| j  |dk¡ | j  
|¡}t| j ||ƒS )Nr5   )r…   r&   ÚRSAPublicKey_duprŸ   rA   r?   r@   rB   ÚRSA_freeÚRSA_blinding_onÚ_rsa_cdata_to_evp_pkeyr8   )rŠ   ÚctxrV   r¥   r   r   r    r€   f  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| j  |d ¡| j  |d ¡| j  |d ¡| j  |d ¡| j  |d ¡| j  |d ¡t
j| j  |d ¡| j  |d ¡d�d�S )Nr�   r   ©Úer¦   )ÚpÚqÚdÚdmp1Údmq1ÚiqmpÚpublic_numbers)r…   r?   rP   r&   r    rŸ   rA   r@   ÚRSA_get0_factorsÚRSA_get0_crt_paramsr   ÚRSAPrivateNumbersÚ
_bn_to_intÚRSAPublicNumbers)	rŠ   r¦   r¶   r¹   r·   r¸   rº   r»   r¼   r   r   r    Úprivate_numberso  sB   
ÿþùz_RSAPrivateKey.private_numbersc                 C   s   | j  |||| j| j¡S r   )r…   Ú_private_key_bytesr>   rŸ   )rŠ   Úencodingr-   Úencryption_algorithmr   r   r    Úprivate_bytes’  ó   ûz_RSAPrivateKey.private_bytesc                 C   s$   t | j||ƒ\}}t| j||| |ƒS r   )r	   r…   r}   )rŠ   r1   r2   ro   r   r   r    Úsign›  s   ÿz_RSAPrivateKey.signN)r“   r”   r•   r‹   r   Úread_only_propertyr¬   r¨   r¯   r€   rÃ   rÇ   rÉ   r   r   r   r    rš   I  s    
	#	rš   c                   @   sF   e Zd Zdd„ Ze d¡Zdd„ Zdd„ Zdd	„ Z	d
d„ Z
dd„ ZdS )r8   c                 C   r›   rœ   rž   r£   r   r   r    r‹   ¤  r§   z_RSAPublicKey.__init__r¢   c                 C   s2   t ƒ  t|tƒstdƒ‚t|ƒ t| j| |||ƒS )Nzsignature must be bytes.)r   r$   Úbytesr%   r
   r–   r…   )rŠ   r�   r2   ro   r   r   r    Úverifier³  s   
ÿz_RSAPublicKey.verifierc                 C   s   t | j| ||ƒS r   )r4   r…   )rŠ   Ú	plaintextr2   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	| j  
|d ¡| j  
|d ¡d�S )Nr�   r   rµ   )r…   r?   rP   r&   r    rŸ   r@   rA   r   rÂ   rÁ   )rŠ   r¦   r¶   r   r   r    r½   À  s   ÿþz_RSAPublicKey.public_numbersc                 C   s   | j  ||| | j| j¡S r   )r…   Ú_public_key_bytesr>   rŸ   )rŠ   rÅ   r-   r   r   r    Úpublic_bytesÍ  rÈ   z_RSAPublicKey.public_bytesc                 C   s&   t | j||ƒ\}}t| j||| ||ƒS r   )r	   r…   r‚   )rŠ   r�   r1   r2   ro   r   r   r    r™   Ö  s   ÿÿz_RSAPublicKey.verifyN)r“   r”   r•   r‹   r   rÊ   r¬   rÌ   rÎ   r½   rÐ   r™   r   r   r   r    r8   ¢  s    

	r8   )-Ú
__future__r   r   r   rª   Úcryptographyr   Úcryptography.exceptionsr   r   r   Ú*cryptography.hazmat.backends.openssl.utilsr	   r
   r   Úcryptography.hazmat.primitivesr   Ú)cryptography.hazmat.primitives.asymmetricr   r   r   Ú1cryptography.hazmat.primitives.asymmetric.paddingr   r   r   r   r   r   Ú-cryptography.hazmat.primitives.asymmetric.rsar   r   r!   r4   r/   rQ   rq   rw   r}   r‚   Úregister_interfaceÚobjectr„   r–   rš   r8   r   r   r   r    Ú<module>   s2    	!8 !#X