U
    ÒZj»  ã                   @   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   úV/var/www/html/TRUCKING_PROJECT/venv/lib/python3.8/site-packages/cryptography/fernet.pyr
      s   r
   é<   c                   @   s*  e Zd Zd!ejeef ej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Úbackendc              
   C   sr   zt  |¡}W n. tjk
r< } ztdƒ|‚W 5 d }~X Y 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__)Úreturnc                 C   s   t  t d¡¡S )Nr   )r   Úurlsafe_b64encodeÚosÚurandom)Úclsr   r   r   Úgenerate_key.   s    zFernet.generate_key)Údatar!   c                 C   s   |   |tt ¡ ƒ¡S ©N©Úencrypt_at_timeÚintÚtime)r   r'   r   r   r   Úencrypt2   s    zFernet.encrypt)r'   Úcurrent_timer!   c                 C   s   t  d¡}|  |||¡S )Nr   )r#   r$   Ú_encrypt_from_parts)r   r'   r.   Úivr   r   r   r*   5   s    
zFernet.encrypt_at_time)r'   r.   r0   r!   c                 C   s¨   t  d|¡ t tjj¡ ¡ }| |¡| 	¡  }t
t | j¡t |¡ƒ ¡ }| |¡| 	¡  }d|jddd� | | }t| jt ¡ ƒ}	|	 |¡ |	 	¡ }
t ||
 ¡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.   r0   r:   Zpadded_datar>   Ú
ciphertextZbasic_partsÚhÚhmacr   r   r   r/   9   s(    
þÿþýÿ
zFernet._encrypt_from_parts)ÚtokenÚttlr!   c                 C   s:   t  |¡\}}|d krd }n|tt ¡ ƒf}|  |||¡S r(   )r   Ú_get_unverified_token_datar+   r,   Ú_decrypt_data)r   rD   rE   Ú	timestampr'   Ú	time_infor   r   r   ÚdecryptR   s
    zFernet.decrypt)rD   rE   r.   r!   c                 C   s0   |d krt dƒ‚t |¡\}}|  ||||f¡S )Nz6decrypt_at_time() can only be used with a non-None ttl)r   r   rF   rG   )r   rD   rE   r.   rH   r'   r   r   r   Údecrypt_at_time\   s    ÿzFernet.decrypt_at_time)rD   r!   c                 C   s   t  |¡\}}|  |¡ |S r(   )r   rF   Ú_verify_signature)r   rD   rH   r'   r   r   r   Úextract_timestampf   s    
zFernet.extract_timestampc              	   C   s†   t | ttfƒstdƒ‚zt | ¡}W n ttjfk
rB   t‚Y nX |rT|d dkrXt‚t	|ƒdk rht‚t
j|dd… dd�}||fS )Nztoken must be bytes or strr   é€   é	   é   r3   )r5   )Ú
isinstanceÚstrÚbytesÚ	TypeErrorr   r   r   r   r
   r   r+   Ú
from_bytes)rD   r'   rH   r   r   r   rF   l   s    
z!Fernet._get_unverified_token_datac                 C   sV   t | jt ¡ ƒ}| |d d… ¡ z| |dd … ¡ W n tk
rP   t‚Y nX d S )Néàÿÿÿ)r	   r   r   r@   r;   Úverifyr   r
   )r   r'   rB   r   r   r   rL   �   s    zFernet._verify_signature)r'   rH   rI   r!   c                 C   sì   |d k	r0|\}}|| |k r t ‚|t |k r0t ‚|  |¡ |dd… }|dd… }tt | j¡t |¡ƒ 	¡ }| 
|¡}	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 )NrO   é   rV   )r
   Ú_MAX_CLOCK_SKEWrL   r   r   r8   r   r   r=   Ú	decryptorr;   r<   r   r   r7   r9   Úunpadder)r   r'   rH   rI   rE   r.   r0   rA   rZ   Zplaintext_paddedr[   Zunpaddedr   r   r   rG   ‰   s2    

 ÿ



zFernet._decrypt_data)N)N)r   r   r   ÚtypingÚUnionrS   rR   ÚAnyr    Úclassmethodr&   r-   r+   r*   r/   ÚOptionalrJ   rK   rM   ÚstaticmethodÚTuplerF   rL   rG   r   r   r   r   r      sH    ýý  þ ÿ þ  þ
þ
û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   rd   r   r   r   r    ®   s    ÿzMultiFernet.__init__)Úmsgr!   c                 C   s   |   |tt ¡ ƒ¡S r(   r)   )r   rg   r   r   r   r-   ¶   s    zMultiFernet.encrypt)rg   r.   r!   c                 C   s   | j d  ||¡S )Nr   )rf   r*   )r   rg   r.   r   r   r   r*   ¹   s    zMultiFernet.encrypt_at_timec              	   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   rF   rf   rG   r
   r#   r$   r/   )r   rg   rH   r'   ÚfÚpr0   r   r   r   Úrotate¼   s    


zMultiFernet.rotateN)rg   rE   r!   c              	   C   s<   | j D ],}z| ||¡W   S  tk
r0   Y qX qt‚d S r(   )rf   rJ   r
   )r   rg   rE   rh   r   r   r   rJ   Ê   s    
zMultiFernet.decrypt)rg   rE   r.   r!   c              	   C   s>   | j D ].}z| |||¡W   S  tk
r2   Y qX qt‚d S r(   )rf   rK   r
   )r   rg   rE   r.   rh   r   r   r   rK   Ô   s    
zMultiFernet.decrypt_at_time)N)r   r   r   r\   ÚIterabler   r    rS   r-   r+   r*   r]   rR   rj   r`   rJ   rK   r   r   r   r   rc   ­   s    ÿ þ  þrc   )r   r   r#   r,   r\   Zcryptographyr   Zcryptography.exceptionsr   Zcryptography.hazmat.primitivesr   r   Z&cryptography.hazmat.primitives.ciphersr   r   r   Z#cryptography.hazmat.primitives.hmacr	   Ú	Exceptionr
   rY   r   rc   r   r   r   r   Ú<module>   s    