o
    Th3                     @  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   S/home/air/segue/gpt/backup/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"    