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}