mirror of
https://github.com/matrix-org/matrix-spec
synced 2026-02-20 13:03:42 +01:00
Add fonts, circumvent docsy's built-in katex support and limit CSP relaxation
This commit is contained in:
parent
2cbda923c8
commit
1c86b1d296
|
|
@ -502,6 +502,13 @@ Make padding symmetrical (this selector is used in the default styles to apply p
|
|||
}
|
||||
}
|
||||
|
||||
/* Adjust the width of math to match normal paragraphs */
|
||||
@include media-breakpoint-up(lg) {
|
||||
.katex-display {
|
||||
max-width: 80%;
|
||||
}
|
||||
}
|
||||
|
||||
/* Adjust default styles for info banner */
|
||||
.pageinfo-primary {
|
||||
@include media-breakpoint-up(lg) {
|
||||
|
|
|
|||
|
|
@ -47,7 +47,7 @@ description = "Home of the Matrix specification for decentralised communication"
|
|||
[markup.goldmark.extensions.passthrough]
|
||||
enable = true
|
||||
[markup.goldmark.extensions.passthrough.delimiters]
|
||||
block = [['\[', '\]'], ['$$', '$$']]
|
||||
block = [['\[', '\]']]
|
||||
inline = [['\(', '\)']]
|
||||
[markup.highlight]
|
||||
# See a complete list of available styles at https://xyproto.github.io/splash/docs/all.html
|
||||
|
|
@ -127,8 +127,7 @@ sidebar_menu_compact = true
|
|||
[[server.headers]]
|
||||
for = '/**'
|
||||
[server.headers.values]
|
||||
# TODO: figure out CSP
|
||||
# Content-Security-Policy = "default-src 'self'; style-src 'self'; script-src 'self'; img-src 'self' data:; connect-src 'self'; font-src 'self' data:; media-src 'self'; child-src 'self'; form-action 'self'; object-src 'self'"
|
||||
Content-Security-Policy = "default-src 'self'; style-src 'self' 'unsafe-inline'; script-src 'self'; img-src 'self' data:; connect-src 'self'; font-src 'self' data:; media-src 'self'; child-src 'self'; form-action 'self'; object-src 'self'"
|
||||
X-XSS-Protection = "1; mode=block"
|
||||
X-Content-Type-Options = "nosniff"
|
||||
# Strict-Transport-Security = "max-age=31536000; includeSubDomains; preload"
|
||||
|
|
|
|||
|
|
@ -151,7 +151,7 @@ request.
|
|||
|
||||
How data flows between clients:
|
||||
|
||||
```
|
||||
```nohighlight
|
||||
{ Matrix client A } { Matrix client B }
|
||||
^ | ^ |
|
||||
| events | Client-Server API | events |
|
||||
|
|
|
|||
|
|
@ -749,13 +749,13 @@ history (a permalink).
|
|||
|
||||
The Matrix URI scheme is defined as follows (`[]` enclose optional parts, `{}`
|
||||
enclose variables):
|
||||
```
|
||||
```nohighlight
|
||||
matrix:[//{authority}/]{type}/{id without sigil}[/{type}/{id without sigil}...][?{query}][#{fragment}]
|
||||
```
|
||||
|
||||
As a schema, this can be represented as:
|
||||
|
||||
```
|
||||
```nohighlight
|
||||
MatrixURI = "matrix:" hier-part [ "?" query ] [ "#" fragment ]
|
||||
hier-part = [ "//" authority "/" ] path
|
||||
path = entity-descriptor ["/" entity-descriptor]
|
||||
|
|
@ -865,7 +865,7 @@ below for more details.
|
|||
A matrix.to URI has the following format, based upon the specification
|
||||
defined in [RFC 3986](https://tools.ietf.org/html/rfc3986):
|
||||
|
||||
```
|
||||
```nohighlight
|
||||
https://matrix.to/#/<identifier>/<extra parameter>?<additional arguments>
|
||||
```
|
||||
|
||||
|
|
|
|||
|
|
@ -178,13 +178,13 @@ The application service API provides a transaction API for sending a
|
|||
list of events. Each list of events includes a transaction ID, which
|
||||
works as follows:
|
||||
|
||||
```
|
||||
```nohighlight
|
||||
Typical
|
||||
HS ---> AS : Homeserver sends events with transaction ID T.
|
||||
<--- : Application Service sends back 200 OK.
|
||||
```
|
||||
|
||||
```
|
||||
```nohighlight
|
||||
AS ACK Lost
|
||||
HS ---> AS : Homeserver sends events with transaction ID T.
|
||||
<-/- : AS 200 OK is lost.
|
||||
|
|
@ -258,7 +258,7 @@ have been omitted for brevity):
|
|||
|
||||
**Typical**
|
||||
|
||||
```
|
||||
```nohighlight
|
||||
AS ---> HS : /_matrix/client/v1/appservice/{appserviceId}/ping {"transaction_id": "meow"}
|
||||
HS ---> AS : /_matrix/app/v1/ping {"transaction_id": "meow"}
|
||||
HS <--- AS : 200 OK {}
|
||||
|
|
@ -267,7 +267,7 @@ AS <--- HS : 200 OK {"duration_ms": 123}
|
|||
|
||||
**Incorrect `hs_token`**
|
||||
|
||||
```
|
||||
```nohighlight
|
||||
AS ---> HS : /_matrix/client/v1/appservice/{appserviceId}/ping {"transaction_id": "meow"}
|
||||
HS ---> AS : /_matrix/app/v1/ping {"transaction_id": "meow"}
|
||||
HS <--- AS : 403 Forbidden {"errcode": "M_FORBIDDEN"}
|
||||
|
|
@ -276,7 +276,7 @@ AS <--- HS : 502 Bad Gateway {"errcode": "M_BAD_STATUS", "status": 403, "body":
|
|||
|
||||
**Can't connect to appservice**
|
||||
|
||||
```
|
||||
```nohighlight
|
||||
AS ---> HS : /_matrix/client/v1/appservice/{appserviceId}/ping {"transaction_id": "meow"}
|
||||
HS -/-> AS : /_matrix/app/v1/ping {"transaction_id": "meow"}
|
||||
AS <--- HS : 502 Bad Gateway {"errcode": "M_CONNECTION_FAILED"}
|
||||
|
|
|
|||
|
|
@ -683,7 +683,7 @@ request parameter.
|
|||
A client should first make a request with no `auth` parameter.
|
||||
The homeserver returns an HTTP 401 response, with a JSON body, as follows:
|
||||
|
||||
```
|
||||
```nohighlight
|
||||
HTTP/1.1 401 Unauthorized
|
||||
Content-Type: application/json
|
||||
```
|
||||
|
|
@ -729,7 +729,7 @@ given. It also contains other keys dependent on the auth type being
|
|||
attempted. For example, if the client is attempting to complete auth
|
||||
type `example.type.foo`, it might submit something like this:
|
||||
|
||||
```
|
||||
```nohighlight
|
||||
POST /_matrix/client/v3/endpoint HTTP/1.1
|
||||
Content-Type: application/json
|
||||
```
|
||||
|
|
@ -752,7 +752,7 @@ along with the same object as when no authentication was attempted, with
|
|||
the addition of the `completed` key which is an array of auth types the
|
||||
client has completed successfully:
|
||||
|
||||
```
|
||||
```nohighlight
|
||||
HTTP/1.1 401 Unauthorized
|
||||
Content-Type: application/json
|
||||
```
|
||||
|
|
@ -786,7 +786,7 @@ but the client may make a second attempt, it returns the same HTTP
|
|||
status 401 response as above, with the addition of the standard
|
||||
`errcode` and `error` fields describing the error. For example:
|
||||
|
||||
```
|
||||
```nohighlight
|
||||
HTTP/1.1 401 Unauthorized
|
||||
Content-Type: application/json
|
||||
```
|
||||
|
|
@ -816,7 +816,7 @@ Content-Type: application/json
|
|||
If the request fails for a reason other than authentication, the server
|
||||
returns an error message in the standard format. For example:
|
||||
|
||||
```
|
||||
```nohighlight
|
||||
HTTP/1.1 400 Bad request
|
||||
Content-Type: application/json
|
||||
```
|
||||
|
|
@ -855,7 +855,7 @@ must still give a 401 response to requests with no auth data.
|
|||
At a high level, the requests made for an API call completing an auth
|
||||
flow with three stages will resemble the following diagram:
|
||||
|
||||
```
|
||||
```nohighlight
|
||||
_______________________
|
||||
| Stage 0 |
|
||||
| No auth |
|
||||
|
|
@ -913,7 +913,7 @@ This specification defines the following auth types:
|
|||
To use this authentication type, clients should submit an auth dict as
|
||||
follows:
|
||||
|
||||
```
|
||||
```nohighlight
|
||||
{
|
||||
"type": "m.login.password",
|
||||
"identifier": {
|
||||
|
|
@ -1163,7 +1163,7 @@ user during registration, if applicable.
|
|||
|
||||
1. A client might submit a registration request as follows:
|
||||
|
||||
```
|
||||
```nohighlight
|
||||
POST /_matrix/client/v3/register
|
||||
```
|
||||
```json
|
||||
|
|
@ -1176,7 +1176,7 @@ user during registration, if applicable.
|
|||
2. The server requires the user to accept some terms of service before
|
||||
registration, so returns the following response:
|
||||
|
||||
```
|
||||
```nohighlight
|
||||
HTTP/1.1 401 Unauthorized
|
||||
Content-Type: application/json
|
||||
```
|
||||
|
|
@ -1211,7 +1211,7 @@ user during registration, if applicable.
|
|||
|
||||
4. The client repeats the registration request, confirming that the user has
|
||||
accepted the documents:
|
||||
```
|
||||
```nohighlight
|
||||
POST /_matrix/client/v3/register
|
||||
```
|
||||
```json
|
||||
|
|
@ -1226,7 +1226,7 @@ user during registration, if applicable.
|
|||
```
|
||||
|
||||
5. All authentication steps have now completed, so the request is successful:
|
||||
```
|
||||
```nohighlight
|
||||
HTTP/1.1 200 OK
|
||||
Content-Type: application/json
|
||||
```
|
||||
|
|
@ -1647,7 +1647,7 @@ This authorization request URL must be opened in the user's browser:
|
|||
|
||||
Sample authorization request, with extra whitespaces for readability:
|
||||
|
||||
```
|
||||
```nohighlight
|
||||
https://account.example.com/oauth2/auth?
|
||||
client_id = s6BhdRkqt3 &
|
||||
response_type = code &
|
||||
|
|
@ -1680,7 +1680,7 @@ used in the authorization request.
|
|||
|
||||
A successful authorization will have a `code` value, for example:
|
||||
|
||||
```
|
||||
```nohighlight
|
||||
https://app.example.com/oauth2-callback#state=ewubooN9weezeewah9fol4oothohroh3&code=iuB7Eiz9heengah1joh2ioy9ahChuP6R
|
||||
```
|
||||
|
||||
|
|
@ -1692,7 +1692,7 @@ A failed authorization will have the following values:
|
|||
|
||||
For example:
|
||||
|
||||
```
|
||||
```nohighlight
|
||||
https://app.example.com/oauth2-callback#state=ewubooN9weezeewah9fol4oothohroh3&error=access_denied&error_description=The+resource+owner+or+authorization+server+denied+the+request.&error_uri=https%3A%2F%2Ferrors.example.com%2F
|
||||
```
|
||||
|
||||
|
|
@ -1717,7 +1717,7 @@ type, the expiration time, and the refresh token.
|
|||
|
||||
Sample token request:
|
||||
|
||||
```
|
||||
```nohighlight
|
||||
POST /oauth2/token HTTP/1.1
|
||||
Host: account.example.com
|
||||
Content-Type: application/x-www-form-urlencoded
|
||||
|
|
@ -2040,7 +2040,7 @@ When generating a new `device_id`, the client SHOULD generate a random string
|
|||
with enough entropy. It SHOULD only use characters from the unreserved character
|
||||
list defined by [RFC 3986 section 2.3](https://datatracker.ietf.org/doc/html/rfc3986#section-2.3):
|
||||
|
||||
```
|
||||
```nohighlight
|
||||
unreserved = a-z / A-Z / 0-9 / "-" / "." / "_" / "~"
|
||||
```
|
||||
|
||||
|
|
@ -2053,7 +2053,7 @@ In any case it MUST only use characters allowed by the OAuth 2.0 scope
|
|||
definition in [RFC 6749 section 3.3](https://datatracker.ietf.org/doc/html/rfc6749#section-3.3),
|
||||
which is defined as the following ASCII ranges:
|
||||
|
||||
```
|
||||
```nohighlight
|
||||
%x21 / %x23-5B / %x5D-7E
|
||||
```
|
||||
|
||||
|
|
@ -2195,7 +2195,7 @@ The body of the request includes the following parameters, encoded as
|
|||
|
||||
For example, revoking using the access token:
|
||||
|
||||
```
|
||||
```nohighlight
|
||||
POST /oauth2/revoke HTTP/1.1
|
||||
Host: auth.example.com
|
||||
Content-Type: application/x-www-form-urlencoded
|
||||
|
|
@ -2240,7 +2240,7 @@ set to `true` on all but the following Client-Server APIs:
|
|||
Servers MAY additionally include details of why the lock was applied in
|
||||
the `error` field.
|
||||
|
||||
```
|
||||
```nohighlight
|
||||
HTTP/1.1 401 Unauthorized
|
||||
Content-Type: application/json
|
||||
```
|
||||
|
|
@ -2320,7 +2320,7 @@ When a client attempts to perform an action while suspended, the server MUST
|
|||
respond with a `403 Forbidden` error response with `M_USER_SUSPENDED` as the
|
||||
error code, as shown below:
|
||||
|
||||
```
|
||||
```nohighlight
|
||||
HTTP/1.1 403 Forbidden
|
||||
Content-Type: application/json
|
||||
```
|
||||
|
|
@ -2928,7 +2928,7 @@ For example, a `/sync` request might return a range of four events
|
|||
`E2`, `E3`, `E4` and `E5` within a given room, omitting two prior events
|
||||
`E0` and `E1`. This can be visualised as follows:
|
||||
|
||||
```
|
||||
```nohighlight
|
||||
[E0]->[E1]->[E2]->[E3]->[E4]->[E5]
|
||||
^ ^
|
||||
| |
|
||||
|
|
@ -2946,7 +2946,7 @@ deprecated `/events` API) support long-polling in this way.
|
|||
Continuing the example above, an incremental sync might report
|
||||
a single new event `E6`. The response can be visualised as:
|
||||
|
||||
```
|
||||
```nohighlight
|
||||
[E0]->[E1]->[E2]->[E3]->[E4]->[E5]->[E6]
|
||||
^ ^
|
||||
| |
|
||||
|
|
@ -2970,7 +2970,7 @@ the `since` parameter. The server knows about four new events, `E7`, `E8`,
|
|||
the server sends a `limited` response containing `E8`, `E9` and `E10`but
|
||||
omitting `E7`. This forms a gap, which we can see in the visualisation:
|
||||
|
||||
```
|
||||
```nohighlight
|
||||
| gap |
|
||||
| <-> |
|
||||
[E0]->[E1]->[E2]->[E3]->[E4]->[E5]->[E6]->[E7]->[E8]->[E9]->[E10]
|
||||
|
|
@ -3065,29 +3065,29 @@ to another.
|
|||
|
||||
Valid requests look like:
|
||||
|
||||
```
|
||||
```nohighlight
|
||||
PUT /rooms/!roomid:domain/state/m.example.event
|
||||
{ "key" : "without a state key" }
|
||||
```
|
||||
```
|
||||
```nohighlight
|
||||
PUT /rooms/!roomid:domain/state/m.another.example.event/foo
|
||||
{ "key" : "with 'foo' as the state key" }
|
||||
```
|
||||
|
||||
In contrast, these requests are invalid:
|
||||
|
||||
```
|
||||
```nohighlight
|
||||
POST /rooms/!roomid:domain/state/m.example.event/
|
||||
{ "key" : "cannot use POST here" }
|
||||
```
|
||||
```
|
||||
```nohighlight
|
||||
PUT /rooms/!roomid:domain/state/m.another.example.event/foo/11
|
||||
{ "key" : "txnIds are not supported" }
|
||||
```
|
||||
|
||||
Care should be taken to avoid setting the wrong `state key`:
|
||||
|
||||
```
|
||||
```nohighlight
|
||||
PUT /rooms/!roomid:domain/state/m.another.example.event/11
|
||||
{ "key" : "with '11' as the state key, but was probably intended to be a txnId" }
|
||||
```
|
||||
|
|
@ -3095,7 +3095,7 @@ PUT /rooms/!roomid:domain/state/m.another.example.event/11
|
|||
The `state_key` is often used to store state about individual users, by
|
||||
using the user ID as the `state_key` value. For example:
|
||||
|
||||
```
|
||||
```nohighlight
|
||||
PUT /rooms/!roomid:domain/state/m.favorite.animal.event/%40my_user%3Aexample.org
|
||||
{ "animal" : "cat", "reason": "fluffy" }
|
||||
```
|
||||
|
|
@ -3103,7 +3103,7 @@ PUT /rooms/!roomid:domain/state/m.favorite.animal.event/%40my_user%3Aexample.org
|
|||
In some cases, there may be no need for a `state_key`, so it can be
|
||||
omitted:
|
||||
|
||||
```
|
||||
```nohighlight
|
||||
PUT /rooms/!roomid:domain/state/m.room.bgd.color
|
||||
{ "color": "red", "hex": "#ff0000" }
|
||||
```
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@ specification.
|
|||
Content locations are represented as Matrix Content (`mxc://`) URIs. They
|
||||
look like:
|
||||
|
||||
```
|
||||
```nohighlight
|
||||
mxc://<server-name>/<media-id>
|
||||
|
||||
<server-name> : The name of the homeserver where this content originated, e.g. matrix.org
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@ exchange fingerprints between users to build a web of trust.
|
|||
device. This may include long-term identity keys, and/or one-time
|
||||
keys.
|
||||
|
||||
```
|
||||
```nohighlight
|
||||
+----------+ +--------------+
|
||||
| Bob's HS | | Bob's Device |
|
||||
+----------+ +--------------+
|
||||
|
|
@ -29,7 +29,7 @@ keys.
|
|||
|
||||
2) Alice requests Bob's public identity keys and supported algorithms.
|
||||
|
||||
```
|
||||
```nohighlight
|
||||
+----------------+ +------------+ +----------+
|
||||
| Alice's Device | | Alice's HS | | Bob's HS |
|
||||
+----------------+ +------------+ +----------+
|
||||
|
|
@ -40,7 +40,7 @@ keys.
|
|||
|
||||
3) Alice selects an algorithm and claims any one-time keys needed.
|
||||
|
||||
```
|
||||
```nohighlight
|
||||
+----------------+ +------------+ +----------+
|
||||
| Alice's Device | | Alice's HS | | Bob's HS |
|
||||
+----------------+ +------------+ +----------+
|
||||
|
|
@ -491,7 +491,7 @@ this example, Bob's device sends the `m.key.verification.start`, Alice's device
|
|||
could also send that message. As well, the order of the
|
||||
`m.key.verification.done` messages could be reversed.
|
||||
|
||||
```
|
||||
```nohighlight
|
||||
+---------------+ +---------------+ +-------------+ +-------------+
|
||||
| AliceDevice1 | | AliceDevice2 | | BobDevice1 | | BobDevice2 |
|
||||
+---------------+ +---------------+ +-------------+ +-------------+
|
||||
|
|
@ -695,7 +695,7 @@ The process between Alice and Bob verifying each other would be:
|
|||
The wire protocol looks like the following between Alice and Bob's
|
||||
devices:
|
||||
|
||||
```
|
||||
```nohighlight
|
||||
+-------------+ +-----------+
|
||||
| AliceDevice | | BobDevice |
|
||||
+-------------+ +-----------+
|
||||
|
|
@ -969,7 +969,7 @@ she can trust Bob's device if:
|
|||
|
||||
The following diagram illustrates how keys are signed:
|
||||
|
||||
```
|
||||
```nohighlight
|
||||
+------------------+ .................. +----------------+
|
||||
| +--------------+ | .................. : | +------------+ |
|
||||
| | v v v : : v v v | |
|
||||
|
|
@ -1000,7 +1000,7 @@ the user who created them.
|
|||
The following diagram illustrates Alice's view, hiding the keys and
|
||||
signatures that she cannot see:
|
||||
|
||||
```
|
||||
```nohighlight
|
||||
+------------------+ +----------------+ +----------------+
|
||||
| +--------------+ | | | | +------------+ |
|
||||
| | v v | v v v | |
|
||||
|
|
@ -1218,7 +1218,7 @@ The binary segment MUST be of the following form:
|
|||
|
||||
For example, if Alice displays a QR code encoding the following binary data:
|
||||
|
||||
```
|
||||
```nohighlight
|
||||
"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
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
|
||||
### Push Notifications
|
||||
|
||||
```
|
||||
```nohighlight
|
||||
+--------------------+ +-------------------+
|
||||
Matrix HTTP | | | |
|
||||
Notification Protocol | App Developer | | Device Vendor |
|
||||
|
|
|
|||
|
|
@ -214,7 +214,7 @@ before delivering them to clients.
|
|||
Some receipts are sent across federation as EDUs with type `m.receipt`. The
|
||||
format of the EDUs are:
|
||||
|
||||
```
|
||||
```nohighlight
|
||||
{
|
||||
<room_id>: {
|
||||
<receipt_type>: {
|
||||
|
|
|
|||
|
|
@ -157,7 +157,7 @@ Some secret is encrypted using keys with ID `key_id_1` and `key_id_2`:
|
|||
|
||||
`org.example.some.secret`:
|
||||
|
||||
```
|
||||
```nohighlight
|
||||
{
|
||||
"encrypted": {
|
||||
"key_id_1": {
|
||||
|
|
@ -177,7 +177,7 @@ and the key descriptions for the keys would be:
|
|||
|
||||
`m.secret_storage.key.key_id_1`:
|
||||
|
||||
```
|
||||
```nohighlight
|
||||
{
|
||||
"name": "Some key",
|
||||
"algorithm": "m.secret_storage.v1.aes-hmac-sha2",
|
||||
|
|
@ -187,7 +187,7 @@ and the key descriptions for the keys would be:
|
|||
|
||||
`m.secret_storage.key.key_id_2`:
|
||||
|
||||
```
|
||||
```nohighlight
|
||||
{
|
||||
"name": "Some other key",
|
||||
"algorithm": "m.secret_storage.v1.aes-hmac-sha2",
|
||||
|
|
@ -199,7 +199,7 @@ If `key_id_1` is the default key, then we also have:
|
|||
|
||||
`m.secret_storage.default_key`:
|
||||
|
||||
```
|
||||
```nohighlight
|
||||
{
|
||||
"key": "key_id_1"
|
||||
}
|
||||
|
|
@ -294,7 +294,7 @@ in the `iterations` parameter.
|
|||
|
||||
Example:
|
||||
|
||||
```
|
||||
```nohighlight
|
||||
{
|
||||
"passphrase": {
|
||||
"algorithm": "m.pbkdf2",
|
||||
|
|
|
|||
|
|
@ -58,7 +58,7 @@ parent to the room. The `state_key` for the event is the child room's ID.
|
|||
|
||||
For example, to achieve the following:
|
||||
|
||||
```
|
||||
```nohighlight
|
||||
#space:example.org
|
||||
#general:example.org (!abcdefg:example.org)
|
||||
!private:example.org
|
||||
|
|
|
|||
|
|
@ -67,7 +67,7 @@ opening an embedded web view.
|
|||
|
||||
These steps are illustrated as follows:
|
||||
|
||||
```
|
||||
```nohighlight
|
||||
Matrix Client Matrix Homeserver Auth Server
|
||||
| | |
|
||||
|-------------(0) GET /login----------->| |
|
||||
|
|
|
|||
|
|
@ -44,7 +44,7 @@ If the lookup yields a result for a Matrix User ID then the normal [invite
|
|||
process](/server-server-api/#inviting-to-a-room) can be initiated. This process
|
||||
ends up looking like this:
|
||||
|
||||
```
|
||||
```nohighlight
|
||||
+---------+ +-------------+ +-----------------+
|
||||
| Client | | Homeserver | | IdentityServer |
|
||||
+---------+ +-------------+ +-----------------+
|
||||
|
|
@ -74,7 +74,7 @@ the invite on the identity server with a call to
|
|||
and emit a valid [`m.room.third_party_invite`](#mroomthird_party_invite) event
|
||||
to the room. This process ends up looking like this:
|
||||
|
||||
```
|
||||
```nohighlight
|
||||
+---------+ +-------------+ +-----------------+
|
||||
| Client | | Homeserver | | IdentityServer |
|
||||
+---------+ +-------------+ +-----------------+
|
||||
|
|
@ -133,7 +133,7 @@ and an identity server IS, the full sequence for a third-party invite
|
|||
would look like the following. This diagram assumes H1 and H2 are
|
||||
residents of the room while H3 is attempting to join.
|
||||
|
||||
```
|
||||
```nohighlight
|
||||
+-------+ +-----------------+ +-----+ +-----+ +-----+ +-----+
|
||||
| UserA | | ThirdPartyUser | | H1 | | H2 | | H3 | | IS |
|
||||
+-------+ +-----------------+ +-----+ +-----+ +-----+ +-----+
|
||||
|
|
|
|||
|
|
@ -129,7 +129,7 @@ or not there have been any changes to the Matrix spec.
|
|||
|
||||
A call is set up with message events exchanged as follows:
|
||||
|
||||
```
|
||||
```nohighlight
|
||||
Caller Callee
|
||||
[Place Call]
|
||||
m.call.invite ----------->
|
||||
|
|
@ -144,7 +144,7 @@ A call is set up with message events exchanged as follows:
|
|||
|
||||
Or a rejected call:
|
||||
|
||||
```
|
||||
```nohighlight
|
||||
Caller Callee
|
||||
m.call.invite ------------>
|
||||
m.call.candidate --------->
|
||||
|
|
|
|||
|
|
@ -39,16 +39,15 @@ bit chain key, \(C_{0,0}\), are derived from the shared secret using an
|
|||
HMAC-based Key Derivation Function using [SHA-256][] as the hash function
|
||||
([HKDF-SHA-256][]) with default salt and ``"OLM_ROOT"`` as the info.
|
||||
|
||||
```math
|
||||
\[
|
||||
\begin{aligned}
|
||||
S&=\operatorname{ECDH}\left(I_A,E_B\right)\;\parallel\;
|
||||
\operatorname{ECDH}\left(E_A,I_B\right)\;\parallel\;
|
||||
\operatorname{ECDH}\left(E_A,E_B\right)\\
|
||||
|
||||
R_0\;\parallel\;C_{0,0}&=
|
||||
\operatorname{HKDF}\left(0,S,\text{``OLM\_ROOT"},64\right)
|
||||
\end{aligned}
|
||||
```
|
||||
\]
|
||||
|
||||
#### Advancing the root key
|
||||
|
||||
|
|
@ -61,7 +60,7 @@ chain key, \(C_{i,0}\), are derived from the shared secret using
|
|||
[HKDF-SHA-256][] using \(R_{i-1}\) as the salt and ``"OLM_RATCHET"`` as the
|
||||
info.
|
||||
|
||||
```math
|
||||
\[
|
||||
\begin{aligned}
|
||||
R_i\;\parallel\;C_{i,0}&=
|
||||
\operatorname{HKDF}\left(
|
||||
|
|
@ -71,7 +70,7 @@ info.
|
|||
64
|
||||
\right)
|
||||
\end{aligned}
|
||||
```
|
||||
\]
|
||||
|
||||
#### Advancing the chain key
|
||||
|
||||
|
|
@ -79,11 +78,11 @@ Advancing a chain key takes the previous chain key, \(C_{i,j-1}\). The next
|
|||
chain key, \(C_{i,j}\), is the [HMAC-SHA-256][] of ``"\x02"`` using the
|
||||
previous chain key as the key.
|
||||
|
||||
```math
|
||||
\[
|
||||
\begin{aligned}
|
||||
C_{i,j}&=\operatorname{HMAC}\left(C_{i,j-1},\text{``\char`\\x02"}\right)
|
||||
\end{aligned}
|
||||
```
|
||||
\]
|
||||
|
||||
#### Creating a message key
|
||||
|
||||
|
|
@ -93,11 +92,11 @@ current chain key as the key. The message keys where \(i\) is even are used
|
|||
by Alice to encrypt messages. The message keys where \(i\) is odd are used
|
||||
by Bob to encrypt messages.
|
||||
|
||||
```math
|
||||
\[
|
||||
\begin{aligned}
|
||||
M_{i,j}&=\operatorname{HMAC}\left(C_{i,j},\text{``\char`\\x01"}\right)
|
||||
\end{aligned}
|
||||
```
|
||||
\]
|
||||
|
||||
### The Olm Protocol
|
||||
|
||||
|
|
@ -206,7 +205,7 @@ a means for recipients to distinguish between them.
|
|||
Olm messages start with a one byte version followed by a variable length
|
||||
payload followed by a fixed length message authentication code.
|
||||
|
||||
```text
|
||||
```nohighlight
|
||||
+--------------+------------------------------------+-----------+
|
||||
| Version Byte | Payload Bytes | MAC Bytes |
|
||||
+--------------+------------------------------------+-----------+
|
||||
|
|
@ -242,7 +241,7 @@ MAC protects all of the bytes preceding the MAC.
|
|||
Olm pre-key messages start with a one byte version followed by a variable
|
||||
length payload.
|
||||
|
||||
```text
|
||||
```nohighlight
|
||||
+--------------+------------------------------------+
|
||||
| Version Byte | Payload Bytes |
|
||||
+--------------+------------------------------------+
|
||||
|
|
@ -269,12 +268,12 @@ encryption and [HMAC-SHA-256][] (truncated to 64 bits) for authentication. The
|
|||
message key using [HKDF-SHA-256][] using the default salt and an info of
|
||||
``"OLM_KEYS"``.
|
||||
|
||||
```math
|
||||
\[
|
||||
\begin{aligned}
|
||||
AES\_KEY_{i,j}\;\parallel\;HMAC\_KEY_{i,j}\;\parallel\;AES\_IV_{i,j}
|
||||
&= \operatorname{HKDF}\left(0,M_{i,j},\text{``OLM\_KEYS"},80\right)
|
||||
\end{aligned}
|
||||
```
|
||||
\]
|
||||
|
||||
The plain-text is encrypted with AES-256, using the key \(AES\_KEY_{i,j}\)
|
||||
and the IV \(AES\_IV_{i,j}\) to give the cipher-text, \(X_{i,j}\).
|
||||
|
|
@ -375,7 +374,7 @@ in use (256 bits for this version of Megolm).
|
|||
The ratchet is initialised with cryptographically-secure random data, and
|
||||
advanced as follows:
|
||||
|
||||
```math
|
||||
\[
|
||||
\begin{aligned}
|
||||
R_{i,0} &=
|
||||
\begin{cases}
|
||||
|
|
@ -403,7 +402,7 @@ R_{i,3} &=
|
|||
H_3\left(R_{i-1,3}\right) &\text{otherwise}
|
||||
\end{cases}
|
||||
\end{aligned}
|
||||
```
|
||||
\]
|
||||
|
||||
where \(H_0\), \(H_1\), \(H_2\), and \(H_3\) are different hash
|
||||
functions. In summary: every \(2^8\) iterations, \(R_{i,3}\) is
|
||||
|
|
@ -461,12 +460,12 @@ This version of Megolm uses [AES-256][] in [CBC][] mode with [PKCS#7][] padding
|
|||
[HMAC-SHA-256][] (truncated to 64 bits). The 256 bit AES key, 256 bit HMAC key,
|
||||
and 128 bit AES IV are derived from the megolm ratchet \(R_i\):
|
||||
|
||||
```math
|
||||
\[
|
||||
\begin{aligned}
|
||||
\mathit{AES\_KEY}_{i}\;\parallel\;\mathit{HMAC\_KEY}_{i}\;\parallel\;\mathit{AES\_IV}_{i}
|
||||
&= \operatorname{HKDF}\left(0,\,R_{i},\text{"MEGOLM\_KEYS"},\,80\right) \\
|
||||
\end{aligned}
|
||||
```
|
||||
\]
|
||||
|
||||
where \(\parallel\) represents string splitting, and
|
||||
\(\operatorname{HKDF}\left(\mathit{salt},\,\mathit{IKM},\,\mathit{info},\,L\right)\)
|
||||
|
|
@ -497,14 +496,14 @@ received the session data.
|
|||
After each message is encrypted, the ratchet is advanced. This is done as
|
||||
described in [The Megolm ratchet algorithm](#the-megolm-ratchet-algorithm), using the following definitions:
|
||||
|
||||
```math
|
||||
\[
|
||||
\begin{aligned}
|
||||
H_0(A) &\equiv \operatorname{HMAC}(A,\text{``\char`\\x00"}) \\
|
||||
H_1(A) &\equiv \operatorname{HMAC}(A,\text{``\char`\\x01"}) \\
|
||||
H_2(A) &\equiv \operatorname{HMAC}(A,\text{``\char`\\x02"}) \\
|
||||
H_3(A) &\equiv \operatorname{HMAC}(A,\text{``\char`\\x03"}) \\
|
||||
\end{aligned}
|
||||
```
|
||||
\]
|
||||
|
||||
where \(\operatorname{HMAC}(A, T)\) is the HMAC-SHA-256 of ``T``, using ``A`` as the
|
||||
key.
|
||||
|
|
@ -528,7 +527,7 @@ session.
|
|||
|
||||
The session sharing format is as follows:
|
||||
|
||||
```text
|
||||
```nohighlight
|
||||
+---+----+--------+--------+--------+--------+------+-----------+
|
||||
| V | i | R(i,0) | R(i,1) | R(i,2) | R(i,3) | Kpub | Signature |
|
||||
+---+----+--------+--------+--------+--------+------+-----------+
|
||||
|
|
@ -558,7 +557,7 @@ format](#session-sharing-format) except for dropping the signature.
|
|||
|
||||
The Megolm session export format is thus as follows:
|
||||
|
||||
```text
|
||||
```nohighlight
|
||||
+---+----+--------+--------+--------+--------+------+
|
||||
| V | i | R(i,0) | R(i,1) | R(i,2) | R(i,3) | Kpub |
|
||||
+---+----+--------+--------+--------+--------+------+
|
||||
|
|
@ -577,7 +576,7 @@ Megolm messages consist of a one byte version, followed by a variable length
|
|||
payload, a fixed length message authentication code, and a fixed length
|
||||
signature.
|
||||
|
||||
```text
|
||||
```nohighlight
|
||||
+---+------------------------------------+-----------+------------------+
|
||||
| V | Payload Bytes | MAC Bytes | Signature Bytes |
|
||||
+---+------------------------------------+-----------+------------------+
|
||||
|
|
|
|||
|
|
@ -281,7 +281,7 @@ corresponding labels for each stage on the
|
|||
[matrix-spec-proposals](https://github.com/matrix-org/matrix-spec-proposals)
|
||||
pull request trackers.
|
||||
|
||||
```
|
||||
```nohighlight
|
||||
+ +
|
||||
Proposals | Spec PRs | Additional States
|
||||
+-------+ | +------+ | +---------------+
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@ A client's homeserver forwards information about received events to the
|
|||
push gateway. The gateway then submits a push notification to the push
|
||||
notification provider (e.g. APNS, GCM).
|
||||
|
||||
```
|
||||
```nohighlight
|
||||
+--------------------+ +-------------------+
|
||||
Matrix HTTP | | | |
|
||||
Notification Protocol | App Developer | | Device Vendor |
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@ refined in [room version 9](/rooms/v9)).
|
|||
|
||||
Clients should render the new join rule accordingly for such rooms. For example:
|
||||
|
||||
```
|
||||
```nohighlight
|
||||
This room is:
|
||||
[ ] Public
|
||||
[x] Private
|
||||
|
|
|
|||
|
|
@ -289,7 +289,7 @@ and any query parameters if present, but should not include the leading
|
|||
|
||||
Step 1 sign JSON:
|
||||
|
||||
```
|
||||
```nohighlight
|
||||
{
|
||||
"method": "POST",
|
||||
"uri": "/target",
|
||||
|
|
@ -822,7 +822,7 @@ ResidentServer->JoiningServer: send_join response
|
|||
JoiningServer->Client: join response
|
||||
-->
|
||||
|
||||
```
|
||||
```nohighlight
|
||||
+---------+ +---------------+ +-----------------+ +-----------------+
|
||||
| Client | | JoiningServer | | DirectoryServer | | ResidentServer |
|
||||
+---------+ +---------------+ +-----------------+ +-----------------+
|
||||
|
|
|
|||
|
|
@ -13,7 +13,8 @@
|
|||
<head>
|
||||
{{ partial "head.html" . }}
|
||||
{{ if .Page.Store.Get "hasMath" }}
|
||||
<link href="https://cdn.jsdelivr.net/npm/katex@0.16.23/dist/katex.min.css" rel="stylesheet">
|
||||
<link href="/css/katex.min.css" rel="preload" as="style">
|
||||
<link href="/css/katex.min.css" rel="stylesheet">
|
||||
{{ end }}
|
||||
</head>
|
||||
<body class="td-{{ .Kind }}{{ with .Page.Params.body_class }} {{ . }}{{ end }}">
|
||||
|
|
|
|||
BIN
static/css/fonts/KaTeX_AMS-Regular.woff2
Normal file
BIN
static/css/fonts/KaTeX_AMS-Regular.woff2
Normal file
Binary file not shown.
BIN
static/css/fonts/KaTeX_Caligraphic-Bold.woff2
Normal file
BIN
static/css/fonts/KaTeX_Caligraphic-Bold.woff2
Normal file
Binary file not shown.
BIN
static/css/fonts/KaTeX_Caligraphic-Regular.woff2
Normal file
BIN
static/css/fonts/KaTeX_Caligraphic-Regular.woff2
Normal file
Binary file not shown.
BIN
static/css/fonts/KaTeX_Fraktur-Bold.woff2
Normal file
BIN
static/css/fonts/KaTeX_Fraktur-Bold.woff2
Normal file
Binary file not shown.
BIN
static/css/fonts/KaTeX_Fraktur-Regular.woff2
Normal file
BIN
static/css/fonts/KaTeX_Fraktur-Regular.woff2
Normal file
Binary file not shown.
BIN
static/css/fonts/KaTeX_Main-Bold.woff2
Normal file
BIN
static/css/fonts/KaTeX_Main-Bold.woff2
Normal file
Binary file not shown.
BIN
static/css/fonts/KaTeX_Main-BoldItalic.woff2
Normal file
BIN
static/css/fonts/KaTeX_Main-BoldItalic.woff2
Normal file
Binary file not shown.
BIN
static/css/fonts/KaTeX_Main-Italic.woff2
Normal file
BIN
static/css/fonts/KaTeX_Main-Italic.woff2
Normal file
Binary file not shown.
BIN
static/css/fonts/KaTeX_Main-Regular.woff2
Normal file
BIN
static/css/fonts/KaTeX_Main-Regular.woff2
Normal file
Binary file not shown.
BIN
static/css/fonts/KaTeX_Math-BoldItalic.woff2
Normal file
BIN
static/css/fonts/KaTeX_Math-BoldItalic.woff2
Normal file
Binary file not shown.
BIN
static/css/fonts/KaTeX_Math-Italic.woff2
Normal file
BIN
static/css/fonts/KaTeX_Math-Italic.woff2
Normal file
Binary file not shown.
BIN
static/css/fonts/KaTeX_SansSerif-Bold.woff2
Normal file
BIN
static/css/fonts/KaTeX_SansSerif-Bold.woff2
Normal file
Binary file not shown.
BIN
static/css/fonts/KaTeX_SansSerif-Italic.woff2
Normal file
BIN
static/css/fonts/KaTeX_SansSerif-Italic.woff2
Normal file
Binary file not shown.
BIN
static/css/fonts/KaTeX_SansSerif-Regular.woff2
Normal file
BIN
static/css/fonts/KaTeX_SansSerif-Regular.woff2
Normal file
Binary file not shown.
BIN
static/css/fonts/KaTeX_Script-Regular.woff2
Normal file
BIN
static/css/fonts/KaTeX_Script-Regular.woff2
Normal file
Binary file not shown.
BIN
static/css/fonts/KaTeX_Size1-Regular.woff2
Normal file
BIN
static/css/fonts/KaTeX_Size1-Regular.woff2
Normal file
Binary file not shown.
BIN
static/css/fonts/KaTeX_Size2-Regular.woff2
Normal file
BIN
static/css/fonts/KaTeX_Size2-Regular.woff2
Normal file
Binary file not shown.
BIN
static/css/fonts/KaTeX_Size3-Regular.woff2
Normal file
BIN
static/css/fonts/KaTeX_Size3-Regular.woff2
Normal file
Binary file not shown.
BIN
static/css/fonts/KaTeX_Size4-Regular.woff2
Normal file
BIN
static/css/fonts/KaTeX_Size4-Regular.woff2
Normal file
Binary file not shown.
BIN
static/css/fonts/KaTeX_Typewriter-Regular.woff2
Normal file
BIN
static/css/fonts/KaTeX_Typewriter-Regular.woff2
Normal file
Binary file not shown.
1
static/css/katex.min.css
vendored
Normal file
1
static/css/katex.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
Loading…
Reference in a new issue