code wiki / _hdl_build / nx_cms_setpw2.nx
nx_cms_setpw2.nx source
↩ module page · 66 lines · 2396 B
1// nx_cms_setpw2.nx -- CMS C10 operator tool: set a site's admin password as a self-describing
2// argon2id credential (admin_pw.ar2). Supersedes nx_cms_setpw (sha256 file = legacy migration
3// fallback only; the daemon always prefers .ar2). argv: <sitedir> <password> [m_kib] [t] --
4// defaults = the vault's measured production params (m=32768 t=3 ~ 1.8s/verify on this box).
5// Salt = 32 hex chars from urandom (st_hex128), stored in the file. license_tier: ORIGINAL
6import "nx_cms_pw.nx"
7import "nx_secure_token.nx"
8
9const SP2_M_DEFAULT: i64 = 32768
10const SP2_T_DEFAULT: i64 = 3
11
12func sp2_w(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
13func sp2_len(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} return n }
14func sp2_atoi(s: *u8) -> i64 {
15 var v: i64 = 0
16 var i: i64 = 0
17 while s[i] != (0 as u8) {
18 let c: i64 = s[i] as i64
19 if c >= 48 { if c <= 57 { v = v * 10 + (c - 48) } }
20 i = i + 1
21 }
22 return v
23}
24
25func main(argc: i64, argv: *i64) -> i64 {
26 if argc < 3 {
27 sp2_w("usage: nx_cms_setpw2 <sitedir> <password> [m_kib=32768] [t=3]\n" as *u8)
28 sys_exit(2)
29 return 2
30 }
31 let sitedir: *u8 = argv[1] as *u8
32 let pw: *u8 = argv[2] as *u8
33 var m_kib: i64 = SP2_M_DEFAULT
34 var t: i64 = SP2_T_DEFAULT
35 if argc > 3 { m_kib = sp2_atoi(argv[3] as *u8) }
36 if argc > 4 { t = sp2_atoi(argv[4] as *u8) }
37 let path: *u8 = sys_mmap(512)
38 var o: i64 = 0
39 var k: i64 = 0
40 while sitedir[k] != (0 as u8) { path[o] = sitedir[k]; o = o + 1; k = k + 1 }
41 path[o] = 47 as u8; o = o + 1
42 let leaf: *u8 = "admin_pw.ar2" as *u8
43 k = 0
44 while leaf[k] != (0 as u8) { path[o] = leaf[k]; o = o + 1; k = k + 1 }
45 path[o] = 0 as u8
46 let salt: *u8 = sys_mmap(64)
47 st_hex128(salt) // 32 hex chars of urandom = the stored salt bytes
48 if cpw_write(path, pw, sp2_len(pw), salt, m_kib, t) != 1 {
49 sp2_w("SETPW2 FAILED (derive or write)\n" as *u8)
50 sys_exit(1)
51 return 1
52 }
53 sp2_w("SETPW2 OK: " as *u8); sp2_w(path)
54 sp2_w(" (argon2id m_kib=" as *u8)
55 let nb: *u8 = sys_mmap(64)
56 var no: i64 = cpw_catnum(nb, 0, m_kib)
57 nb[no] = 0 as u8
58 sp2_w(nb)
59 sp2_w(" t=" as *u8)
60 no = cpw_catnum(nb, 0, t)
61 nb[no] = 0 as u8
62 sp2_w(nb)
63 sp2_w(", params live IN the file)\n" as *u8)
64 sys_exit(0)
65 return 0
66}