nx_crypsis_test.nx source
↩ module page · 94 lines · 3262 B
1// nx_crypsis_test.nx -- smoke for nx_crypsis.
2
3import "nx_syscalls.nx"
4import "nx_crypsis.nx"
5
6func main() -> i64 {
7 // 1: encode_size accounts for header + padding + payload
8 if nx_crypsis_encode_size(100, 5) != 137 { return 1 } // 32+5+100
9 if nx_crypsis_encode_size(0, 0) != 32 { return 2 }
10
11 // 2: encode + decode roundtrip
12 let payload: *u8 = (sys_mmap(64)) as *u8
13 var i: nx_size = 0
14 while i < 32 {
15 payload[i] = (65 + i) as u8 // 'A'.. text-like
16 i = i + 1
17 }
18 let pad: *u8 = (sys_mmap(16)) as *u8
19 pad[0] = 0x11 as u8
20 pad[1] = 0x22 as u8
21 pad[2] = 0x33 as u8
22
23 let enc: *u8 = (sys_mmap(128)) as *u8
24 let mask1: nx_size = 0xa5a5a5a5a5a5a5a5
25 let rc1: nx_int = nx_crypsis_encode(payload, 32, mask1, pad, 3, enc, 128)
26 if rc1 != NX_CRYP_OK { return 3 }
27
28 // 3: encoded bytes differ from original (XOR worked)
29 if (enc[35] as i64) & 255 == (payload[0] as i64) & 255 {
30 // mask byte 0 is 0xa5; XOR'd payload[0]=0x41 = 0xe4
31 // so they MUST differ
32 return 4
33 }
34
35 // 4: decode recovers original
36 let dec: *u8 = (sys_mmap(64)) as *u8
37 let out_len: *i64 = (sys_mmap(8)) as *i64
38 let rc2: nx_int = nx_crypsis_decode(enc, 128, dec, 64, out_len)
39 if rc2 != NX_CRYP_OK { return 5 }
40 if out_len[0] != 32 { return 6 }
41 var j: nx_size = 0
42 while j < 32 {
43 if (dec[j] as i64) & 255 != (payload[j] as i64) & 255 { return 7 }
44 j = j + 1
45 }
46
47 // 5: SAME payload, DIFFERENT mask -> DIFFERENT signature
48 // (the core crypsis property: byte signature changes per emission)
49 let enc2: *u8 = (sys_mmap(128)) as *u8
50 let mask2: nx_size = 0x5a5a5a5a5a5a5a5a
51 nx_crypsis_encode(payload, 32, mask2, pad, 3, enc2, 128)
52 // mask1 != mask2 so the body bytes differ. Header magic + payload_len
53 // are the same; mask field differs; payload bytes differ.
54 // Test: are masked body bytes different between enc and enc2?
55 var same_body: nx_int = 1
56 var k: nx_size = 0
57 while k < 32 {
58 if (enc[35 + k] as i64) & 255 != (enc2[35 + k] as i64) & 255 {
59 same_body = 0
60 break
61 }
62 k = k + 1
63 }
64 if same_body == 1 { return 8 } // identical body would mean no polymorphism
65
66 // 6: BOTH decode back to identical payload
67 let dec2: *u8 = (sys_mmap(64)) as *u8
68 nx_crypsis_decode(enc2, 128, dec2, 64, out_len)
69 var m: nx_size = 0
70 while m < 32 {
71 if (dec2[m] as i64) & 255 != (payload[m] as i64) & 255 { return 9 }
72 m = m + 1
73 }
74
75 // 7: pad_count clamped to 0..15
76 nx_crypsis_encode(payload, 32, mask1, pad, 99, enc, 128)
77 let hdr: *NxCrypsisHeader = enc as *NxCrypsisHeader
78 if hdr.pad_count != 15 { return 10 }
79 nx_crypsis_encode(payload, 32, mask1, pad, -5, enc, 128)
80 if hdr.pad_count != 0 { return 11 }
81
82 // 8: dst too small refused
83 let small: *u8 = (sys_mmap(8)) as *u8
84 if nx_crypsis_encode(payload, 32, mask1, pad, 3, small, 8) != NX_CRYP_ERR_DST_TOO_SMALL { return 12 }
85
86 // 9: bad magic on decode refused
87 enc[0] = 0 as u8
88 enc[1] = 0 as u8
89 enc[2] = 0 as u8
90 enc[3] = 0 as u8
91 if nx_crypsis_decode(enc, 128, dec, 64, out_len) != NX_CRYP_ERR_BAD_MASK { return 13 }
92
93 return 0
94}