o
    
czT                     @   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)	MGF1OAEPPSSAsymmetricPaddingPKCS1v15_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)_salt_length
isinstancer   r   r   digest_sizer   r   
ValueError_libRSA_PSS_SALTLEN_AUTO)r   r   r   r   salt r#   U/opt/certbot/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
   RSA_PKCS1_OAEP_PADDING_mgfr	   r   r   UNSUPPORTED_MGFrsa_padding_supportedUNSUPPORTED_PADDINGformatname_enc_dec_rsa_pkey_ctx)r   r   r(   r)   padding_enumr#   r#   r$   _enc_dec_rsa>   s,   





r7   r6   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    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
   _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bufferERR_clear_errorr   )r   r   r(   r6   r)   initcryptpkey_ctxresbuf_sizemgf1_mdoaep_mdlabelptroutlenbufresbufr#   r#   r$   r5   b   sX   
	


r5   	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    rG   r@   rC   r   r-   r   r/   r	   r   r   r0   r   HashAlgorithmr   r   RSA_PKCS1_PSS_PADDINGr3   r4   r2   )r   r   r)   r_   	pkey_sizer6   r#   r#   r$   _rsa_sig_determine_padding   s2   



rd   )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 )Nr8   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.)rd   r    r?   r@   rA   rB   rC   rD   rE   _consume_errorsr   rH   EVP_PKEY_CTX_set_signature_mdr   r3   r4   r   UNSUPPORTED_HASHrF   r2   r   r   r   ra    EVP_PKEY_CTX_set_rsa_pss_saltlenr%   r/   rI   rJ   )r   r)   r_   r   re   r6   rV   rW   errorsevp_mdrY   r#   r#   r$   _rsa_sig_setup   sR   


rl   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 )Nr9   r8   r:   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)rl   r    EVP_PKEY_sign_initrA   rQ   EVP_PKEY_signrB   rM   rC   _consume_errors_with_textr   rR   )
r   r)   r_   rm   r(   rV   buflenrW   r]   rj   r#   r#   r$   _rsa_sig_sign
  s*   rr   
public_keyr'   	signaturec                 C   sV   t | |||| jj}| j||t||t|}| |dk |dkr)|   td S )Nr   )rl   r    EVP_PKEY_verify_initEVP_PKEY_verifyrM   rC   rf   r   )r   r)   r_   rs   rt   r(   rV   rW   r#   r#   r$   _rsa_sig_verify*  s   rw   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   r:   r9   r8   )rl   r    EVP_PKEY_verify_recover_initrG   r@   rC   rA   rQ   EVP_PKEY_verify_recoverrM   rR   rS   r   )r   r)   r_   rs   rt   rV   maxlenr]   rq   rW   r^   r#   r#   r$   _rsa_sig_recoverE  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&   r@   
_rsa_cdata	_key_sizer   r   unsafe_skip_rsa_key_validationc                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 )Nr8   zInvalid private key	BIGNUM **r   F)r    RSA_check_keyrp   r   rA   rQ   RSA_get0_factorsrC   rB   	BN_is_odd_backendr|   r@   _blinded	threadingLock_blinding_lockRSA_get0_keyBN_num_bitsr}   )selfr   	rsa_cdataevp_pkeyr~   rW   rj   pqp_oddq_oddnr#   r#   r$   __init__n  s:   


z_RSAPrivateKey.__init__r   Nc                 C   s>   | j s| j |   W d    d S 1 sw   Y  d S d S N)r   r   _non_threadsafe_enable_blindingr   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 )Nr8   T)r   r   r    RSA_blinding_onr|   rA   rB   rC   )r   rW   r#   r#   r$   r     s   
z._RSAPrivateKey._non_threadsafe_enable_blindingc                 C      | j S r   r}   r   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.)r   r   rM   r   r7   r   )r   r   r)   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 r   )r   r    RSAPublicKey_dupr|   rC   rA   rB   rD   RSA_free_rsa_cdata_to_evp_pkeyr'   )r   ctxr   r#   r#   r$   rs     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 )Nr   r   er   )r   r   ddmp1dmq1iqmppublic_numbers)r   rA   rQ   r    r   r|   rC   rB   r   RSA_get0_crt_paramsr   
_bn_to_intr   )	r   r   r   r   r   r   r   r   r   r#   r#   r$   private_numbers  sB   
z_RSAPrivateKey.private_numbersencodingr3   encryption_algorithmc                 C   s   | j |||| | j| jS r   )r   _private_key_bytesr@   r|   )r   r   r3   r   r#   r#   r$   private_bytes  s   z_RSAPrivateKey.private_bytesr(   r_   c                 C   s(   |    t||\}}t| j||| |S r   )r   r   rr   r   )r   r(   r)   r_   r#   r#   r$   sign  s   z_RSAPrivateKey.sign)r   N)__name__
__module____qualname__object__annotations__intboolr   r   r   propertyr   bytesr   r   r   rs   r   r   r   EncodingPrivateFormatKeySerializationEncryptionr   typingUnion
asym_utils	Prehashedr   ra   r   r#   r#   r#   r$   r&   i  sD   
 

1
#
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'   r@   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 )Nr   r   )r   r|   r@   rA   rQ   r    r   rB   rC   r   r}   )r   r   r   r   r   r#   r#   r$   r     s   z_RSAPublicKey.__init__r   c                 C   r   r   r   r   r#   r#   r$   r     r   z_RSAPublicKey.key_size	plaintextr)   c                 C   s   t | j| ||S r   )r7   r   )r   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 )Nr   r   r   )
r   rA   rQ   r    r   r|   rB   rC   r   r   )r   r   r   r#   r#   r$   r     s   z_RSAPublicKey.public_numbersr   r3   c                 C   s   | j ||| | j| jS r   )r   _public_key_bytesr@   r|   )r   r   r3   r#   r#   r$   public_bytes*  s   z_RSAPublicKey.public_bytesrt   r(   r_   Nc                 C   s&   t ||\}}t| j||| || d S r   )r   rw   r   )r   rt   r(   r)   r_   r#   r#   r$   verify3  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{   r   )r   rt   r)   r_   r#   r#   r$   recover_data_from_signature?  s   z)_RSAPublicKey.recover_data_from_signature)r   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   PublicFormatr   r   r   r   r   r   ra   r   Optionalr   r#   r#   r#   r$   r'     sH   
 

	

)1r   r   cryptography.exceptionsr   r   r   *cryptography.hazmat.backends.openssl.utilsr   cryptography.hazmat.primitivesr   r   )cryptography.hazmat.primitives.asymmetricr   r   1cryptography.hazmat.primitives.asymmetric.paddingr	   r
   r   r   r   r   r   r   r   -cryptography.hazmat.primitives.asymmetric.rsar   r   r   r   TYPE_CHECKING,cryptography.hazmat.backends.openssl.backendr   r   ra   r   r%   r   r7   r5   r   rd   CallableAnyrl   rr   rw   r{   r&   r'   r#   r#   r#   r$   <module>   s   ,

$
C

0

5
 


$ 