Sync : more than two.
1 // DeviceGroup protocol for p≡p
3 // Copyleft (c) 2016, p≡p foundation
5 // Written by Volker Birk
10 // all messages have a timestamp, time out and are removed after timeout
13 unencrypted sendBeacon;
15 fsm DeviceState filename=sync {
16 condition storedGroupKeys();
17 condition keyElectionWon(Identity partner);
28 on KeyGen // injected by generate_keypair()
31 do sendBeacon; // cry, baby
32 on Beacon(Identity partner) // this event will not happen for already
34 do sendHandshakeRequest(partner);
35 on HandshakeRequest(Identity partner) {
36 do sendHandshakeRequest(partner);
37 go HandshakingSole(partner);
41 state HandshakingSole(Identity partner) {
43 do showHandshake(partner);
44 on HandshakeRejected(Identity partner) {
45 do rejectHandshake(partner); // stores rejection of partner
48 on HandshakeAccepted(Identity partner) {
49 do acceptHandshake(partner);
50 if keyElectionWon(partner) { // an already existing group
52 do sendGroupKeys(partner);
55 go WaitForGroupKeysSole(Identity partner);
59 state WaitForGroupKeysSole(Identity partner) {
60 on GroupKeys(Identity partner, Stringlist keys) {
61 do storeGroupKeys(partner, keys);
62 // TODO : add a callback to signal finished waiting for group keys
66 on Reject(Identity partner) {
67 do rejectHandshake(partner);
74 do sendGroupKeys; // always send all keys
75 on Beacon(Identity partner)
76 do sendHandshakeRequest(partner);
77 on HandshakeRequest(Identity partner) {
78 do sendHandshakeRequest(partner);
79 go HandshakingGrouped(partner);
83 state HandshakingGrouped(Identity partner) {
85 do showHandshake(partner);
86 on HandshakeRejected(Identity partner) {
87 do rejectHandshake(partner); // stores rejection of partner
90 on HandshakeAccepted(Identity partner) {
91 do acceptHandshake(partner);
93 // an already existing group always wins
94 do sendGroupKeys(partner);
102 tag HandshakeRequest 3;