-
-
Notifications
You must be signed in to change notification settings - Fork 121
Clarify terminology for keys in cross-signing module #2188
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from 1 commit
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
Clarify terminology for keys in cross-signing module. |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -93,7 +93,7 @@ Example: | |
``` | ||
|
||
`ed25519` and `curve25519` keys are used for [device keys](#device-keys). | ||
Additionally, `ed25519` keys are used for [cross-signing keys](#cross-signing). | ||
Additionally, `ed25519` keys are keys used for [cross-signing](#cross-signing). | ||
|
||
`signed_curve25519` keys are used for [one-time and fallback keys](#one-time-and-fallback-keys). | ||
|
||
|
@@ -675,7 +675,7 @@ The process between Alice and Bob verifying each other would be: | |
15. Assuming they match, Alice and Bob's devices each calculate Message | ||
Authentication Codes (MACs) for: | ||
* Each of the keys that they wish the other user to verify (usually their | ||
device ed25519 key and their master cross-signing key). | ||
device ed25519 key and their master key, see below). | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. hrm, I am not sure I love the term "master key". In some respects, the secret storage key is more of a "master key" since it allows access to all the other keys. Maybe we should stick with a "master signing key"? Alternatively, we could call it "master identity key" (see also: matrix-org/matrix-spec-proposals#4161). There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I feel similarly. If I understand the motivation correctly, the issue is that the MSK is not only used for cross signing. It's still always(?) used for signing, however, so the term "master signing key" seems somewhat fitting to me. Given that "MSK" is already an established term, we might actually cause more harm than good by rebranding it "MK". There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. In API endpoints, the key is already named There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Hm, that's true and changing API identifiers feels quite unfeasible. 🫤 There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
True, but as @Johennes says, changing that is hard. The text of the spec does not need to be constrained by the poor choices of the API. If necessary, we can use words of the form "master signing key (sometimes known, for historical reasons, simply as |
||
* The complete list of key IDs that they wish the other user to verify. | ||
|
||
The MAC calculation is defined [below](#mac-calculation). | ||
|
@@ -931,16 +931,16 @@ and can be translated online: | |
Rather than requiring Alice to verify each of Bob's devices with each of | ||
her own devices and vice versa, the cross-signing feature allows users | ||
to sign their device keys such that Alice and Bob only need to verify | ||
once. With cross-signing, each user has a set of cross-signing keys that | ||
once. With cross-signing, each user has a set of ed25519 key pairs that | ||
are used to sign their own device keys and other users' keys, and can be | ||
used to trust device keys that were not verified directly. | ||
|
||
Each user has three ed25519 key pairs for cross-signing: | ||
Each user has three ed25519 key pairs used for cross-signing: | ||
|
||
- a master key (MSK) that serves as the user's identity in | ||
cross-signing and signs their other cross-signing keys; | ||
- a master key (MK) that serves as the user's identity in | ||
cross-signing and signs their user-signing and self-signing keys; | ||
- a user-signing key (USK) -- only visible to the user that it belongs | ||
to --that signs other users' master keys; and | ||
to -- that signs other users' master keys; and | ||
- a self-signing key (SSK) that signs the user's own device keys. | ||
|
||
The master key may also be used to sign other items such as the backup | ||
|
@@ -950,13 +950,15 @@ previously verified Bob's device and Bob's device has signed his master | |
key, then Alice's device can trust Bob's master key, and she can sign it | ||
with her user-signing key. | ||
|
||
Users upload their cross-signing keys to the server using [POST | ||
Users upload the public part of their master, user-signing and self-signing | ||
key to the server using [POST | ||
/\_matrix/client/v3/keys/device\_signing/upload](/client-server-api/#post_matrixclientv3keysdevice_signingupload). When Alice uploads | ||
new cross-signing keys, her user ID will appear in the `changed` | ||
new keys, her user ID will appear in the `changed` | ||
property of the `device_lists` field of the `/sync` of response of all | ||
users who share an encrypted room with her. When Bob sees Alice's user | ||
ID in his `/sync`, he will call [POST /\_matrix/client/v3/keys/query](/client-server-api/#post_matrixclientv3keysquery) | ||
to retrieve Alice's device and cross-signing keys. | ||
to retrieve Alice's device keys, as well as their master, user-signing and | ||
self-signing key. | ||
|
||
If Alice has a device and wishes to send an encrypted message to Bob, | ||
she can trust Bob's device if: | ||
|
@@ -971,13 +973,13 @@ The following diagram illustrates how keys are signed: | |
|
||
``` | ||
+------------------+ .................. +----------------+ | ||
| +--------------+ | .................. : | +------------+ | | ||
| | v v v : : v v v | | | ||
| | +-----------+ : : +-----------+ | | | ||
| | | Alice MSK | : : | Bob MSK | | | | ||
| | +-----------+ : : +-----------+ | | | ||
| | | : : : : | | | | ||
| | +--+ :... : : ...: +--+ | | | ||
| +--------------+ | ................... : | +------------+ | | ||
| | v v v : : v v v | | | ||
| | +----------+ : : +----------+ | | | ||
| | | Alice MK | : : | Bob MK | | | | ||
| | +----------+ : : +----------+ | | | ||
| | | : : : : | | | | ||
| | +--+ :.... : : ...: +---+ | | | ||
| | v v : : v v | | | ||
| | +-----------+ ............. : : ............. +-----------+ | | | ||
| | | Alice SSK | : Alice USK : : : : Bob USK : | Bob SSK | | | | ||
|
@@ -1004,11 +1006,11 @@ signatures that she cannot see: | |
+------------------+ +----------------+ +----------------+ | ||
| +--------------+ | | | | +------------+ | | ||
| | v v | v v v | | | ||
| | +-----------+ | +-----------+ | | | ||
| | | Alice MSK | | | Bob MSK | | | | ||
| | +-----------+ | +-----------+ | | | ||
| | | | | | | | | ||
| | +--+ +--+ | +--+ | | | ||
| | +----------+ | +----------+ | | | ||
| | | Alice MK | | | Bob MK | | | | ||
| | +----------+ | +----------+ | | | ||
| | | | | | | | | ||
| | +--+ +---+ | +---+ | | | ||
| | v v | v | | | ||
| | +-----------+ +-----------+ | +-----------+ | | | ||
| | | Alice SSK | | Alice USK | | | Bob SSK | | | | ||
|
@@ -1024,16 +1026,16 @@ signatures that she cannot see: | |
``` | ||
|
||
[Verification methods](#device-verification) can be used to verify a | ||
user's master key by using the master public key, encoded using unpadded | ||
user's master key by treating the master public key, encoded using unpadded | ||
base64, as the device ID, and treating it as a normal device. For | ||
example, if Alice and Bob verify each other using SAS, Alice's | ||
`m.key.verification.mac` message to Bob may include | ||
`"ed25519:alices+master+public+key": "alices+master+public+key"` in the | ||
`mac` property. Servers therefore must ensure that device IDs will not | ||
collide with cross-signing public keys. | ||
collide with public keys used for cross-signing. | ||
|
||
The cross-signing private keys can be stored on the server or shared with other | ||
devices using the [Secrets](#secrets) module. When doing so, the master, | ||
Using the [Secrets](#secrets) module the private keys used for cross-signing can | ||
be stored on the server or shared with other devices. When doing so, the master, | ||
user-signing, and self-signing keys are identified using the names | ||
`m.cross_signing.master`, `m.cross_signing.user_signing`, and | ||
`m.cross_signing.self_signing`, respectively, and the keys are base64-encoded | ||
|
@@ -1052,22 +1054,23 @@ If a user's client sees that any other user has changed their master | |
key, that client must notify the user about the change before allowing | ||
communication between the users to continue. | ||
|
||
Since device key IDs (`ed25519:DEVICE_ID`) and cross-signing key IDs | ||
(`ed25519:PUBLIC_KEY`) occupy the same namespace, clients must ensure that they | ||
use the correct keys when verifying. | ||
Since device key IDs (`ed25519:DEVICE_ID`) as well as master, user-signing and | ||
self-signing key IDs (`ed25519:PUBLIC_KEY`) occupy the same namespace, clients | ||
must ensure that they use the correct keys when verifying. | ||
|
||
While servers MUST not allow devices to have the same IDs as cross-signing | ||
keys, a malicious server could construct such a situation, so clients must not | ||
rely on the server being well-behaved and should take the following precautions | ||
against this. | ||
While servers MUST not allow devices to have the same IDs as keys used for | ||
cross-signing, a malicious server could construct such a situation, so clients | ||
must not rely on the server being well-behaved and should take the following | ||
precautions against this: | ||
|
||
1. Clients MUST refer to keys by their public keys during the verification | ||
process, rather than only by the key ID. | ||
2. Clients MUST fix the keys that are being verified at the beginning of the | ||
verification process, and ensure that they do not change in the course of | ||
verification. | ||
3. Clients SHOULD also display a warning and MUST refuse to verify a user when | ||
they detect that the user has a device with the same ID as a cross-signing key. | ||
they detect that the user has a device with the same ID as a key used for | ||
cross-signing. | ||
|
||
A user's user-signing and self-signing keys are intended to be easily | ||
replaceable if they are compromised by re-issuing a new key signed by | ||
|
@@ -1104,7 +1107,7 @@ user-signing keys. | |
|
||
Verifying by QR codes provides a quick way to verify when one of the parties | ||
has a device capable of scanning a QR code. The QR code encodes both parties' | ||
master signing keys as well as a random shared secret that is used to allow | ||
master keys as well as a random shared secret that is used to allow | ||
bi-directional verification from a single scan. | ||
|
||
To advertise the ability to show a QR code, clients use the names | ||
|
@@ -1202,15 +1205,14 @@ The binary segment MUST be of the following form: | |
bytes of the ID as a UTF-8 string | ||
- the ID encoded as a UTF-8 string | ||
- the first key, as 32 bytes. The key to use depends on the mode field: | ||
- if `0x00` or `0x01`, then the current user's own master cross-signing public key | ||
- if `0x00` or `0x01`, then the current user's own master public key | ||
- if `0x02`, then the current device's Ed25519 signing key | ||
- the second key, as 32 bytes. The key to use depends on the mode field: | ||
- if `0x00`, then what the device thinks the other user's master | ||
cross-signing public key is | ||
public key is | ||
- if `0x01`, then what the device thinks the other device's Ed25519 signing | ||
public key is | ||
- if `0x02`, then what the device thinks the user's master cross-signing public | ||
key is | ||
- if `0x02`, then what the device thinks the user's master public key is | ||
anoadragon453 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
- a random shared secret, as a sequence of bytes. It is suggested to use a secret | ||
that is about 8 bytes long. Note: as we do not share the length of the | ||
secret, and it is not a fixed size, clients will just use the remainder of | ||
|
@@ -1221,14 +1223,14 @@ For example, if Alice displays a QR code encoding the following binary data: | |
``` | ||
"MATRIX" |ver|mode| len | event ID | ||
4D 41 54 52 49 58 02 00 00 2D 21 41 42 43 44 ... | ||
| user's cross-signing key | other user's cross-signing key | shared secret | ||
00 01 02 03 04 05 06 07 ... 10 11 12 13 14 15 16 17 ... 20 21 22 23 24 25 26 27 | ||
| the first key | the second key | shared secret | ||
00 01 02 03 04 05 06 07 ... 10 11 12 13 14 15 16 17 ... 20 21 22 23 24 25 26 27 | ||
``` | ||
|
||
this indicates that Alice is verifying another user (say Bob), in response to | ||
the request from event "$ABCD...", her cross-signing key is | ||
Mode `0x00` indicates that Alice is verifying another user (say Bob), in | ||
response to the request from event "$ABCD...", her master key is | ||
`0001020304050607...` (which is "AAECAwQFBg..." in base64), she thinks that | ||
Bob's cross-signing key is `1011121314151617...` (which is "EBESExQVFh..." in | ||
Bob's master key is `1011121314151617...` (which is "EBESExQVFh..." in | ||
base64), and the shared secret is `2021222324252627` (which is "ICEiIyQlJic" in | ||
base64). | ||
|
||
|
@@ -1300,8 +1302,8 @@ one of its variants. | |
Clients must only store keys in backups after they have ensured that the | ||
`auth_data` is trusted. This can be done either by: | ||
|
||
- checking that it is signed by the user's [master cross-signing | ||
key](#cross-signing) or by a verified device belonging to the same user, or | ||
- checking that it is signed by the user's [master key](#cross-signing) | ||
or by a verified device belonging to the same user, or | ||
- deriving the public key from a private key that it obtained from a trusted | ||
source. Trusted sources for the private key include the user entering the | ||
key, retrieving the key stored in [secret storage](#secret-storage), or | ||
|
@@ -1786,13 +1788,14 @@ a way to identify the server's support for fallback keys. | |
|
||
| Parameter | Type | Description | | ||
|------------|-----------|------------------------------------------------------------------------------------------------------------------------------------------------------------------| | ||
| changed | [string] | List of users who have updated their device identity or cross-signing keys, or who now share an encrypted room with the client since the previous sync response. | | ||
| changed | [string] | List of users who have updated their device identity or their master, self-signing or user-signing keys, or who now share an encrypted room with the client since the previous sync response. | | ||
| left | [string] | List of users with whom we do not share any encrypted rooms anymore since the previous sync response. | | ||
|
||
{{% boxes/note %}} | ||
For optimal performance, Alice should be added to `changed` in Bob's | ||
sync only when she updates her devices or cross-signing keys, or when | ||
Alice and Bob now share a room but didn't share any room previously. | ||
sync only when she updates her devices or master, self-signing or | ||
user-signing keys, or when Alice and Bob now share a room but didn't | ||
share any room previously. | ||
However, for the sake of simpler logic, a server may add Alice to | ||
`changed` when Alice and Bob share a new room, even if they previously | ||
already shared a room. | ||
|
Uh oh!
There was an error while loading. Please reload this page.