nx_bench_kg.nx source
↩ module page · 55 lines · 1838 B
1// nx_bench_kg.nx -- isolated bench: generic vs comb fixed-base k*G.
2import "nx_syscalls.nx"
3import "nx_csprng.nx"
4import "nx_u256.nx"
5import "nx_p256_point.nx"
6import "nx_p256_scalar_mul.nx"
7import "nx_p256_comb.nx"
8
9func bstrlen(s: *u8) -> i64 { var n: i64 = 0; while s[n] != 0 { n = n + 1 } return n }
10func bprint(label: *u8, total_us: i64, n: i64) -> i64 {
11 sys_write(1, label, bstrlen(label))
12 sys_write(1, "=" as *u8, 1)
13 let per: i64 = total_us / n
14 let buf: *u8 = sys_mmap(24)
15 var d: i64 = 0
16 if per == 0 { buf[0] = 48; d = 1 } else {
17 var x: i64 = per; var c: i64 = 0
18 while x > 0 { c = c + 1; x = x / 10 }
19 d = c; var i: i64 = d - 1; x = per
20 while i >= 0 { buf[i] = (48 + (x % 10)) as u8; x = x / 10; i = i - 1 }
21 }
22 sys_write(1, buf, d)
23 sys_write(1, " us/op N=" as *u8, 9)
24 let b2: *u8 = sys_mmap(24); var d2: i64 = 0
25 if n == 0 { b2[0]=48; d2=1 } else {
26 var x2: i64 = n; var c2: i64 = 0
27 while x2 > 0 { c2 = c2 + 1; x2 = x2 / 10 }
28 d2 = c2; var i2: i64 = d2 - 1; x2 = n
29 while i2 >= 0 { b2[i2] = (48 + (x2 % 10)) as u8; x2 = x2 / 10; i2 = i2 - 1 }
30 }
31 sys_write(1, b2, d2)
32 sys_write(1, "\n" as *u8, 1)
33 return 0
34}
35
36func main() -> i64 {
37 let g: *P256Point = p256_point_alloc()
38 p256_point_load_g(g)
39 let table: *i64 = (sys_mmap(NX_P256_COMB_BYTES)) as *i64
40 p256_comb_build(table)
41 let k: *i64 = u256_alloc()
42 let be: *u8 = sys_mmap(32)
43 nx_csprng_fill(be, 32); be[0] = 0
44 u256_load_be(k, be)
45 let pout: *P256Point = p256_point_alloc()
46 var t0: i64 = 0
47 var i: i64 = 0
48
49 p256_scalar_mul(pout, k, g)
50 let NG: i64 = 20
51 t0 = sys_now_us(); i = 0
52 while i < NG { p256_scalar_mul(pout, k, g); i = i + 1 }
53 bprint("p256_kG_generic " as *u8, sys_now_us() - t0, NG)
54 return 0
55}