Hey folks. Earlier this year we proposed a first step of interoperability as the delegation of DID to a single messaging identity (at a time), and offered Distributed MLS as a solution to concerns about centralized state and MLS.
Building out those ideas, we’ve since launched our beta, and described in detail how it’s implemented and some of the lessons we’ve learned along the way.
To recap the way I saw the interoperability problem in March:
We need alignment on the following components for inter-user interoperability
-
Delegation from ATProto DID to user-controlled messaging identity keys
-
A scheme to form encryption sessions with those identity keys
-
Ways to transport messages encrypted with those encryption sessions.
-
Schema for the message contents
For apps serving the same user to interoperate, they need to further cooperate to
-
Communicate changes to the user’s trusted recipient set
-
Synchronize message history
I don’t think this needs to implicate inter-user interoperability, but I’ll note that this is a complex feature set, akin to what Facebook launched for messenger, and the challenge we (and I expect you all) face is how to roll out that complete feature set incrementally but securely
We are an implementer of E2EE messages with ATProto identities. We have been building from the beginning for users on independent infrastructure, with independent clients, to be able to talk to users on Germ. We think we have solutions to offer in this space, but we also want to ensure the basis of interoperability matches the security guarantees of E2EE messaging like Signal. We do not think we need to regress security to accomplish interoperability.
Our experience building our ATProto integration indicates we need an interoperable mechanism for users to signal changes in trust (like the safety number warnings in Signal), and we continue to think the serial delegation of ATProto DID to a single identity is the correct abstraction.
Threat model
We should assume that the default implementation of PDS is a persistently online entity not under the user’s physical control, which users authenticate to with resettable credentials. Delegating PDS keys to the server was an explicit choice to allow users to have that low-friction experience of delegating key management. Exceptional users may take control of their PDS keys, but we should not base security assumptions on exceptional users, nor require users to reclaim PDS key management to get equivalent security guarantees to Signal. For example, It should not be possible for a compromise of the user’s PDS credentials (e.g. Bluesky password + 2FA) to enable eavesdropping on ongoing conversations.
Consequently, we should treat the user’s PDS, and the apps they use for messaging, as distinct but complementary entities. This is useful - it separates the sharp edges of key management from a recoverable, user identity. Thankfully, this is basically the shape that Signal has - delegating from a recoverable, low-trust phone number to high-trust device-bound keys - so we have familiar UX patterns to fall in on.
User Warnings about Changes in Trust
The existing trust model on Signal has the following characteristics:
-
Users trust on first use when contacting someone on Signal
-
Users can inspect and compare the cryptographic identities they are conversing with, and as.
-
Users are alerted if the cryptographic identity changes from what they previously verified or have been communicating with.
So while Alice does not have to reason about Bob’s adding or removing of linked devices, or even migration to a new phone, Alice is notified if Bob re-registers on a new phone.
We conclude that
- It is possible, likely, and useful for users to be informed of changes in other users’ security state
- For users to make sensible choices, clients need a mechanism to allow for trusted changes of recipient(device) set, to more fully distinguish untrusted changes of device set.
This is the threat model and UX intent for our recommendation that ATProto delegate to a single messaging identity key at a time. This isn’t a restriction to a single device - it’s an abstraction of the user’s trusted device set into a single identity for others to reason about. Different clients can pursue different strategies for implementing multiple apps and devices behind this identity.
This simple abstraction allows for a simple rule for presenting security boundary alerts. If Alice’s PDS publishes a new delegated identity key, without cross signing from the predecessor key known to Bob, Bob should treat it as a security boundary and warn the user.