U
    EZh                     @   s   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 )    N)utils)InvalidSignature)hashespadding)Cipher
algorithmsmodes)HMACc                   @   s   e Zd ZdS )InvalidTokenN)__name__
__module____qualname__ r   r   Z/home/aprabhat/apps/x.techxrdev.in/venv/lib/python3.8/site-packages/cryptography/fernet.pyr
      s   r
   <   c                   @   s,  e Zd Zd!ejeef ejddddZe	edddZ
eedd	d
ZeeedddZeeeedddZd"ejeef eje edddZejeef eeedddZejeef edddZeejeef ejeef dddZeddddZeeejejeef  eddd ZdS )#FernetN)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__)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   encrypt2   s    zFernet.encrypt)r'   current_timer   c                 C   s   t d}| |||S )Nr   )r#   r$   _encrypt_from_parts)r   r'   r.   ivr   r   r   r*   5   s    
zFernet.encrypt_at_time)r'   r.   r0   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'   r.   r0   r:   Zpadded_datar>   
ciphertextZbasic_partshhmacr   r   r   r/   9   s(    

zFernet._encrypt_from_parts)tokenttlr   c                 C   s:   t |\}}|d krd }n|tt f}| |||S r(   )r   _get_unverified_token_datar+   r,   _decrypt_data)r   rD   rE   	timestampr'   	time_infor   r   r   decryptR   s
    zFernet.decrypt)rD   rE   r.   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   rF   rG   )r   rD   rE   r.   rH   r'   r   r   r   decrypt_at_time\   s    zFernet.decrypt_at_time)rD   r   c                 C   s   t |\}}| | |S r(   )r   rF   _verify_signature)r   rD   rH   r'   r   r   r   extract_timestampf   s    
zFernet.extract_timestampc              	   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      	      r3   )r5   )
isinstancestrbytes	TypeErrorr   r   r   r   r
   r   r+   
from_bytes)rD   r'   rH   r   r   r   rF   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   r@   r;   verifyr   r
   )r   r'   rB   r   r   r   rL      s    zFernet._verify_signature)r'   rH   rI   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 )NrO      rV   )r
   _MAX_CLOCK_SKEWrL   r   r   r8   r   r   r=   	decryptorr;   r<   r   r   r7   r9   unpadder)r   r'   rH   rI   rE   r.   r0   rA   rZ   Zplaintext_paddedr[   Zunpaddedr   r   r   rG      s2    

 



zFernet._decrypt_data)N)N)r   r   r   typingUnionrS   rR   Anyr!   classmethodr&   r-   r+   r*   r/   OptionalrJ   rK   rM   staticmethodTuplerF   rL   rG   r   r   r   r   r      sJ          

r   c                   @   s   e Zd Zeje dddZeedddZee	eddd	Z
ejeef edd
dZdejeef eje	 edddZejeef e	e	edddZdS )MultiFernet)fernetsc                 C   s   t |}|std|| _d S )Nz1MultiFernet requires at least one Fernet instance)listr   _fernets)r   rd   r   r   r   r!      s    zMultiFernet.__init__)msgr   c                 C   s   |  |tt S r(   r)   )r   rg   r   r   r   r-      s    zMultiFernet.encrypt)rg   r.   r   c                 C   s   | j d ||S )Nr   )rf   r*   )r   rg   r.   r   r   r   r*      s    zMultiFernet.encrypt_at_timec              	   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   rF   rf   rG   r
   r#   r$   r/   )r   rg   rH   r'   fpr0   r   r   r   rotate   s    


zMultiFernet.rotateN)rg   rE   r   c              	   C   s<   | j D ],}z|||W   S  tk
r0   Y qX qtd S r(   )rf   rJ   r
   )r   rg   rE   rh   r   r   r   rJ      s    
zMultiFernet.decrypt)rg   rE   r.   r   c              	   C   s>   | j D ].}z||||W   S  tk
r2   Y qX qtd S r(   )rf   rK   r
   )r   rg   rE   r.   rh   r   r   r   rK      s    
zMultiFernet.decrypt_at_time)N)r   r   r   r\   Iterabler   r!   rS   r-   r+   r*   r]   rR   rj   r`   rJ   rK   r   r   r   r   rc      s       rc   )r   r   r#   r,   r\   Zcryptographyr   Zcryptography.exceptionsr   Zcryptography.hazmat.primitivesr   r   Z&cryptography.hazmat.primitives.ciphersr   r   r   Z#cryptography.hazmat.primitives.hmacr	   	Exceptionr
   rY   r   rc   r   r   r   r   <module>   s    