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ddd	d
dgZe	 Ze	 Ze	 Ze	 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_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_BYTESc                  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   9/usr/lib/python3/dist-packages/nacl/bindings/crypto_kx.pyr	   &   s    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 {0} byte long bytes sequencer   r   r   N)r   r   r   r   r   
isinstancebyteslenr   formatr   	TypeErrorr   crypto_kx_seed_keypairr   r   )Zseedr   r   r   r   r   r   r!   7   s    
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 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)
    9Client public key must be a {0} bytes long bytes sequencer   z9Client secret key must be a {0} bytes long bytes sequence9Server public key must be a {0} 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   )client_public_keyZclient_secret_keyserver_public_keyrx_keytx_keyr   r   r   r   r
   P   sH    


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   z9Server secret key must be a {0} 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%   Zserver_secret_keyr$   r&   r'   r   r   r   r   r   }   sH    


N)Z
__future__r   r   r   Znaclr   r   Znacl._sodiumr   r   Znacl.exceptionsr   __all__Zcrypto_kx_publickeybytesr   Zcrypto_kx_secretkeybytesr   Zcrypto_kx_seedbytesr   Zcrypto_kx_sessionkeybytesr   r	   r!   r
   r   r   r   r   r   <module>   s&   -