o
    VÌh  ã                   @  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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)Úutils)ÚInvalidSignature)ÚhashesÚpadding)ÚCipherÚ
algorithmsÚmodes)ÚHMACc                   @  s   e Zd ZdS )ÚInvalidTokenN)Ú__name__Ú
__module__Ú__qualname__© r   r   úg/var/www/html/construction_image-detection-poc/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_key/   s   zFernet.generate_keyÚdatac                 C  ó   |   |tt ¡ ƒ¡S ©N©Úencrypt_at_timeÚintÚtime)r#   r,   r   r   r   Úencrypt3   ó   zFernet.encryptÚcurrent_timer1   c                 C  s   t  d¡}|  |||¡S )Nr   )r(   r)   Ú_encrypt_from_parts)r#   r,   r5   Úivr   r   r   r0   6   s   
zFernet.encrypt_at_timer7   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,   r5   r7   rA   Úpadded_datarE   Ú
ciphertextÚbasic_partsÚhÚhmacr   r   r   r6   :   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_datar1   r2   Ú_decrypt_data)r#   rM   rN   Ú	timestampr,   Ú	time_infor   r   r   ÚdecryptS   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   rP   rQ   )r#   rM   rN   r5   rR   r,   r   r   r   Údecrypt_at_time[   s   ÿzFernet.decrypt_at_timec                 C  s   t  |¡\}}|  |¡ |S r.   )r   rP   Ú_verify_signature)r#   rM   rR   r,   r   r   r   Úextract_timestampe   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    r1   Ú
from_bytes)rM   r,   rR   r   r   r   rP   k   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   rG   rB   Úverifyr   r   )r#   r,   rK   r   r   r   rV   ~   s   ÿzFernet._verify_signaturerR   rS   ú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 )NrZ   é   r`   )r   Ú_MAX_CLOCK_SKEWrV   r   r   r?   r"   r	   rD   Ú	decryptorrB   rC   r   r   r>   r@   Úunpadder)r#   r,   rR   rS   rN   r5   r7   rI   re   Úplaintext_paddedrf   Úunpaddedr   r   r   rQ   †   s8   
ÿþ
ÿ
þÿzFernet._decrypt_datar.   )r   r   r   r   r   r   )r   r&   )r,   r&   r   r&   )r,   r&   r5   r1   r   r&   )r,   r&   r5   r1   r7   r&   r   r&   )rM   r   rN   rO   r   r&   )rM   r   rN   r1   r5   r1   r   r&   )rM   r   r   r1   )rM   r   r   rX   )r,   r&   r   r   )r,   r&   rR   r1   rS   rb   r   r&   )r   r   r   r%   Úclassmethodr+   r3   r0   r6   rT   rU   rW   ÚstaticmethodrP   rV   rQ   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útyping.Iterable[Fernet]c                 C  s   t |ƒ}|s
tdƒ‚|| _d S )Nz1MultiFernet requires at least one Fernet instance)Úlistr   Ú_fernets)r#   rl   r   r   r   r%   «   s   ÿ
zMultiFernet.__init__Úmsgr&   r   c                 C  r-   r.   r/   )r#   rp   r   r   r   r3   ³   r4   zMultiFernet.encryptr5   r1   c                 C  s   | j d  ||¡S )Nr   )ro   r0   )r#   rp   r5   r   r   r   r0   ¶   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   rP   ro   rQ   r   r(   r)   r6   )r#   rp   rR   r,   ÚfÚpr7   r   r   r   Úrotate¹   s   
ÿ
zMultiFernet.rotateNrN   rO   c              	   C  s4   | j D ]}z	| ||¡W   S  ty   Y qw t‚r.   )ro   rT   r   )r#   rp   rN   rq   r   r   r   rT   Ç   s   
ÿzMultiFernet.decryptc              	   C  s6   | j D ]}z
| |||¡W   S  ty   Y qw t‚r.   )ro   rU   r   )r#   rp   rN   r5   rq   r   r   r   rU   Ï   s   
ÿzMultiFernet.decrypt_at_timec              	   C  s2   | j D ]}z| |¡W   S  ty   Y qw t‚r.   )ro   rW   r   )r#   rp   rq   r   r   r   rW   Ù   s   
ÿzMultiFernet.extract_timestamp)rl   rm   )rp   r&   r   r&   )rp   r&   r5   r1   r   r&   )rp   r   r   r&   r.   )rp   r   rN   rO   r   r&   )rp   r   rN   r1   r5   r1   r   r&   )rp   r   r   r1   )
r   r   r   r%   r3   r0   rs   rT   rU   rW   r   r   r   r   rk   ª   s    





rk   )Ú
__future__r   r   r   r(   r2   ÚtypingÚcryptographyr   Úcryptography.exceptionsr   Úcryptography.hazmat.primitivesr   r   Ú&cryptography.hazmat.primitives.ciphersr   r   r	   Ú#cryptography.hazmat.primitives.hmacr
   Ú	Exceptionr   rd   r   rk   r   r   r   r   Ú<module>   s     