2017-11-12 23:41:11 +00:00
# Welcome
Get things from one computer to another, safely.
This package provides a library and a command-line tool named `wormhole` ,
which makes it possible to get arbitrary-sized files and directories
(or short pieces of text) from one computer to another. The two endpoints are
identified by using identical "wormhole codes": in general, the sending
machine generates and displays the code, which must then be typed into the
receiving machine.
The codes are short and human-pronounceable, using a phonetically-distinct
wordlist. The receiving side offers tab-completion on the codewords, so
usually only a few characters must be typed. Wormhole codes are single-use
and do not need to be memorized.
2021-05-27 08:22:58 +00:00
* PyCon 2016 presentation: [Slides ](https://www.lothar.com/~warner/MagicWormhole-PyCon2016.pdf ), [Video ](https://www.youtube.com/watch?v=oFrTqQw0_3c )
2017-11-12 23:41:11 +00:00
## Example
Sender:
```
% wormhole send README.md
Sending 7924 byte file named 'README.md'
On the other computer, please run: wormhole receive
Wormhole code is: 7-crossover-clockwork
2021-08-25 19:19:52 +00:00
2017-11-12 23:41:11 +00:00
Sending (< -10.0.1.43:58988 ) . .
100%|=========================| 7.92K/7.92K [00:00< 00:00 , 6 . 02MB / s ]
File sent.. waiting for confirmation
Confirmation received. Transfer complete.
```
Receiver:
```
% wormhole receive
Enter receive wormhole code: 7-crossover-clockwork
Receiving file (7924 bytes) into: README.md
ok? (y/n): y
Receiving (->tcp:10.0.1.43:58986)..
100%|===========================| 7.92K/7.92K [00:00< 00:00 , 120KB / s ]
Received file written to README.md
```
## Installation
2019-08-28 17:33:26 +00:00
The easiest way to install magic-wormhole is to use a packaged version from
your operating system. If there is none, or you want to participate in
development, you can install from source.
2017-11-12 23:41:11 +00:00
2019-08-28 17:33:26 +00:00
### MacOS / OS-X
[Install Homebrew ](https://brew.sh/ ), then run `brew install magic-wormhole` .
### Linux (Debian/Ubuntu)
Magic-wormhole is available with `apt` in Debian 9 "stretch", Ubuntu 17.04
"zesty", and later versions:
2017-11-12 23:41:11 +00:00
```
2019-08-28 17:33:26 +00:00
$ sudo apt install magic-wormhole
2017-11-12 23:41:11 +00:00
```
2019-08-28 17:33:26 +00:00
### Linux (Fedora)
2017-11-12 23:41:11 +00:00
```
2019-08-28 17:33:26 +00:00
$ sudo dnf install magic-wormhole
2017-11-12 23:41:11 +00:00
```
2019-09-29 14:48:45 +00:00
### Linux (openSUSE)
```
$ sudo zypper install python-magic-wormhole
```
2019-08-28 17:33:26 +00:00
### Linux (Snap package)
2017-11-12 23:41:11 +00:00
2019-08-28 17:33:26 +00:00
Many linux distributions (including Ubuntu) can install ["Snap"
packages](https://snapcraft.io/). Magic-wormhole is available through a
third-party package (published by the "snapcrafters" group):
2017-11-12 23:41:11 +00:00
2019-08-28 17:33:26 +00:00
```
$ sudo snap install wormhole
```
2017-11-12 23:41:11 +00:00
2022-03-31 15:22:25 +00:00
### Windows
#### Chocolatey
```
$ choco install magic-wormhole
```
The binaries for Windows are provided from this project: https://github.com/aquacash5/magic-wormhole-exe
2019-08-28 17:33:26 +00:00
### Install from Source
2017-11-12 23:41:11 +00:00
2019-08-28 17:33:26 +00:00
Magic-wormhole is a Python package, and can be installed in the usual ways.
The basic idea is to do `pip install magic-wormhole` , however to avoid
modifying the system's python libraries, you probably want to put it into a
"user" environment (putting the ``wormhole`` executable in
``~/.local/bin/wormhole``) like this:
2017-11-12 23:41:11 +00:00
2019-08-28 17:33:26 +00:00
```
pip install --user magic-wormhole
```
2017-11-12 23:41:11 +00:00
2019-08-28 17:33:26 +00:00
or put it into a virtualenv, like this:
2017-11-12 23:41:11 +00:00
2019-08-28 17:33:26 +00:00
```
virtualenv venv
source venv/bin/activate
pip install magic-wormhole
```
2017-11-12 23:41:11 +00:00
2019-08-28 17:33:26 +00:00
You can then run `venv/bin/wormhole` without first activating the virtualenv,
so e.g. you could make a symlink from `~/bin/wormhole` to
`.../path/to/venv/bin/wormhole` , and then plain `wormhole send` will find it
on your `$PATH` .
2017-11-12 23:41:11 +00:00
2019-08-28 17:33:26 +00:00
You probably *don't* want to use ``sudo`` when you run ``pip``. This tends to
create [conflicts ](https://github.com/warner/magic-wormhole/issues/336 ) with
the system python libraries.
2017-11-12 23:41:11 +00:00
2019-08-28 17:33:26 +00:00
On OS X, you may need to pre-install `pip` , and run `$ xcode-select
--install` to get GCC, which is needed to compile the `libsodium`
cryptography library during the installation process.
2017-11-12 23:41:11 +00:00
2019-08-28 17:33:26 +00:00
On Debian/Ubuntu systems, you may need to install some support libraries
first:
2017-11-12 23:41:11 +00:00
2019-08-28 17:33:26 +00:00
`$ sudo apt-get install python-pip build-essential python-dev libffi-dev libssl-dev`
2017-11-12 23:41:11 +00:00
2019-08-28 17:33:26 +00:00
On Linux, if you get errors like `fatal error: sodium.h: No such file or
directory`, either use `SODIUM_INSTALL=bundled pip install magic-wormhole` ,
or try installing the `libsodium-dev` / `libsodium-devel` package. These work
around a bug in pynacl which gets confused when the libsodium runtime is
installed (e.g. `libsodium13` ) but not the development package.
2017-11-12 23:41:11 +00:00
On Windows, python2 may work better than python3. On older systems, `$ pip
install --upgrade pip` may be necessary to get a version that can compile all
the dependencies. Most of the dependencies are published as binary wheels,
but in case your system is unable to find these, it will have to compile
2021-05-27 08:22:58 +00:00
them, for which [Microsoft Visual C++ 9.0 ](https://support.microsoft.com/en-us/topic/the-latest-supported-visual-c-downloads-2647da03-1eea-4433-9aff-95f26a218cc0 ) may be required.
2017-11-12 23:41:11 +00:00
## Motivation
* Moving a file to a friend's machine, when the humans can speak to each
other (directly) but the computers cannot
* Delivering a properly-random password to a new user via the phone
* Supplying an SSH public key for future login use
Copying files onto a USB stick requires physical proximity, and is
uncomfortable for transferring long-term secrets because flash memory is hard
to erase. Copying files with ssh/scp is fine, but requires previous
arrangements and an account on the target machine, and how do you bootstrap
the account? Copying files through email first requires transcribing an email
address in the opposite direction, and is even worse for secrets, because
email is unencrypted. Copying files through encrypted email requires
bootstrapping a GPG key as well as an email address. Copying files through
Dropbox is not secure against the Dropbox server and results in a large URL
that must be transcribed. Using a URL shortener adds an extra step, reveals
the full URL to the shortening service, and leaves a short URL that can be
guessed by outsiders.
Many common use cases start with a human-mediated communication channel, such
as IRC, IM, email, a phone call, or a face-to-face conversation. Some of
these are basically secret, or are "secret enough" to last until the code is
delivered and used. If this does not feel strong enough, users can turn on
additional verification that doesn't depend upon the secrecy of the channel.
The notion of a "magic wormhole" comes from the image of two distant wizards
speaking the same enchanted phrase at the same time, and causing a mystical
connection to pop into existence between them. The wizards then throw books
into the wormhole and they fall out the other side. Transferring files
securely should be that easy.
## Design
The `wormhole` tool uses PAKE "Password-Authenticated Key Exchange", a family
of cryptographic algorithms that uses a short low-entropy password to
establish a strong high-entropy shared key. This key can then be used to
encrypt data. `wormhole` uses the SPAKE2 algorithm, due to Abdalla and
Pointcheval[1].
PAKE effectively trades off interaction against offline attacks. The only way
for a network attacker to learn the shared key is to perform a
man-in-the-middle attack during the initial connection attempt, and to
correctly guess the code being used by both sides. Their chance of doing this
is inversely proportional to the entropy of the wormhole code. The default is
to use a 16-bit code (use --code-length= to change this), so for each use of
the tool, an attacker gets a 1-in-65536 chance of success. As such, users can
expect to see many error messages before the attacker has a reasonable chance
of success.
## Timing
The program does not have any built-in timeouts, however it is expected that
both clients will be run within an hour or so of each other. This makes the
tool most useful for people who are having a real-time conversation already,
and want to graduate to a secure connection. Both clients must be left
running until the transfer has finished.
## Relays
2020-05-22 04:11:40 +00:00
The wormhole library requires a "Mailbox Server" (also known as the
"Rendezvous Server"): a simple WebSocket-based relay that delivers messages
from one client to another. This allows the wormhole codes to omit IP
addresses and port numbers. The URL of a public server is baked into the
library for use as a default, and will be freely available until volume or
abuse makes it infeasible to support. Applications which desire more
reliability can easily run their own relay and configure their clients to use
it instead. Code for the Mailbox Server is in a separate package named
2021-05-27 08:22:58 +00:00
`magic-wormhole-mailbox-server` and has documentation [here ](https://github.com/warner/magic-wormhole-mailbox-server/blob/master/docs/welcome.md ). Both clients must use the same mailbox
2020-05-22 04:11:40 +00:00
server. The default can be overridden with the `--relay-url` option.
2017-11-12 23:41:11 +00:00
The file-transfer commands also use a "Transit Relay", which is another
simple server that glues together two inbound TCP connections and transfers
2020-05-22 04:11:40 +00:00
data on each to the other (the moral equivalent of a TURN server). The
`wormhole send` file mode shares the IP addresses of each client with the
other (inside the encrypted message), and both clients first attempt to
connect directly. If this fails, they fall back to using the transit relay.
As before, the host/port of a public server is baked into the library, and
should be sufficient to handle moderate traffic. Code for the Transit Relay
2021-05-27 08:22:58 +00:00
is provided a separate package named `magic-wormhole-transit-relay` with instructions [here ](https://github.com/warner/magic-wormhole-transit-relay/blob/master/docs/running.md ). The clients exchange transit relay
2020-05-22 04:11:40 +00:00
information during connection negotiation, so they can be configured to use
different ones without problems. Use the `--transit-helper` option to
override the default.
2017-11-12 23:41:11 +00:00
The protocol includes provisions to deliver notices and error messages to
clients: if either relay must be shut down, these channels will be used to
provide information about alternatives.
## CLI tool
* `wormhole send [args] --text TEXT`
* `wormhole send [args] FILENAME`
* `wormhole send [args] DIRNAME`
* `wormhole receive [args]`
Both commands accept additional arguments to influence their behavior:
* `--code-length WORDS` : use more or fewer than 2 words for the code
* `--verify` : print (and ask user to compare) extra verification string
## Library
The `wormhole` module makes it possible for other applications to use these
code-protected channels. This includes Twisted support, and (in the future)
will include blocking/synchronous support too. See docs/api.md for details.
The file-transfer tools use a second module named `wormhole.transit` , which
provides an encrypted record-pipe. It knows how to use the Transit Relay as
well as direct connections, and attempts them all in parallel.
`TransitSender` and `TransitReceiver` are distinct, although once the
connection is established, data can flow in either direction. All data is
encrypted (using nacl/libsodium "secretbox") using a key derived from the
PAKE phase. See `src/wormhole/cli/cmd_send.py` for examples.
## Development
2021-05-27 08:22:58 +00:00
* Bugs and patches at the [GitHub project page ](https://github.com/warner/magic-wormhole ).
2021-06-15 21:18:27 +00:00
* Chat via [IRC ](irc://irc.libera.chat/#magic-wormhole ): #magic -wormhole on irc.libera.chat
* Chat via [Matrix ](https://matrix.to/#/#magic-wormhole:matrix.org ): #magic -wormhole on matrix.org
2017-11-12 23:41:11 +00:00
To set up Magic Wormhole for development, you will first need to
install [virtualenv][].
Once you've done that, ``git clone`` the repo, ``cd`` into the root of the
repository, and run:
```
virtualenv venv
source venv/bin/activate
pip install --upgrade pip setuptools
```
Now your virtualenv has been activated. You'll want to re-run
`source venv/bin/activate` for every new terminal session you open.
To install Magic Wormhole and its development dependencies into your
virtualenv, run:
```
pip install -e .[dev]
```
2021-01-23 21:58:13 +00:00
If you are using zsh, such as on macOS Catalina or later, you will have to run `pip install -e .'[dev]'` instead.
2017-11-12 23:41:11 +00:00
While the virtualenv is active, running ``wormhole`` will get you the
development version.
### Running Tests
Within your virtualenv, the command-line program `trial` will
run the test suite:
```
trial wormhole
```
This tests the entire `wormhole` package. If you want to run
only the tests for a specific module, or even just a specific test,
you can specify it instead via Python's standard dotted
import notation, e.g.:
```
trial wormhole.test.test_cli.PregeneratedCode.test_file_tor
```
Developers can also just clone the source tree and run `tox` to run the unit
2022-08-30 23:12:31 +00:00
tests on all supported (and installed) versions of python: 2.7, 3.7 and 3.8.
2017-11-12 23:41:11 +00:00
### Troubleshooting
Every so often, you might get a traceback with the following
kind of error:
```
pkg_resources.DistributionNotFound: The 'magic-wormhole==0.9.1-268.g66e0d86.dirty' distribution was not found and is required by the application
```
If this happens, run `pip install -e .[dev]` again.
2021-05-27 08:22:58 +00:00
[virtualenv]: https://docs.python.org/3/tutorial/venv.html
2017-11-12 23:41:11 +00:00
### Other
Relevant [xkcd ](https://xkcd.com/949/ ) :-)
## License, Compatibility
This library is released under the MIT license, see LICENSE for details.
2022-08-30 23:12:31 +00:00
This library is compatible with python2.7, 3.7 and 3.8 .
2017-11-12 23:41:11 +00:00
<!-- footnotes -->
2021-05-27 08:22:58 +00:00
[1]: https://www.di.ens.fr/~pointche/Documents/Papers/2005_rsa.pdf "RSA 2005"