code wiki / _hdl_build / test_b64enc.nx

test_b64enc.nx source

↩ module page · 56 lines · 2133 B

1// standalone unit test for the base64 encoder (verbatim copy of gp_b64_encode) against RFC 4648 vectors. 2import "nx_syscalls.nx" 3 4func gp_b64_encode(inp: *u8, n: i64, out: *u8) -> i64 { 5 let tbl: *u8 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" as *u8 6 var i: i64 = 0 7 var o: i64 = 0 8 while i + 3 <= n { 9 let b0: i64 = inp[i]&0xff; let b1: i64 = inp[i+1]&0xff; let b2: i64 = inp[i+2]&0xff 10 out[o] = tbl[b0>>2]; o=o+1 11 out[o] = tbl[((b0&3)<<4)|(b1>>4)]; o=o+1 12 out[o] = tbl[((b1&15)<<2)|(b2>>6)]; o=o+1 13 out[o] = tbl[b2&63]; o=o+1 14 i=i+3 15 } 16 let rem: i64 = n - i 17 if rem == 1 { 18 let b0: i64 = inp[i]&0xff 19 out[o] = tbl[b0>>2]; o=o+1 20 out[o] = tbl[(b0&3)<<4]; o=o+1 21 out[o] = 61 as u8; o=o+1 22 out[o] = 61 as u8; o=o+1 23 } 24 if rem == 2 { 25 let b0: i64 = inp[i]&0xff; let b1: i64 = inp[i+1]&0xff 26 out[o] = tbl[b0>>2]; o=o+1 27 out[o] = tbl[((b0&3)<<4)|(b1>>4)]; o=o+1 28 out[o] = tbl[(b1&15)<<2]; o=o+1 29 out[o] = 61 as u8; o=o+1 30 } 31 return o 32} 33 34func check(inp: *u8, n: i64, want: *u8) -> i64 { 35 let out: *u8 = sys_mmap(256) 36 let got: i64 = gp_b64_encode(inp, n, out); out[got]=0 as u8 37 var wl: i64 = 0; while want[wl]!=(0 as u8) { wl=wl+1 } 38 var ok: i64 = 1 39 if got != wl { ok = 0 } 40 var i: i64 = 0 41 while i < got { if (out[i]&0xff)!=(want[i]&0xff) { ok = 0 } i=i+1 } 42 if ok==1 { sys_write(1, "PASS " as *u8, 5) } else { sys_write(1, "FAIL " as *u8, 5) } 43 sys_write(1, out, got); sys_write(1, " (want " as *u8, 7); sys_write(1, want, wl); sys_write(1, ")\n" as *u8, 2) 44 return ok 45} 46 47func main() -> i64 { 48 var all: i64 = 1 49 if check("Man" as *u8, 3, "TWFu" as *u8)==0 { all=0 } 50 if check("Ma" as *u8, 2, "TWE=" as *u8)==0 { all=0 } 51 if check("M" as *u8, 1, "TQ==" as *u8)==0 { all=0 } 52 if check("Hello" as *u8, 5, "SGVsbG8=" as *u8)==0 { all=0 } 53 if check("foobar" as *u8, 6, "Zm9vYmFy" as *u8)==0 { all=0 } 54 if all==1 { sys_write(1, "ALL-PASS\n" as *u8, 9) } else { sys_write(1, "SOME-FAIL\n" as *u8, 10) } 55 return 0 56}