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