o
    ¿Z2h3  ã                   @  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   úd/home/skpark/git/infrasmart_work/infrasmart/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  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   Úpadded_datarF   Ú
ciphertextÚ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$   rN   rO   Ú	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   rQ   rR   )r$   rN   rO   r6   rS   r-   r   r   r   Údecrypt_at_time\   s   ÿzFernet.decrypt_at_timec                 C  s   t  |¡\}}|  |¡ |S r/   )r   rQ   Ú_verify_signature)r$   rN   rS   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)rN   r-   rS   r   r   r   rQ   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-   rL   r   r   r   rW      s   ÿzFernet._verify_signaturerS   rT   ú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 )Nr[   é   ra   )r   Ú_MAX_CLOCK_SKEWrW   r   r	   r@   r#   r
   rE   Ú	decryptorrC   rD   r    r   r?   rA   Úunpadder)r$   r-   rS   rT   rO   r6   r8   rJ   rf   Úplaintext_paddedrg   Úunpaddedr   r   r   rR   ‡   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'   )rN   r   rO   rP   r   r'   )rN   r   rO   r2   r6   r2   r   r'   )rN   r   r   r2   )rN   r   r   rY   )r-   r'   r   r   )r-   r'   rS   r2   rT   rc   r   r'   )r   r   r   r&   Úclassmethodr,   r4   r1   r7   rU   rV   rX   ÚstaticmethodrQ   rW   rR   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$   rm   r   r   r   r&   ¬   s   ÿ
zMultiFernet.__init__Úmsgr'   r   c                 C  r.   r/   r0   )r$   rq   r   r   r   r4   ´   r5   zMultiFernet.encryptr6   r2   c                 C  s   | j d  ||¡S )Nr   )rp   r1   )r$   rq   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   rQ   rp   rR   r   r)   r*   r7   )r$   rq   rS   r-   ÚfÚpr8   r   r   r   Úrotateº   s   
ÿ
zMultiFernet.rotateNrO   rP   c              	   C  s4   | j D ]}z	| ||¡W   S  ty   Y qw t‚r/   )rp   rU   r   )r$   rq   rO   rr   r   r   r   rU   È   s   
ÿzMultiFernet.decryptc              	   C  s6   | j D ]}z
| |||¡W   S  ty   Y qw t‚r/   )rp   rV   r   )r$   rq   rO   r6   rr   r   r   r   rV   Ð   s   
ÿzMultiFernet.decrypt_at_timec              	   C  s2   | j D ]}z| |¡W   S  ty   Y qw t‚r/   )rp   rX   r   )r$   rq   rr   r   r   r   rX   Ú   s   
ÿzMultiFernet.extract_timestamp)rm   rn   )rq   r'   r   r'   )rq   r'   r6   r2   r   r'   )rq   r   r   r'   r/   )rq   r   rO   rP   r   r'   )rq   r   rO   r2   r6   r2   r   r'   )rq   r   r   r2   )
r   r   r   r&   r4   r1   rt   rU   rV   rX   r   r   r   r   rl   «   s    





rl   )Ú
__future__r   r   r   r)   r3   ÚtypingÚcollections.abcr   Úcryptographyr   Úcryptography.exceptionsr   Úcryptography.hazmat.primitivesr   r   Ú&cryptography.hazmat.primitives.ciphersr   r	   r
   Ú#cryptography.hazmat.primitives.hmacr   Ú	Exceptionr   re   r   rl   r   r   r   r   Ú<module>   s"    