
ÛÔ,YÑ  ã               @   s  d  d l  m Z m Z 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	 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 Gd d	 „  d	 e ƒ Z d
 Z Gd d „  d e ƒ Z Gd d „  d e ƒ Z d S)é    )Úabsolute_importÚdivisionÚprint_functionN)ÚInvalidSignature)Údefault_backend)ÚhashesÚpadding)ÚCipherÚ
algorithmsÚmodes)ÚHMACc               @   s   e  Z d  Z d S)ÚInvalidTokenN)Ú__name__Ú
__module__Ú__qualname__© r   r   ú5/usr/lib/python3/dist-packages/cryptography/fernet.pyr      s   r   é<   c               @   sX   e  Z d  Z d d d „ Z e d d „  ƒ Z d d „  Z d d	 „  Z d d
 d „ Z d S)ÚFernetNc             C   su   | d  k r t  ƒ  } t j | ƒ } t | ƒ d k rB 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)ÚselfÚkeyÚbackendr   r   r   Ú__init__   s    		zFernet.__init__c             C   s   t  j t j d ƒ ƒ S)Nr   )r   Úurlsafe_b64encodeÚosÚurandom)Úclsr   r   r   Úgenerate_key,   s    zFernet.generate_keyc             C   s4   t  t j ƒ  ƒ } t j d ƒ } |  j | | | ƒ S)Nr   )ÚintÚtimer#   r$   Ú_encrypt_from_parts)r   ÚdataÚcurrent_timeÚivr   r   r   Úencrypt0   s    zFernet.encryptc             C   s  t  | t ƒ s t d ƒ ‚ t j t j j ƒ j ƒ  } | j	 | ƒ | j
 ƒ  } t t j |  j ƒ t j | ƒ |  j ƒ j ƒ  } | j	 | ƒ | j
 ƒ  } d t j d | ƒ | | } t |  j t j ƒ  d |  j ƒ}	 |	 j	 | ƒ |	 j
 ƒ  }
 t j | |
 ƒ S)Nzdata must be bytes.s   €z>Qr    )Ú
isinstanceÚbytesÚ	TypeErrorr   ÚPKCS7r
   ÚAESÚ
block_sizeÚpadderÚupdateÚfinalizer	   r   r   ÚCBCr   Ú	encryptorÚstructZpackr   r   r   ÚSHA256r   r"   )r   r*   r+   r,   r4   Zpadded_datar8   Ú
ciphertextZbasic_partsÚhZhmacr   r   r   r)   5   s    -!zFernet._encrypt_from_partsc          +   C   s[  t  | t ƒ s t d ƒ ‚ t t j ƒ  ƒ } y t j | ƒ } Wn! t t j f k
 rc t	 ‚ Yn X| sƒ t
 j | d ƒ d k r‰ t	 ‚ y# t j d | d d … ƒ \ } Wn t j k
 rÉ t	 ‚ Yn X| d  k	 r| | | k  rì t	 ‚ | t | k  rt	 ‚ t |  j t j ƒ  d |  j ƒ} | j | d  d
 … ƒ y | j | d d  … ƒ Wn t k
 rot	 ‚ Yn X| d d	 … } | d	 d … } t t j |  j ƒ t j | ƒ |  j ƒ j ƒ  }	 |	 j | ƒ }
 y |
 |	 j ƒ  7}
 Wn t  k
 rýt	 ‚ Yn Xt! j" t j j# ƒ j$ ƒ  } | j |
 ƒ } y | | j ƒ  7} Wn t  k
 rVt	 ‚ Yn X| S)Nztoken must be bytes.r   é€   z>Qé   é	   r    r   é   iàÿÿÿiàÿÿÿiàÿÿÿ)%r.   r/   r0   r'   r(   r   r   ÚbinasciiÚErrorr   ÚsixZ
indexbytesr9   ZunpackÚerrorÚ_MAX_CLOCK_SKEWr   r   r   r:   r   r5   Zverifyr   r	   r
   r2   r   r   r7   Ú	decryptorr6   r   r   r1   r3   Úunpadder)r   ÚtokenÚttlr+   r*   Z	timestampr<   r,   r;   rF   Zplaintext_paddedrG   Zunpaddedr   r   r   ÚdecryptI   sP    #!-zFernet.decrypt)	r   r   r   r!   Úclassmethodr&   r-   r)   rJ   r   r   r   r   r      s
   r   c               @   s7   e  Z d  Z d d „  Z d d „  Z d d d „ Z d S)ÚMultiFernetc             C   s+   t  | ƒ } | s t d ƒ ‚ | |  _ d  S)Nz1MultiFernet requires at least one Fernet instance)Úlistr   Ú_fernets)r   Zfernetsr   r   r   r!   ~   s
    	zMultiFernet.__init__c             C   s   |  j  d j | ƒ S)Nr   )rN   r-   )r   Úmsgr   r   r   r-   †   s    zMultiFernet.encryptNc             C   sG   x: |  j  D]/ } y | j | | ƒ SWq
 t k
 r8 Yq
 Xq
 Wt ‚ d  S)N)rN   rJ   r   )r   rO   rI   Úfr   r   r   rJ   ‰   s    	zMultiFernet.decrypt)r   r   r   r!   r-   rJ   r   r   r   r   rL   }   s   rL   )Z
__future__r   r   r   r   rA   r#   r9   r(   rC   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   rE   Úobjectr   rL   r   r   r   r   Ú<module>   s   `