code wiki / _hdl_build / nx_cms_setpw.nx
nx_cms_setpw.nx source
↩ module page · 39 lines · 1582 B
1// nx_cms_setpw.nx -- operator tool: set the editor password for a CMS site dir.
2// nx_cms_setpw.sov.elf <sitedir> <password>
3// Writes <sitedir>/admin_pw.sha256 (hex). Only the HASH is stored (never plaintext, vault doctrine);
4// upgrade path = argon2id once CRYPTO-RUNTIME-DEFECT (blake2b codegen) is fixed. license_tier: ORIGINAL
5import "nx_sha256.nx"
6import "nx_syscalls.nx"
7
8func sp_len(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} return n }
9
10func main(argc: i64, argv: *i64) -> i64 {
11 if argc < 3 { sys_write(1, "usage: nx_cms_setpw <sitedir> <password>\n" as *u8, 41); sys_exit(2); return 2 }
12 let sitedir: *u8 = argv[1] as *u8
13 let pw: *u8 = argv[2] as *u8
14 let dig: *u8 = sys_mmap(32)
15 sha256_digest(pw, sp_len(pw), dig)
16 let hexs: *u8 = sys_mmap(80)
17 let hxc: *u8 = "0123456789abcdef" as *u8
18 var i: i64 = 0
19 while i < 32 {
20 hexs[i*2] = hxc[((dig[i] as i64) >> 4) & 15]
21 hexs[i*2+1] = hxc[(dig[i] as i64) & 15]
22 i = i + 1
23 }
24 let path: *u8 = sys_mmap(512)
25 var o: i64 = 0
26 var k: i64 = 0
27 while sitedir[k] != (0 as u8) { path[o] = sitedir[k]; o = o + 1; k = k + 1 }
28 let leaf: *u8 = "/admin_pw.sha256" as *u8
29 k = 0
30 while leaf[k] != (0 as u8) { path[o] = leaf[k]; o = o + 1; k = k + 1 }
31 path[o] = 0 as u8
32 let fd: i64 = sys_openat_wr(path, 0x180) // 0600: owner-only
33 if fd < 0 { sys_write(1, "WRITE-FAIL\n" as *u8, 11); sys_exit(1); return 1 }
34 sys_write(fd, hexs, 64)
35 sys_close(fd)
36 sys_write(1, "PW-HASH-SET\n" as *u8, 12)
37 sys_exit(0)
38 return 0
39}