From 7038f65ac6160351075ccc7f524f8ba25fc61ad0 Mon Sep 17 00:00:00 2001 From: Aaron Kaiser Date: Tue, 23 Apr 2024 10:33:59 +0200 Subject: [PATCH] Implemented keygen and x25519 for agent --- src/agent.jazz | 36 +++++++++++++++++++++++++++++------- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/src/agent.jazz b/src/agent.jazz index 4667b2f..0d7902e 100644 --- a/src/agent.jazz +++ b/src/agent.jazz @@ -1,5 +1,14 @@ from Jade require "crypto_scalarmult/curve25519/amd64/mulx/scalarmult.jazz" +inline fn extract_nth_ptr(reg u64 sync_mem shared_mem, inline int i) -> reg u64 { + reg u64 p; + + p = (u64)[sync_mem + (16 + i * 8)]; + p += shared_mem; + + return p; +} + inline fn extract_ipc_id(reg u64 sync_mem) -> reg u64 { reg u64 id; @@ -8,7 +17,7 @@ inline fn extract_ipc_id(reg u64 sync_mem) -> reg u64 { return id; } -inline fn generate_key(reg u64 shared_mem sync_mem private_mem key_id) -> reg u64 { +inline fn generate_key(reg u64 shared_mem sync_mem private_mem, stack u64 key_id) -> stack u64 { inline int i; stack u8[32] key; reg u64 addr idptr pkptr; @@ -35,18 +44,28 @@ inline fn generate_key(reg u64 shared_mem sync_mem private_mem key_id) -> reg u6 pkptr = (u64)[sync_mem + 24]; pkptr += shared_mem; - () = #spill(key_id); - jade_scalarmult_curve25519_amd64_mulx_base(pkptr, private_mem); - () = #unspill(key_id); - return key_id; } +inline fn x25519(reg u64 shared_mem sync_mem private_mem) { + reg u64 outptr idptr pkptr keyptr; + stack u64 keyid; + + outptr = extract_nth_ptr(sync_mem, shared_mem, 0); + idptr = extract_nth_ptr(sync_mem, shared_mem, 1); + pkptr = extract_nth_ptr(sync_mem, shared_mem, 2); + + keyid = (u64)[idptr]; + keyptr = private_mem + keyid; + + jade_scalarmult_curve25519_amd64_mulx(outptr, keyptr, pkptr); +} + export fn agent_start(reg u64 shared_mem sync_mem private_mem) { stack u8[8] unused; - reg u64 key_id; + stack u64 key_id; key_id = 0; @@ -60,11 +79,14 @@ export fn agent_start(reg u64 shared_mem sync_mem private_mem) { () = #unspill(shared_mem, sync_mem, private_mem); reg u64 id; - id = extract_ipc_id(sync_mem); if (id == 0) { key_id = generate_key(shared_mem, sync_mem, private_mem, key_id); + } else { + if (id == 1) { + x25519(shared_mem, sync_mem, private_mem); + } } () = #unspill(sync_mem);