Skip to content

Commit

Permalink
Added updated bindings for key exchange API. Added tests.
Browse files Browse the repository at this point in the history
  • Loading branch information
michaelmendoza committed Jun 13, 2018
1 parent a30c14d commit 1da1e84
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 5 deletions.
10 changes: 7 additions & 3 deletions libnacl/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -1115,6 +1115,8 @@ def randombytes_uniform(upper_bound):
'''
return nacl.randombytes_uniform(upper_bound)

# Key derivation API

def crypto_kdf_keygen():
'''
Returns a string of random bytes to generate a master key
Expand All @@ -1134,6 +1136,8 @@ def crypto_kdf_derive_from_key(subkey_size, subkey_id, context, master_key):
nacl.crypto_kdf_derive_from_key(buf, subkey_size, subkey_id, context, master_key)
return buf.raw

# Key Exchange API

def crypto_kx_keypair():
'''
Generate and return a new keypair
Expand All @@ -1154,7 +1158,7 @@ def crypto_kx_seed_keypair(seed):
nacl.crypto_kx_seed_keypair(pk, sk, seed)
return pk.raw, sk.raw

def crypto_kx_client_session_keys(rx, tx, client_pk, client_sk, server_pk):
def crypto_kx_client_session_keys(client_pk, client_sk, server_pk):
'''
Computes a pair of shared keys (rx and tx) using the client's public key client_pk,
the client's secret key client_sk and the server's public key server_pk.
Expand All @@ -1163,9 +1167,9 @@ def crypto_kx_client_session_keys(rx, tx, client_pk, client_sk, server_pk):
rx = ctypes.create_string_buffer(crypto_kx_SESSIONKEYBYTES)
tx = ctypes.create_string_buffer(crypto_kx_SESSIONKEYBYTES)
status = nacl.crypto_kx_client_session_keys(rx, tx, client_pk, client_sk, server_pk)
return rx, tx, status
return rx.raw, tx.raw, status

def crypto_kx_server_session_keys(rx, tx, server_pk, server_sk, client_pk):
def crypto_kx_server_session_keys(server_pk, server_sk, client_pk):
'''
Computes a pair of shared keys (rx and tx) using the server's public key server_pk,
the server's secret key server_sk and the client's public key client_pk.
Expand Down
40 changes: 38 additions & 2 deletions tests/unit/test_raw_random.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,6 @@ def test_crypto_kdf_keygen(self):
self.assertEqual(32, len(master_key))
self.assertTrue(all(freq.values()))


def test_crypto_kdf_derive_from_key(self):

master_key = libnacl.crypto_kdf_keygen()
Expand All @@ -65,4 +64,41 @@ def test_crypto_kdf_derive_from_key(self):
self.assertEqual(subkey, subkey2)
self.assertNotEqual(subkey, subkey3)


def test_crypto_kx_keypair(self):
pk, sk = libnacl.crypto_kx_keypair()
self.assertEqual(32, len(pk))
self.assertEqual(32, len(sk))

def test_crypto_kx_seed_keypair(self):
seed = libnacl.randombytes_buf(32)
seed2 = libnacl.randombytes_buf(32)
pk, sk = libnacl.crypto_kx_seed_keypair(seed)
pk2, sk2 = libnacl.crypto_kx_seed_keypair(seed)
pk3, sk3 = libnacl.crypto_kx_seed_keypair(seed2)

self.assertEqual(pk, pk2)
self.assertNotEqual(pk, pk3)
self.assertEqual(sk, sk2)
self.assertNotEqual(sk, sk3)

def test_crypto_kx_client_session_keys(self):
client_pk, client_sk = libnacl.crypto_kx_keypair()
server_pk, server_sk = libnacl.crypto_kx_keypair()
rx, tx, status = libnacl.crypto_kx_client_session_keys(client_pk, client_sk, server_pk)
rx2, tx2, status = libnacl.crypto_kx_client_session_keys(client_pk, client_sk, server_pk)

self.assertEqual(32, len(rx))
self.assertEqual(32, len(tx))
self.assertEqual(rx, rx2)
self.assertEqual(tx, tx2)

def test_crypto_kx_server_session_keys(self):
client_pk, client_sk = libnacl.crypto_kx_keypair()
server_pk, server_sk = libnacl.crypto_kx_keypair()
rx, tx, status = libnacl.crypto_kx_server_session_keys(client_pk, client_sk, server_pk)
rx2, tx2, status = libnacl.crypto_kx_server_session_keys(client_pk, client_sk, server_pk)

self.assertEqual(32, len(rx))
self.assertEqual(32, len(tx))
self.assertEqual(rx, rx2)
self.assertEqual(tx, tx2)

0 comments on commit 1da1e84

Please sign in to comment.