o
    4WcV                     @   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rQd dlmZ d	d
dedej eef de	j!de"f
ddZ#d	d
dej d de$dede$f
ddZ%d	d
dej d de$de"dede$fddZ&d	d
dej d dedej'e	j! de"f
ddZ(d	d
dedej'e	j! dej d dej)ej*ge"f f
ddZ+d	d
dede	j!d d!de$de$fd"d#Z,d	d
dede	j!d$d%d&e$de$ddfd'd(Z-d	d
dedej'e	j! d$d%d&e$de$f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)Backendbackendr   psskeyhash_algorithmreturnc                 C   sR   |j }t|trt||S t|tr|jS t|tr't|tr#td| j	j
S |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!   JD:\Flask\env\Lib\site-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.)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   r2   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 u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_malloc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   sX   
	


r1   	algorithmc                 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   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   s2   



rQ   )r%   r$   	init_funcc                 C   sL  t | |||}| j|j| jj}| || jjk | j|| jj}||}|dkr4| 	 }t
d||d urV| |}	| j||	}|dkrV| 	  td|jtj| j||}|dkro| 	  td|jtjt|trt|tjs|J | 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   Z EVP_PKEY_CTX_set_rsa_pss_saltlenr#   r,   rA   rB   )r   r'   rN   r   rR   r2   rI   rJ   errorsZevp_mdrK   r!   r!   r"   _rsa_sig_setup   sR   


rU   private_keyr$   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 )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   rE   ZEVP_PKEY_signr:   rC   r;   _consume_errors_with_textr   rF   )
r   r'   rN   rV   r&   rI   buflenrJ   rL   rT   r!   r!   r"   _rsa_sig_sign  s*   rY   
public_keyr%   	signaturec                 C   sV   t | |||| jj}| j||t||t|}| |dk |dkr)|   td S )Nr   )rU   r   ZEVP_PKEY_verify_initZEVP_PKEY_verifyrC   r;   rS   r   )r   r'   rN   rZ   r[   r&   rI   rJ   r!   r!   r"   _rsa_sig_verify-  s   r\   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   r6   r5   r4   )rU   r   ZEVP_PKEY_verify_recover_initr?   r8   r;   r9   rE   ZEVP_PKEY_verify_recoverrC   rF   rG   r   )r   r'   rN   rZ   r[   rI   maxlenrL   rX   rJ   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ddefddZd"ddZd"ddZ	e
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$   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sW|
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   rE   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   rJ   rT   pqZp_oddZq_oddnr!   r!   r"   __init__q  s:   	


z_RSAPrivateKey.__init__r   Nc                 C   s>   | j s| j |   W d    d S 1 sw   Y  d S d S N)re   rh   _non_threadsafe_enable_blindingrk   r!   r!   r"   _enable_blinding  s
   
"z_RSAPrivateKey._enable_blindingc                 C   s<   | j s| jj| j| jjj}| j|dk d| _ d S d S )Nr4   T)re   rd   r   ZRSA_blinding_onr_   r9   r:   r;   )rk   rJ   r!   r!   r"   rs     s   
z._RSAPrivateKey._non_threadsafe_enable_blindingc                 C      | j S rr   r`   rt   r!   r!   r"   key_size     z_RSAPrivateKey.key_size
ciphertextr'   c                 C   s:   |    | jd d }|t|krtdt| j| ||S )N      z,Ciphertext length must be equal to key size.)ru   rx   rC   r   r3   rd   )rk   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 rr   )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   rE   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  sB   
z_RSAPrivateKey.private_numbersencodingr/   encryption_algorithmc                 C   s   | j |||| | j| jS rr   )rd   Z_private_key_bytesr8   r_   )rk   r   r/   r   r!   r!   r"   private_bytes  s   z_RSAPrivateKey.private_bytesr&   rN   c                 C   s(   |    t||\}}t| j||| |S rr   )ru   r   rY   rd   )rk   r&   r'   rN   r!   r!   r"   sign  s   z_RSAPrivateKey.sign)r   N)__name__
__module____qualname__object__annotations__intboolrq   ru   rs   propertyrx   bytesr	   r}   r   rZ   r   r   r   EncodingZPrivateFormatZKeySerializationEncryptionr   typingUnion
asym_utils	Prehashedr   rP   r   r!   r!   r!   r"   r$   l  sD   
 

,
#
c                
   @   s   e Zd ZU eed< eed< eed< dddZe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%   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   rE   r   ri   r:   r;   rj   r`   )rk   r   rl   rm   rp   r!   r!   r"   rq     s   z_RSAPublicKey.__init__r   c                 C   rv   rr   rw   rt   r!   r!   r"   rx     ry   z_RSAPublicKey.key_size	plaintextr'   c                 C   s   t | j| ||S rr   )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   rE   r   ri   r_   r:   r;   r   r   )rk   rp   r   r!   r!   r"   r     s   z_RSAPublicKey.public_numbersr   r/   c                 C   s   | j ||| | j| jS rr   )rd   Z_public_key_bytesr8   r_   )rk   r   r/   r!   r!   r"   public_bytes(  s   z_RSAPublicKey.public_bytesr[   r&   rN   Nc                 C   s&   t ||\}}t| j||| || d S rr   )r   r\   rd   )rk   r[   r&   r'   rN   r!   r!   r"   verify1  s   z_RSAPublicKey.verifyc                 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'   rN   r!   r!   r"   recover_data_from_signature=  s   z)_RSAPublicKey.recover_data_from_signature)r   r   )r   r   r   r   r   r   rq   r   rx   r   r	   r   r   r   r   r   ZPublicFormatr   r   r   r   r   r   rP   r   Optionalr   r!   r!   r!   r"   r%      sH   
 

	

)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   rP   r   r#   r   r3   r1   r   rQ   CallableAnyrU   rY   r\   r^   r$   r%   r!   r!   r!   r"   <module>   s   ,

$
C

0

5
 


$ 