3
K^eF                 @   sL  d dl mZmZmZ 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 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j'eG dd de(Z)ej'eG dd de(Z*ej'eG dd de(Z+ej'eG d d! d!e(Z,dS )"    )absolute_importdivisionprint_functionN)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ks|tjkr$t||S |S d S )N)Z_salt_lengthr   Z
MAX_LENGTHr   r   )ZpsskeyZhash_algorithmZsalt r   L/tmp/pip-unpacked-wheel-vvkwn1hz/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| j|s|t
dtjnt
dj|jtjt| ||||S )Nz1Padding must be an instance of AsymmetricPadding.z'Only MGF1 is supported by this backend.zPThis combination of padding and hash algorithm is not supported by this backend.z${} 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|| j	j
k | j	j|| jj}||}| j|dk | jj||}| j|dk | jj|j}	| j|	dk t |to| jjr| j|jj}
| jj||
}| j|dk | j|j}| jj||}| j|dk t |tr|jd k	rt|jdkr| jjt|j}| j|| j	j
k | j	j||jt|j | jj||t|j}| j|dk | j	jd|	}| j	jd|	}|||||t|}|dkrt| | | j	j|d |d  S )N   r   zsize_t *zunsigned char[])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_mallocmemmoveZ EVP_PKEY_CTX_set0_rsa_oaep_labelnew_handle_rsa_enc_dec_errorbuffer)r&   r   r'   r)   r(   initZcryptpkey_ctxresbuf_sizemgf1_mdZoaep_mdZlabelptrZoutlenbufr   r   r   r%   G   sP    






r%   c             C   s   | j  }| j| | j|d j| jjk t|trV| j|d j| jjk t	dnN| jj
| jj| jj| jjg}| jjr|j| jj | j|d j|k t	dd S )Nr   zGData too long for key size. Encrypt less data or use a larger key size.zDecryption failed.)_consume_errorsr1   libr   ERR_LIB_RSAr   r,   reason!RSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE
ValueErrorZRSA_R_BLOCK_TYPE_IS_NOT_01ZRSA_R_BLOCK_TYPE_IS_NOT_02ZRSA_R_OAEP_DECODING_ERRORZ RSA_R_DATA_TOO_LARGE_FOR_MODULUSZ*Cryptography_HAS_RSA_R_PKCS_DECODING_ERRORappendZRSA_R_PKCS_DECODING_ERROR)r&   r   errorsZdecoding_errorsr   r   r   r<      s     


r<   c             C   s   t |tstd| jj|j}| j|dk t |trB| jj}nZt |t	rt |j
tsdtdtj||j d dk r~td| jj}ntdj|jtj|S )Nz'Expected provider of AsymmetricPadding.r   z'Only MGF1 is supported by this backend.   zDDigest too large for key size. Use a larger key or different digest.z${} is not supported by this backend.)r   r   r   r   r5   r.   r1   r   r   r   r    r   r   r   r!   digest_sizerI   ZRSA_PKCS1_PSS_PADDINGr#   r$   r"   )r&   r   r(   	algorithmZ	pkey_sizer)   r   r   r   _rsa_sig_determine_padding   s$    





rO   c             C   s  t | |||}| j|}| jj|j| jj}| j|| jjk | jj|| jj	}||}	| j|	dk | jj
||}	|	dkr| j  tdj|jtj| jj||}	| j|	dk t|tr| jj|t|||}	| j|	dk | j|jj}
| jj||
}	| j|	dk |S )Nr+   r   z4{} is not supported by this backend for RSA signing.)rO   r6   r   r-   r.   r/   r0   r1   r2   r3   ZEVP_PKEY_CTX_set_signature_mdrD   r   r#   r$   r   ZUNSUPPORTED_HASHr4   r   r   Z EVP_PKEY_CTX_set_rsa_pss_saltlenr   r    r7   r8   )r&   r(   rN   r   r'   Z	init_funcr)   Zevp_mdr?   r@   rB   r   r   r   _rsa_sig_setup   s2    

rP   c             C   s   t | ||||| jj}| jjd}| jj|| jj||t|}| j|dk | jjd|d }| jj||||t|}|dkr| j	 }	| j|	d j
| jjk |	d j| jjkrd}
n| j|	d j| jjk d}
t|
| jj|d d  S )Nzsize_t *r+   zunsigned char[]r   z@Salt length too long for key size. Try using MAX_LENGTH instead.z0Digest too large for key size. Use a larger key.)rP   r   ZEVP_PKEY_sign_initr/   r;   ZEVP_PKEY_signr0   r9   r1   rD   rE   rF   rG   rH   Z RSA_R_DIGEST_TOO_BIG_FOR_RSA_KEYrI   r=   )r&   r(   rN   private_keyr'   r?   buflenr@   rC   rK   rG   r   r   r   _rsa_sig_sign   s4    



rS   c             C   sX   t | ||||| jj}| jj||t||t|}| j|dk |dkrT| j  td S )Nr   )rP   r   ZEVP_PKEY_verify_initZEVP_PKEY_verifyr9   r1   rD   r   )r&   r(   rN   
public_key	signaturer'   r?   r@   r   r   r   _rsa_sig_verify  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| j | _d S )N)_backend_private_keyrO   _paddingr7   r   Hash	_hash_ctx)selfr&   rQ   r(   rN   r   r   r   __init__  s    z_RSASignatureContext.__init__c             C   s   | j j| d S )N)r\   update)r]   r'   r   r   r   r_   !  s    z_RSASignatureContext.updatec             C   s   t | j| j| j| j| jj S )N)rS   rX   rZ   r7   rY   r\   finalize)r]   r   r   r   r`   $  s    z_RSASignatureContext.finalizeN)__name__
__module____qualname__r^   r_   r`   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| j | _d S )N)	rX   _public_key
_signaturerZ   rO   r7   r   r[   r\   )r]   r&   rT   rU   r(   rN   r   r   r   r^   0  s    z _RSAVerificationContext.__init__c             C   s   | j j| d S )N)r\   r_   )r]   r'   r   r   r   r_   >  s    z_RSAVerificationContext.updatec             C   s"   t | j| j| j| j| j| jj S )N)rV   rX   rZ   r7   re   rf   r\   r`   )r]   r   r   r   verifyA  s    z_RSAVerificationContext.verifyN)ra   rb   rc   r^   r_   rg   r   r   r   r   rd   .  s   rd   c               @   sN   e Zd Zdd ZejdZdd Zdd Zdd	 Z	d
d Z
dd Zdd ZdS )_RSAPrivateKeyc             C   st   || _ || _|| _| j jjd}| j jj| j|| j jj| j jj | j j|d | j jjk | j jj	|d | _
d S )Nz	BIGNUM **r   )rX   
_rsa_cdatar.   r/   r;   r   RSA_get0_keyr0   r1   BN_num_bits	_key_size)r]   r&   	rsa_cdataevp_pkeynr   r   r   r^   N  s    z_RSAPrivateKey.__init__rl   c             C   s   t   t| t| j| ||S )N)r   r
   rW   rX   )r]   r(   rN   r   r   r   signer]  s    z_RSAPrivateKey.signerc             C   s8   t tj| jd }|t|kr(tdt| j| ||S )Ng       @z,Ciphertext length must be equal to key size.)intmathceilkey_sizer9   rI   r*   rX   )r]   Z
ciphertextr(   Zkey_size_bytesr   r   r   decryptb  s    z_RSAPrivateKey.decryptc             C   s|   | j jj| j}| j j|| j jjk | j jj|| j jj}| j jj	|| j jj}| j j|dk | j j
|}t| j ||S )Nr+   )rX   r   ZRSAPublicKey_dupri   r1   r/   r0   r2   ZRSA_freeZRSA_blinding_onZ_rsa_cdata_to_evp_pkeyr,   )r]   ctxr@   rn   r   r   r   rT   i  s    z_RSAPrivateKey.public_keyc       	      C   s  | j jjd}| j jjd}| j jjd}| j jjd}| j jjd}| j jjd}| j jjd}| j jjd}| j jj| j||| | j j|d | j jjk | j j|d | j jjk | j j|d | j jjk | j jj| j|| | j j|d | j jjk | j j|d | j jjk | j jj	| j||| | j j|d | j jjk | j j|d | j jjk | j j|d | j jjk t
j| j j|d | j j|d | j j|d | j j|d | j j|d | j j|d t
j| j j|d | j j|d ddS )Nz	BIGNUM **r   )ero   )pqddmp1dmq1iqmppublic_numbers)rX   r/   r;   r   rj   ri   r1   r0   ZRSA_get0_factorsZRSA_get0_crt_paramsr   ZRSAPrivateNumbers
_bn_to_intRSAPublicNumbers)	r]   ro   rw   rz   rx   ry   r{   r|   r}   r   r   r   private_numbersr  s<    z_RSAPrivateKey.private_numbersc             C   s   | j j|||| j| jS )N)rX   Z_private_key_bytesr.   ri   )r]   encodingr#   Zencryption_algorithmr   r   r   private_bytes  s    z_RSAPrivateKey.private_bytesc             C   s$   t | j||\}}t| j||| |S )N)r	   rX   rS   )r]   r'   r(   rN   r   r   r   sign  s    z_RSAPrivateKey.signN)ra   rb   rc   r^   r   read_only_propertyrt   rp   ru   rT   r   r   r   r   r   r   r   rh   L  s   
	#	rh   c               @   sF   e Zd Zdd ZejdZdd Zdd Zdd	 Z	d
d Z
dd ZdS )r,   c             C   st   || _ || _|| _| j jjd}| j jj| j|| j jj| j jj | j j|d | j jjk | j jj	|d | _
d S )Nz	BIGNUM **r   )rX   ri   r.   r/   r;   r   rj   r0   r1   rk   rl   )r]   r&   rm   rn   ro   r   r   r   r^     s    z_RSAPublicKey.__init__rl   c             C   s,   t   tjd| t| t| j| |||S )NrU   )r   r   _check_bytesr
   rd   rX   )r]   rU   r(   rN   r   r   r   verifier  s
    z_RSAPublicKey.verifierc             C   s   t | j| ||S )N)r*   rX   )r]   	plaintextr(   r   r   r   encrypt  s    z_RSAPublicKey.encryptc             C   s   | j jjd}| j jjd}| j jj| j||| j jj | j j|d | j jjk | j j|d | j jjk tj	| j j
|d | j j
|d dS )Nz	BIGNUM **r   )rw   ro   )rX   r/   r;   r   rj   ri   r0   r1   r   r   r   )r]   ro   rw   r   r   r   r~     s    z_RSAPublicKey.public_numbersc             C   s   | j j||| | j| jS )N)rX   Z_public_key_bytesr.   ri   )r]   r   r#   r   r   r   public_bytes  s    z_RSAPublicKey.public_bytesc             C   s&   t | j||\}}t| j||| ||S )N)r	   rX   rV   )r]   rU   r'   r(   rN   r   r   r   rg     s    z_RSAPublicKey.verifyN)ra   rb   rc   r^   r   r   rt   r   r   r~   r   rg   r   r   r   r   r,     s   
		r,   )-
__future__r   r   r   rr   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%   r<   rO   rP   rS   rV   Zregister_interfaceobjectrW   rd   rh   r,   r   r   r   r   <module>   s0    	!8 !%X