U
    cc+                     @   sj  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< e!dddZ"G dd dZ#e#e!e!dddZ$defe#e!ee! ee!dddZ%e#e!e!ddddZ&d#e#e!ee! ee!ef dddZ'e#dd 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)Zkeybuf r   E/tmp/pip-unpacked-wheel-e6sdgn5m/nacl/bindings/crypto_secretstream.pyr   4   s    
r   c                   @   s(   e Zd ZdZdddgZddddZdS )	+crypto_secretstream_xchacha20poly1305_statezN
    An object wrapping the crypto_secretstream_xchacha20poly1305 state.

    statebufrawbuftagbufNr   c                 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__)__name__
__module____qualname____doc__	__slots__r    r   r   r   r   r   B   s   
r   )statekeyr   c                 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Z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'   Z	headerbufrcr   r   r   r3   U   s4    
  r3   N)r&   madtagr   c              
   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kpVt|tdtjd t|t	 }| j
dkst| j
|k rtd|| _
|dkrt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.   r/   r0   r1   r   r2   r
   r   r   r   NULLr   *crypto_secretstream_xchacha20poly1305_pushr   r4   r   )r&   r6   r7   r8   clenadlenr5   r   r   r   r;      sF    

r;   )r&   headerr'   r   c                 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krt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.   r/   r0   r1   r   r2   r   r   r   r   r   /crypto_secretstream_xchacha20poly1305_init_pullr   r4   )r&   r>   r'   r5   r   r   r   r?      sB    


  r?   )r&   cr7   r   c              
   C   sD  t t| tdtjd t | jdk	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kpt|tdtjd t|t	 }| jdkst| j|k rtd	|| _|dkrt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 longr9   r   r   r,   )r	   r-   r   r.   r/   r   r2   r0   r1   r
   r   r   r   r   r:   r   *crypto_secretstream_xchacha20poly1305_pullr   r4   r   intr   )r&   r@   r7   mlenr=   r5   r   r   r   rA      sn    
	
rA   )r&   r   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.   r/   r   +crypto_secretstream_xchacha20poly1305_rekeyr   )r&   r   r   r   rD   Q  s    rD   )N))typingr   r   r   r   Znaclr   r.   Znacl._sodiumr   r   Znacl.exceptionsr	   Z,crypto_secretstream_xchacha20poly1305_abytesr
   rB   __annotations__Z1crypto_secretstream_xchacha20poly1305_headerbytesr   Z.crypto_secretstream_xchacha20poly1305_keybytesr   Z6crypto_secretstream_xchacha20poly1305_messagebytes_maxr   Z0crypto_secretstream_xchacha20poly1305_statebytesr   Z1crypto_secretstream_xchacha20poly1305_tag_messager   Z.crypto_secretstream_xchacha20poly1305_tag_pushr   Z/crypto_secretstream_xchacha20poly1305_tag_rekeyr   Z/crypto_secretstream_xchacha20poly1305_tag_finalr   r0   r   r   r3   r;   r?   rA   rD   r   r   r   r   <module>   sh    








 /D8 
Y