
    @'h                     J    d dl Z d dlmZ d dlmZmZ d dlmZ  G d de      Zy)    N)Any)CipherProtocolSerializerProtocol)JsonPlusSerializerc                       e Zd ZdZ e       fdededdfdZdede	fdZ
d	e	defd
Zdedeee	f   fdZd	eee	f   defdZe e       fdededd fd       Zy)EncryptedSerializerzHSerializer that encrypts and decrypts data using an encryption protocol.cipherserdereturnNc                      || _         || _        y N)r	   r
   )selfr	   r
   s      k/home/kushmeetdev/Regenta/Chatbot/venv/lib/python3.12/site-packages/langgraph/checkpoint/serde/encrypted.py__init__zEncryptedSerializer.__init__   s     
    objc                 8    | j                   j                  |      S r   )r
   dumps)r   r   s     r   r   zEncryptedSerializer.dumps   s    zz$$r   datac                 8    | j                   j                  |      S r   )r
   loads)r   r   s     r   r   zEncryptedSerializer.loads   s    zz%%r   c                     | j                   j                  |      \  }}| j                  j                  |      \  }}| d| |fS )zCSerialize an object to a tuple (type, bytes) and encrypt the bytes.+)r
   dumps_typedr	   encrypt)r   r   typr   
ciphername
ciphertexts         r   r   zEncryptedSerializer.dumps_typed   sK     JJ**3/	T!%!4!4T!:
Ja
|$j00r   c                     |\  }}d|vr| j                   j                  |      S |j                  dd      \  }}| j                  j	                  ||      }| j                   j                  ||f      S )Nr      )r
   loads_typedsplitr	   decrypt)r   r   
enc_cipherr   r   r   decrypted_datas          r   r!   zEncryptedSerializer.loads_typed    so    !%
Jj ::))$//$**32Z,,ZDzz%%sN&;<<r   kwargsc                    	 ddl m dv rj                  d      nJt	        j
                  d      }|t        d      |j                         t              dvrt        d	      j                  d
      j                  d
<    G fddt              } |  |       |      S # t        $ r t        d      dw xY w)z3Create an EncryptedSerializer using AES encryption.r   )AESzQPycryptodome is not installed. Please install it with `pip install pycryptodome`.NkeyLANGGRAPH_AES_KEYz2LANGGRAPH_AES_KEY environment variable is not set.)          z3LANGGRAPH_AES_KEY must be 16, 24, or 32 bytes long.modec                   L    e Zd Zdedeeef   f fdZdededef fdZy)HEncryptedSerializer.from_pycryptodome_aes.<locals>.PycryptodomeAesCipher	plaintextr   c                 z     j                   fi }|j                  |      \  }}d|j                  |z   |z   fS )Naes)newencrypt_and_digestnonce)r   r1   r	   r   tagr(   r)   r&   s        r   r   zPEncryptedSerializer.from_pycryptodome_aes.<locals>.PycryptodomeAesCipher.encryptH   sE     //"(";";I"F
CfllS0:===r   r   r   c                     |dk(  s
J d|        |d d }|dd }|dd  } j                   fi 	d|i}|j                  ||      S )Nr3   zUnsupported cipher: r+   r-   r6   )r4   decrypt_and_verify)
r   r   r   r6   r7   actual_ciphertextr	   r(   r)   r&   s
          r   r#   zPEncryptedSerializer.from_pycryptodome_aes.<locals>.PycryptodomeAesCipher.decryptM   so    !U*O.B:,,OO*"3B B'$.rsO! <<e<001BCHHr   N)__name__
__module____qualname__bytestuplestrr   r#   )r(   r)   r&   s   r   PycryptodomeAesCipherr0   G   sC    > >5e3D >
I# I5 IU I Ir   rA   )Crypto.Cipherr(   ImportErrorpoposgetenv
ValueErrorencodelengetMODE_EAXr   )clsr
   r&   key_strrA   r(   r)   s     `  @@r   from_pycryptodome_aesz)EncryptedSerializer.from_pycryptodome_aes,   s    
	) F?E*Cii 34G !UVV.."C3x|+ !VWW ::f% \\F6N	I 	IN 	I (*E22G  	c	s   B, ,C)r;   r<   r=   __doc__r   r   r   r   r   r>   r   r   r?   r@   r   r!   classmethodrN    r   r   r   r      s    R CUBV$-?	% % %&% &C &1s 1uS%Z'8 1
=c5j 1 
=c 
= );)=)3&)3IL)3	)3 )3r   r   )	rE   typingr   langgraph.checkpoint.serde.baser   r   #langgraph.checkpoint.serde.jsonplusr   r   rQ   r   r   <module>rU      s     	  N BN3, N3r   