a
     `yL                     @   sD  d dl mZmZm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 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 d	d
 Zdd Zdd Z dd Z!dd Z"dd Z#dd Z$dd Z%e&eG dd de'Z(e&eG dd de'Z)e&eG dd de'Z*e&eG dd  d e'Z+d!S )"    )absolute_importdivisionprint_function)utils)InvalidSignatureUnsupportedAlgorithm_Reasons)_calculate_digest_and_algorithm_check_not_prehashed_warn_sign_verify_deprecated)hashes)AsymmetricSignatureContextAsymmetricVerificationContextrsa)AsymmetricPaddingMGF1OAEPPKCS1v15PSScalculate_max_pss_salt_length)RSAPrivateKeyWithSerializationRSAPublicKeyWithSerializationc                 C   s,   | j }|tju s|tju r$t||S |S d S N)Z_salt_lengthr   Z
MAX_LENGTHr   r   )ZpsskeyZhash_algorithmZsalt r   J/usr/lib/python3/dist-packages/cryptography/hazmat/backends/openssl/rsa.py_get_rsa_pss_salt_length&   s    
r   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   datapaddingpadding_enumr   r   r   _enc_dec_rsa/   s*    





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 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rtd|S )N   r   size_t *unsigned char[]zEncryption/decryption failed.) r   _RSAPublicKeyr!   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)r)   r   r*   r,   r+   ZinitZcryptpkey_ctxresZbuf_sizemgf1_mdZoaep_mdZlabelptrZoutlenbufresbufr   r   r   r(   N   sX    



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:   r3   r6   r   r"   r   r#   r   r   r   r$   r   ZHashAlgorithmZdigest_sizerB   ZRSA_PKCS1_PSS_PADDINGr&   r'   r%   )r)   r   r+   	algorithmZ	pkey_sizer,   r   r   r   _rsa_sig_determine_padding   s0    





rJ   c           
      C   s0  t | |||}| j|j| jj}| || jjk | j|| jj}||}| |dk |d u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 )Nr.   r   z4{} is not supported by this backend for RSA signing.z4{} is not supported for the RSA signature operation.)rJ   r!   r2   r3   r4   r5   r6   r7   r8   r;   ZEVP_PKEY_CTX_set_signature_md_consume_errorsr   r&   r'   r   ZUNSUPPORTED_HASHr9   r%   r   r   Z EVP_PKEY_CTX_set_rsa_pss_saltlenr   r#   r<   r=   )
r)   r+   rI   r   Z	init_funcr,   rC   rD   Zevp_mdrE   r   r   r   _rsa_sig_setup   sJ    
rL   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 )Nr/   r.   r0   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!   ZEVP_PKEY_sign_initr4   r?   ZEVP_PKEY_signr5   r>   r6   _consume_errors_with_textrB   r@   )
r)   r+   rI   private_keyr*   rC   buflenrD   rF   errorsr   r   r   _rsa_sig_sign   s*    rQ   c                 C   sV   t | |||| jj}| j||t||t|}| |dk |dkrR|   td S )Nr   )rL   r!   ZEVP_PKEY_verify_initZEVP_PKEY_verifyr>   r6   rK   r   )r)   r+   rI   
public_key	signaturer*   rC   rD   r   r   r   _rsa_sig_verify   s    rT   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   r0   r/   r.   )rL   r!   ZEVP_PKEY_verify_recover_initr:   r3   r6   r4   r?   ZEVP_PKEY_verify_recoverr>   r@   rA   r   )r)   r+   rI   rR   rS   rC   maxlenrF   rO   rD   rG   r   r   r   _rsa_sig_recover  s&    
rV   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )_RSASignatureContextc                 C   s<   || _ || _t|||| || _|| _t| j| j | _d S r   )_backend_private_keyrJ   _paddingr<   r   Hash	_hash_ctx)selfr)   rN   r+   rI   r   r   r   __init__,  s    z_RSASignatureContext.__init__c                 C   s   | j | d S r   r\   updater]   r*   r   r   r   r`   8  s    z_RSASignatureContext.updatec                 C   s   t | j| j| j| j| j S r   )rQ   rX   rZ   r<   rY   r\   finalizer]   r   r   r   rb   ;  s    z_RSASignatureContext.finalizeN)__name__
__module____qualname__r^   r`   rb   r   r   r   r   rW   *  s   rW   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )_RSAVerificationContextc                 C   sF   || _ || _|| _|| _t|||| |}|| _t| j| j | _d S r   )	rX   _public_key
_signaturerZ   rJ   r<   r   r[   r\   )r]   r)   rR   rS   r+   rI   r   r   r   r^   G  s    z _RSAVerificationContext.__init__c                 C   s   | j | d S r   r_   ra   r   r   r   r`   U  s    z_RSAVerificationContext.updatec                 C   s"   t | j| j| j| j| j| j S r   )rT   rX   rZ   r<   rh   ri   r\   rb   rc   r   r   r   verifyX  s    z_RSAVerificationContext.verifyN)rd   re   rf   r^   r`   rj   r   r   r   r   rg   E  s   rg   c                   @   sN   e Zd Zdd ZedZdd Zdd Zdd	 Z	d
d Z
dd Zdd ZdS )_RSAPrivateKeyc                 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 )Nr.   zInvalid private key	BIGNUM **r   )r!   ZRSA_check_keyrM   rB   ZRSA_blinding_onr4   r5   r6   rX   
_rsa_cdatar3   r?   RSA_get0_keyBN_num_bits	_key_size)r]   r)   	rsa_cdataevp_pkeyrD   rP   nr   r   r   r^   e  s$    
z_RSAPrivateKey.__init__rp   c                 C   s   t   t| t| j| ||S r   )r   r
   rW   rX   )r]   r+   rI   r   r   r   signer  s    z_RSAPrivateKey.signerc                 C   s2   | j d d }|t|kr"tdt| j| ||S )N      z,Ciphertext length must be equal to key size.)key_sizer>   rB   r-   rX   )r]   Z
ciphertextr+   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 r   )rX   r!   ZRSAPublicKey_duprm   r6   r4   r5   r7   ZRSA_freeZ_rsa_cdata_to_evp_pkeyr1   )r]   ctxrr   r   r   r   rR     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| j |d | j |d | j |d | j |d | j |d | j |d t
j| j |d | j |d ddS )Nrl   r   ers   )pqddmp1dmq1iqmppublic_numbers)rX   r4   r?   r!   rn   rm   r6   r5   ZRSA_get0_factorsZRSA_get0_crt_paramsr   ZRSAPrivateNumbers
_bn_to_intRSAPublicNumbers)	r]   rs   r{   r~   r|   r}   r   r   r   r   r   r   private_numbers  sB    
z_RSAPrivateKey.private_numbersc                 C   s   | j |||| | j| jS r   )rX   Z_private_key_bytesr3   rm   )r]   encodingr&   Zencryption_algorithmr   r   r   private_bytes  s    z_RSAPrivateKey.private_bytesc                 C   s$   t | j||\}}t| j||| |S r   )r	   rX   rQ   )r]   r*   r+   rI   r   r   r   sign  s    z_RSAPrivateKey.signN)rd   re   rf   r^   r   read_only_propertyrw   rt   rx   rR   r   r   r   r   r   r   r   rk   c  s   
#
rk   c                   @   sN   e Zd Zdd ZedZdd Zdd Zdd	 Z	d
d Z
dd Zdd ZdS )r1   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 )Nrl   r   )rX   rm   r3   r4   r?   r!   rn   r5   r6   ro   rp   )r]   r)   rq   rr   rs   r   r   r   r^     s    z_RSAPublicKey.__init__rp   c                 C   s,   t   td| t| t| j| |||S )NrS   )r   r   _check_bytesr
   rg   rX   r]   rS   r+   rI   r   r   r   verifier  s    z_RSAPublicKey.verifierc                 C   s   t | j| ||S r   )r-   rX   )r]   Z	plaintextr+   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	| j 
|d | j 
|d dS )Nrl   r   rz   )rX   r4   r?   r!   rn   rm   r5   r6   r   r   r   )r]   rs   r{   r   r   r   r     s    z_RSAPublicKey.public_numbersc                 C   s   | j ||| | j| jS r   )rX   Z_public_key_bytesr3   rm   )r]   r   r&   r   r   r   public_bytes  s    z_RSAPublicKey.public_bytesc                 C   s&   t | j||\}}t| j||| ||S r   )r	   rX   rT   )r]   rS   r*   r+   rI   r   r   r   rj     s    z_RSAPublicKey.verifyc                 C   s   t | t| j||| |S r   )r
   rV   rX   r   r   r   r   recover_data_from_signature   s    z)_RSAPublicKey.recover_data_from_signatureN)rd   re   rf   r^   r   r   rw   r   r   r   r   rj   r   r   r   r   r   r1     s   
	r1   N),Z
__future__r   r   r   Zcryptographyr   Zcryptography.exceptionsr   r   r   Z*cryptography.hazmat.backends.openssl.utilsr	   r
   r   Zcryptography.hazmat.primitivesr   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(   rJ   rL   rQ   rT   rV   Zregister_interfaceobjectrW   rg   rk   r1   r   r   r   r   <module>   s.    	;+*c