U
    cc: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rd 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!   b/var/www/html/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	rt|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rt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resZ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	rt |j
tsdtdtjt |tjsxtd||j d dk rt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'   rM   Z	pkey_sizer2   r!   r!   r"   _rsa_sig_determine_padding   s0    





rP   )r%   r$   )r   r'   rM   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st| 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.)rP   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   rO   AssertionErrorZ EVP_PKEY_CTX_set_rsa_pss_saltlenr#   r,   rA   rB   )r   r'   rM   r   rQ   r2   rH   rI   errorsZevp_mdrJ   r!   r!   r"   _rsa_sig_setup   sR    

rU   r$   )r   r'   rM   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)rU   r   ZEVP_PKEY_sign_initr9   rD   ZEVP_PKEY_signr:   rC   r;   _consume_errors_with_textr   rE   )
r   r'   rM   rV   r&   rH   buflenrI   rK   rT   r!   r!   r"   _rsa_sig_sign  s2        rY   r%   )r   r'   rM   
public_key	signaturer&   r   c                 C   sV   t | |||| jj}| j||t||t|}| |dk |dkrR|   td S )Nr   )rU   r   ZEVP_PKEY_verify_initZEVP_PKEY_verifyrC   r;   rR   r   )r   r'   rM   rZ   r[   r&   rH   rI   r!   r!   r"   _rsa_sig_verify-  s$        r\   )r   r'   rM   rZ   r[   r   c                 C   s   t | |||| jj}| j|j}| |dk | jd|}| jd|}| j||||t	|}	| j
|d |d  }
| j  |	dkrt|
S )Nr   r6   r5   r4   )rU   r   ZEVP_PKEY_verify_recover_initr?   r8   r;   r9   rD   ZEVP_PKEY_verify_recoverrC   rE   rF   r   )r   r'   rM   rZ   r[   rH   maxlenrK   rX   rI   rL   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_keyrW   r   r9   rD   RSA_get0_factorsr;   r:   Z	BN_is_odd_backendr_   r8   _blinded	threadingLock_blinding_lockRSA_get0_keyBN_num_bitsr`   )selfr   	rsa_cdataevp_pkeyra   rI   rT   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)re   rh   _non_threadsafe_enable_blindingrk   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)re   rd   r   ZRSA_blinding_onr_   r9   r:   r;   )rk   rI   r!   r!   r"   rt     s     z._RSAPrivateKey._non_threadsafe_enable_blindingc                 C   s   | j S rs   r`   ru   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.)rv   rx   rC   r   r3   rd   )rk   ry   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 rs   )rd   r   ZRSAPublicKey_dupr_   r;   r9   r:   r<   ZRSA_freeZ_rsa_cdata_to_evp_pkeyr%   )rk   ctxrm   r!   r!   r"   rZ     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 )Nrb   r   erp   )rn   ro   ddmp1dmq1iqmppublic_numbers)rd   r9   rD   r   ri   r_   r;   r:   rc   ZRSA_get0_crt_paramsr   
_bn_to_intr   )	rk   rp   r   r   rn   ro   r   r   r   r!   r!   r"   private_numbers  sH       z_RSAPrivateKey.private_numbers)encodingr/   encryption_algorithmr   c                 C   s   | j |||| | j| jS rs   )rd   Z_private_key_bytesr8   r_   )rk   r   r/   r   r!   r!   r"   private_bytes  s    z_RSAPrivateKey.private_bytes)r&   r'   rM   r   c                 C   s(   |    t||\}}t| j||| |S rs   )rv   r   rY   rd   )rk   r&   r'   rM   r!   r!   r"   sign  s    z_RSAPrivateKey.sign)__name__
__module____qualname__object__annotations__intboolrq   rv   rt   propertyrx   bytesr	   r|   r   rZ   r   r   r   EncodingZPrivateFormatZKeySerializationEncryptionr   typingUnion
asym_utils	Prehashedr   rO   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_   r`   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 )Nrb   r   )rd   r_   r8   r9   rD   r   ri   r:   r;   rj   r`   )rk   r   rl   rm   rp   r!   r!   r"   rq     s    z_RSAPublicKey.__init__rr   c                 C   s   | j S rs   rw   ru   r!   r!   r"   rx     s    z_RSAPublicKey.key_size)	plaintextr'   r   c                 C   s   t | j| ||S rs   )r3   rd   )rk   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 )Nrb   r   r~   )
rd   r9   rD   r   ri   r_   r:   r;   r   r   )rk   rp   r   r!   r!   r"   r     s       z_RSAPublicKey.public_numbers)r   r/   r   c                 C   s   | j ||| | j| jS rs   )rd   Z_public_key_bytesr8   r_   )rk   r   r/   r!   r!   r"   public_bytes(  s        z_RSAPublicKey.public_bytesN)r[   r&   r'   rM   r   c                 C   s&   t ||\}}t| j||| || d S rs   )r   r\   rd   )rk   r[   r&   r'   rM   r!   r!   r"   verify1  s         z_RSAPublicKey.verify)r[   r'   rM   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^   rd   )rk   r[   r'   rM   r!   r!   r"   recover_data_from_signature=  s        z)_RSAPublicKey.recover_data_from_signature)r   r   r   r   r   r   rq   r   rx   r   r	   r   r   r   r   r   ZPublicFormatr   r   r   r   r   r   rO   r   Optionalr   r!   r!   r!   r"   r%      s.   

)1rf   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   rO   r   r#   r   r3   r1   r   rP   CallableAnyrU   rY   r\   r^   r$   r%   r!   r!   r!   r"   <module>   s   ,%D
1
6!
$ 