code wiki / bin / nx_bench_x25519.nx

nx_bench_x25519.nx source

↩ module page · 43 lines · 1685 B

1// nx_bench_x25519.nx -- isolated X25519 ECDH (variable-base) bench. 2import "nx_syscalls.nx" 3import "nx_csprng.nx" 4import "nx_x25519_ephemeral.nx" 5 6func bstrlen(s: *u8) -> i64 { var n: i64 = 0; while s[n] != 0 { n = n + 1 } return n } 7func bprint(label: *u8, total_us: i64, n: i64) -> i64 { 8 sys_write(1, label, bstrlen(label)); sys_write(1, "=" as *u8, 1) 9 let per: i64 = total_us / n 10 let buf: *u8 = sys_mmap(24); var d: i64 = 0 11 if per == 0 { buf[0] = 48; d = 1 } else { 12 var x: i64 = per; var c: i64 = 0 13 while x > 0 { c = c + 1; x = x / 10 } 14 d = c; var i: i64 = d - 1; x = per 15 while i >= 0 { buf[i] = (48 + (x % 10)) as u8; x = x / 10; i = i - 1 } 16 } 17 sys_write(1, buf, d); sys_write(1, " us/op N=" as *u8, 9) 18 let b2: *u8 = sys_mmap(24); var d2: i64 = 0 19 if n == 0 { b2[0]=48; d2=1 } else { 20 var x2: i64 = n; var c2: i64 = 0 21 while x2 > 0 { c2 = c2 + 1; x2 = x2 / 10 } 22 d2 = c2; var i2: i64 = d2 - 1; x2 = n 23 while i2 >= 0 { b2[i2] = (48 + (x2 % 10)) as u8; x2 = x2 / 10; i2 = i2 - 1 } 24 } 25 sys_write(1, b2, d2); sys_write(1, "\n" as *u8, 1) 26 return 0 27} 28 29func main() -> i64 { 30 let priv: *u8 = sys_mmap(32) 31 let pub2: *u8 = sys_mmap(32) 32 let secret: *u8 = sys_mmap(32) 33 let peerpriv: *u8 = sys_mmap(32) 34 nx_csprng_fill(priv, 32) 35 nx_csprng_fill(peerpriv, 32) 36 x25519_gen_keypair(peerpriv, pub2) 37 x25519_shared_secret(priv, pub2, secret) // warmup 38 let NX: i64 = 80 39 var t0: i64 = sys_now_us(); var i: i64 = 0 40 while i < NX { x25519_shared_secret(priv, pub2, secret); i = i + 1 } 41 bprint("x25519_ecdh " as *u8, sys_now_us() - t0, NX) 42 return 0 43}