code wiki / _hdl_build / nx_x25519_wasm_vm_gate.nx
nx_x25519_wasm_vm_gate.nx source
↩ module page · 55 lines · 3813 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"
8
9func main() -> i64 {
10 g_puts("nx_x25519.wasm VM gate (RFC 7748 5.2 scalarmult KAT, executed in nx_wasm_vm)\n" as *u8)
11 var pass: i64 = 0; var total: i64 = 0
12 let box: *i64 = sys_mmap(16) as *i64
13 let wasm: *u8 = sys_read_file("/mnt/c/Users/elder/nishi-core/nxc2/web_assets/_video_build/nx_x25519.wasm" as *u8, box)
14 if (wasm as i64) == 0 { g_puts(" FAIL read\n" as *u8); g_puts("verdict=RED\n" as *u8); sys_exit(1); return 1 }
15 let mod: *WasmMod = wm_new(wasm, box[0])
16 if wm_parse(mod) != 0 { g_puts(" FAIL parse\n" as *u8); g_puts("verdict=RED\n" as *u8); sys_exit(1); return 1 }
17 mod.mem = sys_mmap(131072) as *u8
18 let fidx: i64 = wm_find_export(mod, "nx_x25519_scalarmult" as *u8)
19 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)
20 pass = pass + g_check("nx_x25519_scalarmult exported" as *u8, fidx >= 0); total=total+1
21
22 let sc: *i64 = sys_mmap(32*8) as *i64
23 sc[0]=165; sc[1]=70; sc[2]=227; sc[3]=107; sc[4]=240; sc[5]=82; sc[6]=124; sc[7]=157
24 sc[8]=59; sc[9]=22; sc[10]=21; sc[11]=75; sc[12]=130; sc[13]=70; sc[14]=94; sc[15]=221
25 sc[16]=98; sc[17]=20; sc[18]=76; sc[19]=10; sc[20]=193; sc[21]=252; sc[22]=90; sc[23]=24
26 sc[24]=80; sc[25]=106; sc[26]=34; sc[27]=68; sc[28]=186; sc[29]=68; sc[30]=154; sc[31]=196
27 let u: *i64 = sys_mmap(32*8) as *i64
28 u[0]=230; u[1]=219; u[2]=104; u[3]=103; u[4]=88; u[5]=48; u[6]=48; u[7]=219
29 u[8]=53; u[9]=148; u[10]=193; u[11]=164; u[12]=36; u[13]=177; u[14]=95; u[15]=124
30 u[16]=114; u[17]=102; u[18]=36; u[19]=236; u[20]=38; u[21]=179; u[22]=53; u[23]=59
31 u[24]=16; u[25]=169; u[26]=3; u[27]=166; u[28]=208; u[29]=171; u[30]=28; u[31]=76
32 let exp: *i64 = sys_mmap(32*8) as *i64
33 exp[0]=195; exp[1]=218; exp[2]=85; exp[3]=55; exp[4]=157; exp[5]=233; exp[6]=198; exp[7]=144
34 exp[8]=142; exp[9]=148; exp[10]=234; exp[11]=77; exp[12]=242; exp[13]=141; exp[14]=8; exp[15]=79
35 exp[16]=50; exp[17]=236; exp[18]=207; exp[19]=3; exp[20]=73; exp[21]=28; exp[22]=113; exp[23]=247
36 exp[24]=84; exp[25]=180; exp[26]=7; exp[27]=85; exp[28]=119; exp[29]=162; exp[30]=133; exp[31]=82
37
38 // scalar at 0, point at 64, scratch at 256 (1024 B), out at 2048
39 var i: i64 = 0
40 while i < 32 { mod.mem[i] = sc[i] as u8; mod.mem[64 + i] = u[i] as u8; i = i + 1 }
41 g_puts(" running scalarmult via the VM (Montgomery ladder, interpreted -- may be slow)...\n" as *u8)
42 wm_run(mod, "nx_x25519_scalarmult" as *u8, 0, 64, 256, 2048, 0, 4)
43
44 g_puts(" digest first4 = " as *u8)
45 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)
46 g_puts(" (RFC expect 195 218 85 55)\n" as *u8)
47 var ok: i64 = 1
48 i = 0
49 while i < 32 { if (mod.mem[2048 + i] as i64) != exp[i] { ok = 0 } i = i + 1 }
50 pass = pass + g_check("x25519 scalarmult matches RFC 7748 KAT (E2E key agreement wasm is correct)" as *u8, ok); total=total+1
51
52 g_puts("---- x25519 VM gate: passed " as *u8); g_pn(pass); g_puts(" / " as *u8); g_pn(total); g_puts(" ----\n" as *u8)
53 if pass == total { g_puts("verdict=GREEN\n" as *u8); sys_exit(0); return 0 }
54 g_puts("verdict=RED\n" as *u8); sys_exit(1); return 1
55}