Skip to content
Snippets Groups Projects
Commit eb44a5da authored by Charles Wright's avatar Charles Wright
Browse files

Brought the low-level CFFI Python demo into sync with the C code

parent 101d7779
No related branches found
No related tags found
No related merge requests found
......@@ -2,48 +2,88 @@
from _bsspeke_cffi import ffi, lib
def bsspeke_setup(user):
def bsspeke_setup():
client = ffi.new("bsspeke_client_ctx *")
lib.bsspeke_client_init(client, b"@alice:example.com", 18, b"example.com", 10, b"P@ssword1", 9)
server = ffi.new("bsspeke_server_ctx *")
lib.bsspeke_server_init(server, b"example.com", 10)
lib.bsspeke_server_init(server, b"example.com", 10, b"@alice:example.com", 18)
msg1 = ffi.new("bsspeke_setup_msg1_t *")
msg2 = ffi.new("bsspeke_setup_msg2_t *")
msg3 = ffi.new("bsspeke_setup_msg3_t *")
print("Message 1")
blind = bytes(32)
lib.bsspeke_client_generate_blind(blind, client)
lib.bsspeke_client_setup_generate_message1(msg1, client)
lib.bsspeke_server_setup_generate_message2(msg2, msg1, user, server)
lib.bsspeke_client_setup_generate_message3(msg3, msg2, 100000, 3, client)
lib.bsspeke_server_setup_process_message3(msg3, user, server)
print("Message 2")
salt = b"\xff" * 32
blind_salt = bytes(32)
lib.bsspeke_server_blind_salt(blind_salt, blind, salt, 32)
print("Message 3")
P = bytes(32)
V = bytes(32)
phf_blocks = 100000
phf_iterations = 3
lib.bsspeke_client_generate_P_and_V(P, V, blind_salt, phf_blocks, phf_iterations, client)
def bsspeke_login(user):
return (P,V,phf_blocks,phf_iterations)
def bsspeke_login(user_params):
client = ffi.new("bsspeke_client_ctx *")
lib.bsspeke_client_init(client, b"@alice:example.com", 18, b"example.com", 10, b"P@ssword1", 9)
server = ffi.new("bsspeke_server_ctx *")
lib.bsspeke_server_init(server, b"example.com", 10)
lib.bsspeke_server_init(server, b"example.com", 10, b"@alice:example.com", 18)
P,V,phf_blocks,phf_iterations = user_params
print("Message 1")
blind = bytes(32)
lib.bsspeke_client_generate_blind(blind, client)
print("Message 2")
salt = b"\xff" * 32
blind_salt = bytes(32)
lib.bsspeke_server_blind_salt(blind_salt, blind, salt, 32)
lib.bsspeke_server_generate_B(P, server);
B = bytes(ffi.buffer(server.B, 32))
print("Message 3")
lib.bsspeke_client_generate_A(blind_salt, phf_blocks, phf_iterations, client)
A = bytes(ffi.buffer(client.A, 32))
lib.bsspeke_client_derive_shared_key(B, client)
client_verifier = bytes(32)
lib.bsspeke_client_generate_verifier(client_verifier, client)
print("Message 4")
lib.bsspeke_server_derive_shared_key(A, V, server)
rc_server = lib.bsspeke_server_verify_client(client_verifier, server)
if rc_server != 0:
print("ERROR: Server failed to verify client")
print("LOGIN FAILED")
return -1
server_verifier = bytes(32)
lib.bsspeke_server_generate_verifier(server_verifier, server)
msg1 = ffi.new("bsspeke_login_msg1_t *")
msg2 = ffi.new("bsspeke_login_msg2_t *")
msg3 = ffi.new("bsspeke_login_msg3_t *")
msg4 = ffi.new("bsspeke_login_msg4_t *")
print("Wrapping Up")
rc_client = lib.bsspeke_client_verify_server(server_verifier, client)
if rc_client != 0:
print("ERROR: Client failed to verify server")
print("LOGIN FAILED")
return -1
lib.bsspeke_client_login_generate_message1(msg1, client)
lib.bsspeke_server_login_generate_message2(msg2, msg1, user, server)
lib.bsspeke_client_login_generate_message3(msg3, msg2, client)
lib.bsspeke_server_login_generate_message4(msg4, msg3, user, server)
lib.bsspeke_client_login_verify_message4(msg4, client)
return 0
if __name__ == "__main__":
print("Creating user info object to represent the server's long-term storage")
user = ffi.new("bsspeke_user_info_t *")
print("\n\nStarting setup...")
bsspeke_setup(user)
user_params = bsspeke_setup()
print("\n\nRunning login...")
bsspeke_login(user)
rc = bsspeke_login(user_params)
if rc != 0:
print("BS-SPEKE login failed :(")
else:
print("SUCCESS!!!!!")
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment