
    pg                         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e          Zd	Z G d
 d          Z G d d          ZdS )    N)utils)InvalidSignature)hashespadding)Cipher
algorithmsmodes)HMACc                       e Zd ZdS )InvalidTokenN)__name__
__module____qualname__     5/usr/lib/python3/dist-packages/cryptography/fernet.pyr   r      s        Dr   r   <   c            	          e Zd Z	 ddej        eef         dej        fdZe	defd            Z
dedefdZded	edefd
Zded	ededefdZ	 ddej        eef         dej        e         defdZdej        eef         ded	edefdZdej        eef         defdZedej        eef         dej        eef         fd            ZdeddfdZdededej        ej        eef                  defdZdS )FernetNkeybackendc                     	 t          j        |          }n'# t          j        $ r}t	          d          |d }~ww xY wt          |          dk    rt	          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   excs       r   __init__zFernet.__init__   s    
	*3//CC~ 	 	 	F 	 s88r>>F    H"233xs    ;6;returnc                 N    t          j        t          j        d                    S )Nr   )r   urlsafe_b64encodeosurandom)clss    r   generate_keyzFernet.generate_key.   s    '
2777r   datac                 j    |                      |t          t          j                                        S Nencrypt_at_timeinttime)r#   r-   s     r   encryptzFernet.encrypt2   s&    ##D#dikk*:*:;;;r   current_timec                 X    t          j        d          }|                     |||          S )Nr   )r)   r*   _encrypt_from_parts)r#   r-   r5   ivs       r   r1   zFernet.encrypt_at_time5   s'    Z^^''lB???r   r8   c                    t          j        d|           t          j        t          j        j                                                  }|                    |          |	                                z   }t          t	          j        | j                  t          j        |                                                    }|                    |          |	                                z   }d|                    dd          z   |z   |z   }t!          | j        t%          j                              }	|	                    |           |		                                }
t)          j        ||
z             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-   r5   r8   rC   padded_datarG   
ciphertextbasic_partshhmacs              r   r7   zFernet._encrypt_from_parts9   s;    	64(((z~899@@BBmmD))FOO,=,==N4/00IbMM
 
 )++ 	 %%k22Y5G5G5I5II
 ##1#>>?  	 "FMOO44	zz||'d(:;;;r   tokenttlc                     t                               |          \  }}|d }n"|t          t          j                              f}|                     |||          S r/   )r   _get_unverified_token_datar2   r3   _decrypt_data)r#   rO   rP   	timestampr-   	time_infos         r   decryptzFernet.decryptR   sW     !;;EBB	4;IIc$)++../I!!$	9===r   c                     |t          d          t                              |          \  }}|                     ||||f          S )Nz6decrypt_at_time() can only be used with a non-None ttl)r   r   rR   rS   )r#   rO   rP   r5   rT   r-   s         r   decrypt_at_timezFernet.decrypt_at_time\   sT     ;H   !;;EBB	4!!$	C3FGGGr   c                 j    t                               |          \  }}|                     |           |S r/   )r   rR   _verify_signature)r#   rO   rT   r-   s       r   extract_timestampzFernet.extract_timestampf   s3     ;;EBB	4t$$$r   c                 t   t          | t          t          f          st          d          	 t	          j        |           }n!# t          t          j        f$ r t          w xY w|r|d         dk    rt          t          |          dk     rt          t                              |dd         d          }||fS )Nztoken must be bytes or strr      	      r<   )r>   )
isinstancestrbytes	TypeErrorr   r   r   r   r   r    r2   
from_bytes)rO   r-   rT   s      r   rR   z!Fernet._get_unverified_token_datal   s     %#u.. 	:8999	+E22DD8>* 	 	 		  	tAw$t99q==NN4!9N>>	$s   A A c                     t          | j        t          j                              }|                    |d d                    	 |                    |dd                     d S # t          $ r t          w xY w)N)r
   r!   r   rI   rD   verifyr   r   )r#   r-   rM   s      r   rZ   zFernet._verify_signature   sz    "FMOO44	dsd	HHT#$$Z      	 	 		s   A$ $A6rT   rU   c                    |*|\  }}||z   |k     rt           |t          z   |k     rt           |                     |           |dd         }|dd         }t          t	          j        | j                  t          j        |                    	                                }|
                    |          }		 |	|                                z  }	n# t          $ r t           w xY wt          j        t          j        j                                                  }
|

                    |	          }	 ||
                                z  }n# t          $ r t           w xY w|S )Nr^      rf   )r   _MAX_CLOCK_SKEWrZ   r   r   rA   r"   r	   rF   	decryptorrD   rE   r   r   r@   rB   unpadder)r#   r-   rT   rU   rP   r5   r8   rK   rk   plaintext_paddedrl   unpaddeds               r   rS   zFernet._decrypt_data   sm      )C3--""o-	99""t$$$!B$Z"S&\
N4/00%)B--
 

)++ 	 %++J77		 2 2 4 44 	 	 		=!:;;DDFF??#344	))+++HH 	 	 		s   7C C!/E Er/   )r   r   r   typingUnionrb   ra   Anyr%   classmethodr,   r4   r2   r1   r7   OptionalrV   rX   r[   staticmethodTuplerR   rZ   rS   r   r   r   r   r      sp        #( (\%*%( ( ( ( (& 8U 8 8 8 [8<E <e < < < <@E @ @ @ @ @ @<<),<27<	< < < <4 LP> >\%*->4:OC4H>	> > > >H\%*-H47HGJH	H H H Hv|E3J'? C     |E3J'	c5j	!   \(e     !! ! ?6<S#9:	!
 
! ! ! ! ! !r   r   c                       e Zd Zdej        e         fdZdedefdZdede	defdZ
dej        eef         defdZ	 ddej        eef         d
ej        e	         defdZdej        eef         d
e	de	defdZd	S )MultiFernetfernetsc                 T    t          |          }|st          d          || _        d S )Nz1MultiFernet requires at least one Fernet instance)listr   _fernets)r#   rx   s     r   r%   zMultiFernet.__init__   s7    w-- 	C    r   msgr&   c                 j    |                      |t          t          j                                        S r/   r0   )r#   r|   s     r   r4   zMultiFernet.encrypt   s&    ##CTY[[)9)9:::r   r5   c                 D    | j         d                             ||          S )Nr   )r{   r1   )r#   r|   r5   s      r   r1   zMultiFernet.encrypt_at_time   s    }Q//\BBBr   c                    t                               |          \  }}| j        D ]+}	 |                    ||d           } n# t          $ r Y (w xY wt          t          j        d          }| j        d                             |||          S )Nr   r   )r   rR   r{   rS   r   r)   r*   r7   )r#   r|   rT   r-   fpr8   s          r   rotatezMultiFernet.rotate   s     ;;C@@	4 	 	AOOD)T::    Z^^}Q33Ay"EEEs   A
AANrP   c                 t    | j         D ]*}	 |                    ||          c S # t          $ r Y 'w xY wt          r/   )r{   rV   r   )r#   r|   rP   r   s       r   rV   zMultiFernet.decrypt   sZ      	 	Ayyc*****   s   #
00c                 v    | j         D ]+}	 |                    |||          c S # t          $ r Y (w xY wt          r/   )r{   rX   r   )r#   r|   rP   r5   r   s        r   rX   zMultiFernet.decrypt_at_time   s^      	 	A((c<@@@@@   s   $
11r/   )r   r   r   ro   Iterabler   r%   rb   r4   r2   r1   rp   ra   r   rs   rV   rX   r   r   r   rw   rw      sD         7        ;5 ;U ; ; ; ;C5 C C C C C CF&,ucz2 Fu F F F F JN <s
+28/#2F	   <s
+25EH	     r   rw   )r   r   r)   r3   ro   cryptographyr   cryptography.exceptionsr   cryptography.hazmat.primitivesr   r   &cryptography.hazmat.primitives.ciphersr   r   r	   #cryptography.hazmat.primitives.hmacr
   	Exceptionr   rj   r   rw   r   r   r   <module>r      s4     				         4 4 4 4 4 4 : : : : : : : : L L L L L L L L L L 4 4 4 4 4 4	 	 	 	 	9 	 	 	 P P P P P P P Pf/ / / / / / / / / /r   