o
    	hC                  
   @   s   U d dl mZ d dlmZ d dlmZmZ d dlm	Z	 g dZ
	 e Zeed< e Zeed< e Zeed< e Zeed	< d
eeef fddZded
eeef fddZdededed
eeef fddZdededed
eeef f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_BYTESr
   r   r   r   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.raisingN)
r   newr
   r   r   r   r   excCryptoErrorbuffer)
public_key
secret_keyres r   Y/var/www/html/optinet_system/venv/lib/python3.10/site-packages/nacl/bindings/crypto_kx.pyr   '   s   r   seedc                 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_keyc                 C      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o3t|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   J   





	
r   server_secret_keyc                 C   r&   )	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	      r+   r	   N)typingr   naclr   r   nacl._sodiumr   r   nacl.exceptionsr   __all__crypto_kx_publickeybytesr
   int__annotations__crypto_kx_secretkeybytesr   crypto_kx_seedbytesr   crypto_kx_sessionkeybytesr   r   r   r"   r   r	   r   r   r   r   <module>   s<   


:
