o
    FDi+                     @   s  U d dl mZmZmZmZ d dlmZ d dlm	Z	m
Z
 d dlmZ e
 Zeed< e
 Zeed< e
 Zeed< e
 Zeed< e
 Zeed	< e
 Zeed
< e
 Zeed< e
 Zeed< e
 Z eed< de!fddZ"G dd dZ#de#de!de!fddZ$defde#de!dee! dede!f
ddZ%de#de!de!ddfddZ&	d%de#d e!dee! dee!ef fd!d"Z'de#ddfd#d$Z(dS )&    )OptionalTupleUnioncast)
exceptions)ffilib)ensure,crypto_secretstream_xchacha20poly1305_ABYTES1crypto_secretstream_xchacha20poly1305_HEADERBYTES.crypto_secretstream_xchacha20poly1305_KEYBYTES6crypto_secretstream_xchacha20poly1305_MESSAGEBYTES_MAX0crypto_secretstream_xchacha20poly1305_STATEBYTES1crypto_secretstream_xchacha20poly1305_TAG_MESSAGE.crypto_secretstream_xchacha20poly1305_TAG_PUSH/crypto_secretstream_xchacha20poly1305_TAG_REKEY/crypto_secretstream_xchacha20poly1305_TAG_FINALreturnc                  C   s(   t dt} t|  t | dd S )zd
    Generate a key for use with
    :func:`.crypto_secretstream_xchacha20poly1305_init_push`.

    unsigned char[]N)r   newr   r   ,crypto_secretstream_xchacha20poly1305_keygenbuffer)keybuf r   Z/var/www/Datamplify/venv/lib/python3.10/site-packages/nacl/bindings/crypto_secretstream.pyr   4   s   
r   c                   @   s"   e Zd ZdZg dZdddZdS )+crypto_secretstream_xchacha20poly1305_statezN
    An object wrapping the crypto_secretstream_xchacha20poly1305 state.

    )statebufrawbuftagbufr   Nc                 C   s,   t tttf }tdt| _d| _d| _	dS )z Initialize a clean state object.r   N)
r   bytes	bytearray
memoryviewr   r   r   r   r   r   )self
ByteStringr   r   r   __init__J   s   
z4crypto_secretstream_xchacha20poly1305_state.__init__)r   N)__name__
__module____qualname____doc__	__slots__r$   r   r   r   r   r   B   s    r   statekeyc                 C   s   t t| tdtjd t t|tdtjd t t|tkdtjd t	
dt}t| j||}t |dkdtjd t	|dd S )	a\  
    Initialize a crypto_secretstream_xchacha20poly1305 encryption buffer.

    :param state: a secretstream state object
    :type state: crypto_secretstream_xchacha20poly1305_state
    :param key: must be
                :data:`.crypto_secretstream_xchacha20poly1305_KEYBYTES` long
    :type key: bytes
    :return: header
    :rtype: bytes

    BState must be a crypto_secretstream_xchacha20poly1305_state objectraisingKey must be a bytes sequenceInvalid key lengthzunsigned char []r   Unexpected failureN)r	   
isinstancer   exc	TypeErrorr   lenr   
ValueErrorr   r   r   r   /crypto_secretstream_xchacha20poly1305_init_pushr   RuntimeErrorr   )r*   r+   	headerbufrcr   r   r   r7   V   s0   
r7   Nmadtagc              
   C   s   t t| tdtjd t t|tdtjd t t|tkdtjd t |du p+t|tdtjd t|t	 }| j
du sCt| j
|k rJtd|| _
|du rTtj}d}nt|}t| j| j
tj|t||||}t |dkd	tjd t| j
|dd S )
a  
    Add an encrypted message to the secret stream.

    :param state: a secretstream state object
    :type state: crypto_secretstream_xchacha20poly1305_state
    :param m: the message to encrypt, the maximum length of an individual
              message is
              :data:`.crypto_secretstream_xchacha20poly1305_MESSAGEBYTES_MAX`.
    :type m: bytes
    :param ad: additional data to include in the authentication tag
    :type ad: bytes or None
    :param tag: the message tag, usually
                :data:`.crypto_secretstream_xchacha20poly1305_TAG_MESSAGE` or
                :data:`.crypto_secretstream_xchacha20poly1305_TAG_FINAL`.
    :type tag: int
    :return: ciphertext
    :rtype: bytes

    r,   r-   zMessage is not byteszMessage is too longN%Additional data must be bytes or Noner   r   r1   )r	   r2   r   r3   r4   r   r5   r   r6   r
   r   r   r   NULLr   *crypto_secretstream_xchacha20poly1305_pushr   r8   r   )r*   r;   r<   r=   clenadlenr:   r   r   r   r@      sF   

r@   headerc                 C   s   t t| tdtjd t t|tdtjd t t|tkdtjd t t|tdtjd t t|t	kdtjd | j
du rDtd| _
t| j||}t |d	kd
tjd dS )a  
    Initialize a crypto_secretstream_xchacha20poly1305 decryption buffer.

    :param state: a secretstream state object
    :type state: crypto_secretstream_xchacha20poly1305_state
    :param header: must be
                :data:`.crypto_secretstream_xchacha20poly1305_HEADERBYTES` long
    :type header: bytes
    :param key: must be
                :data:`.crypto_secretstream_xchacha20poly1305_KEYBYTES` long
    :type key: bytes

    r,   r-   zHeader must be a bytes sequencezInvalid header lengthr/   r0   Nzunsigned char *r   r1   )r	   r2   r   r3   r4   r   r5   r   r6   r   r   r   r   r   /crypto_secretstream_xchacha20poly1305_init_pullr   r8   )r*   rC   r+   r:   r   r   r   rD      s>   


rD   cc              
   C   sD  t t| tdtjd t | jdudtjd t t|tdtjd t t|t	kdtjd t t|t
t	 kdtjd t |du pDt|tdtjd t|t	 }| jdu s\t| j|k rctd	|| _|du rmtj}d
}nt|}t| j| jtj| j|t|||}t |d
kdtjd t| j|dd ttt| jd
 fS )aM  
    Read a decrypted message from the secret stream.

    :param state: a secretstream state object
    :type state: crypto_secretstream_xchacha20poly1305_state
    :param c: the ciphertext to decrypt, the maximum length of an individual
              ciphertext is
              :data:`.crypto_secretstream_xchacha20poly1305_MESSAGEBYTES_MAX` +
              :data:`.crypto_secretstream_xchacha20poly1305_ABYTES`.
    :type c: bytes
    :param ad: additional data to include in the authentication tag
    :type ad: bytes or None
    :return: (message, tag)
    :rtype: (bytes, int)

    r,   r-   NzOState must be initialized using crypto_secretstream_xchacha20poly1305_init_pullzCiphertext is not byteszCiphertext is too shortzCiphertext is too longr>   r   r   r1   )r	   r2   r   r3   r4   r   r6   r   r5   r
   r   r   r   r   r?   r   *crypto_secretstream_xchacha20poly1305_pullr   r8   r   intr   )r*   rE   r<   mlenrB   r:   r   r   r   rF      sn   
	
rF   c                 C   s&   t t| tdtjd t| j dS )a  
    Explicitly change the encryption key in the stream.

    Normally the stream is re-keyed as needed or an explicit ``tag`` of
    :data:`.crypto_secretstream_xchacha20poly1305_TAG_REKEY` is added to a
    message to ensure forward secrecy, but this method can be used instead
    if the re-keying is controlled without adding the tag.

    :param state: a secretstream state object
    :type state: crypto_secretstream_xchacha20poly1305_state

    r,   r-   N)r	   r2   r   r3   r4   r   +crypto_secretstream_xchacha20poly1305_rekeyr   )r*   r   r   r   rI   R  s   rI   )N))typingr   r   r   r   naclr   r3   nacl._sodiumr   r   nacl.exceptionsr	   ,crypto_secretstream_xchacha20poly1305_abytesr
   rG   __annotations__1crypto_secretstream_xchacha20poly1305_headerbytesr   .crypto_secretstream_xchacha20poly1305_keybytesr   6crypto_secretstream_xchacha20poly1305_messagebytes_maxr   0crypto_secretstream_xchacha20poly1305_statebytesr   1crypto_secretstream_xchacha20poly1305_tag_messager   .crypto_secretstream_xchacha20poly1305_tag_pushr   /crypto_secretstream_xchacha20poly1305_tag_rekeyr   /crypto_secretstream_xchacha20poly1305_tag_finalr   r   r   r   r7   r@   rD   rF   rI   r   r   r   r   <module>   s   









/
C
8

X