3
dZ                 @   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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)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S )FernetNc             C   sR   |d krt  }tj|}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 jtjdS )Nr   )r   urlsafe_b64encodeosurandom)clsr   r   r   generate_key,   s    zFernet.generate_keyc             C   s$   t tj }tjd}| j|||S )Nr   )inttimer#   r$   _encrypt_from_parts)r   datacurrent_timeivr   r   r   encrypt0   s    
zFernet.encryptc             C   s   t |tstdtjtjjj }|j	||j
  }ttj| jtj|| jj }|j	||j
  }dtjd| | | }t| jtj | jd}	|	j	| |	j
 }
tj||
 S )Nzdata must be bytes.   z>Q)r    )
isinstancebytes	TypeErrorr   PKCS7r
   AES
block_sizepadderupdatefinalizer	   r   r   CBCr   	encryptorstructZpackr   r   r   SHA256r   r"   )r   r*   r+   r,   r5   Zpadded_datar9   
ciphertextZbasic_partshZhmacr   r   r   r)   5   s    

zFernet._encrypt_from_partsc          +   C   s  t |tstdttj }ytj|}W n ttjfk
rJ   t	Y nX | sbt
j|ddkrft	ytjd|dd \}W n tjk
r   t	Y nX |d k	r|| |k rt	|t |k rt	t| jtj | jd}|j|d d
  y|j|dd   W n tk
r   t	Y nX |dd	 }|d	d }ttj| jtj|| jj }	|	j|}
y|
|	j 7 }
W n t k
r   t	Y nX t!j"tjj#j$ }|j|
}y||j 7 }W n t k
r   t	Y nX |S )Nztoken must be bytes.r      z>Q   	   )r    r      iii)%r/   r0   r1   r'   r(   r   r   binasciiErrorr   sixZ
indexbytesr:   Zunpackerror_MAX_CLOCK_SKEWr   r   r   r;   r   r6   Zverifyr   r	   r
   r3   r   r   r8   	decryptorr7   r   r   r2   r4   unpadder)r   tokenttlr+   r*   Z	timestampr=   r,   r<   rG   Zplaintext_paddedrH   Zunpaddedr   r   r   decryptI   sP    







zFernet.decrypt)N)N)	r   r   r   r!   classmethodr&   r-   r)   rK   r   r   r   r   r      s
   
r   c               @   s&   e Z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 j|S )Nr   )rO   r-   )r   msgr   r   r   r-      s    zMultiFernet.encryptNc             C   s:   x0| j D ]&}y|j||S  tk
r,   Y qX qW td S )N)rO   rK   r   )r   rP   rJ   fr   r   r   rK      s    
zMultiFernet.decrypt)N)r   r   r   r!   r-   rK   r   r   r   r   rM   }   s   rM   )Z
__future__r   r   r   r   rB   r#   r:   r(   rD   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   rF   objectr   rM   r   r   r   r   <module>   s   `