B
    f]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   2lib/python3.7/site-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+      z>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-   r4   Zpadded_datar8   
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 )N)r   r=   _verify_signature)r   r?   rA   r+   r   r   r   extract_timestampM   s    
zFernet.extract_timestampc          	   C   s   t d|  yt| }W n ttjfk
r8   tY nX |rNt	|ddkrRtyt
d|dd \}W n t
jk
r   tY nX ||fS )Nr?   r      z>Q   	   )r   r0   r   r   	TypeErrorbinasciiErrorr   sixZ
indexbytesr9   Zunpackerror)r?   r+   rA   r   r   r   r=   S   s    

z!Fernet._get_unverified_token_datac             C   s\   t | jt | jd}||d d  y||dd   W n tk
rV   tY nX d S )N)r!   i)	r   r   r   r:   r   r5   Zverifyr   r   )r   r+   r<   r   r   r   rC   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 }||}y|| 7 }W n tk
r   tY nX ttjj }	|	|}
y|
|	 7 }
W n tk
r   tY nX |
S )NrG      i)r(   r)   r   _MAX_CLOCK_SKEWrC   r
   r   r2   r   r   r7   r   	decryptorr5   r6   r   r	   r1   r3   unpadder)r   r+   rA   r@   r,   r-   r;   rO   Zplaintext_paddedrP   Zunpaddedr   r   r   r>   l   s.    




zFernet._decrypt_data)N)N)r   r   r   r"   classmethodr'   r.   r*   rB   rD   staticmethodr=   rC   r>   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   )rU   r.   )r   msgr   r   r   r.      s    zMultiFernet.encryptc          	   C   sj   t |\}}x<| jD ].}y|||d }P W q tk
rB   Y qX qW ttd}| jd |||S )Nr   r   )r   r=   rU   r>   r   r$   r%   r*   )r   rV   rA   r+   fpr-   r   r   r   rotate   s    

zMultiFernet.rotateNc          	   C   s:   x0| j D ]&}y|||S  tk
r,   Y qX qW td S )N)rU   rB   r   )r   rV   r@   rW   r   r   r   rB      s    
zMultiFernet.decrypt)N)r   r   r   r"   r.   rY   rB   r   r   r   r   rS      s   rS   )Z
__future__r   r   r   r   rI   r$   r9   r)   rK   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   rN   objectr   rS   r   r   r   r   <module>   s    m