nx_twin_key_test.nx source
↩ module page · 62 lines · 2429 B
1// nx_twin_key_test.nx -- smoke for nx_twin_key.
2
3import "nx_syscalls.nx"
4import "nx_twin_key.nx"
5
6func main() -> i64 {
7 if NX_TKP_N_PURPOSES != 6 { return 1 }
8 if NX_TKS_N_STATES != 5 { return 2 }
9 if nx_tkp_is_valid(NX_TKP_EMERGENCY_CELLULAR) != 1 { return 3 }
10 if nx_tkp_is_valid(6) != 0 { return 4 }
11
12 let l: *NxTwinKeyLedger = nx_twin_key_ledger_new(8)
13 if l.count != 0 { return 5 }
14
15 // Propose: parents 1 + 2 are key-holders
16 if nx_twin_key_propose(l, 1, NX_TKP_EMERGENCY_CELLULAR, 1, 2, 1000, 60000) != NX_TK_OK { return 6 }
17 if l.count != 1 { return 7 }
18
19 // Same key-holder for A and B rejected
20 if nx_twin_key_propose(l, 2, NX_TKP_DRONE_DEPLOYMENT, 1, 1, 1000, 60000) != NX_TK_ERR_BAD_HOLDERS { return 8 }
21
22 // Bad purpose rejected
23 if nx_twin_key_propose(l, 3, 99, 1, 2, 1000, 60000) != NX_TK_ERR_BAD_PURPOSE { return 9 }
24
25 // Initial check: not yet authorized
26 if nx_twin_key_check(l, 1, 2000) != NX_TK_ERR_NOT_PENDING { return 10 }
27
28 // First signer (A) signs
29 let v1: nx_int = nx_twin_key_sign(l, 1, 1, 2000)
30 if v1 != NX_TK_OK { return 11 }
31 if nx_twin_key_check(l, 1, 2500) != NX_TK_ERR_NOT_PENDING { return 12 }
32 if nx_twin_key_count_by_state(l, NX_TKS_PARTIAL) != 1 { return 13 }
33
34 // Wrong signer (not in key-holder set) refused
35 if nx_twin_key_sign(l, 1, 999, 2500) != NX_TK_ERR_NOT_PENDING { return 14 }
36
37 // Second signer (B) signs -> AUTHORIZED
38 let v2: nx_int = nx_twin_key_sign(l, 1, 2, 3000)
39 if v2 != NX_TK_GRANTED { return 15 }
40 if nx_twin_key_check(l, 1, 3500) != NX_TK_GRANTED { return 16 }
41 if nx_twin_key_count_by_state(l, NX_TKS_AUTHORIZED) != 1 { return 17 }
42
43 // Re-sign after authorized: idempotent OK
44 if nx_twin_key_sign(l, 1, 1, 4000) != NX_TK_OK { return 18 }
45
46 // Past expiry -> EXPIRED
47 if nx_twin_key_check(l, 1, 99999) != NX_TK_ERR_EXPIRED { return 19 }
48
49 // Revoke
50 nx_twin_key_propose(l, 5, NX_TKP_CAP_GRANT_OVERRIDE, 1, 2, 5000, 60000)
51 nx_twin_key_sign(l, 5, 1, 5100)
52 nx_twin_key_sign(l, 5, 2, 5200)
53 if nx_twin_key_check(l, 5, 5300) != NX_TK_GRANTED { return 20 }
54 nx_twin_key_revoke(l, 5)
55 if nx_twin_key_check(l, 5, 5400) != NX_TK_ERR_NOT_PENDING { return 21 }
56
57 // Unknown request rejected
58 if nx_twin_key_sign(l, 99, 1, 6000) != NX_TK_ERR_NOT_FOUND { return 22 }
59 if nx_twin_key_check(l, 99, 6000) != NX_TK_ERR_NOT_FOUND { return 23 }
60
61 return 0
62}