U
    *”}fâC  ã                   @   s<  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$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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-x36vw73o/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 k	r¢t|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_mallocÚmemmoveZ EVP_PKEY_CTX_set0_rsa_oaep_labelÚnewÚbufferZERR_clear_errorÚ
ValueError)r)   r   r*   r,   r+   ÚinitZcryptÚpkey_ctxÚresÚbuf_sizeÚmgf1_mdZoaep_mdZlabelptrZoutlenÚbufZresbufr   r   r   r(   N   s\    

ÿÿþý  ÿ

r(   c                 C   s    t |tƒstdƒ‚| j |j¡}|  |dk¡ t |tƒrB| jj}nZt |t	ƒrˆt |j
tƒsdtdtjƒ‚||j d dk r~tdƒ‚| jj}ntd |j¡tjƒ‚|S )Nz'Expected provider of AsymmetricPadding.r   r   é   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$   Údigest_sizerB   ZRSA_PKCS1_PSS_PADDINGr&   r'   r%   )r)   r   r+   Ú	algorithmZ	pkey_sizer,   r   r   r   Ú_rsa_sig_determine_padding‰   s,    



þÿ

þrL   c                 C   s  t | |||ƒ}|  |¡}| j |j| jj¡}|  || jjk¡ | j || jj	¡}||ƒ}	|  |	dk¡ | j 
||¡}	|	dkr˜|  ¡  td |j¡tjƒ‚| j ||¡}	|  |	dk¡ 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.)rL   r;   r!   r2   r3   r4   r5   r6   r7   r8   ZEVP_PKEY_CTX_set_signature_mdÚ_consume_errorsr   r&   r'   r   ZUNSUPPORTED_HASHr9   r   r   Z EVP_PKEY_CTX_set_rsa_pss_saltlenr   r#   r<   r=   )r)   r+   rK   r   r*   Z	init_funcr,   Zevp_mdrD   rE   rG   r   r   r   Ú_rsa_sig_setup«   s<    
ÿü 
ÿÿrN   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)rN   r!   ZEVP_PKEY_sign_initr4   r@   ZEVP_PKEY_signr5   r>   r6   Ú_consume_errors_with_textrB   rA   )
r)   r+   rK   Úprivate_keyr*   rD   ÚbuflenrE   rH   Úerrorsr   r   r   Ú_rsa_sig_signÍ   s4    ú    ÿýrS   c                 C   sX   t | ||||| jjƒ}| j ||t|ƒ|t|ƒ¡}|  |dk¡ |dkrT|  ¡  t‚d S )Nr   )rN   r!   ZEVP_PKEY_verify_initZEVP_PKEY_verifyr>   r6   rM   r   )r)   r+   rK   Ú
public_keyÚ	signaturer*   rD   rE   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 ¡| _d S r   )Ú_backendÚ_private_keyrL   Ú_paddingr<   r   ÚHashÚ	_hash_ctx)Úselfr)   rP   r+   rK   r   r   r   Ú__init__ÿ   s    z_RSASignatureContext.__init__c                 C   s   | j  |¡ d S r   ©r\   Úupdate©r]   r*   r   r   r   r`     s    z_RSASignatureContext.updatec                 C   s   t | j| j| j| j| j ¡ ƒS r   )rS   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   rL   r<   r   r[   r\   )r]   r)   rT   rU   r+   rK   r   r   r   r^     s    z _RSAVerificationContext.__init__c                 C   s   | j  |¡ d S r   r_   ra   r   r   r   r`   (  s    z_RSAVerificationContext.updatec                 C   s"   t | j| j| j| j| j| j ¡ ƒS r   )rV   rX   rZ   r<   rh   ri   r\   rb   rc   r   r   r   Úverify+  s    úz_RSAVerificationContext.verifyN)rd   re   rf   r^   r`   rj   r   r   r   r   rg     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_keyrO   rB   ZRSA_blinding_onr4   r5   r6   rX   Ú
_rsa_cdatar3   r@   ÚRSA_get0_keyÚBN_num_bitsÚ	_key_size)r]   r)   Ú	rsa_cdataÚevp_pkeyrE   rR   Únr   r   r   r^   8  s$    
üz_RSAPrivateKey.__init__rp   c                 C   s   t ƒ  t|ƒ t| j| ||ƒS r   )r   r
   rW   rX   )r]   r+   rK   r   r   r   ÚsignerS  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   ÚdecryptX  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   rT   _  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_numbersf  sH       ÿþù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   rS   )r]   r*   r+   rK   r   r   r   Úsign“  s      ÿz_RSAPrivateKey.signN)rd   re   rf   r^   r   Úread_only_propertyrw   rt   rx   rT   r…   r‡   rˆ   r   r   r   r   rk   6  s   
#
rk   c                   @   sF   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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 )NrU   )r   r   Ú_check_bytesr
   rg   rX   )r]   rU   r+   rK   r   r   r   Úverifier­  s        ÿz_RSAPublicKey.verifierc                 C   s   t | j| ||ƒS r   )r-   rX   )r]   Ú	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   rV   )r]   rU   r*   r+   rK   r   r   r   rj   Ë  s      ÿ     ÿz_RSAPublicKey.verifyN)rd   re   rf   r^   r   r‰   rw   r‹   r   r‚   rŽ   rj   r   r   r   r   r1   š  s   
	r1   N)+Ú
__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(   rL   rN   rS   rV   Zregister_interfaceÚobjectrW   rg   rk   r1   r   r   r   r   Ú<module>   s,    	;""c