nx_id_ledger_claim_audit_t219.nx source
↩ module page · 146 lines · 7028 B
1// nx_id_ledger_claim_audit_t219.nx -- Verifies and splits claim evidence from legacy rows into hexadecimal and file path components.
2import "nx_apistack_idempotency.nx"
3import "nx_toolcall_idem_lib.nx"
4import "nx_fsops_lib.nx"
5import "nx_sha256.nx"
6// Metadata only: no journal keys, result bodies, paths from rows or credentials.
7func la_len(p:*u8)->i64{var n:i64=0;while p[n]!=0 as u8{n=n+1};return n}
8func la_prefix(p:*u8,n:i64,s:*u8)->i64{
9 let sn:i64=la_len(s);if n<sn{return 0};var i:i64=0
10 while i<sn{if p[i]!=s[i]{return 0};i=i+1};return 1
11}
12func la_hash(p:*u8,n:i64)->i64{
13 let digest:*u8=sys_mmap_try(SHA256_DIGEST_BYTES)
14 if (digest as i64)<=0{fsx_puts("null");return ID_RESOURCE}
15 let rc:i64=sha256_digest_checked_native(p,n,digest)
16 if rc!=0{sys_munmap_direct(digest,SHA256_DIGEST_BYTES);fsx_puts("null");return rc}
17 let hex:*u8="0123456789abcdef";var i:i64=0;fsx_puts("\"")
18 while i<SHA256_DIGEST_BYTES{let v:i64=digest[i] as i64;sys_write(1,hex+(v>>4),1);sys_write(1,hex+(v&15),1);i=i+1}
19 fsx_puts("\"");sys_munmap_direct(digest,SHA256_DIGEST_BYTES);return 0
20}
21func la_kind(p:*u8,n:i64)->i64{
22 if la_prefix(p,n,"rc=0 verb=")==1{return 1}
23 if la_prefix(p,n,"lane=")==1{return 2}
24 if la_prefix(p,n,"rc=0 request_v=1 ")==1{return 3}
25 return 0
26}
27func la_jobs(p:*u8,n:i64)->i64{
28 fsx_puts("[");var i:i64=0;var count:i64=0
29 while i<n{
30 if la_prefix(p+i,n-i," job=")==1{
31 var j:i64=i+5;var value:i64=0;var digits:i64=0;var overflow:i64=0
32 while j<n{
33 let ch:i64=p[j] as i64;if ch<48||ch>57{break}
34 let d:i64=ch-48
35 if value>(ID_SIGNED_MAX-d)/10{overflow=1}else{value=value*10+d}
36 digits=digits+1;j=j+1
37 }
38 if digits>0&&overflow==0{if count>0{fsx_puts(",")};fsx_putn(value);count=count+1}
39 i=j
40 }else{i=i+1}
41 }
42 fsx_puts("]");return count
43}
44
45func la_claim_exists(key:*u8,n:i64,hex:*u8,path:*u8,stat:*u8)->i64{
46 if ti_key_ok(key,n)==0{return FIO_EINVAL}
47 ti_key_hex(key,n,hex)
48 ti_claim_path("../_jobs",hex,path)
49 let fd:i64=__syscall(257,AT_FDCWD,path,ID_O_RDONLY|ID_O_NONBLOCK|ID_O_NOFOLLOW|ID_O_CLOEXEC,0,0,0)
50 if fd<0{return fd}
51 let rc:i64=sys_fstat_fd(fd,stat);let cl:i64=sys_close(fd)
52 if rc!=0{return rc};if cl!=0{return cl}
53 let mode:i64=*((stat+NX_STAT_X64_MODE_OFFSET) as *i64)
54 if (mode&NX_STAT_TYPE_MASK)!=NX_STAT_REGULAR_FILE{return FIO_EINVAL}
55 return 1
56}
57func la_occ(p:*u8,n:i64,s:*u8)->i64{
58 var count:i64=0;var i:i64=0
59 while i<n{if la_prefix(p+i,n-i,s)==1{count=count+1};i=i+1};return count
60}
61func la_split_evidence(source:*u8,row:*NxIdLegacyRow)->i64{
62 let hex1:*u8=sys_mmap_try(TI_HEX_CH+1);let hex2:*u8=sys_mmap_try(TI_HEX_CH+1)
63 let pathbytes:i64=la_len("../_jobs")+la_len("/idem_")+TI_HEX_CH+la_len(".claim")+1
64 let path:*u8=sys_mmap_try(pathbytes);let stat:*u8=sys_mmap_try(NX_STAT_X64_BYTES)
65 if (hex1 as i64)<=0||(hex2 as i64)<=0||(path as i64)<=0||(stat as i64)<=0{return ID_RESOURCE}
66 var count:i64=0;var probes:i64=0;var errors:i64=0
67 fsx_puts(",\"claimSplitCandidates\":[")
68 if row.tabs==2{
69 let k:i64=row.legacy_key_bytes
70 var split:i64=1;var stop:i64=k
71 if row.second_tab>row.first_tab+1{split=k;stop=k+1}
72 while split<stop{
73 let p1:*u8=source+row.start;var p2:*u8=source+row.start+split
74 var n2:i64=k-split
75 if split==k{p2=source+row.first_tab+1;n2=row.second_tab-row.first_tab-1}
76 probes=probes+1
77 let a:i64=la_claim_exists(p1,split,hex1,path,stat)
78 if a!=1&&a!=0-2&&a!=FIO_EINVAL{errors=errors+1}
79 if a==1{
80 probes=probes+1
81 let b:i64=la_claim_exists(p2,n2,hex2,path,stat)
82 if b!=1&&b!=0-2&&b!=FIO_EINVAL{errors=errors+1}
83 if b==1{
84 if count>0{fsx_puts(",")};count=count+1
85 fsx_puts("{\"firstKeyBytes\":");fsx_putn(split);fsx_puts(",\"secondKeyBytes\":");fsx_putn(n2)
86 fsx_puts(",\"firstKeySha256\":");la_hash(p1,split)
87 fsx_puts(",\"secondKeySha256\":");la_hash(p2,n2)
88 fsx_puts(",\"firstClaimDigest\":\"");sys_write(1,hex1,TI_HEX_CH);fsx_puts("\"")
89 fsx_puts(",\"secondClaimDigest\":\"");sys_write(1,hex2,TI_HEX_CH);fsx_puts("\"")
90 fsx_puts(",\"firstDigestOccurrencesInRow\":");fsx_putn(la_occ(source+row.start,row.end-row.start,hex1))
91 fsx_puts(",\"secondDigestOccurrencesInRow\":");fsx_putn(la_occ(source+row.start,row.end-row.start,hex2))
92 fsx_puts("}")
93 }
94 }
95 split=split+1
96 }
97 }
98 fsx_puts("],\"claimProbes\":");fsx_putn(probes);fsx_puts(",\"claimProbeErrors\":");fsx_putn(errors)
99 fsx_puts(",\"legacyWriterResultMarkers\":");fsx_putn(la_occ(source+row.start,row.end-row.start,"rc=0 verb="))
100 fsx_puts(",\"legacyToolcallResultMarkers\":");fsx_putn(la_occ(source+row.start,row.end-row.start,"lane="))
101 sys_munmap_direct(hex1,TI_HEX_CH+1);sys_munmap_direct(hex2,TI_HEX_CH+1)
102 sys_munmap_direct(path,pathbytes);sys_munmap_direct(stat,NX_STAT_X64_BYTES)
103 return 0
104}
105
106func main(argc:i64,argv:*i64)->i64{
107 if argc!=2{return 2}
108 let ev:*NxIdEvidence=sys_mmap_try(__size_of(NxIdEvidence)) as *NxIdEvidence
109 let row:*NxIdLegacyRow=sys_mmap_try(__size_of(NxIdLegacyRow)) as *NxIdLegacyRow
110 if (ev as i64)<=0||(row as i64)<=0{return 3}
111 let key:*u8="nishi-legacy-structural-observation-t219"
112 let state:i64=id_read_evidence(argv[1] as *u8,key,la_len(key),ev)
113 if state!=ID_EVIDENCE_ERROR||ev.system_code!=FIO_EBADMSG{
114 fsx_puts("{\"observed\":false,\"reason\":\"requires-unmodified-malformed-snapshot\",\"state\":");fsx_putn(state);fsx_puts("}\n")
115 id_evidence_close(ev);sys_munmap_direct(ev as *u8,__size_of(NxIdEvidence));sys_munmap_direct(row as *u8,__size_of(NxIdLegacyRow));return 4
116 }
117 fsx_puts("{\"observed\":true,\"snapshotOnly\":true,\"bytes\":");fsx_putn(ev.bytes)
118 fsx_puts(",\"sha256\":");la_hash(ev.buffer,ev.bytes);fsx_puts(",\"anomalies\":[")
119 var start:i64=0;var count:i64=0
120 while start<ev.bytes{
121 let rc:i64=id_legacy_row_next(ev.buffer,ev.bytes,start,row)
122 if rc!=1{return 5}
123 if (row.flags&(ID_ROW_EMPTY|ID_ROW_COMMENT))==0{
124 if row.flags!=0{
125 if count>0{fsx_puts(",")};count=count+1
126 fsx_puts("{\"offset\":");fsx_putn(row.start);fsx_puts(",\"end\":");fsx_putn(row.end)
127 fsx_puts(",\"flags\":");fsx_putn(row.flags);fsx_puts(",\"tabs\":");fsx_putn(row.tabs)
128 fsx_puts(",\"rowSha256\":");la_hash(ev.buffer+row.start,row.end-row.start)
129 fsx_puts(",\"legacyKeySha256\":");la_hash(ev.buffer+row.legacy_key_start,row.legacy_key_bytes)
130 fsx_puts(",\"segments\":[");var seg:i64=row.start;var sc:i64=0
131 while seg<=row.end{
132 var end:i64=seg;while end<row.end{if ev.buffer[end]==9 as u8{break};end=end+1}
133 if sc>0{fsx_puts(",")};sc=sc+1
134 fsx_puts("{\"offset\":");fsx_putn(seg);fsx_puts(",\"bytes\":");fsx_putn(end-seg)
135 fsx_puts(",\"grammarKind\":");fsx_putn(la_kind(ev.buffer+seg,end-seg));fsx_puts("}")
136 if end==row.end{break};seg=end+1
137 }
138 fsx_puts("],\"jobRefs\":");la_jobs(ev.buffer+row.start,row.end-row.start);la_split_evidence(ev.buffer,row);fsx_puts("}")
139 }
140 }
141 start=row.next
142 }
143 fsx_puts("],\"anomalyCount\":");fsx_putn(count);fsx_puts(",\"mutationPerformed\":false}\n")
144 id_evidence_close(ev);sys_munmap_direct(ev as *u8,__size_of(NxIdEvidence));sys_munmap_direct(row as *u8,__size_of(NxIdLegacyRow))
145 return 0
146}