U
    ʹh3                     @  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   9./venv/lib/python3.8/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bytes | strz
typing.AnyNone)keybackendreturnc              
   C  sr   zt |}W n. tjk
r< } ztd|W 5 d }~X Y nX t|dkrRt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_key0   s    zFernet.generate_key)datar   c                 C  s   |  |tt S Nencrypt_at_timeinttime)r#   r,   r   r   r   encrypt4   s    zFernet.encryptr0   )r,   current_timer   c                 C  s   t d}| |||S )Nr   )r(   r)   _encrypt_from_parts)r#   r,   r3   ivr   r   r   r/   7   s    
zFernet.encrypt_at_time)r,   r3   r5   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   _check_bytesr   PKCS7r	   AES
block_sizepadderupdatefinalizer   r"   r
   CBC	encryptorto_bytesr   r!   r   SHA256r   r'   )r#   r,   r3   r5   r?   Zpadded_datarC   
ciphertextZbasic_partshZhmacr   r   r   r4   ;   s(    

zFernet._encrypt_from_parts
int | None)tokenttlr   c                 C  s:   t |\}}|d krd }n|tt f}| |||S r-   )r   _get_unverified_token_datar0   r1   _decrypt_data)r#   rI   rJ   	timestampr,   	time_infor   r   r   decryptT   s
    zFernet.decrypt)rI   rJ   r3   r   c                 C  s0   |d krt dt|\}}| ||||fS )Nz6decrypt_at_time() can only be used with a non-None ttl)r   r   rK   rL   )r#   rI   rJ   r3   rM   r,   r   r   r   decrypt_at_time\   s    zFernet.decrypt_at_time)rI   r   c                 C  s   t |\}}| | |S r-   )r   rK   _verify_signature)r#   rI   rM   r,   r   r   r   extract_timestampf   s    
zFernet.extract_timestampztuple[int, bytes]c              	   C  s   t | ttfstdzt| }W n ttjfk
rB   tY nX |rT|d dkrXtt	|dk rhtt
j|dd dd}||fS )Nztoken must be bytes or strr      	      r8   )r:   )
isinstancestrr&   	TypeErrorr   r   r   r   r   r    r0   
from_bytes)rI   r,   rM   r   r   r   rK   l   s    
z!Fernet._get_unverified_token_datac                 C  sV   t | jt }||d d  z||dd   W n tk
rP   tY nX d S )N)r   r!   r   rE   r@   Zverifyr   r   )r#   r,   rG   r   r   r   rQ      s    zFernet._verify_signatureztuple[int, int] | None)r,   rM   rN   r   c                 C  s   |d k	r0|\}}|| |k r t |t |k r0t | | |dd }|dd }tt| jt|	 }|
|}	z|	| 7 }	W n tk
r   t Y nX ttjj }
|

|	}z||
 7 }W n tk
r   t Y nX |S )NrT      rZ   )r   _MAX_CLOCK_SKEWrQ   r   r	   r=   r"   r
   rB   	decryptorr@   rA   r   r   r<   r>   unpadder)r#   r,   rM   rN   rJ   r3   r5   rF   r]   Zplaintext_paddedr^   Zunpaddedr   r   r   rL      s2    

 



zFernet._decrypt_data)N)N)r   r   r   r%   classmethodr+   r2   r/   r4   rO   rP   rR   staticmethodrK   rQ   rL   r   r   r   r   r      s    
r   c                   @  s   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d	dddZ	dS )MultiFernetz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   r2      s    zMultiFernet.encryptr0   )re   r3   r   c                 C  s   | j d ||S )Nr   )rd   r/   )r#   re   r3   r   r   r   r/      s    zMultiFernet.encrypt_at_timer   c              	   C  sj   t |\}}| jD ]2}z|||d }W  qLW q tk
rD   Y qX qttd}| jd |||S )Nr   r   )r   rK   rd   rL   r   r(   r)   r4   )r#   re   rM   r,   fpr5   r   r   r   rotate   s    


zMultiFernet.rotateNrH   )re   rJ   r   c              	   C  s<   | j D ],}z|||W   S  tk
r0   Y qX qtd S r-   )rd   rO   r   )r#   re   rJ   rf   r   r   r   rO      s    
zMultiFernet.decrypt)re   rJ   r3   r   c              	   C  s>   | j D ].}z||||W   S  tk
r2   Y qX qtd S r-   )rd   rP   r   )r#   re   rJ   r3   rf   r   r   r   rP      s    
zMultiFernet.decrypt_at_timec              	   C  s:   | j D ]*}z||W   S  tk
r.   Y qX qtd S r-   )rd   rR   r   )r#   re   rf   r   r   r   rR      s    
zMultiFernet.extract_timestamp)N)
r   r   r   r%   r2   r/   rh   rO   rP   rR   r   r   r   r   ra      s   
ra   )Z
__future__r   r   r   r(   r1   typingZcollections.abcr   Z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     