initial version of including device keys with olm-encrypted events
parent
b9cdd782b9
commit
ce31f30940
@ -0,0 +1,135 @@
|
|||||||
|
# MSCxxxx: Including device keys with Olm-encrypted events
|
||||||
|
|
||||||
|
When a Megolm session is sent from one device to another via Olm, the recipient
|
||||||
|
can
|
||||||
|
[query](https://spec.matrix.org/unstable/client-server-api/#post_matrixclientv3keysquery)
|
||||||
|
the sender's device keys and check whether the device has been cross-signed in
|
||||||
|
order to determine whether the sending device can be trusted. However, this
|
||||||
|
does not work if the sending device has since logged out as the recipient will
|
||||||
|
not be able to query the sender's device keys. For example, this can happen if
|
||||||
|
the recipient is offline for a long time.
|
||||||
|
|
||||||
|
One way to solve this is to include a copy of the device keys in the
|
||||||
|
Olm-encrypted message, along with the cross-signing signatures, so that the
|
||||||
|
recipient does not have to try to query the sender's keys.
|
||||||
|
|
||||||
|
## Proposal
|
||||||
|
|
||||||
|
The plaintext payload of the [`m.olm.v1.curve25519-aes-sha2` encryption
|
||||||
|
algorithm](https://spec.matrix.org/unstable/client-server-api/#molmv1curve25519-aes-sha2)
|
||||||
|
is currently of the form:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"type": "<type of the plaintext event>",
|
||||||
|
"content": "<content for the plaintext event>",
|
||||||
|
"sender": "<sender_user_id>",
|
||||||
|
"recipient": "<recipient_user_id>",
|
||||||
|
"recipient_keys": {
|
||||||
|
"ed25519": "<our_ed25519_key>"
|
||||||
|
},
|
||||||
|
"keys": {
|
||||||
|
"ed25519": "<sender_ed25519_key>"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
We propose to add a new property: `device_keys`, which is a copy of what the
|
||||||
|
server would return in response to a
|
||||||
|
[`/keys/query`](https://spec.matrix.org/unstable/client-server-api/#post_matrixclientv3keysquery)
|
||||||
|
request, as the device keys for the sender's device. In other words, the
|
||||||
|
plaintext payload will now look something like:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"type": "<type of the plaintext event>",
|
||||||
|
"content": "<content for the plaintext event>",
|
||||||
|
"sender": "<sender_user_id>",
|
||||||
|
"recipient": "<recipient_user_id>",
|
||||||
|
"recipient_keys": {
|
||||||
|
"ed25519": "<our_ed25519_key>"
|
||||||
|
},
|
||||||
|
"keys": {
|
||||||
|
"ed25519": "<sender_ed25519_key>"
|
||||||
|
},
|
||||||
|
"device_keys": {
|
||||||
|
"algorithms": ["<supported>", "<algoriithms>"],
|
||||||
|
"user_id": "<user_id>",
|
||||||
|
"device_id": "<device_id>",
|
||||||
|
"keys": {
|
||||||
|
"ed25519:<device_id>": "<our_ed25519_key>",
|
||||||
|
"curve25519:<device_id>": "<our_curve25519_key>"
|
||||||
|
},
|
||||||
|
"signatures": {
|
||||||
|
"<user_id>": {
|
||||||
|
"ed25519:<device_id>": "<device_signature>",
|
||||||
|
"ed25519:<ssk_id>": "<ssk_signature>",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
If this property is present, the `keys`.`ed25519` property of the plaintext
|
||||||
|
payload must be the same as the `device_keys`.`keys`.`ed25519:<DEVICEID>`
|
||||||
|
property.
|
||||||
|
|
||||||
|
As the `keys` property is now redundant, it may be removed in a future version
|
||||||
|
of Olm.
|
||||||
|
|
||||||
|
## Potential issues
|
||||||
|
|
||||||
|
Adding this property will increase the size of the event. This could be
|
||||||
|
mitigated by only sending the `device_keys` in pre-key messages (Olm messages
|
||||||
|
with `type: 0` in the `m.room.encrypted` event -- with the rationale that if
|
||||||
|
the Olm message is a normal (non-pre-key) message, this means that the
|
||||||
|
recipient has already decrypted a pre-key message that contains the
|
||||||
|
information, and so does not need to be re-sent the information), or if the
|
||||||
|
signatures change (for example, if the sender resets their cross-signing keys),
|
||||||
|
or if the sender has not yet sent their `device_keys`. However, this requires
|
||||||
|
additional bookkeeping, and it is not clear whether this extra complexity is
|
||||||
|
worth the reduction in bandwidth.
|
||||||
|
|
||||||
|
If the sender resets their cross-signing keys, then the self-signing signature
|
||||||
|
in the `device_keys` is meaningless. The recipient will need to re-query the
|
||||||
|
device keys, and will need to treat the sender as untrusted if it fails to do
|
||||||
|
so. The sender could include the self-signing key, signed by the
|
||||||
|
master-signing key, in the plaintext event, so that if the user only resets
|
||||||
|
their self-signing key but retains their masster-signing key, the recipient can
|
||||||
|
still check the sender's device keys. However, this will further increase the
|
||||||
|
size of the event, and it is not common for clients to reset the self-signing
|
||||||
|
key without also resetting the master-signing key, so this is unlikely to give
|
||||||
|
much benefit.
|
||||||
|
|
||||||
|
## Alternatives
|
||||||
|
|
||||||
|
The `device_keys` property could be added to the cleartext. That is, it could
|
||||||
|
be added as a property to the `m.room.encrypted` event. This information is
|
||||||
|
already public, as it is accessible from `/keys/query` (while the device is
|
||||||
|
logged in), and does not need to be authenticated as it is protected by .the
|
||||||
|
self-signing signature, so it does not seem to need to be encrypted. However,
|
||||||
|
there seems to be little reason not to encrypt the information.
|
||||||
|
|
||||||
|
The `device_keys` property could be added to the cleartext by the sender's
|
||||||
|
homeserver, rather than by the sending client. Possibly within an `unsigned`
|
||||||
|
property, as that is where properties added by homeservers are customarily
|
||||||
|
added. It is not clear what advantage there would be to having this
|
||||||
|
information being added by the client.
|
||||||
|
|
||||||
|
## Security considerations
|
||||||
|
|
||||||
|
If a device is logged out, there is no indication why it was logged out. For
|
||||||
|
example, an attacker could steal a device and use it send a message. The user,
|
||||||
|
upon realizing that the device has been stolen, could log out the device, but
|
||||||
|
the message may still be sent, if the user does not notice the message and
|
||||||
|
redact it. Thus the recipient device should still indicate that the message
|
||||||
|
came from a deleted device.
|
||||||
|
|
||||||
|
## Unstable prefix
|
||||||
|
|
||||||
|
Until this MSC is accepted, the new property should be named
|
||||||
|
`org.matrix.mscxxxx.device_keys`.
|
||||||
|
|
||||||
|
## Dependencies
|
||||||
|
|
||||||
|
None
|
||||||
Loading…
Reference in New Issue