U
    ڲg                     @  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   7/tmp/pip-unpacked-wheel-orgc96xl/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_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   _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_datarB   
ciphertextZbasic_partshhmacr   r   r   r3   :   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_datar/   r0   _decrypt_data)r"   rI   rJ   	timestampr+   	time_infor   r   r   decryptS   s
    zFernet.decrypt)rI   rJ   r2   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   r2   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_timestampe   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      	      r7   )r9   )
isinstancestrr%   	TypeErrorr   r   r   r   r   r   r/   
from_bytes)rI   r+   rM   r   r   r   rK   k   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   rD   r?   verifyr   r   )r"   r+   rF   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	   rA   	decryptorr?   r@   r   r   r;   r=   unpadder)r"   r+   rM   rN   rJ   r2   r4   rE   r^   Zplaintext_paddedr_   Zunpaddedr   r   r   rL      s2    

 



zFernet._decrypt_data)N)N)r   r   r   r$   classmethodr*   r1   r.   r3   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typing.Iterable[Fernet])fernetsc                 C  s   t |}|std|| _d S )Nz1MultiFernet requires at least one Fernet instance)listr   _fernets)r"   rc   r   r   r   r$      s    zMultiFernet.__init__r%   )msgr   c                 C  s   |  |tt S r,   r-   )r"   rf   r   r   r   r1      s    zMultiFernet.encryptr/   )rf   r2   r   c                 C  s   | j d ||S )Nr   )re   r.   )r"   rf   r2   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   re   rL   r   r'   r(   r3   )r"   rf   rM   r+   fpr4   r   r   r   rotate   s    


zMultiFernet.rotateNrH   )rf   rJ   r   c              	   C  s<   | j D ],}z|||W   S  tk
r0   Y qX qtd S r,   )re   rO   r   )r"   rf   rJ   rg   r   r   r   rO      s    
zMultiFernet.decrypt)rf   rJ   r2   r   c              	   C  s>   | j D ].}z||||W   S  tk
r2   Y qX qtd S r,   )re   rP   r   )r"   rf   rJ   r2   rg   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,   )re   rR   r   )r"   rf   rg   r   r   r   rR      s    
zMultiFernet.extract_timestamp)N)
r   r   r   r$   r1   r.   ri   rO   rP   rR   r   r   r   r   rb      s   
rb   )
__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   rb   r   r   r   r   <module>   s    