Skip to content
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

Define hkdf-hmac-sha256.v2 MAC method for SAS verification #1412

Merged
merged 6 commits into from Feb 10, 2023
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions changelogs/client_server/newsfragments/1412.feature
@@ -0,0 +1 @@
Define `hkdf-hmac-sha256.v2` MAC method for SAS verification, as per [MSC 3783](Define hkdf-hmac-sha256.v2 MAC method for SAS verification).
richvdh marked this conversation as resolved.
Show resolved Hide resolved
60 changes: 39 additions & 21 deletions content/client-server-api/modules/end_to_end_encryption.md
Expand Up @@ -671,10 +671,7 @@ The process between Alice and Bob verifying each other would be:
15. Assuming they match, Alice and Bob's devices calculate the HMAC of
their own device keys and a comma-separated sorted list of the key
IDs that they wish the other user to verify, using SHA-256 as the
hash function. HMAC is defined in [RFC
2104](https://tools.ietf.org/html/rfc2104). The key for the HMAC is
different for each item and is calculated by generating 32 bytes
(256 bits) using [the key verification HKDF](#hkdf-calculation).
hash function. The HMAC calculation is defined [below](#mac-calculation).
richvdh marked this conversation as resolved.
Show resolved Hide resolved
16. Alice's device sends Bob's device an `m.key.verification.mac`
message containing the MAC of Alice's device keys and the MAC of her
key IDs to be verified. Bob's device does the same for Bob's device
Expand Down Expand Up @@ -767,7 +764,42 @@ following error codes are used in addition to those already specified:

{{% event event="m.key.verification.mac" %}}

###### HKDF calculation
###### MAC calculation

For verification of each party's device keys, a MAC is calculated individually
for each the keys that are to be verified. As well, a MAC is calculated for a
list of the keys IDs. The MAC used is HMAC as defined in [RFC
richvdh marked this conversation as resolved.
Show resolved Hide resolved
2104](https://tools.ietf.org/html/rfc2104), using SHA-256 as the hash function.
The HMAC key is calculated using HKDF as defined in [RFC
5869](https://tools.ietf.org/html/rfc5869), using SHA-256 as the hash
function. The shared secret is supplied as the input keying material. No salt
is used, and in the info parameter is the concatenation of:

- The string `MATRIX_KEY_VERIFICATION_MAC`.
- The Matrix ID of the user whose key is being MAC-ed.
- The Device ID of the device sending the MAC.
- The Matrix ID of the other user.
- The Device ID of the device receiving the MAC.
- The `transaction_id` being used.
- The Key ID of the key being MAC-ed, or the string `KEY_IDS` if the
item being MAC-ed is the list of key IDs.

If the key list is being MACed, the list is sorted lexicographically and
comma-separated with no extra whitespace added. In this way, the recipient can
reconstruct the list from the names in the `mac` property of the
`m.key.verification.mac` message and ensure that no keys were added or removed.
richvdh marked this conversation as resolved.
Show resolved Hide resolved

{{% boxes/note %}}
The MAC method `hkdf-hmac-sha256` used an incorrect base64 encoding, due to a
bug in the original implementation in libolm. To remedy this,
richvdh marked this conversation as resolved.
Show resolved Hide resolved
`hkdf-hmac-sha256.v2` was introduced, which calculates the MAC in the same way,
but uses a correct base64 encoding. `hkdf-hmac-sha256` is deprecated and will
be removed in a future version of the spec. Use of `hkdf-hmac-sha256` should
be avoided whenever possible: if both parties support `hkdf-hmac-sha256.v2`,
then `hkdf-hmac-sha256` MUST not be used.
{{% /boxes/note %}}

###### SAS HKDF calculation

In all of the SAS methods, HKDF is as defined in [RFC
5869](https://tools.ietf.org/html/rfc5869) and uses the previously
Expand Down Expand Up @@ -815,23 +847,9 @@ HKDF is used over the plain shared secret as it results in a harder
attack as well as more uniform data to work with.
{{% /boxes/rationale %}}

For verification of each party's device keys, HKDF is as defined in RFC
5869 and uses SHA-256 as the hash function. The shared secret is
supplied as the input keying material. No salt is used, and in the info
parameter is the concatenation of:

- The string `MATRIX_KEY_VERIFICATION_MAC`.
- The Matrix ID of the user whose key is being MAC-ed.
- The Device ID of the device sending the MAC.
- The Matrix ID of the other user.
- The Device ID of the device receiving the MAC.
- The `transaction_id` being used.
- The Key ID of the key being MAC-ed, or the string `KEY_IDS` if the
item being MAC-ed is the list of key IDs.

###### SAS method: `decimal`

Generate 5 bytes using [HKDF](#hkdf-calculation) then take sequences of 13 bits
Generate 5 bytes using [HKDF](#sas-hkdf-calculation) then take sequences of 13 bits
to convert to decimal numbers (resulting in 3 numbers between 0 and 8191
inclusive each). Add 1000 to each calculated number.

Expand All @@ -849,7 +867,7 @@ separator, such as dashes, or with the numbers on individual lines.

###### SAS method: `emoji`

Generate 6 bytes using [HKDF](#hkdf-calculation) then split the first 42 bits
Generate 6 bytes using [HKDF](#sas-hkdf-calculation) then split the first 42 bits
into 7 groups of 6 bits, similar to how one would base64 encode
something. Convert each group of 6 bits to a number and use the
following table to get the corresponding emoji:
Expand Down
Expand Up @@ -5,7 +5,7 @@
"method": "m.sas.v1",
"key_agreement_protocol": "curve25519",
"hash": "sha256",
"message_authentication_code": "hkdf-hmac-sha256",
"message_authentication_code": "hkdf-hmac-sha256.v2",
"short_authentication_string": ["decimal", "emoji"],
"commitment": "fQpGIW1Snz+pwLZu6sTy2aHy/DYWWTspTJRPyNp0PKkymfIsNffysMl6ObMMFdIJhk6g6pwlIqZ54rxo8SLmAg"
}
Expand Down
Expand Up @@ -6,7 +6,7 @@
"method": "m.sas.v1",
"key_agreement_protocols": ["curve25519"],
"hashes": ["sha256"],
"message_authentication_codes": ["hkdf-hmac-sha256"],
"message_authentication_codes": ["hkdf-hmac-sha256.v2", "hkdf-hmac-sha256"],
"short_authentication_string": ["decimal", "emoji"]
}
}
4 changes: 3 additions & 1 deletion data/event-schemas/schema/m.key.verification.mac.yaml
Expand Up @@ -3,7 +3,9 @@ allOf:
- $ref: core-event-schema/event.yaml

description: |-
Sends the MAC of a device's key to the partner device.
Sends the MAC of a device's key to the partner device. The MAC is calculated
using the method given in `message_authentication_code` property of the
`m.key.verification.accept` message.
properties:
content:
properties:
Expand Down
Expand Up @@ -42,7 +42,10 @@ properties:
type: array
description: |-
The message authentication codes that the sending device understands.
richvdh marked this conversation as resolved.
Show resolved Hide resolved
Must include at least `hkdf-hmac-sha256`.
Must include at least `hkdf-hmac-sha256.v2`. Should also include
`hkdf-hmac-sha256` for compatibility with older clients, though this
identifier is deprecated and will be removed in a future version of
the spec.
items:
type: string
short_authentication_string:
Expand Down