o
    c: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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   Zsalt r    Lusr/lib/python3.10/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,   





r2   r1   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%   r1   r&   initZcryptpkey_ctxresbuf_sizemgf1_mdZoaep_mdZlabelptrZoutlenbufresbufr    r    r!   r0   e   sT   
	



r0   	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>   r7   r:   r   r*   r   r+   r
   r   r   r,   r   HashAlgorithmr   r   ZRSA_PKCS1_PSS_PADDINGr.   r/   r-   )r   r   r&   rN   Z	pkey_sizer1   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 )Nr3   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   r6   r7   r8   r9   r:   r;   r<   _consume_errorsr   r?   ZEVP_PKEY_CTX_set_signature_mdr   r.   r/   r   ZUNSUPPORTED_HASHr=   r-   r   r   r   rP   Z EVP_PKEY_CTX_set_rsa_pss_saltlenr"   r+   r@   rA   )r   r&   rN   r   rR   r1   rH   rI   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 )Nr4   r3   r5   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_initr8   rD   ZEVP_PKEY_signr9   rB   r:   _consume_errors_with_textr   rE   )
r   r&   rN   rV   r%   rH   buflenrI   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_verifyrB   r:   rS   r   )r   r&   rN   rZ   r[   r%   rH   rI   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   r5   r4   r3   )rU   r   ZEVP_PKEY_verify_recover_initr>   r7   r:   r8   rD   ZEVP_PKEY_verify_recoverrB   rE   rF   r   )r   r&   rN   rZ   r[   rH   maxlenrL   rX   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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#   r7   
_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 )Nr3   zInvalid private key	BIGNUM **r   F)r   ZRSA_check_keyrW   r   r8   rD   RSA_get0_factorsr:   r9   Z	BN_is_odd_backendr_   r7   _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__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 )Nr3   T)re   rd   r   ZRSA_blinding_onr_   r8   r9   r:   )rk   rI   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   rB   r   r2   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:   r8   r9   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   r8   rD   r   ri   r_   r:   r9   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_bytesr7   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$   r7   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_   r7   r8   rD   r   ri   r9   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   )r2   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   r8   rD   r   ri   r_   r9   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_bytesr7   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   r2   r0   r   rQ   CallableAnyrU   rY   r\   r^   r#   r$   r    r    r    r!   <module>   s   ,

$
C

0

5
 


$ 