document client-to-client protocol
This commit is contained in:
parent
9314c6918f
commit
187e14862d
33
docs/client-protocol.md
Normal file
33
docs/client-protocol.md
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
# Client-to-Client Protocol
|
||||||
|
|
||||||
|
Wormhole clients do not talk directly to each other (at least at first): they
|
||||||
|
only connect directly to the Rendezvous Server. They ask this server to
|
||||||
|
convey messages to the other client (via the `add` command and the `message`
|
||||||
|
response). This document explains the format of these client-to-client
|
||||||
|
messages.
|
||||||
|
|
||||||
|
Each such message contains a "phase" string, and a hex-encoded binary "body".
|
||||||
|
|
||||||
|
Any phase which is purely numeric (`^\d+$`) is reserved for application data,
|
||||||
|
and will be delivered in numeric order. All other phases are reserved for the
|
||||||
|
Wormhole client itself. Clients will ignore any phase they do not recognize.
|
||||||
|
|
||||||
|
Immediately upon opening the mailbox, clients send the `pake` phase, which
|
||||||
|
contains the binary SPAKE2 message (the one computed as `X+M*pw` or
|
||||||
|
`Y+N*pw`).
|
||||||
|
|
||||||
|
Upon receiving their peer's `pake` phase, clients compute and remember the
|
||||||
|
shared key. Then they send the encrypted `version` phase, whose plaintext
|
||||||
|
payload is a UTF-8-encoded JSON-encoded dictionary of metadata. This allows
|
||||||
|
the two Wormhole instances to signal their ability to do other things (like
|
||||||
|
"dilate" the wormhole). The version data will also include an `app_versions`
|
||||||
|
key which contains a dictionary of metadata provided by the application,
|
||||||
|
allowing apps to perform similar negotiation.
|
||||||
|
|
||||||
|
Both `version` and all numeric (app-specific) phases are encrypted. The
|
||||||
|
message body will be the hex-encoded output of a NACL SecretBox, keyed by a
|
||||||
|
phase+side -specific key (computed with HKDF-SHA256, using the shared PAKE
|
||||||
|
key as the secret input, and `wormhole:phase:%s%s % (SHA256(side),
|
||||||
|
SHA256(phase))` as the CTXinfo), with a random nonce.
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user