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_ABYTESÚ1crypto_secretstream_xchacha20poly1305_HEADERBYTESÚ.crypto_secretstream_xchacha20poly1305_KEYBYTESÚ6crypto_secretstream_xchacha20poly1305_MESSAGEBYTES_MAXÚ0crypto_secretstream_xchacha20poly1305_STATEBYTESÚ1crypto_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   úL/usr/local/lib/python3.10/dist-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ÿþ