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}