treewide: remove redundant IS_ERR() before error code check
[linux/fpc-iii.git] / Documentation / process / maintainer-pgp-guide.rst
blob17db11b7ed48ea5c883b873ad4a638252f8579ab
1 .. _pgpguide:
3 ===========================
4 Kernel Maintainer PGP guide
5 ===========================
7 :Author: Konstantin Ryabitsev <konstantin@linuxfoundation.org>
9 This document is aimed at Linux kernel developers, and especially at
10 subsystem maintainers. It contains a subset of information discussed in
11 the more general "`Protecting Code Integrity`_" guide published by the
12 Linux Foundation. Please read that document for more in-depth discussion
13 on some of the topics mentioned in this guide.
15 .. _`Protecting Code Integrity`: https://github.com/lfit/itpol/blob/master/protecting-code-integrity.md
17 The role of PGP in Linux Kernel development
18 ===========================================
20 PGP helps ensure the integrity of the code that is produced by the Linux
21 kernel development community and, to a lesser degree, establish trusted
22 communication channels between developers via PGP-signed email exchange.
24 The Linux kernel source code is available in two main formats:
26 - Distributed source repositories (git)
27 - Periodic release snapshots (tarballs)
29 Both git repositories and tarballs carry PGP signatures of the kernel
30 developers who create official kernel releases. These signatures offer a
31 cryptographic guarantee that downloadable versions made available via
32 kernel.org or any other mirrors are identical to what these developers
33 have on their workstations. To this end:
35 - git repositories provide PGP signatures on all tags
36 - tarballs provide detached PGP signatures with all downloads
38 .. _devs_not_infra:
40 Trusting the developers, not infrastructure
41 -------------------------------------------
43 Ever since the 2011 compromise of core kernel.org systems, the main
44 operating principle of the Kernel Archives project has been to assume
45 that any part of the infrastructure can be compromised at any time. For
46 this reason, the administrators have taken deliberate steps to emphasize
47 that trust must always be placed with developers and never with the code
48 hosting infrastructure, regardless of how good the security practices
49 for the latter may be.
51 The above guiding principle is the reason why this guide is needed. We
52 want to make sure that by placing trust into developers we do not simply
53 shift the blame for potential future security incidents to someone else.
54 The goal is to provide a set of guidelines developers can use to create
55 a secure working environment and safeguard the PGP keys used to
56 establish the integrity of the Linux kernel itself.
58 .. _pgp_tools:
60 PGP tools
61 =========
63 Use GnuPG v2
64 ------------
66 Your distro should already have GnuPG installed by default, you just
67 need to verify that you are using version 2.x and not the legacy 1.4
68 release -- many distributions still package both, with the default
69 ``gpg`` command invoking GnuPG v.1. To check, run::
71     $ gpg --version | head -n1
73 If 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
75 gnupg2 package)::
77     $ gpg2 --version | head -n1
79 If you see ``gpg (GnuPG) 2.x.x``, then you are good to go. This guide
80 will assume you have the version 2.2 of GnuPG (or later). If you are
81 using version 2.0 of GnuPG, then some of the commands in this guide will
82 not work, and you should consider installing the latest 2.2 version of
83 GnuPG. Versions of gnupg-2.1.11 and later should be compatible for the
84 purposes of this guide as well.
86 If you have both ``gpg`` and ``gpg2`` commands, you should make sure you
87 are always using GnuPG v2, not the legacy version. You can enforce this
88 by setting the appropriate alias::
90     $ alias gpg=gpg2
92 You can put that in your ``.bashrc`` to make sure it's always the case.
94 Configure gpg-agent options
95 ~~~~~~~~~~~~~~~~~~~~~~~~~~~
97 The GnuPG agent is a helper tool that will start automatically whenever
98 you use the ``gpg`` command and run in the background with the purpose
99 of caching the private key passphrase. There are two options you should
100 know in order to tweak when the passphrase should be expired from cache:
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.
110 If you find either of these defaults too short (or too long), you can
111 edit your ``~/.gnupg/gpg-agent.conf`` file to set your own values::
113     # set to 30 minutes for regular ttl, and 2 hours for max ttl
114     default-cache-ttl 1800
115     max-cache-ttl 7200
117 .. note::
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.
124 Set up a refresh cronjob
125 ~~~~~~~~~~~~~~~~~~~~~~~~
127 You will need to regularly refresh your keyring in order to get the
128 latest changes on other people's public keys, which is best done with a
129 daily cronjob::
131     @daily /usr/bin/gpg2 --refresh >/dev/null 2>&1
133 Check 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.
136 .. _master_key:
138 Protect your master PGP key
139 ===========================
141 This guide assumes that you already have a PGP key that you use for Linux
142 kernel development purposes. If you do not yet have one, please see the
143 "`Protecting Code Integrity`_" document mentioned earlier for guidance
144 on how to create a new one.
146 You should also make a new key if your current one is weaker than 2048 bits
147 (RSA).
149 Master key vs. Subkeys
150 ----------------------
152 Subkeys are fully independent PGP keypairs that are tied to the "master"
153 key using certifying key signatures (certificates). It is important to
154 understand the following:
156 1. There are no technical differences between the "master key" and "subkeys."
157 2. At creation time, we assign functional limitations to each key by
158    giving it specific capabilities.
159 3. A PGP key can have 4 capabilities:
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
166 4. A single key may have multiple capabilities.
167 5. 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.
172 The key carrying the **[C]** (certify) capability is considered the
173 "master" key because it is the only key that can be used to indicate
174 relationship with other keys. Only the **[C]** key can be used to:
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
181 By default, GnuPG creates the following when generating new keys:
183 - A master key carrying both Certify and Sign capabilities (**[SC]**)
184 - A separate subkey with the Encryption capability (**[E]**)
186 If you used the default parameters when generating your key, then that
187 is what you will have. You can verify by running ``gpg --list-secret-keys``,
188 for example::
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]
195 Any key carrying the **[C]** capability is your master key, regardless
196 of any other capabilities it may have assigned to it.
198 The long line under the ``sec`` entry is your key fingerprint --
199 whenever you see ``[fpr]`` in the examples below, that 40-character
200 string is what it refers to.
202 Ensure your passphrase is strong
203 --------------------------------
205 GnuPG uses passphrases to encrypt your private keys before storing them on
206 disk. This way, even if your ``.gnupg`` directory is leaked or stolen in
207 its entirety, the attackers cannot use your private keys without first
208 obtaining the passphrase to decrypt them.
210 It is absolutely essential that your private keys are protected by a
211 strong passphrase. To set it or change it, use::
213     $ gpg --change-passphrase [fpr]
215 Create a separate Signing subkey
216 --------------------------------
218 Our goal is to protect your master key by moving it to offline media, so
219 if you only have a combined **[SC]** key, then you should create a separate
220 signing subkey::
222     $ gpg --quick-addkey [fpr] ed25519 sign
224 Remember to tell the keyservers about this change, so others can pull down
225 your new subkey::
227     $ gpg --send-key [fpr]
229 .. note:: ECC support in GnuPG
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.
240     If for some reason you prefer to stay with RSA subkeys, just replace
241     "ed25519" with "rsa2048" in the above command. Additionally, if you
242     plan to use a hardware device that does not support ED25519 ECC
243     keys, like Nitrokey Pro or a Yubikey, then you should use
244     "nistp256" instead or "ed25519."
247 Back up your master key for disaster recovery
248 ---------------------------------------------
250 The more signatures you have on your PGP key from other developers, the
251 more reasons you have to create a backup version that lives on something
252 other than digital media, for disaster recovery reasons.
254 The best way to create a printable hardcopy of your private key is by
255 using the ``paperkey`` software written for this very purpose. See ``man
256 paperkey`` for more details on the output format and its benefits over
257 other solutions. Paperkey should already be packaged for most
258 distributions.
260 Run the following command to create a hardcopy backup of your private
261 key::
263     $ gpg --export-secret-key [fpr] | paperkey -o /tmp/key-backup.txt
265 Print out that file (or pipe the output straight to lpr), then take a
266 pen and write your passphrase on the margin of the paper. **This is
267 strongly recommended** because the key printout is still encrypted with
268 that passphrase, and if you ever change it you will not remember what it
269 used to be when you had created the backup -- *guaranteed*.
271 Put the resulting printout and the hand-written passphrase into an envelope
272 and store in a secure and well-protected place, preferably away from your
273 home, such as your bank vault.
275 .. note::
277     Your printer is probably no longer a simple dumb device connected to
278     your parallel port, but since the output is still encrypted with
279     your passphrase, printing out even to "cloud-integrated" modern
280     printers should remain a relatively safe operation. One option is to
281     change the passphrase on your master key immediately after you are
282     done with paperkey.
284 Back up your whole GnuPG directory
285 ----------------------------------
287 .. warning::
289     **!!!Do not skip this step!!!**
291 It is important to have a readily available backup of your PGP keys
292 should you need to recover them. This is different from the
293 disaster-level preparedness we did with ``paperkey``. You will also rely
294 on these external copies whenever you need to use your Certify key --
295 such as when making changes to your own key or signing other people's
296 keys after conferences and summits.
298 Start by getting a small USB "thumb" drive (preferably two!) that you
299 will use for backup purposes. You will need to encrypt them using LUKS
300 -- refer to your distro's documentation on how to accomplish this.
302 For the encryption passphrase, you can use the same one as on your
303 master key.
305 Once the encryption process is over, re-insert the USB drive and make
306 sure it gets properly mounted. Copy your entire ``.gnupg`` directory
307 over to the encrypted storage::
309     $ cp -a ~/.gnupg /media/disk/foo/gnupg-backup
311 You should now test to make sure everything still works::
313     $ gpg --homedir=/media/disk/foo/gnupg-backup --list-key [fpr]
315 If you don't get any errors, then you should be good to go. Unmount the
316 USB drive, distinctly label it so you don't blow it away next time you
317 need to use a random USB drive, and put in a safe place -- but not too
318 far away, because you'll need to use it every now and again for things
319 like editing identities, adding or revoking subkeys, or signing other
320 people's keys.
322 Remove the master key from  your homedir
323 ----------------------------------------
325 The files in our home directory are not as well protected as we like to
326 think.  They can be leaked or stolen via many different means:
328 - by accident when making quick homedir copies to set up a new workstation
329 - by systems administrator negligence or malice
330 - via poorly secured backups
331 - via malware in desktop apps (browsers, pdf viewers, etc)
332 - via coercion when crossing international borders
334 Protecting your key with a good passphrase greatly helps reduce the risk
335 of any of the above, but passphrases can be discovered via keyloggers,
336 shoulder-surfing, or any number of other means. For this reason, the
337 recommended setup is to remove your master key from your home directory
338 and store it on offline storage.
340 .. warning::
342     Please see the previous section and make sure you have backed up
343     your GnuPG directory in its entirety. What we are about to do will
344     render your key useless if you do not have a usable backup!
346 First, identify the keygrip of your master key::
348     $ gpg --with-keygrip --list-key [fpr]
350 The output will be something like this::
352     pub   rsa2048 2018-01-24 [SC] [expires: 2020-01-24]
353           000000000000000000000000AAAABBBBCCCCDDDD
354           Keygrip = 1111000000000000000000000000000000000000
355     uid           [ultimate] Alice Dev <adev@kernel.org>
356     sub   rsa2048 2018-01-24 [E] [expires: 2020-01-24]
357           Keygrip = 2222000000000000000000000000000000000000
358     sub   ed25519 2018-01-24 [S]
359           Keygrip = 3333000000000000000000000000000000000000
361 Find the keygrip entry that is beneath the ``pub`` line (right under the
362 master key fingerprint). This will correspond directly to a file in your
363 ``~/.gnupg`` directory::
365     $ cd ~/.gnupg/private-keys-v1.d
366     $ ls
367     1111000000000000000000000000000000000000.key
368     2222000000000000000000000000000000000000.key
369     3333000000000000000000000000000000000000.key
371 All you have to do is simply remove the .key file that corresponds to
372 the master keygrip::
374     $ cd ~/.gnupg/private-keys-v1.d
375     $ rm 1111000000000000000000000000000000000000.key
377 Now, if you issue the ``--list-secret-keys`` command, it will show that
378 the master key is missing (the ``#`` indicates it is not available)::
380     $ gpg --list-secret-keys
381     sec#  rsa2048 2018-01-24 [SC] [expires: 2020-01-24]
382           000000000000000000000000AAAABBBBCCCCDDDD
383     uid           [ultimate] Alice Dev <adev@kernel.org>
384     ssb   rsa2048 2018-01-24 [E] [expires: 2020-01-24]
385     ssb   ed25519 2018-01-24 [S]
387 You should also remove any ``secring.gpg`` files in the ``~/.gnupg``
388 directory, which are left over from earlier versions of GnuPG.
390 If you don't have the "private-keys-v1.d" directory
391 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
393 If you do not have a ``~/.gnupg/private-keys-v1.d`` directory, then your
394 secret keys are still stored in the legacy ``secring.gpg`` file used by
395 GnuPG v1. Making any changes to your key, such as changing the
396 passphrase or adding a subkey, should automatically convert the old
397 ``secring.gpg`` format to use ``private-keys-v1.d`` instead.
399 Once you get that done, make sure to delete the obsolete ``secring.gpg``
400 file, which still contains your private keys.
402 .. _smartcards:
404 Move the subkeys to a dedicated crypto device
405 =============================================
407 Even though the master key is now safe from being leaked or stolen, the
408 subkeys are still in your home directory. Anyone who manages to get
409 their hands on those will be able to decrypt your communication or fake
410 your signatures (if they know the passphrase). Furthermore, each time a
411 GnuPG operation is performed, the keys are loaded into system memory and
412 can be stolen from there by sufficiently advanced malware (think
413 Meltdown and Spectre).
415 The best way to completely protect your keys is to move them to a
416 specialized hardware device that is capable of smartcard operations.
418 The benefits of smartcards
419 --------------------------
421 A smartcard contains a cryptographic chip that is capable of storing
422 private keys and performing crypto operations directly on the card
423 itself. Because the key contents never leave the smartcard, the
424 operating system of the computer into which you plug in the hardware
425 device is not able to retrieve the private keys themselves. This is very
426 different from the encrypted USB storage device we used earlier for
427 backup purposes -- while that USB device is plugged in and mounted, the
428 operating system is able to access the private key contents.
430 Using external encrypted USB media is not a substitute to having a
431 smartcard-capable device.
433 Available smartcard devices
434 ---------------------------
436 Unless all your laptops and workstations have smartcard readers, the
437 easiest is to get a specialized USB device that implements smartcard
438 functionality. There are several options available:
440 - `Nitrokey Start`_: Open hardware and Free Software, based on FSI
441   Japan's `Gnuk`_. One of the few available commercial devices that
442   support ED25519 ECC keys, but offer fewest security features (such as
443   resistance to tampering or some side-channel attacks).
444 - `Nitrokey Pro 2`_: Similar to the Nitrokey Start, but more
445   tamper-resistant and offers more security features. Pro 2 supports ECC
446   cryptography (NISTP).
447 - `Yubikey 5`_: proprietary hardware and software, but cheaper than
448   Nitrokey Pro and comes available in the USB-C form that is more useful
449   with newer laptops. Offers additional security features such as FIDO
450   U2F, among others, and now finally supports ECC keys (NISTP).
452 `LWN has a good review`_ of some of the above models, as well as several
453 others. Your choice will depend on cost, shipping availability in your
454 geographical region, and open/proprietary hardware considerations.
456 .. note::
458     If you are listed in MAINTAINERS or have an account at kernel.org,
459     you `qualify for a free Nitrokey Start`_ courtesy of The Linux
460     Foundation.
462 .. _`Nitrokey Start`: https://shop.nitrokey.com/shop/product/nitrokey-start-6
463 .. _`Nitrokey Pro 2`: https://shop.nitrokey.com/shop/product/nitrokey-pro-2-3
464 .. _`Yubikey 5`: https://www.yubico.com/products/yubikey-5-overview/
465 .. _Gnuk: http://www.fsij.org/doc-gnuk/
466 .. _`LWN has a good review`: https://lwn.net/Articles/736231/
467 .. _`qualify for a free Nitrokey Start`: https://www.kernel.org/nitrokey-digital-tokens-for-kernel-developers.html
469 Configure your smartcard device
470 -------------------------------
472 Your smartcard device should Just Work (TM) the moment you plug it into
473 any modern Linux workstation. You can verify it by running::
475     $ gpg --card-status
477 If you see full smartcard details, then you are good to go.
478 Unfortunately, troubleshooting all possible reasons why things may not
479 be working for you is way beyond the scope of this guide. If you are
480 having trouble getting the card to work with GnuPG, please seek help via
481 usual support channels.
483 To configure your smartcard, you will need to use the GnuPG menu system, as
484 there are no convenient command-line switches::
486     $ gpg --card-edit
487     [...omitted...]
488     gpg/card> admin
489     Admin commands are allowed
490     gpg/card> passwd
492 You should set the user PIN (1), Admin PIN (3), and the Reset Code (4).
493 Please make sure to record and store these in a safe place -- especially
494 the Admin PIN and the Reset Code (which allows you to completely wipe
495 the smartcard). You so rarely need to use the Admin PIN, that you will
496 inevitably forget what it is if you do not record it.
498 Getting back to the main card menu, you can also set other values (such
499 as name, sex, login data, etc), but it's not necessary and will
500 additionally leak information about your smartcard should you lose it.
502 .. note::
504     Despite having the name "PIN", neither the user PIN nor the admin
505     PIN on the card need to be numbers.
507 .. warning::
509     Some devices may require that you move the subkeys onto the device
510     before you can change the passphrase. Please check the documentation
511     provided by the device manufacturer.
513 Move the subkeys to your smartcard
514 ----------------------------------
516 Exit the card menu (using "q") and save all changes. Next, let's move
517 your subkeys onto the smartcard. You will need both your PGP key
518 passphrase and the admin PIN of the card for most operations::
520     $ gpg --edit-key [fpr]
522     Secret subkeys are available.
524     pub  rsa2048/AAAABBBBCCCCDDDD
525          created: 2018-01-23  expires: 2020-01-23  usage: SC
526          trust: ultimate      validity: ultimate
527     ssb  rsa2048/1111222233334444
528          created: 2018-01-23  expires: never       usage: E
529     ssb  ed25519/5555666677778888
530          created: 2017-12-07  expires: never       usage: S
531     [ultimate] (1). Alice Dev <adev@kernel.org>
533     gpg>
535 Using ``--edit-key`` puts us into the menu mode again, and you will
536 notice that the key listing is a little different. From here on, all
537 commands are done from inside this menu mode, as indicated by ``gpg>``.
539 First, let's select the key we'll be putting onto the card -- you do
540 this by typing ``key 1`` (it's the first one in the listing, the **[E]**
541 subkey)::
543     gpg> key 1
545 In the output, you should now see ``ssb*`` on the **[E]** key. The ``*``
546 indicates which key is currently "selected." It works as a *toggle*,
547 meaning that if you type ``key 1`` again, the ``*`` will disappear and
548 the key will not be selected any more.
550 Now, let's move that key onto the smartcard::
552     gpg> keytocard
553     Please select where to store the key:
554        (2) Encryption key
555     Your selection? 2
557 Since it's our **[E]** key, it makes sense to put it into the Encryption
558 slot.  When you submit your selection, you will be prompted first for
559 your PGP key passphrase, and then for the admin PIN. If the command
560 returns without an error, your key has been moved.
562 **Important**: Now type ``key 1`` again to unselect the first key, and
563 ``key 2`` to select the **[S]** key::
565     gpg> key 1
566     gpg> key 2
567     gpg> keytocard
568     Please select where to store the key:
569        (1) Signature key
570        (3) Authentication key
571     Your selection? 1
573 You can use the **[S]** key both for Signature and Authentication, but
574 we want to make sure it's in the Signature slot, so choose (1). Once
575 again, if your command returns without an error, then the operation was
576 successful::
578     gpg> q
579     Save changes? (y/N) y
581 Saving the changes will delete the keys you moved to the card from your
582 home directory (but it's okay, because we have them in our backups
583 should we need to do this again for a replacement smartcard).
585 Verifying that the keys were moved
586 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
588 If you perform ``--list-secret-keys`` now, you will see a subtle
589 difference in the output::
591     $ gpg --list-secret-keys
592     sec#  rsa2048 2018-01-24 [SC] [expires: 2020-01-24]
593           000000000000000000000000AAAABBBBCCCCDDDD
594     uid           [ultimate] Alice Dev <adev@kernel.org>
595     ssb>  rsa2048 2018-01-24 [E] [expires: 2020-01-24]
596     ssb>  ed25519 2018-01-24 [S]
598 The ``>`` in the ``ssb>`` output indicates that the subkey is only
599 available on the smartcard. If you go back into your secret keys
600 directory and look at the contents there, you will notice that the
601 ``.key`` files there have been replaced with stubs::
603     $ cd ~/.gnupg/private-keys-v1.d
604     $ strings *.key | grep 'private-key'
606 The output should contain ``shadowed-private-key`` to indicate that
607 these files are only stubs and the actual content is on the smartcard.
609 Verifying that the smartcard is functioning
610 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
612 To verify that the smartcard is working as intended, you can create a
613 signature::
615     $ echo "Hello world" | gpg --clearsign > /tmp/test.asc
616     $ gpg --verify /tmp/test.asc
618 This should ask for your smartcard PIN on your first command, and then
619 show "Good signature" after you run ``gpg --verify``.
621 Congratulations, you have successfully made it extremely difficult to
622 steal your digital developer identity!
624 Other common GnuPG operations
625 -----------------------------
627 Here is a quick reference for some common operations you'll need to do
628 with your PGP key.
630 Mounting your master key offline storage
631 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
633 You will need your master key for any of the operations below, so you
634 will first need to mount your backup offline storage and tell GnuPG to
635 use it::
637     $ export GNUPGHOME=/media/disk/foo/gnupg-backup
638     $ gpg --list-secret-keys
640 You want to make sure that you see ``sec`` and not ``sec#`` in the
641 output (the ``#`` means the key is not available and you're still using
642 your regular home directory location).
644 Extending key expiration date
645 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
647 The master key has the default expiration date of 2 years from the date
648 of creation. This is done both for security reasons and to make obsolete
649 keys eventually disappear from keyservers.
651 To extend the expiration on your key by a year from current date, just
652 run::
654     $ gpg --quick-set-expire [fpr] 1y
656 You can also use a specific date if that is easier to remember (e.g.
657 your birthday, January 1st, or Canada Day)::
659     $ gpg --quick-set-expire [fpr] 2020-07-01
661 Remember to send the updated key back to keyservers::
663     $ gpg --send-key [fpr]
665 Updating your work directory after any changes
666 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
668 After you make any changes to your key using the offline storage, you will
669 want to import these changes back into your regular working directory::
671     $ gpg --export | gpg --homedir ~/.gnupg --import
672     $ unset GNUPGHOME
674 Using gpg-agent over ssh
675 ~~~~~~~~~~~~~~~~~~~~~~~~
677 You can forward your gpg-agent over ssh if you need to sign tags or
678 commits on a remote system. Please refer to the instructions provided
679 on the GnuPG wiki:
681 - `Agent Forwarding over SSH`_
683 It works more smoothly if you can modify the sshd server settings on the
684 remote end.
686 .. _`Agent Forwarding over SSH`: https://wiki.gnupg.org/AgentForwarding
689 Using PGP with Git
690 ==================
692 One of the core features of Git is its decentralized nature -- once a
693 repository is cloned to your system, you have full history of the
694 project, including all of its tags, commits and branches. However, with
695 hundreds of cloned repositories floating around, how does anyone verify
696 that their copy of linux.git has not been tampered with by a malicious
697 third party?
699 Or what happens if a backdoor is discovered in the code and the "Author"
700 line in the commit says it was done by you, while you're pretty sure you
701 had `nothing to do with it`_?
703 To address both of these issues, Git introduced PGP integration. Signed
704 tags prove the repository integrity by assuring that its contents are
705 exactly the same as on the workstation of the developer who created the
706 tag, while signed commits make it nearly impossible for someone to
707 impersonate you without having access to your PGP keys.
709 .. _`nothing to do with it`: https://github.com/jayphelps/git-blame-someone-else
711 Configure git to use your PGP key
712 ---------------------------------
714 If you only have one secret key in your keyring, then you don't really
715 need to do anything extra, as it becomes your default key.  However, if
716 you happen to have multiple secret keys, you can tell git which key
717 should be used (``[fpr]`` is the fingerprint of your key)::
719     $ git config --global user.signingKey [fpr]
721 **IMPORTANT**: If you have a distinct ``gpg2`` command, then you should
722 tell git to always use it instead of the legacy ``gpg`` from version 1::
724     $ git config --global gpg.program gpg2
725     $ git config --global gpgv.program gpgv2
727 How to work with signed tags
728 ----------------------------
730 To create a signed tag, simply pass the ``-s`` switch to the tag
731 command::
733     $ git tag -s [tagname]
735 Our recommendation is to always sign git tags, as this allows other
736 developers to ensure that the git repository they are pulling from has
737 not been maliciously altered.
739 How to verify signed tags
740 ~~~~~~~~~~~~~~~~~~~~~~~~~
742 To verify a signed tag, simply use the ``verify-tag`` command::
744     $ git verify-tag [tagname]
746 If you are pulling a tag from another fork of the project repository,
747 git should automatically verify the signature at the tip you're pulling
748 and show you the results during the merge operation::
750     $ git pull [url] tags/sometag
752 The merge message will contain something like this::
754     Merge tag 'sometag' of [url]
756     [Tag message]
758     # gpg: Signature made [...]
759     # gpg: Good signature from [...]
761 If you are verifying someone else's git tag, then you will need to
762 import their PGP key. Please refer to the
763 ":ref:`verify_identities`" section below.
765 .. note::
767     If you get "``gpg: Can't check signature: unknown pubkey
768     algorithm``" error, you need to tell git to use gpgv2 for
769     verification, so it properly processes signatures made by ECC keys.
770     See instructions at the start of this section.
772 Configure git to always sign annotated tags
773 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
775 Chances are, if you're creating an annotated tag, you'll want to sign
776 it. To force git to always sign annotated tags, you can set a global
777 configuration option::
779     $ git config --global tag.forceSignAnnotated true
781 How to work with signed commits
782 -------------------------------
784 It is easy to create signed commits, but it is much more difficult to
785 use them in Linux kernel development, since it relies on patches sent to
786 the mailing list, and this workflow does not preserve PGP commit
787 signatures. Furthermore, when rebasing your repository to match
788 upstream, even your own PGP commit signatures will end up discarded. For
789 this reason, most kernel developers don't bother signing their commits
790 and will ignore signed commits in any external repositories that they
791 rely upon in their work.
793 However, if you have your working git tree publicly available at some
794 git hosting service (kernel.org, infradead.org, ozlabs.org, or others),
795 then the recommendation is that you sign all your git commits even if
796 upstream developers do not directly benefit from this practice.
798 We recommend this for the following reasons:
800 1. Should there ever be a need to perform code forensics or track code
801    provenance, even externally maintained trees carrying PGP commit
802    signatures will be valuable for such purposes.
803 2. If you ever need to re-clone your local repository (for example,
804    after a disk failure), this lets you easily verify the repository
805    integrity before resuming your work.
806 3. If someone needs to cherry-pick your commits, this allows them to
807    quickly verify their integrity before applying them.
809 Creating signed commits
810 ~~~~~~~~~~~~~~~~~~~~~~~
812 To create a signed commit, you just need to pass the ``-S`` flag to the
813 ``git commit`` command (it's capital ``-S`` due to collision with
814 another flag)::
816     $ git commit -S
818 Configure git to always sign commits
819 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
821 You can tell git to always sign commits::
823     git config --global commit.gpgSign true
825 .. note::
827     Make sure you configure ``gpg-agent`` before you turn this on.
829 .. _verify_identities:
831 How to verify kernel developer identities
832 =========================================
834 Signing tags and commits is easy, but how does one go about verifying
835 that the key used to sign something belongs to the actual kernel
836 developer and not to a malicious imposter?
838 Configure auto-key-retrieval using WKD and DANE
839 -----------------------------------------------
841 If you are not already someone with an extensive collection of other
842 developers' public keys, then you can jumpstart your keyring by relying
843 on key auto-discovery and auto-retrieval. GnuPG can piggyback on other
844 delegated trust technologies, namely DNSSEC and TLS, to get you going if
845 the prospect of starting your own Web of Trust from scratch is too
846 daunting.
848 Add the following to your ``~/.gnupg/gpg.conf``::
850     auto-key-locate wkd,dane,local
851     auto-key-retrieve
853 DNS-Based Authentication of Named Entities ("DANE") is a method for
854 publishing public keys in DNS and securing them using DNSSEC signed
855 zones. Web Key Directory ("WKD") is the alternative method that uses
856 https lookups for the same purpose. When using either DANE or WKD for
857 looking up public keys, GnuPG will validate DNSSEC or TLS certificates,
858 respectively, before adding auto-retrieved public keys to your local
859 keyring.
861 Kernel.org publishes the WKD for all developers who have kernel.org
862 accounts. Once you have the above changes in your ``gpg.conf``, you can
863 auto-retrieve the keys for Linus Torvalds and Greg Kroah-Hartman (if you
864 don't already have them)::
866     $ gpg --locate-keys torvalds@kernel.org gregkh@kernel.org
868 If you have a kernel.org account, then you should `add the kernel.org
869 UID to your key`_ to make WKD more useful to other kernel developers.
871 .. _`add the kernel.org UID to your key`: https://korg.wiki.kernel.org/userdoc/mail#adding_a_kernelorg_uid_to_your_pgp_key
873 Web of Trust (WOT) vs. Trust on First Use (TOFU)
874 ------------------------------------------------
876 PGP incorporates a trust delegation mechanism known as the "Web of
877 Trust." At its core, this is an attempt to replace the need for
878 centralized Certification Authorities of the HTTPS/TLS world. Instead of
879 various software makers dictating who should be your trusted certifying
880 entity, PGP leaves this responsibility to each user.
882 Unfortunately, very few people understand how the Web of Trust works.
883 While it remains an important aspect of the OpenPGP specification,
884 recent versions of GnuPG (2.2 and above) have implemented an alternative
885 mechanism called "Trust on First Use" (TOFU). You can think of TOFU as
886 "the SSH-like approach to trust." With SSH, the first time you connect
887 to a remote system, its key fingerprint is recorded and remembered. If
888 the key changes in the future, the SSH client will alert you and refuse
889 to connect, forcing you to make a decision on whether you choose to
890 trust the changed key or not. Similarly, the first time you import
891 someone's PGP key, it is assumed to be valid. If at any point in the
892 future GnuPG comes across another key with the same identity, both the
893 previously imported key and the new key will be marked as invalid and
894 you will need to manually figure out which one to keep.
896 We recommend that you use the combined TOFU+PGP trust model (which is
897 the new default in GnuPG v2). To set it, add (or modify) the
898 ``trust-model`` setting in ``~/.gnupg/gpg.conf``::
900     trust-model tofu+pgp
902 How to use keyservers (more) safely
903 -----------------------------------
905 If you get a "No public key" error when trying to validate someone's
906 tag, then you should attempt to lookup that key using a keyserver. It is
907 important to keep in mind that there is absolutely no guarantee that the
908 key you retrieve from PGP keyservers belongs to the actual person --
909 that much is by design. You are supposed to use the Web of Trust to
910 establish key validity.
912 How to properly maintain the Web of Trust is beyond the scope of this
913 document, simply because doing it properly requires both effort and
914 dedication that tends to be beyond the caring threshold of most human
915 beings. Here are some shortcuts that will help you reduce the risk of
916 importing a malicious key.
918 First, let's say you've tried to run ``git verify-tag`` but it returned
919 an error saying the key is not found::
921     $ git verify-tag sunxi-fixes-for-4.15-2
922     gpg: Signature made Sun 07 Jan 2018 10:51:55 PM EST
923     gpg:                using RSA key DA73759BF8619E484E5A3B47389A54219C0F2430
924     gpg:                issuer "wens@...org"
925     gpg: Can't check signature: No public key
927 Let's query the keyserver for more info about that key fingerprint (the
928 fingerprint probably belongs to a subkey, so we can't use it directly
929 without finding out the ID of the master key it is associated with)::
931     $ gpg --search DA73759BF8619E484E5A3B47389A54219C0F2430
932     gpg: data source: hkp://keys.gnupg.net
933     (1) Chen-Yu Tsai <wens@...org>
934           4096 bit RSA key C94035C21B4F2AEB, created: 2017-03-14, expires: 2019-03-15
935     Keys 1-1 of 1 for "DA73759BF8619E484E5A3B47389A54219C0F2430".  Enter number(s), N)ext, or Q)uit > q
937 Locate the ID of the master key in the output, in our example
938 ``C94035C21B4F2AEB``. Now display the key of Linus Torvalds that you
939 have on your keyring::
941     $ gpg --list-key torvalds@kernel.org
942     pub   rsa2048 2011-09-20 [SC]
943           ABAF11C65A2970B130ABE3C479BE3E4300411886
944     uid           [ unknown] Linus Torvalds <torvalds@kernel.org>
945     sub   rsa2048 2011-09-20 [E]
947 Next, open the `PGP pathfinder`_. In the "From" field, paste the key
948 fingerprint of Linus Torvalds from the output above. In the "To" field,
949 paste the key-id you found via ``gpg --search`` of the unknown key, and
950 check the results:
952 - `Finding paths to Linus`_
954 If you get a few decent trust paths, then it's a pretty good indication
955 that it is a valid key. You can add it to your keyring from the
956 keyserver now::
958     $ gpg --recv-key C94035C21B4F2AEB
960 This process is not perfect, and you are obviously trusting the
961 administrators of the PGP Pathfinder service to not be malicious (in
962 fact, this goes against :ref:`devs_not_infra`). However, if you
963 do not carefully maintain your own web of trust, then it is a marked
964 improvement over blindly trusting keyservers.
966 .. _`PGP pathfinder`: https://pgp.cs.uu.nl/
967 .. _`Finding paths to Linus`: https://pgp.cs.uu.nl/paths/79BE3E4300411886/to/C94035C21B4F2AEB.html