o
    �)%aŠ  ã                   @   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   ú5/usr/lib/python3/dist-packages/cryptography/fernet.pyr      s    r   é<   c                	   @   s  e Zd Zd!defdd„Zedefdd„ƒZdedefd	d
„Zdededefdd„Z	dedededefdd„Z
d!dedeje defdd„Zdedededefdd„Zdedefdd„Zededejeef fdd„ƒZdeddfdd„Zdededejejeef  def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Údatac                 C   ó   |   |tt ¡ ƒ¡S ©N©Úencrypt_at_timeÚintÚtime)r   r&   r   r   r   Úencrypt.   ó   zFernet.encryptÚcurrent_timec                 C   s   t  d¡}|  |||¡S )Nr   )r"   r#   Ú_encrypt_from_parts)r   r&   r/   Úivr   r   r   r*   1   s   
zFernet.encrypt_at_timer1   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/   r1   r9   Úpadded_datar=   Ú
ciphertextÚbasic_partsÚhÚhmacr   r   r   r0   5   s   ÿþÿ
zFernet._encrypt_from_partsÚtokenÚttlc                 C   s:   t  |¡\}}|d u rd }n|tt ¡ ƒf}|  |||¡S r(   )r   Ú_get_unverified_token_datar+   r,   Ú_decrypt_data)r   rF   rG   Ú	timestampr&   Ú	time_infor   r   r   ÚdecryptJ   s
   zFernet.decryptc                 C   s0   |d u rt dƒ‚t |¡\}}|  ||||f¡S )Nz6decrypt_at_time() can only be used with a non-None ttl)r   r   rH   rI   )r   rF   rG   r/   rJ   r&   r   r   r   Údecrypt_at_timeR   s   ÿzFernet.decrypt_at_timec                 C   s   t  |¡\}}|  |¡ |S r(   )r   rH   Ú_verify_signature)r   rF   rJ   r&   r   r   r   Úextract_timestamp\   s   
zFernet.extract_timestampc              	   C   s~   t  d| ¡ zt | ¡}W n ttjfy   t‚w |r"|d dkr$t‚zt 	d|dd… ¡\}W ||fS  tj
y>   t‚w )NrF   r   é€   r3   é   é	   )r   r5   r   r   Ú	TypeErrorÚbinasciiÚErrorr   r>   ÚunpackÚerror)rF   r&   rJ   r   r   r   rH   b   s   ÿþÿz!Fernet._get_unverified_token_datac                 C   sT   t | jt ¡ | jd�}| |d d… ¡ z| |dd … ¡ W d S  ty)   t‚w )Nr4   éàÿÿÿ)	r
   r   r   r@   r   r:   Úverifyr   r   )r   r&   rD   r   r   r   rN   s   s   ÿzFernet._verify_signaturerJ   rK   c                 C   sâ   |d ur|\}}|| |k rt ‚|t |k rt ‚|  |¡ |dd… }|dd… }tt | j¡t |¡| j	ƒ 
¡ }| |¡}	z|	| ¡ 7 }	W n	 tyO   t ‚w t tjj¡ ¡ }
|
 |	¡}z	||
 ¡ 7 }W |S  typ   t ‚w )NrR   é   rX   )r   Ú_MAX_CLOCK_SKEWrN   r   r   r7   r   r	   r<   r   Ú	decryptorr:   r;   r   r   r6   r8   Úunpadder)r   r&   rJ   rK   rG   r/   r1   rB   r\   Úplaintext_paddedr]   Úunpaddedr   r   r   rI   {   s8   
ÿþ
ÿ
þÿzFernet._decrypt_datar(   )r   r   r   Úbytesr   Úclassmethodr%   r-   r+   r*   r0   ÚtypingÚOptionalrL   rM   rO   ÚstaticmethodÚTuplerH   rN   rI   r   r   r   r   r      sL    ÿÿÿ
þÿÿÿ
þ
þýüûr   c                   @   s’   e Zd Zdeje fdd„Zdedefdd„Zdede	defd	d
„Z
dedefdd„Zddedeje	 defdd„Zdede	de	def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   rg   r   r   r   r       s   ÿ
zMultiFernet.__init__Úmsgr    c                 C   r'   r(   r)   )r   rj   r   r   r   r-   ¨   r.   zMultiFernet.encryptr/   c                 C   s   | j d  ||¡S )Nr   )ri   r*   )r   rj   r/   r   r   r   r*   «   s   zMultiFernet.encrypt_at_timec              	   C   sb   t  |¡\}}| jD ]}z
| ||d ¡}W  n ty   Y q
w t‚t d¡}| jd  |||¡S )Nr   r   )r   rH   ri   rI   r   r"   r#   r0   )r   rj   rJ   r&   ÚfÚpr1   r   r   r   Úrotate®   s   
ÿ
zMultiFernet.rotateNrG   c              	   C   s4   | j D ]}z	| ||¡W   S  ty   Y qw t‚r(   )ri   rL   r   )r   rj   rG   rk   r   r   r   rL   ¼   s   
ÿzMultiFernet.decryptc              	   C   s6   | j D ]}z
| |||¡W   S  ty   Y qw t‚r(   )ri   rM   r   )r   rj   rG   r/   rk   r   r   r   rM   Ä   s   
ÿzMultiFernet.decrypt_at_timer(   )r   r   r   rb   ÚIterabler   r   r`   r-   r+   r*   rm   rc   rL   rM   r   r   r   r   rf   Ÿ   s    ÿÿÿþrf   )r   rT   r"   r>   r,   rb   Úcryptographyr   Úcryptography.exceptionsr   Úcryptography.hazmat.backendsr   Úcryptography.hazmat.primitivesr   r   Ú&cryptography.hazmat.primitives.ciphersr   r   r	   Ú#cryptography.hazmat.primitives.hmacr
   Ú	Exceptionr   r[   Úobjectr   rf   r   r   r   r   Ú<module>   s"    