code wiki / (root) / nx_crypsis_test.nx

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}