o
    b                     @   s   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 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 )    N)utils)InvalidSignature)_get_backend)Backend)hashespadding)Cipher
algorithmsmodes)HMACc                   @   s   e Zd ZdS )InvalidTokenN)__name__
__module____qualname__ r   r   R/var/www/secure340b-portal/env/lib/python3.10/site-packages/cryptography/fernet.pyr      s    r   <   c                	   @   s,  e Zd Z	d"dejeef deje fddZ	e
defddZd	edefd
dZd	ededefddZd	edededefddZd"dedeje defddZdedededefddZdedefddZededejeef fddZd	eddfddZd	ededejejeef  defd d!ZdS )#FernetNkeybackendc                 C   sL   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)selfr   r   r   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datac                 C      |  |tt S Nencrypt_at_timeinttime)r   r'   r   r   r   encrypt3      zFernet.encryptcurrent_timec                 C   s   t d}| |||S )Nr   )r#   r$   _encrypt_from_parts)r   r'   r0   ivr   r   r   r+   6   s   
zFernet.encrypt_at_timer2   c                 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structpackr   r   r   SHA256r   r"   )r   r'   r0   r2   r:   Zpadded_datar>   
ciphertextZbasic_partshhmacr   r   r   r1   :   s   
zFernet._encrypt_from_partstokenttlc                 C   s:   t |\}}|d u rd }n|tt f}| |||S r)   )r   _get_unverified_token_datar,   r-   _decrypt_data)r   rE   rF   	timestampr'   	time_infor   r   r   decryptO   s
   zFernet.decryptc                 C   s0   |d u rt dt|\}}| ||||fS )Nz6decrypt_at_time() can only be used with a non-None ttl)r   r   rG   rH   )r   rE   rF   r0   rI   r'   r   r   r   decrypt_at_timeW   s   zFernet.decrypt_at_timec                 C   s   t |\}}| | |S r)   )r   rG   _verify_signature)r   rE   rI   r'   r   r   r   extract_timestampa   s   
zFernet.extract_timestampc              	   C   s~   t d|  zt| }W n ttjfy   tw |r"|d dkr$tzt	d|dd \}W ||fS  tj
y>   tw )NrE   r      r4      	   )r   r6   r   r   	TypeErrorbinasciiErrorr   r?   unpackerror)rE   r'   rI   r   r   r   rG   g   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 )Nr5   )	r   r   r   rA   r   r;   verifyr   r   )r   r'   rC   r   r   r   rM   x   s   zFernet._verify_signaturerI   rJ   c                 C   s   |d ur|\}}|| |k rt |t |k rt | | |dd }|dd }tt| jt|| j	
 }||}	z|	| 7 }	W n	 tyO   t w ttjj }
|
|	}z	||
 7 }W |S  typ   t w )NrQ      rW   )r   _MAX_CLOCK_SKEWrM   r   r	   r8   r   r
   r=   r   	decryptorr;   r<   r   r   r7   r9   unpadder)r   r'   rI   rJ   rF   r0   r2   rB   r[   Zplaintext_paddedr\   Zunpaddedr   r   r   rH      s8   


zFernet._decrypt_datar)   )r   r   r   typingUnionbytesstrOptionalr   r    classmethodr&   r.   r,   r+   r1   rK   rL   rN   staticmethodTuplerG   rM   rH   r   r   r   r   r      sV    



r   c                   @   s   e Zd Zdeje fddZdedefddZdede	defd	d
Z
dedefddZddedeje	 defddZdede	de	def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   rf   r   r   r   r       s   
zMultiFernet.__init__msgr!   c                 C   r(   r)   r*   )r   ri   r   r   r   r.      r/   zMultiFernet.encryptr0   c                 C   s   | j d ||S )Nr   )rh   r+   )r   ri   r0   r   r   r   r+      s   zMultiFernet.encrypt_at_timec              	   C   sb   t |\}}| jD ]}z
|||d }W  n ty   Y q
w ttd}| jd |||S )Nr   r   )r   rG   rh   rH   r   r#   r$   r1   )r   ri   rI   r'   fpr2   r   r   r   rotate   s   

zMultiFernet.rotateNrF   c              	   C   s4   | j D ]}z	|||W   S  ty   Y qw tr)   )rh   rK   r   )r   ri   rF   rj   r   r   r   rK      s   
zMultiFernet.decryptc              	   C   s6   | j D ]}z
||||W   S  ty   Y qw tr)   )rh   rL   r   )r   ri   rF   r0   rj   r   r   r   rL      s   
zMultiFernet.decrypt_at_timer)   )r   r   r   r]   Iterabler   r    r_   r.   r,   r+   rl   ra   rK   rL   r   r   r   r   re      s    re   )r   rS   r#   r?   r-   r]   Zcryptographyr   Zcryptography.exceptionsr   Zcryptography.hazmat.backendsr   Z'cryptography.hazmat.backends.interfacesr   Zcryptography.hazmat.primitivesr   r   Z&cryptography.hazmat.primitives.ciphersr   r	   r
   Z#cryptography.hazmat.primitives.hmacr   	Exceptionr   rZ   objectr   re   r   r   r   r   <module>   s$    