code wiki / (root) / nx_lib_pow_decomp.nx

nx_lib_pow_decomp.nx source

↩ module page · 46 lines · 2112 B

1// nx_lib_pow_decomp.nx -- fetch the gzip'd pow.js and inflate it to readable 2// source (nx_gzip_inflate), so the NCBI PoW algorithm can be read. Step 2. 3import "nx_syscalls.nx" 4import "nx_lib_fetch.nx" 5import "nx_gzip_wrap.nx" 6const K_MAGIC_4194304: i64 = 4194304 7 8func pd_puts(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 } 9func pd_putn(v: i64) -> i64 { 10 let bb: *u8 = sys_mmap(28); var m: i64 = v 11 if m < 0 { m = 0 - m; sys_write(1, "-" as *u8, 1) } 12 let t: *u8 = sys_mmap(28); var k: i64 = 0 13 if m == 0 { t[0] = 48 as u8; k = 1 } 14 while m > 0 { t[k] = (48 + (m - (m/10)*10)) as u8; m = m / 10; k = k + 1 } 15 var i: i64 = 0; while i < k { bb[i] = t[k - 1 - i]; i = i + 1 } sys_write(1, bb, k); return 0 16} 17 18func main() -> i64 { 19 let store: *TrustStore = nx_lib_fetch_store() 20 if store == 0 as *TrustStore { pd_puts("no CA store\n"); return 1 } 21 let cap: i64 = K_MAGIC_4194304 22 let buf: *u8 = sys_mmap(cap) 23 let gc: i64 = nx_lib_fetch(store, "https://cdn.ncbi.nlm.nih.gov/pmc/pd-medc-pmc-cloudpmc-viewer/production/674d4f95/var/data/static/assets/pow-o51sQKbL.js\x00" as *u8, buf, cap) 24 if gc < 0 { pd_puts("fetch fail="); pd_putn(gc); pd_puts("\n"); return 2 } 25 26 var bs: i64 = 0 - 1 27 var bi: i64 = 0 28 while bi + 3 < gc { 29 if bs < 0 { if buf[bi] == 13 as u8 { if buf[bi+1] == 10 as u8 { if buf[bi+2] == 13 as u8 { if buf[bi+3] == 10 as u8 { bs = bi + 4 } } } } } 30 bi = bi + 1 31 } 32 if bs < 0 { pd_puts("no body sep\n"); return 3 } 33 let bodyptr: *u8 = ((buf as i64) + bs) as *u8 34 let bodylen: i64 = gc - bs 35 36 let res: *NxGzipResult = nx_gzip_inflate(bodyptr, bodylen, cap) 37 pd_puts("gzip err="); pd_putn(res.error_code); pd_puts(" out_size="); pd_putn(res.output_size); pd_puts("\n") 38 if res.output_size <= 0 { return 4 } 39 40 let fd: i64 = sys_openat_wr("knowledge/fetched/pow_plain.js\x00" as *u8, 0x1A4) 41 if fd <= 0 { pd_puts("open fail\n"); return 5 } 42 sys_write(fd, res.output_data, res.output_size) 43 sys_close(fd) 44 pd_puts("wrote pow_plain.js\n") 45 return 0 46}