U
    EZhLT                     @   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)	MGF1OAEPPSSAsymmetricPaddingPKCS1v15_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!   o/home/aprabhat/apps/x.techxrdev.in/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
|j d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name_enc_dec_rsa_pkey_ctx)r   r   r&   r'   padding_enumr!   r!   r"   _enc_dec_rsa>   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_mallocZ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   b   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|j d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'   rM   Z	pkey_sizer1   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 )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.)rP   r   r6   r7   r8   r9   r:   r;   r<   _consume_errorsr   r?   ZEVP_PKEY_CTX_set_signature_mdr   formatr/   r   ZUNSUPPORTED_HASHr=   r.   r   r   r   rO   AssertionErrorZ EVP_PKEY_CTX_set_rsa_pss_saltlenr#   r,   r@   rA   )r   r'   rM   r   rQ   r1   rG   rH   errorsZevp_mdrJ   r!   r!   r"   _rsa_sig_setup   sR    

rV   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 )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   rC   ZEVP_PKEY_signr9   rB   r:   rR   r   rD   )
r   r'   rM   rW   r&   rG   buflenrH   rK   rU   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   )rV   r   ZEVP_PKEY_verify_initZEVP_PKEY_verifyrB   r:   rR   r   )r   r'   rM   rZ   r[   r&   rG   rH   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   r5   r4   r3   )rV   r   ZEVP_PKEY_verify_recover_initr>   r7   r:   r8   rC   ZEVP_PKEY_verify_recoverrB   rD   rE   r   )r   r'   rM   rZ   r[   rG   maxlenrK   rX   rH   rL   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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   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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_keyrR   r   r8   rC   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   rH   rU   pqZp_oddZq_oddnr!   r!   r"   __init__n  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 )Nr3   T)re   rd   r   ZRSA_blinding_onr_   r8   r9   r:   )rk   rH   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   rB   r   r2   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:   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   rC   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  sH       z_RSAPrivateKey.private_numbers)encodingrS   encryption_algorithmr   c                 C   s   | j |||| | j| jS rs   )rd   Z_private_key_bytesr7   r_   )rk   r   rS   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$   i  s.   
1%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_   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   rC   r   ri   r9   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   )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   rC   r   ri   r_   r9   r:   r   r   )rk   rp   r   r!   r!   r"   r     s       z_RSAPublicKey.public_numbers)r   rS   r   c                 C   s   | j ||| | j| jS rs   )rd   Z_public_key_bytesr7   r_   )rk   r   rS   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"   verify3  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   r2   r0   r   rP   CallableAnyrV   rY   r\   r^   r$   r%   r!   r!   r!   r"   <module>   s   ,%D
1
6!
$ 