[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <d0070fb3b46aa9d8f02ee9d0558cd6107af74a73.camel@huaweicloud.com>
Date: Mon, 19 Aug 2024 18:30:38 +0200
From: Roberto Sassu <roberto.sassu@...weicloud.com>
To: dhowells@...hat.com, dwmw2@...radead.org, herbert@...dor.apana.org.au,
davem@...emloft.net
Cc: linux-kernel@...r.kernel.org, keyrings@...r.kernel.org,
linux-crypto@...r.kernel.org, zohar@...ux.ibm.com,
linux-integrity@...r.kernel.org, Roberto Sassu <roberto.sassu@...wei.com>
Subject: Re: [PATCH v2 00/14] KEYS: Add support for PGP keys and signatures
On Sun, 2024-08-18 at 18:57 +0200, Roberto Sassu wrote:
> From: Roberto Sassu <roberto.sassu@...wei.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
>
Powered by blists - more mailing lists