code wiki / _hdl_build / nx_poly1305_tput_probe.nx
nx_poly1305_tput_probe.nx source
↩ module page · 44 lines · 1643 B
1// nx_poly1305_tput_probe.nx -- measure Nishi Poly1305 MAC throughput in
2// isolation (16 MiB), the OTHER per-byte cost in ChaCha20-Poly1305 AEAD.
3// Mirrors nx_chacha_tput_probe so the two halves of the TLS cipher are
4// comparable apples-to-apples. license_tier: ORIGINAL
5import "nx_syscalls.nx"
6import "nx_poly1305.nx"
7const K_MAGIC_4096: i64 = 4096
8const K_MAGIC_16777216: i64 = 16777216
9
10func p_w(fd: i64, s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(fd, s, n); return 0 }
11func p_wn(fd: i64, v: i64) -> i64 {
12 var m: i64 = v
13 if m < 0 { m = 0 }
14 let bb: *u8 = sys_mmap(28)
15 let t: *u8 = sys_mmap(28)
16 var k: i64 = 0
17 if m == 0 { t[0] = 48 as u8; k = 1 }
18 while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 }
19 var i: i64 = 0
20 while i < k { bb[i] = t[k - 1 - i]; i = i + 1 }
21 sys_write(fd, bb, k)
22 return 0
23}
24
25func main() -> i64 {
26 let key: *u8 = sys_mmap(32)
27 let msg: *u8 = sys_mmap(K_MAGIC_4096)
28 let tag: *u8 = sys_mmap(16)
29 var i: i64 = 0
30 while i < 32 { key[i] = (i & 255) as u8; i = i + 1 }
31 i = 0
32 while i < K_MAGIC_4096 { msg[i] = (i & 255) as u8; i = i + 1 }
33 let t0: i64 = sys_now_us()
34 var k: i64 = 0
35 while k < K_MAGIC_4096 { poly1305_mac(key, msg, K_MAGIC_4096, tag); k = k + 1 }
36 let t1: i64 = sys_now_us()
37 let us: i64 = t1 - t0
38 var mbps: i64 = 0
39 if us > 0 { mbps = K_MAGIC_16777216 / us }
40 p_w(1, "POLY1305 throughput: 16 MiB in " as *u8); p_wn(1, us)
41 p_w(1, " us = ~" as *u8); p_wn(1, mbps); p_w(1, " MB/s (vs OpenSSL poly1305 ~1000-3000 MB/s)\n" as *u8)
42 sys_exit(0)
43 return 0
44}