Skip to content

Commit ac14a3b

Browse files
authored
Merge pull request #186 from katzenpost/update_groupchat_with_vouchers
Update group chat spec with voucher system notes
2 parents 92babd6 + 81fe29b commit ac14a3b

2 files changed

Lines changed: 66 additions & 0 deletions

File tree

content/en/docs/specs/group_chat.md

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,3 +213,61 @@ FUTURE WORK:
213213
However the core cryptography of the Reunion protocol was ported to golang, here: https://github.com/katzenpost/reunion/
214214

215215

216+
# New Proposal Voucher Design
217+
218+
This is a new design proposed by Leif and Threebithacker:
219+
220+
221+
## Contact vouchers
222+
223+
In order to join or initiate a conversation, participants need to exchange cryptographic key material.
224+
To address this problem we have a slightly unusual design: Contact vouchers.
225+
226+
In many systems, invites to conversations flow from an existing member of the conversation to the user being invited.
227+
In our "Contact Voucher" protocol this flow is reversed:
228+
A member wishing to join a conversation hands a "Contact Voucher" (out of band) to the existing member, who then inducts the new member into the group.
229+
230+
This design mitigates two potential problem with the former way of doing it:
231+
1. If the Contact Voucher is observed by a third-party, the third-party does not get to read neither participants' actual messages.
232+
- **Passive** adversaries learn that the voucher was spent, but do not get to observe further interactions.
233+
- **Active** adversaries can create a new fake group to induct the member into but does not learn anything about the existing group.
234+
- In the future to prevent this one-way impersonation we could allow a "both parties bring something on paper to the meeting":
235+
- Bob brings Contact Voucher
236+
- Alice brings fingerprint for the VoucherReplyPublicKey (thwarts the active attacker)
237+
2. Only one thing needs to delivered out of band to achieve a 2-pass protocol (instead of a 3-pass protocol).
238+
- Only one of the parties need to bring key material to a meeting in order to establish contact.
239+
240+
```mermaid
241+
sequenceDiagram
242+
actor Bob
243+
participant VoucherSeq@{ "type" : "database" }
244+
actor Alice
245+
Bob-->>+Bob: Generates VoucherKeypair. <br>Generates BACAP write/read cap.<br>VoucherPayload := read cap || VoucherPublicKey<br>Voucher := Hash(VoucherPayload)
246+
Bob->>+VoucherSeq: Publish: VoucherPayload
247+
Bob-->>Alice: [Sent OOB] Voucher
248+
249+
250+
Alice-->>+Alice: Derive VoucherSeq read/write caps from Voucher.<br>Read the first box in VoucherSeq
251+
VoucherSeq->>+Alice: VoucherPayload
252+
253+
Alice-->>+Alice: VoucherReply := Encrypt(WhoReply + VoucherSalt)<br> to VoucherPublicKey<br><br>Derive Bob's ReadCap from<br>VoucherPayload + VoucherSalt
254+
par_over All-Or-Nothing using COPY service
255+
Alice->>+VoucherSeq: VoucherReply
256+
Alice->>+Alice's Group: WhoReply<br>(incl. Bob's new ReadCap)
257+
Alice->>+VoucherSeq: Tombstone VoucherPayload<br>to prevent Voucher reuse
258+
end
259+
260+
Bob-->>+Bob: Poll the second VoucherSeq box until Alice replies
261+
VoucherSeq->>+Bob: VoucherReply
262+
```
263+
264+
## Self-authenticating BACAP payload
265+
The first message sent (The VoucherPayload) is authenticated in the following manner:
266+
- The VoucherPayload is computed (first).
267+
- A cryptographic hash of the VoucherPayload is computed. This hash **is** the *Voucher**.
268+
- The **Voucher** is then used to derive a BACAP read/write capability set.
269+
- The VoucherPayload is uploaded to the sequence described by the capability (at index 0).
270+
- Anyone who intercepts the **Voucher** can read **and** write the sequence.
271+
- But: Since the **Voucher** is a hash over the VoucherPayload, writing the sequence with anything but the VoucherPayload will be detectable by the recipient.
272+
- This means that the contents *cannot* be undetectably be modified by the interceptor.
273+

hugo.yaml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,14 @@ outputs:
7171
section: [HTML, print, RSS]
7272

7373
params:
74+
75+
mermaid:
76+
theme: dark
77+
themeVariables:
78+
textColor: "#ffffff"
79+
primaryTextColor: "#ffffff"
80+
secondaryTextColor: "#ffffff"
81+
7482
taxonomy:
7583
# set taxonomyCloud = [] to hide taxonomy clouds
7684
taxonomyCloud: [tags, categories]

0 commit comments

Comments
 (0)