U
    e]d                     @   s   d dl mZmZ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	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eZG dd deZdS )    )absolute_importdivisionprint_functionN)utils)InvalidSignature)default_backend)hashespadding)Cipher
algorithmsmodes)HMACc                   @   s   e Zd ZdS )InvalidTokenN)__name__
__module____qualname__ r   r   5/usr/lib/python3/dist-packages/cryptography/fernet.pyr      s   r   <   c                   @   s`   e Zd ZdddZedd Zdd Zdd	 Zdd
dZdd Z	e
dd Zdd Zdd ZdS )FernetNc                 C   sR   |d krt  }t|}t|dkr,td|d d | _|dd  | _|| _d S )N    z4Fernet key must be 32 url-safe base64-encoded bytes.   )r   base64urlsafe_b64decodelen
ValueError_signing_key_encryption_key_backend)selfkeybackendr   r   r   __init__   s    
zFernet.__init__c                 C   s   t tdS )Nr   )r   urlsafe_b64encodeosurandom)clsr   r   r   generate_key-   s    zFernet.generate_keyc                 C   s$   t t }td}| |||S )Nr   )inttimer$   r%   _encrypt_from_parts)r   datacurrent_timeivr   r   r   encrypt1   s    
zFernet.encryptc                 C   s   t d| ttjj }|||	  }t
t| jt|| j }|||	  }dtd| | | }t| jt | jd}	|	| |		 }
t||
 S )Nr+      >Qr!   )r   _check_bytesr	   PKCS7r   AES
block_sizepadderupdatefinalizer
   r   r   CBCr   	encryptorstructZpackr   r   r   SHA256r   r#   )r   r+   r,   r-   r6   Zpadded_datar:   
ciphertextZbasic_partshZhmacr   r   r   r*   6   s    
  
zFernet._encrypt_from_partsc                 C   s   t |\}}| |||S N)r   _get_unverified_token_data_decrypt_data)r   tokenttl	timestampr+   r   r   r   decryptI   s    zFernet.decryptc                 C   s   t |\}}| | |S r?   )r   r@   _verify_signature)r   rB   rD   r+   r   r   r   extract_timestampM   s    
zFernet.extract_timestampc              	   C   s   t d|  zt| }W n ttjfk
r8   tY nX |rNt	|ddkrRtzt
d|dd \}W n t
jk
r   tY nX ||fS )NrB   r      r0      	   )r   r2   r   r   	TypeErrorbinasciiErrorr   sixZ
indexbytesr;   Zunpackerror)rB   r+   rD   r   r   r   r@   S   s    

z!Fernet._get_unverified_token_datac                 C   s\   t | jt | jd}||d d  z||dd   W n tk
rV   tY nX d S )Nr1   )	r   r   r   r<   r   r7   Zverifyr   r   )r   r+   r>   r   r   r   rF   d   s    zFernet._verify_signaturec                 C   s   t t }|d k	r4|| |k r$t|t |k r4t| | |dd }|dd }tt| jt	
|| j }||}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 )NrJ      rP   )r(   r)   r   _MAX_CLOCK_SKEWrF   r
   r   r4   r   r   r9   r   	decryptorr7   r8   r   r	   r3   r5   unpadder)r   r+   rD   rC   r,   r-   r=   rS   Zplaintext_paddedrT   Zunpaddedr   r   r   rA   l   s4    

  



zFernet._decrypt_data)N)N)r   r   r   r"   classmethodr'   r.   r*   rE   rG   staticmethodr@   rF   rA   r   r   r   r   r      s   



r   c                   @   s.   e Zd Zdd Zdd Zdd Zd
dd	ZdS )MultiFernetc                 C   s   t |}|std|| _d S )Nz1MultiFernet requires at least one Fernet instance)listr   _fernets)r   Zfernetsr   r   r   r"      s    zMultiFernet.__init__c                 C   s   | j d |S )Nr   )rY   r.   )r   msgr   r   r   r.      s    zMultiFernet.encryptc              	   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   r@   rY   rA   r   r$   r%   r*   )r   rZ   rD   r+   fpr-   r   r   r   rotate   s    


zMultiFernet.rotateNc              	   C   s<   | j D ],}z|||W   S  tk
r0   Y qX qtd S r?   )rY   rE   r   )r   rZ   rC   r[   r   r   r   rE      s    
zMultiFernet.decrypt)N)r   r   r   r"   r.   r]   rE   r   r   r   r   rW      s   rW   )Z
__future__r   r   r   r   rL   r$   r;   r)   rN   Zcryptographyr   Zcryptography.exceptionsr   Zcryptography.hazmat.backendsr   Zcryptography.hazmat.primitivesr   r	   Z&cryptography.hazmat.primitives.ciphersr
   r   r   Z#cryptography.hazmat.primitives.hmacr   	Exceptionr   rR   objectr   rW   r   r   r   r   <module>   s    m