<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet"
        integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin="anonymous">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.3.0/css/all.min.css"
        integrity="sha512-SzlrxWUlpfuzQ+pcUCosxcglQRNAq/DZjVsC0lE40xsADsfeQoEypE+enwcOiGjk/bSuGGKHEyjSoQ1zVisanQ=="
        crossorigin="anonymous" referrerpolicy="no-referrer" />
</head>
</html>
3
l_\                 @   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)_get_backend)hashespadding)Cipher
algorithmsmodes)HMACc               @   s   e Zd ZdS )InvalidTokenN)__name__
__module____qualname__ r   r   /usr/lib64/python3.6/fernet.pyr      s   r   <   c               @   sp   e Zd ZdddZedd Zdd Zdd	 Zd
d ZdddZ	dd Z
dd Zedd Zdd Zdd ZdS )FernetNc             C   sL   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   | j |ttj S )N)encrypt_at_timeinttime)r   datar   r   r   encrypt0   s    zFernet.encryptc             C   s   t jd}| j|||S )Nr   )r$   r%   _encrypt_from_parts)r   r+   current_timeivr   r   r   r(   3   s    
zFernet.encrypt_at_timec             C   s   t j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 )Nr+      z>Q)r!   )r   _check_bytesr	   PKCS7r   AES
block_sizepadderupdatefinalizer
   r   r   CBCr   	encryptorstructpackr   r   r   SHA256r   r#   )r   r+   r.   r/   r5   Zpadded_datar9   
ciphertextZbasic_partshZhmacr   r   r   r-   7   s    
zFernet._encrypt_from_partsc             C   s&   t j|\}}| j|||ttj S )N)r   _get_unverified_token_data_decrypt_datar)   r*   )r   tokenttl	timestampr+   r   r   r   decryptJ   s    zFernet.decryptc             C   s.   |d krt dtj|\}}| j||||S )Nz6decrypt_at_time() can only be used with a non-None ttl)r   r   r?   r@   )r   rA   rB   r.   rC   r+   r   r   r   decrypt_at_timeN   s
    zFernet.decrypt_at_timec             C   s   t j|\}}| j| |S )N)r   r?   _verify_signature)r   rA   rC   r+   r   r   r   extract_timestampV   s    
zFernet.extract_timestampc             C   s   t jd|  ytj| }W n ttjfk
r8   tY nX | sPtj	|ddkrTtyt
jd|dd \}W n t
jk
r   tY nX ||fS )NrA   r      z>Q   	   )r   r1   r   r   	TypeErrorbinasciiErrorr   sixZ
indexbytesr:   unpackerror)rA   r+   rC   r   r   r   r?   \   s    

z!Fernet._get_unverified_token_datac             C   s\   t | jtj | jd}|j|d d  y|j|dd   W n tk
rV   tY nX d S )N)r!   r   ii)	r   r   r   r<   r   r6   Zverifyr   r   )r   r+   r>   r   r   r   rF   m   s    zFernet._verify_signaturec             C   s   |d k	r(|| |k rt |t |k r(t | j| |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 )NrJ      r   i)r   _MAX_CLOCK_SKEWrF   r
   r   r3   r   r   r8   r   	decryptorr6   r7   r   r	   r2   r4   unpadder)r   r+   rC   rB   r.   r/   r=   rS   Zplaintext_paddedrT   Zunpaddedr   r   r   r@   u   s,    




zFernet._decrypt_data)N)N)r   r   r   r"   classmethodr'   r,   r(   r-   rD   rE   rG   staticmethodr?   rF   r@   r   r   r   r   r      s   

r   c               @   s>   e Zd Zdd Zdd Zdd Zdd Zdd
dZ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 |ttj S )N)r(   r)   r*   )r   msgr   r   r   r,      s    zMultiFernet.encryptc             C   s   | j d j||S )Nr   )rY   r(   )r   rZ   r.   r   r   r   r(      s    zMultiFernet.encrypt_at_timec             C   sl   t j|\}}x>| jD ]0}y|j||d d }P W q tk
rD   Y qX qW ttjd}| jd j|||S )Nr   r   )r   r?   rY   r@   r   r$   r%   r-   )r   rZ   rC   r+   fpr/   r   r   r   rotate   s    

zMultiFernet.rotateNc             C   s:   x0| j D ]&}y|j||S  tk
r,   Y qX qW td S )N)rY   rD   r   )r   rZ   rB   r[   r   r   r   rD      s    
zMultiFernet.decryptc             C   s<   x2| j D ](}y|j|||S  tk
r.   Y qX qW td S )N)rY   rE   r   )r   rZ   rB   r.   r[   r   r   r   rE      s    
zMultiFernet.decrypt_at_time)N)	r   r   r   r"   r,   r(   r]   rD   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    u