o
    )%a                     @   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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)hashespadding)Cipher
algorithmsmodes)HMACc                   @   s   e Zd ZdS )InvalidTokenN)__name__
__module____qualname__ r   r   5/usr/lib/python3/dist-packages/cryptography/fernet.pyr      s    r   <   c                	   @   s  e Zd Zd!d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keyc                 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   backendr   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   encrypt.      zFernet.encryptcurrent_timec                 C   s   t d}| |||S )Nr   )r"   r#   _encrypt_from_parts)r   r&   r/   ivr   r   r   r*   1   s   
zFernet.encrypt_at_timer1   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&   r/   r1   r9   padded_datar=   
ciphertextbasic_partshhmacr   r   r   r0   5   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   rF   rG   	timestampr&   	time_infor   r   r   decryptJ   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   rH   rI   )r   rF   rG   r/   rJ   r&   r   r   r   decrypt_at_timeR   s   zFernet.decrypt_at_timec                 C   s   t |\}}| | |S r(   )r   rH   _verify_signature)r   rF   rJ   r&   r   r   r   extract_timestamp\   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 )NrF   r      r3      	   )r   r5   r   r   	TypeErrorbinasciiErrorr   r>   unpackerror)rF   r&   rJ   r   r   r   rH   b   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 )Nr4   )	r
   r   r   r@   r   r:   verifyr   r   )r   r&   rD   r   r   r   rN   s   s   zFernet._verify_signaturerJ   rK   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 )NrR      rX   )r   _MAX_CLOCK_SKEWrN   r   r   r7   r   r	   r<   r   	decryptorr:   r;   r   r   r6   r8   unpadder)r   r&   rJ   rK   rG   r/   r1   rB   r\   plaintext_paddedr]   unpaddedr   r   r   rI   {   s8   


zFernet._decrypt_datar(   )r   r   r   bytesr   classmethodr%   r-   r+   r*   r0   typingOptionalrL   rM   rO   staticmethodTuplerH   rN   rI   r   r   r   r   r      sL    


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   rg   r   r   r   r      s   
zMultiFernet.__init__msgr    c                 C   r'   r(   r)   )r   rj   r   r   r   r-      r.   zMultiFernet.encryptr/   c                 C   s   | j d ||S )Nr   )ri   r*   )r   rj   r/   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   rH   ri   rI   r   r"   r#   r0   )r   rj   rJ   r&   fpr1   r   r   r   rotate   s   

zMultiFernet.rotateNrG   c              	   C   s4   | j D ]}z	|||W   S  ty   Y qw tr(   )ri   rL   r   )r   rj   rG   rk   r   r   r   rL      s   
zMultiFernet.decryptc              	   C   s6   | j D ]}z
||||W   S  ty   Y qw tr(   )ri   rM   r   )r   rj   rG   r/   rk   r   r   r   rM      s   
zMultiFernet.decrypt_at_timer(   )r   r   r   rb   Iterabler   r   r`   r-   r+   r*   rm   rc   rL   rM   r   r   r   r   rf      s    rf   )r   rT   r"   r>   r,   rb   cryptographyr   cryptography.exceptionsr   cryptography.hazmat.backendsr   cryptography.hazmat.primitivesr   r   &cryptography.hazmat.primitives.ciphersr   r   r	   #cryptography.hazmat.primitives.hmacr
   	Exceptionr   r[   objectr   rf   r   r   r   r   <module>   s"    