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}