nx_aesctr_ni_bench.nx source
↩ module page · 86 lines · 3173 B
1// nx_aesctr_ni_bench.nx -- direct 1:1 speedup of the AES-GCM hot path (AES-CTR block
2// encryption): software aes128_encrypt_block vs hardware __aes128_enc_block, same key,
3// same buffer, same tools. Must be compiled by the AES-NI-capable toolchain.
4//
5// expect_exit: 0 (prints both throughputs; exits nonzero only on a correctness mismatch)
6
7import "nx_syscalls.nx"
8import "nx_aes128_gcm.nx"
9const K_MAGIC_2970000: i64 = 2970000
10const K_MAGIC_1000000: i64 = 1000000
11
12func b_ps(s: *u8, n: i64) -> i64 { sys_write(1, s, n); return 0 }
13func b_pn(v: i64) -> i64 {
14 let b: *u8 = sys_mmap(24)
15 var x: i64 = v
16 if x < 0 { x = 0 - x }
17 var i: i64 = 22
18 if x == 0 { b[i] = 0x30 as u8; i = i - 1 }
19 else { while x > 0 { b[i] = (0x30 + (x - (x/10)*10)) as u8; x = x / 10; i = i - 1 } }
20 sys_write(1, ((b as i64) + i + 1) as *u8, 22 - i)
21 return 0
22}
23
24func main() -> i64 {
25 let key: *u8 = sys_mmap(16)
26 var i: i64 = 0
27 while i < 16 { key[i] = (i + 1) as u8; i = i + 1 }
28 let sched: *u8 = sys_mmap(176)
29 aes128_expand_key(key, sched)
30
31 // --- correctness cross-check: software vs AES-NI on one block must match ---
32 let sw: *u8 = sys_mmap(16)
33 let blk: *u8 = sys_mmap(16)
34 let ctr0: *u8 = sys_mmap(16)
35 i = 0
36 while i < 16 { ctr0[i] = (i * 3 + 1) as u8; i = i + 1 }
37 aes128_encrypt_block(ctr0, sched, sw) // software
38 i = 0
39 while i < 16 { blk[i] = ctr0[i]; i = i + 1 }
40 let cz: i64 = __aes128_enc_block(blk, sched) // hardware (in place)
41 i = 0
42 while i < 16 {
43 if (sw[i]&0xff) != (blk[i]&0xff) { b_ps("MISMATCH at " as *u8, 12); b_pn(i); b_ps("\n" as *u8, 1); sys_exit(1); return 1 }
44 i = i + 1
45 }
46 b_ps("xcheck OK (software == AES-NI)\n" as *u8, 30)
47
48 let N: i64 = K_MAGIC_2970000
49 let ctr: *u8 = sys_mmap(16)
50 let ks: *u8 = sys_mmap(16)
51 let mb: i64 = N / K_MAGIC_1000000
52
53 // --- software AES-CTR ---
54 i = 0
55 while i < 16 { ctr[i] = 0; i = i + 1 }
56 let t0: i64 = sys_now_ms()
57 var pos: i64 = 0
58 while pos < N { aes128_encrypt_block(ctr, sched, ks); nx_aes128_gcm_inc32(ctr); pos = pos + 16 }
59 let t1: i64 = sys_now_ms()
60
61 // --- hardware AES-NI CTR ---
62 i = 0
63 while i < 16 { ctr[i] = 0; i = i + 1 }
64 let t2: i64 = sys_now_ms()
65 pos = 0
66 while pos < N {
67 var b: i64 = 0
68 while b < 16 { ks[b] = ctr[b]; b = b + 1 }
69 let r: i64 = __aes128_enc_block(ks, sched)
70 nx_aes128_gcm_inc32(ctr)
71 pos = pos + 16
72 }
73 let t3: i64 = sys_now_ms()
74
75 let sw_ms: i64 = t1 - t0
76 let ni_ms: i64 = t3 - t2
77 b_ps("software AES-CTR " as *u8, 17); b_pn(mb); b_ps("MB = " as *u8, 5); b_pn(sw_ms); b_ps("ms" as *u8, 2)
78 if sw_ms > 0 { b_ps(" (" as *u8, 3); b_pn((N/1000)/sw_ms); b_ps(" KB/s)" as *u8, 6) }
79 b_ps("\n" as *u8, 1)
80 b_ps("AES-NI AES-CTR " as *u8, 17); b_pn(mb); b_ps("MB = " as *u8, 5); b_pn(ni_ms); b_ps("ms" as *u8, 2)
81 if ni_ms > 0 { b_ps(" (" as *u8, 3); b_pn((N/1000)/ni_ms); b_ps(" KB/s)" as *u8, 6) }
82 b_ps("\n" as *u8, 1)
83 if ni_ms > 0 { b_ps("speedup x" as *u8, 9); b_pn(sw_ms / ni_ms); b_ps("\n" as *u8, 1) }
84 sys_exit(0)
85 return 0
86}