3
ãdeLT  ã               @   sÎ  d dl Z d dlZd dlmZmZmZ d dlmZ d dlm	Z	m
Z
 d dlmZ d dlmZmZmZmZmZmZmZmZmZ d dlmZmZmZmZ ejr¢d dlmZ d	eej eef e	j!e"d
œdd„Z#d	ej d& e$ee$dœdd„Z%d	ej d' e$e"ee$dœdd„Z&d	ej d( eej'e	j! e"dœdd„Z(d	eej'e	j! ej d) ej)ej*ge"f dœdd„Z+d	ee	j!de$e$dœdd„Z,d	ee	j!de$e$ddœdd „Z-d	eej'e	j! de$e$d!œd"d#„Z.G d$d„ deƒZ/G d%d„ deƒZ0dS )*é    N)ÚInvalidSignatureÚUnsupportedAlgorithmÚ_Reasons)Ú_calculate_digest_and_algorithm)ÚhashesÚserialization)Úutils)	ÚMGF1ÚOAEPÚPSSÚAsymmetricPaddingÚPKCS1v15Ú_AutoÚ_DigestLengthÚ
_MaxLengthÚcalculate_max_pss_salt_length)ÚRSAPrivateKeyÚRSAPrivateNumbersÚRSAPublicKeyÚRSAPublicNumbers)ÚBackendr   )ÚbackendÚpssÚkeyÚhash_algorithmÚreturnc             C   sV   |j }t|tƒrt||ƒS t|tƒr*|jS t|tƒrNt|tƒrFtdƒ‚| j	j
S |S d S )Nz6PSS salt length can only be set to AUTO when verifying)Z_salt_lengthÚ
isinstancer   r   r   Údigest_sizer   r   Ú
ValueErrorÚ_libZRSA_PSS_SALTLEN_AUTO)r   r   r   r   Zsalt© r    ú_/var/www/agendate/envp3/lib/python3.6/site-packages/cryptography/hazmat/backends/openssl/rsa.pyÚ_get_rsa_pss_salt_length(   s    




r"   Ú_RSAPrivateKeyÚ_RSAPublicKey)r   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ƒ‚| j|ƒs|t
dtjƒ‚nt
|j› d�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.)r   r   Ú	TypeErrorr   r   ÚRSA_PKCS1_PADDINGr
   ZRSA_PKCS1_OAEP_PADDINGÚ_mgfr	   r   r   ÚUNSUPPORTED_MGFZrsa_padding_supportedÚUNSUPPORTED_PADDINGÚnameÚ_enc_dec_rsa_pkey_ctx)r   r   r%   r&   Úpadding_enumr    r    r!   Ú_enc_dec_rsa>   s$    






r/   )r   r   r%   r.   r&   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ƒ�r| j|jjƒ}
| jj||
ƒ}| j|dkƒ | j|jƒ}| jj||ƒ}| j|dkƒ t |tƒ�r˜|jd k	�r˜t|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|ƒƒ}| j	j|ƒd |d … }| jjƒ  |dk�rütdƒ‚|S )Né   r   zsize_t *z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
   Ú_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ÚbufferÚERR_clear_errorr   )r   r   r%   r.   r&   ÚinitÚcryptÚpkey_ctxÚresZbuf_sizeÚmgf1_mdZoaep_mdZlabelptrZoutlenÚbufÚresbufr    r    r!   r-   b   sN    	




r-   )r   r   r&   Ú	algorithmr   c             C   s´   t |tƒstdƒ‚| jj|jƒ}| j|dkƒ t |tƒrB| jj}nnt |t	ƒrœt |j
tƒsdtdtjƒ‚t |tjƒsxtdƒ‚||j d dk r’tdƒ‚| jj}nt|j› d�tjƒ‚|S )Nz'Expected provider of AsymmetricPadding.r   z'Only MGF1 is supported by this backend.z*Expected instance of hashes.HashAlgorithm.é   zDDigest too large for key size. Use a larger key or different digest.z" is not supported by this backend.)r   r   r'   r   r9   r2   r5   r   r(   r   r)   r	   r   r   r*   r   ÚHashAlgorithmr   r   ZRSA_PKCS1_PSS_PADDINGr,   r+   )r   r   r&   rI   Z	pkey_sizer.   r    r    r!   Ú_rsa_sig_determine_padding¥   s*    





rL   )r   r&   rI   r   Ú	init_funcc             C   sN  t | |||ƒ}| jj|j| jjƒ}| j|| jjkƒ | jj|| jjƒ}||ƒ}|dkrh| j	ƒ }t
d|ƒ‚|d k	r¬| j|ƒ}	| jj||	ƒ}|dkr¬| j	ƒ  tdj|jƒtjƒ‚| jj||ƒ}|dkrÞ| j	ƒ  tdj|jƒtjƒ‚t|tƒ�rJt|tjƒsút‚| jj|t| |||ƒƒ}| j|dkƒ | j|jjƒ}
| jj||
ƒ}| j|dkƒ |S )Nr0   z#Unable to sign/verify with this keyr   z4{} is not supported by this backend for RSA signing.z4{} is not supported for the RSA signature operation.)rL   r   r1   r2   r3   r4   r5   r6   r7   Ú_consume_errorsr   r:   ZEVP_PKEY_CTX_set_signature_mdr   Úformatr,   r   ZUNSUPPORTED_HASHr8   r+   r   r   r   rK   ÚAssertionErrorZ EVP_PKEY_CTX_set_rsa_pss_saltlenr"   r)   r;   r<   )r   r&   rI   r   rM   r.   rD   rE   ÚerrorsZevp_mdrF   r    r    r!   Ú_rsa_sig_setupÕ   sF    


rR   )r   r&   rI   Úprivate_keyr%   r   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	ƒ }	t
d|	ƒ‚| jj|ƒd d … S )Nzsize_t *r0   zunsigned char[]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)rR   r   ZEVP_PKEY_sign_initr3   r?   ZEVP_PKEY_signr4   r=   r5   rN   r   r@   )
r   r&   rI   rS   r%   rD   ÚbuflenrE   rG   rQ   r    r    r!   Ú_rsa_sig_sign
  s$    
rU   )r   r&   rI   Ú
public_keyÚ	signaturer%   r   c             C   sV   t | |||| jjƒ}| jj||t|ƒ|t|ƒƒ}| j|dkƒ |dkrR| jƒ  t‚d S )Nr   )rR   r   ZEVP_PKEY_verify_initZEVP_PKEY_verifyr=   r5   rN   r   )r   r&   rI   rV   rW   r%   rD   rE   r    r    r!   Ú_rsa_sig_verify*  s    
rX   )r   r&   rI   rV   rW   r   c             C   s–   t | |||| jjƒ}| jj|jƒ}| j|dkƒ | jjd|ƒ}| jjd|ƒ}| jj||||t	|ƒƒ}	| jj
|ƒd |d … }
| jjƒ  |	dkr’t‚|
S )Nr   zunsigned char[]zsize_t *r0   )rR   r   ZEVP_PKEY_verify_recover_initr9   r2   r5   r3   r?   ZEVP_PKEY_verify_recoverr=   r@   rA   r   )r   r&   rI   rV   rW   rD   ÚmaxlenrG   rT   rE   rH   r    r    r!   Ú_rsa_sig_recoverE  s"    

rZ   c               @   sÂ   e Zd ZU eeededœdd„Z	ddœdd„Z
ddœd	d
„Ze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#   r   )r   Úunsafe_skip_rsa_key_validationc            C   sD  |sÀ|j j|ƒ}|dkr*|jƒ }td|ƒ‚|jjdƒ}|jjdƒ}|j j|||ƒ |j|d |jjkƒ |j|d |jjkƒ |j j	|d ƒ}	|j j	|d ƒ}
|	dks®|
dkrÀ|jƒ }td|ƒ‚|| _
|| _|| _d| _tjƒ | _| 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 )Nr0   zInvalid private keyz	BIGNUM **r   F)r   ZRSA_check_keyrN   r   r3   r?   ÚRSA_get0_factorsr5   r4   Z	BN_is_oddÚ_backendÚ
_rsa_cdatar2   Ú_blindedÚ	threadingÚLockÚ_blinding_lockÚRSA_get0_keyÚBN_num_bitsÚ	_key_size)Úselfr   Ú	rsa_cdataÚevp_pkeyr[   rE   rQ   ÚpÚqZp_oddZq_oddÚnr    r    r!   Ú__init__n  s8    


z_RSAPrivateKey.__init__N)r   c          	   C   s$   | j s | j� | jƒ  W d Q R X d S )N)r_   rb   Ú_non_threadsafe_enable_blinding)rf   r    r    r!   Ú_enable_blindingŸ  s    z_RSAPrivateKey._enable_blindingc             C   s8   | j s4| jjj| j| jjjƒ}| jj|dkƒ d| _ d S )Nr0   T)r_   r]   r   ZRSA_blinding_onr^   r3   r4   r5   )rf   rE   r    r    r!   rm   ¦  s
    z._RSAPrivateKey._non_threadsafe_enable_blindingc             C   s   | j S )N)re   )rf   r    r    r!   Úkey_size²  s    z_RSAPrivateKey.key_size)Ú
ciphertextr&   r   c             C   s:   | j ƒ  | jd d }|t|ƒkr*tdƒ‚t| j| ||ƒS )Né   é   z,Ciphertext length must be equal to key size.)rn   ro   r=   r   r/   r]   )rf   rp   r&   Zkey_size_bytesr    r    r!   Údecrypt¶  s
    z_RSAPrivateKey.decryptc             C   sV   | j jj| jƒ}| j j|| j jjkƒ | j jj|| j jjƒ}| j j	|ƒ}t
| j ||ƒS )N)r]   r   ZRSAPublicKey_dupr^   r5   r3   r4   r6   ZRSA_freeZ_rsa_cdata_to_evp_pkeyr$   )rf   Úctxrh   r    r    r!   rV   ¾  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|d ƒ| j j|d ƒ| j j|d ƒ| j j|d ƒ| j j|d ƒ| j j|d ƒt| j j|d ƒ| j j|d ƒd�d�S )Nz	BIGNUM **r   )Úerk   )ri   rj   ÚdÚdmp1Údmq1ÚiqmpÚpublic_numbers)r]   r3   r?   r   rc   r^   r5   r4   r\   ZRSA_get0_crt_paramsr   Ú
_bn_to_intr   )	rf   rk   ru   rv   ri   rj   rw   rx   ry   r    r    r!   Úprivate_numbersÅ  s<    z_RSAPrivateKey.private_numbers)ÚencodingrO   Úencryption_algorithmr   c             C   s   | j j|||| | j| jƒS )N)r]   Z_private_key_bytesr2   r^   )rf   r}   rO   r~   r    r    r!   Úprivate_bytesè  s    z_RSAPrivateKey.private_bytes)r%   r&   rI   r   c             C   s(   | j ƒ  t||ƒ\}}t| j||| |ƒS )N)rn   r   rU   r]   )rf   r%   r&   rI   r    r    r!   Úsign÷  s    z_RSAPrivateKey.sign)!Ú__name__Ú
__module__Ú__qualname__Úobjectr2   r^   Úintre   Úboolrl   rn   rm   Úpropertyro   Úbytesr   rs   r   rV   r   r|   r   ÚEncodingZPrivateFormatZKeySerializationEncryptionr   ÚtypingÚUnionÚ
asym_utilsÚ	Prehashedr   rK   r€   r    r    r    r!   r#   i  s(   
+%c               @   s°   e Zd ZU eeeddœdd„Ze	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$   r   )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   )r]   r^   r2   r3   r?   r   rc   r4   r5   rd   re   )rf   r   rg   rh   rk   r    r    r!   rl     s    z_RSAPublicKey.__init__)r   c             C   s   | j S )N)re   )rf   r    r    r!   ro     s    z_RSAPublicKey.key_size)Ú	plaintextr&   r   c             C   s   t | j| ||ƒS )N)r/   r]   )rf   rŽ   r&   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	|d ƒ| j j	|d ƒd�S )Nz	BIGNUM **r   )ru   rk   )
r]   r3   r?   r   rc   r^   r4   r5   r   r{   )rf   rk   ru   r    r    r!   rz     s    z_RSAPublicKey.public_numbers)r}   rO   r   c             C   s   | j j||| | j| jƒS )N)r]   Z_public_key_bytesr2   r^   )rf   r}   rO   r    r    r!   Úpublic_bytes*  s    z_RSAPublicKey.public_bytesN)rW   r%   r&   rI   r   c             C   s&   t ||ƒ\}}t| j||| ||ƒ d S )N)r   rX   r]   )rf   rW   r%   r&   rI   r    r    r!   Úverify3  s    z_RSAPublicKey.verify)rW   r&   rI   r   c             C   s&   t |tjƒrtdƒ‚t| j||| |ƒS )NzoPrehashed is only supported in the sign and verify methods. It cannot be used with recover_data_from_signature.)r   rŒ   r�   r'   rZ   r]   )rf   rW   r&   rI   r    r    r!   Úrecover_data_from_signature?  s
    z)_RSAPublicKey.recover_data_from_signature)r�   r‚   rƒ   r„   r2   r^   r…   re   rl   r‡   ro   rˆ   r   r�   r   rz   r   r‰   ZPublicFormatr�   rŠ   r‹   rŒ   r�   r   rK   r‘   ÚOptionalr’   r    r    r    r!   r$     s(   

)r#   r$   )r#   r$   )r#   r$   )r$   r#   )1r`   rŠ   Zcryptography.exceptionsr   r   r   Z*cryptography.hazmat.backends.openssl.utilsr   Zcryptography.hazmat.primitivesr   r   Z)cryptography.hazmat.primitives.asymmetricr   rŒ   Z1cryptography.hazmat.primitives.asymmetric.paddingr	   r
   r   r   r   r   r   r   r   Z-cryptography.hazmat.primitives.asymmetric.rsar   r   r   r   ÚTYPE_CHECKINGZ,cryptography.hazmat.backends.openssl.backendr   r‹   rK   r…   r"   rˆ   r/   r-   r“   rL   ÚCallableÚAnyrR   rU   rX   rZ   r#   r$   r    r    r    r!   Ú<module>   sr   , >
,
1
 