
    3Tf                        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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y)    )annotationsN)utils)InvalidSignature)hashespadding)Cipher
algorithmsmodes)HMACc                      e Zd Zy)InvalidTokenN)__name__
__module____qualname__     5/usr/lib/python3/dist-packages/cryptography/fernet.pyr   r      s    r   r   <   c                      e Zd Z	 d	 	 	 	 	 ddZedd       ZddZddZ	 	 	 	 	 	 	 	 ddZ	 d	 	 	 	 	 ddZ		 	 	 	 	 	 	 	 ddZ
dd	Ze	 	 	 	 dd
       ZddZ	 	 	 	 	 	 	 	 ddZy)FernetNc                    	 t        j                  |      }t        |      dk7  rt	        d      |d d | _        |dd  | _        y # t        j                  $ r}t	        d      |d }~ww xY w)Nz4Fernet key must be 32 url-safe base64-encoded bytes.       )base64urlsafe_b64decodebinasciiError
ValueErrorlen_signing_key_encryption_key)selfkeybackendexcs       r   __init__zFernet.__init__   s{    
	**3/C
 s8r>F   H"23x ~~ 	F	s   A A)A$$A)c                R    t        j                  t        j                  d            S )Nr   )r   urlsafe_b64encodeosurandom)clss    r   generate_keyzFernet.generate_key/   s    ''

277r   c                \    | j                  |t        t        j                                     S Nencrypt_at_timeinttime)r"   datas     r   encryptzFernet.encrypt3   s     ##D#diik*:;;r   c                R    t        j                  d      }| j                  |||      S )Nr   )r)   r*   _encrypt_from_parts)r"   r3   current_timeivs       r   r0   zFernet.encrypt_at_time6   s$    ZZ^''lB??r   c                   t        j                  d|       t        j                  t        j
                  j                        j                         }|j                  |      |j                         z   }t        t	        j
                  | j                        t        j                  |            j                         }|j                  |      |j                         z   }d|j                  dd      z   |z   |z   }t!        | j"                  t%        j&                               }	|	j                  |       |	j                         }
t)        j*                  ||
z         S )Nr3         big)length	byteorder)r   _check_bytesr   PKCS7r	   AES
block_sizepadderupdatefinalizer   r!   r
   CBC	encryptorto_bytesr   r    r   SHA256r   r(   )r"   r3   r7   r8   rC   padded_datarG   
ciphertextbasic_partshhmacs              r   r6   zFernet._encrypt_from_parts:   s    	64(z~~889@@BmmD)FOO,==NN4//0IIbM
 )+ 	 %%k2Y5G5G5II
 ##1#>?  	 ""FMMO4	zz|''d(:;;r   c                    t         j                  |      \  }}|d }n|t        t        j                               f}| j	                  |||      S r.   )r   _get_unverified_token_datar1   r2   _decrypt_data)r"   tokenttl	timestampr3   	time_infos         r   decryptzFernet.decryptS   sL     !;;EB	4;Ic$))+./I!!$	9==r   c                v    |t        d      t        j                  |      \  }}| j                  ||||f      S )Nz6decrypt_at_time() can only be used with a non-None ttl)r   r   rP   rQ   )r"   rR   rS   r7   rT   r3   s         r   decrypt_at_timezFernet.decrypt_at_time]   sI     ;H  !;;EB	4!!$	C3FGGr   c                X    t         j                  |      \  }}| j                  |       |S r.   )r   rP   _verify_signature)r"   rR   rT   r3   s       r   extract_timestampzFernet.extract_timestampg   s*     ;;EB	4t$r   c                :   t        | t        t        f      st        d      	 t	        j
                  |       }|r|d   dk7  rt        t        |      dk  rt        t        j                  |dd d      }||fS # t        t        j                  f$ r t        w xY w)Nztoken must be bytes or strr      	      r<   )r>   )
isinstancestrbytes	TypeErrorr   r   r   r   r   r   r1   
from_bytes)rR   r3   rT   s      r   rP   z!Fernet._get_unverified_token_datam   s     %#u.899	++E2D tAw$t9q=NN4!9N>	$ 8>>* 		s   A: : Bc                    t        | j                  t        j                               }|j	                  |d d        	 |j                  |dd         y # t        $ r t        w xY w)N)r   r    r   rI   rD   verifyr   r   )r"   r3   rM   s      r   rZ   zFernet._verify_signature   sX    ""FMMO4	ds	HHT#$Z  		s   A A#c                t   |%|\  }}||z   |k  rt         |t        z   |k  rt         | j                  |       |dd }|dd }t        t	        j
                  | j                        t        j                  |            j                         }|j                  |      }		 |	|j                         z  }	t        j                  t        j
                  j                        j!                         }
|
j                  |	      }	 ||
j                         z  }|S # t        $ r t         w xY w# t        $ r t         w xY w)Nr^      rf   )r   _MAX_CLOCK_SKEWrZ   r   r	   rA   r!   r
   rF   	decryptorrD   rE   r   r   r@   rB   unpadder)r"   r3   rT   rU   rS   r7   r8   rK   rk   plaintext_paddedrl   unpaddeds               r   rQ   zFernet._decrypt_data   s7      )C3-""o-	9""t$!BZ"S\
NN4//0%))B-

)+ 	 %++J7		 2 2 44 ==!:!:;DDF??#34	))++H   		  		s   D ?D' D$'D7r.   )r#   typing.Union[bytes, str]r$   z
typing.AnyreturnNone)rp   rb   )r3   rb   rp   rb   )r3   rb   r7   r1   rp   rb   )r3   rb   r7   r1   r8   rb   rp   rb   )rR   ro   rS   typing.Optional[int]rp   rb   )rR   ro   rS   r1   r7   r1   rp   rb   )rR   ro   rp   r1   )rR   ro   rp   ztyping.Tuple[int, bytes])r3   rb   rp   rq   )r3   rb   rT   r1   rU   z'typing.Optional[typing.Tuple[int, int]]rp   rb   )r   r   r   r&   classmethodr,   r4   r0   r6   rV   rX   r[   staticmethodrP   rZ   rQ   r   r   r   r   r      s    #(%( ( 
	(& 8 8<@<<),<27<	<4 LP>->4H>	>H-H47HGJH	H '	! (!! ! ;	!
 
!r   r   c                  Z    e Zd ZddZd	dZd
dZddZ	 d	 	 	 	 	 ddZ	 	 	 	 	 	 	 	 ddZy)MultiFernetc                B    t        |      }|st        d      || _        y )Nz1MultiFernet requires at least one Fernet instance)listr   _fernets)r"   fernetss     r   r&   zMultiFernet.__init__   s'    w-C   r   c                \    | j                  |t        t        j                                     S r.   r/   )r"   msgs     r   r4   zMultiFernet.encrypt   s     ##CTYY[)9::r   c                @    | j                   d   j                  ||      S )Nr   )ry   r0   )r"   r|   r7   s      r   r0   zMultiFernet.encrypt_at_time   s    }}Q//\BBr   c                   t         j                  |      \  }}| j                  D ]  }	 |j                  ||d       } n t        t        j                  d      }| j                  d   j                  |||      S # t        $ r Y `w xY w)Nr   r   )r   rP   ry   rQ   r   r)   r*   r6   )r"   r|   rT   r3   fpr8   s          r   rotatezMultiFernet.rotate   s     ;;C@	4 	AOOD)T:	 ZZ^}}Q33Ay"EE   s   A::	BBNc                v    | j                   D ]  }	 |j                  ||      c S  t        # t        $ r Y *w xY wr.   )ry   rV   r   )r"   r|   rS   r   s       r   rV   zMultiFernet.decrypt   sI      	Ayyc**	
    s   ,	88c                x    | j                   D ]  }	 |j                  |||      c S  t        # t        $ r Y +w xY wr.   )ry   rX   r   )r"   r|   rS   r7   r   s        r   rX   zMultiFernet.decrypt_at_time   sM      	A((c<@@	
    s   -	99)rz   ztyping.Iterable[Fernet])r|   rb   rp   rb   )r|   rb   r7   r1   rp   rb   )r|   ro   rp   rb   r.   )r|   ro   rS   rr   rp   rb   )r|   ro   rS   r1   r7   r1   rp   rb   )	r   r   r   r&   r4   r0   r   rV   rX   r   r   r   rv   rv      sa     ;CF JN+2F	+25EH	r   rv   )
__future__r   r   r   r)   r2   typingcryptographyr   cryptography.exceptionsr   cryptography.hazmat.primitivesr   r   &cryptography.hazmat.primitives.ciphersr   r	   r
   #cryptography.hazmat.primitives.hmacr   	Exceptionr   rj   r   rv   r   r   r   <module>r      sU   
 #   	    4 : L L 4	9 	 P Pf/ /r   