nx_game_pair_layout_lib.nx source
↩ module page · 62 lines · 2771 B
1// nx_game_pair_layout_lib.nx -- Verifies agreement between two game page artifacts using shared memory and payload constraints.
2import "nx_wasm_layout_verify_lib.nx"
3import "nx_game_page_artifact_lib.nx"
4
5// These joins establish agreement, not authenticity of the source reservations.
6func gpl_records(a: *u8,an: i64,b: *u8,bn: i64) -> i64 {
7 if wlv_check(a,an,0)!=1 || wlv_check(b,bn,1)!=1 { return 0 }
8 if an!=bn || wlv_word(a,16)!=wlv_word(b,16) || wlv_word(a,24)!=wlv_word(b,24) { return 0 }
9 return gpa_same((a as i64+WLV_HEADER) as *u8,an-WLV_HEADER,(b as i64+WLV_HEADER) as *u8,bn-WLV_HEADER)
10}
11func gpl_memory(wasm: *u8,n: i64,r: *u8,shared: i64) -> i64 {
12 var c: GpaWasmCursor
13 var m: GpaMemory
14 m.count=0
15 var section: i64=5
16 if shared==1 { section=2 }
17 if gpa_section(wasm,n,section,&c)!=1 { return 0 }
18 if gpa_memory_section(c.data,c.size,shared,&m)!=1 { return 0 }
19 if m.minimum!=wlv_word(r,32) { return 0 }
20 return 1
21}
22func gpl_payloads(wasm: *u8,n: i64,r: *u8) -> i64 {
23 var c: GpaWasmCursor
24 if gpa_section(wasm,n,11,&c)!=1 { return 0 }
25 let total: i64=gpa_u32(&c)
26 if total<0 { return 0 }
27 let count: i64=wlv_word(r,16)
28 var k: i64=0
29 var seen: i64=0
30 while k<count {
31 let row: i64=WLV_HEADER+k*WLV_ROW
32 let flags: i64=wlv_word(r,row+24)
33 if (flags&1)==0 {
34 if seen>=total || gpa_u32(&c)!=0 { return 0 }
35 if gpa_i32_constant(&c)!=wlv_word(r,row+8) || gpa_bytes(&c,"0b")!=1 { return 0 }
36 let size: i64=gpa_u32(&c)
37 if size!=wlv_word(r,row+16) || size>c.size-c.pos { return 0 }
38 if (flags&2)!=0 { if size<1 || c.data[c.pos+size-1]!=0 { return 0 } }
39 c.pos=c.pos+size;seen=seen+1
40 }
41 k=k+1
42 }
43 if seen!=total || c.pos!=c.size { return 0 }
44 return 1
45}
46func gpl_state(plain: *u8,pn: i64,twin: *u8,tn: i64,r: *u8) -> i64 {
47 var a: GpaWasmCursor
48 var b: GpaWasmCursor
49 var body: GpaWasmCursor
50 if gpa_section(plain,pn,10,&a)!=1 || gpa_section(twin,tn,10,&b)!=1 { return 0 }
51 if gpa_code_prefix(&a,&b,&body)!=1 || gpa_bytes(&body,"01017e")!=1 { return 0 }
52 if gpa_i32_constant(&body)!=wlv_word(r,40) { return 0 }
53 return 1
54}
55func gpl_pair(plain: *u8,pn: i64,twin: *u8,tn: i64,pr: *u8,rn: i64,sr: *u8,sn: i64) -> i64 {
56 if gpl_records(pr,rn,sr,sn)!=1 { return 0 }
57 if gpl_memory(plain,pn,pr,0)!=1 || gpl_memory(twin,tn,sr,1)!=1 { return 0 }
58 if gpl_payloads(plain,pn,pr)!=1 || gpl_state(plain,pn,twin,tn,sr)!=1 { return 0 }
59 if gpa_application_code(plain,pn,twin,tn)!=1 || gpa_data_initialization(plain,pn,twin,tn)!=1 { return 0 }
60 if gpa_interface_extension(plain,pn,twin,tn)!=1 || gpa_extension_envelope(plain,pn,twin,tn)!=1 { return 0 }
61 return 1
62}