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}