U
    ­\àeýC  ã                   @   sD  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%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_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   ú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 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_mallocZmemmoveZ EVP_PKEY_CTX_set0_rsa_oaep_labelÚnewÚbufferZERR_clear_errorÚ
ValueError)r)   r   r*   r,   r+   ZinitZcryptÚpkey_ctxÚresZbuf_sizeÚmgf1_mdZoaep_mdZlabelptrZoutlenÚbufZresbufr   r   r   r(   G   sn    

 ÿ ÿÿþÿÿþý  ÿ

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$   Zdigest_sizerA   ZRSA_PKCS1_PSS_PADDINGr&   r'   r%   )r)   r   r+   Ú	algorithmZ	pkey_sizer,   r   r   r   Ú_rsa_sig_determine_padding‡   s(    



þ

þrH   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.)rH   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+   rG   r   r*   Z	init_funcr,   Zevp_mdrB   rC   rD   r   r   r   Ú_rsa_sig_setup§   s<    
ÿü 
ÿÿrJ   c                 C   sî   t | ||||| jjƒ}| j d¡}| j || jj||t|ƒ¡}|  |dk¡ | j d|d ¡}| j ||||t|ƒ¡}|dkrÚ|  	¡ }	|  |	d j
| jjk¡ |	d j| jjkr¶d}
n|  |	d j| jjk¡ d}
t|
ƒ‚| j |¡d d … S )Nr/   r.   r0   r   z@Salt length too long for key size. Try using MAX_LENGTH instead.z0Digest too large for key size. Use a larger key.)rJ   r!   ZEVP_PKEY_sign_initr4   r?   ZEVP_PKEY_signr5   r>   r6   rI   ÚlibZERR_LIB_RSAÚreasonZ!RSA_R_DATA_TOO_LARGE_FOR_KEY_SIZEZ RSA_R_DIGEST_TOO_BIG_FOR_RSA_KEYrA   r@   )r)   r+   rG   Úprivate_keyr*   rB   ZbuflenrC   rE   ÚerrorsrL   r   r   r   Ú_rsa_sig_signÈ   sR        þû    ÿÿÿÿÿrO   c                 C   sX   t | ||||| jjƒ}| j ||t|ƒ|t|ƒ¡}|  |dk¡ |dkrT|  ¡  t‚d S )Nr   )rJ   r!   ZEVP_PKEY_verify_initZEVP_PKEY_verifyr>   r6   rI   r   )r)   r+   rG   Ú
public_keyÚ	signaturer*   rB   rC   r   r   r   Ú_rsa_sig_verifyí   s&        þ    ÿrR   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_keyrH   Ú_paddingr<   r   ÚHashÚ	_hash_ctx)Úselfr)   rM   r+   rG   r   r   r   Ú__init__   s    z_RSASignatureContext.__init__c                 C   s   | j  |¡ d S r   ©rX   Úupdate©rY   r*   r   r   r   r\     s    z_RSASignatureContext.updatec                 C   s   t | j| j| j| j| j ¡ ƒS r   )rO   rT   rV   r<   rU   rX   Úfinalize©rY   r   r   r   r^     s    ûz_RSASignatureContext.finalizeN)Ú__name__Ú
__module__Ú__qualname__rZ   r\   r^   r   r   r   r   rS   þ   s   rS   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   )	rT   Ú_public_keyÚ
_signaturerV   rH   r<   r   rW   rX   )rY   r)   rP   rQ   r+   rG   r   r   r   rZ     s    z _RSAVerificationContext.__init__c                 C   s   | j  |¡ d S r   r[   r]   r   r   r   r\   )  s    z_RSAVerificationContext.updatec                 C   s"   t | j| j| j| j| j| j ¡ ƒS r   )rR   rT   rV   r<   rd   re   rX   r^   r_   r   r   r   Úverify,  s    úz_RSAVerificationContext.verifyN)r`   ra   rb   rZ   r\   rf   r   r   r   r   rc     s   rc   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   st   || _ || _|| _| j j d¡}| j j | j|| j jj| j jj¡ | j  |d | j jjk¡ | j j 	|d ¡| _
d S ©Nú	BIGNUM **r   ©rT   Ú
_rsa_cdatar3   r4   r?   r!   ÚRSA_get0_keyr5   r6   ZBN_num_bitsÚ	_key_size©rY   r)   Z	rsa_cdataÚevp_pkeyÚnr   r   r   rZ   9  s      þz_RSAPrivateKey.__init__rm   c                 C   s   t ƒ  t|ƒ t| j| ||ƒS r   )r   r
   rS   rT   )rY   r+   rG   r   r   r   ÚsignerH  s    z_RSAPrivateKey.signerc                 C   s8   t t | jd ¡ƒ}|t|ƒkr(tdƒ‚t| j| ||ƒS )Ng       @z,Ciphertext length must be equal to key size.)ÚintÚmathZceilÚkey_sizer>   rA   r-   rT   )rY   Z
ciphertextr+   Zkey_size_bytesr   r   r   ÚdecryptM  s    z_RSAPrivateKey.decryptc                 C   s|   | j j | j¡}| j  || j jjk¡ | j j || j jj¡}| j j 	|| j jj¡}| j  |dk¡ | j  
|¡}t| j ||ƒS )Nr.   )rT   r!   ZRSAPublicKey_duprk   r6   r4   r5   r7   ZRSA_freeZRSA_blinding_onZ_rsa_cdata_to_evp_pkeyr1   )rY   ZctxrC   ro   r   r   r   rP   T  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 )Nri   r   ©Úerp   )ÚpÚqÚdÚdmp1Údmq1ÚiqmpÚpublic_numbers)rT   r4   r?   r!   rl   rk   r6   r5   ZRSA_get0_factorsZRSA_get0_crt_paramsr   ZRSAPrivateNumbersÚ
_bn_to_intÚRSAPublicNumbers)	rY   rp   rw   rz   rx   ry   r{   r|   r}   r   r   r   Úprivate_numbers]  sH       ÿþùz_RSAPrivateKey.private_numbersc                 C   s   | j  |||| j| j¡S r   )rT   Z_private_key_bytesr3   rk   )rY   Úencodingr&   Zencryption_algorithmr   r   r   Úprivate_bytes€  s    ûz_RSAPrivateKey.private_bytesc                 C   s$   t | j||ƒ\}}t| j||| |ƒS r   )r	   rT   rO   )rY   r*   r+   rG   r   r   r   Úsign‰  s      ÿz_RSAPrivateKey.signN)r`   ra   rb   rZ   r   Úread_only_propertyrt   rq   ru   rP   r   rƒ   r„   r   r   r   r   rg   7  s   
	#	rg   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 rh   rj   rn   r   r   r   rZ   ’  s      þz_RSAPublicKey.__init__rm   c                 C   s,   t ƒ  t d|¡ t|ƒ t| j| |||ƒS )NrQ   )r   r   Ú_check_bytesr
   rc   rT   )rY   rQ   r+   rG   r   r   r   Úverifier¡  s        ÿz_RSAPublicKey.verifierc                 C   s   t | j| ||ƒS r   )r-   rT   )rY   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 )Nri   r   rv   )rT   r4   r?   r!   rl   rk   r5   r6   r   r€   r   )rY   rp   rw   r   r   r   r~   ­  s       ÿþz_RSAPublicKey.public_numbersc                 C   s   | j  ||| | j| j¡S r   )rT   Z_public_key_bytesr3   rk   )rY   r‚   r&   r   r   r   Úpublic_bytesº  s    ûz_RSAPublicKey.public_bytesc                 C   s&   t | j||ƒ\}}t| j||| ||ƒS r   )r	   rT   rR   )rY   rQ   r*   r+   rG   r   r   r   rf   Ã  s      ÿ     ÿz_RSAPublicKey.verifyN)r`   ra   rb   rZ   r   r…   rt   r‡   rˆ   r~   r‰   rf   r   r   r   r   r1     s   
		r1   ),Z
__future__r   r   r   rs   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(   rH   rJ   rO   rR   Zregister_interfaceÚobjectrS   rc   rg   r1   r   r   r   r   Ú<module>   s.    	!@ !%X