Created OpenPGP Key Transfer (markdown)
parent
f3bf210306
commit
c1aa062616
|
@ -0,0 +1,60 @@
|
|||
# OpenPGP Secret Key Transfer
|
||||
|
||||
This document describes a mechanism for securely transferring OpenPGP secret key material between two devices.
|
||||
The devices must be able to communicate on a local network, and at least one of the devices must be able to scan a QR-Code displayed by the other.
|
||||
These requirements are typically fulfilled in a scenario where key material should be transferred from a desktop machine to a phone or vice versa.
|
||||
|
||||
This mechanism relies on two techniques: First, a QR-Code is used for out-of-band communication of authentication and network discovery information.
|
||||
The actual connection then relies on TLS-PSK for mutually authenticated, forward-secure transport encryption.
|
||||
|
||||
## Session Setup
|
||||
|
||||
A secure session between two devices is set up as follows:
|
||||
|
||||
1. One device generates a preshared key, then opens a TCP port to listen for a single incoming TLS-PSK session.
|
||||
This device is the "server" device.
|
||||
2. While in the listening state, the server device displays a QR code that encodes the necessary data to connect to it (see below).
|
||||
3. Another device scans the QR code, then establishes a TLS-PSK connection to the server device.
|
||||
This device is the "client" device.
|
||||
|
||||
### Connection Details
|
||||
|
||||
The choice of port the server device listens on is left to the implementation, it is RECOMMENDED to use an automatically assigned one.
|
||||
The connection MUST be secured with the TLS-PSK protocol.
|
||||
It MUST also use one of the PSK-authenticated Diffie-Hellman ciphersuites (TLS\_DHE\_PSK\_\* or TLS\_ECDHE\_PSK\_\*).
|
||||
The preshared key consists of 128 bits of random data, which MUST be obtained from a CSPRNG.
|
||||
For compatibility, the client SHOULD use the identity hint provided by the server during the TLS handshake as their client identity, or empty string if none was provided.
|
||||
|
||||
The connection details displayed in the QR-Code are encoded as a URI, as such:
|
||||
|
||||
uri = "OPENPGP+SKT://" hex-psk "@" address ":" port
|
||||
hex-psk = 32HEXDIG
|
||||
address = IPv4address / "[" IPv6address "]"
|
||||
port = *DIGIT
|
||||
|
||||
The IPv4address and IPv6address grammars are defined as in https://tools.ietf.org/html/rfc3986#section-3.2.2
|
||||
For efficient encoding, all letters (and hexadecimal numbers) in the URI SHOULD be uppercase.
|
||||
|
||||
## Transmitting Data
|
||||
|
||||
The only data that may be sent through an SKT session are ASCII armored secret key blocks, terminated by two newlines.
|
||||
Both the client and server device are allowed to send data first; the device that first sends data becomes the /active/ device of the session, the other becomes the /passive/ one.
|
||||
The active device may send further key blocks after the first one, the passive device MUST NOT send any.
|
||||
The session SHOULD be kept open by the passive device, until dismissed by the user.
|
||||
Note that the race condition in this behavior is not an issue in practice, since data sent by the then-active device is triggered directly by user input (see below).
|
||||
|
||||
This way of handling sessions enables two distinct user flows:
|
||||
|
||||
- Establish a session, then wait for user input to select keys to send. When keys are received, switch to list of received keys and allow user to import.
|
||||
- Ask for user input before the connection is established, then send keys immediately after session has been established.
|
||||
|
||||
The former user flow yields an (arguably) better user experience: Establishing a session first not only makes it more transparent to the user how the transfer mechanism works, but also moves most modes of failure to a point in time /before/ the user selects their keys to send.
|
||||
It also makes expectations more clear in the scenario where the passive device is the server device, since scanning a QR code is typically perceived as an action that receives data, rather than sends.
|
||||
An implementation that follows the former approach is automatically compatible with the second.
|
||||
It is RECOMMENDED that implementations take the first approach, unless implementation constraints prescribe the second.
|
||||
|
||||
## Security Considerations
|
||||
|
||||
- transfer is secure, still: designed for usability and compatibility
|
||||
- only TLS\_DHE\_\* or TLS\_ECDHE\_\*
|
||||
- doesn't work (by definition) on airgapped devices
|
Loading…
Reference in New Issue