code wiki / _hdl_build / nx_x25519_wasm_vm_gate.nx
nx_x25519_wasm_vm_gate.nx source
↩ module page · 63 lines · 4261 B
1// nx_x25519_wasm_vm_gate.nx -- KAT-verify the E2E chat's KEY AGREEMENT primitive: run the shipped nx_x25519.wasm in
2// the sovereign VM on RFC 7748 ยง5.2 test vector 1 and check the scalar-mult output. If GREEN, the byte-width + OP_NOT
3// backend fixes produced a CORRECT x25519 wasm -- the foundation of the hybrid-PQ E2E session is sound, proven on the
4// shipped bytes. nx_x25519_scalarmult(scalar32, point32, scratch>=1024, out32).
5import "nx_syscalls.nx"
6import "nx_gate_emit_lib.nx"
7import "nx_wasm_vm.nx"
8import "nx_gate_verdict.nx"
9
10func main() -> i64 {
11 g_puts("nx_x25519.wasm VM gate (RFC 7748 5.2 scalarmult KAT, executed in nx_wasm_vm)\n" as *u8)
12 var pass: i64 = 0; var total: i64 = 0
13 let box: *i64 = sys_mmap(16) as *i64
14 let wasm: *u8 = sys_read_file("/mnt/c/Users/elder/nishi-core/nxc2/web_assets/_video_build/nx_x25519.wasm" as *u8, box)
15 if (wasm as i64) == 0 { g_puts(" FAIL read\n" as *u8); g_puts("verdict=RED\n" as *u8); sys_exit(1); return 1 }
16 let mod: *WasmMod = wm_new(wasm, box[0])
17 if wm_parse(mod) != 0 { g_puts(" FAIL parse\n" as *u8); g_puts("verdict=RED\n" as *u8); sys_exit(1); return 1 }
18 mod.mem = sys_mmap(131072) as *u8
19 let fidx: i64 = wm_find_export(mod, "nx_x25519_scalarmult" as *u8)
20 g_puts(" [measure] funcs=" as *u8); g_pn(mod.n_funcs); g_puts(" scalarmult fidx=" as *u8); g_pn(fidx); g_puts("\n" as *u8)
21 pass = pass + g_check("nx_x25519_scalarmult exported" as *u8, fidx >= 0); total=total+1
22
23 let sc: *i64 = sys_mmap(32*8) as *i64
24 sc[0]=165; sc[1]=70; sc[2]=227; sc[3]=107; sc[4]=240; sc[5]=82; sc[6]=124; sc[7]=157
25 sc[8]=59; sc[9]=22; sc[10]=21; sc[11]=75; sc[12]=130; sc[13]=70; sc[14]=94; sc[15]=221
26 sc[16]=98; sc[17]=20; sc[18]=76; sc[19]=10; sc[20]=193; sc[21]=252; sc[22]=90; sc[23]=24
27 sc[24]=80; sc[25]=106; sc[26]=34; sc[27]=68; sc[28]=186; sc[29]=68; sc[30]=154; sc[31]=196
28 let u: *i64 = sys_mmap(32*8) as *i64
29 u[0]=230; u[1]=219; u[2]=104; u[3]=103; u[4]=88; u[5]=48; u[6]=48; u[7]=219
30 u[8]=53; u[9]=148; u[10]=193; u[11]=164; u[12]=36; u[13]=177; u[14]=95; u[15]=124
31 u[16]=114; u[17]=102; u[18]=36; u[19]=236; u[20]=38; u[21]=179; u[22]=53; u[23]=59
32 u[24]=16; u[25]=169; u[26]=3; u[27]=166; u[28]=208; u[29]=171; u[30]=28; u[31]=76
33 let exp: *i64 = sys_mmap(32*8) as *i64
34 exp[0]=195; exp[1]=218; exp[2]=85; exp[3]=55; exp[4]=157; exp[5]=233; exp[6]=198; exp[7]=144
35 exp[8]=142; exp[9]=148; exp[10]=234; exp[11]=77; exp[12]=242; exp[13]=141; exp[14]=8; exp[15]=79
36 exp[16]=50; exp[17]=236; exp[18]=207; exp[19]=3; exp[20]=73; exp[21]=28; exp[22]=113; exp[23]=247
37 exp[24]=84; exp[25]=180; exp[26]=7; exp[27]=85; exp[28]=119; exp[29]=162; exp[30]=133; exp[31]=82
38
39 // scalar at 0, point at 64, scratch at 256 (1024 B), out at 2048
40 var i: i64 = 0
41 while i < 32 { mod.mem[i] = sc[i] as u8; mod.mem[64 + i] = u[i] as u8; i = i + 1 }
42 g_puts(" running scalarmult via the VM (Montgomery ladder, interpreted -- may be slow)...\n" as *u8)
43 wm_run(mod, "nx_x25519_scalarmult" as *u8, 0, 64, 256, 2048, 0, 4)
44
45 g_puts(" digest first4 = " as *u8)
46 g_pn(mod.mem[2048] as i64); g_puts(" " as *u8); g_pn(mod.mem[2049] as i64); g_puts(" " as *u8); g_pn(mod.mem[2050] as i64); g_puts(" " as *u8); g_pn(mod.mem[2051] as i64)
47 g_puts(" (RFC expect 195 218 85 55)\n" as *u8)
48 var ok: i64 = 1
49 i = 0
50 while i < 32 { if (mod.mem[2048 + i] as i64) != exp[i] { ok = 0 } i = i + 1 }
51 pass = pass + g_check("x25519 scalarmult matches RFC 7748 KAT (E2E key agreement wasm is correct)" as *u8, ok); total=total+1
52
53 g_puts("---- x25519 VM gate: passed " as *u8); g_pn(pass); g_puts(" / " as *u8); g_pn(total); g_puts(" ----\n" as *u8)
54 // MIGRATED onto nx_gate_verdict by nx_gate_dry_apply (D001, minimal form): every check
55 // row above is untouched, so the PASS/FAIL vector cannot change; only the hand-rolled
56 // verdict emission is replaced by the ONE shared base class. Proven by nx_gate_migrate verify.
57 let ctr__dry: *i64 = gv_ctr()
58 ctr__dry[0] = pass
59 ctr__dry[1] = total
60 let rc__dry: i64 = gv_verdict("X25519-WASM-VM-GATE" as *u8, ctr__dry, "teeth unchanged; verdict emission migrated onto the shared base class" as *u8)
61 sys_exit(rc__dry)
62 return rc__dry
63}