o
    ¼­§i3  ã                   @  s¼   d dl m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ƒZG dd„ dƒZdS )é    )ÚannotationsN)ÚIterable)Úutils)ÚInvalidSignature)ÚhashesÚpadding)ÚCipherÚ
algorithmsÚmodes)ÚHMACc                   @  s   e Zd ZdS )ÚInvalidTokenN)Ú__name__Ú
__module__Ú__qualname__© r   r   úJ/home/app/Keep/.python/lib/python3.10/site-packages/cryptography/fernet.pyr      s    r   é<   c                   @  sˆ   e Zd Z	d*d+dd	„Zed,dd„ƒZd-dd„Zd.dd„Zd/dd„Zd*d0dd„Z	d1dd„Z
d2dd„Zed3d!d"„ƒZd4d#d$„Zd5d(d)„ZdS )6ÚFernetNÚkeyúbytes | strÚbackendú
typing.AnyÚreturnÚNonec              
   C  sh   zt  |¡}W n tjy } ztdƒ|‚d }~ww t|ƒdkr$tdƒ‚|d d… | _|dd … | _d S )Nz4Fernet key must be 32 url-safe base64-encoded bytes.é    é   )Úbase64Úurlsafe_b64decodeÚbinasciiÚErrorÚ
ValueErrorÚlenÚ_signing_keyÚ_encryption_key)Úselfr   r   Úexcr   r   r   Ú__init__   s    ÿþ€ÿÿzFernet.__init__Úbytesc                 C  s   t  t d¡¡S )Nr   )r   Úurlsafe_b64encodeÚosÚurandom)Úclsr   r   r   Úgenerate_key0   s   zFernet.generate_keyÚdatac                 C  ó   |   |tt ¡ ƒ¡S ©N©Úencrypt_at_timeÚintÚtime)r$   r-   r   r   r   Úencrypt4   ó   zFernet.encryptÚcurrent_timer2   c                 C  s   t  d¡}|  |||¡S )Nr   )r)   r*   Ú_encrypt_from_parts)r$   r-   r6   Úivr   r   r   r1   7   s   
zFernet.encrypt_at_timer8   c                 C  s¨   t  d|¡ t tjj¡ ¡ }| |¡| 	¡  }t
t | j¡t |¡ƒ ¡ }| |¡| 	¡  }d|jddd | | }t| jt ¡ ƒ}	|	 |¡ |	 	¡ }
t ||
 ¡S )Nr-   ó   €é   Úbig)ÚlengthÚ	byteorder)r   Ú_check_bytesr   ÚPKCS7r	   ÚAESÚ
block_sizeÚpadderÚupdateÚfinalizer   r#   r
   ÚCBCÚ	encryptorÚto_bytesr   r"   r   ÚSHA256r   r(   )r$   r-   r6   r8   rB   Zpadded_datarF   Ú
ciphertextZbasic_partsÚhÚhmacr   r   r   r7   ;   s,   
þýÿþýÿ
zFernet._encrypt_from_partsÚtokenÚttlú
int | Nonec                 C  s:   t  |¡\}}|d u rd }n|tt ¡ ƒf}|  |||¡S r/   )r   Ú_get_unverified_token_datar2   r3   Ú_decrypt_data)r$   rL   rM   Ú	timestampr-   Ú	time_infor   r   r   ÚdecryptT   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   rO   rP   )r$   rL   rM   r6   rQ   r-   r   r   r   Údecrypt_at_time\   s   ÿzFernet.decrypt_at_timec                 C  s   t  |¡\}}|  |¡ |S r/   )r   rO   Ú_verify_signature)r$   rL   rQ   r-   r   r   r   Úextract_timestampf   s   
zFernet.extract_timestampútuple[int, bytes]c              	   C  s€   t | ttfƒstdƒ‚zt | ¡}W n ttjfy   t‚w |r'|d dkr)t‚t	|ƒdk r1t‚t
j|dd… dd}||fS )Nztoken must be bytes or strr   é€   é	   é   r;   )r=   )Ú
isinstanceÚstrr'   Ú	TypeErrorr   r   r   r   r   r!   r2   Ú
from_bytes)rL   r-   rQ   r   r   r   rO   l   s   ÿz!Fernet._get_unverified_token_datac                 C  sN   t | jt ¡ ƒ}| |d d… ¡ z| |dd … ¡ W d S  ty&   t‚w )Néàÿÿÿ)r   r"   r   rH   rC   Úverifyr   r   )r$   r-   rJ   r   r   r   rU      s   ÿzFernet._verify_signaturerQ   rR   útuple[int, int] | Nonec                 C  sÞ   |d ur|\}}|| |k rt ‚|t |k rt ‚|  |¡ |dd… }|dd… }tt | j¡t |¡ƒ 	¡ }| 
|¡}	z|	| ¡ 7 }	W n	 tyM   t ‚w t tjj¡ ¡ }
|
 
|	¡}z	||
 ¡ 7 }W |S  tyn   t ‚w )NrY   é   r_   )r   Ú_MAX_CLOCK_SKEWrU   r   r	   r@   r#   r
   rE   Ú	decryptorrC   rD   r    r   r?   rA   Úunpadder)r$   r-   rQ   rR   rM   r6   r8   rI   rd   Zplaintext_paddedre   Zunpaddedr   r   r   rP   ‡   s8   
ÿþ
ÿ
þÿzFernet._decrypt_datar/   )r   r   r   r   r   r   )r   r'   )r-   r'   r   r'   )r-   r'   r6   r2   r   r'   )r-   r'   r6   r2   r8   r'   r   r'   )rL   r   rM   rN   r   r'   )rL   r   rM   r2   r6   r2   r   r'   )rL   r   r   r2   )rL   r   r   rW   )r-   r'   r   r   )r-   r'   rQ   r2   rR   ra   r   r'   )r   r   r   r&   Úclassmethodr,   r4   r1   r7   rS   rT   rV   ÚstaticmethodrO   rU   rP   r   r   r   r   r      s    ý






r   c                   @  sT   e Zd Zddd„Zddd	„Zddd„Zddd„Zdddd„Zd dd„Zd!dd„Z	dS )"ÚMultiFernetÚfernetsúIterable[Fernet]c                 C  s   t |ƒ}|s
tdƒ‚|| _d S )Nz1MultiFernet requires at least one Fernet instance)Úlistr    Ú_fernets)r$   ri   r   r   r   r&   ¬   s   ÿ
zMultiFernet.__init__Úmsgr'   r   c                 C  r.   r/   r0   )r$   rm   r   r   r   r4   ´   r5   zMultiFernet.encryptr6   r2   c                 C  s   | j d  ||¡S )Nr   )rl   r1   )r$   rm   r6   r   r   r   r1   ·   s   zMultiFernet.encrypt_at_timer   c              	   C  sb   t  |¡\}}| jD ]}z
| ||d ¡}W  n ty   Y q
w t‚t d¡}| jd  |||¡S )Nr   r   )r   rO   rl   rP   r   r)   r*   r7   )r$   rm   rQ   r-   ÚfÚpr8   r   r   r   Úrotateº   s   
ÿ
zMultiFernet.rotateNrM   rN   c              	   C  s4   | j D ]}z	| ||¡W   S  ty   Y qw t‚r/   )rl   rS   r   )r$   rm   rM   rn   r   r   r   rS   È   s   
ÿzMultiFernet.decryptc              	   C  s6   | j D ]}z
| |||¡W   S  ty   Y qw t‚r/   )rl   rT   r   )r$   rm   rM   r6   rn   r   r   r   rT   Ð   s   
ÿzMultiFernet.decrypt_at_timec              	   C  s2   | j D ]}z| |¡W   S  ty   Y qw t‚r/   )rl   rV   r   )r$   rm   rn   r   r   r   rV   Ú   s   
ÿzMultiFernet.extract_timestamp)ri   rj   )rm   r'   r   r'   )rm   r'   r6   r2   r   r'   )rm   r   r   r'   r/   )rm   r   rM   rN   r   r'   )rm   r   rM   r2   r6   r2   r   r'   )rm   r   r   r2   )
r   r   r   r&   r4   r1   rp   rS   rT   rV   r   r   r   r   rh   «   s    





rh   )Ú
__future__r   r   r   r)   r3   ÚtypingÚcollections.abcr   Zcryptographyr   Zcryptography.exceptionsr   Zcryptography.hazmat.primitivesr   r   Z&cryptography.hazmat.primitives.ciphersr   r	   r
   Z#cryptography.hazmat.primitives.hmacr   Ú	Exceptionr   rc   r   rh   r   r   r   r   Ú<module>   s"    