o
    okj                     @  s   d dl 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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edZe ZG dd dZG dd dZdS )    )annotationsN)Iterable)utils)InvalidSignature)hashespadding)Cipher
algorithmsmodes)HMACc                   @  s   e Zd ZdS )InvalidTokenN)__name__
__module____qualname__ r   r   Q/home/djax/ivt_ai_plugin/venv/lib/python3.10/site-packages/cryptography/fernet.pyr      s    r   <      c                   @  s   e Zd Z	d*d+dd	Zed,ddZd-ddZd.ddZd/ddZd*d0ddZ	d1ddZ
d2ddZed3d!d"Zd4d#d$Zd5d(d)ZdS )6FernetNkeybytes | strbackend
typing.AnyreturnNonec              
   C  sv   zt |}W n tjy } ztd|d }~ww t|dkr$td|d d | _|dd  | _t	| j| _
d S )Nz4Fernet key must be 32 url-safe base64-encoded bytes.       )base64urlsafe_b64decodebinasciiError
ValueErrorlen_signing_key_encryption_keyr	   AES_aes)selfr   r   excr   r   r   __init__!   s"   zFernet.__init__bytesc                 C  s   t tdS )Nr   )r   urlsafe_b64encodeosurandom)clsr   r   r   generate_key5   s   zFernet.generate_keydatac                 C     |  |tt S Nencrypt_at_timeinttime)r'   r0   r   r   r   encrypt9      zFernet.encryptcurrent_timer5   c                 C  s   t d}| |||S )Nr   )r,   r-   _encrypt_from_parts)r'   r0   r9   ivr   r   r   r4   <   s   
zFernet.encrypt_at_timer;   c                 C  s   t d| t }|||  }t| jt	|
 }|||  }d|jddd | | }t| jt}	|	| |	 }
t||
 S )Nr0         big)length	byteorder)r   _check_bytes
_PKCS7_128padderupdatefinalizer   r&   r
   CBC	encryptorto_bytesr   r#   _SHA256r   r+   )r'   r0   r9   r;   rC   padded_datarG   
ciphertextbasic_partshhmacr   r   r   r:   @   s"   
zFernet._encrypt_from_partstokenttl
int | Nonec                 C  s:   t |\}}|d u rd }n|tt f}| |||S r2   )r   _get_unverified_token_datar5   r6   _decrypt_data)r'   rO   rP   	timestampr0   	time_infor   r   r   decryptV   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   rR   rS   )r'   rO   rP   r9   rT   r0   r   r   r   decrypt_at_time^   s   zFernet.decrypt_at_timec                 C  s   t |\}}| | |S r2   )r   rR   _verify_signature)r'   rO   rT   r0   r   r   r   extract_timestamph   s   
zFernet.extract_timestamptuple[int, bytes]c              	   C  s   t | ttfstdzt| }W n ttjfy   tw |r'|d dkr)tt	|dk r1tt
j|dd dd}||fS )Nztoken must be bytes or strr   r   	      r>   )r@   )
isinstancestrr*   	TypeErrorr   r   r   r    r   r"   r5   
from_bytes)rO   r0   rT   r   r   r   rR   n   s   z!Fernet._get_unverified_token_datac                 C  sN   t | jt}|t|d d  z||dd   W d S  ty&   tw )N)r   r#   rI   rD   
memoryviewverifyr   r   )r'   r0   rM   r   r   r   rY      s   zFernet._verify_signaturerT   rU   tuple[int, int] | Nonec                 C  s   |d ur|\}}|| |k rt |t |k rt | | t|}|dd }|dd }t| jt| }	|		|}
z|
|	
 7 }
W n	 tyN   t w t }|	|
}z	||
 7 }W |S  tyj   t w )Nr\      rb   )r   _MAX_CLOCK_SKEWrY   rc   r   r&   r
   rF   	decryptorrD   rE   r!   rB   unpadder)r'   r0   rT   rU   rP   r9   mvr;   rK   rh   plaintext_paddedri   unpaddedr   r   r   rS      s2   


zFernet._decrypt_datar2   )r   r   r   r   r   r   )r   r*   )r0   r*   r   r*   )r0   r*   r9   r5   r   r*   )r0   r*   r9   r5   r;   r*   r   r*   )rO   r   rP   rQ   r   r*   )rO   r   rP   r5   r9   r5   r   r*   )rO   r   r   r5   )rO   r   r   r[   )r0   r*   r   r   )r0   r*   rT   r5   rU   re   r   r*   )r   r   r   r)   classmethodr/   r7   r4   r:   rV   rX   rZ   staticmethodrR   rY   rS   r   r   r   r   r       s    






r   c                   @  sT   e Zd ZdddZddd	ZdddZdddZddddZd ddZd!ddZ	dS )"MultiFernetfernetsIterable[Fernet]c                 C  s   t |}|s
td|| _d S )Nz1MultiFernet requires at least one Fernet instance)listr!   _fernets)r'   rp   r   r   r   r)      s   
zMultiFernet.__init__msgr*   r   c                 C  r1   r2   r3   )r'   rt   r   r   r   r7      r8   zMultiFernet.encryptr9   r5   c                 C  s   | j d ||S )Nr   )rs   r4   )r'   rt   r9   r   r   r   r4      s   zMultiFernet.encrypt_at_timer   c              	   C  sb   t |\}}| jD ]}z
|||d }W  n ty   Y q
w ttd}| jd |||S )Nr   r   )r   rR   rs   rS   r   r,   r-   r:   )r'   rt   rT   r0   fpr;   r   r   r   rotate   s   

zMultiFernet.rotateNrP   rQ   c              	   C  sb   |d u rd }n|t t f}t|\}}| jD ]}z
||||W   S  ty.   Y qw tr2   )r5   r6   r   rR   rs   rS   r   )r'   rt   rP   rU   rT   r0   ru   r   r   r   rV      s   
zMultiFernet.decryptc              	   C  sX   |d u rt dt|\}}| jD ]}z|||||fW   S  ty)   Y qw trW   )r!   r   rR   rs   rS   r   )r'   rt   rP   r9   rT   r0   ru   r   r   r   rX      s   
zMultiFernet.decrypt_at_timec              	   C  sD   t |\}}| jD ]}z
|| |W   S  ty   Y q
w tr2   )r   rR   rs   rY   r   )r'   rt   rT   r0   ru   r   r   r   rZ      s   


zMultiFernet.extract_timestamp)rp   rq   )rt   r*   r   r*   )rt   r*   r9   r5   r   r*   )rt   r   r   r*   r2   )rt   r   rP   rQ   r   r*   )rt   r   rP   r5   r9   r5   r   r*   )rt   r   r   r5   )
r   r   r   r)   r7   r4   rw   rV   rX   rZ   r   r   r   r   ro      s    




ro   )
__future__r   r   r   r,   r6   typingcollections.abcr   cryptographyr   cryptography.exceptionsr   cryptography.hazmat.primitivesr   r   &cryptography.hazmat.primitives.ciphersr   r	   r
   #cryptography.hazmat.primitives.hmacr   	Exceptionr   rg   PKCS7rB   SHA256rI   r   ro   r   r   r   r   <module>   s&   
 