code wiki / (root) / nx_game_pair_layout_lib.nx

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}