nx_save_slot_test.nx source
↩ module page · 70 lines · 2315 B
1// nx_save_slot_test.nx -- smoke for nx_save_slot.
2
3import "nx_syscalls.nx"
4import "nx_methyl.nx"
5import "nx_chromatin.nx"
6import "nx_save_slot.nx"
7
8func main() -> i64 {
9 let sig_key_msg: *u8 = (sys_mmap(96)) as *u8
10 sig_key_msg[0] = 1 as u8
11 let mark_p: *NxMethylMark = nx_methyl_new(10, 0xaaaa, 1000, sig_key_msg, 96)
12 let mark_w: *NxMethylMark = nx_methyl_new(20, 0xbbbb, 1000, sig_key_msg, 96)
13
14 let snap_p: *u8 = (sys_mmap(32)) as *u8
15 snap_p[0] = 42 as u8
16 let snap_w: *u8 = (sys_mmap(32)) as *u8
17 snap_w[0] = 99 as u8
18
19 let player: *NxChromatin = nx_chromatin_capture(10, 0xc101, 1000,
20 snap_p, 32, mark_p, 1)
21 let world: *NxChromatin = nx_chromatin_capture(20, 0xc202, 1000,
22 snap_w, 32, mark_w, 1)
23
24 // Signing key (V1 stand-in)
25 let sk: *u8 = (sys_mmap(32)) as *u8
26 var i: nx_size = 0
27 while i < 32 {
28 sk[i] = (50 + i) as u8
29 i = i + 1
30 }
31
32 let sig_buf: *u8 = (sys_mmap(128)) as *u8
33
34 // Create a save slot
35 let slot: *NxSaveSlot = nx_save_slot_create(1001, player, world, 2000,
36 sk, 32, sig_buf, 128, 410)
37 if (slot as i64) == 0 { return 1 }
38 if nx_save_slot_id(slot) != 1001 { return 2 }
39 if nx_save_slot_captured_us(slot) != 2000 { return 3 }
40
41 // Verify
42 let v: nx_int = nx_save_slot_verify(slot, sk, 32, 410)
43 if v != NX_SS_VALID { return 4 }
44
45 // Tamper with a chromatin's content_hash -> verify fails
46 let saved_hash: nx_size = player.content_hash
47 player.content_hash = 0xdeadbeef
48 let v_tampered: nx_int = nx_save_slot_verify(slot, sk, 32, 410)
49 if v_tampered != NX_SS_INVALID { return 5 }
50 // Restore -> verify passes again
51 player.content_hash = saved_hash
52 let v_restored: nx_int = nx_save_slot_verify(slot, sk, 32, 410)
53 if v_restored != NX_SS_VALID { return 6 }
54
55 // Wrong key -> verify fails
56 let wrong_sk: *u8 = (sys_mmap(32)) as *u8
57 var k: nx_size = 0
58 while k < 32 {
59 wrong_sk[k] = (200 + k) as u8
60 k = k + 1
61 }
62 let v_wrong_key: nx_int = nx_save_slot_verify(slot, wrong_sk, 32, 410)
63 if v_wrong_key != NX_SS_INVALID { return 7 }
64
65 // NULL save_slot refused
66 let null_s: *NxSaveSlot = (0 as i64) as *NxSaveSlot
67 if nx_save_slot_verify(null_s, sk, 32, 410) != NX_SS_ERR_BAD_INPUT { return 8 }
68
69 return 0
70}