U
    /2‹i3  ã                   @  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 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)ÚIterable)Úutils)ÚInvalidSignature)ÚhashesÚpadding)ÚCipherÚ
algorithmsÚmodes)ÚHMACc                   @  s   e Zd ZdS )ÚInvalidTokenN)Ú__name__Ú
__module__Ú__qualname__© r   r   ú7/tmp/pip-unpacked-wheel-d9r6v89i/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  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__Úbytes)r   c                 C  s   t  t d¡¡S )Nr   )r   Úurlsafe_b64encodeÚosÚurandom)Úclsr   r   r   Úgenerate_key0   s    zFernet.generate_key)Údatar   c                 C  s   |   |tt ¡ ƒ¡S ©N©Úencrypt_at_timeÚintÚtime)r#   r,   r   r   r   Úencrypt4   s    zFernet.encryptr0   )r,   Úcurrent_timer   c                 C  s   t  d¡}|  |||¡S )Nr   )r(   r)   Ú_encrypt_from_parts)r#   r,   r3   Úivr   r   r   r/   7   s    
zFernet.encrypt_at_time)r,   r3   r5   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,   r3   r5   r?   Zpadded_datarC   Ú
ciphertextZbasic_partsÚhÚhmacr   r   r   r4   ;   s(    
þÿþýÿ
zFernet._encrypt_from_partsú
int | None)ÚtokenÚttlr   c                 C  s:   t  |¡\}}|d krd }n|tt ¡ ƒf}|  |||¡S r-   )r   Ú_get_unverified_token_datar0   r1   Ú_decrypt_data)r#   rJ   rK   Ú	timestampr,   Ú	time_infor   r   r   ÚdecryptT   s
    zFernet.decrypt)rJ   rK   r3   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   rL   rM   )r#   rJ   rK   r3   rN   r,   r   r   r   Údecrypt_at_time\   s    ÿzFernet.decrypt_at_time)rJ   r   c                 C  s   t  |¡\}}|  |¡ |S r-   )r   rL   Ú_verify_signature)r#   rJ   rN   r,   r   r   r   Úextract_timestampf   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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   é€   é	   é   r8   )r:   )Ú
isinstanceÚstrr&   Ú	TypeErrorr   r   r   r   r   r    r0   Ú
from_bytes)rJ   r,   rN   r   r   r   rL   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   rE   r@   Úverifyr   r   )r#   r,   rG   r   r   r   rR      s    zFernet._verify_signatureztuple[int, int] | None)r,   rN   rO   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 )NrU   é   r[   )r   Ú_MAX_CLOCK_SKEWrR   r   r	   r=   r"   r
   rB   Ú	decryptorr@   rA   r   r   r<   r>   Úunpadder)r#   r,   rN   rO   rK   r3   r5   rF   r_   Zplaintext_paddedr`   Zunpaddedr   r   r   rM   ‡   s2    

 ÿ



zFernet._decrypt_data)N)N)r   r   r   r%   Úclassmethodr+   r2   r/   r4   rP   rQ   rS   ÚstaticmethodrL   rR   rM   r   r   r   r   r      s    ý
r   c                   @  s„   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d	dœdd„Z	dS )ÚMultiFernetzIterable[Fernet])Úfernetsc                 C  s   t |ƒ}|stdƒ‚|| _d S )Nz1MultiFernet requires at least one Fernet instance)Úlistr   Ú_fernets)r#   rd   r   r   r   r%   ¬   s    ÿzMultiFernet.__init__r&   )Úmsgr   c                 C  s   |   |tt ¡ ƒ¡S r-   r.   )r#   rg   r   r   r   r2   ´   s    zMultiFernet.encryptr0   )rg   r3   r   c                 C  s   | j d  ||¡S )Nr   )rf   r/   )r#   rg   r3   r   r   r   r/   ·   s    zMultiFernet.encrypt_at_timer   c              	   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   rL   rf   rM   r   r(   r)   r4   )r#   rg   rN   r,   ÚfÚpr5   r   r   r   Úrotateº   s    


zMultiFernet.rotateNrI   )rg   rK   r   c              	   C  s<   | j D ],}z| ||¡W   S  tk
r0   Y qX qt‚d S r-   )rf   rP   r   )r#   rg   rK   rh   r   r   r   rP   È   s    
zMultiFernet.decrypt)rg   rK   r3   r   c              	   C  s>   | j D ].}z| |||¡W   S  tk
r2   Y qX qt‚d S r-   )rf   rQ   r   )r#   rg   rK   r3   rh   r   r   r   rQ   Ð   s    
zMultiFernet.decrypt_at_timec              	   C  s:   | j D ]*}z| |¡W   S  tk
r.   Y qX qt‚d S r-   )rf   rS   r   )r#   rg   rh   r   r   r   rS   Ú   s    
zMultiFernet.extract_timestamp)N)
r   r   r   r%   r2   r/   rj   rP   rQ   rS   r   r   r   r   rc   «   s   
rc   )Ú
__future__r   r   r   r(   r1   ÚtypingÚcollections.abcr   Zcryptographyr   Zcryptography.exceptionsr   Zcryptography.hazmat.primitivesr   r   Z&cryptography.hazmat.primitives.ciphersr   r	   r
   Z#cryptography.hazmat.primitives.hmacr   Ú	Exceptionr   r^   r   rc   r   r   r   r   Ú<module>   s     