nx_websocket_handshake_test.nx source
↩ module page · 50 lines · 1666 B
1// nx_websocket_handshake_test.nx -- KAT for ws_accept (RFC 6455 §1.3 + §4.2.2).
2//
3// Promotes the inline main() invariant in nx_websocket_handshake.nx
4// to a formal regression gate. Adds extra cases to cover the
5// invariants documented at WH1 + WH2.
6//
7// Canonical RFC 6455 §1.3 worked example:
8// Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
9// Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
10//
11// expect_exit: 0
12// license_tier: ORIGINAL
13
14import "nx_syscalls.nx"
15import "nx_websocket_handshake.nx"
16
17func _bytes_eq(a: *u8, b: *u8, n: i64) -> i64 {
18 var i: i64 = 0
19 while i < n {
20 if a[i] != b[i] { return 0 }
21 i = i + 1
22 }
23 return 1
24}
25
26func main() -> i64 {
27 // ---- T1: RFC 6455 §1.3 canonical example ----
28 let out: *u8 = sys_mmap(64)
29 let n: i64 = ws_accept("dGhlIHNhbXBsZSBub25jZQ==" as *u8, 24, out)
30 if n != WS_ACCEPT_LEN { return 1 }
31 if WS_ACCEPT_LEN != 28 { return 2 } // WH2: output must be 28 chars
32 let expected: *u8 = "s3pPLMBiTxaQ9kYGzzhZRbK+xOo=" as *u8
33 if _bytes_eq(out, expected, 28) != 1 { return 3 }
34
35 // ---- T2: different key produces different accept ----
36 let out2: *u8 = sys_mmap(64)
37 ws_accept("AbCdEfGhIjKlMnOpQrStUv==" as *u8, 24, out2)
38 if _bytes_eq(out, out2, 28) == 1 { return 4 } // must differ
39
40 // ---- T3: deterministic -- same input twice yields same output ----
41 let out3: *u8 = sys_mmap(64)
42 ws_accept("dGhlIHNhbXBsZSBub25jZQ==" as *u8, 24, out3)
43 if _bytes_eq(out, out3, 28) != 1 { return 5 }
44
45 // "PASS\n"
46 let ok: *u8 = sys_mmap(8)
47 ok[0]=80; ok[1]=65; ok[2]=83; ok[3]=83; ok[4]=10
48 sys_write(1, ok, 5)
49 return 0
50}