Message ID | 20210219154114.2416778-1-stefanb@linux.vnet.ibm.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | certs: Add support for using elliptic curve keys for signing modules | expand |
On Fri, 2021-02-19 at 10:41 -0500, Stefan Berger wrote: > From: Stefan Berger <stefanb@linux.ibm.com> > > This patch adds support for using elliptic curve keys for signing > modules. It uses a NIST P256 (prime256v1) key if the user chooses an > elliptic curve key. > > A developer choosing an ECDSA key for signing modules has to manually > delete the signing key (rm certs/signing_key.*) when falling back to > an older version of a kernel that only supports RSA key since otherwise > ECDSA-signed modules will not be usable when that older kernel runs. > > Signed-off-by: Stefan Berger <stefanb@linux.ibm.com> Thanks, Stefan! Tested with this patch applied on top of "[PATCH v8 0/4] Add support for x509 certs with NIST p256 and p192" and "[PATCH v2 0/5] ima: kernel build support for loading the kernel module" patch sets. Tested-by: Mimi Zohar <zohar@linux.ibm.com> Reviewed-by: Mimi Zohar <zohar@linux.ibm.com>
On 2/19/21 11:52 AM, Mimi Zohar wrote: > On Fri, 2021-02-19 at 10:41 -0500, Stefan Berger wrote: >> From: Stefan Berger <stefanb@linux.ibm.com> >> >> This patch adds support for using elliptic curve keys for signing >> modules. It uses a NIST P256 (prime256v1) key if the user chooses an >> elliptic curve key. >> >> A developer choosing an ECDSA key for signing modules has to manually >> delete the signing key (rm certs/signing_key.*) when falling back to >> an older version of a kernel that only supports RSA key since otherwise >> ECDSA-signed modules will not be usable when that older kernel runs. >> >> Signed-off-by: Stefan Berger <stefanb@linux.ibm.com> > Thanks, Stefan! > > Tested with this patch applied on top of "[PATCH v8 0/4] Add support > for x509 certs with NIST p256 and p192" and "[PATCH v2 0/5] ima: kernel > build support for loading the kernel module" patch sets. With Saulo's NIST p384 support we will now be able to improve this patch to use secp384r1 (NIST P384), which is probably the better equivalent to the current RSA 4096. Stefan > > Tested-by: Mimi Zohar <zohar@linux.ibm.com> > Reviewed-by: Mimi Zohar <zohar@linux.ibm.com> >
diff --git a/certs/Kconfig b/certs/Kconfig index 48675ad319db..5e2dd5c24d31 100644 --- a/certs/Kconfig +++ b/certs/Kconfig @@ -15,6 +15,23 @@ config MODULE_SIG_KEY then the kernel will automatically generate the private key and certificate as described in Documentation/admin-guide/module-signing.rst +choice + prompt "Type of module signing key to be generated" + default MODULE_SIG_KEY_TYPE_RSA + help + The type of module signing key type to generated. This option + does not apply if a #PKCS11 URI is used. + +config MODULE_SIG_KEY_TYPE_RSA + bool "RSA" + depends on MODULE_SIG || IMA_APPRAISE_MODSIG + +config MODULE_SIG_KEY_TYPE_ECDSA + bool "ECDSA" + depends on (MODULE_SIG || IMA_APPRAISE_MODSIG) && CRYPTO_ECDSA + +endchoice + config SYSTEM_TRUSTED_KEYRING bool "Provide system-wide ring of trusted keys" depends on KEYS diff --git a/certs/Makefile b/certs/Makefile index 3fe6b73786fa..2d5fd4720d07 100644 --- a/certs/Makefile +++ b/certs/Makefile @@ -69,6 +69,18 @@ else SIGNER = -signkey $(obj)/signing_key.key endif # CONFIG_IMA_APPRAISE_MODSIG +X509TEXT=$(shell openssl x509 -in $(CONFIG_MODULE_SIG_KEY) -text) + +# Support user changing key type +ifdef CONFIG_MODULE_SIG_KEY_TYPE_ECDSA +keytype_openssl = -newkey ec -pkeyopt ec_paramgen_curve:prime256v1 +$(if $(findstring ecdsa-with-,$(X509TEXT)),,$(shell rm -f $(CONFIG_MODULE_SIG_KEY))) +endif + +ifdef CONFIG_MODULE_SIG_KEY_TYPE_RSA +$(if $(findstring rsaEncryption,$(X509TEXT)),,$(shell rm -f $(CONFIG_MODULE_SIG_KEY))) +endif + $(obj)/signing_key.pem: $(obj)/x509.genkey @$(kecho) "###" @$(kecho) "### Now generating an X.509 key pair to be used for signing modules." @@ -86,12 +98,14 @@ ifeq ($(CONFIG_IMA_APPRAISE_MODSIG),y) -batch -x509 -config $(obj)/x509.genkey \ -outform PEM -out $(CA_KEY) \ -keyout $(CA_KEY) -extensions ca_ext \ + $(keytype_openssl) \ $($(quiet)redirect_openssl) endif # CONFIG_IMA_APPRAISE_MODSIG $(Q)openssl req -new -nodes -utf8 \ -batch -config $(obj)/x509.genkey \ -outform PEM -out $(obj)/signing_key.csr \ -keyout $(obj)/signing_key.key -extensions myexts \ + $(keytype_openssl) \ $($(quiet)redirect_openssl) $(Q)openssl x509 -req -days 36500 -in $(obj)/signing_key.csr \ -outform PEM -out $(obj)/signing_key.crt $(SIGNER) \ diff --git a/crypto/asymmetric_keys/pkcs7_parser.c b/crypto/asymmetric_keys/pkcs7_parser.c index 967329e0a07b..2546ec6a0505 100644 --- a/crypto/asymmetric_keys/pkcs7_parser.c +++ b/crypto/asymmetric_keys/pkcs7_parser.c @@ -269,6 +269,10 @@ int pkcs7_sig_note_pkey_algo(void *context, size_t hdrlen, ctx->sinfo->sig->pkey_algo = "rsa"; ctx->sinfo->sig->encoding = "pkcs1"; break; + case OID_id_ecdsa_with_sha256: + ctx->sinfo->sig->pkey_algo = "ecdsa"; + ctx->sinfo->sig->encoding = "x962"; + break; default: printk("Unsupported pkey algo: %u\n", ctx->last_oid); return -ENOPKG;