2021-02-19 15:44:34

by Stefan Berger

[permalink] [raw]
Subject: [PATCH] certs: Add support for using elliptic curve keys for signing modules

From: Stefan Berger <[email protected]>

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 <[email protected]>

---

This patch builds on top of my ECDSA patch series and Nayna's
series for 'kernel build support for loading the kernel module
signing key'.
- https://lkml.org/lkml/2021/2/15/766
- https://lkml.org/lkml/2021/2/18/856
---
certs/Kconfig | 17 +++++++++++++++++
certs/Makefile | 14 ++++++++++++++
crypto/asymmetric_keys/pkcs7_parser.c | 4 ++++
3 files changed, 35 insertions(+)

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;
--
2.29.2


2021-02-19 16:56:41

by Mimi Zohar

[permalink] [raw]
Subject: Re: [PATCH] certs: Add support for using elliptic curve keys for signing modules

On Fri, 2021-02-19 at 10:41 -0500, Stefan Berger wrote:
> From: Stefan Berger <[email protected]>
>
> 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 <[email protected]>

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 <[email protected]>
Reviewed-by: Mimi Zohar <[email protected]>

2021-02-22 14:41:14

by Stefan Berger

[permalink] [raw]
Subject: Re: [PATCH] certs: Add support for using elliptic curve keys for signing modules

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 <[email protected]>
>>
>> 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 <[email protected]>
> 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 <[email protected]>
> Reviewed-by: Mimi Zohar <[email protected]>
>