nx_page_final_seal_gate_t364.nx source
↩ module page · 43 lines · 2183 B
1import "nx_game_page_artifact_lib.nx"
2import "nx_gate_verdict.nx"
3func sg_final_matches(page:*u8,n:i64)->i64{
4 let slot:i64=gpa_release_slot(page,n)
5 if slot<=0{return 0}
6 let copy:*u8=sys_mmap_try(n)
7 let digest:*u8=sys_mmap_try(GPA_SHA_HEX+1)
8 if (copy as i64)<=0||(digest as i64)<=0{
9 if (copy as i64)>0{sys_munmap_direct(copy,n)}
10 if (digest as i64)>0{sys_munmap_direct(digest,GPA_SHA_HEX+1)}
11 return -1
12 }
13 var i:i64=0;while i<n{copy[i]=page[i];i=i+1}
14 i=0;while i<GPA_SHA_HEX{copy[slot+i]=48 as u8;i=i+1}
15 gpa_sha(copy,n,digest)
16 var rc:i64=gpa_same((page as i64+slot) as *u8,GPA_SHA_HEX,digest,GPA_SHA_HEX)
17 if sys_munmap_direct(copy,n)!=0{rc=-1}
18 if sys_munmap_direct(digest,GPA_SHA_HEX+1)!=0{rc=-1}
19 return rc
20}
21func main(argc:i64,argv:*i64)->i64{
22 if argc!=2{return 2}
23 let ctr:*i64=gv_ctr();var n:i64=0
24 let page:*u8=sys_read_file(argv[1] as *u8,&n)
25 if (page as i64)<=0||n<=0{return 3}
26 gv_check("actual served final page has stale pre-declaration seal",sg_final_matches(page,n)==0,ctr)
27 let mark:*u8="<meta name=\"nishi-wasm\" data-nishi-role=\"shared-runtime\" content=\""
28 let ml:i64=vw_slen(mark);var at:i64=-1;var i:i64=0
29 while i+ml<n{if gpa_same((page as i64+i) as *u8,ml,mark,ml)==1{at=i+ml;break};i=i+1}
30 gv_check("actual shared metadata is inside final page",at>0&&at<n,ctr)
31 if at<=0{sys_free_file(page,n);return 4}
32 gv_check("existing sealer accepts final composed page",gpa_seal(page,n)==1,ctr)
33 gv_check("declared selfhash equals all final bytes with field zeroed",sg_final_matches(page,n)==1,ctr)
34 let saved:u8=page[at];page[at]=88 as u8
35 gv_check("shared metadata mutation invalidates declared selfhash",sg_final_matches(page,n)==0,ctr)
36 page[at]=saved
37 gv_check("restored shared metadata restores exact identity",sg_final_matches(page,n)==1,ctr)
38 var again_n:i64=0;let again:*u8=sys_read_file(argv[1] as *u8,&again_n)
39 gv_check("qualification leaves source file unchanged",(again as i64)>0&&again_n==n&&sg_final_matches(again,again_n)==0,ctr)
40 if (again as i64)>0{sys_free_file(again,again_n)}
41 sys_free_file(page,n)
42 return gv_verdict("FINAL-PAGE-SEAL",ctr,"Actual shared-runtime declaration covered by existing final sealer; no page publication")
43}