U
    ¶[ÖeŠ  ã                   @   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   úU/var/www/html/services/stratfitenv/lib/python3.8/site-packages/cryptography/fernet.pyr      s   r   é<   c                   @   sô   e Zd Zd!edœdd„Zeedœdd„ƒZeedœd	d
„Zeeedœdd„Z	eeeedœdd„Z
d"eeje edœdd„Zeeeedœdd„Zeedœdd„Zeeejeef dœdd„ƒZeddœdd„Zeeejejeef  edœ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)Údatar    c                 C   s   |   |tt ¡ ƒ¡S ©N©Úencrypt_at_timeÚintÚtime)r   r&   r   r   r   Úencrypt.   s    zFernet.encrypt)r&   Úcurrent_timer    c                 C   s   t  d¡}|  |||¡S )Nr   )r"   r#   Ú_encrypt_from_parts)r   r&   r-   Úivr   r   r   r)   1   s    
zFernet.encrypt_at_time)r&   r-   r/   r    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-   r/   r7   Zpadded_datar;   Ú
ciphertextZbasic_partsÚhÚhmacr   r   r   r.   5   s    
  ÿÿ
zFernet._encrypt_from_parts)ÚtokenÚttlr    c                 C   s:   t  |¡\}}|d krd }n|tt ¡ ƒf}|  |||¡S r'   )r   Ú_get_unverified_token_datar*   r+   Ú_decrypt_data)r   rB   rC   Ú	timestampr&   Ú	time_infor   r   r   ÚdecryptJ   s
    zFernet.decrypt)rB   rC   r-   r    c                 C   s0   |d krt dƒ‚t |¡\}}|  ||||f¡S )Nz6decrypt_at_time() can only be used with a non-None ttl)r   r   rD   rE   )r   rB   rC   r-   rF   r&   r   r   r   Údecrypt_at_timeR   s    ÿzFernet.decrypt_at_time)rB   r    c                 C   s   t  |¡\}}|  |¡ |S r'   )r   rD   Ú_verify_signature)r   rB   rF   r&   r   r   r   Úextract_timestamp\   s    
zFernet.extract_timestampc              	   C   sŒ   t  d| ¡ zt | ¡}W n ttjfk
r8   t‚Y nX |rJ|d dkrNt‚zt 	d|dd… ¡\}W n tj
k
r‚   t‚Y nX ||fS )NrB   r   é€   r1   é   é	   )r   r3   r   r   Ú	TypeErrorÚbinasciiÚErrorr   r<   ÚunpackÚerror)rB   r&   rF   r   r   r   rD   b   s    

z!Fernet._get_unverified_token_datac                 C   s\   t | jt ¡ | jd}| |d d… ¡ z| |dd … ¡ W n tk
rV   t‚Y nX d S )Nr2   éàÿÿÿ)	r
   r   r   r>   r   r8   Úverifyr   r   )r   r&   r@   r   r   r   rJ   s   s    zFernet._verify_signature)r&   rF   rG   r    c                 C   sð   |d k	r0|\}}|| |k r t ‚|t |k r0t ‚|  |¡ |dd… }|dd… }tt | j¡t |¡| j	ƒ 
¡ }| |¡}	z|	| ¡ 7 }	W n tk
r¤   t ‚Y nX t tjj¡ ¡ }
|
 |	¡}z||
 ¡ 7 }W n tk
rê   t ‚Y nX |S )NrN   é   rT   )r   Ú_MAX_CLOCK_SKEWrJ   r   r   r5   r   r	   r:   r   Ú	decryptorr8   r9   r   r   r4   r6   Úunpadder)r   r&   rF   rG   rC   r-   r/   r?   rX   Zplaintext_paddedrY   Zunpaddedr   r   r   rE   {   s4    

  ÿ



zFernet._decrypt_data)N)N)r   r   r   Úbytesr   Úclassmethodr%   r,   r*   r)   r.   ÚtypingÚOptionalrH   rI   rK   ÚstaticmethodÚTuplerD   rJ   rE   r   r   r   r   r      s2     þ	  þ

ûr   c                   @   s€   e Zd Zeje dœdd„Zeedœdd„Zee	edœdd	„Z
eedœd
d„Zdeeje	 edœdd„Zee	e	edœ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   ra   r   r   r   r       s    ÿzMultiFernet.__init__)Úmsgr    c                 C   s   |   |tt ¡ ƒ¡S r'   r(   )r   rd   r   r   r   r,   ¨   s    zMultiFernet.encrypt)rd   r-   r    c                 C   s   | j d  ||¡S )Nr   )rc   r)   )r   rd   r-   r   r   r   r)   «   s    zMultiFernet.encrypt_at_timec              	   C   sj   t  |¡\}}| jD ]2}z| ||d ¡}W  qLW q tk
rD   Y qX qt‚t d¡}| jd  |||¡S )Nr   r   )r   rD   rc   rE   r   r"   r#   r.   )r   rd   rF   r&   ÚfÚpr/   r   r   r   Úrotate®   s    


zMultiFernet.rotateN)rd   rC   r    c              	   C   s<   | j D ],}z| ||¡W   S  tk
r0   Y qX qt‚d S r'   )rc   rH   r   )r   rd   rC   re   r   r   r   rH   ¼   s    
zMultiFernet.decrypt)rd   rC   r-   r    c              	   C   s>   | j D ].}z| |||¡W   S  tk
r2   Y qX qt‚d S r'   )rc   rI   r   )r   rd   rC   r-   re   r   r   r   rI   Ä   s    
zMultiFernet.decrypt_at_time)N)r   r   r   r\   ÚIterabler   r   rZ   r,   r*   r)   rg   r]   rH   rI   r   r   r   r   r`   Ÿ   s   	  þr`   )r   rP   r"   r<   r+   r\   Z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   rW   Úobjectr   r`   r   r   r   r   Ú<module>   s     