U
    ccC                     @   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ddd	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eef dddZeeeef dddZeeeeeef dddZeeeeeef dddZdS )    )Tuple)
exceptions)ffilib)ensurecrypto_kx_keypaircrypto_kx_client_session_keyscrypto_kx_server_session_keyscrypto_kx_PUBLIC_KEY_BYTEScrypto_kx_SECRET_KEY_BYTEScrypto_kx_SEED_BYTEScrypto_kx_SESSION_KEY_BYTES)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 )z
    Generate a keypair.
    This is a duplicate crypto_box_keypair, but
    is included for api consistency.
    :return: (public_key, secret_key)
    :rtype: (bytes, bytes)
    unsigned char[]r   Key generation failed.ZraisingN)
r   newr
   r   r   r   r   excCryptoErrorbuffer)
public_key
secret_keyres r   ;/tmp/pip-unpacked-wheel-e6sdgn5m/nacl/bindings/crypto_kx.pyr   '   s    )seedr   c                 C   s   t dt}t dt}tt| to.t| tkd	tt
jd t||| }t|dkdt
jd t |tdd t |tdd fS )ag  
    Generate a keypair with a given seed.
    This is functionally the same as crypto_box_seed_keypair, however
    it uses the blake2b hash primitive instead of sha512.
    It is included mainly for api consistency when using crypto_kx.
    :param seed: random seed
    :type seed: bytes
    :return: (public_key, secret_key)
    :rtype: (bytes, bytes)
    r   z*Seed must be a {} byte long bytes sequencer   r   r   N)r   r   r
   r   r   
isinstancebyteslenr   formatr   	TypeErrorr   crypto_kx_seed_keypairr   r   )r   r   r   r   r   r   r   r!   :   s    r!   )client_public_keyclient_secret_keyserver_public_keyr   c                 C   s   t t| tot| tkdttjd t t|to>t|tkdttjd t t|toft|tkdttj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+  
    Generate session keys for the client.
    :param client_public_key:
    :type client_public_key: bytes
    :param client_secret_key:
    :type client_secret_key: bytes
    :param server_public_key:
    :type server_public_key: bytes
    :return: (rx_key, tx_key)
    :rtype: (bytes, bytes)
    8Client public key must be a {} bytes long bytes sequencer   z8Client secret key must be a {} bytes long bytes sequence8Server public key must be a {} bytes long bytes sequencer   r   z%Client session key generation failed.N)r   r   r   r   r
   r   r   r    r   r   r   r   r   r   r   r   )r"   r#   r$   rx_keytx_keyr   r   r   r   r   W   sR    





	    )r$   server_secret_keyr"   r   c                 C   s   t t| tot| tkdttjd t t|to>t|tkdttjd t t|toft|tkdttj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+  
    Generate session keys for the server.
    :param server_public_key:
    :type server_public_key: bytes
    :param server_secret_key:
    :type server_secret_key: bytes
    :param client_public_key:
    :type client_public_key: bytes
    :return: (rx_key, tx_key)
    :rtype: (bytes, bytes)
    r&   r   z8Server secret key must be a {} bytes long bytes sequencer%   r   r   z%Server session key generation failed.N)r   r   r   r   r
   r   r   r    r   r   r   r   r   r	   r   r   )r$   r)   r"   r'   r(   r   r   r   r   r	      sR    





	    N)typingr   Znaclr   r   Znacl._sodiumr   r   Znacl.exceptionsr   __all__Zcrypto_kx_publickeybytesr
   int__annotations__Zcrypto_kx_secretkeybytesr   Zcrypto_kx_seedbytesr   Zcrypto_kx_sessionkeybytesr   r   r   r!   r   r	   r   r   r   r   <module>   s8    
;
