2.6 KiB
Magic Wormhole Invites
Magic Wormhole
magic wormhole is a server and a client which together use Password Authenticated Key Exchange (PAKE) to use a short code to establish a secure channel between two computers. These codes are one-time use and an attacker gets at most one "guess", thus allowing low-entropy codes to be used.
Invites and Joins
Inside Tahoe-LAFS we are using a channel created using magic wormhole to exchange configuration and the secret fURL of the Introducer with new clients.
This is a two-part process. Alice runs a grid and wishes to have her
friend Bob use it as a client. She runs tahoe invite bob
which will print out a short "wormhole code" like
2-unicorn-quiver
. You may also include some options for
total, happy and needed shares if you like.
Alice then transmits this one-time secret code to Bob. Alice must keep her command running until Bob has done his step as it is waiting until a secure channel is established before sending the data.
Bob then runs
tahoe create-client --join <secret code>
with any
other options he likes. This will "use up" the code establishing a
secure session with Alice's computer. If an attacker tries to guess the
code, they get only once chance to do so (and then Bob's side will
fail). Once Bob's computer has connected to Alice's computer, the two
computers performs the protocol described below, resulting in some JSON
with the Introducer fURL, nickname and any other options being sent to
Bob's computer. The tahoe create-client
command then uses
these options to set up Bob's client.
Tahoe-LAFS Secret Exchange
The protocol that the Alice (the one doing the invite) and Bob (the one being invited) sides perform once a magic wormhole secure channel has been established goes as follows:
Alice and Bob both immediately send an "abilities" message as JSON.
For Alice this is {"abilities": {"server-v1": {}}}
. For
Bob, this is {"abilities": {"client-v1": {}}}
.
After receiving the message from the other side and confirming the expected protocol, Alice transmits the configuration JSON:
{
"needed": 3,
"total": 10,
"happy": 7,
"nickname": "bob",
"introducer": "pb://xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx@example.com:41505/yyyyyyyyyyyyyyyyyyyyyyy"
}
Both sides then disconnect.
As you can see, there is room for future revisions of the protocol but as of yet none have been sketched out.