File: test_group_close.html

package info (click to toggle)
firefox 143.0.3-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 4,617,328 kB
  • sloc: cpp: 7,478,492; javascript: 6,417,157; ansic: 3,720,058; python: 1,396,372; xml: 627,523; asm: 438,677; java: 186,156; sh: 63,477; makefile: 19,171; objc: 13,059; perl: 12,983; yacc: 4,583; cs: 3,846; pascal: 3,405; lex: 1,720; ruby: 1,003; exp: 762; php: 436; lisp: 258; awk: 247; sql: 66; sed: 53; csh: 10
file content (116 lines) | stat: -rw-r--r-- 4,849 bytes parent folder | download | duplicates (12)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116


<!DOCTYPE HTML>
<html>
<head>
  <title>Test for Messaging Layer Security</title>
  <!-- SimpleTest Helpers -->
  <script src="/tests/SimpleTest/SimpleTest.js"></script>
  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
  <!-- Local Helpers -->
  <script src="head_mls.js"></script>
</head>
<body>
<pre id="test">
<script class="testbody" type="text/javascript">

async function test_group_close() {

  const mls = new MLS();

  // Generate Identity KeyPairs for Alice and Bob
  let alice = await mls.generateIdentity();
  let bob = await mls.generateIdentity();

  // Generate Credentials for Alice and Bob
  let credential_alice = await mls.generateCredential("alice");
  let credential_bob = await mls.generateCredential("bob");

  // Generate a KeyPackage for Bob
  let kp_bob = await mls.generateKeyPackage(bob, credential_bob);

  // Creation of a Group by Alice
  let group_alice = await mls.groupCreate(alice, credential_alice);

  // Alice adds Bob to a group
  let commit_output = await group_alice.add(kp_bob);

  // Alice receives her commit
  await group_alice.receive(commit_output.commit);

  // Bob joins the group
  let group_bob = await mls.groupJoin(bob, commit_output.welcome);

  // Test: compare the group identifier after the join
  is(byteArrayToHexString(group_alice.groupId), byteArrayToHexString(group_bob.groupId), "Alice Group ID == Bob Group ID");

  // Test: compare the group members after the join
  let members_alice_1 = await group_alice.details();
  let members_bob_1 = await group_bob.details();

  // Test: the group should have exactly two members at epoch 1
  is(members_alice_1.members.length, 2, "There should be exactly two members in the group");
  is(members_bob_1.members.length, 2, "There should be exactly two members in the group");

  // Test: Bob should be in the group according to Alice's view
  is(members_alice_1.members.some(member => byteArrayToHexString(member.clientId) === byteArrayToHexString(bob.content)), true, "Bob should be in the group");

  // Test: Alice should be in the group according to Alice's view
  is(members_alice_1.members.some(member => byteArrayToHexString(member.clientId) === byteArrayToHexString(alice.content)), true, "Alice should be in the group");

  // Test: Bob should be in the group according to Bob's view
  is(members_bob_1.members.some(member => byteArrayToHexString(member.clientId) === byteArrayToHexString(bob.content)), true, "Bob should be in the group");

  // Test: Alice should be in the group according to Bob's view
  is(members_bob_1.members.some(member => byteArrayToHexString(member.clientId) === byteArrayToHexString(alice.content)), true, "Alice should be in the group");
  // Bob closes the group
  let commit_output_2 = await group_bob.close();

  // Info: print the commit output
  info("Commit Output:", JSON.stringify(commit_output_2));

  // Alice receives the close of the group
  let group_and_epoch_final_alice = await group_alice.receive(commit_output_2.commit);

  // Info: print the group and epoch final alice
  info("Group and Epoch Final Alice:", JSON.stringify(group_and_epoch_final_alice.groupIdEpoch));

  // Bob processes its close of the group
  // This leaves Bob alone in the new epoch which is NOT 0xFF..FF
  let group_and_epoch_final_bob = await group_bob.receive(commit_output_2.commit);

  // Info: print the group and epoch final Bob
  info("Group and Epoch Final Bob:", JSON.stringify(group_and_epoch_final_bob.groupIdEpoch));

  // Test: compare the group members after the close
  let members_alice_2 = await group_alice.details();
  let members_bob_2 = await group_bob.details();

  // This is counter intuitive, but true: Alice has two members in the group
  // after being removed by Bob, basically because she is left in her epoch.
  // Technically she can send messages in the previous epoch, but not in the current one.
  is(members_alice_2.members.length, 2, "Alice should have two members in the group");
  is(members_bob_2.members.length, 1, "Bob should be alone in the group");

  // Test: check that alice has transitioned to the 0xFF..FF epoch
  is(byteArrayToHexString(group_and_epoch_final_alice.groupEpoch), "ffffffffffffffff", "Alice should have a returned epoch set to 0xFF..FF");

  // Test: check that bob has transitioned to epoch 2
  const expectedEpoch = new Uint8Array(new BigUint64Array([2n]).buffer);
  is(byteArrayToHexString(group_and_epoch_final_bob.groupEpoch), byteArrayToHexString(expectedEpoch), "Bob should have transitioned to epoch 2");

  // Bob is alone in the group and can remove its state
  let bob_deleted = await group_bob.deleteState();

  is(bob_deleted, undefined, "Bob should have deleted his state for this group");

  SimpleTest.finish();
}

SimpleTest.waitForExplicitFinish();
test_group_close();

</script>
</pre>
</body>
</html>