a
    |f                     @  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   MD:\Projects\storyit_web\backend\venv\Lib\site-packages\cryptography/fernet.pyr      s   r   <   c                   @  s   e Zd Zd)ddddddZedd	d
dZdddddZddddddZdddddddZd*ddddddZ	dddddddZ
dddddZedd dd!d"Zdddd#d$Zddd%dd&d'd(ZdS )+FernetNtyping.Union[bytes, str]z
typing.AnyNone)keybackendreturnc              
   C  st   zt |}W n0 tjy> } ztd|W Y d }~n
d }~0 0 t|dkrTt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__bytes)r   c                 C  s   t tdS )Nr   )r   urlsafe_b64encodeosurandom)clsr   r   r   generate_key/   s    zFernet.generate_key)datar   c                 C  s   |  |tt S Nencrypt_at_timeinttime)r"   r+   r   r   r   encrypt3   s    zFernet.encryptr/   )r+   current_timer   c                 C  s   t d}| |||S )Nr   )r'   r(   _encrypt_from_parts)r"   r+   r2   ivr   r   r   r.   6   s    
zFernet.encrypt_at_time)r+   r2   r4   r   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   Z_check_bytesr   PKCS7r   AES
block_sizepadderupdatefinalizer   r!   r	   CBC	encryptorto_bytesr
   r    r   SHA256r   r&   )r"   r+   r2   r4   r=   Zpadded_datarA   
ciphertextZbasic_partshhmacr   r   r   r3   :   s(    

zFernet._encrypt_from_partstyping.Optional[int])tokenttlr   c                 C  s:   t |\}}|d u rd }n|tt f}| |||S r,   )r   _get_unverified_token_datar/   r0   _decrypt_data)r"   rH   rI   	timestampr+   	time_infor   r   r   decryptS   s
    zFernet.decrypt)rH   rI   r2   r   c                 C  s0   |d u rt dt|\}}| ||||fS )Nz6decrypt_at_time() can only be used with a non-None ttl)r   r   rJ   rK   )r"   rH   rI   r2   rL   r+   r   r   r   decrypt_at_time]   s    zFernet.decrypt_at_time)rH   r   c                 C  s   t |\}}| | |S r,   )r   rJ   _verify_signature)r"   rH   rL   r+   r   r   r   extract_timestampg   s    
zFernet.extract_timestampztyping.Tuple[int, bytes]c              	   C  s   t | ttfstdzt| }W n ttjfy@   tY n0 |rR|d dkrVtt	|dk rftt
j|dd dd}||fS )Nztoken must be bytes or strr      	      r7   )r9   )
isinstancestrr%   	TypeErrorr   r   r   r   r   r   r/   
from_bytes)rH   r+   rL   r   r   r   rJ   m   s    
z!Fernet._get_unverified_token_datac                 C  sT   t | jt }||d d  z||dd   W n tyN   tY n0 d S )N)r
   r    r   rC   r>   verifyr   r   )r"   r+   rE   r   r   r   rP      s    zFernet._verify_signaturez'typing.Optional[typing.Tuple[int, int]])r+   rL   rM   r   c                 C  s   |d ur0|\}}|| |k r t |t |k r0t | | |dd }|dd }tt| jt|	 }|
|}	z|	| 7 }	W n ty   t Y n0 ttjj }
|

|	}z||
 7 }W n ty   t Y n0 |S )NrS      rY   )r   _MAX_CLOCK_SKEWrP   r   r   r;   r!   r	   r@   	decryptorr>   r?   r   r   r:   r<   unpadder)r"   r+   rL   rM   rI   r2   r4   rD   r]   Zplaintext_paddedr^   Zunpaddedr   r   r   rK      s0    




zFernet._decrypt_data)N)N)r   r   r   r$   classmethodr*   r1   r.   r3   rN   rO   rQ   staticmethodrJ   rP   rK   r   r   r   r   r      s     

r   c                   @  st   e Zd ZddddZdddddZdd	dd
ddZdddddZdddddddZdd	d	ddddZdS )MultiFernetztyping.Iterable[Fernet])fernetsc                 C  s   t |}|std|| _d S )Nz1MultiFernet requires at least one Fernet instance)listr   _fernets)r"   rb   r   r   r   r$      s    zMultiFernet.__init__r%   )msgr   c                 C  s   |  |tt S r,   r-   )r"   re   r   r   r   r1      s    zMultiFernet.encryptr/   )re   r2   r   c                 C  s   | j d ||S )Nr   )rd   r.   )r"   re   r2   r   r   r   r.      s    zMultiFernet.encrypt_at_timer   c              	   C  sh   t |\}}| jD ]0}z|||d }W  qJW q tyB   Y q0 qttd}| jd |||S )Nr   r   )r   rJ   rd   rK   r   r'   r(   r3   )r"   re   rL   r+   fpr4   r   r   r   rotate   s    


zMultiFernet.rotateNrG   )re   rI   r   c              	   C  s:   | j D ]*}z|||W   S  ty.   Y q0 qtd S r,   )rd   rN   r   )r"   re   rI   rf   r   r   r   rN      s    
zMultiFernet.decrypt)re   rI   r2   r   c              	   C  s<   | j D ],}z||||W   S  ty0   Y q0 qtd S r,   )rd   rO   r   )r"   re   rI   r2   rf   r   r   r   rO      s    
zMultiFernet.decrypt_at_time)N)	r   r   r   r$   r1   r.   rh   rN   rO   r   r   r   r   ra      s    
ra   )
__future__r   r   r   r'   r0   typingZcryptographyr   Zcryptography.exceptionsr   Zcryptography.hazmat.primitivesr   r   Z&cryptography.hazmat.primitives.ciphersr   r   r	   Z#cryptography.hazmat.primitives.hmacr
   	Exceptionr   r\   r   ra   r   r   r   r   <module>   s    