U
    [eQ                     @   sZ  d dl Z d dlmZ d dlmZmZmZ d dlmZm	Z	m
Z
 d dlmZmZ d dlmZmZmZ d dlmZmZmZmZmZmZ d dlmZmZmZmZ ee jeef eje d	d
dZ!e jd e"ee"dddZ#e jd e"e ee"dddZ$dd Z%dd Z&dd Z'dd Z(dd Z)G dd deZ*G dd  d eZ+G d!d" d"eZ,G d#d$ d$eZ-dS )%    N)utils)InvalidSignatureUnsupportedAlgorithm_Reasons)_calculate_digest_and_algorithm_check_not_prehashed_warn_sign_verify_deprecated)hashesserialization)AsymmetricSignatureContextAsymmetricVerificationContextr   )AsymmetricPaddingMGF1OAEPPKCS1v15PSScalculate_max_pss_salt_length)RSAPrivateKeyRSAPrivateNumbersRSAPublicKeyRSAPublicNumbers)psskeyhash_algorithmreturnc                 C   s,   | j }|tjks|tjkr$t||S |S d S N)Z_salt_lengthr   Z
MAX_LENGTHr   r   )r   r   r   salt r   j/var/www/html/services/stratfitenv/lib/python3.8/site-packages/cryptography/hazmat/backends/openssl/rsa.py_get_rsa_pss_salt_length)   s    
r   )_RSAPrivateKey_RSAPublicKey)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.)
isinstancer   	TypeErrorr   _lib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)backendr   r"   r#   padding_enumr   r   r   _enc_dec_rsa6   s*    





r2   )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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rt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   ZCryptography_HAS_RSA_OAEP_MD_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_error
ValueError)r0   r   r"   r1   r#   initZcryptpkey_ctxresZbuf_sizemgf1_mdZoaep_mdZlabelptrZoutlenbufresbufr   r   r   r/   Z   s\    

  

r/   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	   HashAlgorithmdigest_sizerF   ZRSA_PKCS1_PSS_PADDINGr-   r.   r,   )r0   r   r#   	algorithmZ	pkey_sizer1   r   r   r   _rsa_sig_determine_padding   s0    





rQ   c           
      C   s0  t | |||}| j|j| jj}| || jjk | j|| jj}||}| |dk |d k	r| 	|}| j
||}|dkr|   td|jtj| j||}|dkr|   td|jtjt|tr,| j|t|||}| |dk | 	|jj}	| j||	}| |dk |S )Nr3   r   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<   r?   ZEVP_PKEY_CTX_set_signature_md_consume_errorsr   r-   r.   r   ZUNSUPPORTED_HASHr=   r,   r&   r   Z EVP_PKEY_CTX_set_rsa_pss_saltlenr   r*   r@   rA   )
r0   r#   rP   r   Z	init_funcr1   rH   rI   Zevp_mdrJ   r   r   r   _rsa_sig_setup   sL    
 
rS   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)rS   r(   ZEVP_PKEY_sign_initr8   rC   ZEVP_PKEY_signr9   rB   r:   _consume_errors_with_textrF   rD   )
r0   r#   rP   private_keyr"   rH   buflenrI   rK   errorsr   r   r   _rsa_sig_sign   s2        rX   c                 C   sV   t | |||| jj}| j||t||t|}| |dk |dkrR|   td S )Nr   )rS   r(   ZEVP_PKEY_verify_initZEVP_PKEY_verifyrB   r:   rR   r   )r0   r#   rP   
public_key	signaturer"   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rt|
S )Nr   r5   r4   r3   )rS   r(   ZEVP_PKEY_verify_recover_initr>   r7   r:   r8   rC   ZEVP_PKEY_verify_recoverrB   rD   rE   r   )r0   r#   rP   rY   rZ   rH   maxlenrK   rV   rI   rL   r   r   r   _rsa_sig_recover  s.        
r]   c                   @   s>   e Zd ZeeejdddZeddddZ	edd	d
Z
dS )_RSASignatureContext)rU   r#   rP   c                 C   s<   || _ || _t|||| || _|| _t| j| j | _d S r   )_backend_private_keyrQ   _paddingr@   r	   Hash	_hash_ctx)selfr0   rU   r#   rP   r   r   r   __init__=  s    z_RSASignatureContext.__init__Nr"   r   c                 C   s   | j | d S r   rc   updaterd   r"   r   r   r   rh   O  s    z_RSASignatureContext.updater   c                 C   s   t | j| j| j| j| j S r   )rX   r_   ra   r@   r`   rc   finalizerd   r   r   r   rk   R  s    z_RSASignatureContext.finalize)__name__
__module____qualname__r   r   r	   rN   re   bytesrh   rk   r   r   r   r   r^   <  s   r^   c                   @   s@   e Zd ZeeeejdddZeddddZ	ddd	d
Z
dS )_RSAVerificationContext)rY   rZ   r#   rP   c                 C   sF   || _ || _|| _|| _t|||| |}|| _t| j| j | _d S r   )	r_   _public_key
_signaturera   rQ   r@   r	   rb   rc   )rd   r0   rY   rZ   r#   rP   r   r   r   re   ]  s    z _RSAVerificationContext.__init__Nrf   c                 C   s   | j | d S r   rg   ri   r   r   r   rh   r  s    z_RSAVerificationContext.updaterj   c                 C   s"   t | j| j| j| j| j| j S r   )r[   r_   ra   r@   rr   rs   rc   rk   rl   r   r   r   verifyu  s    z_RSAVerificationContext.verify)rm   rn   ro   r   rp   r   r	   rN   re   rh   rt   r   r   r   r   rq   \  s   rq   c                   @   s   e Zd Zdd ZedZeej	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    c                 C   s   |j |}|dkr&| }td||j ||jj}||dk || _|| _	|| _
| 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   )r(   ZRSA_check_keyrT   rF   ZRSA_blinding_onr8   r9   r:   r_   
_rsa_cdatar7   rC   RSA_get0_keyBN_num_bits	_key_size)rd   r0   	rsa_cdataevp_pkeyrI   rW   nr   r   r   re     s$    
z_RSAPrivateKey.__init__ry   )r#   rP   r   c                 C   s   t   t| t| j| ||S r   )r   r   r^   r_   )rd   r#   rP   r   r   r   signer  s    z_RSAPrivateKey.signer)
ciphertextr#   r   c                 C   s2   | j d d }|t|kr"tdt| j| ||S )N      z,Ciphertext length must be equal to key size.)key_sizerB   rF   r2   r_   )rd   r~   r#   Zkey_size_bytesr   r   r   decrypt  s    z_RSAPrivateKey.decryptrj   c                 C   sV   | j j| j}| j || j jjk | j j|| j jj}| j 	|}t
| j ||S r   )r_   r(   ZRSAPublicKey_duprv   r:   r8   r9   r;   ZRSA_freeZ_rsa_cdata_to_evp_pkeyr!   )rd   ctxr{   r   r   r   rY     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 )Nru   r   er|   )pqddmp1dmq1iqmppublic_numbers)r_   r8   rC   r(   rw   rv   r:   r9   ZRSA_get0_factorsZRSA_get0_crt_paramsr   
_bn_to_intr   )	rd   r|   r   r   r   r   r   r   r   r   r   r   private_numbers  sH       z_RSAPrivateKey.private_numbers)encodingr-   encryption_algorithmr   c                 C   s   | j |||| | j| jS r   )r_   Z_private_key_bytesr7   rv   )rd   r   r-   r   r   r   r   private_bytes  s    z_RSAPrivateKey.private_bytes)r"   r#   rP   r   c                 C   s$   t | j||\}}t| j||| |S r   )r   r_   rX   )rd   r"   r#   rP   r   r   r   sign  s      z_RSAPrivateKey.signN)rm   rn   ro   re   r   read_only_propertyr   r   r	   rN   r   r}   rp   r   r   rY   r   r   r
   EncodingZPrivateFormatZKeySerializationEncryptionr   typingUnion
asym_utils	Prehashedr   r   r   r   r   r      s&   
 %r    c                   @   s   e Zd Zdd ZedZeee	j
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!   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 )Nru   r   )r_   rv   r7   r8   rC   r(   rw   r9   r:   rx   ry   )rd   r0   rz   r{   r|   r   r   r   re     s    z_RSAPublicKey.__init__ry   )rZ   r#   rP   r   c                 C   s,   t   td| t| t| j| |||S )NrZ   )r   r   _check_bytesr   rq   r_   rd   rZ   r#   rP   r   r   r   verifier  s        z_RSAPublicKey.verifier)	plaintextr#   r   c                 C   s   t | j| ||S r   )r2   r_   )rd   r   r#   r   r   r   encrypt  s    z_RSAPublicKey.encryptrj   c                 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 )Nru   r   r   )
r_   r8   rC   r(   rw   rv   r9   r:   r   r   )rd   r|   r   r   r   r   r     s       z_RSAPublicKey.public_numbers)r   r-   r   c                 C   s   | j ||| | j| jS r   )r_   Z_public_key_bytesr7   rv   )rd   r   r-   r   r   r   public_bytes  s        z_RSAPublicKey.public_bytesN)rZ   r"   r#   rP   r   c                 C   s&   t | j||\}}t| j||| ||S r   )r   r_   r[   )rd   rZ   r"   r#   rP   r   r   r   rt   (  s           z_RSAPublicKey.verifyc                 C   s   t | t| j||| |S r   )r   r]   r_   r   r   r   r   recover_data_from_signature6  s        z)_RSAPublicKey.recover_data_from_signature)rm   rn   ro   re   r   r   r   rp   r   r	   rN   r   r   r   r   r   r
   r   ZPublicFormatr   r   r   r   r   rt   Optionalr   r   r   r   r   r!     s0   

r!   ).r   Zcryptographyr   Zcryptography.exceptionsr   r   r   Z*cryptography.hazmat.backends.openssl.utilsr   r   r   Zcryptography.hazmat.primitivesr	   r
   Z)cryptography.hazmat.primitives.asymmetricr   r   r   Z1cryptography.hazmat.primitives.asymmetric.paddingr   r   r   r   r   r   Z-cryptography.hazmat.primitives.asymmetric.rsar   r   r   r   r   rN   intr   rp   r2   r/   rQ   rS   rX   r[   r]   r^   rq   r    r!   r   r   r   r   <module>   s@    	&A+* $o