code wiki / (root) / nx_save_slot_test.nx

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}