U
    •õ²cÃ  ã                   @   s¤   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 )é    N)Úutils)ÚInvalidSignature)ÚhashesÚpadding)ÚCipherÚ
algorithmsÚmodes)ÚHMACc                   @   s   e Zd ZdS )ÚInvalidTokenN)Ú__name__Ú
__module__Ú__qualname__© r   r   ú2lib/python3.8/site-packages/cryptography/fernet.pyr
      s   r
   é<   c                   @   s,  e Zd Zd!ejeef ejd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jeef eje edœdd„Zejeef eeedœdd„Zejeef edœdd„Zeejeef 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)ÚkeyÚbackendÚreturnc              
   C   sr   zt  |¡}W n. tjk
r< } ztdƒ|‚W 5 d }~X Y nX t|ƒdkrRt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__)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   Úencrypt2   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*   5   s    
zFernet.encrypt_at_time)r'   r.   r0   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)ZlengthÚ	byteorder)r   Ú_check_bytesr   ÚPKCS7r   ÚAESÚ
block_sizeÚpadderÚupdateÚfinalizer   r   r   ÚCBCÚ	encryptorÚto_bytesr	   r   r   ÚSHA256r   r"   )r   r'   r.   r0   r9   Zpadded_datar=   Ú
ciphertextZbasic_partsÚhZhmacr   r   r   r/   9   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   ÚdecryptR   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_time\   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_timestampf   s    
zFernet.extract_timestampc              	   C   s†   t | ttfƒstdƒ‚zt | ¡}W n ttjfk
rB   t‚Y nX |rT|d dkrXt‚t	|ƒdk rht‚t
j|dd… dd}||fS )Nztoken must be bytes or strr   é€   é	   é   r3   )r4   )Ú
isinstanceÚstrÚbytesÚ	TypeErrorr   r   r   r   r
   r   r+   Ú
from_bytes)rB   r'   rF   r   r   r   rD   l   s    
z!Fernet._get_unverified_token_datac                 C   sV   t | jt ¡ ƒ}| |d d… ¡ z| |dd … ¡ W n tk
rP   t‚Y nX d S )Néàÿÿÿ)r	   r   r   r?   r:   Zverifyr   r
   )r   r'   rA   r   r   r   rJ      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 |¡ƒ 	¡ }| 
|¡}	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 )NrM   é   rT   )r
   Ú_MAX_CLOCK_SKEWrJ   r   r   r7   r   r   r<   Ú	decryptorr:   r;   r   r   r6   r8   Úunpadder)r   r'   rF   rG   rC   r.   r0   r@   rW   Zplaintext_paddedrX   Zunpaddedr   r   r   rE   ‰   s2    

 ÿ



zFernet._decrypt_data)N)N)r   r   r   ÚtypingÚUnionrQ   rP   ZAnyr!   Úclassmethodr&   r-   r+   r*   r/   ÚOptionalrH   rI   rK   ÚstaticmethodZTuplerD   rJ   rE   r   r   r   r   r      sJ    ýü  þ ÿ þ  þ
þ
û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jeef edœd
d„Zdejeef eje	 edœdd„Zejeef 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   r_   r   r   r   r!   ®   s    ÿzMultiFernet.__init__)Úmsgr   c                 C   s   |   |tt ¡ ƒ¡S r(   r)   )r   rb   r   r   r   r-   ¶   s    zMultiFernet.encrypt)rb   r.   r   c                 C   s   | j d  ||¡S )Nr   )ra   r*   )r   rb   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   ra   rE   r
   r#   r$   r/   )r   rb   rF   r'   ÚfÚpr0   r   r   r   Úrotate¼   s    


zMultiFernet.rotateN)rb   rC   r   c              	   C   s<   | j D ],}z| ||¡W   S  tk
r0   Y qX qt‚d S r(   )ra   rH   r
   )r   rb   rC   rc   r   r   r   rH   Ê   s    
zMultiFernet.decrypt)rb   rC   r.   r   c              	   C   s>   | j D ].}z| |||¡W   S  tk
r2   Y qX qt‚d S r(   )ra   rI   r
   )r   rb   rC   r.   rc   r   r   r   rI   Ô   s    
zMultiFernet.decrypt_at_time)N)r   r   r   rY   ÚIterabler   r!   rQ   r-   r+   r*   rZ   rP   re   r\   rH   rI   r   r   r   r   r^   ­   s    ÿ þ  þr^   )r   r   r#   r,   rY   Zcryptographyr   Zcryptography.exceptionsr   Zcryptography.hazmat.primitivesr   r   Z&cryptography.hazmat.primitives.ciphersr   r   r   Z#cryptography.hazmat.primitives.hmacr	   Ú	Exceptionr
   rV   r   r^   r   r   r   r   Ú<module>   s    