o
     `\                     @   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   ihome/ych/rk3568/buildroot/output/rockchip_rk3568/host/lib/python3.10/site-packages/cryptography/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|}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 tdS )Nr   )r   urlsafe_b64encodeosurandom)clsr   r   r   generate_key,   s   zFernet.generate_keyc                 C      |  |tt S Nencrypt_at_timeinttime)r   datar   r   r   encrypt0      zFernet.encryptc                 C   s   t d}| |||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 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.   r2   r3   r;   Zpadded_datar?   
ciphertextZbasic_partshhmacr   r   r   r1   7   s   
zFernet._encrypt_from_partsc                 C   s&   t |\}}| |||tt S r)   )r   _get_unverified_token_data_decrypt_datar,   r-   )r   tokenttl	timestampr.   r   r   r   decryptJ   s   zFernet.decryptc                 C   s.   |d u rt dt|\}}| ||||S )Nz6decrypt_at_time() can only be used with a non-None ttl)r   r   rF   rG   )r   rH   rI   r2   rJ   r.   r   r   r   decrypt_at_timeN   s   zFernet.decrypt_at_timec                 C   s   t |\}}| | |S r)   )r   rF   _verify_signature)r   rH   rJ   r.   r   r   r   extract_timestampV   s   
zFernet.extract_timestampc              	   C   s   t d|  zt| }W n ttjfy   tw |r$t	|ddkr&tzt
d|dd \}W ||fS  t
jy@   tw )NrH   r      r5      	   )r   r7   r   r   	TypeErrorbinasciiErrorr   sixZ
indexbytesr@   unpackerror)rH   r.   rJ   r   r   r   rF   \   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 )Nr6   )	r   r   r   rB   r   r<   verifyr   r   )r   r.   rD   r   r   r   rM   m   s   zFernet._verify_signaturec                 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yK   t w ttjj }	|	|}
z	|
|	 7 }
W |
S  tyl   t w )NrQ      rX   )r   _MAX_CLOCK_SKEWrM   r
   r   r9   r   r   r>   r   	decryptorr<   r=   r   r	   r8   r:   unpadder)r   r.   rJ   rI   r2   r3   rC   r\   Zplaintext_paddedr]   Zunpaddedr   r   r   rG   u   s6   


zFernet._decrypt_datar)   )r   r   r   r"   classmethodr'   r/   r+   r1   rK   rL   rN   staticmethodrF   rM   rG   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   r(   r)   r*   )r   msgr   r   r   r/      r0   zMultiFernet.encryptc                 C   s   | j d ||S )Nr   )rb   r+   )r   rc   r2   r   r   r   r+      s   zMultiFernet.encrypt_at_timec              	   C   sd   t |\}}| jD ]}z|||d d }W  n ty    Y q
w ttd}| jd |||S )Nr   r   )r   rF   rb   rG   r   r$   r%   r1   )r   rc   rJ   r.   fpr3   r   r   r   rotate   s   

zMultiFernet.rotateNc              	   C   s4   | j D ]}z	|||W   S  ty   Y qw tr)   )rb   rK   r   )r   rc   rI   rd   r   r   r   rK      s   
zMultiFernet.decryptc              	   C   s6   | j D ]}z
||||W   S  ty   Y qw tr)   )rb   rL   r   )r   rc   rI   r2   rd   r   r   r   rL      s   
zMultiFernet.decrypt_at_timer)   )	r   r   r   r"   r/   r+   rf   rK   rL   r   r   r   r   r`      s    
r`   )
__future__r   r   r   r   rS   r$   r@   r-   rU   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   r[   objectr   r`   r   r   r   r   <module>   s"   u