U
    ÒZj:T  ã                   @   sÎ  d dl Z d dlZd dlmZmZmZ d dlmZ d dlm	Z	m
Z
 d dlmZ d dlmZmZmZmZmZmZmZmZmZ d dlmZmZmZmZ ejr¢d dlmZ d	eej eef e	j!e"d
œdd„Z#d	ej d e$ee$dœdd„Z%d	ej d e$e"ee$dœdd„Z&d	ej d eej'e	j! e"dœdd„Z(d	eej'e	j! ej d ej)ej*ge"f dœdd„Z+d	ee	j!de$e$dœdd„Z,d	ee	j!de$e$dd œd!d"„Z-d	eej'e	j! de$e$d#œd$d%„Z.G d&d„ deƒZ/G d'd„ deƒZ0dS )(é    N)ÚInvalidSignatureÚUnsupportedAlgorithmÚ_Reasons)Ú_calculate_digest_and_algorithm)ÚhashesÚserialization)Úutils)	ÚAsymmetricPaddingÚMGF1ÚOAEPÚPKCS1v15ÚPSSÚ_AutoÚ_DigestLengthÚ
_MaxLengthÚcalculate_max_pss_salt_length)ÚRSAPrivateKeyÚRSAPrivateNumbersÚRSAPublicKeyÚRSAPublicNumbers)ÚBackendr   )ÚbackendÚpssÚkeyÚhash_algorithmÚreturnc                 C   sV   |j }t|tƒrt||ƒS t|tƒr*|jS t|tƒrNt|tƒrFtdƒ‚| j	j
S |S d S )Nz6PSS salt length can only be set to AUTO when verifying)Z_salt_lengthÚ
isinstancer   r   r   Údigest_sizer   r   Ú
ValueErrorÚ_libZRSA_PSS_SALTLEN_AUTO)r   r   r   r   Úsalt© r!   úk/var/www/html/TRUCKING_PROJECT/venv/lib/python3.8/site-packages/cryptography/hazmat/backends/openssl/rsa.pyÚ_get_rsa_pss_salt_length+   s    




ÿr#   )Ú_RSAPrivateKeyÚ_RSAPublicKey)r   r   ÚdataÚpaddingr   c                 C   sŒ   t |tƒstdƒ‚t |tƒr&| jj}nVt |tƒrh| jj}t |jt	ƒsPt
dtjƒ‚|  |¡s|t
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.)r   r	   Ú	TypeErrorr   r   ÚRSA_PKCS1_PADDINGr   ZRSA_PKCS1_OAEP_PADDINGÚ_mgfr
   r   r   ÚUNSUPPORTED_MGFZrsa_padding_supportedÚUNSUPPORTED_PADDINGÚformatÚnameÚ_enc_dec_rsa_pkey_ctx)r   r   r&   r'   Úpadding_enumr!   r!   r"   Ú_enc_dec_rsaA   s*    



þ
ý
þr3   )r   r   r&   r2   r'   r   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¡}
| j ||
¡}|  |dk¡ |  |j¡}| j ||¡}|  |dk¡ t |tƒ�r˜|jd k	�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   ZEVP_PKEY_encrypt_initZEVP_PKEY_encryptZEVP_PKEY_decrypt_initZ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   Ú_evp_md_non_null_from_algorithmr,   Ú
_algorithmÚEVP_PKEY_CTX_set_rsa_mgf1_mdZEVP_PKEY_CTX_set_rsa_oaep_mdZ_labelÚlenZOPENSSL_mallocZmemmoveZ EVP_PKEY_CTX_set0_rsa_oaep_labelÚnewÚbufferÚERR_clear_errorr   )r   r   r&   r2   r'   ÚinitZcryptÚpkey_ctxÚresÚbuf_sizeÚmgf1_mdZoaep_mdZlabelptrZoutlenÚbufÚresbufr!   r!   r"   r1   e   s\    	

ÿÿþý  ÿ

r1   )r   r   r'   Ú	algorithmr   c                 C   s´   t |tƒstdƒ‚| j |j¡}|  |dk¡ t |tƒrB| jj}nnt |t	ƒrœt |j
tƒsdtdtjƒ‚t |tjƒsxtdƒ‚||j d dk r’tdƒ‚| jj}ntd |j¡tjƒ‚|S )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   r?   r8   r;   r   r+   r   r,   r
   r   r   r-   r   ÚHashAlgorithmr   r   ZRSA_PKCS1_PSS_PADDINGr/   r0   r.   )r   r   r'   rN   Z	pkey_sizer2   r!   r!   r"   Ú_rsa_sig_determine_padding¨   s0    



þÿ

þrQ   )r%   r$   )r   r'   rN   r   Ú	init_funcc                 C   sN  t | |||ƒ}| j |j| jj¡}|  || jjk¡ | j || jj¡}||ƒ}|dkrh|  	¡ }t
d|ƒ‚|d k	r¬|  |¡}	| j ||	¡}|dkr¬|  	¡  td |j¡tjƒ‚| j ||¡}|dkrÞ|  	¡  td |j¡tjƒ‚t|tƒ�rJt|tjƒsút‚| j |t| |||ƒ¡}|  |dk¡ |  |jj¡}
| j ||
¡}|  |dk¡ |S )Nr4   z#Unable to sign/verify with this keyr   z4{} is not supported by this backend for RSA signing.z4{} is not supported for the RSA signature operation.)rQ   r   r7   r8   r9   r:   r;   r<   r=   Ú_consume_errorsr   r@   ZEVP_PKEY_CTX_set_signature_mdr   r/   r0   r   ZUNSUPPORTED_HASHr>   r.   r   r   r   rP   ÚAssertionErrorZ EVP_PKEY_CTX_set_rsa_pss_saltlenr#   r,   rA   rB   )r   r'   rN   r   rR   r2   rH   rI   ÚerrorsZevp_mdrK   r!   r!   r"   Ú_rsa_sig_setupØ   sR    

ÿüÿüþÿrV   r$   )r   r'   rN   Úprivate_keyr&   r   c           
      C   s¢   t | |||| jjƒ}| j d¡}| j || jj||t|ƒ¡}|  |dk¡ | j d|d ¡}| j ||||t|ƒ¡}|dkrŽ|  	¡ }	t
d|	ƒ‚| j |¡d d … S )Nr5   r4   r6   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)rV   r   ZEVP_PKEY_sign_initr9   rD   ZEVP_PKEY_signr:   rC   r;   Ú_consume_errors_with_textr   rE   )
r   r'   rN   rW   r&   rH   ÚbuflenrI   rL   rU   r!   r!   r"   Ú_rsa_sig_sign  s2    û    ÿýrZ   r%   )r   r'   rN   Ú
public_keyÚ	signaturer&   r   c                 C   sV   t | |||| jjƒ}| j ||t|ƒ|t|ƒ¡}|  |dk¡ |dkrR|  ¡  t‚d S )Nr   )rV   r   ZEVP_PKEY_verify_initZEVP_PKEY_verifyrC   r;   rS   r   )r   r'   rN   r[   r\   r&   rH   rI   r!   r!   r"   Ú_rsa_sig_verify-  s$    û    ÿr]   )r   r'   rN   r[   r\   r   c                 C   s–   t | |||| jjƒ}| j |j¡}|  |dk¡ | j d|¡}| j d|¡}| j ||||t	|ƒ¡}	| j 
|¡d |d … }
| j ¡  |	dkr’t‚|
S )Nr   r6   r5   r4   )rV   r   ZEVP_PKEY_verify_recover_initr?   r8   r;   r9   rD   ZEVP_PKEY_verify_recoverrC   rE   rF   r   )r   r'   rN   r[   r\   rH   ÚmaxlenrL   rY   rI   rM   r!   r!   r"   Ú_rsa_sig_recoverH  s.    û    ÿ
r_   c                   @   sÎ   e Zd ZU eed< eed< eed< dedœdd„Zdd	œd
d„Zdd	œdd„Z	e
ed	œdd„ƒZeeedœdd„Zed	œdd„Zed	œdd„Zejejejedœdd„Zeeejejejf edœdd„ZdS )r$   r8   Ú
_rsa_cdataÚ	_key_sizer   )r   Ú_skip_check_keyc                 C   sD  |sÀ|j  |¡}|dkr*| ¡ }td|ƒ‚|j d¡}|j d¡}|j  |||¡ | |d |jjk¡ | |d |jjk¡ |j  	|d ¡}	|j  	|d ¡}
|	dks®|
dkrÀ| ¡ }td|ƒ‚|| _
|| _|| _d| _t ¡ | _| j
j d¡}| j
j  | j|| j
jj| j
jj¡ | j
 |d | j
jjk¡ | j
j  |d ¡| _d S )Nr4   zInvalid private keyú	BIGNUM **r   F)r   ZRSA_check_keyrX   r   r9   rD   ÚRSA_get0_factorsr;   r:   Z	BN_is_oddÚ_backendr`   r8   Ú_blindedÚ	threadingÚLockÚ_blinding_lockÚRSA_get0_keyÚBN_num_bitsra   )Úselfr   Ú	rsa_cdataÚevp_pkeyrb   rI   rU   ÚpÚqZp_oddZq_oddÚnr!   r!   r"   Ú__init__q  s:    	


üz_RSAPrivateKey.__init__N©r   c              	   C   s$   | j s | j� |  ¡  W 5 Q R X d S ©N)rf   ri   Ú_non_threadsafe_enable_blinding©rl   r!   r!   r"   Ú_enable_blinding�  s    z_RSAPrivateKey._enable_blindingc                 C   s8   | j s4| jj | j| jjj¡}| j |dk¡ d| _ d S )Nr4   T)rf   re   r   ZRSA_blinding_onr`   r9   r:   r;   )rl   rI   r!   r!   r"   ru   ¤  s     ÿz._RSAPrivateKey._non_threadsafe_enable_blindingc                 C   s   | j S rt   ©ra   rv   r!   r!   r"   Úkey_size°  s    z_RSAPrivateKey.key_size)Ú
ciphertextr'   r   c                 C   s:   |   ¡  | jd d }|t|ƒkr*tdƒ‚t| j| ||ƒS )Né   é   z,Ciphertext length must be equal to key size.)rw   ry   rC   r   r3   re   )rl   rz   r'   Z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 rt   )re   r   ZRSAPublicKey_dupr`   r;   r9   r:   r<   ZRSA_freeZ_rsa_cdata_to_evp_pkeyr%   )rl   Úctxrn   r!   r!   r"   r[   ¼  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 )Nrc   r   ©Úerq   )ro   rp   ÚdÚdmp1Údmq1ÚiqmpÚpublic_numbers)re   r9   rD   r   rj   r`   r;   r:   rd   ZRSA_get0_crt_paramsr   Ú
_bn_to_intr   )	rl   rq   r€   r�   ro   rp   r‚   rƒ   r„   r!   r!   r"   Úprivate_numbersÃ  sH       ÿþùz_RSAPrivateKey.private_numbers)Úencodingr/   Úencryption_algorithmr   c                 C   s   | j  |||| | j| j¡S rt   )re   Z_private_key_bytesr8   r`   )rl   rˆ   r/   r‰   r!   r!   r"   Úprivate_bytesæ  s    úz_RSAPrivateKey.private_bytes)r&   r'   rN   r   c                 C   s(   |   ¡  t||ƒ\}}t| j||| |ƒS rt   )rw   r   rZ   re   )rl   r&   r'   rN   r!   r!   r"   Úsignõ  s    z_RSAPrivateKey.sign)Ú__name__Ú
__module__Ú__qualname__ÚobjectÚ__annotations__ÚintÚboolrr   rw   ru   Úpropertyry   Úbytesr	   r}   r   r[   r   r‡   r   ÚEncodingZPrivateFormatZKeySerializationEncryptionrŠ   ÚtypingÚUnionÚ
asym_utilsÚ	Prehashedr   rP   r‹   r!   r!   r!   r"   r$   l  s.   
 ÿ,%ûûc                   @   s¼   e Zd ZU eed< eed< eed< ddœdd„Zeedœd	d
„ƒZe	e
e	dœdd„Zedœdd„Zejeje	dœdd„Ze	e	e
ejejejf ddœdd„Ze	e
ejej e	dœdd„ZdS )r%   r8   r`   ra   r   )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 )Nrc   r   )re   r`   r8   r9   rD   r   rj   r:   r;   rk   ra   )rl   r   rm   rn   rq   r!   r!   r"   rr     s    üz_RSAPublicKey.__init__rs   c                 C   s   | j S rt   rx   rv   r!   r!   r"   ry     s    z_RSAPublicKey.key_size)Ú	plaintextr'   r   c                 C   s   t | j| ||ƒS rt   )r3   re   )rl   rš   r'   r!   r!   r"   Úencrypt  s    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 )Nrc   r   r   )
re   r9   rD   r   rj   r`   r:   r;   r   r†   )rl   rq   r€   r!   r!   r"   r…     s       ÿþz_RSAPublicKey.public_numbers)rˆ   r/   r   c                 C   s   | j  ||| | j| j¡S rt   )re   Z_public_key_bytesr8   r`   )rl   rˆ   r/   r!   r!   r"   Úpublic_bytes(  s        ÿz_RSAPublicKey.public_bytesN)r\   r&   r'   rN   r   c                 C   s&   t ||ƒ\}}t| j||| ||ƒ d S rt   )r   r]   re   )rl   r\   r&   r'   rN   r!   r!   r"   Úverify1  s         ÿz_RSAPublicKey.verify)r\   r'   rN   r   c                 C   s&   t |tjƒrtdƒ‚t| j||| |ƒS )NzoPrehashed is only supported in the sign and verify methods. It cannot be used with recover_data_from_signature.)r   r˜   r™   r*   r_   re   )rl   r\   r'   rN   r!   r!   r"   Úrecover_data_from_signature=  s    ÿ    ÿz)_RSAPublicKey.recover_data_from_signature)rŒ   r�   rŽ   r�   r�   r‘   rr   r“   ry   r”   r	   r›   r   r…   r   r•   ZPublicFormatrœ   r–   r—   r˜   r™   r   rP   r�   ÚOptionalrž   r!   r!   r!   r"   r%      s.   
üú
û)1rg   r–   Zcryptography.exceptionsr   r   r   Z*cryptography.hazmat.backends.openssl.utilsr   Zcryptography.hazmat.primitivesr   r   Z)cryptography.hazmat.primitives.asymmetricr   r˜   Z1cryptography.hazmat.primitives.asymmetric.paddingr	   r
   r   r   r   r   r   r   r   Z-cryptography.hazmat.primitives.asymmetric.rsar   r   r   r   ÚTYPE_CHECKINGZ,cryptography.hazmat.backends.openssl.backendr   r—   rP   r‘   r#   r”   r3   r1   rŸ   rQ   ÚCallableÚAnyrV   rZ   r]   r_   r$   r%   r!   r!   r!   r"   Ú<module>   s‚   ,ûû%úD
û1
û6ú!ù
ú$ 