a
   ‚ô!¸µõwÒã                   @   s¼   d dl Z d dlZd dlZd dlZd dlZd dlZd dlmZ d dlm	Z	 d dl
mZ d dlmZmZ d dlmZmZmZ d dlmZ G dd	„ d	eƒZd
ZG dd„ deƒZG dd„ deƒZdS )é    N)Úutils)ÚInvalidSignature)Ú_get_backend)ÚhashesÚpadding)ÚCipherÚ
algorithmsÚmodes)ÚHMACc                   @   s   e Zd ZdS )ÚInvalidTokenN)Ú__name__Ú
__module__Ú__qualname__© r   r   ú7/usr/lib/python3.9/site-packages/cryptography/fernet.pyr      s   r   é<   c                   @   sô   e Zd Zd!edœdd„Zeedœdd„ƒZeedœd	d
„Zeeedœdd„Z	eeeedœdd„Z
d"eeje edœdd„Zeeeedœdd„Zeedœdd„Zeeejeef dœdd„ƒZeddœdd„Zeeejejeef  edœdd „ZdS )#ÚFernetN)Úkeyc                 C   sL   t |ƒ}t |¡}t|ƒdkr&tdƒ‚|d d… | _|dd … | _|| _d S )Né    z4Fernet key must be 32 url-safe base64-encoded bytes.é   )r   Úbase64Úurlsafe_b64decodeÚlenÚ
ValueErrorÚ_signing_keyÚ_encryption_keyÚ_backend)Úselfr   Úbackendr   r   r   Ú__init__   s    
ÿzFernet.__init__)Úreturnc                 C   s   t  t d¡¡S )Nr   )r   Úurlsafe_b64encodeÚosÚurandom)Úclsr   r   r   Úgenerate_key*   s    zFernet.generate_key)Údatar    c                 C   s   |   |tt ¡ ƒ¡S ©N©Úencrypt_at_timeÚintÚtime)r   r&   r   r   r   Úencrypt.   s    zFernet.encrypt)r&   Úcurrent_timer    c                 C   s   t  d¡}|  |||¡S )Nr   )r"   r#   Ú_encrypt_from_parts)r   r&   r-   Úivr   r   r   r)   1   s    
zFernet.encrypt_at_time)r&   r-   r/   r    c                 C   s°   t  d|¡ t tjj¡ ¡ }| |¡| 	¡  }t
t | j¡t |¡| jƒ ¡ }| |¡| 	¡  }dt d|¡ | | }t| jt ¡ | jd}	|	 |¡ |	 	¡ }
t ||
 ¡S )Nr&   ó   €ú>Q©r   )r   Ú_check_bytesr   ÚPKCS7r   ÚAESÚ
block_sizeÚpadderÚupdateÚfinalizer   r   r	   ÚCBCr   Ú	encryptorÚstructÚpackr
   r   r   ÚSHA256r   r!   )r   r&   r-   r/   r7   Zpadded_datar;   Ú
ciphertextZbasic_partsÚhZhmacr   r   r   r.   5   s    ÿÿ
zFernet._encrypt_from_parts)ÚtokenÚttlr    c                 C   s:   t  |¡\}}|d u rd }n|tt ¡ ƒf}|  |||¡S r'   )r   Ú_get_unverified_token_datar*   r+   Ú_decrypt_data)r   rA   rB   Ú	timestampr&   Ú	time_infor   r   r   ÚdecryptJ   s
    zFernet.decrypt)rA   rB   r-   r    c                 C   s0   |d u rt dƒ‚t |¡\}}|  ||||f¡S )Nz6decrypt_at_time() can only be used with a non-None ttl)r   r   rC   rD   )r   rA   rB   r-   rE   r&   r   r   r   Údecrypt_at_timeR   s    ÿzFernet.decrypt_at_time)rA   r    c                 C   s   t  |¡\}}|  |¡ |S r'   )r   rC   Ú_verify_signature)r   rA   rE   r&   r   r   r   Úextract_timestamp\   s    
zFernet.extract_timestampc              	   C   sˆ   t  d| ¡ zt | ¡}W n ttjfy6   t‚Y n0 |rH|d dkrLt‚zt 	d|dd… ¡\}W n tj
y~   t‚Y n0 ||fS )NrA   r   é€   r1   é   é	   )r   r3   r   r   Ú	TypeErrorÚbinasciiÚErrorr   r<   ÚunpackÚerror)rA   r&   rE   r   r   r   rC   b   s    

z!Fernet._get_unverified_token_datac                 C   sZ   t | jt ¡ | jd}| |d d… ¡ z| |dd … ¡ W n tyT   t‚Y n0 d S )Nr2   éàÿÿÿ)	r
   r   r   r>   r   r8   Zverifyr   r   )r   r&   r@   r   r   r   rI   s   s    zFernet._verify_signature)r&   rE   rF   r    c                 C   sì   |d ur0|\}}|| |k r t ‚|t |k r0t ‚|  |¡ |dd… }|dd… }tt | j¡t |¡| j	ƒ 
¡ }| |¡}	z|	| ¡ 7 }	W n ty¢   t ‚Y n0 t tjj¡ ¡ }
|
 |	¡}z||
 ¡ 7 }W n tyæ   t ‚Y n0 |S )NrM   é   rS   )r   Ú_MAX_CLOCK_SKEWrI   r   r   r5   r   r	   r:   r   Ú	decryptorr8   r9   r   r   r4   r6   Úunpadder)r   r&   rE   rF   rB   r-   r/   r?   rV   Zplaintext_paddedrW   Zunpaddedr   r   r   rD   {   s0    
ÿ



zFernet._decrypt_data)N)N)r   r   r   Úbytesr   Úclassmethodr%   r,   r*   r)   r.   ÚtypingÚOptionalrG   rH   rJ   ÚstaticmethodÚTuplerC   rI   rD   r   r   r   r   r      s*   þ	þ

ûr   c                   @   s€   e Zd Zeje dœdd„Zeedœdd„Zee	edœdd	„Z
eedœd
d„Zdeeje	 edœdd„Zee	e	edœdd„ZdS )ÚMultiFernet)Úfernetsc                 C   s   t |ƒ}|stdƒ‚|| _d S )Nz1MultiFernet requires at least one Fernet instance)Úlistr   Ú_fernets)r   r_   r   r   r   r       s    ÿzMultiFernet.__init__)Úmsgr    c                 C   s   |   |tt ¡ ƒ¡S r'   r(   )r   rb   r   r   r   r,   ¨   s    zMultiFernet.encrypt)rb   r-   r    c                 C   s   | j d  ||¡S )Nr   )ra   r)   )r   rb   r-   r   r   r   r)   «   s    zMultiFernet.encrypt_at_timec              	   C   sh   t  |¡\}}| jD ]0}z| ||d ¡}W  qJW q tyB   Y q0 qt‚t d¡}| jd  |||¡S )Nr   r   )r   rC   ra   rD   r   r"   r#   r.   )r   rb   rE   r&   ÚfÚpr/   r   r   r   Úrotate®   s    


zMultiFernet.rotateN)rb   rB   r    c              	   C   s:   | j D ]*}z| ||¡W   S  ty.   Y q0 qt‚d S r'   )ra   rG   r   )r   rb   rB   rc   r   r   r   rG   ¼   s    
zMultiFernet.decrypt)rb   rB   r-   r    c              	   C   s<   | j D ],}z| |||¡W   S  ty0   Y q0 qt‚d S r'   )ra   rH   r   )r   rb   rB   r-   rc   r   r   r   rH   Ä   s    
zMultiFernet.decrypt_at_time)N)r   r   r   rZ   ÚIterabler   r   rX   r,   r*   r)   re   r[   rG   rH   r   r   r   r   r^   Ÿ   s   	þr^   )r   rO   r"   r<   r+   rZ   Zcryptographyr   Zcryptography.exceptionsr   Zcryptography.hazmat.backendsr   Zcryptography.hazmat.primitivesr   r   Z&cryptography.hazmat.primitives.ciphersr   r   r	   Z#cryptography.hazmat.primitives.hmacr
   Ú	Exceptionr   rU   Úobjectr   r^   r   r   r   r   Ú<module>   s     