o
    i                     @  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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 )    )annotationsN)utils)InvalidSignature)hashespadding)Cipher
algorithmsmodes)HMACc                   @  s   e Zd ZdS )InvalidTokenN)__name__
__module____qualname__ r   r   G/home/ubuntu/.local/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  sh   zt |}W n tjy } ztd|d }~ww t|dkr$t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__bytesc                 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_timer1   c                 C  s   t d}| |||S )Nr   )r(   r)   _encrypt_from_parts)r#   r,   r5   ivr   r   r   r0   6   s   
zFernet.encrypt_at_timer7   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,   r5   r7   rA   padded_datarE   
ciphertextbasic_partshhmacr   r   r   r6   :   s,   

zFernet._encrypt_from_partstokenttl
int | Nonec                 C  s:   t |\}}|d u rd }n|tt f}| |||S r.   )r   _get_unverified_token_datar1   r2   _decrypt_data)r#   rM   rN   	timestampr,   	time_infor   r   r   decryptS   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   rP   rQ   )r#   rM   rN   r5   rR   r,   r   r   r   decrypt_at_time[   s   zFernet.decrypt_at_timec                 C  s   t |\}}| | |S r.   )r   rP   _verify_signature)r#   rM   rR   r,   r   r   r   extract_timestampe   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<   )
isinstancestrr&   	TypeErrorr   r   r   r   r   r    r1   
from_bytes)rM   r,   rR   r   r   r   rP   k   s   z!Fernet._get_unverified_token_datac                 C  sN   t | jt }||d d  z||dd   W d S  ty&   tw )N)r
   r!   r   rG   rB   verifyr   r   )r#   r,   rK   r   r   r   rV   ~   s   zFernet._verify_signaturerR   rS   tuple[int, int] | Nonec                 C  s   |d ur|\}}|| |k rt |t |k rt | | |dd }|dd }tt| jt|	 }|
|}	z|	| 7 }	W n	 tyM   t w ttjj }
|

|	}z	||
 7 }W |S  tyn   t w )NrZ      r`   )r   _MAX_CLOCK_SKEWrV   r   r   r?   r"   r	   rD   	decryptorrB   rC   r   r   r>   r@   unpadder)r#   r,   rR   rS   rN   r5   r7   rI   re   plaintext_paddedrf   unpaddedr   r   r   rQ      s8   


zFernet._decrypt_datar.   )r   r   r   r   r   r   )r   r&   )r,   r&   r   r&   )r,   r&   r5   r1   r   r&   )r,   r&   r5   r1   r7   r&   r   r&   )rM   r   rN   rO   r   r&   )rM   r   rN   r1   r5   r1   r   r&   )rM   r   r   r1   )rM   r   r   rX   )r,   r&   r   r   )r,   r&   rR   r1   rS   rb   r   r&   )r   r   r   r%   classmethodr+   r3   r0   r6   rT   rU   rW   staticmethodrP   rV   rQ   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typing.Iterable[Fernet]c                 C  s   t |}|s
td|| _d S )Nz1MultiFernet requires at least one Fernet instance)listr   _fernets)r#   rl   r   r   r   r%      s   
zMultiFernet.__init__msgr&   r   c                 C  r-   r.   r/   )r#   rp   r   r   r   r3      r4   zMultiFernet.encryptr5   r1   c                 C  s   | j d ||S )Nr   )ro   r0   )r#   rp   r5   r   r   r   r0      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   rP   ro   rQ   r   r(   r)   r6   )r#   rp   rR   r,   fpr7   r   r   r   rotate   s   

zMultiFernet.rotateNrN   rO   c              	   C  s4   | j D ]}z	|||W   S  ty   Y qw tr.   )ro   rT   r   )r#   rp   rN   rq   r   r   r   rT      s   
zMultiFernet.decryptc              	   C  s6   | j D ]}z
||||W   S  ty   Y qw tr.   )ro   rU   r   )r#   rp   rN   r5   rq   r   r   r   rU      s   
zMultiFernet.decrypt_at_timec              	   C  s2   | j D ]}z||W   S  ty   Y qw tr.   )ro   rW   r   )r#   rp   rq   r   r   r   rW      s   
zMultiFernet.extract_timestamp)rl   rm   )rp   r&   r   r&   )rp   r&   r5   r1   r   r&   )rp   r   r   r&   r.   )rp   r   rN   rO   r   r&   )rp   r   rN   r1   r5   r1   r   r&   )rp   r   r   r1   )
r   r   r   r%   r3   r0   rs   rT   rU   rW   r   r   r   r   rk      s    





rk   )
__future__r   r   r   r(   r2   typingcryptographyr   cryptography.exceptionsr   cryptography.hazmat.primitivesr   r   &cryptography.hazmat.primitives.ciphersr   r   r	   #cryptography.hazmat.primitives.hmacr
   	Exceptionr   rd   r   rk   r   r   r   r   <module>   s     