a bC@sUddlmZddlmZddlmZmZddlm Z gdZ e Z e ed<eZe ed<eZe ed<eZe ed <eeefd d d Zeeeefd ddZeeeeeefdddZeeeeeefdddZdS))Tuple) exceptions)ffilib)ensure)crypto_kx_keypaircrypto_kx_client_session_keyscrypto_kx_server_session_keyscrypto_kx_PUBLIC_KEY_BYTEScrypto_kx_SECRET_KEY_BYTEScrypto_kx_SEED_BYTEScrypto_kx_SESSION_KEY_BYTESr r r r )returncCs`tdt}tdt}t||}t|dkdtjdt |tddt |tddfS)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[]rKey generation failed.ZraisingN) rnewr r rrrexc CryptoErrorbuffer) public_key secret_keyresr>/tmp/pip-target-98j97qn4/lib/python/nacl/bindings/crypto_kx.pyr's   r)seedrcCstdt}tdt}tt|to.t|tkd tt j dt |||}t|dkdt jdt|tddt|tddfS)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) rz*Seed must be a {} byte long bytes sequencerrrN)rrr r r isinstancebyteslenr formatr TypeErrorrcrypto_kx_seed_keypairrr)rrrrrrrr!:s  r!)client_public_keyclient_secret_keyserver_public_keyrcCstt|tot|tkdttjdtt|to>t|tkdttjdtt|toft|tkdttjdt dt }t dt }t |||||}t|dkdtjdt |t ddt |t ddfS) 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 sequencerz8Client secret key must be a {} bytes long bytes sequence8Server public key must be a {} bytes long bytes sequencerrz%Client session key generation failed.N)rrrrr rrr r rrr rrrr)r"r#r$rx_keytx_keyrrrrrWsJ         r)r$server_secret_keyr"rcCstt|tot|tkdttjdtt|to>t|tkdttjdtt|toft|tkdttjdt dt }t dt }t |||||}t|dkdtjdt |t ddt |t ddfS) 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&rz8Server secret key must be a {} bytes long bytes sequencer%rrz%Server session key generation failed.N)rrrrr rrr r rrr rr rr)r$r)r"r'r(rrrrr sJ         r N)typingrZnaclrrZ nacl._sodiumrrZnacl.exceptionsr__all__Zcrypto_kx_publickeybytesr int__annotations__Zcrypto_kx_secretkeybytesr Zcrypto_kx_seedbytesr Zcrypto_kx_sessionkeybytesr rrr!rr rrrrs(    ;