a
    còf(  ã                   @  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   úP/home/httpd/docs/test/DocsMgr/lib/python3.9/site-packages/cryptography/fernet.pyr      s   r   é<   c                   @  sØ   e Zd Zd)ddddœdd„Zedd	œd
d„ƒZdddœdd„Zddddœdd„Zdddddœdd„Zd*ddddœdd„Z	dddddœdd„Z
dddœdd„Zedd dœd!d"„ƒZdddœd#d$„Zddd%dd&œd'd(„ZdS )+ÚFernetNúbytes | strz
typing.AnyÚNone)ÚkeyÚbackendÚreturnc              
   C  st   zt  |¡}W n0 tjy> } ztdƒ|‚W Y d }~n
d }~0 0 t|ƒdkrTt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__Úbytes)r   c                 C  s   t  t d¡¡S )Nr   )r   Úurlsafe_b64encodeÚosÚurandom)Úclsr   r   r   Úgenerate_key/   s    zFernet.generate_key)Údatar   c                 C  s   |   |tt ¡ ƒ¡S ©N©Úencrypt_at_timeÚintÚtime)r"   r+   r   r   r   Úencrypt3   s    zFernet.encryptr/   )r+   Úcurrent_timer   c                 C  s   t  d¡}|  |||¡S )Nr   )r'   r(   Ú_encrypt_from_parts)r"   r+   r2   Úivr   r   r   r.   6   s    
zFernet.encrypt_at_time)r+   r2   r4   r   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+   r2   r4   r>   Zpadded_datarB   Ú
ciphertextZbasic_partsÚhÚhmacr   r   r   r3   :   s(    
þÿþýÿ
zFernet._encrypt_from_partsú
int | None)ÚtokenÚttlr   c                 C  s:   t  |¡\}}|d u rd }n|tt ¡ ƒf}|  |||¡S r,   )r   Ú_get_unverified_token_datar/   r0   Ú_decrypt_data)r"   rI   rJ   Ú	timestampr+   Ú	time_infor   r   r   ÚdecryptS   s
    zFernet.decrypt)rI   rJ   r2   r   c                 C  s0   |d u rt dƒ‚t |¡\}}|  ||||f¡S )Nz6decrypt_at_time() can only be used with a non-None ttl)r   r   rK   rL   )r"   rI   rJ   r2   rM   r+   r   r   r   Údecrypt_at_time[   s    ÿzFernet.decrypt_at_time)rI   r   c                 C  s   t  |¡\}}|  |¡ |S r,   )r   rK   Ú_verify_signature)r"   rI   rM   r+   r   r   r   Úextract_timestampe   s    
zFernet.extract_timestampztuple[int, bytes]c              	   C  s„   t | ttfƒstdƒ‚zt | ¡}W n ttjfy@   t‚Y n0 |rR|d dkrVt‚t	|ƒdk rft‚t
j|dd… dd�}||fS )Nztoken must be bytes or strr   é€   é	   é   r7   )r9   )Ú
isinstanceÚstrr%   Ú	TypeErrorr   r   r   r   r   r   r/   Ú
from_bytes)rI   r+   rM   r   r   r   rK   k   s    
z!Fernet._get_unverified_token_datac                 C  sT   t | jt ¡ ƒ}| |d d… ¡ z| |dd … ¡ W n tyN   t‚Y n0 d S )Néàÿÿÿ)r
   r    r   rD   r?   Úverifyr   r   )r"   r+   rF   r   r   r   rQ   ~   s    zFernet._verify_signatureztuple[int, int] | None)r+   rM   rN   r   c                 C  sè   |d ur0|\}}|| |k r t ‚|t |k r0t ‚|  |¡ |dd… }|dd… }tt | j¡t |¡ƒ 	¡ }| 
|¡}	z|	| ¡ 7 }	W n tyž   t ‚Y n0 t tjj¡ ¡ }
|
 
|	¡}z||
 ¡ 7 }W n tyâ   t ‚Y n0 |S )NrT   é   rZ   )r   Ú_MAX_CLOCK_SKEWrQ   r   r   r<   r!   r	   rA   Ú	decryptorr?   r@   r   r   r;   r=   Úunpadder)r"   r+   rM   rN   rJ   r2   r4   rE   r^   Zplaintext_paddedr_   Zunpaddedr   r   r   rL   †   s0    
ÿ



zFernet._decrypt_data)N)N)r   r   r   r$   Úclassmethodr*   r1   r.   r3   rO   rP   rR   ÚstaticmethodrK   rQ   rL   r   r   r   r   r      s    ý
r   c                   @  st   e Zd Zddœdd„Zdddœdd„Zdd	dd
œdd„Zdddœdd„Zdddddœdd„Zdd	d	ddœdd„ZdS )ÚMultiFernetztyping.Iterable[Fernet])Úfernetsc                 C  s   t |ƒ}|stdƒ‚|| _d S )Nz1MultiFernet requires at least one Fernet instance)Úlistr   Ú_fernets)r"   rc   r   r   r   r$   «   s    ÿzMultiFernet.__init__r%   )Úmsgr   c                 C  s   |   |tt ¡ ƒ¡S r,   r-   )r"   rf   r   r   r   r1   ³   s    zMultiFernet.encryptr/   )rf   r2   r   c                 C  s   | j d  ||¡S )Nr   )re   r.   )r"   rf   r2   r   r   r   r.   ¶   s    zMultiFernet.encrypt_at_timer   c              	   C  sh   t  |¡\}}| jD ]0}z| ||d ¡}W  qJW q tyB   Y q0 qt‚t d¡}| jd  |||¡S )Nr   r   )r   rK   re   rL   r   r'   r(   r3   )r"   rf   rM   r+   ÚfÚpr4   r   r   r   Úrotate¹   s    


zMultiFernet.rotateNrH   )rf   rJ   r   c              	   C  s:   | j D ]*}z| ||¡W   S  ty.   Y q0 qt‚d S r,   )re   rO   r   )r"   rf   rJ   rg   r   r   r   rO   Ç   s    
zMultiFernet.decrypt)rf   rJ   r2   r   c              	   C  s<   | j D ],}z| |||¡W   S  ty0   Y q0 qt‚d S r,   )re   rP   r   )r"   rf   rJ   r2   rg   r   r   r   rP   Ï   s    
zMultiFernet.decrypt_at_time)N)	r   r   r   r$   r1   r.   ri   rO   rP   r   r   r   r   rb   ª   s   rb   )Ú
__future__r   r   r   r'   r0   ÚtypingZcryptographyr   Zcryptography.exceptionsr   Zcryptography.hazmat.primitivesr   r   Z&cryptography.hazmat.primitives.ciphersr   r   r	   Z#cryptography.hazmat.primitives.hmacr
   Ú	Exceptionr   r]   r   rb   r   r   r   r   Ú<module>   s    