o
    g+                     @   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 )&    )
ByteStringOptionalTuple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   [/var/www/html/api-tag/env/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 dt| _d| _d| _dS )z Initialize a clean state object.r   N)r   r   r   r   r   r   )selfr   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	TypeErrorbyteslenr   
ValueErrorr   r   r   r   /crypto_secretstream_xchacha20poly1305_init_pushr   RuntimeErrorr   )r&   r'   	headerbufrcr   r   r   r4   U   s0   
r4   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   r-   )r	   r.   r   r/   r0   r1   r2   r   r3   r
   r   r   r   NULLr   *crypto_secretstream_xchacha20poly1305_pushr   r5   r   )r&   r8   r9   r:   clenadlenr7   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+   r,   Nzunsigned char *r   r-   )r	   r.   r   r/   r0   r1   r2   r   r3   r   r   r   r   r   /crypto_secretstream_xchacha20poly1305_init_pullr   r5   )r&   r@   r'   r7   r   r   r   rA      s>   


rA   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   r-   )r	   r.   r   r/   r0   r   r3   r1   r2   r
   r   r   r   r   r<   r   *crypto_secretstream_xchacha20poly1305_pullr   r5   r   intr   )r&   rB   r9   mlenr?   r7   r   r   r   rC      sn   
	
rC   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	   r.   r   r/   r0   r   +crypto_secretstream_xchacha20poly1305_rekeyr   )r&   r   r   r   rF   Q  s   rF   )N))typingr   r   r   r   naclr   r/   nacl._sodiumr   r   nacl.exceptionsr	   ,crypto_secretstream_xchacha20poly1305_abytesr
   rD   __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   r1   r   r   r4   r=   rA   rC   rF   r   r   r   r   <module>   s   









/
C
8

X