o
    ™¨Êhª  ã                   @   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   úE/var/www/html/env/lib/python3.10/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 u 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   Úencrypt0   s   
zFernet.encryptc                 C   s¶   t |tƒs	tdƒ‚t tjj¡ ¡ }| 	|¡| 
¡  }tt | j¡t |¡| jƒ ¡ }| 	|¡| 
¡  }dt d|¡ | | }t| jt ¡ | jd�}	|	 	|¡ |	 
¡ }
t ||
 ¡S )Nzdata must be bytes.ó   €ú>Q©r    )Ú
isinstanceÚbytesÚ	TypeErrorr   ÚPKCS7r
   ÚAESÚ
block_sizeÚpadderÚupdateÚfinalizer	   r   r   ÚCBCr   Ú	encryptorÚstructÚpackr   r   r   ÚSHA256r   r"   )r   r*   r+   r,   r7   Úpadded_datar;   Ú
ciphertextÚbasic_partsÚhÚhmacr   r   r   r)   5   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 rD   )r   rE   Ú_verify_signature)r   rG   rI   r*   r   r   r   Úextract_timestampM   s   
zFernet.extract_timestampc              	   C   sˆ   t | tƒs	tdƒ‚zt | ¡}W n ttjfy   t‚w |r't 	|d¡dkr)t‚zt
 d|dd… ¡\}W ||fS  t
jyC   t‚w )Nztoken must be bytes.r   é€   r/   é   é	   )r1   r2   r3   r   r   ÚbinasciiÚErrorr   ÚsixÚ
indexbytesr<   ÚunpackÚerror)rG   r*   rI   r   r   r   rE   S   s   
ÿþÿz!Fernet._get_unverified_token_datac                 C   sT   t | jt ¡ | jd�}| |d d… ¡ z| |dd … ¡ W d S  ty)   t‚w )Nr0   éàÿÿÿ)	r   r   r   r>   r   r8   Úverifyr   r   )r   r*   rB   r   r   r   rK   f   s   ÿzFernet._verify_signaturec                 C   sæ   t t ¡ ƒ}|d ur|| |k rt‚|t |k rt‚|  |¡ |dd… }|dd… }tt | j¡t	 
|¡| jƒ ¡ }| |¡}z|| ¡ 7 }W n	 tyQ   t‚w t tjj¡ ¡ }	|	 |¡}
z	|
|	 ¡ 7 }
W |
S  tyr   t‚w )NrO   é   rV   )r'   r(   r   Ú_MAX_CLOCK_SKEWrK   r	   r
   r5   r   r   r:   r   Ú	decryptorr8   r9   r   r   r4   r6   Úunpadder)r   r*   rI   rH   r+   r,   r@   rZ   Úplaintext_paddedr[   Úunpaddedr   r   r   rF   n   s8   
ÿþ
ÿ
þÿzFernet._decrypt_datarD   )r   r   r   r!   Úclassmethodr&   r-   r)   rJ   rL   ÚstaticmethodrE   rK   rF   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   Úfernetsr   r   r   r!   Ž   s   ÿ
zMultiFernet.__init__c                 C   s   | j d  |¡S )Nr   )rb   r-   )r   Úmsgr   r   r   r-   –   s   zMultiFernet.encryptc              	   C   sb   t  |¡\}}| jD ]}z
| ||d ¡}W  n ty   Y q
w t‚t d¡}| jd  |||¡S )Nr   r   )r   rE   rb   rF   r   r#   r$   r)   )r   rd   rI   r*   ÚfÚpr,   r   r   r   Úrotate™   s   
ÿ
zMultiFernet.rotateNc              	   C   s4   | j D ]}z	| ||¡W   S  ty   Y qw t‚rD   )rb   rJ   r   )r   rd   rH   re   r   r   r   rJ   §   s   
ÿzMultiFernet.decryptrD   )r   r   r   r!   r-   rg   rJ   r   r   r   r   r`   �   s
    r`   )Ú
__future__r   r   r   r   rP   r#   r<   r(   rR   Úcryptography.exceptionsr   Úcryptography.hazmat.backendsr   Úcryptography.hazmat.primitivesr   r   Ú&cryptography.hazmat.primitives.ciphersr	   r
   r   Ú#cryptography.hazmat.primitives.hmacr   Ú	Exceptionr   rY   Úobjectr   r`   r   r   r   r   Ú<module>   s    p