o
    ªŒc»  ã                   @   s¤   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
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 )é    N)Úutils)ÚInvalidSignature)ÚhashesÚpadding)ÚCipherÚ
algorithmsÚmodes)ÚHMACc                   @   s   e Zd ZdS )ÚInvalidTokenN)Ú__name__Ú
__module__Ú__qualname__© r   r   ú7usr/lib/python3.10/site-packages/cryptography/fernet.pyr
      s    r
   é<   c                	   @   sR  e Zd Z	d"dejeef dej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jeef deje defdd„Zdejeef dededefdd„Zdejeef defdd„Zedejeef 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ÚkeyÚbackendc              
   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__Ú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   Úencrypt2   ó   zFernet.encryptÚcurrent_timec                 C   s   t  d¡}|  |||¡S )Nr   )r#   r$   Ú_encrypt_from_parts)r   r'   r0   Úivr   r   r   r+   5   s   
zFernet.encrypt_at_timer2   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'   r0   r2   r<   Zpadded_datar@   Ú
ciphertextZbasic_partsÚhÚhmacr   r   r   r1   9   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   ÚdecryptR   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   r0   rJ   r'   r   r   r   Údecrypt_at_time\   s   ÿzFernet.decrypt_at_timec                 C   s   t  |¡\}}|  |¡ |S r)   )r   rH   Ú_verify_signature)r   rF   rJ   r'   r   r   r   Úextract_timestampf   s   
zFernet.extract_timestampc              	   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   é€   é	   é   r5   )r7   )Ú
isinstanceÚstrÚbytesÚ	TypeErrorr   r   r   r   r
   r   r,   Ú
from_bytes)rF   r'   rJ   r   r   r   rH   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   rB   r=   Úverifyr   r
   )r   r'   rD   r   r   r   rN      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 |¡ƒ 	¡ }| 
|¡}	z|	| ¡ 7 }	W n	 tyM   t ‚w t tjj¡ ¡ }
|
 
|	¡}z	||
 ¡ 7 }W |S  tyn   t ‚w )NrQ   é   rX   )r
   Ú_MAX_CLOCK_SKEWrN   r   r   r:   r   r   r?   Ú	decryptorr=   r>   r   r   r9   r;   Úunpadder)r   r'   rJ   rK   rG   r0   r2   rC   r\   Zplaintext_paddedr]   Zunpaddedr   r   r   rI   ‰   s8   
ÿþ
ÿ
þÿzFernet._decrypt_datar)   )r   r   r   ÚtypingÚUnionrU   rT   ÚAnyr    Úclassmethodr&   r.   r,   r+   r1   Ú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jeef defdd„Z	ddejeef deje	 defdd„Zdejeef 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   rf   r   r   r   r    ®   s   ÿ
zMultiFernet.__init__Úmsgr!   c                 C   r(   r)   r*   )r   ri   r   r   r   r.   ¶   r/   zMultiFernet.encryptr0   c                 C   s   | j d  ||¡S )Nr   )rh   r+   )r   ri   r0   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   rh   rI   r
   r#   r$   r1   )r   ri   rJ   r'   ÚfÚpr2   r   r   r   Úrotate¼   s   
ÿ
zMultiFernet.rotateNrG   c              	   C   s4   | j D ]}z	| ||¡W   S  ty   Y qw t‚r)   )rh   rL   r
   )r   ri   rG   rj   r   r   r   rL   Ê   s   
ÿzMultiFernet.decryptc              	   C   s6   | j D ]}z
| |||¡W   S  ty   Y qw t‚r)   )rh   rM   r
   )r   ri   rG   r0   rj   r   r   r   rM   Ô   s   
ÿzMultiFernet.decrypt_at_timer)   )r   r   r   r^   ÚIterabler   r    rU   r.   r,   r+   r_   rT   rl   rb   rL   rM   r   r   r   r   re   ­   s,    ÿÿÿ
þ
ÿÿÿþre   )r   r   r#   r-   r^   Úcryptographyr   Zcryptography.exceptionsr   Zcryptography.hazmat.primitivesr   r   Z&cryptography.hazmat.primitives.ciphersr   r   r   Z#cryptography.hazmat.primitives.hmacr	   Ú	Exceptionr
   r[   r   re   r   r   r   r   Ú<module>   s    