3
ãdeÃ  ã               @   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   úJ/var/www/agendate/envp3/lib/python3.6/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   yt j|ƒ}W n. tjk
r< } ztdƒ|‚W Y d d }~X 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 jtjdƒƒS )Nr   )r   Úurlsafe_b64encodeÚosÚurandom)Úclsr   r   r   Úgenerate_key.   s    zFernet.generate_key)Údatar   c             C   s   | j |ttjƒ ƒƒS )N)Úencrypt_at_timeÚintÚtime)r   r'   r   r   r   Úencrypt2   s    zFernet.encrypt)r'   Úcurrent_timer   c             C   s   t jdƒ}| j|||ƒS )Nr   )r#   r$   Ú_encrypt_from_parts)r   r'   r,   Úivr   r   r   r(   5   s    
zFernet.encrypt_at_time)r'   r,   r.   r   c             C   s¨   t jd|ƒ tjtjjƒjƒ }|j|ƒ|j	ƒ  }t
tj| jƒtj|ƒƒjƒ }|j|ƒ|j	ƒ  }d|jddd� | | }t| jtjƒ ƒ}	|	j|ƒ |	j	ƒ }
tj||
 ƒ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,   r.   r8   Zpadded_datar<   Ú
ciphertextZbasic_partsÚhÚhmacr   r   r   r-   9   s    

zFernet._encrypt_from_parts)ÚtokenÚttlr   c             C   s:   t j|ƒ\}}|d krd }n|ttjƒ ƒf}| j|||ƒS )N)r   Ú_get_unverified_token_datar)   r*   Ú_decrypt_data)r   rB   rC   Ú	timestampr'   Ú	time_infor   r   r   ÚdecryptR   s
    zFernet.decrypt)rB   rC   r,   r   c             C   s0   |d krt dƒ‚tj|ƒ\}}| j||||fƒS )Nz6decrypt_at_time() can only be used with a non-None ttl)r   r   rD   rE   )r   rB   rC   r,   rF   r'   r   r   r   Údecrypt_at_time\   s
    zFernet.decrypt_at_time)rB   r   c             C   s   t j|ƒ\}}| j|ƒ |S )N)r   rD   Ú_verify_signature)r   rB   rF   r'   r   r   r   Úextract_timestampf   s    
zFernet.extract_timestampc             C   sˆ   t | ttfƒstdƒ‚ytj| ƒ}W n ttjfk
rB   t‚Y nX | sV|d dkrZt‚t	|ƒdk rjt‚t
j|dd… dd�}||fS )Nztoken must be bytes or strr   é€   é	   é   r1   )r3   )Ú
isinstanceÚstrÚbytesÚ	TypeErrorr   r   r   r   r
   r   r)   Ú
from_bytes)rB   r'   rF   r   r   r   rD   l   s    
z!Fernet._get_unverified_token_datac             C   sV   t | jtjƒ ƒ}|j|d d… ƒ y|j|dd … ƒ W n tk
rP   t‚Y nX d S )Nr   iàÿÿÿiàÿÿÿ)r	   r   r   r>   r9   Úverifyr   r
   )r   r'   r@   r   r   r   rJ   �   s    zFernet._verify_signature)r'   rF   rG   r   c             C   sì   |d k	r0|\}}|| |k r t ‚|t |k r0t ‚| j|ƒ |dd… }|dd… }ttj| jƒt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 )NrM   é   r   iàÿÿÿ)r
   Ú_MAX_CLOCK_SKEWrJ   r   r   r6   r   r   r;   Ú	decryptorr9   r:   r   r   r5   r7   Úunpadder)r   r'   rF   rG   rC   r,   r.   r?   rW   Zplaintext_paddedrX   Zunpaddedr   r   r   rE   ‰   s.    




zFernet._decrypt_data)N)N)r   r   r   ÚtypingÚUnionrQ   rP   ÚAnyr!   Úclassmethodr&   r+   r)   r(   r-   ÚOptionalrH   rI   rK   ÚstaticmethodÚTuplerD   rJ   rE   r   r   r   r   r      s*   	
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   ra   r   r   r   r!   ®   s
    zMultiFernet.__init__)Úmsgr   c             C   s   | j |ttjƒ ƒƒS )N)r(   r)   r*   )r   rd   r   r   r   r+   ¶   s    zMultiFernet.encrypt)rd   r,   r   c             C   s   | j d j||ƒS )Nr   )rc   r(   )r   rd   r,   r   r   r   r(   ¹   s    zMultiFernet.encrypt_at_timec             C   sj   t j|ƒ\}}x<| jD ].}y|j||d ƒ}P W q tk
rB   Y qX qW t‚tjdƒ}| jd j|||ƒS )Nr   r   )r   rD   rc   rE   r
   r#   r$   r-   )r   rd   rF   r'   ÚfÚpr.   r   r   r   Úrotate¼   s    

zMultiFernet.rotateN)rd   rC   r   c             C   s:   x0| j D ]&}y|j||ƒS  tk
r,   Y qX qW t‚d S )N)rc   rH   r
   )r   rd   rC   re   r   r   r   rH   Ê   s    
zMultiFernet.decrypt)rd   rC   r,   r   c             C   s<   x2| j D ](}y|j|||ƒS  tk
r.   Y qX qW t‚d S )N)rc   rI   r
   )r   rd   rC   r,   re   r   r   r   rI   Ô   s    
zMultiFernet.decrypt_at_time)N)r   r   r   rY   ÚIterabler   r!   rQ   r+   r)   r(   rZ   rP   rg   r]   rH   rI   r   r   r   r   r`   ­   s   	r`   )r   r   r#   r*   rY   Zcryptographyr   Zcryptography.exceptionsr   Zcryptography.hazmat.primitivesr   r   Z&cryptography.hazmat.primitives.ciphersr   r   r   Z#cryptography.hazmat.primitives.hmacr	   Ú	Exceptionr
   rV   r   r`   r   r   r   r   Ú<module>   s    