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   Zsalt r    L/tmp/pip-unpacked-wheel-4layejjw/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*    





r2   )r   r   r%   r1   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_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   s\    	

  

r0   )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>   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   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st| 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   AssertionErrorZ 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    

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 )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)rV   r   ZEVP_PKEY_sign_initr8   rD   ZEVP_PKEY_signr9   rB   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_verifyrB   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rt|
S )Nr   r5   r4   r3   )rV   r   ZEVP_PKEY_verify_recover_initr>   r7   r:   r8   rD   ZEVP_PKEY_verify_recoverrB   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#   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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 )Nr3   zInvalid private key	BIGNUM **r   F)r   ZRSA_check_keyrX   r   r8   rD   RSA_get0_factorsr:   r9   Z	BN_is_odd_backendr`   r7   _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 )Nr3   T)rf   re   r   ZRSA_blinding_onr`   r8   r9   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   rB   r   r2   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:   r8   r9   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   r8   rD   r   rj   r`   r:   r9   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_bytesr7   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$   r7   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`   r7   r8   rD   r   rj   r9   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   )r2   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   r8   rD   r   rj   r`   r9   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_bytesr7   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   r2   r0   r   rQ   CallableAnyrV   rZ   r]   r_   r#   r$   r    r    r    r!   <module>   s   ,%D
1
6!
$ 