code wiki / (root) / nx_id_ledger_provenance_audit_t219.nx

nx_id_ledger_provenance_audit_t219.nx source

↩ module page · 83 lines · 4060 B

1// nx_id_ledger_provenance_audit_t219.nx -- Analyzes legacy data rows to detect anomalies and generate cryptographic hashes for audit purposes. 2import "nx_apistack_idempotency_reconcile_candidate_t219.nx" 3import "nx_fsops_lib.nx" 4import "nx_sha256.nx" 5// Metadata only: no journal keys, result bodies, paths from rows or credentials. 6func la_len(p:*u8)->i64{var n:i64=0;while p[n]!=0 as u8{n=n+1};return n} 7func la_prefix(p:*u8,n:i64,s:*u8)->i64{ 8 let sn:i64=la_len(s);if n<sn{return 0};var i:i64=0 9 while i<sn{if p[i]!=s[i]{return 0};i=i+1};return 1 10} 11func la_hash(p:*u8,n:i64)->i64{ 12 let digest:*u8=sys_mmap_try(SHA256_DIGEST_BYTES) 13 if (digest as i64)<=0{fsx_puts("null");return ID_RESOURCE} 14 let rc:i64=sha256_digest_checked_native(p,n,digest) 15 if rc!=0{sys_munmap_direct(digest,SHA256_DIGEST_BYTES);fsx_puts("null");return rc} 16 let hex:*u8="0123456789abcdef";var i:i64=0;fsx_puts("\"") 17 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} 18 fsx_puts("\"");sys_munmap_direct(digest,SHA256_DIGEST_BYTES);return 0 19} 20func la_kind(p:*u8,n:i64)->i64{ 21 if la_prefix(p,n,"rc=0 verb=")==1{return 1} 22 if la_prefix(p,n,"lane=")==1{return 2} 23 if la_prefix(p,n,"rc=0 request_v=1 ")==1{return 3} 24 return 0 25} 26func la_jobs(p:*u8,n:i64)->i64{ 27 fsx_puts("[");var i:i64=0;var count:i64=0 28 while i<n{ 29 if la_prefix(p+i,n-i," job=")==1{ 30 var j:i64=i+5;var value:i64=0;var digits:i64=0;var overflow:i64=0 31 while j<n{ 32 let ch:i64=p[j] as i64;if ch<48||ch>57{break} 33 let d:i64=ch-48 34 if value>(ID_SIGNED_MAX-d)/10{overflow=1}else{value=value*10+d} 35 digits=digits+1;j=j+1 36 } 37 if digits>0&&overflow==0{if count>0{fsx_puts(",")};fsx_putn(value);count=count+1} 38 i=j 39 }else{i=i+1} 40 } 41 fsx_puts("]");return count 42} 43func main(argc:i64,argv:*i64)->i64{ 44 if argc!=2{return 2} 45 let ev:*NxIdEvidence=sys_mmap_try(__size_of(NxIdEvidence)) as *NxIdEvidence 46 let row:*NxIdLegacyRow=sys_mmap_try(__size_of(NxIdLegacyRow)) as *NxIdLegacyRow 47 if (ev as i64)<=0||(row as i64)<=0{return 3} 48 let key:*u8="nishi-legacy-structural-observation-t219" 49 let state:i64=id_read_evidence(argv[1] as *u8,key,la_len(key),ev) 50 if state!=ID_EVIDENCE_ERROR||ev.system_code!=FIO_EBADMSG{ 51 fsx_puts("{\"observed\":false,\"reason\":\"requires-unmodified-malformed-snapshot\",\"state\":");fsx_putn(state);fsx_puts("}\n") 52 id_evidence_close(ev);sys_munmap_direct(ev as *u8,__size_of(NxIdEvidence));sys_munmap_direct(row as *u8,__size_of(NxIdLegacyRow));return 4 53 } 54 fsx_puts("{\"observed\":true,\"snapshotOnly\":true,\"bytes\":");fsx_putn(ev.bytes) 55 fsx_puts(",\"sha256\":");la_hash(ev.buffer,ev.bytes);fsx_puts(",\"anomalies\":[") 56 var start:i64=0;var count:i64=0 57 while start<ev.bytes{ 58 let rc:i64=id_legacy_row_next(ev.buffer,ev.bytes,start,row) 59 if rc!=1{return 5} 60 if (row.flags&(ID_ROW_EMPTY|ID_ROW_COMMENT))==0{ 61 if row.flags!=0{ 62 if count>0{fsx_puts(",")};count=count+1 63 fsx_puts("{\"offset\":");fsx_putn(row.start);fsx_puts(",\"end\":");fsx_putn(row.end) 64 fsx_puts(",\"flags\":");fsx_putn(row.flags);fsx_puts(",\"tabs\":");fsx_putn(row.tabs) 65 fsx_puts(",\"rowSha256\":");la_hash(ev.buffer+row.start,row.end-row.start) 66 fsx_puts(",\"legacyKeySha256\":");la_hash(ev.buffer+row.legacy_key_start,row.legacy_key_bytes) 67 fsx_puts(",\"segments\":[");var seg:i64=row.start;var sc:i64=0 68 while seg<=row.end{ 69 var end:i64=seg;while end<row.end{if ev.buffer[end]==9 as u8{break};end=end+1} 70 if sc>0{fsx_puts(",")};sc=sc+1 71 fsx_puts("{\"offset\":");fsx_putn(seg);fsx_puts(",\"bytes\":");fsx_putn(end-seg) 72 fsx_puts(",\"grammarKind\":");fsx_putn(la_kind(ev.buffer+seg,end-seg));fsx_puts("}") 73 if end==row.end{break};seg=end+1 74 } 75 fsx_puts("],\"jobRefs\":");la_jobs(ev.buffer+row.start,row.end-row.start);fsx_puts("}") 76 } 77 } 78 start=row.next 79 } 80 fsx_puts("],\"anomalyCount\":");fsx_putn(count);fsx_puts(",\"mutationPerformed\":false}\n") 81 id_evidence_close(ev);sys_munmap_direct(ev as *u8,__size_of(NxIdEvidence));sys_munmap_direct(row as *u8,__size_of(NxIdLegacyRow)) 82 return 0 83}