Keyrings Archive mirror
 help / color / mirror / Atom feed
From: Roberto Sassu <roberto.sassu@huaweicloud.com>
To: dhowells@redhat.com, dwmw2@infradead.org,
	herbert@gondor.apana.org.au,  davem@davemloft.net
Cc: linux-kernel@vger.kernel.org, keyrings@vger.kernel.org,
	 linux-crypto@vger.kernel.org, zohar@linux.ibm.com,
	 linux-integrity@vger.kernel.org,
	Roberto Sassu <roberto.sassu@huawei.com>
Subject: Re: [PATCH v2 00/14] KEYS: Add support for PGP keys and signatures
Date: Mon, 19 Aug 2024 18:30:38 +0200	[thread overview]
Message-ID: <d0070fb3b46aa9d8f02ee9d0558cd6107af74a73.camel@huaweicloud.com> (raw)
In-Reply-To: <20240818165756.629203-1-roberto.sassu@huaweicloud.com>

On Sun, 2024-08-18 at 18:57 +0200, Roberto Sassu wrote:
> From: Roberto Sassu <roberto.sassu@huawei.com>
> 
> Support for PGP keys and signatures was proposed by David long time ago,
> before the decision of using PKCS#7 for kernel modules signatures
> verification was made. After that, there has been not enough interest to
> support PGP too.
> 
> Lately, when discussing a proposal of introducing fsverity signatures in
> Fedora [1], developers expressed their preference on not having a separate
> key for signing, which would complicate the management of the distribution.
> They would be more in favor of using the same PGP key, currently used for
> signing RPM headers, also for file-based signatures (not only fsverity, but
> also IMA ones).

Update: since Fedora 39, IMA file signatures are supported on an
independent key infrastructure.

Roberto

> Another envisioned use case would be to add the ability to appraise RPM
> headers with their existing PGP signature, so that they can be used as an
> authenticated source of reference values for appraising remaining
> files [2].
> 
> To make these use cases possible, introduce support for PGP keys and
> signatures in the kernel, and load provided PGP keys in the built-in
> keyring, so that PGP signatures of RPM headers, fsverity digests, and IMA
> digests can be verified from this trust anchor.
> 
> In addition to the original version of the patch set, also introduce
> support for signature verification of PGP keys, so that those keys can be
> added to keyrings with a signature-based restriction (e.g. .ima). PGP keys
> are searched with partial IDs, provided with signature subtype 16 (Issuer).
> Search with full IDs could be supported with
> draft-ietf-openpgp-rfc4880bis-10, by retrieving the information from
> signature subtype 33 (Issuer Fingerprint). Due to the possibility of ID
> collisions, the key_or_keyring restriction is not supported.
> 
> The patch set includes two preliminary patches: patch 1 introduces
> mpi_key_length(), to get the number of bits and bytes of an MPI; patch 2
> introduces rsa_parse_priv_key_raw() and rsa_parse_pub_key_raw(), to parse
> an RSA key in RAW format if the ASN.1 parser returns an error.
> 
> Patches 3-5 introduce the library necessary to parse PGP keys and
> signatures, whose support is added with patches 6-10. Patch 11 introduces
> verify_pgp_signature() to be used by kernel subsystems (e.g. fsverity and
> IMA). Patch 12 is for testing of PGP signatures. Finally, patches 13-14
> allow loading a set of PGP keys from a supplied blob at boot time.
> 
> Changelog
> 
> v1 [4]:
> - Remove quiet_cmd_extract_certs (redundant, likely leftover from
>   conflict resolution)
> - Load PGP keys embedded in the kernel image within load_module_cert()
>   and load_system_certificate_list(), instead of using a separate initcall
> - Style bug fixes found by checkpatch.pl
> - Add <crypto/pgp.h> include in crypto/asymmetric_keys/pgp_preload.c, to
>   remove no previous prototype warning
> - Correctly check returned tfm in pgp_generate_fingerprint()
> - Fix printing message in pgp_generate_fingerprint()
> - Don't create a public key if the key blob does not contain a PGP key
>   packet
> - Remove unused pgp_pubkey_hash array
> - Set KEY_EFLAG_DIGITALSIG key flag if the key has the capability
> - Allow PGP_SIG_GENERAL_CERT_OF_UID_PUBKEY signature type (for key sigs)
> - Add is_key_sig parameter to pgp_sig_get_sig() to ensure the key
>   signature type is PGP_SIG_GENERAL_CERT_OF_UID_PUBKEY or
>   PGP_SIG_POSTITIVE_CERT_OF_UID_PUBKEY
> 
> v0 [3]:
> - style fixes
> - move include/linux/pgp.h and pgplib.h to crypto/asymmetric_keys
> - introduce verify_pgp_signature()
> - replace KEY_ALLOC_TRUSTED flag with KEY_ALLOC_BUILT_IN
> - don't fetch PGP subkeys
> - drop support for DSA
> - store number of MPIs in pgp_key_algo_p_num_mpi array
> - replace dynamic memory allocations with static ones in
>   pgp_generate_fingerprint()
> - store only keys with capability of verifying signatures
> - remember selection of PGP signature packet and don't repeat parsing
> - move search of the PGP key to verify the signature from the beginning
>   to the end of the verification process (to be similar with PKCS#7)
> - don't retry key search in the session keyring from the signature
>   verification code, let the caller pass the desired keyring
> - for the PGP signature test key type, retry the key search in the session
>   keyring
> - retry key search in restrict_link_by_signature() with a partial ID
>   (provided in the PGP signature)
> 
> [1] https://fedoraproject.org/wiki/Changes/FsVerityRPM
> [2] https://lore.kernel.org/linux-integrity/20240415142436.2545003-1-roberto.sassu@huaweicloud.com/
> [3] https://git.kernel.org/pub/scm/linux/kernel/git/dhowells/linux-modsign.git/log/?h=pgp-parser
> [4] https://lore.kernel.org/linux-integrity/20220111180318.591029-1-roberto.sassu@huawei.com/
> 
> David Howells (8):
>   PGPLIB: PGP definitions (RFC 4880)
>   PGPLIB: Basic packet parser
>   PGPLIB: Signature parser
>   KEYS: PGP data parser
>   KEYS: Provide PGP key description autogeneration
>   KEYS: PGP-based public key signature verification
>   PGP: Provide a key type for testing PGP signatures
>   KEYS: Provide a function to load keys from a PGP keyring blob
> 
> Roberto Sassu (6):
>   mpi: Introduce mpi_key_length()
>   rsa: add parser of raw format
>   KEYS: Retry asym key search with partial ID in
>     restrict_link_by_signature()
>   KEYS: Calculate key digest and get signature of the key
>   verification: introduce verify_pgp_signature()
>   KEYS: Introduce load_pgp_public_keyring()
> 
>  MAINTAINERS                             |   1 +
>  certs/Kconfig                           |  11 +
>  certs/Makefile                          |   7 +
>  certs/system_certificates.S             |  18 +
>  certs/system_keyring.c                  |  93 ++++
>  crypto/asymmetric_keys/Kconfig          |  38 ++
>  crypto/asymmetric_keys/Makefile         |  13 +
>  crypto/asymmetric_keys/pgp.h            | 206 ++++++++
>  crypto/asymmetric_keys/pgp_library.c    | 620 ++++++++++++++++++++++++
>  crypto/asymmetric_keys/pgp_parser.h     |  18 +
>  crypto/asymmetric_keys/pgp_preload.c    | 111 +++++
>  crypto/asymmetric_keys/pgp_public_key.c | 492 +++++++++++++++++++
>  crypto/asymmetric_keys/pgp_signature.c  | 505 +++++++++++++++++++
>  crypto/asymmetric_keys/pgp_test_key.c   | 129 +++++
>  crypto/asymmetric_keys/pgplib.h         |  74 +++
>  crypto/asymmetric_keys/restrict.c       |  10 +-
>  crypto/rsa.c                            |  14 +-
>  crypto/rsa_helper.c                     |  69 +++
>  include/crypto/internal/rsa.h           |   6 +
>  include/crypto/pgp.h                    |  36 ++
>  include/linux/mpi.h                     |   2 +
>  include/linux/verification.h            |  23 +
>  lib/crypto/mpi/mpicoder.c               |  33 +-
>  23 files changed, 2516 insertions(+), 13 deletions(-)
>  create mode 100644 crypto/asymmetric_keys/pgp.h
>  create mode 100644 crypto/asymmetric_keys/pgp_library.c
>  create mode 100644 crypto/asymmetric_keys/pgp_parser.h
>  create mode 100644 crypto/asymmetric_keys/pgp_preload.c
>  create mode 100644 crypto/asymmetric_keys/pgp_public_key.c
>  create mode 100644 crypto/asymmetric_keys/pgp_signature.c
>  create mode 100644 crypto/asymmetric_keys/pgp_test_key.c
>  create mode 100644 crypto/asymmetric_keys/pgplib.h
>  create mode 100644 include/crypto/pgp.h
> 


  parent reply	other threads:[~2024-08-19 16:31 UTC|newest]

Thread overview: 32+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-08-18 16:57 [PATCH v2 00/14] KEYS: Add support for PGP keys and signatures Roberto Sassu
2024-08-18 16:57 ` [PATCH v2 01/14] mpi: Introduce mpi_key_length() Roberto Sassu
2024-08-19 17:55   ` Jarkko Sakkinen
2024-08-18 16:57 ` [PATCH v2 02/14] rsa: add parser of raw format Roberto Sassu
2024-08-19 17:56   ` Jarkko Sakkinen
2024-08-18 16:57 ` [PATCH v2 03/14] PGPLIB: PGP definitions (RFC 4880) Roberto Sassu
2024-08-18 16:57 ` [PATCH v2 04/14] PGPLIB: Basic packet parser Roberto Sassu
2024-08-19 14:34   ` Jeff Johnson
2024-08-19 15:06     ` Roberto Sassu
2024-08-18 16:57 ` [PATCH v2 05/14] PGPLIB: Signature parser Roberto Sassu
2024-08-18 16:57 ` [PATCH v2 06/14] KEYS: PGP data parser Roberto Sassu
2024-08-19 14:36   ` Jeff Johnson
2024-08-19 14:38     ` Roberto Sassu
2024-08-18 16:57 ` [PATCH v2 07/14] KEYS: Provide PGP key description autogeneration Roberto Sassu
2024-08-18 16:57 ` [PATCH v2 08/14] KEYS: PGP-based public key signature verification Roberto Sassu
2024-08-18 16:57 ` [PATCH v2 09/14] KEYS: Retry asym key search with partial ID in restrict_link_by_signature() Roberto Sassu
2024-08-18 16:57 ` [PATCH v2 10/14] KEYS: Calculate key digest and get signature of the key Roberto Sassu
2024-08-18 16:57 ` [PATCH v2 11/14] verification: introduce verify_pgp_signature() Roberto Sassu
2024-08-18 16:57 ` [PATCH v2 12/14] PGP: Provide a key type for testing PGP signatures Roberto Sassu
2024-08-19 14:37   ` Jeff Johnson
2024-08-18 16:57 ` [PATCH v2 13/14] KEYS: Provide a function to load keys from a PGP keyring blob Roberto Sassu
2024-08-18 16:57 ` [PATCH v2 14/14] KEYS: Introduce load_pgp_public_keyring() Roberto Sassu
2024-08-19 15:08 ` [PATCH v2 00/14] KEYS: Add support for PGP keys and signatures Jonathan McDowell
2024-08-19 15:15   ` Roberto Sassu
2024-08-20 14:12     ` Jonathan McDowell
2024-08-20 14:14       ` Roberto Sassu
2024-09-10 14:36       ` Roberto Sassu
2024-09-10 14:51         ` Roberto Sassu
2024-09-10 15:16           ` Jonathan McDowell
2024-09-11  9:55             ` Roberto Sassu
2024-08-19 16:30 ` Roberto Sassu [this message]
2024-08-19 17:53 ` Jarkko Sakkinen

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=d0070fb3b46aa9d8f02ee9d0558cd6107af74a73.camel@huaweicloud.com \
    --to=roberto.sassu@huaweicloud.com \
    --cc=davem@davemloft.net \
    --cc=dhowells@redhat.com \
    --cc=dwmw2@infradead.org \
    --cc=herbert@gondor.apana.org.au \
    --cc=keyrings@vger.kernel.org \
    --cc=linux-crypto@vger.kernel.org \
    --cc=linux-integrity@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=roberto.sassu@huawei.com \
    --cc=zohar@linux.ibm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).