code wiki / (root) / nx_png_capacity_gate_t278.nx

nx_png_capacity_gate_t278.nx source

↩ module page · 52 lines · 2976 B

1import "nx_png.nx" 2import "nx_sha256.nx" 3import "nx_lib_std.nx" 4func pg_hash(b:*u8,n:i64)->i64 { 5 let d:*u8=sys_mmap_try(SHA256_DIGEST_BYTES);if (d as i64)<=0{return 0} 6 if sha256_digest_checked_native(b,n,d)!=0{return 0} 7 let hex:*u8="0123456789abcdef" as *u8;var i:i64=0 8 while i<SHA256_DIGEST_BYTES{let v:i64=d[i] as i64;sys_write(1,((hex as i64)+v/16) as *u8,1);sys_write(1,((hex as i64)+v%16) as *u8,1);i=i+1} 9 sys_munmap_direct(d,SHA256_DIGEST_BYTES);return 1 10} 11func pg_case(w:i64,h:i64)->i64{ 12 let cap:i64=png_buf_cap(w,h);if cap<=0{return 0} 13 let n:i64=w*h;let fb:*i64=sys_mmap_try(n*8) as *i64;let b:*u8=sys_mmap_try(cap+2) 14 if (fb as i64)<=0 || (b as i64)<=0{return 0} 15 var i:i64=0;var seed:i64=17;while i<n{seed=(seed*1103515245+12345)&2147483647;fb[i]=seed&16777215;i=i+1} 16 b[0]=165 as u8;b[cap+1]=90 as u8;let out:*u8=((b as i64)+1) as *u8 17 let result:i64=write_png_buf_checked(fb,n,w,h,out,cap) 18 var ok:i64=1;if result<=0 || result>cap || b[0]!=(165 as u8) || b[cap+1]!=(90 as u8){ok=0} 19 std_puts("PNG-SHA " as *u8);pg_hash(out,result);std_putln("" as *u8) 20 out[0]=77 as u8 21 if write_png_buf_checked(fb,n,w,h,out,cap-1)>=0 || out[0]!=(77 as u8){ok=0} 22 if write_png_buf_checked(fb,n-1,w,h,out,cap)>=0 || out[0]!=(77 as u8){ok=0} 23 sys_munmap_direct(fb as *u8,n*8);sys_munmap_direct(b,cap+2);return ok 24} 25func pg_pages()->i64 { 26 // /proc/self/statm is seven unsigned decimal fields; buffer follows field count and i64 decimal width. 27 let cap:i64=7*21+1;let b:*u8=sys_mmap_try(cap);if (b as i64)<=0{return 0-1} 28 let fd:i64=sys_openat_rd("/proc/self/statm" as *u8);if fd<0{sys_munmap_direct(b,cap);return 0-1} 29 let n:i64=sys_read(fd,b,cap);sys_close(fd);var v:i64=0;var i:i64=0 30 if n<=0 || n>=cap{sys_munmap_direct(b,cap);return 0-1} 31 while i<n && b[i]>=(48 as u8) && b[i]<=(57 as u8){v=v*10+(b[i] as i64)-48;i=i+1} 32 sys_munmap_direct(b,cap);if i==0{return 0-1};return v 33} 34func pg_repeated()->i64{ 35 let cap:i64=png_buf_cap(1,1);let out:*u8=sys_mmap_try(cap);let fb:*i64=sys_mmap_try(__size_of(i64)) as *i64 36 if (out as i64)<=0 || (fb as i64)<=0{return 0} 37 fb[0]=12345;let before:i64=pg_pages();var i:i64=0;var ok:i64=1 38 while i<32 {if write_png_buf_checked(fb,1,1,1,out,cap)<=0{ok=0};i=i+1} 39 let after:i64=pg_pages();if before<0 || after!=before{ok=0} 40 sys_munmap_direct(fb as *u8,__size_of(i64));sys_munmap_direct(out,cap);return ok 41} 42 43func main()->i64{ 44 var pass:i64=0;pass=pass+pg_case(1,1);pass=pass+pg_case(3,5);pass=pass+pg_case(64,65);pass=pass+pg_case(480,1) 45 if png_buf_cap(0,1)<0 && png_buf_cap(1,0)<0 && png_buf_cap(2147483648,1)<0 && png_buf_cap(2147483647,2147483647)<0{pass=pass+1} 46 if png_buf_cap(2048,2048)==18877631{pass=pass+1} 47 pass=pass+pg_repeated() 48 if png_buf_cap(2147483647,600000000)<0{pass=pass+1} 49 if png_chunk_length_valid(2147483647)==1 && png_chunk_length_valid(2147483648)==0 && png_chunk_length_valid(0-1)==0{pass=pass+1} 50 if pass!=9{std_putln("PNG-CAPACITY FAIL" as *u8);return 1} 51 std_putln("PNG-CAPACITY 9/9 PASS" as *u8);return 0 52}