code wiki / (root) / nx_rank_refresh_lib.nx

nx_rank_refresh_lib.nx source

↩ module page · 49 lines · 1571 B

1// Rank refresh boundary: source identity and artifact verification. 2import "nx_syscalls.nx" 3import "nx_sha256.nx" 4const RRF_DIGEST_BYTES: i64 = 32 5const RRF_HEX_BYTES: i64 = 64 6const RRF_NUL_BYTES: i64 = 1 7const RRF_BAD: i64 = 0 - 1 8 9func rrf_hash(buf: *u8, n: i64, out: *u8) -> i64 { 10 if n <= 0 { return RRF_BAD } 11 let digest: *u8 = sys_mmap(RRF_DIGEST_BYTES) 12 if sha256_digest(buf, n, digest) != 0 { return RRF_BAD } 13 let alphabet: *u8 = "0123456789abcdef" as *u8 14 var i: i64 = 0 15 while i < RRF_DIGEST_BYTES { 16 let v: i64 = digest[i] as i64 17 out[i * 2] = alphabet[v / 16] 18 out[i * 2 + 1] = alphabet[v % 16] 19 i = i + 1 20 } 21 out[RRF_HEX_BYTES] = 0 as u8 22 return 0 23} 24 25func rrf_file_hash_matches(path: *u8, expected: *u8) -> i64 { 26 let ln: *i64 = sys_mmap(16) as *i64 27 let buf: *u8 = sys_read_file(path, ln) 28 if (buf as i64) == 0 { return 0 } 29 let actual: *u8 = sys_mmap(RRF_HEX_BYTES + RRF_NUL_BYTES) 30 var ok: i64 = 1 31 if rrf_hash(buf, ln[0], actual) != 0 { ok = 0 } 32 var i: i64 = 0 33 while i < RRF_HEX_BYTES { if actual[i] != expected[i] { ok = 0 } i = i + 1 } 34 sys_free_file(buf, ln[0]) 35 return ok 36} 37 38func rrf_file_equal(path: *u8, expected: *u8, n: i64) -> i64 { 39 let ln: *i64 = sys_mmap(16) as *i64 40 let buf: *u8 = sys_read_file(path, ln) 41 if (buf as i64) == 0 { return 0 } 42 var ok: i64 = 1 43 if ln[0] != n { ok = 0 } else { 44 var i: i64 = 0 45 while i < n { if buf[i] != expected[i] { ok = 0 } i = i + 1 } 46 } 47 sys_free_file(buf, ln[0]) 48 return ok 49}