€•,Œsphinx.addnodes”Œdocument”“”)�”}”(Œ rawsource”Œ”Œchildren”]”(Œ translations”Œ LanguagesNode”“”)�”}”(hhh]”(hŒ pending_xref”“”)�”}”(hhh]”Œdocutils.nodes”ŒText”“”ŒChinese (Simplified)”…”�”}”Œparent”hsbaŒ attributes”}”(Œids”]”Œclasses”]”Œnames”]”Œdupnames”]”Œbackrefs”]”Œ refdomain”Œstd”Œreftype”Œdoc”Œ reftarget”Œ0/translations/zh_CN/process/maintainer-pgp-guide”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)�”}”(hhh]”hŒChinese (Traditional)”…”�”}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ0/translations/zh_TW/process/maintainer-pgp-guide”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒItalian”…”�”}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ0/translations/it_IT/process/maintainer-pgp-guide”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒJapanese”…”�”}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ0/translations/ja_JP/process/maintainer-pgp-guide”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒKorean”…”�”}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ0/translations/ko_KR/process/maintainer-pgp-guide”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒPortuguese (Brazilian)”…”�”}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ0/translations/pt_BR/process/maintainer-pgp-guide”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒSpanish”…”�”}”hh–sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ0/translations/sp_SP/process/maintainer-pgp-guide”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒEnglish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒcomment”“”)�”}”(hŒ SPDX-License-Identifier: GPL-2.0”h]”hŒ SPDX-License-Identifier: GPL-2.0”…”�”}”hh·sbah}”(h]”h ]”h"]”h$]”h&]”Œ xml:space”Œpreserve”uh1hµhhh²hh³ŒJ/var/lib/git/docbuild/linux/Documentation/process/maintainer-pgp-guide.rst”h´KubhŒtarget”“”)�”}”(hŒ .. _pgpguide:”h]”h}”(h]”h ]”h"]”h$]”h&]”Œrefid”Œpgpguide”uh1hÈh´Khhh²hh³hÇubhŒsection”“”)�”}”(hhh]”(hŒtitle”“”)�”}”(hŒKernel Maintainer PGP guide”h]”hŒKernel Maintainer PGP guide”…”�”}”(hhÝh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÛhhØh²hh³hÇh´KubhŒ field_list”“”)�”}”(hhh]”hŒfield”“”)�”}”(hhh]”(hŒ field_name”“”)�”}”(hŒAuthor”h]”hŒAuthor”…”�”}”(hh÷h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hõhhòh³hÇh´KubhŒ field_body”“”)�”}”(hŒ6Konstantin Ryabitsev ”h]”hŒ paragraph”“”)�”}”(hŒ5Konstantin Ryabitsev ”h]”(hŒKonstantin Ryabitsev <”…”�”}”(hj h²hh³Nh´NubhŒ reference”“”)�”}”(hŒkonstantin@linuxfoundation.org”h]”hŒkonstantin@linuxfoundation.org”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”Œ%mailto:konstantin@linuxfoundation.org”uh1jhj ubhŒ>”…”�”}”(hj h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´K hjubah}”(h]”h ]”h"]”h$]”h&]”uh1jhhòubeh}”(h]”h ]”h"]”h$]”h&]”uh1hðh³hÇh´K hhíh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1hëhhØh²hh³hÇh´K ubj )�”}”(hXKThis document is aimed at Linux kernel developers, and especially at subsystem maintainers. It contains a subset of information discussed in the more general "`Protecting Code Integrity`_" guide published by the Linux Foundation. Please read that document for more in-depth discussion on some of the topics mentioned in this guide.”h]”(hŒ¡This document is aimed at Linux kernel developers, and especially at subsystem maintainers. It contains a subset of information discussed in the more general “”…”�”}”(hjCh²hh³Nh´Nubj)�”}”(hŒ`Protecting Code Integrity`_”h]”hŒProtecting Code Integrity”…”�”}”(hjKh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”ŒProtecting Code Integrity”Œrefuri”ŒFhttps://github.com/lfit/itpol/blob/master/protecting-code-integrity.md”uh1jhjCŒresolved”KubhŒ’â€� guide published by the Linux Foundation. Please read that document for more in-depth discussion on some of the topics mentioned in this guide.”…”�”}”(hjCh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´K hhØh²hubhÉ)�”}”(hŒg.. _`Protecting Code Integrity`: https://github.com/lfit/itpol/blob/master/protecting-code-integrity.md”h]”h}”(h]”Œprotecting-code-integrity”ah ]”h"]”Œprotecting code integrity”ah$]”h&]”j[j\uh1hÈh´KhhØh²hh³hÇŒ referenced”Kubh×)�”}”(hhh]”(hÜ)�”}”(hŒ+The role of PGP in Linux Kernel development”h]”hŒ+The role of PGP in Linux Kernel development”…”�”}”(hjxh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÛhjuh²hh³hÇh´Kubj )�”}”(hŒÙPGP helps ensure the integrity of the code that is produced by the Linux kernel development community and, to a lesser degree, establish trusted communication channels between developers via PGP-signed email exchange.”h]”hŒÙPGP helps ensure the integrity of the code that is produced by the Linux kernel development community and, to a lesser degree, establish trusted communication channels between developers via PGP-signed email exchange.”…”�”}”(hj†h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´Khjuh²hubj )�”}”(hŒ>The Linux kernel source code is available in two main formats:”h]”hŒ>The Linux kernel source code is available in two main formats:”…”�”}”(hj”h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´Khjuh²hubhŒ bullet_list”“”)�”}”(hhh]”(hŒ list_item”“”)�”}”(hŒ%Distributed source repositories (git)”h]”j )�”}”(hj«h]”hŒ%Distributed source repositories (git)”…”�”}”(hj­h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´Khj©ubah}”(h]”h ]”h"]”h$]”h&]”uh1j§hj¤h²hh³hÇh´Nubj¨)�”}”(hŒ&Periodic release snapshots (tarballs) ”h]”j )�”}”(hŒ%Periodic release snapshots (tarballs)”h]”hŒ%Periodic release snapshots (tarballs)”…”�”}”(hjÄh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´KhjÀubah}”(h]”h ]”h"]”h$]”h&]”uh1j§hj¤h²hh³hÇh´Nubeh}”(h]”h ]”h"]”h$]”h&]”Œbullet”Œ-”uh1j¢h³hÇh´Khjuh²hubj )�”}”(hXDBoth git repositories and tarballs carry PGP signatures of the kernel developers who create official kernel releases. These signatures offer a cryptographic guarantee that downloadable versions made available via kernel.org or any other mirrors are identical to what these developers have on their workstations. To this end:”h]”hXDBoth git repositories and tarballs carry PGP signatures of the kernel developers who create official kernel releases. These signatures offer a cryptographic guarantee that downloadable versions made available via kernel.org or any other mirrors are identical to what these developers have on their workstations. To this end:”…”�”}”(hjàh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´Khjuh²hubj£)�”}”(hhh]”(j¨)�”}”(hŒ3git repositories provide PGP signatures on all tags”h]”j )�”}”(hjóh]”hŒ3git repositories provide PGP signatures on all tags”…”�”}”(hjõh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´K%hjñubah}”(h]”h ]”h"]”h$]”h&]”uh1j§hjîh²hh³hÇh´Nubj¨)�”}”(hŒ ssb cv25519 2022-12-20 [E] [expires: 2024-12-19]”h]”hŒÊsec ed25519 2022-12-20 [SC] [expires: 2024-12-19] 000000000000000000000000AAAABBBBCCCCDDDD uid [ultimate] Alice Dev ssb cv25519 2022-12-20 [E] [expires: 2024-12-19]”…”�”}”hj²sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j®h³hÇh´K­hjh²hubj )�”}”(hŒ¡The long line under the ``sec`` entry is your key fingerprint -- whenever you see ``[fpr]`` in the examples below, that 40-character string is what it refers to.”h]”(hŒThe long line under the ”…”�”}”(hjÀh²hh³Nh´Nubjæ)�”}”(hŒ``sec``”h]”hŒsec”…”�”}”(hjÈh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jåhjÀubhŒ3 entry is your key fingerprint -- whenever you see ”…”�”}”(hjÀh²hh³Nh´Nubjæ)�”}”(hŒ ``[fpr]``”h]”hŒ[fpr]”…”�”}”(hjÚh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jåhjÀubhŒF in the examples below, that 40-character string is what it refers to.”…”�”}”(hjÀh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´K²hjh²hubeh}”(h]”Œunderstanding-pgp-subkeys”ah ]”h"]”Œunderstanding pgp subkeys”ah$]”h&]”uh1hÖhjÂh²hh³hÇh´Kzubh×)�”}”(hhh]”(hÜ)�”}”(hŒ Ensure your passphrase is strong”h]”hŒ Ensure your passphrase is strong”…”�”}”(hjýh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÛhjúh²hh³hÇh´K·ubj )�”}”(hXGnuPG uses passphrases to encrypt your private keys before storing them on disk. This way, even if your ``.gnupg`` directory is leaked or stolen in its entirety, the attackers cannot use your private keys without first obtaining the passphrase to decrypt them.”h]”(hŒhGnuPG uses passphrases to encrypt your private keys before storing them on disk. This way, even if your ”…”�”}”(hj h²hh³Nh´Nubjæ)�”}”(hŒ ``.gnupg``”h]”hŒ.gnupg”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jåhj ubhŒ’ directory is leaked or stolen in its entirety, the attackers cannot use your private keys without first obtaining the passphrase to decrypt them.”…”�”}”(hj h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´K¹hjúh²hubj )�”}”(hŒuIt is absolutely essential that your private keys are protected by a strong passphrase. To set it or change it, use::”h]”hŒtIt is absolutely essential that your private keys are protected by a strong passphrase. To set it or change it, use:”…”�”}”(hj+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´K¾hjúh²hubj¯)�”}”(hŒ$ gpg --change-passphrase [fpr]”h]”hŒ$ gpg --change-passphrase [fpr]”…”�”}”hj9sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j®h³hÇh´KÁhjúh²hubeh}”(h]”Œ ensure-your-passphrase-is-strong”ah ]”h"]”Œ ensure your passphrase is strong”ah$]”h&]”uh1hÖhjÂh²hh³hÇh´K·ubh×)�”}”(hhh]”(hÜ)�”}”(hŒ Create a separate Signing subkey”h]”hŒ Create a separate Signing subkey”…”�”}”(hjRh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÛhjOh²hh³hÇh´KÄubj )�”}”(hŒ¦Our goal is to protect your Certify key by moving it to offline media, so if you only have a combined **[SC]** key, then you should create a separate signing subkey::”h]”(hŒfOur goal is to protect your Certify key by moving it to offline media, so if you only have a combined ”…”�”}”(hj`h²hh³Nh´Nubj-)�”}”(hŒ**[SC]**”h]”hŒ[SC]”…”�”}”(hjhh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j,hj`ubhŒ7 key, then you should create a separate signing subkey:”…”�”}”(hj`h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´KÆhjOh²hubj¯)�”}”(hŒ'$ gpg --quick-addkey [fpr] ed25519 sign”h]”hŒ'$ gpg --quick-addkey [fpr] ed25519 sign”…”�”}”hj€sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j®h³hÇh´KÊhjOh²hubeh}”(h]”Œ create-a-separate-signing-subkey”ah ]”h"]”Œ create a separate signing subkey”ah$]”h&]”uh1hÖhjÂh²hh³hÇh´KÄubh×)�”}”(hhh]”(hÜ)�”}”(hŒ.Back up your Certify key for disaster recovery”h]”hŒ.Back up your Certify key for disaster recovery”…”�”}”(hj™h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÛhj–h²hh³hÇh´KÍubj )�”}”(hŒÉThe more signatures you have on your PGP key from other developers, the more reasons you have to create a backup version that lives on something other than digital media, for disaster recovery reasons.”h]”hŒÉThe more signatures you have on your PGP key from other developers, the more reasons you have to create a backup version that lives on something other than digital media, for disaster recovery reasons.”…”�”}”(hj§h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´KÏhj–h²hubj )�”}”(hX A good way to create a printable hardcopy of your private key is by using the ``paperkey`` software written for this very purpose. See ``man paperkey`` for more details on the output format and its benefits over other solutions. Paperkey should already be packaged for most distributions.”h]”(hŒNA good way to create a printable hardcopy of your private key is by using the ”…”�”}”(hjµh²hh³Nh´Nubjæ)�”}”(hŒ ``paperkey``”h]”hŒpaperkey”…”�”}”(hj½h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jåhjµubhŒ- software written for this very purpose. See ”…”�”}”(hjµh²hh³Nh´Nubjæ)�”}”(hŒ``man paperkey``”h]”hŒ man paperkey”…”�”}”(hjÏh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jåhjµubhŒ‰ for more details on the output format and its benefits over other solutions. Paperkey should already be packaged for most distributions.”…”�”}”(hjµh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´KÓhj–h²hubj )�”}”(hŒKRun the following command to create a hardcopy backup of your private key::”h]”hŒJRun the following command to create a hardcopy backup of your private key:”…”�”}”(hjçh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´KÙhj–h²hubj¯)�”}”(hŒA$ gpg --export-secret-key [fpr] | paperkey -o /tmp/key-backup.txt”h]”hŒA$ gpg --export-secret-key [fpr] | paperkey -o /tmp/key-backup.txt”…”�”}”hjõsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j®h³hÇh´KÜhj–h²hubj )�”}”(hX1Print out that file, then take a pen and write your passphrase on the margin of the paper. **This is strongly recommended** because the key printout is still encrypted with that passphrase, and if you ever change it you will not remember what it used to be when you had created the backup -- *guaranteed*.”h]”(hŒ[Print out that file, then take a pen and write your passphrase on the margin of the paper. ”…”�”}”(hjh²hh³Nh´Nubj-)�”}”(hŒ **This is strongly recommended**”h]”hŒThis is strongly recommended”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j,hjubhŒ© because the key printout is still encrypted with that passphrase, and if you ever change it you will not remember what it used to be when you had created the backup -- ”…”�”}”(hjh²hh³Nh´NubhŒemphasis”“”)�”}”(hŒ *guaranteed*”h]”hŒ guaranteed”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjubhŒ.”…”�”}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´KÞhj–h²hubj )�”}”(hŒ´Put the resulting printout and the hand-written passphrase into an envelope and store in a secure and well-protected place, preferably away from your home, such as your bank vault.”h]”hŒ´Put the resulting printout and the hand-written passphrase into an envelope and store in a secure and well-protected place, preferably away from your home, such as your bank vault.”…”�”}”(hj7h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´Kähj–h²hubjƒ)�”}”(hŒ–The key is still encrypted with your passphrase, so printing out even to "cloud-integrated" modern printers should remain a relatively safe operation.”h]”j )�”}”(hŒ–The key is still encrypted with your passphrase, so printing out even to "cloud-integrated" modern printers should remain a relatively safe operation.”h]”hŒšThe key is still encrypted with your passphrase, so printing out even to “cloud-integratedâ€� modern printers should remain a relatively safe operation.”…”�”}”(hjIh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´KêhjEubah}”(h]”h ]”h"]”h$]”h&]”uh1j‚hj–h²hh³hÇh´Nubeh}”(h]”Œ.back-up-your-certify-key-for-disaster-recovery”ah ]”h"]”Œ.back up your certify key for disaster recovery”ah$]”h&]”uh1hÖhjÂh²hh³hÇh´KÍubh×)�”}”(hhh]”(hÜ)�”}”(hŒ"Back up your whole GnuPG directory”h]”hŒ"Back up your whole GnuPG directory”…”�”}”(hjhh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÛhjeh²hh³hÇh´KïubhŒwarning”“”)�”}”(hŒ**!!!Do not skip this step!!!**”h]”j )�”}”(hjzh]”j-)�”}”(hjzh]”hŒ!!!Do not skip this step!!!”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j,hj|ubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´Kóhjxubah}”(h]”h ]”h"]”h$]”h&]”uh1jvhjeh²hh³hÇh´Nubj )�”}”(hXxIt is important to have a readily available backup of your PGP keys should you need to recover them. This is different from the disaster-level preparedness we did with ``paperkey``. You will also rely on these external copies whenever you need to use your Certify key -- such as when making changes to your own key or signing other people's keys after conferences and summits.”h]”(hŒ¨It is important to have a readily available backup of your PGP keys should you need to recover them. This is different from the disaster-level preparedness we did with ”…”�”}”(hj˜h²hh³Nh´Nubjæ)�”}”(hŒ ``paperkey``”h]”hŒpaperkey”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jåhj˜ubhŒÆ. You will also rely on these external copies whenever you need to use your Certify key -- such as when making changes to your own key or signing other people’s keys after conferences and summits.”…”�”}”(hj˜h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´Kõhjeh²hubj )�”}”(hŒìStart by getting an external media card (preferably two!) that you will use for backup purposes. You will need to create an encrypted partition on this device using LUKS -- refer to your distro's documentation on how to accomplish this.”h]”hŒîStart by getting an external media card (preferably two!) that you will use for backup purposes. You will need to create an encrypted partition on this device using LUKS -- refer to your distro’s documentation on how to accomplish this.”…”�”}”(hj¸h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´Kühjeh²hubj )�”}”(hŒKFor the encryption passphrase, you can use the same one as on your PGP key.”h]”hŒKFor the encryption passphrase, you can use the same one as on your PGP key.”…”�”}”(hjÆh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´Mhjeh²hubj )�”}”(hŒ¨Once the encryption process is over, re-insert your device and make sure it gets properly mounted. Copy your entire ``.gnupg`` directory over to the encrypted storage::”h]”(hŒtOnce the encryption process is over, re-insert your device and make sure it gets properly mounted. Copy your entire ”…”�”}”(hjÔh²hh³Nh´Nubjæ)�”}”(hŒ ``.gnupg``”h]”hŒ.gnupg”…”�”}”(hjÜh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jåhjÔubhŒ) directory over to the encrypted storage:”…”�”}”(hjÔh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´Mhjeh²hubj¯)�”}”(hŒ-$ cp -a ~/.gnupg /media/disk/foo/gnupg-backup”h]”hŒ-$ cp -a ~/.gnupg /media/disk/foo/gnupg-backup”…”�”}”hjôsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j®h³hÇh´Mhjeh²hubj )�”}”(hŒ9You should now test to make sure everything still works::”h]”hŒ8You should now test to make sure everything still works:”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´M hjeh²hubj¯)�”}”(hŒ=$ gpg --homedir=/media/disk/foo/gnupg-backup --list-key [fpr]”h]”hŒ=$ gpg --homedir=/media/disk/foo/gnupg-backup --list-key [fpr]”…”�”}”hj sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j®h³hÇh´M hjeh²hubj )�”}”(hXMIf you don't get any errors, then you should be good to go. Unmount the device, distinctly label it so you don't overwrite it by accident, and put in a safe place -- but not too far away, because you'll need to use it every now and again for things like editing identities, adding or revoking subkeys, or signing other people's keys.”h]”hXUIf you don’t get any errors, then you should be good to go. Unmount the device, distinctly label it so you don’t overwrite it by accident, and put in a safe place -- but not too far away, because you’ll need to use it every now and again for things like editing identities, adding or revoking subkeys, or signing other people’s keys.”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´Mhjeh²hubeh}”(h]”Œ"back-up-your-whole-gnupg-directory”ah ]”h"]”Œ"back up your whole gnupg directory”ah$]”h&]”uh1hÖhjÂh²hh³hÇh´Kïubh×)�”}”(hhh]”(hÜ)�”}”(hŒ(Remove the Certify key from your homedir”h]”hŒ(Remove the Certify key from your homedir”…”�”}”(hj7 h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÛhj4 h²hh³hÇh´Mubj )�”}”(hŒ†The files in our home directory are not as well protected as we like to think. They can be leaked or stolen via many different means:”h]”hŒ†The files in our home directory are not as well protected as we like to think. They can be leaked or stolen via many different means:”…”�”}”(hjE h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´Mhj4 h²hubj£)�”}”(hhh]”(j¨)�”}”(hŒHby accident when making quick homedir copies to set up a new workstation”h]”j )�”}”(hjX h]”hŒHby accident when making quick homedir copies to set up a new workstation”…”�”}”(hjZ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´MhjV ubah}”(h]”h ]”h"]”h$]”h&]”uh1j§hjS h²hh³hÇh´Nubj¨)�”}”(hŒ-by systems administrator negligence or malice”h]”j )�”}”(hjo h]”hŒ-by systems administrator negligence or malice”…”�”}”(hjq h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´Mhjm ubah}”(h]”h ]”h"]”h$]”h&]”uh1j§hjS h²hh³hÇh´Nubj¨)�”}”(hŒvia poorly secured backups”h]”j )�”}”(hj† h]”hŒvia poorly secured backups”…”�”}”(hjˆ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´Mhj„ ubah}”(h]”h ]”h"]”h$]”h&]”uh1j§hjS h²hh³hÇh´Nubj¨)�”}”(hŒ8via malware in desktop apps (browsers, pdf viewers, etc)”h]”j )�”}”(hj� h]”hŒ8via malware in desktop apps (browsers, pdf viewers, etc)”…”�”}”(hjŸ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´Mhj› ubah}”(h]”h ]”h"]”h$]”h&]”uh1j§hjS h²hh³hÇh´Nubj¨)�”}”(hŒ1via coercion when crossing international borders ”h]”j )�”}”(hŒ0via coercion when crossing international borders”h]”hŒ0via coercion when crossing international borders”…”�”}”(hj¶ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´Mhj² ubah}”(h]”h ]”h"]”h$]”h&]”uh1j§hjS h²hh³hÇh´Nubeh}”(h]”h ]”h"]”h$]”h&]”jÞjßuh1j¢h³hÇh´Mhj4 h²hubj )�”}”(hX>Protecting your key with a good passphrase greatly helps reduce the risk of any of the above, but passphrases can be discovered via keyloggers, shoulder-surfing, or any number of other means. For this reason, the recommended setup is to remove your Certify key from your home directory and store it on offline storage.”h]”hX>Protecting your key with a good passphrase greatly helps reduce the risk of any of the above, but passphrases can be discovered via keyloggers, shoulder-surfing, or any number of other means. For this reason, the recommended setup is to remove your Certify key from your home directory and store it on offline storage.”…”�”}”(hjÐ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´M hj4 h²hubjw)�”}”(hŒ¿Please see the previous section and make sure you have backed up your GnuPG directory in its entirety. What we are about to do will render your key useless if you do not have a usable backup!”h]”j )�”}”(hŒ¿Please see the previous section and make sure you have backed up your GnuPG directory in its entirety. What we are about to do will render your key useless if you do not have a usable backup!”h]”hŒ¿Please see the previous section and make sure you have backed up your GnuPG directory in its entirety. What we are about to do will render your key useless if you do not have a usable backup!”…”�”}”(hjâ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´M(hjÞ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jvhj4 h²hh³hÇh´Nubj )�”}”(hŒ3First, identify the "keygrip" of your Certify key::”h]”hŒ6First, identify the “keygripâ€� of your Certify key:”…”�”}”(hjö h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´M,hj4 h²hubj¯)�”}”(hŒ%$ gpg --with-keygrip --list-key [fpr]”h]”hŒ%$ gpg --with-keygrip --list-key [fpr]”…”�”}”hj sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j®h³hÇh´M.hj4 h²hubj )�”}”(hŒ(The output will be something like this::”h]”hŒ'The output will be something like this:”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´M0hj4 h²hubj¯)�”}”(hX’pub ed25519 2022-12-20 [SC] [expires: 2022-12-19] 000000000000000000000000AAAABBBBCCCCDDDD Keygrip = 1111000000000000000000000000000000000000 uid [ultimate] Alice Dev sub cv25519 2022-12-20 [E] [expires: 2022-12-19] Keygrip = 2222000000000000000000000000000000000000 sub ed25519 2022-12-20 [S] Keygrip = 3333000000000000000000000000000000000000”h]”hX’pub ed25519 2022-12-20 [SC] [expires: 2022-12-19] 000000000000000000000000AAAABBBBCCCCDDDD Keygrip = 1111000000000000000000000000000000000000 uid [ultimate] Alice Dev sub cv25519 2022-12-20 [E] [expires: 2022-12-19] Keygrip = 2222000000000000000000000000000000000000 sub ed25519 2022-12-20 [S] Keygrip = 3333000000000000000000000000000000000000”…”�”}”hj sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j®h³hÇh´M2hj4 h²hubj )�”}”(hŒ«Find the keygrip entry that is beneath the ``pub`` line (right under the Certify key fingerprint). This will correspond directly to a file in your ``~/.gnupg`` directory::”h]”(hŒ+Find the keygrip entry that is beneath the ”…”�”}”(hj. h²hh³Nh´Nubjæ)�”}”(hŒ``pub``”h]”hŒpub”…”�”}”(hj6 h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jåhj. ubhŒa line (right under the Certify key fingerprint). This will correspond directly to a file in your ”…”�”}”(hj. h²hh³Nh´Nubjæ)�”}”(hŒ ``~/.gnupg``”h]”hŒ~/.gnupg”…”�”}”(hjH h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jåhj. ubhŒ directory:”…”�”}”(hj. h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´M;hj4 h²hubj¯)�”}”(hŒ«$ cd ~/.gnupg/private-keys-v1.d $ ls 1111000000000000000000000000000000000000.key 2222000000000000000000000000000000000000.key 3333000000000000000000000000000000000000.key”h]”hŒ«$ cd ~/.gnupg/private-keys-v1.d $ ls 1111000000000000000000000000000000000000.key 2222000000000000000000000000000000000000.key 3333000000000000000000000000000000000000.key”…”�”}”hj` sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j®h³hÇh´M?hj4 h²hubj )�”}”(hŒVIt is sufficient to remove the .key file that corresponds to the Certify key keygrip::”h]”hŒUIt is sufficient to remove the .key file that corresponds to the Certify key keygrip:”…”�”}”(hjn h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´MEhj4 h²hubj¯)�”}”(hŒQ$ cd ~/.gnupg/private-keys-v1.d $ rm 1111000000000000000000000000000000000000.key”h]”hŒQ$ cd ~/.gnupg/private-keys-v1.d $ rm 1111000000000000000000000000000000000000.key”…”�”}”hj| sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j®h³hÇh´MHhj4 h²hubj )�”}”(hŒŽNow, if you issue the ``--list-secret-keys`` command, it will show that the Certify key is missing (the ``#`` indicates it is not available)::”h]”(hŒNow, if you issue the ”…”�”}”(hjŠ h²hh³Nh´Nubjæ)�”}”(hŒ``--list-secret-keys``”h]”hŒ--list-secret-keys”…”�”}”(hj’ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jåhjŠ ubhŒ< command, it will show that the Certify key is missing (the ”…”�”}”(hjŠ h²hh³Nh´Nubjæ)�”}”(hŒ``#``”h]”hŒ#”…”�”}”(hj¤ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jåhjŠ ubhŒ indicates it is not available):”…”�”}”(hjŠ h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´MKhj4 h²hubj¯)�”}”(hX$ gpg --list-secret-keys sec# ed25519 2022-12-20 [SC] [expires: 2024-12-19] 000000000000000000000000AAAABBBBCCCCDDDD uid [ultimate] Alice Dev ssb cv25519 2022-12-20 [E] [expires: 2024-12-19] ssb ed25519 2022-12-20 [S]”h]”hX$ gpg --list-secret-keys sec# ed25519 2022-12-20 [SC] [expires: 2024-12-19] 000000000000000000000000AAAABBBBCCCCDDDD uid [ultimate] Alice Dev ssb cv25519 2022-12-20 [E] [expires: 2024-12-19] ssb ed25519 2022-12-20 [S]”…”�”}”hj¼ sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j®h³hÇh´MNhj4 h²hubj )�”}”(hŒ‡You should also remove any ``secring.gpg`` files in the ``~/.gnupg`` directory, which may be left over from previous versions of GnuPG.”h]”(hŒYou should also remove any ”…”�”}”(hjÊ h²hh³Nh´Nubjæ)�”}”(hŒ``secring.gpg``”h]”hŒ secring.gpg”…”�”}”(hjÒ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jåhjÊ ubhŒ files in the ”…”�”}”(hjÊ h²hh³Nh´Nubjæ)�”}”(hŒ ``~/.gnupg``”h]”hŒ~/.gnupg”…”�”}”(hjä h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jåhjÊ ubhŒC directory, which may be left over from previous versions of GnuPG.”…”�”}”(hjÊ h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´MUhj4 h²hubh×)�”}”(hhh]”(hÜ)�”}”(hŒ3If you don't have the "private-keys-v1.d" directory”h]”hŒ9If you don’t have the “private-keys-v1.dâ€� directory”…”�”}”(hjÿ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÛhjü h²hh³hÇh´MYubj )�”}”(hXPIf you do not have a ``~/.gnupg/private-keys-v1.d`` directory, then your secret keys are still stored in the legacy ``secring.gpg`` file used by GnuPG v1. Making any changes to your key, such as changing the passphrase or adding a subkey, should automatically convert the old ``secring.gpg`` format to use ``private-keys-v1.d`` instead.”h]”(hŒIf you do not have a ”…”�”}”(hj h²hh³Nh´Nubjæ)�”}”(hŒ``~/.gnupg/private-keys-v1.d``”h]”hŒ~/.gnupg/private-keys-v1.d”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jåhj ubhŒA directory, then your secret keys are still stored in the legacy ”…”�”}”(hj h²hh³Nh´Nubjæ)�”}”(hŒ``secring.gpg``”h]”hŒ secring.gpg”…”�”}”(hj' h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jåhj ubhŒ‘ file used by GnuPG v1. Making any changes to your key, such as changing the passphrase or adding a subkey, should automatically convert the old ”…”�”}”(hj h²hh³Nh´Nubjæ)�”}”(hŒ``secring.gpg``”h]”hŒ secring.gpg”…”�”}”(hj9 h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jåhj ubhŒ format to use ”…”�”}”(hj h²hh³Nh´Nubjæ)�”}”(hŒ``private-keys-v1.d``”h]”hŒprivate-keys-v1.d”…”�”}”(hjK h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jåhj ubhŒ instead.”…”�”}”(hj h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´M[hjü h²hubj )�”}”(hŒvOnce you get that done, make sure to delete the obsolete ``secring.gpg`` file, which still contains your private keys.”h]”(hŒ9Once you get that done, make sure to delete the obsolete ”…”�”}”(hjc h²hh³Nh´Nubjæ)�”}”(hŒ``secring.gpg``”h]”hŒ secring.gpg”…”�”}”(hjk h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jåhjc ubhŒ. file, which still contains your private keys.”…”�”}”(hjc h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´Mahjü h²hubhÉ)�”}”(hŒ.. _smartcards:”h]”h}”(h]”h ]”h"]”h$]”h&]”hÔŒ smartcards”uh1hÈh´Mdhjü h²hh³hÇubeh}”(h]”Œ1if-you-don-t-have-the-private-keys-v1-d-directory”ah ]”h"]”Œ3if you don't have the "private-keys-v1.d" directory”ah$]”h&]”uh1hÖhj4 h²hh³hÇh´MYubeh}”(h]”Œ(remove-the-certify-key-from-your-homedir”ah ]”h"]”Œ(remove the certify key from your homedir”ah$]”h&]”uh1hÖhjÂh²hh³hÇh´Mubeh}”(h]”(Œprotect-your-pgp-key”j¦eh ]”h"]”(Œprotect your pgp key”Œprotect_your_key”eh$]”h&]”uh1hÖhhØh²hh³hÇh´Kojr}”j¤ jœsjt}”j¦jœsubh×)�”}”(hhh]”(hÜ)�”}”(hŒ-Move the subkeys to a dedicated crypto device”h]”hŒ-Move the subkeys to a dedicated crypto device”…”�”}”(hj¬ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÛhj© h²hh³hÇh´Mgubj )�”}”(hX½Even though the Certify key is now safe from being leaked or stolen, the subkeys are still in your home directory. Anyone who manages to get their hands on those will be able to decrypt your communication or fake your signatures (if they know the passphrase). Furthermore, each time a GnuPG operation is performed, the keys are loaded into system memory and can be stolen from there by sufficiently advanced malware (think Meltdown and Spectre).”h]”hX½Even though the Certify key is now safe from being leaked or stolen, the subkeys are still in your home directory. Anyone who manages to get their hands on those will be able to decrypt your communication or fake your signatures (if they know the passphrase). Furthermore, each time a GnuPG operation is performed, the keys are loaded into system memory and can be stolen from there by sufficiently advanced malware (think Meltdown and Spectre).”…”�”}”(hjº h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´Mihj© h²hubj )�”}”(hŒ„A good way to completely protect your keys is to move them to a specialized hardware device that is capable of smartcard operations.”h]”hŒ„A good way to completely protect your keys is to move them to a specialized hardware device that is capable of smartcard operations.”…”�”}”(hjÈ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´Mqhj© h²hubh×)�”}”(hhh]”(hÜ)�”}”(hŒThe benefits of smartcards”h]”hŒThe benefits of smartcards”…”�”}”(hjÙ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÛhjÖ h²hh³hÇh´Muubj )�”}”(hXA smartcard contains a cryptographic chip that is capable of storing private keys and performing crypto operations directly on the card itself. Because the key contents never leave the smartcard, the operating system of the computer into which you plug in the hardware device is not able to retrieve the private keys themselves. This is very different from the encrypted media storage device we used earlier for backup purposes -- while that device is plugged in and mounted, the operating system is able to access the private key contents.”h]”hXA smartcard contains a cryptographic chip that is capable of storing private keys and performing crypto operations directly on the card itself. Because the key contents never leave the smartcard, the operating system of the computer into which you plug in the hardware device is not able to retrieve the private keys themselves. This is very different from the encrypted media storage device we used earlier for backup purposes -- while that device is plugged in and mounted, the operating system is able to access the private key contents.”…”�”}”(hjç h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´MwhjÖ h²hubj )�”}”(hŒXUsing external encrypted media is not a substitute to having a smartcard-capable device.”h]”hŒXUsing external encrypted media is not a substitute to having a smartcard-capable device.”…”�”}”(hjõ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´M€hjÖ h²hubeh}”(h]”Œthe-benefits-of-smartcards”ah ]”h"]”Œthe benefits of smartcards”ah$]”h&]”uh1hÖhj© h²hh³hÇh´Muubh×)�”}”(hhh]”(hÜ)�”}”(hŒAvailable smartcard devices”h]”hŒAvailable smartcard devices”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÛhj h²hh³hÇh´M„ubj )�”}”(hŒ½Unless all your laptops and workstations have smartcard readers, the easiest is to get a specialized USB device that implements smartcard functionality. There are several options available:”h]”hŒ½Unless all your laptops and workstations have smartcard readers, the easiest is to get a specialized USB device that implements smartcard functionality. There are several options available:”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´M†hj h²hubj£)�”}”(hhh]”(j¨)�”}”(hŒÒ`Nitrokey Start`_: Open hardware and Free Software, based on FSI Japan's `Gnuk`_. One of the cheapest options, but offers fewest security features (such as resistance to tampering or some side-channel attacks).”h]”j )�”}”(hŒÒ`Nitrokey Start`_: Open hardware and Free Software, based on FSI Japan's `Gnuk`_. One of the cheapest options, but offers fewest security features (such as resistance to tampering or some side-channel attacks).”h]”(j)�”}”(hŒ`Nitrokey Start`_”h]”hŒNitrokey Start”…”�”}”(hj5 h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”ŒNitrokey Start”j[Œ+https://www.nitrokey.com/products/nitrokeys”uh1jhj1 j]KubhŒ:: Open hardware and Free Software, based on FSI Japan’s ”…”�”}”(hj1 h²hh³Nh´Nubj)�”}”(hŒ`Gnuk`_”h]”hŒGnuk”…”�”}”(hjJ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”ŒGnuk”j[Œhttps://www.fsij.org/doc-gnuk/”uh1jhj1 j]KubhŒ‚. One of the cheapest options, but offers fewest security features (such as resistance to tampering or some side-channel attacks).”…”�”}”(hj1 h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´MŠhj- ubah}”(h]”h ]”h"]”h$]”h&]”uh1j§hj* h²hh³hÇh´Nubj¨)�”}”(hŒ®`Nitrokey 3`_: Similar to the Nitrokey Start, but more tamper-resistant and offers more security features and USB form-factors. Supports ECC cryptography (ED25519 and NISTP).”h]”j )�”}”(hŒ®`Nitrokey 3`_: Similar to the Nitrokey Start, but more tamper-resistant and offers more security features and USB form-factors. Supports ECC cryptography (ED25519 and NISTP).”h]”(j)�”}”(hŒ `Nitrokey 3`_”h]”hŒ Nitrokey 3”…”�”}”(hjs h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œ Nitrokey 3”j[Œ+https://www.nitrokey.com/products/nitrokeys”uh1jhjo j]KubhŒ¡: Similar to the Nitrokey Start, but more tamper-resistant and offers more security features and USB form-factors. Supports ECC cryptography (ED25519 and NISTP).”…”�”}”(hjo h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´MŽhjk ubah}”(h]”h ]”h"]”h$]”h&]”uh1j§hj* h²hh³hÇh´Nubj¨)�”}”(hŒš`Yubikey 5`_: proprietary hardware and software, but cheaper than Nitrokey with a similar set of features. Supports ECC cryptography (ED25519 and NISTP). ”h]”j )�”}”(hŒ™`Yubikey 5`_: proprietary hardware and software, but cheaper than Nitrokey with a similar set of features. Supports ECC cryptography (ED25519 and NISTP).”h]”(j)�”}”(hŒ `Yubikey 5`_”h]”hŒ Yubikey 5”…”�”}”(hjœ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œ Yubikey 5”j[Œ3https://www.yubico.com/products/yubikey-5-overview/”uh1jhj˜ j]KubhŒ�: proprietary hardware and software, but cheaper than Nitrokey with a similar set of features. Supports ECC cryptography (ED25519 and NISTP).”…”�”}”(hj˜ h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´M‘hj” ubah}”(h]”h ]”h"]”h$]”h&]”uh1j§hj* h²hh³hÇh´Nubeh}”(h]”h ]”h"]”h$]”h&]”jÞjßuh1j¢h³hÇh´MŠhj h²hubj )�”}”(hŒ�Your choice will depend on cost, shipping availability in your geographical region, and open/proprietary hardware considerations.”h]”hŒ�Your choice will depend on cost, shipping availability in your geographical region, and open/proprietary hardware considerations.”…”�”}”(hjà h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´M•hj h²hubjƒ)�”}”(hŒžIf you are listed in an `M:` entry in MAINTAINERS or have an account at kernel.org, you `qualify for a free Nitrokey Start`_ courtesy of The Linux Foundation.”h]”j )�”}”(hŒžIf you are listed in an `M:` entry in MAINTAINERS or have an account at kernel.org, you `qualify for a free Nitrokey Start`_ courtesy of The Linux Foundation.”h]”(hŒIf you are listed in an ”…”�”}”(hjÕ h²hh³Nh´NubhŒtitle_reference”“”)�”}”(hŒ`M:`”h]”hŒM:”…”�”}”(hjß h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÝ hjÕ ubhŒ< entry in MAINTAINERS or have an account at kernel.org, you ”…”�”}”(hjÕ h²hh³Nh´Nubj)�”}”(hŒ$`qualify for a free Nitrokey Start`_”h]”hŒ!qualify for a free Nitrokey Start”…”�”}”(hjñ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œ!qualify for a free Nitrokey Start”j[ŒIhttps://www.kernel.org/nitrokey-digital-tokens-for-kernel-developers.html”uh1jhjÕ j]KubhŒ" courtesy of The Linux Foundation.”…”�”}”(hjÕ h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´MšhjÑ ubah}”(h]”h ]”h"]”h$]”h&]”uh1j‚hj h²hh³hÇh´NubhÉ)�”}”(hŒA.. _`Nitrokey Start`: https://www.nitrokey.com/products/nitrokeys”h]”h}”(h]”Œnitrokey-start”ah ]”h"]”Œnitrokey start”ah$]”h&]”j[jE uh1hÈh´Mžhj h²hh³hÇjtKubhÉ)�”}”(hŒ=.. _`Nitrokey 3`: https://www.nitrokey.com/products/nitrokeys”h]”h}”(h]”Œ nitrokey-3”ah ]”h"]”Œ nitrokey 3”ah$]”h&]”j[jƒ uh1hÈh´MŸhj h²hh³hÇjtKubhÉ)�”}”(hŒD.. _`Yubikey 5`: https://www.yubico.com/products/yubikey-5-overview/”h]”h}”(h]”Œ yubikey-5”ah ]”h"]”Œ yubikey 5”ah$]”h&]”j[j¬ uh1hÈh´M hj h²hh³hÇjtKubhÉ)�”}”(hŒ(.. _Gnuk: https://www.fsij.org/doc-gnuk/”h]”h}”(h]”Œgnuk”ah ]”h"]”Œgnuk”ah$]”h&]”j[jZ uh1hÈh´M¡hj h²hh³hÇjtKubhÉ)�”}”(hŒr.. _`qualify for a free Nitrokey Start`: https://www.kernel.org/nitrokey-digital-tokens-for-kernel-developers.html”h]”h}”(h]”Œ!qualify-for-a-free-nitrokey-start”ah ]”h"]”Œ!qualify for a free nitrokey start”ah$]”h&]”j[j uh1hÈh´M¢hj h²hh³hÇjtKubeh}”(h]”Œavailable-smartcard-devices”ah ]”h"]”Œavailable smartcard devices”ah$]”h&]”uh1hÖhj© h²hh³hÇh´M„ubh×)�”}”(hhh]”(hÜ)�”}”(hŒConfigure your smartcard device”h]”hŒConfigure your smartcard device”…”�”}”(hjY h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÛhjV h²hh³hÇh´M¥ubj )�”}”(hŒ„Your smartcard device should Just Work (TM) the moment you plug it into any modern Linux workstation. You can verify it by running::”h]”hŒƒYour smartcard device should Just Work (TM) the moment you plug it into any modern Linux workstation. You can verify it by running:”…”�”}”(hjg h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´M§hjV h²hubj¯)�”}”(hŒ$ gpg --card-status”h]”hŒ$ gpg --card-status”…”�”}”hju sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j®h³hÇh´MªhjV h²hubj )�”}”(hX(If you see full smartcard details, then you are good to go. Unfortunately, troubleshooting all possible reasons why things may not be working for you is way beyond the scope of this guide. If you are having trouble getting the card to work with GnuPG, please seek help via usual support channels.”h]”hX(If you see full smartcard details, then you are good to go. Unfortunately, troubleshooting all possible reasons why things may not be working for you is way beyond the scope of this guide. If you are having trouble getting the card to work with GnuPG, please seek help via usual support channels.”…”�”}”(hjƒ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´M¬hjV h²hubj )�”}”(hŒ{To configure your smartcard, you will need to use the GnuPG menu system, as there are no convenient command-line switches::”h]”hŒzTo configure your smartcard, you will need to use the GnuPG menu system, as there are no convenient command-line switches:”…”�”}”(hj‘ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´M²hjV h²hubj¯)�”}”(hŒ]$ gpg --card-edit [...omitted...] gpg/card> admin Admin commands are allowed gpg/card> passwd”h]”hŒ]$ gpg --card-edit [...omitted...] gpg/card> admin Admin commands are allowed gpg/card> passwd”…”�”}”hjŸ sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j®h³hÇh´MµhjV h²hubj )�”}”(hXSYou should set the user PIN (1), Admin PIN (3), and the Reset Code (4). Please make sure to record and store these in a safe place -- especially the Admin PIN and the Reset Code (which allows you to completely wipe the smartcard). You so rarely need to use the Admin PIN, that you will inevitably forget what it is if you do not record it.”h]”hXSYou should set the user PIN (1), Admin PIN (3), and the Reset Code (4). Please make sure to record and store these in a safe place -- especially the Admin PIN and the Reset Code (which allows you to completely wipe the smartcard). You so rarely need to use the Admin PIN, that you will inevitably forget what it is if you do not record it.”…”�”}”(hj­ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´M»hjV h²hubj )�”}”(hŒÑGetting back to the main card menu, you can also set other values (such as name, gender, login data, etc), but it's not necessary and will additionally leak information about your smartcard should you lose it.”h]”hŒÓGetting back to the main card menu, you can also set other values (such as name, gender, login data, etc), but it’s not necessary and will additionally leak information about your smartcard should you lose it.”…”�”}”(hj» h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´MÁhjV h²hubjƒ)�”}”(hŒeDespite having the name "PIN", neither the user PIN nor the admin PIN on the card need to be numbers.”h]”j )�”}”(hŒeDespite having the name "PIN", neither the user PIN nor the admin PIN on the card need to be numbers.”•‚õh]”hŒiDespite having the name “PINâ€�, neither the user PIN nor the admin PIN on the card need to be numbers.”…”�”}”(hjÍ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´MÇhjÉ ubah}”(h]”h ]”h"]”h$]”h&]”uh1j‚hjV h²hh³hÇh´Nubjw)�”}”(hŒ¬Some devices may require that you move the subkeys onto the device before you can change the passphrase. Please check the documentation provided by the device manufacturer.”h]”j )�”}”(hŒ¬Some devices may require that you move the subkeys onto the device before you can change the passphrase. Please check the documentation provided by the device manufacturer.”h]”hŒ¬Some devices may require that you move the subkeys onto the device before you can change the passphrase. Please check the documentation provided by the device manufacturer.”…”�”}”(hjå h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´MÌhjá ubah}”(h]”h ]”h"]”h$]”h&]”uh1jvhjV h²hh³hÇh´Nubeh}”(h]”Œconfigure-your-smartcard-device”ah ]”h"]”Œconfigure your smartcard device”ah$]”h&]”uh1hÖhj© h²hh³hÇh´M¥ubh×)�”}”(hhh]”(hÜ)�”}”(hŒ"Move the subkeys to your smartcard”h]”hŒ"Move the subkeys to your smartcard”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÛhjh²hh³hÇh´MÑubj )�”}”(hŒÅExit the card menu (using "q") and save all changes. Next, let's move your subkeys onto the smartcard. You will need both your PGP key passphrase and the admin PIN of the card for most operations::”h]”hŒÊExit the card menu (using “qâ€�) and save all changes. Next, let’s move your subkeys onto the smartcard. You will need both your PGP key passphrase and the admin PIN of the card for most operations:”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´MÓhjh²hubj¯)�”}”(hX˜$ gpg --edit-key [fpr] Secret subkeys are available. pub ed25519/AAAABBBBCCCCDDDD created: 2022-12-20 expires: 2024-12-19 usage: SC trust: ultimate validity: ultimate ssb cv25519/1111222233334444 created: 2022-12-20 expires: never usage: E ssb ed25519/5555666677778888 created: 2017-12-07 expires: never usage: S [ultimate] (1). Alice Dev gpg>”h]”hX˜$ gpg --edit-key [fpr] Secret subkeys are available. pub ed25519/AAAABBBBCCCCDDDD created: 2022-12-20 expires: 2024-12-19 usage: SC trust: ultimate validity: ultimate ssb cv25519/1111222233334444 created: 2022-12-20 expires: never usage: E ssb ed25519/5555666677778888 created: 2017-12-07 expires: never usage: S [ultimate] (1). Alice Dev gpg>”…”�”}”hj sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j®h³hÇh´M×hjh²hubj )�”}”(hŒÐUsing ``--edit-key`` puts us into the menu mode again, and you will notice that the key listing is a little different. From here on, all commands are done from inside this menu mode, as indicated by ``gpg>``.”h]”(hŒUsing ”…”�”}”(hj.h²hh³Nh´Nubjæ)�”}”(hŒ``--edit-key``”h]”hŒ --edit-key”…”�”}”(hj6h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jåhj.ubhŒ³ puts us into the menu mode again, and you will notice that the key listing is a little different. From here on, all commands are done from inside this menu mode, as indicated by ”…”�”}”(hj.h²hh³Nh´Nubjæ)�”}”(hŒ``gpg>``”h]”hŒgpg>”…”�”}”(hjHh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jåhj.ubhŒ.”…”�”}”(hj.h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´Mæhjh²hubj )�”}”(hŒ—First, let's select the key we'll be putting onto the card -- you do this by typing ``key 1`` (it's the first one in the listing, the **[E]** subkey)::”h]”(hŒXFirst, let’s select the key we’ll be putting onto the card -- you do this by typing ”…”�”}”(hj`h²hh³Nh´Nubjæ)�”}”(hŒ ``key 1``”h]”hŒkey 1”…”�”}”(hjhh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jåhj`ubhŒ+ (it’s the first one in the listing, the ”…”�”}”(hj`h²hh³Nh´Nubj-)�”}”(hŒ**[E]**”h]”hŒ[E]”…”�”}”(hjzh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j,hj`ubhŒ subkey):”…”�”}”(hj`h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´Mêhjh²hubj¯)�”}”(hŒ gpg> key 1”h]”hŒ gpg> key 1”…”�”}”hj’sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j®h³hÇh´Mîhjh²hubj )�”}”(hŒûIn the output, you should now see ``ssb*`` on the **[E]** key. The ``*`` indicates which key is currently "selected." It works as a *toggle*, meaning that if you type ``key 1`` again, the ``*`` will disappear and the key will not be selected any more.”h]”(hŒ"In the output, you should now see ”…”�”}”(hj h²hh³Nh´Nubjæ)�”}”(hŒ``ssb*``”h]”hŒssb*”…”�”}”(hj¨h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jåhj ubhŒ on the ”…”�”}”(hj h²hh³Nh´Nubj-)�”}”(hŒ**[E]**”h]”hŒ[E]”…”�”}”(hjºh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j,hj ubhŒ key. The ”…”�”}”(hj h²hh³Nh´Nubjæ)�”}”(hŒ``*``”h]”hŒ*”…”�”}”(hjÌh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jåhj ubhŒ@ indicates which key is currently “selected.â€� It works as a ”…”�”}”(hj h²hh³Nh´Nubj)�”}”(hŒ*toggle*”h]”hŒtoggle”…”�”}”(hjÞh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj ubhŒ, meaning that if you type ”…”�”}”(hj h²hh³Nh´Nubjæ)�”}”(hŒ ``key 1``”h]”hŒkey 1”…”�”}”(hjðh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jåhj ubhŒ again, the ”…”�”}”(hj h²hh³Nh´Nubjæ)�”}”(hŒ``*``”h]”hŒ*”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jåhj ubhŒ: will disappear and the key will not be selected any more.”…”�”}”(hj h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´Mðhjh²hubj )�”}”(hŒ-Now, let's move that key onto the smartcard::”h]”hŒ.Now, let’s move that key onto the smartcard:”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´Mõhjh²hubj¯)�”}”(hŒ\gpg> keytocard Please select where to store the key: (2) Encryption key Your selection? 2”h]”hŒ\gpg> keytocard Please select where to store the key: (2) Encryption key Your selection? 2”…”�”}”hj(sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j®h³hÇh´M÷hjh²hubj )�”}”(hXSince it's our **[E]** key, it makes sense to put it into the Encryption slot. When you submit your selection, you will be prompted first for your PGP key passphrase, and then for the admin PIN. If the command returns without an error, your key has been moved.”h]”(hŒSince it’s our ”…”�”}”(hj6h²hh³Nh´Nubj-)�”}”(hŒ**[E]**”h]”hŒ[E]”…”�”}”(hj>h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j,hj6ubhŒï key, it makes sense to put it into the Encryption slot. When you submit your selection, you will be prompted first for your PGP key passphrase, and then for the admin PIN. If the command returns without an error, your key has been moved.”…”�”}”(hj6h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´Mühjh²hubj )�”}”(hŒl**Important**: Now type ``key 1`` again to unselect the first key, and ``key 2`` to select the **[S]** key::”h]”(j-)�”}”(hŒ **Important**”h]”hŒ Important”…”�”}”(hjZh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j,hjVubhŒ : Now type ”…”�”}”(hjVh²hh³Nh´Nubjæ)�”}”(hŒ ``key 1``”h]”hŒkey 1”…”�”}”(hjlh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jåhjVubhŒ& again to unselect the first key, and ”…”�”}”(hjVh²hh³Nh´Nubjæ)�”}”(hŒ ``key 2``”h]”hŒkey 2”…”�”}”(hj~h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jåhjVubhŒ to select the ”…”�”}”(hjVh²hh³Nh´Nubj-)�”}”(hŒ**[S]**”h]”hŒ[S]”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j,hjVubhŒ key:”…”�”}”(hjVh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´Mhjh²hubj¯)�”}”(hŒ‹gpg> key 1 gpg> key 2 gpg> keytocard Please select where to store the key: (1) Signature key (3) Authentication key Your selection? 1”h]”hŒ‹gpg> key 1 gpg> key 2 gpg> keytocard Please select where to store the key: (1) Signature key (3) Authentication key Your selection? 1”…”�”}”hj¨sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j®h³hÇh´Mhjh²hubj )�”}”(hŒàYou can use the **[S]** key both for Signature and Authentication, but we want to make sure it's in the Signature slot, so choose (1). Once again, if your command returns without an error, then the operation was successful::”h]”(hŒYou can use the ”…”�”}”(hj¶h²hh³Nh´Nubj-)�”}”(hŒ**[S]**”h]”hŒ[S]”…”�”}”(hj¾h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j,hj¶ubhŒÊ key both for Signature and Authentication, but we want to make sure it’s in the Signature slot, so choose (1). Once again, if your command returns without an error, then the operation was successful:”…”�”}”(hj¶h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´M hjh²hubj¯)�”}”(hŒgpg> q Save changes? (y/N) y”h]”hŒgpg> q Save changes? (y/N) y”…”�”}”hjÖsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j®h³hÇh´Mhjh²hubj )�”}”(hŒÈSaving the changes will delete the keys you moved to the card from your home directory (but it's okay, because we have them in our backups should we need to do this again for a replacement smartcard).”h]”hŒÊSaving the changes will delete the keys you moved to the card from your home directory (but it’s okay, because we have them in our backups should we need to do this again for a replacement smartcard).”…”�”}”(hjäh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´Mhjh²hubh×)�”}”(hhh]”(hÜ)�”}”(hŒ"Verifying that the keys were moved”h]”hŒ"Verifying that the keys were moved”…”�”}”(hjõh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÛhjòh²hh³hÇh´Mubj )�”}”(hŒ[If you perform ``--list-secret-keys`` now, you will see a subtle difference in the output::”h]”(hŒIf you perform ”…”�”}”(hjh²hh³Nh´Nubjæ)�”}”(hŒ``--list-secret-keys``”h]”hŒ--list-secret-keys”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jåhjubhŒ5 now, you will see a subtle difference in the output:”…”�”}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´Mhjòh²hubj¯)�”}”(hX$ gpg --list-secret-keys sec# ed25519 2022-12-20 [SC] [expires: 2024-12-19] 000000000000000000000000AAAABBBBCCCCDDDD uid [ultimate] Alice Dev ssb> cv25519 2022-12-20 [E] [expires: 2024-12-19] ssb> ed25519 2022-12-20 [S]”h]”hX$ gpg --list-secret-keys sec# ed25519 2022-12-20 [SC] [expires: 2024-12-19] 000000000000000000000000AAAABBBBCCCCDDDD uid [ultimate] Alice Dev ssb> cv25519 2022-12-20 [E] [expires: 2024-12-19] ssb> ed25519 2022-12-20 [S]”…”�”}”hj#sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j®h³hÇh´Mhjòh²hubj )�”}”(hŒûThe ``>`` in the ``ssb>`` output indicates that the subkey is only available on the smartcard. If you go back into your secret keys directory and look at the contents there, you will notice that the ``.key`` files there have been replaced with stubs::”h]”(hŒThe ”…”�”}”(hj1h²hh³Nh´Nubjæ)�”}”(hŒ``>``”h]”hŒ>”…”�”}”(hj9h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jåhj1ubhŒ in the ”…”�”}”(hj1h²hh³Nh´Nubjæ)�”}”(hŒ``ssb>``”h]”hŒssb>”…”�”}”(hjKh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jåhj1ubhŒ® output indicates that the subkey is only available on the smartcard. If you go back into your secret keys directory and look at the contents there, you will notice that the ”…”�”}”(hj1h²hh³Nh´Nubjæ)�”}”(hŒ``.key``”h]”hŒ.key”…”�”}”(hj]h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jåhj1ubhŒ+ files there have been replaced with stubs:”…”�”}”(hj1h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´M%hjòh²hubj¯)�”}”(hŒD$ cd ~/.gnupg/private-keys-v1.d $ strings *.key | grep 'private-key'”h]”hŒD$ cd ~/.gnupg/private-keys-v1.d $ strings *.key | grep 'private-key'”…”�”}”hjusbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j®h³hÇh´M*hjòh²hubj )�”}”(hŒŠThe output should contain ``shadowed-private-key`` to indicate that these files are only stubs and the actual content is on the smartcard.”h]”(hŒThe output should contain ”…”�”}”(hjƒh²hh³Nh´Nubjæ)�”}”(hŒ``shadowed-private-key``”h]”hŒshadowed-private-key”…”�”}”(hj‹h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jåhjƒubhŒX to indicate that these files are only stubs and the actual content is on the smartcard.”…”�”}”(hjƒh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´M-hjòh²hubeh}”(h]”Œ"verifying-that-the-keys-were-moved”ah ]”h"]”Œ"verifying that the keys were moved”ah$]”h&]”uh1hÖhjh²hh³hÇh´Mubh×)�”}”(hhh]”(hÜ)�”}”(hŒ+Verifying that the smartcard is functioning”h]”hŒ+Verifying that the smartcard is functioning”…”�”}”(hj®h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÛhj«h²hh³hÇh´M1ubj )�”}”(hŒQTo verify that the smartcard is working as intended, you can create a signature::”h]”hŒPTo verify that the smartcard is working as intended, you can create a signature:”…”�”}”(hj¼h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´M3hj«h²hubj¯)�”}”(hŒS$ echo "Hello world" | gpg --clearsign > /tmp/test.asc $ gpg --verify /tmp/test.asc”h]”hŒS$ echo "Hello world" | gpg --clearsign > /tmp/test.asc $ gpg --verify /tmp/test.asc”…”�”}”hjÊsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j®h³hÇh´M6hj«h²hubj )�”}”(hŒ|This should ask for your smartcard PIN on your first command, and then show "Good signature" after you run ``gpg --verify``.”h]”(hŒoThis should ask for your smartcard PIN on your first command, and then show “Good signatureâ€� after you run ”…”�”}”(hjØh²hh³Nh´Nubjæ)�”}”(hŒ``gpg --verify``”h]”hŒ gpg --verify”…”�”}”(hjàh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jåhjØubhŒ.”…”�”}”(hjØh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´M9hj«h²hubj )�”}”(hŒlCongratulations, you have successfully made it extremely difficult to steal your digital developer identity!”h]”hŒlCongratulations, you have successfully made it extremely difficult to steal your digital developer identity!”…”�”}”(hjøh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´M<hj«h²hubeh}”(h]”Œ+verifying-that-the-smartcard-is-functioning”ah ]”h"]”Œ+verifying that the smartcard is functioning”ah$]”h&]”uh1hÖhjh²hh³hÇh´M1ubeh}”(h]”Œ"move-the-subkeys-to-your-smartcard”ah ]”h"]”Œ"move the subkeys to your smartcard”ah$]”h&]”uh1hÖhj© h²hh³hÇh´MÑubh×)�”}”(hhh]”(hÜ)�”}”(hŒOther common GnuPG operations”h]”hŒOther common GnuPG operations”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÛhjh²hh³hÇh´M@ubj )�”}”(hŒYHere is a quick reference for some common operations you'll need to do with your PGP key.”h]”hŒ[Here is a quick reference for some common operations you’ll need to do with your PGP key.”…”�”}”(hj'h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´MBhjh²hubh×)�”}”(hhh]”(hÜ)�”}”(hŒ"Mounting your safe offline storage”h]”hŒ"Mounting your safe offline storage”…”�”}”(hj8h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÛhj5h²hh³hÇh´MFubj )�”}”(hŒ–You will need your Certify key for any of the operations below, so you will first need to mount your backup offline storage and tell GnuPG to use it::”h]”hŒ•You will need your Certify key for any of the operations below, so you will first need to mount your backup offline storage and tell GnuPG to use it:”…”�”}”(hjFh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´MHhj5h²hubj¯)�”}”(hŒH$ export GNUPGHOME=/media/disk/foo/gnupg-backup $ gpg --list-secret-keys”h]”hŒH$ export GNUPGHOME=/media/disk/foo/gnupg-backup $ gpg --list-secret-keys”…”�”}”hjTsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j®h³hÇh´MLhj5h²hubj )�”}”(hŒ±You want to make sure that you see ``sec`` and not ``sec#`` in the output (the ``#`` means the key is not available and you're still using your regular home directory location).”h]”(hŒ#You want to make sure that you see ”…”�”}”(hjbh²hh³Nh´Nubjæ)�”}”(hŒ``sec``”h]”hŒsec”…”�”}”(hjjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jåhjbubhŒ and not ”…”�”}”(hjbh²hh³Nh´Nubjæ)�”}”(hŒ``sec#``”h]”hŒsec#”…”�”}”(hj|h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jåhjbubhŒ in the output (the ”…”�”}”(hjbh²hh³Nh´Nubjæ)�”}”(hŒ``#``”h]”hŒ#”…”�”}”(hjŽh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jåhjbubhŒ_ means the key is not available and you’re still using your regular home directory location).”…”�”}”(hjbh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´MOhj5h²hubeh}”(h]”Œ"mounting-your-safe-offline-storage”ah ]”h"]”Œ"mounting your safe offline storage”ah$]”h&]”uh1hÖhjh²hh³hÇh´MFubh×)�”}”(hhh]”(hÜ)�”}”(hŒExtending key expiration date”h]”hŒExtending key expiration date”…”�”}”(hj±h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÛhj®h²hh³hÇh´MTubj )�”}”(hŒ¼The Certify key has the default expiration date of 2 years from the date of creation. This is done both for security reasons and to make obsolete keys eventually disappear from keyservers.”h]”hŒ¼The Certify key has the default expiration date of 2 years from the date of creation. This is done both for security reasons and to make obsolete keys eventually disappear from keyservers.”…”�”}”(hj¿h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´MVhj®h²hubj )�”}”(hŒLTo extend the expiration on your key by a year from current date, just run::”h]”hŒKTo extend the expiration on your key by a year from current date, just run:”…”�”}”(hjÍh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´MZhj®h²hubj¯)�”}”(hŒ!$ gpg --quick-set-expire [fpr] 1y”h]”hŒ!$ gpg --quick-set-expire [fpr] 1y”…”�”}”hjÛsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j®h³hÇh´M]hj®h²hubj )�”}”(hŒqYou can also use a specific date if that is easier to remember (e.g. your birthday, January 1st, or Canada Day)::”h]”hŒpYou can also use a specific date if that is easier to remember (e.g. your birthday, January 1st, or Canada Day):”…”�”}”(hjéh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´M_hj®h²hubj¯)�”}”(hŒ)$ gpg --quick-set-expire [fpr] 2038-07-01”h]”hŒ)$ gpg --quick-set-expire [fpr] 2038-07-01”…”�”}”hj÷sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j®h³hÇh´Mbhj®h²hubj )�”}”(hŒ5Remember to send the updated key back to keyservers::”h]”hŒ4Remember to send the updated key back to keyservers:”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´Mdhj®h²hubj¯)�”}”(hŒ$ gpg --send-key [fpr]”h]”hŒ$ gpg --send-key [fpr]”…”�”}”hjsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j®h³hÇh´Mfhj®h²hubeh}”(h]”Œextending-key-expiration-date”ah ]”h"]”Œextending key expiration date”ah$]”h&]”uh1hÖhjh²hh³hÇh´MTubh×)�”}”(hhh]”(hÜ)�”}”(hŒ.Updating your work directory after any changes”h]”hŒ.Updating your work directory after any changes”…”�”}”(hj,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÛhj)h²hh³hÇh´Miubj )�”}”(hŒ’After you make any changes to your key using the offline storage, you will want to import these changes back into your regular working directory::”h]”hŒ‘After you make any changes to your key using the offline storage, you will want to import these changes back into your regular working directory:”…”�”}”(hj:h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´Mkhj)h²hubj¯)�”}”(hŒB$ gpg --export | gpg --homedir ~/.gnupg --import $ unset GNUPGHOME”h]”hŒB$ gpg --export | gpg --homedir ~/.gnupg --import $ unset GNUPGHOME”…”�”}”hjHsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j®h³hÇh´Mnhj)h²hubeh}”(h]”Œ.updating-your-work-directory-after-any-changes”ah ]”h"]”Œ.updating your work directory after any changes”ah$]”h&]”uh1hÖhjh²hh³hÇh´Miubh×)�”}”(hhh]”(hÜ)�”}”(hŒUsing gpg-agent over ssh”h]”hŒUsing gpg-agent over ssh”…”�”}”(hjah²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÛhj^h²hh³hÇh´Mrubj )�”}”(hŒœYou can forward your gpg-agent over ssh if you need to sign tags or commits on a remote system. Please refer to the instructions provided on the GnuPG wiki:”h]”hŒœYou can forward your gpg-agent over ssh if you need to sign tags or commits on a remote system. Please refer to the instructions provided on the GnuPG wiki:”…”�”}”(hjoh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´Mthj^h²hubj£)�”}”(hhh]”j¨)�”}”(hŒ`Agent Forwarding over SSH`_ ”h]”j )�”}”(hŒ`Agent Forwarding over SSH`_”h]”j)�”}”(hj†h]”hŒAgent Forwarding over SSH”…”�”}”(hjˆh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”ŒAgent Forwarding over SSH”j[Œ&https://wiki.gnupg.org/AgentForwarding”uh1jhj„j]Kubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´Mxhj€ubah}”(h]”h ]”h"]”h$]”h&]”uh1j§hj}h²hh³hÇh´Nubah}”(h]”h ]”h"]”h$]”h&]”jÞjßuh1j¢h³hÇh´Mxhj^h²hubj )�”}”(hŒTIt works more smoothly if you can modify the sshd server settings on the remote end.”h]”hŒTIt works more smoothly if you can modify the sshd server settings on the remote end.”…”�”}”(hjªh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´Mzhj^h²hubhÉ)�”}”(hŒG.. _`Agent Forwarding over SSH`: https://wiki.gnupg.org/AgentForwarding”h]”h}”(h]”Œagent-forwarding-over-ssh”ah ]”h"]”Œagent forwarding over ssh”ah$]”h&]”j[j—uh1hÈh´M}hj^h²hh³hÇjtKubhÉ)�”}”(hŒ.. _pgp_with_git:”h]”h}”(h]”h ]”h"]”h$]”h&]”hÔŒ pgp-with-git”uh1hÈh´Mhj^h²hh³hÇubeh}”(h]”Œusing-gpg-agent-over-ssh”ah ]”h"]”Œusing gpg-agent over ssh”ah$]”h&]”uh1hÖhjh²hh³hÇh´Mrubeh}”(h]”Œother-common-gnupg-operations”ah ]”h"]”Œother common gnupg operations”ah$]”h&]”uh1hÖhj© h²hh³hÇh´M@ubeh}”(h]”(Œ-move-the-subkeys-to-a-dedicated-crypto-device”j� eh ]”h"]”(Œ-move the subkeys to a dedicated crypto device”Œ smartcards”eh$]”h&]”uh1hÖhhØh²hh³hÇh´Mgjr}”jåjƒ sjt}”j� jƒ subh×)�”}”(hhh]”(hÜ)�”}”(hŒUsing PGP with Git”h]”hŒUsing PGP with Git”…”�”}”(hjíh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÛhjêh²hh³hÇh´M‚ubj )�”}”(hXkOne of the core features of Git is its decentralized nature -- once a repository is cloned to your system, you have full history of the project, including all of its tags, commits and branches. However, with hundreds of cloned repositories floating around, how does anyone verify that their copy of linux.git has not been tampered with by a malicious third party?”h]”hXkOne of the core features of Git is its decentralized nature -- once a repository is cloned to your system, you have full history of the project, including all of its tags, commits and branches. However, with hundreds of cloned repositories floating around, how does anyone verify that their copy of linux.git has not been tampered with by a malicious third party?”…”�”}”(hjûh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´M„hjêh²hubj )�”}”(hŒµOr what happens if malicious code is discovered in the kernel and the "Author" line in the commit says it was done by you, while you're pretty sure you had `nothing to do with it`_?”h]”(hŒ¢Or what happens if malicious code is discovered in the kernel and the “Authorâ€� line in the commit says it was done by you, while you’re pretty sure you had ”…”�”}”(hj h²hh³Nh´Nubj)�”}”(hŒ`nothing to do with it`_”h]”hŒnothing to do with it”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œnothing to do with it”j[Œ3https://github.com/jayphelps/git-blame-someone-else”uh1jhj j]KubhŒ?”…”�”}”(hj h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´M‹hjêh²hubj )�”}”(hXPTo address both of these issues, Git introduced PGP integration. Signed tags prove the repository integrity by assuring that its contents are exactly the same as on the workstation of the developer who created the tag, while signed commits make it nearly impossible for someone to impersonate you without having access to your PGP keys.”h]”hXPTo address both of these issues, Git introduced PGP integration. Signed tags prove the repository integrity by assuring that its contents are exactly the same as on the workstation of the developer who created the tag, while signed commits make it nearly impossible for someone to impersonate you without having access to your PGP keys.”…”�”}”(hj,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´M�hjêh²hubhÉ)�”}”(hŒP.. _`nothing to do with it`: https://github.com/jayphelps/git-blame-someone-else”h]”h}”(h]”Œnothing-to-do-with-it”ah ]”h"]”Œnothing to do with it”ah$]”h&]”j[j!uh1hÈh´M•hjêh²hh³hÇjtKubh×)�”}”(hhh]”(hÜ)�”}”(hŒ!Configure git to use your PGP key”h]”hŒ!Configure git to use your PGP key”…”�”}”(hjIh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÛhjFh²hh³hÇh´M˜ubj )�”}”(hXIf you only have one secret key in your keyring, then you don't really need to do anything extra, as it becomes your default key. However, if you happen to have multiple secret keys, you can tell git which key should be used (``[fpr]`` is the fingerprint of your key)::”h]”(hŒåIf you only have one secret key in your keyring, then you don’t really need to do anything extra, as it becomes your default key. However, if you happen to have multiple secret keys, you can tell git which key should be used (”…”�”}”(hjWh²hh³Nh´Nubjæ)�”}”(hŒ ``[fpr]``”h]”hŒ[fpr]”…”�”}”(hj_h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jåhjWubhŒ! is the fingerprint of your key):”…”�”}”(hjWh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´MšhjFh²hubj¯)�”}”(hŒ+$ git config --global user.signingKey [fpr]”h]”hŒ+$ git config --global user.signingKey [fpr]”…”�”}”hjwsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j®h³hÇh´MŸhjFh²hubeh}”(h]”Œ!configure-git-to-use-your-pgp-key”ah ]”h"]”Œ!configure git to use your pgp key”ah$]”h&]”uh1hÖhjêh²hh³hÇh´M˜ubh×)�”}”(hhh]”(hÜ)�”}”(hŒHow to work with signed tags”h]”hŒHow to work with signed tags”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÛhj�h²hh³hÇh´M¢ubj )�”}”(hŒCTo create a signed tag, pass the ``-s`` switch to the tag command::”h]”(hŒ!To create a signed tag, pass the ”…”�”}”(hjžh²hh³Nh´Nubjæ)�”}”(hŒ``-s``”h]”hŒ-s”…”�”}”(hj¦h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jåhjžubhŒ switch to the tag command:”…”�”}”(hjžh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´M¤hj�h²hubj¯)�”}”(hŒ$ git tag -s [tagname]”h]”hŒ$ git tag -s [tagname]”…”�”}”hj¾sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j®h³hÇh´M¦hj�h²hubj )�”}”(hŒ¨Our recommendation is to always sign git tags, as this allows other developers to ensure that the git repository they are pulling from has not been maliciously altered.”h]”hŒ¨Our recommendation is to always sign git tags, as this allows other developers to ensure that the git repository they are pulling from has not been maliciously altered.”…”�”}”(hjÌh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´M¨hj�h²hubh×)�”}”(hhh]”(hÜ)�”}”(hŒHow to verify signed tags”h]”hŒHow to verify signed tags”…”�”}”(hjÝh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÛhjÚh²hh³hÇh´M­ubj )�”}”(hŒ8To verify a signed tag, use the ``verify-tag`` command::”h]”(hŒ To verify a signed tag, use the ”…”�”}”(hjëh²hh³Nh´Nubjæ)�”}”(hŒ``verify-tag``”h]”hŒ verify-tag”…”�”}”(hjóh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jåhjëubhŒ command:”…”�”}”(hjëh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´M¯hjÚh²hubj¯)�”}”(hŒ$ git verify-tag [tagname]”h]”hŒ$ git verify-tag [tagname]”…”�”}”hj sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j®h³hÇh´M±hjÚh²hubj )�”}”(hŒÃIf you are pulling a tag from another fork of the project repository, git should automatically verify the signature at the tip you're pulling and show you the results during the merge operation::”h]”hŒÄIf you are pulling a tag from another fork of the project repository, git should automatically verify the signature at the tip you’re pulling and show you the results during the merge operation:”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´M³hjÚh²hubj¯)�”}”(hŒ$ git pull [url] tags/sometag”h]”hŒ$ git pull [url] tags/sometag”…”�”}”hj'sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j®h³hÇh´M·hjÚh²hubj )�”}”(hŒ4The merge message will contain something like this::”h]”hŒ3The merge message will contain something like this:”…”�”}”(hj5h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´M¹hjÚh²hubj¯)�”}”(hŒiMerge tag 'sometag' of [url] [Tag message] # gpg: Signature made [...] # gpg: Good signature from [...]”h]”hŒiMerge tag 'sometag' of [url] [Tag message] # gpg: Signature made [...] # gpg: Good signature from [...]”…”�”}”hjCsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j®h³hÇh´M»hjÚh²hubj )�”}”(hŒ—If you are verifying someone else's git tag, you will first need to import their PGP key. Please refer to the ":ref:`verify_identities`" section below.”h]”(hŒsIf you are verifying someone else’s git tag, you will first need to import their PGP key. Please refer to the “”…”�”}”(hjQh²hh³Nh´Nubh)�”}”(hŒ:ref:`verify_identities`”h]”hŒinline”“”)�”}”(hj[h]”hŒverify_identities”…”�”}”(hj_h²hh³Nh´Nubah}”(h]”h ]”(Œxref”Œstd”Œstd-ref”eh"]”h$]”h&]”uh1j]hjYubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”Œprocess/maintainer-pgp-guide”Œ refdomain”jjŒreftype”Œref”Œ refexplicit”‰Œrefwarn”ˆŒ reftarget”Œverify_identities”uh1hh³hÇh´MÂhjQubhŒâ€� section below.”…”�”}”(hjQh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´MÂhjÚh²hubeh}”(h]”Œhow-to-verify-signed-tags”ah ]”h"]”Œhow to verify signed tags”ah$]”h&]”uh1hÖhj�h²hh³hÇh´M­ubh×)�”}”(hhh]”(hÜ)�”}”(hŒ+Configure git to always sign annotated tags”h]”hŒ+Configure git to always sign annotated tags”…”�”}”(hj“h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÛhj�h²hh³hÇh´MÇubj )�”}”(hŒ¡Chances are, if you're creating an annotated tag, you'll want to sign it. To force git to always sign annotated tags, you can set a global configuration option::”h]”hŒ¤Chances are, if you’re creating an annotated tag, you’ll want to sign it. To force git to always sign annotated tags, you can set a global configuration option:”…”�”}”(hj¡h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´MÉhj�h²hubj¯)�”}”(hŒ1$ git config --global tag.forceSignAnnotated true”h]”hŒ1$ git config --global tag.forceSignAnnotated true”…”�”}”hj¯sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j®h³hÇh´MÍhj�h²hubeh}”(h]”Œ+configure-git-to-always-sign-annotated-tags”ah ]”h"]”Œ+configure git to always sign annotated tags”ah$]”h&]”uh1hÖhj�h²hh³hÇh´MÇubeh}”(h]”Œhow-to-work-with-signed-tags”ah ]”h"]”Œhow to work with signed tags”ah$]”h&]”uh1hÖhjêh²hh³hÇh´M¢ubh×)�”}”(hhh]”(hÜ)�”}”(hŒHow to work with signed commits”h]”hŒHow to work with signed commits”…”�”}”(hjÐh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÛhjÍh²hh³hÇh´MÐubj )�”}”(hXIt is also possible to create signed commits, but they have limited usefulness in Linux kernel development. The kernel contribution workflow relies on sending in patches, and converting commits to patches does not preserve git commit signatures. Furthermore, when rebasing your own repository on a newer upstream, PGP commit signatures will end up discarded. For this reason, most kernel developers don't bother signing their commits and will ignore signed commits in any external repositories that they rely upon in their work.”h]”hXIt is also possible to create signed commits, but they have limited usefulness in Linux kernel development. The kernel contribution workflow relies on sending in patches, and converting commits to patches does not preserve git commit signatures. Furthermore, when rebasing your own repository on a newer upstream, PGP commit signatures will end up discarded. For this reason, most kernel developers don’t bother signing their commits and will ignore signed commits in any external repositories that they rely upon in their work.”…”�”}”(hjÞh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´MÒhjÍh²hubj )�”}”(hXThat said, if you have your working git tree publicly available at some git hosting service (kernel.org, infradead.org, ozlabs.org, or others), then the recommendation is that you sign all your git commits even if upstream developers do not directly benefit from this practice.”h]”hXThat said, if you have your working git tree publicly available at some git hosting service (kernel.org, infradead.org, ozlabs.org, or others), then the recommendation is that you sign all your git commits even if upstream developers do not directly benefit from this practice.”…”�”}”(hjìh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´MÛhjÍh²hubj )�”}”(hŒ,We recommend this for the following reasons:”h]”hŒ,We recommend this for the following reasons:”…”�”}”(hjúh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´MàhjÍh²hubjñ)�”}”(hhh]”(j¨)�”}”(hŒ³Should there ever be a need to perform code forensics or track code provenance, even externally maintained trees carrying PGP commit signatures will be valuable for such purposes.”h]”j )�”}”(hŒ³Should there ever be a need to perform code forensics or track code provenance, even externally maintained trees carrying PGP commit signatures will be valuable for such purposes.”h]”hŒ³Should there ever be a need to perform code forensics or track code provenance, even externally maintained trees carrying PGP commit signatures will be valuable for such purposes.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´Mâhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1j§hjh²hh³hÇh´Nubj¨)�”}”(hŒªIf you ever need to re-clone your local repository (for example, after reinstalling your system), this lets you verify the repository integrity before resuming your work.”h]”j )�”}”(hŒªIf you ever need to re-clone your local repository (for example, after reinstalling your system), this lets you verify the repository integrity before resuming your work.”h]”hŒªIf you ever need to re-clone your local repository (for example, after reinstalling your system), this lets you verify the repository integrity before resuming your work.”…”�”}”(hj'h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´Måhj#ubah}”(h]”h ]”h"]”h$]”h&]”uh1j§hjh²hh³hÇh´Nubj¨)�”}”(hŒwIf someone needs to cherry-pick your commits, this allows them to quickly verify their integrity before applying them. ”h]”j )�”}”(hŒvIf someone needs to cherry-pick your commits, this allows them to quickly verify their integrity before applying them.”h]”hŒvIf someone needs to cherry-pick your commits, this allows them to quickly verify their integrity before applying them.”…”�”}”(hj?h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´Mèhj;ubah}”(h]”h ]”h"]”h$]”h&]”uh1j§hjh²hh³hÇh´Nubeh}”(h]”h ]”h"]”h$]”h&]”j‹jŒj�hjŽj�uh1jðhjÍh²hh³hÇh´Mâubh×)�”}”(hhh]”(hÜ)�”}”(hŒCreating signed commits”h]”hŒCreating signed commits”…”�”}”(hj\h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÛhjYh²hh³hÇh´Mìubj )�”}”(hŒˆTo create a signed commit, pass the ``-S`` flag to the ``git commit`` command (it's capital ``-S`` due to collision with another flag)::”h]”(hŒ$To create a signed commit, pass the ”…”�”}”(hjjh²hh³Nh´Nubjæ)�”}”(hŒ``-S``”h]”hŒ-S”…”�”}”(hjrh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jåhjjubhŒ flag to the ”…”�”}”(hjjh²hh³Nh´Nubjæ)�”}”(hŒ``git commit``”h]”hŒ git commit”…”�”}”(hj„h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jåhjjubhŒ command (it’s capital ”…”�”}”(hjjh²hh³Nh´Nubjæ)�”}”(hŒ``-S``”h]”hŒ-S”…”�”}”(hj–h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jåhjjubhŒ% due to collision with another flag):”…”�”}”(hjjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´MîhjYh²hubj¯)�”}”(hŒ$ git commit -S”h]”hŒ$ git commit -S”…”�”}”hj®sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j®h³hÇh´MñhjYh²hubeh}”(h]”Œcreating-signed-commits”ah ]”h"]”Œcreating signed commits”ah$]”h&]”uh1hÖhjÍh²hh³hÇh´Mìubh×)�”}”(hhh]”(hÜ)�”}”(hŒ$Configure git to always sign commits”h]”hŒ$Configure git to always sign commits”…”�”}”(hjÇh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÛhjÄh²hh³hÇh´Môubj )�”}”(hŒ)You can tell git to always sign commits::”h]”hŒ(You can tell git to always sign commits:”…”�”}”(hjÕh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´MöhjÄh²hubj¯)�”}”(hŒ'git config --global commit.gpgSign true”h]”hŒ'git config --global commit.gpgSign true”…”�”}”hjãsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j®h³hÇh´MøhjÄh²hubjƒ)�”}”(hŒ>Make sure you configure ``gpg-agent`` before you turn this on.”h]”j )�”}”(hjóh]”(hŒMake sure you configure ”…”�”}”(hjõh²hh³Nh´Nubjæ)�”}”(hŒ ``gpg-agent``”h]”hŒ gpg-agent”…”�”}”(hjüh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jåhjõubhŒ before you turn this on.”…”�”}”(hjõh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´Mühjñubah}”(h]”h ]”h"]”h$]”h&]”uh1j‚hjÄh²hh³hÇh´NubhÉ)�”}”(hŒ.. _verify_identities:”h]”h}”(h]”h ]”h"]”h$]”h&]”hÔŒverify-identities”uh1hÈh´MþhjÄh²hh³hÇubeh}”(h]”Œ$configure-git-to-always-sign-commits”ah ]”h"]”Œ$configure git to always sign commits”ah$]”h&]”uh1hÖhjÍh²hh³hÇh´Môubeh}”(h]”Œhow-to-work-with-signed-commits”ah ]”h"]”Œhow to work with signed commits”ah$]”h&]”uh1hÖhjêh²hh³hÇh´MÐubh×)�”}”(hhh]”(hÜ)�”}”(hŒHow to work with signed patches”h]”hŒHow to work with signed patches”…”�”}”(hj8h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÛhj5h²hh³hÇh´Mubj )�”}”(hXaIt is possible to use your PGP key to sign patches sent to kernel developer mailing lists. Since existing email signature mechanisms (PGP-Mime or PGP-inline) tend to cause problems with regular code review tasks, you should use the tool kernel.org created for this purpose that puts cryptographic attestation signatures into message headers (a-la DKIM):”h]”hXaIt is possible to use your PGP key to sign patches sent to kernel developer mailing lists. Since existing email signature mechanisms (PGP-Mime or PGP-inline) tend to cause problems with regular code review tasks, you should use the tool kernel.org created for this purpose that puts cryptographic attestation signatures into message headers (a-la DKIM):”…”�”}”(hjFh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´Mhj5h²hubj£)�”}”(hhh]”j¨)�”}”(hŒ`Patatt Patch Attestation`_ ”h]”j )�”}”(hŒ`Patatt Patch Attestation`_”h]”j)�”}”(hj]h]”hŒPatatt Patch Attestation”…”�”}”(hj_h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”ŒPatatt Patch Attestation”j[Œ https://pypi.org/project/patatt/”uh1jhj[j]Kubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´M hjWubah}”(h]”h ]”h"]”h$]”h&]”uh1j§hjTh²hh³hÇh´Nubah}”(h]”h ]”h"]”h$]”h&]”jÞjßuh1j¢h³hÇh´M hj5h²hubhÉ)�”}”(hŒ@.. _`Patatt Patch Attestation`: https://pypi.org/project/patatt/”h]”h}”(h]”Œpatatt-patch-attestation”ah ]”h"]”Œpatatt patch attestation”ah$]”h&]”j[jnuh1hÈh´M hj5h²hh³hÇjtKubh×)�”}”(hhh]”(hÜ)�”}”(hŒ!Installing and configuring patatt”h]”hŒ!Installing and configuring patatt”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÛhj�h²hh³hÇh´Mubjƒ)�”}”(hŒeIf you use B4 to send in your patches, patatt is already installed and integrated into your workflow.”h]”j )�”}”(hŒeIf you use B4 to send in your patches, patatt is already installed and integrated into your workflow.”h]”hŒeIf you use B4 to send in your patches, patatt is already installed and integrated into your workflow.”…”�”}”(hj¢h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´Mhjžubah}”(h]”h ]”h"]”h$]”h&]”uh1j‚hj�h²hh³hÇh´Nubj )�”}”(hŒ‘Patatt is packaged for many distributions already, so please check there first. You can also install it from pypi using "``pip install patatt``".”h]”(hŒ{Patatt is packaged for many distributions already, so please check there first. You can also install it from pypi using “”…”�”}”(hj¶h²hh³Nh´Nubjæ)�”}”(hŒ``pip install patatt``”h]”hŒpip install patatt”…”�”}”(hj¾h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jåhj¶ubhŒâ€�.”…”�”}”(hj¶h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´Mhj�h²hubj )�”}”(hXIf you already have your PGP key configured with git (via the ``user.signingKey`` configuration parameter), then patatt requires no further configuration. You can start signing your patches by installing the git-send-email hook in the repository you want::”h]”(hŒ>If you already have your PGP key configured with git (via the ”…”�”}”(hjÖh²hh³Nh´Nubjæ)�”}”(hŒ``user.signingKey``”h]”hŒuser.signingKey”…”�”}”(hjÞh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jåhjÖubhŒ® configuration parameter), then patatt requires no further configuration. You can start signing your patches by installing the git-send-email hook in the repository you want:”…”�”}”(hjÖh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´Mhj�h²hubj¯)�”}”(hŒpatatt install-hook”h]”hŒpatatt install-hook”…”�”}”hjösbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j®h³hÇh´Mhj�h²hubj )�”}”(hŒpNow any patches you send with ``git send-email`` will be automatically signed with your cryptographic signature.”h]”(hŒNow any patches you send with ”…”�”}”(hjh²hh³Nh´Nubjæ)�”}”(hŒ``git send-email``”h]”hŒgit send-email”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jåhjubhŒ@ will be automatically signed with your cryptographic signature.”…”�”}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´M hj�h²hubeh}”(h]”Œ!installing-and-configuring-patatt”ah ]”h"]”Œ!installing and configuring patatt”ah$]”h&]”uh1hÖhj5h²hh³hÇh´Mubh×)�”}”(hhh]”(hÜ)�”}”(hŒChecking patatt signatures”h]”hŒChecking patatt signatures”…”�”}”(hj/h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÛhj,h²hh³hÇh´M$ubj )�”}”(hŒŸIf you are using ``b4`` to retrieve and apply patches, then it will automatically attempt to verify all DKIM and patatt signatures it encounters, for example::”h]”(hŒIf you are using ”…”�”}”(hj=h²hh³Nh´Nubjæ)�”}”(hŒ``b4``”h]”hŒb4”…”�”}”(hjEh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jåhj=ubhŒ‡ to retrieve and apply patches, then it will automatically attempt to verify all DKIM and patatt signatures it encounters, for example:”…”�”}”(hj=h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´M&hj,h²hubj¯)�”}”(hX¼$ b4 am 20220720205013.890942-1-broonie@kernel.org [...] Checking attestation on all messages, may take a moment... --- ✓ [PATCH v1 1/3] kselftest/arm64: Correct buffer allocation for SVE Z registers ✓ [PATCH v1 2/3] arm64/sve: Document our actual ABI for clearing registers on syscall ✓ [PATCH v1 3/3] kselftest/arm64: Enforce actual ABI for SVE syscalls --- ✓ Signed: openpgp/broonie@kernel.org ✓ Signed: DKIM/kernel.org”h]”hX¼$ b4 am 20220720205013.890942-1-broonie@kernel.org [...] Checking attestation on all messages, may take a moment... --- ✓ [PATCH v1 1/3] kselftest/arm64: Correct buffer allocation for SVE Z registers ✓ [PATCH v1 2/3] arm64/sve: Document our actual ABI for clearing registers on syscall ✓ [PATCH v1 3/3] kselftest/arm64: Enforce actual ABI for SVE syscalls --- ✓ Signed: openpgp/broonie@kernel.org ✓ Signed: DKIM/kernel.org”…”�”}”hj]sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j®h³hÇh´M*hj,h²hubjƒ)�”}”(hŒ�Patatt and b4 are still in active development and you should check the latest documentation for these projects for any new or updated features.”h]”j )�”}”(hŒ�Patatt and b4 are still in active development and you should check the latest documentation for these projects for any new or updated features.”h]”hŒ�Patatt and b4 are still in active development and you should check the latest documentation for these projects for any new or updated features.”…”�”}”(hjoh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´M7hjkubah}”(h]”h ]”h"]”h$]”h&]”uh1j‚hj,h²hh³hÇh´NubhÉ)�”}”(hŒ.. _kernel_identities:”h]”h}”(h]”h ]”h"]”h$]”h&]”hÔŒkernel-identities”uh1hÈh´M;hj,h²hh³hÇubeh}”(h]”Œchecking-patatt-signatures”ah ]”h"]”Œchecking patatt signatures”ah$]”h&]”uh1hÖhj5h²hh³hÇh´M$ubeh}”(h]”(Œhow-to-work-with-signed-patches”j$eh ]”h"]”(Œhow to work with signed patches”Œverify_identities”eh$]”h&]”uh1hÖhjêh²hh³hÇh´Mjr}”jœjsjt}”j$jsubeh}”(h]”(Œusing-pgp-with-git”jÎeh ]”h"]”(Œusing pgp with git”Œ pgp_with_git”eh$]”h&]”uh1hÖhhØh²hh³hÇh´M‚jr}”j§jÄsjt}”jÎjÄsubh×)�”}”(hhh]”(hÜ)�”}”(hŒ)How to verify kernel developer identities”h]”hŒ)How to verify kernel developer identities”…”�”}”(hj¯h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÛhj¬h²hh³hÇh´M>ubj )�”}”(hŒ¼Signing tags and commits is straightforward, but how does one go about verifying that the key used to sign something belongs to the actual kernel developer and not to a malicious imposter?”h]”hŒ¼Signing tags and commits is straightforward, but how does one go about verifying that the key used to sign something belongs to the actual kernel developer and not to a malicious imposter?”…”�”}”(hj½h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´M@hj¬h²hubh×)�”}”(hhh]”(hÜ)�”}”(hŒ/Configure auto-key-retrieval using WKD and DANE”h]”hŒ/Configure auto-key-retrieval using WKD and DANE”…”�”}”(hjÎh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÛhjËh²hh³hÇh´MEubj )�”}”(hXiIf you are not already someone with an extensive collection of other developers' public keys, then you can jumpstart your keyring by relying on key auto-discovery and auto-retrieval. GnuPG can piggyback on other delegated trust technologies, namely DNSSEC and TLS, to get you going if the prospect of starting your own Web of Trust from scratch is too daunting.”h]”hXkIf you are not already someone with an extensive collection of other developers’ public keys, then you can jumpstart your keyring by relying on key auto-discovery and auto-retrieval. GnuPG can piggyback on other delegated trust technologies, namely DNSSEC and TLS, to get you going if the prospect of starting your own Web of Trust from scratch is too daunting.”…”�”}”(hjÜh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´MGhjËh²hubj )�”}”(hŒ1Add the following to your ``~/.gnupg/gpg.conf``::”h]”(hŒAdd the following to your ”…”�”}”(hjêh²hh³Nh´Nubjæ)�”}”(hŒ``~/.gnupg/gpg.conf``”h]”hŒ~/.gnupg/gpg.conf”…”�”}”(hjòh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jåhjêubhŒ:”…”�”}”(hjêh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´MNhjËh²hubj¯)�”}”(hŒ0auto-key-locate wkd,dane,local auto-key-retrieve”h]”hŒ0auto-key-locate wkd,dane,local auto-key-retrieve”…”�”}”hj sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j®h³hÇh´MPhjËh²hubj )�”}”(hX¨DNS-Based Authentication of Named Entities ("DANE") is a method for publishing public keys in DNS and securing them using DNSSEC signed zones. Web Key Directory ("WKD") is the alternative method that uses https lookups for the same purpose. When using either DANE or WKD for looking up public keys, GnuPG will validate DNSSEC or TLS certificates, respectively, before adding auto-retrieved public keys to your local keyring.”h]”hX°DNS-Based Authentication of Named Entities (“DANEâ€�) is a method for publishing public keys in DNS and securing them using DNSSEC signed zones. Web Key Directory (“WKDâ€�) is the alternative method that uses https lookups for the same purpose. When using either DANE or WKD for looking up public keys, GnuPG will validate DNSSEC or TLS certificates, respectively, before adding auto-retrieved public keys to your local keyring.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´MShjËh²hubj )�”}”(hŒïKernel.org publishes the WKD for all developers who have kernel.org accounts. Once you have the above changes in your ``gpg.conf``, you can auto-retrieve the keys for Linus Torvalds and Greg Kroah-Hartman (if you don't already have them)::”h]”(hŒvKernel.org publishes the WKD for all developers who have kernel.org accounts. Once you have the above changes in your ”…”�”}”(hj&h²hh³Nh´Nubjæ)�”}”(hŒ ``gpg.conf``”h]”hŒgpg.conf”…”�”}”(hj.h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jåhj&ubhŒn, you can auto-retrieve the keys for Linus Torvalds and Greg Kroah-Hartman (if you don’t already have them):”…”�”}”(hj&h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´M[hjËh²hubj¯)�”}”(hŒ9$ gpg --locate-keys torvalds@kernel.org gregkh@kernel.org”h]”hŒ9$ gpg --locate-keys torvalds@kernel.org gregkh@kernel.org”…”�”}”hjFsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j®h³hÇh´M`hjËh²hubj )�”}”(hŒ‹If you have a kernel.org account, then you should `add the kernel.org UID to your key`_ to make WKD more useful to other kernel developers.”h]”(hŒ2If you have a kernel.org account, then you should ”…”�”}”(hjTh²hh³Nh´Nubj)�”}”(hŒ%`add the kernel.org UID to your key`_”h]”hŒ"add the kernel.org UID to your key”…”�”}”(hj\h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œ"add the kernel.org UID to your key”j[ŒNhttps://korg.docs.kernel.org/mail.html#adding-a-kernel-org-uid-to-your-pgp-key”uh1jhjTj]KubhŒ4 to make WKD more useful to other kernel developers.”…”�”}”(hjTh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´MbhjËh²hubhÉ)�”}”(hŒx.. _`add the kernel.org UID to your key`: https://korg.docs.kernel.org/mail.html#adding-a-kernel-org-uid-to-your-pgp-key”h]”h}”(h]”Œ"add-the-kernel-org-uid-to-your-key”ah ]”h"]”Œ"add the kernel.org uid to your key”ah$]”h&]”j[jluh1hÈh´MehjËh²hh³hÇjtKubeh}”(h]”Œ/configure-auto-key-retrieval-using-wkd-and-dane”ah ]”h"]”Œ/configure auto-key-retrieval using wkd and dane”ah$]”h&]”uh1hÖhj¬h²hh³hÇh´MEubh×)�”}”(hhh]”(hÜ)�”}”(hŒ0Web of Trust (WOT) vs. Trust on First Use (TOFU)”h]”hŒ0Web of Trust (WOT) vs. Trust on First Use (TOFU)”…”�”}”(hjŽh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÛhj‹h²hh³hÇh´Mhubj )�”}”(hXHPGP incorporates a trust delegation mechanism known as the "Web of Trust." At its core, this is an attempt to replace the need for centralized Certification Authorities of the HTTPS/TLS world. Instead of various software makers dictating who should be your trusted certifying entity, PGP leaves this responsibility to each user.”h]”hXLPGP incorporates a trust delegation mechanism known as the “Web of Trust.â€� At its core, this is an attempt to replace the need for centralized Certification Authorities of the HTTPS/TLS world. Instead of various software makers dictating who should be your trusted certifying entity, PGP leaves this responsibility to each user.”…”�”}”(hjœh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´Mjhj‹h²hubj )�”}”(hX„Unfortunately, very few people understand how the Web of Trust works. While it is still an important part of the OpenPGP specification, recent versions of GnuPG (2.2 and above) have implemented an alternative mechanism called "Trust on First Use" (TOFU). You can think of TOFU as "the SSH-like approach to trust." With SSH, the first time you connect to a remote system, its key fingerprint is recorded and remembered. If the key changes in the future, the SSH client will alert you and refuse to connect, forcing you to make a decision on whether you choose to trust the changed key or not. Similarly, the first time you import someone's PGP key, it is assumed to be valid. If at any point in the future GnuPG comes across another key with the same identity, both the previously imported key and the new key will be marked for verification and you will need to manually figure out which one to keep.”h]”hXŽUnfortunately, very few people understand how the Web of Trust works. While it is still an important part of the OpenPGP specification, recent versions of GnuPG (2.2 and above) have implemented an alternative mechanism called “Trust on First Useâ€� (TOFU). You can think of TOFU as “the SSH-like approach to trust.â€� With SSH, the first time you connect to a remote system, its key fingerprint is recorded and remembered. If the key changes in the future, the SSH client will alert you and refuse to connect, forcing you to make a decision on whether you choose to trust the changed key or not. Similarly, the first time you import someone’s PGP key, it is assumed to be valid. If at any point in the future GnuPG comes across another key with the same identity, both the previously imported key and the new key will be marked for verification and you will need to manually figure out which one to keep.”…”�”}”(hjªh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´Mphj‹h²hubj )�”}”(hŒµWe recommend that you use the combined TOFU+PGP trust model (which is the new default in GnuPG v2). To set it, add (or modify) the ``trust-model`` setting in ``~/.gnupg/gpg.conf``::”h]”(hŒƒWe recommend that you use the combined TOFU+PGP trust model (which is the new default in GnuPG v2). To set it, add (or modify) the ”…”�”}”(hj¸h²hh³Nh´Nubjæ)�”}”(hŒ``trust-model``”h]”hŒ trust-model”…”�”}”(hjÀh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jåhj¸ubhŒ setting in ”…”�”}”(hj¸h²hh³Nh´Nubjæ)�”}”(hŒ``~/.gnupg/gpg.conf``”h]”hŒ~/.gnupg/gpg.conf”…”�”}”(hjÒh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jåhj¸ubhŒ:”…”�”}”(hj¸h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´M~hj‹h²hubj¯)�”}”(hŒtrust-model tofu+pgp”h]”hŒtrust-model tofu+pgp”…”�”}”hjêsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j®h³hÇh´M‚hj‹h²hubhÉ)�”}”(hŒ .. _kernel_org_trust_repository:”h]”h}”(h]”h ]”h"]”h$]”h&]”hÔŒkernel-org-trust-repository”uh1hÈh´M„hj‹h²hh³hÇubeh}”(h]”Œ+web-of-trust-wot-vs-trust-on-first-use-tofu”ah ]”h"]”Œ0web of trust (wot) vs. trust on first use (tofu)”ah$]”h&]”uh1hÖhj¬h²hh³hÇh´Mhubh×)�”}”(hhh]”(hÜ)�”}”(hŒ,Using the kernel.org web of trust repository”h]”hŒ,Using the kernel.org web of trust repository”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÛhj h²hh³hÇh´M‡ubj )�”}”(hXKernel.org maintains a git repository with developers' public keys as a replacement for replicating keyserver networks that have gone mostly dark in the past few years. The full documentation for how to set up that repository as your source of public keys can be found here:”h]”hXKernel.org maintains a git repository with developers’ public keys as a replacement for replicating keyserver networks that have gone mostly dark in the past few years. The full documentation for how to set up that repository as your source of public keys can be found here:”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´M‰hj h²hubj£)�”}”(hhh]”j¨)�”}”(hŒ `Kernel developer PGP Keyring`_ ”h]”j )�”}”(hŒ`Kernel developer PGP Keyring`_”h]”j)�”}”(hj3h]”hŒKernel developer PGP Keyring”…”�”}”(hj5h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”ŒKernel developer PGP Keyring”j[Œ)https://korg.docs.kernel.org/pgpkeys.html”uh1jhj1j]Kubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´MŽhj-ubah}”(h]”h ]”h"]”h$]”h&]”uh1j§hj*h²hh³hÇh´Nubah}”(h]”h ]”h"]”h$]”h&]”jÞjßuh1j¢h³hÇh´MŽhj h²hubj )�”}”(hŒcIf you are a kernel developer, please consider submitting your key for inclusion into that keyring.”h]”hŒcIf you are a kernel developer, please consider submitting your key for inclusion into that keyring.”…”�”}”(hjWh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´M�hj h²hubhÉ)�”}”(hŒM.. _`Kernel developer PGP Keyring`: https://korg.docs.kernel.org/pgpkeys.html”h]”h}”(h]”Œkernel-developer-pgp-keyring”ah ]”h"]”Œkernel developer pgp keyring”ah$]”h&]”j[jDuh1hÈh´M“hj h²hh³hÇjtKubeh}”(h]”(Œ,using-the-kernel-org-web-of-trust-repository”jeh ]”h"]”(Œ,using the kernel.org web of trust repository”Œkernel_org_trust_repository”eh$]”h&]”uh1hÖhj¬h²hh³hÇh´M‡jr}”jwjøsjt}”jjøsubeh}”(h]”(Œ)how-to-verify-kernel-developer-identities”j�eh ]”h"]”(Œ)how to verify kernel developer identities”Œkernel_identities”eh$]”h&]”uh1hÖhhØh²hh³hÇh´M>jr}”j‚jƒsjt}”j�jƒsubeh}”(h]”(Œkernel-maintainer-pgp-guide”hÕeh ]”h"]”(Œkernel maintainer pgp guide”Œpgpguide”eh$]”h&]”uh1hÖhhh²hh³hÇh´Kjr}”j�hÊsjt}”hÕhÊsubeh}”(h]”h ]”h"]”h$]”h&]”Œsource”hÇuh1hŒcurrent_source”NŒ current_line”NŒsettings”Œdocutils.frontend”ŒValues”“”)�”}”(hÛNŒ generator”NŒ datestamp”NŒ source_link”NŒ source_url”NŒ toc_backlinks”Œentry”Œfootnote_backlinks”KŒ sectnum_xform”KŒstrip_comments”NŒstrip_elements_with_classes”NŒ strip_classes”NŒ report_level”KŒ halt_level”KŒexit_status_level”KŒdebug”NŒwarning_stream”NŒ traceback”ˆŒinput_encoding”Œ utf-8-sig”Œinput_encoding_error_handler”Œstrict”Œoutput_encoding”Œutf-8”Œoutput_encoding_error_handler”jµŒerror_encoding”Œutf-8”Œerror_encoding_error_handler”Œbackslashreplace”Œ language_code”Œen”Œrecord_dependencies”NŒconfig”NŒ id_prefix”hŒauto_id_prefix”Œid”Œ dump_settings”NŒdump_internals”NŒdump_transforms”NŒdump_pseudo_xml”NŒexpose_internals”NŒstrict_visitor”NŒ_disable_config”NŒ_source”hÇŒ _destination”NŒ _config_files”]”Œ7/var/lib/git/docbuild/linux/Documentation/docutils.conf”aŒfile_insertion_enabled”ˆŒ raw_enabled”KŒline_length_limit”M'Œpep_references”NŒ pep_base_url”Œhttps://peps.python.org/”Œpep_file_url_template”Œpep-%04d”Œrfc_references”NŒ rfc_base_url”Œ&https://datatracker.ietf.org/doc/html/”Œ tab_width”KŒtrim_footnote_reference_space”‰Œsyntax_highlight”Œlong”Œ smart_quotes”ˆŒsmartquotes_locales”]”Œcharacter_level_inline_markup”‰Œdoctitle_xform”‰Œ docinfo_xform”KŒsectsubtitle_xform”‰Œ image_loading”Œlink”Œembed_stylesheet”‰Œcloak_email_addresses”ˆŒsection_self_link”‰Œenv”NubŒreporter”NŒindirect_targets”]”Œsubstitution_defs”}”Œsubstitution_names”}”Œrefnames”}”(Œprotecting code integrity”]”(jKjÛeŒnitrokey start”]”j5 aŒgnuk”]”jJ aŒ nitrokey 3”]”js aŒ yubikey 5”]”jœ aŒ!qualify for a free nitrokey start”]”jñ aŒagent forwarding over ssh”]”jˆaŒnothing to do with it”]”jaŒpatatt patch attestation”]”j_aŒ"add the kernel.org uid to your key”]”j\aŒkernel developer pgp keyring”]”j5auŒrefids”}”(hÕ]”hÊaj0]”j&ajh]”j^aj¦]”jœaj� ]”jƒ ajÎ]”jÄaj$]”jaj�]”jƒaj]”jøauŒnameids”}”(j�hÕjŒj‰jqjnj{jxjoj0jnjkj½jhj¼j¹j´j±j¬j©j¤ j¦j£ j  j÷jôjLjIj“j�jbj_j1 j. j› j˜ j“ j� jåj� jäjáj j jS jP j j j' j$ j3 j0 j? j< jK jH jþ jû jjj¨j¥j jjÜjÙj«j¨j&j#j[jXjÔjÑjÁj¾j§jÎj¦j£jCj@jŠj‡jÊjÇj�jŠjÂj¿j2j/jÁj¾j*j'jœj$j›j˜jŠj‡j)j&j“j�j‚j�j�j~jˆj…j€j}jjjwjjvjsjnjkuŒ nametypes”}”(j�ˆjŒ‰jqˆj{‰joˆjn‰j½ˆj¼‰j´‰j¬‰j¤ ˆj£ ‰j÷‰jL‰j“‰jb‰j1 ‰j› ‰j“ ‰jåˆjä‰j ‰jS ‰j ˆj' ˆj3 ˆj? ˆjK ˆjþ ‰j‰j¨‰j ‰j܉j«‰j&‰j[‰jÔ‰jÁˆj§ˆj¦‰jCˆjЉjʉj�‰j‰j2‰jÁ‰j*‰jœˆj›‰jŠˆj)‰j“‰j‚ˆj�‰jˆ‰j€ˆj‰jwˆjv‰jnˆuh}”(hÕhØj‰hØjnjhjxjuj0j1jkj1jhj~j¹j~j±j�j©jÌj¦jÂj  jÂjôjjIjúj�jOj_j–j. jej˜ j4 j� jü j� j© jáj© j jÖ jP j j j j$ j j0 j* j< j6 jH jB jû jV jjj¥jòjj«jÙjj¨j5j#j®jXj)jÑj^j¾j¸jÎjêj£jêj@j:j‡jFjÇj�jŠjÚj¿j�j/jÍj¾jYj'jÄj$j5j˜j5j‡j�j&j�j�j,j�j¬j~j¬j…jËj}jwjj‹jj jsj jkjeuŒ footnote_refs”}”Œ citation_refs”}”Œ autofootnotes”]”Œautofootnote_refs”]”Œsymbol_footnotes”]”Œsymbol_footnote_refs”]”Œ footnotes”]”Œ citations”]”Œautofootnote_start”KŒsymbol_footnote_start”KŒ id_counter”Œ collections”ŒCounter”“”}”jÃKs…”R”Œparse_messages”]”Œtransform_messages”]”(hŒsystem_message”“”)�”}”(hhh]”j )�”}”(hhh]”hŒ.Hyperlink target "pgpguide" is not referenced.”…”�”}”hj=sbah}”(h]”h ]”h"]”h$]”h&]”uh1j hj:ubah}”(h]”h ]”h"]”h$]”h&]”Œlevel”KŒtype”ŒINFO”Œsource”hÇŒline”Kuh1j8ubj9)�”}”(hhh]”j )�”}”(hhh]”hŒ4Hyperlink target "devs-not-infra" is not referenced.”…”�”}”hjXsbah}”(h]”h ]”h"]”h$]”h&]”uh1j hjUubah}”(h]”h ]”h"]”h$]”h&]”Œlevel”KŒtype”jRŒsource”hÇŒline”K(uh1j8ubj9)�”}”(hhh]”j )�”}”(hhh]”hŒ/Hyperlink target "pgp-tools" is not referenced.”…”�”}”hjrsbah}”(h]”h ]”h"]”h$]”h&]”uh1j hjoubah}”(h]”h ]”h"]”h$]”h&]”Œlevel”KŒtype”jRŒsource”hÇŒline”K