o
    àý°j  ã                   @  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e d¡Ze ¡ 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   ú†/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/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  sv   zt  |¡}W n tjy } ztdƒ|‚d }~ww t|ƒdkr$tdƒ‚|d d… | _|dd … | _t 	| j¡| _
d S )Nz4Fernet key must be 32 url-safe base64-encoded bytes.é    é   )Úbase64Úurlsafe_b64decodeÚbinasciiÚErrorÚ
ValueErrorÚlenÚ_signing_keyÚ_encryption_keyr	   ÚAESÚ_aes)Ú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_key5   s   zFernet.generate_keyÚdatac                 C  ó   |   |tt ¡ ƒ¡S ©N©Úencrypt_at_timeÚintÚtime)r'   r0   r   r   r   Úencrypt9   ó   zFernet.encryptÚcurrent_timer5   c                 C  s   t  d¡}|  |||¡S )Nr   )r,   r-   Ú_encrypt_from_parts)r'   r0   r9   Úivr   r   r   r4   <   s   
zFernet.encrypt_at_timer;   c                 C  s”   t  d|¡ t ¡ }| |¡| ¡  }t| jt 	|¡ƒ 
¡ }| |¡| ¡  }d|jddd� | | }t| jtƒ}	|	 |¡ |	 ¡ }
t ||
 ¡S )Nr0   ó   €é   Úbig)ÚlengthÚ	byteorder)r   Ú_check_bytesÚ
_PKCS7_128ÚpadderÚupdateÚfinalizer   r&   r
   ÚCBCÚ	encryptorÚto_bytesr   r#   Ú_SHA256r   r+   )r'   r0   r9   r;   rC   Úpadded_datarG   Ú
ciphertextÚbasic_partsÚhÚhmacr   r   r   r:   @   s"   ÿþýÿ
zFernet._encrypt_from_partsÚtokenÚttlú
int | Nonec                 C  s:   t  |¡\}}|d u rd }n|tt ¡ ƒf}|  |||¡S r2   )r   Ú_get_unverified_token_datar5   r6   Ú_decrypt_data)r'   rO   rP   Ú	timestampr0   Ú	time_infor   r   r   ÚdecryptV   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   rR   rS   )r'   rO   rP   r9   rT   r0   r   r   r   Údecrypt_at_time^   s   ÿzFernet.decrypt_at_timec                 C  s   t  |¡\}}|  |¡ |S r2   )r   rR   Ú_verify_signature)r'   rO   rT   r0   r   r   r   Úextract_timestamph   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>   )r@   )Ú
isinstanceÚstrr*   Ú	TypeErrorr   r   r   r    r   r"   r5   Ú
from_bytes)rO   r0   rT   r   r   r   rR   n   s   ÿz!Fernet._get_unverified_token_datac                 C  sN   t | jtƒ}| t|ƒd d… ¡ z| |dd … ¡ W d S  ty&   t‚w )Néàÿÿÿ)r   r#   rI   rD   Ú
memoryviewÚverifyr   r   )r'   r0   rM   r   r   r   rY   �   s   ÿzFernet._verify_signaturerT   rU   útuple[int, int] | Nonec                 C  sÖ   |d ur|\}}|| |k rt ‚|t |k rt ‚|  |¡ t|ƒ}|dd… }|dd… }t| jt |¡ƒ ¡ }	|	 	|¡}
z|
|	 
¡ 7 }
W n	 tyN   t ‚w t ¡ }| 	|
¡}z	|| 
¡ 7 }W |S  tyj   t ‚w )Nr\   é   rb   )r   Ú_MAX_CLOCK_SKEWrY   rc   r   r&   r
   rF   Ú	decryptorrD   rE   r!   rB   Úunpadder)r'   r0   rT   rU   rP   r9   Úmvr;   rK   rh   Úplaintext_paddedri   Úunpaddedr   r   r   rS   ‰   s2   

ÿ
þÿzFernet._decrypt_datar2   )r   r   r   r   r   r   )r   r*   )r0   r*   r   r*   )r0   r*   r9   r5   r   r*   )r0   r*   r9   r5   r;   r*   r   r*   )rO   r   rP   rQ   r   r*   )rO   r   rP   r5   r9   r5   r   r*   )rO   r   r   r5   )rO   r   r   r[   )r0   r*   r   r   )r0   r*   rT   r5   rU   re   r   r*   )r   r   r   r)   Úclassmethodr/   r7   r4   r:   rV   rX   rZ   ÚstaticmethodrR   rY   rS   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'   rp   r   r   r   r)   ­   s   ÿ
zMultiFernet.__init__Úmsgr*   r   c                 C  r1   r2   r3   )r'   rt   r   r   r   r7   µ   r8   zMultiFernet.encryptr9   r5   c                 C  s   | j d  ||¡S )Nr   )rs   r4   )r'   rt   r9   r   r   r   r4   ¸   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   rR   rs   rS   r   r,   r-   r:   )r'   rt   rT   r0   ÚfÚpr;   r   r   r   Úrotate»   s   
ÿ
zMultiFernet.rotateNrP   rQ   c              	   C  sb   |d u rd }n|t t ¡ ƒf}t |¡\}}| jD ]}z
| |||¡W   S  ty.   Y qw t‚r2   )r5   r6   r   rR   rs   rS   r   )r'   rt   rP   rU   rT   r0   ru   r   r   r   rV   É   s   
ÿzMultiFernet.decryptc              	   C  sX   |d u rt dƒ‚t |¡\}}| jD ]}z| ||||f¡W   S  ty)   Y qw t‚rW   )r!   r   rR   rs   rS   r   )r'   rt   rP   r9   rT   r0   ru   r   r   r   rX   ×   s   ÿ
ÿzMultiFernet.decrypt_at_timec              	   C  sD   t  |¡\}}| jD ]}z
| |¡ |W   S  ty   Y q
w t‚r2   )r   rR   rs   rY   r   )r'   rt   rT   r0   ru   r   r   r   rZ   ç   s   


ÿzMultiFernet.extract_timestamp)rp   rq   )rt   r*   r   r*   )rt   r*   r9   r5   r   r*   )rt   r   r   r*   r2   )rt   r   rP   rQ   r   r*   )rt   r   rP   r5   r9   r5   r   r*   )rt   r   r   r5   )
r   r   r   r)   r7   r4   rw   rV   rX   rZ   r   r   r   r   ro   ¬   s    




ro   )Ú
__future__r   r   r   r,   r6   ÚtypingÚcollections.abcr   Úcryptographyr   Úcryptography.exceptionsr   Úcryptography.hazmat.primitivesr   r   Ú&cryptography.hazmat.primitives.ciphersr   r	   r
   Ú#cryptography.hazmat.primitives.hmacr   Ú	Exceptionr   rg   ÚPKCS7rB   ÚSHA256rI   r   ro   r   r   r   r   Ú<module>   s&   
 