swicg / swicg/activitypub-e2ee

Private Key Storage / Synchronization

Open
#45 6 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
HTML
Stars
78
Forks
2
PR merge metrics
No merged PRs in 30d

Description

I'd like to discuss the use cases and issues around using multiple devices. This was raised briefly by @LukaJCB in #34, but hopefully it will be helpful to discuss it directly here.

USE CASE: I have a mobile phone and a desktop computer. I'd like to start a conversation on one device, then switch to another at some point later. This is pretty standard for other encrypted messaging systems (Proton Mail, Apple Messages, Signal, etc)

I don't believe the current spec has any way to share or sync keys. I recognize the potential danger of private keys being be leaked, but if we launch without this feature I believe it would be a dealbreaker for most users. One way or another, we should talk about it and come up with a clear answer.

And, if we do choose to do this, there should be a single, clearly defined way for us to build it so that we can have interoperable client apps at some point in the future.

My Recommendation is to add an additional property to the KeyPackage object and say clients MUST encrypt their KeyPackage private keys (using some key-encrypting-key not available to the server) and synchronize them using that property. We could recommend some encryption schemes.

Here's an example just to get this conversation started:

{
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://purl.archive.org/socialweb/mls"
  ],
  "id": "https://example.com/users/alyssa/keypackage/1",
  "type": "KeyPackage",
  "attributedTo": "https://example.com/users/alyssa",
  "to": "as:Public",
  "mediaType": "message/mls",
  "encoding": "base64",
  "summary": "This is a key package in MLS format.",
  "publicKey": "[base64-encoded Public KeyPackage data]",
  "privateKey": "[base64-encoded Private KeyPackage data]",
  "generator": {
    "id": "https://client.example/actor",
    "type": "Application",
    "name": "MLS-enabled ActivityPub client"
  }
}

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start by reading the linked KeyPackage object specification and the earlier discussion in issue #34, then review the proposed JSON example here. The work is done when the project has a decided, clearly specified interoperable approach to private-key storage and synchronization across devices.

Written by the indexing model from the issue text.

Assessment

Domain
cryptography, distributed-systems, security
Issue type
Feature
Difficulty
5/5
Estimated time
Over a week
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
25/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.