U
    ÎZj›'  ã                   @   s|  U d dl mZ d dlmZ d dlmZmZ d dlm	Z	 ddg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eef dœdd„Zeeeef dœdd„Zeeeeedœdd„Z eeeeedœdd„Z!eeedœdd„Z"eeeedœdd„Z#eeeedœd d!„Z$eeed"œd#d$„Z%eeeed%œd&d'„Z&d(S ))é    )ÚTuple)Ú
exceptions)ÚffiÚlib)ÚensureÚcrypto_box_keypairÚ
crypto_boxÚcrypto_box_SECRETKEYBYTESÚcrypto_box_PUBLICKEYBYTESÚcrypto_box_SEEDBYTESÚcrypto_box_NONCEBYTESÚcrypto_box_ZEROBYTESÚcrypto_box_BOXZEROBYTESÚcrypto_box_BEFORENMBYTESÚcrypto_box_SEALBYTES)Úreturnc                  C   s`   t  dt¡} t  dt¡}t | |¡}t|dkdtjd� t  	| t¡dd… t  	|t¡dd… fS )zq
    Returns a randomly generated public and secret key.

    :rtype: (bytes(public_key), bytes(secret_key))
    úunsigned char[]r   úUnexpected library error©ZraisingN)
r   Únewr
   r	   r   r   r   ÚexcÚRuntimeErrorÚbuffer)ÚpkÚskÚrc© r   ú[/var/www/html/TRUCKING_PROJECT/venv/lib/python3.8/site-packages/nacl/bindings/crypto_box.pyr   "   s    þ)Úseedr   c                 C   sŒ   t t| tƒdtd� t| ƒtkr*t d¡‚t 	dt
¡}t 	dt¡}t ||| ¡}t |dkdtjd� t |t
¡dd… t |t¡dd… fS )a  
    Returns a (public, secret) keypair deterministically generated
    from an input ``seed``.

    .. warning:: The seed **must** be high-entropy; therefore,
        its generator **must** be a cryptographic quality
        random function like, for example, :func:`~nacl.utils.random`.

    .. warning:: The seed **must** be protected and remain secret.
        Anyone who knows the seed is really in possession of
        the corresponding PrivateKey.


    :param seed: bytes
    :rtype: (bytes(public_key), bytes(secret_key))
    zseed must be bytesr   zInvalid seedr   r   r   N)r   Ú
isinstanceÚbytesÚ	TypeErrorÚlenr   r   Ú
ValueErrorr   r   r
   r	   r   Úcrypto_box_seed_keypairr   r   )r   r   r   r   r   r   r   r$   4   s    
þr$   )ÚmessageÚnoncer   r   r   c                 C   s¢   t |ƒtkrt d¡‚t |ƒtkr,t d¡‚t |ƒtkrBt d¡‚dt |  }t dt |ƒ¡}t	 
||t |ƒ|||¡}t|dkdtjd� t |t |ƒ¡td	… S )
zð
    Encrypts and returns a message ``message`` using the secret key ``sk``,
    public key ``pk``, and the nonce ``nonce``.

    :param message: bytes
    :param nonce: bytes
    :param pk: bytes
    :param sk: bytes
    :rtype: bytes
    úInvalid nonce sizeúInvalid public keyúInvalid secret keyó    r   r   r   r   N)r"   r   r   r#   r
   r	   r   r   r   r   r   r   r   r   r   )r%   r&   r   r   ÚpaddedÚ
ciphertextr   r   r   r   r   V   s    


)r,   r&   r   r   r   c                 C   s¢   t |ƒtkrt d¡‚t |ƒtkr,t d¡‚t |ƒtkrBt d¡‚dt |  }t dt |ƒ¡}t	 
||t |ƒ|||¡}t|dkdtjd� t |t |ƒ¡td	… S )
a  
    Decrypts and returns an encrypted message ``ciphertext``, using the secret
    key ``sk``, public key ``pk``, and the nonce ``nonce``.

    :param ciphertext: bytes
    :param nonce: bytes
    :param pk: bytes
    :param sk: bytes
    :rtype: bytes
    r'   r(   r)   r*   r   r   ú/An error occurred trying to decrypt the messager   N)r"   r   r   r#   r
   r	   r   r   r   r   Úcrypto_box_openr   ÚCryptoErrorr   r   )r,   r&   r   r   r+   Ú	plaintextÚresr   r   r   r.   s   s    


ýr.   )r   r   r   c                 C   sn   t | ƒtkrt d¡‚t |ƒtkr,t d¡‚t dt¡}t 	|| |¡}t
|dkdtjd� t |t¡dd… S )a  
    Computes and returns the shared key for the public key ``pk`` and the
    secret key ``sk``. This can be used to speed up operations where the same
    set of keys is going to be used multiple times.

    :param pk: bytes
    :param sk: bytes
    :rtype: bytes
    r(   r)   r   r   r   r   N)r"   r
   r   r#   r	   r   r   r   r   Úcrypto_box_beforenmr   r   r   )r   r   Úkr   r   r   r   r2   –   s    


r2   )r%   r&   r3   r   c                 C   sŠ   t |ƒtkrt d¡‚t |ƒtkr,t d¡‚dt |  }t dt |ƒ¡}t 	||t |ƒ||¡}t
|dkdtjd� t |t |ƒ¡td… S )	zÇ
    Encrypts and returns the message ``message`` using the shared key ``k`` and
    the nonce ``nonce``.

    :param message: bytes
    :param nonce: bytes
    :param k: bytes
    :rtype: bytes
    úInvalid nonceúInvalid shared keyr*   r   r   r   r   N)r"   r   r   r#   r   r   r   r   r   Úcrypto_box_afternmr   r   r   r   )r%   r&   r3   r+   r,   r   r   r   r   r6   ®   s    


r6   )r,   r&   r3   r   c                 C   sŠ   t |ƒtkrt d¡‚t |ƒtkr,t d¡‚dt |  }t dt |ƒ¡}t 	||t |ƒ||¡}t
|dkdtjd� t |t |ƒ¡td… S )	zØ
    Decrypts and returns the encrypted message ``ciphertext``, using the shared
    key ``k`` and the nonce ``nonce``.

    :param ciphertext: bytes
    :param nonce: bytes
    :param k: bytes
    :rtype: bytes
    r4   r5   r*   r   r   r-   r   N)r"   r   r   r#   r   r   r   r   r   Úcrypto_box_open_afternmr   r/   r   r   )r,   r&   r3   r+   r0   r1   r   r   r   r7   Ç   s    

ýr7   )r%   r   r   c                 C   s’   t t| tƒdtd� t t|tƒdtd� t|ƒtkr>t d¡‚t| ƒ}t| }t	 
d|¡}t || ||¡}t |dkdtjd� t	 ||¡dd… S )	a€  
    Encrypts and returns a message ``message`` using an ephemeral secret key
    and the public key ``pk``.
    The ephemeral public key, which is embedded in the sealed box, is also
    used, in combination with ``pk``, to derive the nonce needed for the
    underlying box construct.

    :param message: bytes
    :param pk: bytes
    :rtype: bytes

    .. versionadded:: 1.2
    zinput message must be bytesr   úpublic key must be bytesr(   r   r   r   N)r   r   r    r!   r"   r
   r   r#   r   r   r   r   Úcrypto_box_sealr   r   )r%   r   Ú_mlenÚ_clenr,   r   r   r   r   r9   æ   s$    ý  ÿ
r9   )r,   r   r   r   c                 C   sÞ   t t| tƒdtd� t t|tƒdtd� t t|tƒdtd� t|ƒtkrRt d¡‚t|ƒtkrht d¡‚t| ƒ}t |t	kd 
t	¡tjd� |t	 }t dtd	|ƒ¡}t || |||¡}t |d
kdtjd� t ||¡dd… S )a“  
    Decrypts and returns an encrypted message ``ciphertext``, using the
    recipent's secret key ``sk`` and the sender's ephemeral public key
    embedded in the sealed box. The box contruct nonce is derived from
    the recipient's public key ``pk`` and the sender's public key.

    :param ciphertext: bytes
    :param pk: bytes
    :param sk: bytes
    :rtype: bytes

    .. versionadded:: 1.2
    zinput ciphertext must be bytesr   r8   zsecret key must be bytesr(   r)   z)Input cyphertext must be at least {} longr   é   r   r-   N)r   r   r    r!   r"   r
   r   r#   r	   r   Úformatr   r   Úmaxr   Úcrypto_box_seal_openr/   r   )r,   r   r   r;   r:   r0   r1   r   r   r   r?     sH    ý  ÿ  ÿ

ÿûýr?   N)'Útypingr   Znaclr   r   Znacl._sodiumr   r   Znacl.exceptionsr   Ú__all__Zcrypto_box_secretkeybytesr	   ÚintÚ__annotations__Zcrypto_box_publickeybytesr
   Zcrypto_box_seedbytesr   Zcrypto_box_noncebytesr   Zcrypto_box_zerobytesr   Zcrypto_box_boxzerobytesr   Zcrypto_box_beforenmbytesr   Zcrypto_box_sealbytesr   r    r   r$   r   r.   r2   r6   r7   r9   r?   r   r   r   r   Ú<module>   s>    "   þ#  þ&