3 l�_\�@s�ddlmZmZmZddlZddlZddlZddlZddlZddl Z ddl m Z ddl m Z ddlmZddlmZmZddlmZmZmZddlmZGd d �d e�Zd ZGd d �d e�ZGdd�de�ZdS)�)�absolute_import�division�print_functionN)�utils)�InvalidSignature)� _get_backend)�hashes�padding)�Cipher� algorithms�modes)�HMACc@s eZdZdS)� InvalidTokenN)�__name__� __module__� __qualname__�rr�/usr/lib64/python3.6/fernet.pyrsr�<c@speZdZddd�Zedd��Zdd�Zdd �Zd d �Zdd d �Z dd�Z dd�Z e dd��Z dd�Zdd�ZdS)�FernetNcCsLt|�}tj|�}t|�dkr&td��|dd�|_|dd�|_||_dS)N� z4Fernet key must be 32 url-safe base64-encoded bytes.�)r�base64�urlsafe_b64decode�len� ValueError� _signing_key�_encryption_key�_backend)�self�key�backendrrr�__init__s  zFernet.__init__cCstjtjd��S)Nr)r�urlsafe_b64encode�os�urandom)�clsrrr� generate_key,szFernet.generate_keycCs|j|ttj���S)N)�encrypt_at_time�int�time)r�datarrr�encrypt0szFernet.encryptcCstjd�}|j|||�S)Nr)r$r%�_encrypt_from_parts)rr+� current_time�ivrrrr(3s zFernet.encrypt_at_timec Cs�tjd|�tjtjj�j�}|j|�|j �}t tj|j �t j |�|j�j�}|j|�|j �}dtjd|�||}t|jtj�|jd�} | j|�| j �} tj|| �S)Nr+��z>Q)r!)r� _check_bytesr �PKCS7r �AES� block_size�padder�update�finalizer rr �CBCr� encryptor�struct�packr rr�SHA256rr#) rr+r.r/r5Z padded_datar9� ciphertextZ basic_parts�hZhmacrrrr-7s  zFernet._encrypt_from_partscCs&tj|�\}}|j|||ttj���S)N)r�_get_unverified_token_data� _decrypt_datar)r*)r�token�ttl� timestampr+rrr�decryptJszFernet.decryptcCs.|dkrtd��tj|�\}}|j||||�S)Nz6decrypt_at_time() can only be used with a non-None ttl)rrr?r@)rrArBr.rCr+rrr�decrypt_at_timeNs zFernet.decrypt_at_timecCstj|�\}}|j|�|S)N)rr?�_verify_signature)rrArCr+rrr�extract_timestampVs zFernet.extract_timestampcCs�tjd|�ytj|�}Wnttjfk r8t�YnX| sPtj |d�dkrTt�yt j d|dd��\}Wnt j k r�t�YnX||fS)NrAr�z>Q�� ) rr1rr� TypeError�binascii�Errorr�sixZ indexbytesr:�unpack�error)rAr+rCrrrr?\s   z!Fernet._get_unverified_token_datac Cs\t|jtj�|jd�}|j|dd��y|j|dd��Wntk rVt�YnXdS)N)r!ri����i����) r rrr<rr6Zverifyrr)rr+r>rrrrFms zFernet._verify_signaturec Cs�|dk r(|||krt�|t|kr(t�|j|�|dd�}|dd�}ttj|j�tj|�|j �j �}|j |�}y||j �7}Wnt k r�t�YnXtjtjj�j�} | j |�} y| | j �7} Wnt k r�t�YnX| S)NrJ�ri����)r�_MAX_CLOCK_SKEWrFr r r3rr r8r� decryptorr6r7rr r2r4�unpadder) rr+rCrBr.r/r=rSZplaintext_paddedrTZunpaddedrrrr@us,         zFernet._decrypt_data)N)N)rrrr"� classmethodr'r,r(r-rDrErG� staticmethodr?rFr@rrrrrs   rc@s>eZdZdd�Zdd�Zdd�Zdd�Zdd d �Zd d �Zd S)� MultiFernetcCst|�}|std��||_dS)Nz1MultiFernet requires at least one Fernet instance)�listr�_fernets)rZfernetsrrrr"�s zMultiFernet.__init__cCs|j|ttj���S)N)r(r)r*)r�msgrrrr,�szMultiFernet.encryptcCs|jdj||�S)Nr)rYr()rrZr.rrrr(�szMultiFernet.encrypt_at_timec Csltj|�\}}x>|jD]0}y|j||dd�}PWqtk rDYqXqWt�tjd�}|jdj|||�S)Nrr)rr?rYr@rr$r%r-)rrZrCr+�f�pr/rrr�rotate�s   zMultiFernet.rotateNc Cs:x0|jD]&}y |j||�Stk r,YqXqWt�dS)N)rYrDr)rrZrBr[rrrrD�s    zMultiFernet.decryptc Cs<x2|jD](}y|j|||�Stk r.YqXqWt�dS)N)rYrEr)rrZrBr.r[rrrrE�s   zMultiFernet.decrypt_at_time)N) rrrr"r,r(r]rDrErrrrrW�s  rW)Z __future__rrrrrLr$r:r*rNZ cryptographyrZcryptography.exceptionsrZcryptography.hazmat.backendsrZcryptography.hazmat.primitivesrr Z&cryptography.hazmat.primitives.ciphersr r r Z#cryptography.hazmat.primitives.hmacr � ExceptionrrR�objectrrWrrrr�s     u