U
    ֫[%                     @   s   d dl mZmZ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	 Ze	 Ze	 Ze	 Ze	 Ze	 Ze	 Zdd Zdd	 Zd
d Zdd Z dd Z!dd Z"dd Z#dd Z$dd Z%dS )    )absolute_importdivisionprint_function)
exceptions)ffilib)ensurecrypto_box_keypair
crypto_boxc                  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   newcrypto_box_PUBLICKEYBYTEScrypto_box_SECRETKEYBYTESr   r	   r   excRuntimeErrorbuffer)pkskrc r   :/usr/lib/python3/dist-packages/nacl/bindings/crypto_box.pyr	   #   s    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lencrypto_box_SEEDBYTESr   
ValueErrorr   r   r   r   r   crypto_box_seed_keypairr   r   )Zseedr   r   r   r   r   r   r   7   s     

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   crypto_box_NONCEBYTESr   r   r   r   crypto_box_ZEROBYTESr   r   r   r
   r   r   r   crypto_box_BOXZEROBYTES)messagenoncer   r   padded
ciphertextr   r   r   r   r
   ]   s    


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    



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   crypto_box_BEFORENMBYTESr   crypto_box_beforenmr   r   r   )r   r   kr   r   r   r   r1      s    


r1   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   r0   r%   r   r   r   crypto_box_afternmr   r   r   r&   )r'   r(   r2   r)   r*   r   r   r   r   r5      s    


r5   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
    r3   r4   r#   r   r   r+   r   N)r   r$   r   r   r0   r&   r   r   r   crypto_box_open_afternmr   r-   r   r%   )r*   r(   r2   r)   r.   r/   r   r   r   r6      s"    


    
r6   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   crypto_box_SEALBYTESr   r   r   crypto_box_sealr   r   )r'   r   _mlen_clenr*   r   r   r   r   r9      s&    


r9   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
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   r7   zsecret key must be bytesr!   r"   r   r   r+   N)r   r   r   r   r   r   r   r   r   r8   r   r   r   crypto_box_seal_openr-   r   )r*   r   r   r;   r:   r.   r/   r   r   r   r<     s0    





r<   N)&Z
__future__r   r   r   Znaclr   r   Znacl._sodiumr   r   Znacl.exceptionsr   __all__Zcrypto_box_secretkeybytesr   Zcrypto_box_publickeybytesr   Zcrypto_box_seedbytesr   Zcrypto_box_noncebytesr$   Zcrypto_box_zerobytesr%   Zcrypto_box_boxzerobytesr&   Zcrypto_box_beforenmbytesr0   Zcrypto_box_sealbytesr8   r	   r   r
   r,   r1   r5   r6   r9   r<   r   r   r   r   <module>   s*   &&