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

multistream-select 1.0: simultaneous open protocol extension #196

Merged
merged 15 commits into from
May 11, 2021
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 27 additions & 11 deletions connections/simopen.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,11 +41,15 @@ If both peers believe they are the initiator, then they both send
`iamclient`. If this is the case, they enter an initiator selection
phase, where one of the peers is selected to act as the initiator. In
order to do so, they both generate a random 256-bit integer and send
it as response to the `iamclient` directive. The peer with the highest
integer is selected to act as the initator and sends an `initiator`
message. The peer with the lowest integer responds with `responder`
message and both peers transition to protocol negotiation with a
distinct initiator.
it as response to the `iamclient` directive, prefixed with the
`select:` string. The peer with the highest integer is selected to act
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

how should we encode this int? b64?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

good point, this needs to be encoded! Let's do base64.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated to mandate base64.

as the initator and sends an `initiator` message. The peer with the
lowest integer responds with `responder` message and both peers
transition to protocol negotiation with a distinct initiator.

Note the importance of the prefix in the random integer, as it allows
peers to match the selection token and ignore potentially pipelined
security protocol negotiation messages.

The following schematic illustrates, for the case where A's integer is
higher than B's integer:
Expand All @@ -55,18 +59,30 @@ A ---> B: iamclient
B ---> A: iamclient
A: generate random integer IA
B: generate random integer IB
A ---> B: {IA}
B ---> A: {IB}
A ---> B: select:{IA}
B ---> A: select:{IB}
A ---> B: initiator
B ---> A: responder
```

In the unlikely case where both peers selected the same integer, they
generate a fresh one and enter another round of the protocol.
generate a fresh one and enter another round of the protocol. If
mxinden marked this conversation as resolved.
Show resolved Hide resolved
multiple rounds of the protocol result in the same integers, this is
indicative of a bug and both peers should abort the connection.

## Implementation Considerations

The protocol is simple to implement and is backwards compatible with
vanilla multistream-select. In the common case of a single initiator,
we can ensure that there there is no latency overhead by sending the
`iamclient` message together with the multistream header.
vanilla multistream-select. An important consideration is avoiding RTT
overhead in the common case of a single initiator. In this case, the
initiator pipelines the security protocol negotiation together with the
selection, sending `multistream,iamclient,secproto`. If the receiving
peer is a responder, then it replies with `multistream,na,secproto`,
negotiating the security protocol without any overhead.

If the peer is also a client, then it also sends
`multistream,iamclient,secproto`. On seeing the `iamclient` message,
both peers enter the initiator selection protocol and ignore the
`secproto` in the original packet. They can do so because the random
integer is prefixed with the `select:` string, allowing peers to match
the selection and ignore pipelined protocols.