aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Documentation/admin-guide/thunderbolt.rst66
-rw-r--r--Documentation/mips/AU1xxx_IDE.README7
-rw-r--r--Documentation/process/index.rst1
-rw-r--r--Documentation/process/kernel-docs.rst2
-rw-r--r--Documentation/process/maintainer-pgp-guide.rst929
5 files changed, 964 insertions, 41 deletions
diff --git a/Documentation/admin-guide/thunderbolt.rst b/Documentation/admin-guide/thunderbolt.rst
index 9b55952039a6..9948ec36a204 100644
--- a/Documentation/admin-guide/thunderbolt.rst
+++ b/Documentation/admin-guide/thunderbolt.rst
@@ -3,13 +3,13 @@
3============= 3=============
4The interface presented here is not meant for end users. Instead there 4The interface presented here is not meant for end users. Instead there
5should be a userspace tool that handles all the low-level details, keeps 5should be a userspace tool that handles all the low-level details, keeps
6database of the authorized devices and prompts user for new connections. 6a database of the authorized devices and prompts users for new connections.
7 7
8More details about the sysfs interface for Thunderbolt devices can be 8More details about the sysfs interface for Thunderbolt devices can be
9found in ``Documentation/ABI/testing/sysfs-bus-thunderbolt``. 9found in ``Documentation/ABI/testing/sysfs-bus-thunderbolt``.
10 10
11Those users who just want to connect any device without any sort of 11Those users who just want to connect any device without any sort of
12manual work, can add following line to 12manual work can add following line to
13``/etc/udev/rules.d/99-local.rules``:: 13``/etc/udev/rules.d/99-local.rules``::
14 14
15 ACTION=="add", SUBSYSTEM=="thunderbolt", ATTR{authorized}=="0", ATTR{authorized}="1" 15 ACTION=="add", SUBSYSTEM=="thunderbolt", ATTR{authorized}=="0", ATTR{authorized}="1"
@@ -20,7 +20,7 @@ vulnerable to DMA attacks.
20 20
21Security levels and how to use them 21Security levels and how to use them
22----------------------------------- 22-----------------------------------
23Starting from Intel Falcon Ridge Thunderbolt controller there are 4 23Starting with Intel Falcon Ridge Thunderbolt controller there are 4
24security levels available. The reason for these is the fact that the 24security levels available. The reason for these is the fact that the
25connected devices can be DMA masters and thus read contents of the host 25connected devices can be DMA masters and thus read contents of the host
26memory without CPU and OS knowing about it. There are ways to prevent 26memory without CPU and OS knowing about it. There are ways to prevent
@@ -37,14 +37,14 @@ The security levels are as follows:
37 user 37 user
38 User is asked whether the device is allowed to be connected. 38 User is asked whether the device is allowed to be connected.
39 Based on the device identification information available through 39 Based on the device identification information available through
40 ``/sys/bus/thunderbolt/devices``. user then can do the decision. 40 ``/sys/bus/thunderbolt/devices``, the user then can make the decision.
41 In BIOS settings this is typically called *Unique ID*. 41 In BIOS settings this is typically called *Unique ID*.
42 42
43 secure 43 secure
44 User is asked whether the device is allowed to be connected. In 44 User is asked whether the device is allowed to be connected. In
45 addition to UUID the device (if it supports secure connect) is sent 45 addition to UUID the device (if it supports secure connect) is sent
46 a challenge that should match the expected one based on a random key 46 a challenge that should match the expected one based on a random key
47 written to ``key`` sysfs attribute. In BIOS settings this is 47 written to the ``key`` sysfs attribute. In BIOS settings this is
48 typically called *One time saved key*. 48 typically called *One time saved key*.
49 49
50 dponly 50 dponly
@@ -78,7 +78,7 @@ When a device is plugged in it will appear in sysfs as follows::
78 /sys/bus/thunderbolt/devices/0-1/unique_id - e0376f00-0300-0100-ffff-ffffffffffff 78 /sys/bus/thunderbolt/devices/0-1/unique_id - e0376f00-0300-0100-ffff-ffffffffffff
79 79
80The ``authorized`` attribute reads 0 which means no PCIe tunnels are 80The ``authorized`` attribute reads 0 which means no PCIe tunnels are
81created yet. The user can authorize the device by simply:: 81created yet. The user can authorize the device by simply entering::
82 82
83 # echo 1 > /sys/bus/thunderbolt/devices/0-1/authorized 83 # echo 1 > /sys/bus/thunderbolt/devices/0-1/authorized
84 84
@@ -86,7 +86,7 @@ This will create the PCIe tunnels and the device is now connected.
86 86
87If the device supports secure connect, and the domain security level is 87If the device supports secure connect, and the domain security level is
88set to ``secure``, it has an additional attribute ``key`` which can hold 88set to ``secure``, it has an additional attribute ``key`` which can hold
89a random 32 byte value used for authorization and challenging the device in 89a random 32-byte value used for authorization and challenging the device in
90future connects:: 90future connects::
91 91
92 /sys/bus/thunderbolt/devices/0-3/authorized - 0 92 /sys/bus/thunderbolt/devices/0-3/authorized - 0
@@ -99,12 +99,12 @@ future connects::
99 99
100Notice the key is empty by default. 100Notice the key is empty by default.
101 101
102If the user does not want to use secure connect it can just ``echo 1`` 102If the user does not want to use secure connect they can just ``echo 1``
103to the ``authorized`` attribute and the PCIe tunnels will be created in 103to the ``authorized`` attribute and the PCIe tunnels will be created in
104the same way than in ``user`` security level. 104the same way as in the ``user`` security level.
105 105
106If the user wants to use secure connect, the first time the device is 106If the user wants to use secure connect, the first time the device is
107plugged a key needs to be created and send to the device:: 107plugged a key needs to be created and sent to the device::
108 108
109 # key=$(openssl rand -hex 32) 109 # key=$(openssl rand -hex 32)
110 # echo $key > /sys/bus/thunderbolt/devices/0-3/key 110 # echo $key > /sys/bus/thunderbolt/devices/0-3/key
@@ -121,27 +121,27 @@ device using the same key::
121 121
122If the challenge the device returns back matches the one we expect based 122If the challenge the device returns back matches the one we expect based
123on the key, the device is connected and the PCIe tunnels are created. 123on the key, the device is connected and the PCIe tunnels are created.
124However, if the challenge failed no tunnels are created and error is 124However, if the challenge fails no tunnels are created and error is
125returned to the user. 125returned to the user.
126 126
127If the user still wants to connect the device it can either approve 127If the user still wants to connect the device they can either approve
128the device without a key or write new key and write 1 to the 128the device without a key or write a new key and write 1 to the
129``authorized`` file to get the new key stored on the device NVM. 129``authorized`` file to get the new key stored on the device NVM.
130 130
131Upgrading NVM on Thunderbolt device or host 131Upgrading NVM on Thunderbolt device or host
132------------------------------------------- 132-------------------------------------------
133Since most of the functionality is handled in a firmware running on a 133Since most of the functionality is handled in firmware running on a
134host controller or a device, it is important that the firmware can be 134host controller or a device, it is important that the firmware can be
135upgraded to the latest where possible bugs in it have been fixed. 135upgraded to the latest where possible bugs in it have been fixed.
136Typically OEMs provide this firmware from their support site. 136Typically OEMs provide this firmware from their support site.
137 137
138There is also a central site which has links where to download firmwares 138There is also a central site which has links where to download firmware
139for some machines: 139for some machines:
140 140
141 `Thunderbolt Updates <https://thunderbolttechnology.net/updates>`_ 141 `Thunderbolt Updates <https://thunderbolttechnology.net/updates>`_
142 142
143Before you upgrade firmware on a device or host, please make sure it is 143Before you upgrade firmware on a device or host, please make sure it is a
144the suitable. Failing to do that may render the device (or host) in a 144suitable upgrade. Failing to do that may render the device (or host) in a
145state where it cannot be used properly anymore without special tools! 145state where it cannot be used properly anymore without special tools!
146 146
147Host NVM upgrade on Apple Macs is not supported. 147Host NVM upgrade on Apple Macs is not supported.
@@ -151,7 +151,7 @@ Thunderbolt device so that the host controller appears. It does not
151matter which device is connected (unless you are upgrading NVM on a 151matter which device is connected (unless you are upgrading NVM on a
152device - then you need to connect that particular device). 152device - then you need to connect that particular device).
153 153
154Note OEM-specific method to power the controller up ("force power") may 154Note an OEM-specific method to power the controller up ("force power") may
155be available for your system in which case there is no need to plug in a 155be available for your system in which case there is no need to plug in a
156Thunderbolt device. 156Thunderbolt device.
157 157
@@ -171,7 +171,7 @@ it comes back the driver notices it and initiates a full power cycle.
171After a while the host controller appears again and this time it should 171After a while the host controller appears again and this time it should
172be fully functional. 172be fully functional.
173 173
174We can verify that the new NVM firmware is active by running following 174We can verify that the new NVM firmware is active by running the following
175commands:: 175commands::
176 176
177 # cat /sys/bus/thunderbolt/devices/0-0/nvm_authenticate 177 # cat /sys/bus/thunderbolt/devices/0-0/nvm_authenticate
@@ -179,38 +179,38 @@ commands::
179 # cat /sys/bus/thunderbolt/devices/0-0/nvm_version 179 # cat /sys/bus/thunderbolt/devices/0-0/nvm_version
180 18.0 180 18.0
181 181
182If ``nvm_authenticate`` contains anything else than 0x0 it is the error 182If ``nvm_authenticate`` contains anything other than 0x0 it is the error
183code from the last authentication cycle, which means the authentication 183code from the last authentication cycle, which means the authentication
184of the NVM image failed. 184of the NVM image failed.
185 185
186Note names of the NVMem devices ``nvm_activeN`` and ``nvm_non_activeN`` 186Note names of the NVMem devices ``nvm_activeN`` and ``nvm_non_activeN``
187depends on the order they are registered in the NVMem subsystem. N in 187depend on the order they are registered in the NVMem subsystem. N in
188the name is the identifier added by the NVMem subsystem. 188the name is the identifier added by the NVMem subsystem.
189 189
190Upgrading NVM when host controller is in safe mode 190Upgrading NVM when host controller is in safe mode
191-------------------------------------------------- 191--------------------------------------------------
192If the existing NVM is not properly authenticated (or is missing) the 192If the existing NVM is not properly authenticated (or is missing) the
193host controller goes into safe mode which means that only available 193host controller goes into safe mode which means that the only available
194functionality is flashing new NVM image. When in this mode the reading 194functionality is flashing a new NVM image. When in this mode, reading
195``nvm_version`` fails with ``ENODATA`` and the device identification 195``nvm_version`` fails with ``ENODATA`` and the device identification
196information is missing. 196information is missing.
197 197
198To recover from this mode, one needs to flash a valid NVM image to the 198To recover from this mode, one needs to flash a valid NVM image to the
199host host controller in the same way it is done in the previous chapter. 199host controller in the same way it is done in the previous chapter.
200 200
201Networking over Thunderbolt cable 201Networking over Thunderbolt cable
202--------------------------------- 202---------------------------------
203Thunderbolt technology allows software communication across two hosts 203Thunderbolt technology allows software communication between two hosts
204connected by a Thunderbolt cable. 204connected by a Thunderbolt cable.
205 205
206It is possible to tunnel any kind of traffic over Thunderbolt link but 206It is possible to tunnel any kind of traffic over a Thunderbolt link but
207currently we only support Apple ThunderboltIP protocol. 207currently we only support Apple ThunderboltIP protocol.
208 208
209If the other host is running Windows or macOS only thing you need to 209If the other host is running Windows or macOS, the only thing you need to
210do is to connect Thunderbolt cable between the two hosts, the 210do is to connect a Thunderbolt cable between the two hosts; the
211``thunderbolt-net`` is loaded automatically. If the other host is also 211``thunderbolt-net`` driver is loaded automatically. If the other host is
212Linux you should load ``thunderbolt-net`` manually on one host (it does 212also Linux you should load ``thunderbolt-net`` manually on one host (it
213not matter which one):: 213does not matter which one)::
214 214
215 # modprobe thunderbolt-net 215 # modprobe thunderbolt-net
216 216
@@ -220,12 +220,12 @@ is built-in to the kernel image, there is no need to do anything.
220The driver will create one virtual ethernet interface per Thunderbolt 220The driver will create one virtual ethernet interface per Thunderbolt
221port which are named like ``thunderbolt0`` and so on. From this point 221port which are named like ``thunderbolt0`` and so on. From this point
222you can either use standard userspace tools like ``ifconfig`` to 222you can either use standard userspace tools like ``ifconfig`` to
223configure the interface or let your GUI to handle it automatically. 223configure the interface or let your GUI handle it automatically.
224 224
225Forcing power 225Forcing power
226------------- 226-------------
227Many OEMs include a method that can be used to force the power of a 227Many OEMs include a method that can be used to force the power of a
228thunderbolt controller to an "On" state even if nothing is connected. 228Thunderbolt controller to an "On" state even if nothing is connected.
229If supported by your machine this will be exposed by the WMI bus with 229If supported by your machine this will be exposed by the WMI bus with
230a sysfs attribute called "force_power". 230a sysfs attribute called "force_power".
231 231
diff --git a/Documentation/mips/AU1xxx_IDE.README b/Documentation/mips/AU1xxx_IDE.README
index 52844a58cc8a..ff675a1b1422 100644
--- a/Documentation/mips/AU1xxx_IDE.README
+++ b/Documentation/mips/AU1xxx_IDE.README
@@ -56,8 +56,6 @@ Following extra configs variables are introduced:
56 56
57 CONFIG_BLK_DEV_IDE_AU1XXX_PIO_DBDMA - enable the PIO+DBDMA mode 57 CONFIG_BLK_DEV_IDE_AU1XXX_PIO_DBDMA - enable the PIO+DBDMA mode
58 CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA - enable the MWDMA mode 58 CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA - enable the MWDMA mode
59 CONFIG_BLK_DEV_IDE_AU1XXX_BURSTABLE_ON - set Burstable FIFO in DBDMA
60 controller
61 59
62 60
63SUPPORTED IDE MODES 61SUPPORTED IDE MODES
@@ -82,11 +80,9 @@ CONFIG_IDE_GENERIC=y
82CONFIG_BLK_DEV_IDEPCI=y 80CONFIG_BLK_DEV_IDEPCI=y
83CONFIG_BLK_DEV_GENERIC=y 81CONFIG_BLK_DEV_GENERIC=y
84CONFIG_BLK_DEV_IDEDMA_PCI=y 82CONFIG_BLK_DEV_IDEDMA_PCI=y
85CONFIG_IDEDMA_PCI_AUTO=y
86CONFIG_BLK_DEV_IDE_AU1XXX=y 83CONFIG_BLK_DEV_IDE_AU1XXX=y
87CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA=y 84CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA=y
88CONFIG_BLK_DEV_IDEDMA=y 85CONFIG_BLK_DEV_IDEDMA=y
89CONFIG_IDEDMA_AUTO=y
90 86
91Also define 'IDE_AU1XXX_BURSTMODE' in 'drivers/ide/mips/au1xxx-ide.c' to enable 87Also define 'IDE_AU1XXX_BURSTMODE' in 'drivers/ide/mips/au1xxx-ide.c' to enable
92the burst support on DBDMA controller. 88the burst support on DBDMA controller.
@@ -94,16 +90,13 @@ the burst support on DBDMA controller.
94If the used system need the USB support enable the following kernel configs for 90If the used system need the USB support enable the following kernel configs for
95high IDE to USB throughput. 91high IDE to USB throughput.
96 92
97CONFIG_BLK_DEV_IDEDISK=y
98CONFIG_IDE_GENERIC=y 93CONFIG_IDE_GENERIC=y
99CONFIG_BLK_DEV_IDEPCI=y 94CONFIG_BLK_DEV_IDEPCI=y
100CONFIG_BLK_DEV_GENERIC=y 95CONFIG_BLK_DEV_GENERIC=y
101CONFIG_BLK_DEV_IDEDMA_PCI=y 96CONFIG_BLK_DEV_IDEDMA_PCI=y
102CONFIG_IDEDMA_PCI_AUTO=y
103CONFIG_BLK_DEV_IDE_AU1XXX=y 97CONFIG_BLK_DEV_IDE_AU1XXX=y
104CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA=y 98CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA=y
105CONFIG_BLK_DEV_IDEDMA=y 99CONFIG_BLK_DEV_IDEDMA=y
106CONFIG_IDEDMA_AUTO=y
107 100
108Also undefine 'IDE_AU1XXX_BURSTMODE' in 'drivers/ide/mips/au1xxx-ide.c' to 101Also undefine 'IDE_AU1XXX_BURSTMODE' in 'drivers/ide/mips/au1xxx-ide.c' to
109disable the burst support on DBDMA controller. 102disable the burst support on DBDMA controller.
diff --git a/Documentation/process/index.rst b/Documentation/process/index.rst
index a430f6eee756..1c9fe657ed01 100644
--- a/Documentation/process/index.rst
+++ b/Documentation/process/index.rst
@@ -24,6 +24,7 @@ Below are the essential guides that every developer should read.
24 development-process 24 development-process
25 submitting-patches 25 submitting-patches
26 coding-style 26 coding-style
27 maintainer-pgp-guide
27 email-clients 28 email-clients
28 kernel-enforcement-statement 29 kernel-enforcement-statement
29 kernel-driver-statement 30 kernel-driver-statement
diff --git a/Documentation/process/kernel-docs.rst b/Documentation/process/kernel-docs.rst
index b8cac85a4001..3fb28de556e4 100644
--- a/Documentation/process/kernel-docs.rst
+++ b/Documentation/process/kernel-docs.rst
@@ -58,7 +58,7 @@ On-line docs
58 * Title: **Linux Kernel Mailing List Glossary** 58 * Title: **Linux Kernel Mailing List Glossary**
59 59
60 :Author: various 60 :Author: various
61 :URL: http://kernelnewbies.org/glossary/ 61 :URL: https://kernelnewbies.org/KernelGlossary
62 :Date: rolling version 62 :Date: rolling version
63 :Keywords: glossary, terms, linux-kernel. 63 :Keywords: glossary, terms, linux-kernel.
64 :Description: From the introduction: "This glossary is intended as 64 :Description: From the introduction: "This glossary is intended as
diff --git a/Documentation/process/maintainer-pgp-guide.rst b/Documentation/process/maintainer-pgp-guide.rst
new file mode 100644
index 000000000000..b453561a7148
--- /dev/null
+++ b/Documentation/process/maintainer-pgp-guide.rst
@@ -0,0 +1,929 @@
1.. _pgpguide:
2
3===========================
4Kernel Maintainer PGP guide
5===========================
6
7:Author: Konstantin Ryabitsev <konstantin@linuxfoundation.org>
8
9This document is aimed at Linux kernel developers, and especially at
10subsystem maintainers. It contains a subset of information discussed in
11the more general "`Protecting Code Integrity`_" guide published by the
12Linux Foundation. Please read that document for more in-depth discussion
13on some of the topics mentioned in this guide.
14
15.. _`Protecting Code Integrity`: https://github.com/lfit/itpol/blob/master/protecting-code-integrity.md
16
17The role of PGP in Linux Kernel development
18===========================================
19
20PGP helps ensure the integrity of the code that is produced by the Linux
21kernel development community and, to a lesser degree, establish trusted
22communication channels between developers via PGP-signed email exchange.
23
24The Linux kernel source code is available in two main formats:
25
26- Distributed source repositories (git)
27- Periodic release snapshots (tarballs)
28
29Both git repositories and tarballs carry PGP signatures of the kernel
30developers who create official kernel releases. These signatures offer a
31cryptographic guarantee that downloadable versions made available via
32kernel.org or any other mirrors are identical to what these developers
33have on their workstations. To this end:
34
35- git repositories provide PGP signatures on all tags
36- tarballs provide detached PGP signatures with all downloads
37
38.. _devs_not_infra:
39
40Trusting the developers, not infrastructure
41-------------------------------------------
42
43Ever since the 2011 compromise of core kernel.org systems, the main
44operating principle of the Kernel Archives project has been to assume
45that any part of the infrastructure can be compromised at any time. For
46this reason, the administrators have taken deliberate steps to emphasize
47that trust must always be placed with developers and never with the code
48hosting infrastructure, regardless of how good the security practices
49for the latter may be.
50
51The above guiding principle is the reason why this guide is needed. We
52want to make sure that by placing trust into developers we do not simply
53shift the blame for potential future security incidents to someone else.
54The goal is to provide a set of guidelines developers can use to create
55a secure working environment and safeguard the PGP keys used to
56establish the integrity of the Linux kernel itself.
57
58.. _pgp_tools:
59
60PGP tools
61=========
62
63Use GnuPG v2
64------------
65
66Your distro should already have GnuPG installed by default, you just
67need to verify that you are using version 2.x and not the legacy 1.4
68release -- many distributions still package both, with the default
69``gpg`` command invoking GnuPG v.1. To check, run::
70
71 $ gpg --version | head -n1
72
73If you see ``gpg (GnuPG) 1.4.x``, then you are using GnuPG v.1. Try the
74``gpg2`` command (if you don't have it, you may need to install the
75gnupg2 package)::
76
77 $ gpg2 --version | head -n1
78
79If you see ``gpg (GnuPG) 2.x.x``, then you are good to go. This guide
80will assume you have the version 2.2 of GnuPG (or later). If you are
81using version 2.0 of GnuPG, then some of the commands in this guide will
82not work, and you should consider installing the latest 2.2 version of
83GnuPG. Versions of gnupg-2.1.11 and later should be compatible for the
84purposes of this guide as well.
85
86If you have both ``gpg`` and ``gpg2`` commands, you should make sure you
87are always using GnuPG v2, not the legacy version. You can enforce this
88by setting the appropriate alias::
89
90 $ alias gpg=gpg2
91
92You can put that in your ``.bashrc`` to make sure it's always the case.
93
94Configure gpg-agent options
95~~~~~~~~~~~~~~~~~~~~~~~~~~~
96
97The GnuPG agent is a helper tool that will start automatically whenever
98you use the ``gpg`` command and run in the background with the purpose
99of caching the private key passphrase. There are two options you should
100know in order to tweak when the passphrase should be expired from cache:
101
102- ``default-cache-ttl`` (seconds): If you use the same key again before
103 the time-to-live expires, the countdown will reset for another period.
104 The default is 600 (10 minutes).
105- ``max-cache-ttl`` (seconds): Regardless of how recently you've used
106 the key since initial passphrase entry, if the maximum time-to-live
107 countdown expires, you'll have to enter the passphrase again. The
108 default is 30 minutes.
109
110If you find either of these defaults too short (or too long), you can
111edit your ``~/.gnupg/gpg-agent.conf`` file to set your own values::
112
113 # set to 30 minutes for regular ttl, and 2 hours for max ttl
114 default-cache-ttl 1800
115 max-cache-ttl 7200
116
117.. note::
118
119 It is no longer necessary to start gpg-agent manually at the
120 beginning of your shell session. You may want to check your rc files
121 to remove anything you had in place for older versions of GnuPG, as
122 it may not be doing the right thing any more.
123
124Set up a refresh cronjob
125~~~~~~~~~~~~~~~~~~~~~~~~
126
127You will need to regularly refresh your keyring in order to get the
128latest changes on other people's public keys, which is best done with a
129daily cronjob::
130
131 @daily /usr/bin/gpg2 --refresh >/dev/null 2>&1
132
133Check the full path to your ``gpg`` or ``gpg2`` command and use the
134``gpg2`` command if regular ``gpg`` for you is the legacy GnuPG v.1.
135
136.. _master_key:
137
138Protect your master PGP key
139===========================
140
141This guide assumes that you already have a PGP key that you use for Linux
142kernel development purposes. If you do not yet have one, please see the
143"`Protecting Code Integrity`_" document mentioned earlier for guidance
144on how to create a new one.
145
146You should also make a new key if your current one is weaker than 2048 bits
147(RSA).
148
149Master key vs. Subkeys
150----------------------
151
152Subkeys are fully independent PGP keypairs that are tied to the "master"
153key using certifying key signatures (certificates). It is important to
154understand the following:
155
1561. There are no technical differences between the "master key" and "subkeys."
1572. At creation time, we assign functional limitations to each key by
158 giving it specific capabilities.
1593. A PGP key can have 4 capabilities:
160
161 - **[S]** key can be used for signing
162 - **[E]** key can be used for encryption
163 - **[A]** key can be used for authentication
164 - **[C]** key can be used for certifying other keys
165
1664. A single key may have multiple capabilities.
1675. A subkey is fully independent from the master key. A message
168 encrypted to a subkey cannot be decrypted with the master key. If you
169 lose your private subkey, it cannot be recreated from the master key
170 in any way.
171
172The key carrying the **[C]** (certify) capability is considered the
173"master" key because it is the only key that can be used to indicate
174relationship with other keys. Only the **[C]** key can be used to:
175
176- add or revoke other keys (subkeys) with S/E/A capabilities
177- add, change or revoke identities (uids) associated with the key
178- add or change the expiration date on itself or any subkey
179- sign other people's keys for web of trust purposes
180
181By default, GnuPG creates the following when generating new keys:
182
183- A master key carrying both Certify and Sign capabilities (**[SC]**)
184- A separate subkey with the Encryption capability (**[E]**)
185
186If you used the default parameters when generating your key, then that
187is what you will have. You can verify by running ``gpg --list-secret-keys``,
188for example::
189
190 sec rsa2048 2018-01-23 [SC] [expires: 2020-01-23]
191 000000000000000000000000AAAABBBBCCCCDDDD
192 uid [ultimate] Alice Dev <adev@kernel.org>
193 ssb rsa2048 2018-01-23 [E] [expires: 2020-01-23]
194
195Any key carrying the **[C]** capability is your master key, regardless
196of any other capabilities it may have assigned to it.
197
198The long line under the ``sec`` entry is your key fingerprint --
199whenever you see ``[fpr]`` in the examples below, that 40-character
200string is what it refers to.
201
202Ensure your passphrase is strong
203--------------------------------
204
205GnuPG uses passphrases to encrypt your private keys before storing them on
206disk. This way, even if your ``.gnupg`` directory is leaked or stolen in
207its entirety, the attackers cannot use your private keys without first
208obtaining the passphrase to decrypt them.
209
210It is absolutely essential that your private keys are protected by a
211strong passphrase. To set it or change it, use::
212
213 $ gpg --change-passphrase [fpr]
214
215Create a separate Signing subkey
216--------------------------------
217
218Our goal is to protect your master key by moving it to offline media, so
219if you only have a combined **[SC]** key, then you should create a separate
220signing subkey::
221
222 $ gpg --quick-add-key [fpr] ed25519 sign
223
224Remember to tell the keyservers about this change, so others can pull down
225your new subkey::
226
227 $ gpg --send-key [fpr]
228
229.. note:: ECC support in GnuPG
230
231 GnuPG 2.1 and later has full support for Elliptic Curve
232 Cryptography, with ability to combine ECC subkeys with traditional
233 RSA master keys. The main upside of ECC cryptography is that it is
234 much faster computationally and creates much smaller signatures when
235 compared byte for byte with 2048+ bit RSA keys. Unless you plan on
236 using a smartcard device that does not support ECC operations, we
237 recommend that you create an ECC signing subkey for your kernel
238 work.
239
240 If for some reason you prefer to stay with RSA subkeys, just replace
241 "ed25519" with "rsa2048" in the above command.
242
243
244Back up your master key for disaster recovery
245---------------------------------------------
246
247The more signatures you have on your PGP key from other developers, the
248more reasons you have to create a backup version that lives on something
249other than digital media, for disaster recovery reasons.
250
251The best way to create a printable hardcopy of your private key is by
252using the ``paperkey`` software written for this very purpose. See ``man
253paperkey`` for more details on the output format and its benefits over
254other solutions. Paperkey should already be packaged for most
255distributions.
256
257Run the following command to create a hardcopy backup of your private
258key::
259
260 $ gpg --export-secret-key [fpr] | paperkey -o /tmp/key-backup.txt
261
262Print out that file (or pipe the output straight to lpr), then take a
263pen and write your passphrase on the margin of the paper. **This is
264strongly recommended** because the key printout is still encrypted with
265that passphrase, and if you ever change it you will not remember what it
266used to be when you had created the backup -- *guaranteed*.
267
268Put the resulting printout and the hand-written passphrase into an envelope
269and store in a secure and well-protected place, preferably away from your
270home, such as your bank vault.
271
272.. note::
273
274 Your printer is probably no longer a simple dumb device connected to
275 your parallel port, but since the output is still encrypted with
276 your passphrase, printing out even to "cloud-integrated" modern
277 printers should remain a relatively safe operation. One option is to
278 change the passphrase on your master key immediately after you are
279 done with paperkey.
280
281Back up your whole GnuPG directory
282----------------------------------
283
284.. warning::
285
286 **!!!Do not skip this step!!!**
287
288It is important to have a readily available backup of your PGP keys
289should you need to recover them. This is different from the
290disaster-level preparedness we did with ``paperkey``. You will also rely
291on these external copies whenever you need to use your Certify key --
292such as when making changes to your own key or signing other people's
293keys after conferences and summits.
294
295Start by getting a small USB "thumb" drive (preferably two!) that you
296will use for backup purposes. You will need to encrypt them using LUKS
297-- refer to your distro's documentation on how to accomplish this.
298
299For the encryption passphrase, you can use the same one as on your
300master key.
301
302Once the encryption process is over, re-insert the USB drive and make
303sure it gets properly mounted. Copy your entire ``.gnupg`` directory
304over to the encrypted storage::
305
306 $ cp -a ~/.gnupg /media/disk/foo/gnupg-backup
307
308You should now test to make sure everything still works::
309
310 $ gpg --homedir=/media/disk/foo/gnupg-backup --list-key [fpr]
311
312If you don't get any errors, then you should be good to go. Unmount the
313USB drive, distinctly label it so you don't blow it away next time you
314need to use a random USB drive, and put in a safe place -- but not too
315far away, because you'll need to use it every now and again for things
316like editing identities, adding or revoking subkeys, or signing other
317people's keys.
318
319Remove the master key from your homedir
320----------------------------------------
321
322The files in our home directory are not as well protected as we like to
323think. They can be leaked or stolen via many different means:
324
325- by accident when making quick homedir copies to set up a new workstation
326- by systems administrator negligence or malice
327- via poorly secured backups
328- via malware in desktop apps (browsers, pdf viewers, etc)
329- via coercion when crossing international borders
330
331Protecting your key with a good passphrase greatly helps reduce the risk
332of any of the above, but passphrases can be discovered via keyloggers,
333shoulder-surfing, or any number of other means. For this reason, the
334recommended setup is to remove your master key from your home directory
335and store it on offline storage.
336
337.. warning::
338
339 Please see the previous section and make sure you have backed up
340 your GnuPG directory in its entirety. What we are about to do will
341 render your key useless if you do not have a usable backup!
342
343First, identify the keygrip of your master key::
344
345 $ gpg --with-keygrip --list-key [fpr]
346
347The output will be something like this::
348
349 pub rsa2048 2018-01-24 [SC] [expires: 2020-01-24]
350 000000000000000000000000AAAABBBBCCCCDDDD
351 Keygrip = 1111000000000000000000000000000000000000
352 uid [ultimate] Alice Dev <adev@kernel.org>
353 sub rsa2048 2018-01-24 [E] [expires: 2020-01-24]
354 Keygrip = 2222000000000000000000000000000000000000
355 sub ed25519 2018-01-24 [S]
356 Keygrip = 3333000000000000000000000000000000000000
357
358Find the keygrip entry that is beneath the ``pub`` line (right under the
359master key fingerprint). This will correspond directly to a file in your
360``~/.gnupg`` directory::
361
362 $ cd ~/.gnupg/private-keys-v1.d
363 $ ls
364 1111000000000000000000000000000000000000.key
365 2222000000000000000000000000000000000000.key
366 3333000000000000000000000000000000000000.key
367
368All you have to do is simply remove the .key file that corresponds to
369the master keygrip::
370
371 $ cd ~/.gnupg/private-keys-v1.d
372 $ rm 1111000000000000000000000000000000000000.key
373
374Now, if you issue the ``--list-secret-keys`` command, it will show that
375the master key is missing (the ``#`` indicates it is not available)::
376
377 $ gpg --list-secret-keys
378 sec# rsa2048 2018-01-24 [SC] [expires: 2020-01-24]
379 000000000000000000000000AAAABBBBCCCCDDDD
380 uid [ultimate] Alice Dev <adev@kernel.org>
381 ssb rsa2048 2018-01-24 [E] [expires: 2020-01-24]
382 ssb ed25519 2018-01-24 [S]
383
384You should also remove any ``secring.gpg`` files in the ``~/.gnupg``
385directory, which are left over from earlier versions of GnuPG.
386
387If you don't have the "private-keys-v1.d" directory
388~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
389
390If you do not have a ``~/.gnupg/private-keys-v1.d`` directory, then your
391secret keys are still stored in the legacy ``secring.gpg`` file used by
392GnuPG v1. Making any changes to your key, such as changing the
393passphrase or adding a subkey, should automatically convert the old
394``secring.gpg`` format to use ``private-keys-v1.d`` instead.
395
396Once you get that done, make sure to delete the obsolete ``secring.gpg``
397file, which still contains your private keys.
398
399.. _smartcards:
400
401Move the subkeys to a dedicated crypto device
402=============================================
403
404Even though the master key is now safe from being leaked or stolen, the
405subkeys are still in your home directory. Anyone who manages to get
406their hands on those will be able to decrypt your communication or fake
407your signatures (if they know the passphrase). Furthermore, each time a
408GnuPG operation is performed, the keys are loaded into system memory and
409can be stolen from there by sufficiently advanced malware (think
410Meltdown and Spectre).
411
412The best way to completely protect your keys is to move them to a
413specialized hardware device that is capable of smartcard operations.
414
415The benefits of smartcards
416--------------------------
417
418A smartcard contains a cryptographic chip that is capable of storing
419private keys and performing crypto operations directly on the card
420itself. Because the key contents never leave the smartcard, the
421operating system of the computer into which you plug in the hardware
422device is not able to retrieve the private keys themselves. This is very
423different from the encrypted USB storage device we used earlier for
424backup purposes -- while that USB device is plugged in and mounted, the
425operating system is able to access the private key contents.
426
427Using external encrypted USB media is not a substitute to having a
428smartcard-capable device.
429
430Available smartcard devices
431---------------------------
432
433Unless all your laptops and workstations have smartcard readers, the
434easiest is to get a specialized USB device that implements smartcard
435functionality. There are several options available:
436
437- `Nitrokey Start`_: Open hardware and Free Software, based on FSI
438 Japan's `Gnuk`_. Offers support for ECC keys, but fewest security
439 features (such as resistance to tampering or some side-channel
440 attacks).
441- `Nitrokey Pro`_: Similar to the Nitrokey Start, but more
442 tamper-resistant and offers more security features, but no ECC
443 support.
444- `Yubikey 4`_: proprietary hardware and software, but cheaper than
445 Nitrokey Pro and comes available in the USB-C form that is more useful
446 with newer laptops. Offers additional security features such as FIDO
447 U2F, but no ECC.
448
449`LWN has a good review`_ of some of the above models, as well as several
450others. If you want to use ECC keys, your best bet among commercially
451available devices is the Nitrokey Start.
452
453.. _`Nitrokey Start`: https://shop.nitrokey.com/shop/product/nitrokey-start-6
454.. _`Nitrokey Pro`: https://shop.nitrokey.com/shop/product/nitrokey-pro-3
455.. _`Yubikey 4`: https://www.yubico.com/product/yubikey-4-series/
456.. _Gnuk: http://www.fsij.org/doc-gnuk/
457.. _`LWN has a good review`: https://lwn.net/Articles/736231/
458
459Configure your smartcard device
460-------------------------------
461
462Your smartcard device should Just Work (TM) the moment you plug it into
463any modern Linux workstation. You can verify it by running::
464
465 $ gpg --card-status
466
467If you see full smartcard details, then you are good to go.
468Unfortunately, troubleshooting all possible reasons why things may not
469be working for you is way beyond the scope of this guide. If you are
470having trouble getting the card to work with GnuPG, please seek help via
471usual support channels.
472
473To configure your smartcard, you will need to use the GnuPG menu system, as
474there are no convenient command-line switches::
475
476 $ gpg --card-edit
477 [...omitted...]
478 gpg/card> admin
479 Admin commands are allowed
480 gpg/card> passwd
481
482You should set the user PIN (1), Admin PIN (3), and the Reset Code (4).
483Please make sure to record and store these in a safe place -- especially
484the Admin PIN and the Reset Code (which allows you to completely wipe
485the smartcard). You so rarely need to use the Admin PIN, that you will
486inevitably forget what it is if you do not record it.
487
488Getting back to the main card menu, you can also set other values (such
489as name, sex, login data, etc), but it's not necessary and will
490additionally leak information about your smartcard should you lose it.
491
492.. note::
493
494 Despite having the name "PIN", neither the user PIN nor the admin
495 PIN on the card need to be numbers.
496
497Move the subkeys to your smartcard
498----------------------------------
499
500Exit the card menu (using "q") and save all changes. Next, let's move
501your subkeys onto the smartcard. You will need both your PGP key
502passphrase and the admin PIN of the card for most operations::
503
504 $ gpg --edit-key [fpr]
505
506 Secret subkeys are available.
507
508 pub rsa2048/AAAABBBBCCCCDDDD
509 created: 2018-01-23 expires: 2020-01-23 usage: SC
510 trust: ultimate validity: ultimate
511 ssb rsa2048/1111222233334444
512 created: 2018-01-23 expires: never usage: E
513 ssb ed25519/5555666677778888
514 created: 2017-12-07 expires: never usage: S
515 [ultimate] (1). Alice Dev <adev@kernel.org>
516
517 gpg>
518
519Using ``--edit-key`` puts us into the menu mode again, and you will
520notice that the key listing is a little different. From here on, all
521commands are done from inside this menu mode, as indicated by ``gpg>``.
522
523First, let's select the key we'll be putting onto the card -- you do
524this by typing ``key 1`` (it's the first one in the listing, the **[E]**
525subkey)::
526
527 gpg> key 1
528
529In the output, you should now see ``ssb*`` on the **[E]** key. The ``*``
530indicates which key is currently "selected." It works as a *toggle*,
531meaning that if you type ``key 1`` again, the ``*`` will disappear and
532the key will not be selected any more.
533
534Now, let's move that key onto the smartcard::
535
536 gpg> keytocard
537 Please select where to store the key:
538 (2) Encryption key
539 Your selection? 2
540
541Since it's our **[E]** key, it makes sense to put it into the Encryption
542slot. When you submit your selection, you will be prompted first for
543your PGP key passphrase, and then for the admin PIN. If the command
544returns without an error, your key has been moved.
545
546**Important**: Now type ``key 1`` again to unselect the first key, and
547``key 2`` to select the **[S]** key::
548
549 gpg> key 1
550 gpg> key 2
551 gpg> keytocard
552 Please select where to store the key:
553 (1) Signature key
554 (3) Authentication key
555 Your selection? 1
556
557You can use the **[S]** key both for Signature and Authentication, but
558we want to make sure it's in the Signature slot, so choose (1). Once
559again, if your command returns without an error, then the operation was
560successful::
561
562 gpg> q
563 Save changes? (y/N) y
564
565Saving the changes will delete the keys you moved to the card from your
566home directory (but it's okay, because we have them in our backups
567should we need to do this again for a replacement smartcard).
568
569Verifying that the keys were moved
570~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
571
572If you perform ``--list-secret-keys`` now, you will see a subtle
573difference in the output::
574
575 $ gpg --list-secret-keys
576 sec# rsa2048 2018-01-24 [SC] [expires: 2020-01-24]
577 000000000000000000000000AAAABBBBCCCCDDDD
578 uid [ultimate] Alice Dev <adev@kernel.org>
579 ssb> rsa2048 2018-01-24 [E] [expires: 2020-01-24]
580 ssb> ed25519 2018-01-24 [S]
581
582The ``>`` in the ``ssb>`` output indicates that the subkey is only
583available on the smartcard. If you go back into your secret keys
584directory and look at the contents there, you will notice that the
585``.key`` files there have been replaced with stubs::
586
587 $ cd ~/.gnupg/private-keys-v1.d
588 $ strings *.key | grep 'private-key'
589
590The output should contain ``shadowed-private-key`` to indicate that
591these files are only stubs and the actual content is on the smartcard.
592
593Verifying that the smartcard is functioning
594~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
595
596To verify that the smartcard is working as intended, you can create a
597signature::
598
599 $ echo "Hello world" | gpg --clearsign > /tmp/test.asc
600 $ gpg --verify /tmp/test.asc
601
602This should ask for your smartcard PIN on your first command, and then
603show "Good signature" after you run ``gpg --verify``.
604
605Congratulations, you have successfully made it extremely difficult to
606steal your digital developer identity!
607
608Other common GnuPG operations
609-----------------------------
610
611Here is a quick reference for some common operations you'll need to do
612with your PGP key.
613
614Mounting your master key offline storage
615~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
616
617You will need your master key for any of the operations below, so you
618will first need to mount your backup offline storage and tell GnuPG to
619use it::
620
621 $ export GNUPGHOME=/media/disk/foo/gnupg-backup
622 $ gpg --list-secret-keys
623
624You want to make sure that you see ``sec`` and not ``sec#`` in the
625output (the ``#`` means the key is not available and you're still using
626your regular home directory location).
627
628Extending key expiration date
629~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
630
631The master key has the default expiration date of 2 years from the date
632of creation. This is done both for security reasons and to make obsolete
633keys eventually disappear from keyservers.
634
635To extend the expiration on your key by a year from current date, just
636run::
637
638 $ gpg --quick-set-expire [fpr] 1y
639
640You can also use a specific date if that is easier to remember (e.g.
641your birthday, January 1st, or Canada Day)::
642
643 $ gpg --quick-set-expire [fpr] 2020-07-01
644
645Remember to send the updated key back to keyservers::
646
647 $ gpg --send-key [fpr]
648
649Updating your work directory after any changes
650~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
651
652After you make any changes to your key using the offline storage, you will
653want to import these changes back into your regular working directory::
654
655 $ gpg --export | gpg --homedir ~/.gnupg --import
656 $ unset GNUPGHOME
657
658
659Using PGP with Git
660==================
661
662One of the core features of Git is its decentralized nature -- once a
663repository is cloned to your system, you have full history of the
664project, including all of its tags, commits and branches. However, with
665hundreds of cloned repositories floating around, how does anyone verify
666that their copy of linux.git has not been tampered with by a malicious
667third party?
668
669Or what happens if a backdoor is discovered in the code and the "Author"
670line in the commit says it was done by you, while you're pretty sure you
671had `nothing to do with it`_?
672
673To address both of these issues, Git introduced PGP integration. Signed
674tags prove the repository integrity by assuring that its contents are
675exactly the same as on the workstation of the developer who created the
676tag, while signed commits make it nearly impossible for someone to
677impersonate you without having access to your PGP keys.
678
679.. _`nothing to do with it`: https://github.com/jayphelps/git-blame-someone-else
680
681Configure git to use your PGP key
682---------------------------------
683
684If you only have one secret key in your keyring, then you don't really
685need to do anything extra, as it becomes your default key. However, if
686you happen to have multiple secret keys, you can tell git which key
687should be used (``[fpr]`` is the fingerprint of your key)::
688
689 $ git config --global user.signingKey [fpr]
690
691**IMPORTANT**: If you have a distinct ``gpg2`` command, then you should
692tell git to always use it instead of the legacy ``gpg`` from version 1::
693
694 $ git config --global gpg.program gpg2
695
696How to work with signed tags
697----------------------------
698
699To create a signed tag, simply pass the ``-s`` switch to the tag
700command::
701
702 $ git tag -s [tagname]
703
704Our recommendation is to always sign git tags, as this allows other
705developers to ensure that the git repository they are pulling from has
706not been maliciously altered.
707
708How to verify signed tags
709~~~~~~~~~~~~~~~~~~~~~~~~~
710
711To verify a signed tag, simply use the ``verify-tag`` command::
712
713 $ git verify-tag [tagname]
714
715If you are pulling a tag from another fork of the project repository,
716git should automatically verify the signature at the tip you're pulling
717and show you the results during the merge operation::
718
719 $ git pull [url] tags/sometag
720
721The merge message will contain something like this::
722
723 Merge tag 'sometag' of [url]
724
725 [Tag message]
726
727 # gpg: Signature made [...]
728 # gpg: Good signature from [...]
729
730If you are verifying someone else's git tag, then you will need to
731import their PGP key. Please refer to the
732":ref:`verify_identities`" section below.
733
734Configure git to always sign annotated tags
735~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
736
737Chances are, if you're creating an annotated tag, you'll want to sign
738it. To force git to always sign annotated tags, you can set a global
739configuration option::
740
741 $ git config --global tag.forceSignAnnotated true
742
743How to work with signed commits
744-------------------------------
745
746It is easy to create signed commits, but it is much more difficult to
747use them in Linux kernel development, since it relies on patches sent to
748the mailing list, and this workflow does not preserve PGP commit
749signatures. Furthermore, when rebasing your repository to match
750upstream, even your own PGP commit signatures will end up discarded. For
751this reason, most kernel developers don't bother signing their commits
752and will ignore signed commits in any external repositories that they
753rely upon in their work.
754
755However, if you have your working git tree publicly available at some
756git hosting service (kernel.org, infradead.org, ozlabs.org, or others),
757then the recommendation is that you sign all your git commits even if
758upstream developers do not directly benefit from this practice.
759
760We recommend this for the following reasons:
761
7621. Should there ever be a need to perform code forensics or track code
763 provenance, even externally maintained trees carrying PGP commit
764 signatures will be valuable for such purposes.
7652. If you ever need to re-clone your local repository (for example,
766 after a disk failure), this lets you easily verify the repository
767 integrity before resuming your work.
7683. If someone needs to cherry-pick your commits, this allows them to
769 quickly verify their integrity before applying them.
770
771Creating signed commits
772~~~~~~~~~~~~~~~~~~~~~~~
773
774To create a signed commit, you just need to pass the ``-S`` flag to the
775``git commit`` command (it's capital ``-S`` due to collision with
776another flag)::
777
778 $ git commit -S
779
780Configure git to always sign commits
781~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
782
783You can tell git to always sign commits::
784
785 git config --global commit.gpgSign true
786
787.. note::
788
789 Make sure you configure ``gpg-agent`` before you turn this on.
790
791.. _verify_identities:
792
793How to verify kernel developer identities
794=========================================
795
796Signing tags and commits is easy, but how does one go about verifying
797that the key used to sign something belongs to the actual kernel
798developer and not to a malicious imposter?
799
800Configure auto-key-retrieval using WKD and DANE
801-----------------------------------------------
802
803If you are not already someone with an extensive collection of other
804developers' public keys, then you can jumpstart your keyring by relying
805on key auto-discovery and auto-retrieval. GnuPG can piggyback on other
806delegated trust technologies, namely DNSSEC and TLS, to get you going if
807the prospect of starting your own Web of Trust from scratch is too
808daunting.
809
810Add the following to your ``~/.gnupg/gpg.conf``::
811
812 auto-key-locate wkd,dane,local
813 auto-key-retrieve
814
815DNS-Based Authentication of Named Entities ("DANE") is a method for
816publishing public keys in DNS and securing them using DNSSEC signed
817zones. Web Key Directory ("WKD") is the alternative method that uses
818https lookups for the same purpose. When using either DANE or WKD for
819looking up public keys, GnuPG will validate DNSSEC or TLS certificates,
820respectively, before adding auto-retrieved public keys to your local
821keyring.
822
823Kernel.org publishes the WKD for all developers who have kernel.org
824accounts. Once you have the above changes in your ``gpg.conf``, you can
825auto-retrieve the keys for Linus Torvalds and Greg Kroah-Hartman (if you
826don't already have them)::
827
828 $ gpg --locate-keys torvalds@kernel.org gregkh@kernel.org
829
830If you have a kernel.org account, then you should `add the kernel.org
831UID to your key`_ to make WKD more useful to other kernel developers.
832
833.. _`add the kernel.org UID to your key`: https://korg.wiki.kernel.org/userdoc/mail#adding_a_kernelorg_uid_to_your_pgp_key
834
835Web of Trust (WOT) vs. Trust on First Use (TOFU)
836------------------------------------------------
837
838PGP incorporates a trust delegation mechanism known as the "Web of
839Trust." At its core, this is an attempt to replace the need for
840centralized Certification Authorities of the HTTPS/TLS world. Instead of
841various software makers dictating who should be your trusted certifying
842entity, PGP leaves this responsibility to each user.
843
844Unfortunately, very few people understand how the Web of Trust works.
845While it remains an important aspect of the OpenPGP specification,
846recent versions of GnuPG (2.2 and above) have implemented an alternative
847mechanism called "Trust on First Use" (TOFU). You can think of TOFU as
848"the SSH-like approach to trust." With SSH, the first time you connect
849to a remote system, its key fingerprint is recorded and remembered. If
850the key changes in the future, the SSH client will alert you and refuse
851to connect, forcing you to make a decision on whether you choose to
852trust the changed key or not. Similarly, the first time you import
853someone's PGP key, it is assumed to be valid. If at any point in the
854future GnuPG comes across another key with the same identity, both the
855previously imported key and the new key will be marked as invalid and
856you will need to manually figure out which one to keep.
857
858We recommend that you use the combined TOFU+PGP trust model (which is
859the new default in GnuPG v2). To set it, add (or modify) the
860``trust-model`` setting in ``~/.gnupg/gpg.conf``::
861
862 trust-model tofu+pgp
863
864How to use keyservers (more) safely
865-----------------------------------
866
867If you get a "No public key" error when trying to validate someone's
868tag, then you should attempt to lookup that key using a keyserver. It is
869important to keep in mind that there is absolutely no guarantee that the
870key you retrieve from PGP keyservers belongs to the actual person --
871that much is by design. You are supposed to use the Web of Trust to
872establish key validity.
873
874How to properly maintain the Web of Trust is beyond the scope of this
875document, simply because doing it properly requires both effort and
876dedication that tends to be beyond the caring threshold of most human
877beings. Here are some shortcuts that will help you reduce the risk of
878importing a malicious key.
879
880First, let's say you've tried to run ``git verify-tag`` but it returned
881an error saying the key is not found::
882
883 $ git verify-tag sunxi-fixes-for-4.15-2
884 gpg: Signature made Sun 07 Jan 2018 10:51:55 PM EST
885 gpg: using RSA key DA73759BF8619E484E5A3B47389A54219C0F2430
886 gpg: issuer "wens@...org"
887 gpg: Can't check signature: No public key
888
889Let's query the keyserver for more info about that key fingerprint (the
890fingerprint probably belongs to a subkey, so we can't use it directly
891without finding out the ID of the master key it is associated with)::
892
893 $ gpg --search DA73759BF8619E484E5A3B47389A54219C0F2430
894 gpg: data source: hkp://keys.gnupg.net
895 (1) Chen-Yu Tsai <wens@...org>
896 4096 bit RSA key C94035C21B4F2AEB, created: 2017-03-14, expires: 2019-03-15
897 Keys 1-1 of 1 for "DA73759BF8619E484E5A3B47389A54219C0F2430". Enter number(s), N)ext, or Q)uit > q
898
899Locate the ID of the master key in the output, in our example
900``C94035C21B4F2AEB``. Now display the key of Linus Torvalds that you
901have on your keyring::
902
903 $ gpg --list-key torvalds@kernel.org
904 pub rsa2048 2011-09-20 [SC]
905 ABAF11C65A2970B130ABE3C479BE3E4300411886
906 uid [ unknown] Linus Torvalds <torvalds@kernel.org>
907 sub rsa2048 2011-09-20 [E]
908
909Next, open the `PGP pathfinder`_. In the "From" field, paste the key
910fingerprint of Linus Torvalds from the output above. In the "To" field,
911paste they key-id you found via ``gpg --search`` of the unknown key, and
912check the results:
913
914- `Finding paths to Linus`_
915
916If you get a few decent trust paths, then it's a pretty good indication
917that it is a valid key. You can add it to your keyring from the
918keyserver now::
919
920 $ gpg --recv-key C94035C21B4F2AEB
921
922This process is not perfect, and you are obviously trusting the
923administrators of the PGP Pathfinder service to not be malicious (in
924fact, this goes against :ref:`devs_not_infra`). However, if you
925do not carefully maintain your own web of trust, then it is a marked
926improvement over blindly trusting keyservers.
927
928.. _`PGP pathfinder`: https://pgp.cs.uu.nl/
929.. _`Finding paths to Linus`: https://pgp.cs.uu.nl/paths/79BE3E4300411886/to/C94035C21B4F2AEB.html