some refactoring
This commit is contained in:
@@ -4,8 +4,8 @@ let
|
|||||||
jasmin-src = fetchFromGitHub {
|
jasmin-src = fetchFromGitHub {
|
||||||
owner = "jasmin-lang";
|
owner = "jasmin-lang";
|
||||||
repo = "jasmin";
|
repo = "jasmin";
|
||||||
rev = "4d42c212b924ad7553c2eab49d337fd128ad629b";
|
rev = "c2adabafb8df0a60e7cf4e56041d3be3aca387a3";
|
||||||
hash = "sha256-Ve9Eezpvi1wynlqQxO4KDSqw13MDXQmR8NjOS3PHWzg=";
|
hash = "sha256-ySw4eVbuV7suO8EjyaMOTqeNsPq1D6vsorCZlXffTPU=";
|
||||||
};
|
};
|
||||||
|
|
||||||
jasmin-drv = callPackage "${jasmin-src}/default.nix" { inherit pkgs; };
|
jasmin-drv = callPackage "${jasmin-src}/default.nix" { inherit pkgs; };
|
||||||
|
|||||||
@@ -1,5 +1,9 @@
|
|||||||
from Jade require "crypto_scalarmult/curve25519_mulx/curve25519_mulx.jazz"
|
from Jade require "crypto_scalarmult/curve25519_mulx/curve25519_mulx.jazz"
|
||||||
|
|
||||||
|
param int SK_SIZE = 32;
|
||||||
|
param int SHARED_MEM_SIZE = 1024;
|
||||||
|
param int PRIVATE_MEM_SIZE = 3200;
|
||||||
|
|
||||||
inline fn extract_nth_ptr(reg u64 sync_mem shared_mem, inline int i) -> reg u64 {
|
inline fn extract_nth_ptr(reg u64 sync_mem shared_mem, inline int i) -> reg u64 {
|
||||||
reg u64 p;
|
reg u64 p;
|
||||||
|
|
||||||
@@ -17,41 +21,45 @@ inline fn extract_ipc_id(reg u64 sync_mem) -> reg u64 {
|
|||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline fn generate_keypair(reg u64 shared_mem sync_mem private_mem, stack u64 key_id) -> stack u64 {
|
inline fn generate_keypair(reg u64 shared_mem sync_mem private_mem, stack u64 key_id) -> (stack u64, reg u64) {
|
||||||
inline int i;
|
inline int i;
|
||||||
stack u8[32] key;
|
stack u8[SK_SIZE] key;
|
||||||
reg u64 addr idptr pkptr flag num_bytes;
|
reg u64 addr idptr pkptr flag num_bytes return_value;
|
||||||
|
|
||||||
flag = 0;
|
return_value = 0;
|
||||||
key, num_bytes = #randombytes(key, flag);
|
|
||||||
|
while {
|
||||||
|
flag = 0;
|
||||||
|
key, num_bytes = #randombytes(key, flag);
|
||||||
|
} (num_bytes != SK_SIZE)
|
||||||
key[0] &= 248;
|
key[0] &= 248;
|
||||||
key[31] &= 127;
|
key[31] &= 127;
|
||||||
key[31] |= 64;
|
key[31] |= 64;
|
||||||
|
|
||||||
addr = key_id * 32;
|
addr = key_id * SK_SIZE;
|
||||||
addr += private_mem;
|
addr += private_mem;
|
||||||
|
|
||||||
for i=0 to 4 {
|
for i=0 to SK_SIZE/8 {
|
||||||
(u64)[addr + i * 8] = key[u64 i];
|
(u64)[addr + i * 8] = key[u64 i];
|
||||||
}
|
}
|
||||||
|
|
||||||
idptr = (u64)[sync_mem + 16];
|
idptr = extract_nth_ptr(sync_mem, shared_mem, 0);
|
||||||
idptr += shared_mem;
|
|
||||||
|
|
||||||
(u64)[idptr] = key_id;
|
(u64)[idptr] = key_id;
|
||||||
|
|
||||||
pkptr = (u64)[sync_mem + 24];
|
pkptr = extract_nth_ptr(sync_mem, shared_mem, 1);
|
||||||
pkptr += shared_mem;
|
|
||||||
|
|
||||||
jade_scalarmult_curve25519_amd64_mulx_base(pkptr, addr);
|
jade_scalarmult_curve25519_amd64_mulx_base(pkptr, addr);
|
||||||
|
|
||||||
key_id += 1;
|
key_id += 1;
|
||||||
|
|
||||||
return key_id;
|
return_value = 1;
|
||||||
|
return key_id, return_value;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline fn calculate_pubkey(reg u64 shared_mem sync_mem private_mem) {
|
inline fn calculate_pubkey(reg u64 shared_mem sync_mem private_mem) -> reg u64 {
|
||||||
reg u64 skptr outptr;
|
reg u64 skptr outptr return_value;
|
||||||
|
return_value = 0;
|
||||||
|
|
||||||
skptr = extract_nth_ptr(sync_mem, shared_mem, 0);
|
skptr = extract_nth_ptr(sync_mem, shared_mem, 0);
|
||||||
outptr = extract_nth_ptr(sync_mem, shared_mem, 1);
|
outptr = extract_nth_ptr(sync_mem, shared_mem, 1);
|
||||||
@@ -61,12 +69,17 @@ inline fn calculate_pubkey(reg u64 shared_mem sync_mem private_mem) {
|
|||||||
skptr += private_mem;
|
skptr += private_mem;
|
||||||
|
|
||||||
jade_scalarmult_curve25519_amd64_mulx_base(outptr, skptr);
|
jade_scalarmult_curve25519_amd64_mulx_base(outptr, skptr);
|
||||||
|
|
||||||
|
return_value = 1;
|
||||||
|
return return_value;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline fn x25519(reg u64 shared_mem sync_mem private_mem) {
|
inline fn x25519(reg u64 shared_mem sync_mem private_mem) -> reg u64 {
|
||||||
reg u64 outptr idptr pkptr keyptr;
|
reg u64 outptr idptr pkptr keyptr return_value;
|
||||||
reg u64 keyid;
|
reg u64 keyid;
|
||||||
|
|
||||||
|
return_value = 0;
|
||||||
|
|
||||||
outptr = extract_nth_ptr(sync_mem, shared_mem, 0);
|
outptr = extract_nth_ptr(sync_mem, shared_mem, 0);
|
||||||
idptr = extract_nth_ptr(sync_mem, shared_mem, 1);
|
idptr = extract_nth_ptr(sync_mem, shared_mem, 1);
|
||||||
pkptr = extract_nth_ptr(sync_mem, shared_mem, 2);
|
pkptr = extract_nth_ptr(sync_mem, shared_mem, 2);
|
||||||
@@ -76,10 +89,13 @@ inline fn x25519(reg u64 shared_mem sync_mem private_mem) {
|
|||||||
keyptr = private_mem + keyid;
|
keyptr = private_mem + keyid;
|
||||||
|
|
||||||
jade_scalarmult_curve25519_amd64_mulx(outptr, keyptr, pkptr);
|
jade_scalarmult_curve25519_amd64_mulx(outptr, keyptr, pkptr);
|
||||||
|
|
||||||
|
return_value = 1;
|
||||||
|
return return_value;
|
||||||
}
|
}
|
||||||
|
|
||||||
export fn agent_start(reg u64 shared_mem sync_mem private_mem_fd) {
|
export fn agent_start(reg u64 shared_mem sync_mem private_mem_fd) {
|
||||||
stack u64 key_id;
|
stack u64 key_id return_value;
|
||||||
reg u64 private_mem;
|
reg u64 private_mem;
|
||||||
// Futex varibles
|
// Futex varibles
|
||||||
reg u64 futex_op val timeout uaddr2 val3 woken_up;
|
reg u64 futex_op val timeout uaddr2 val3 woken_up;
|
||||||
@@ -90,7 +106,7 @@ export fn agent_start(reg u64 shared_mem sync_mem private_mem_fd) {
|
|||||||
|
|
||||||
private_mem_fd = private_mem_fd;
|
private_mem_fd = private_mem_fd;
|
||||||
addr = 0;
|
addr = 0;
|
||||||
len = 3200;
|
len = PRIVATE_MEM_SIZE;
|
||||||
prot = 3; // PROT_READ | PROT_WRITE
|
prot = 3; // PROT_READ | PROT_WRITE
|
||||||
flag = 1; // MAP_SHARED;
|
flag = 1; // MAP_SHARED;
|
||||||
off = 0;
|
off = 0;
|
||||||
@@ -100,15 +116,17 @@ export fn agent_start(reg u64 shared_mem sync_mem private_mem_fd) {
|
|||||||
|
|
||||||
key_id = 0;
|
key_id = 0;
|
||||||
|
|
||||||
|
#no_termination_check
|
||||||
while (true) {
|
while (true) {
|
||||||
() = #unspill(sync_mem);
|
while {
|
||||||
|
() = #unspill(sync_mem);
|
||||||
futex_op = 0;
|
futex_op = 0;
|
||||||
val = 0;
|
val = 0;
|
||||||
timeout = 0;
|
timeout = 0;
|
||||||
uaddr2 = 0;
|
uaddr2 = 0;
|
||||||
val3 = 0;
|
val3 = 0;
|
||||||
woken_up = #futex(sync_mem, futex_op, val, timeout, uaddr2, val3);
|
woken_up = #futex(sync_mem, futex_op, val, timeout, uaddr2, val3);
|
||||||
|
} (woken_up != 0)
|
||||||
|
|
||||||
() = #unspill(shared_mem, sync_mem, private_mem);
|
() = #unspill(shared_mem, sync_mem, private_mem);
|
||||||
|
|
||||||
@@ -116,24 +134,31 @@ export fn agent_start(reg u64 shared_mem sync_mem private_mem_fd) {
|
|||||||
id = extract_ipc_id(sync_mem);
|
id = extract_ipc_id(sync_mem);
|
||||||
|
|
||||||
if (id == 0) {
|
if (id == 0) {
|
||||||
key_id = generate_keypair(shared_mem, sync_mem, private_mem, key_id);
|
if (key_id < 100) {
|
||||||
|
key_id, return_value = generate_keypair(shared_mem, sync_mem, private_mem, key_id);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
if (id == 1) {
|
if (id == 1) {
|
||||||
calculate_pubkey(shared_mem, sync_mem, private_mem);
|
return_value = calculate_pubkey(shared_mem, sync_mem, private_mem);
|
||||||
} else {
|
} else {
|
||||||
if (id == 2) {
|
if (id == 2) {
|
||||||
x25519(shared_mem, sync_mem, private_mem);
|
return_value = x25519(shared_mem, sync_mem, private_mem);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
() = #unspill(sync_mem);
|
() = #unspill(sync_mem);
|
||||||
|
|
||||||
futex_op = 1;
|
(u64)[sync_mem + 16] = return_value;
|
||||||
val = 1;
|
|
||||||
timeout = 0;
|
while {
|
||||||
uaddr2 = 0;
|
() = #unspill(sync_mem);
|
||||||
val3 = 0;
|
futex_op = 1;
|
||||||
woken_up = #futex(sync_mem, futex_op, val, timeout, uaddr2, val3);
|
val = 1;
|
||||||
|
timeout = 0;
|
||||||
|
uaddr2 = 0;
|
||||||
|
val3 = 0;
|
||||||
|
woken_up = #futex(sync_mem, futex_op, val, timeout, uaddr2, val3);
|
||||||
|
} (woken_up != 1)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user