diff mbox series

[v6,4/4] ima: Support EC keys for signature verification

Message ID 20210131233301.1301787-5-stefanb@linux.ibm.com (mailing list archive)
State New, archived
Headers show
Series Add support for x509 certs with NIST p256 and p192 keys | expand

Commit Message

Stefan Berger Jan. 31, 2021, 11:33 p.m. UTC
Add support for IMA signature verification for EC keys. Since SHA type
of hashes can be used by RSA and ECDSA signature schemes we need to
look at the key and derive from the key which signature scheme to use.
Since this can be applied to all types of keys, we change the selection
of the encoding type to be driven by the key's signature scheme rather
than by the hash type.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
Reviewed-by: Vitaly Chikunov <vt@altlinux.org>
Cc: Mimi Zohar <zohar@linux.ibm.com>
Cc: Dmitry Kasatkin <dmitry.kasatkin@gmail.com>
Cc: linux-integrity@vger.kernel.org
Cc: Vitaly Chikunov <vt@altlinux.org>
Cc: Tianjia Zhang <tianjia.zhang@linux.alibaba.com>
Cc: David Howells <dhowells@redhat.com>
Cc: keyrings@vger.kernel.org
---
 include/keys/asymmetric-type.h         |  6 ++++++
 security/integrity/digsig_asymmetric.c | 29 ++++++++++++--------------
 2 files changed, 19 insertions(+), 16 deletions(-)

Comments

tianjia.zhang Feb. 1, 2021, 10:36 a.m. UTC | #1
On 2/1/21 7:33 AM, Stefan Berger wrote:
> Add support for IMA signature verification for EC keys. Since SHA type
> of hashes can be used by RSA and ECDSA signature schemes we need to
> look at the key and derive from the key which signature scheme to use.
> Since this can be applied to all types of keys, we change the selection
> of the encoding type to be driven by the key's signature scheme rather
> than by the hash type.
> 
> Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
> Reviewed-by: Vitaly Chikunov <vt@altlinux.org>
> Cc: Mimi Zohar <zohar@linux.ibm.com>
> Cc: Dmitry Kasatkin <dmitry.kasatkin@gmail.com>
> Cc: linux-integrity@vger.kernel.org
> Cc: Vitaly Chikunov <vt@altlinux.org>
> Cc: Tianjia Zhang <tianjia.zhang@linux.alibaba.com>
> Cc: David Howells <dhowells@redhat.com>
> Cc: keyrings@vger.kernel.org
> ---
>   include/keys/asymmetric-type.h         |  6 ++++++
>   security/integrity/digsig_asymmetric.c | 29 ++++++++++++--------------
>   2 files changed, 19 insertions(+), 16 deletions(-)
> 
> diff --git a/include/keys/asymmetric-type.h b/include/keys/asymmetric-type.h
> index a29d3ff2e7e8..c432fdb8547f 100644
> --- a/include/keys/asymmetric-type.h
> +++ b/include/keys/asymmetric-type.h
> @@ -72,6 +72,12 @@ const struct asymmetric_key_ids *asymmetric_key_ids(const struct key *key)
>   	return key->payload.data[asym_key_ids];
>   }
>   
> +static inline
> +const struct public_key *asymmetric_key_public_key(const struct key *key)
> +{
> +	return key->payload.data[asym_crypto];
> +}
> +
>   extern struct key *find_asymmetric_key(struct key *keyring,
>   				       const struct asymmetric_key_id *id_0,
>   				       const struct asymmetric_key_id *id_1,
> diff --git a/security/integrity/digsig_asymmetric.c b/security/integrity/digsig_asymmetric.c
> index a662024b4c70..29002d016607 100644
> --- a/security/integrity/digsig_asymmetric.c
> +++ b/security/integrity/digsig_asymmetric.c
> @@ -84,6 +84,7 @@ int asymmetric_verify(struct key *keyring, const char *sig,
>   {
>   	struct public_key_signature pks;
>   	struct signature_v2_hdr *hdr = (struct signature_v2_hdr *)sig;
> +	const struct public_key *pk;
>   	struct key *key;
>   	int ret;
>   
> @@ -105,23 +106,19 @@ int asymmetric_verify(struct key *keyring, const char *sig,
>   	memset(&pks, 0, sizeof(pks));
>   
>   	pks.hash_algo = hash_algo_name[hdr->hash_algo];
> -	switch (hdr->hash_algo) {
> -	case HASH_ALGO_STREEBOG_256:
> -	case HASH_ALGO_STREEBOG_512:
> -		/* EC-RDSA and Streebog should go together. */
> -		pks.pkey_algo = "ecrdsa";
> -		pks.encoding = "raw";
> -		break;
> -	case HASH_ALGO_SM3_256:
> -		/* SM2 and SM3 should go together. */
> -		pks.pkey_algo = "sm2";
> -		pks.encoding = "raw";
> -		break;
> -	default:
> -		pks.pkey_algo = "rsa";
> +
> +	pk = asymmetric_key_public_key(key);
> +	pks.pkey_algo = pk->pkey_algo;
> +	if (!strcmp(pk->pkey_algo, "rsa"))
>   		pks.encoding = "pkcs1";
> -		break;
> -	}
> +	else if (!strcmp(pk->pkey_algo, "ecdsa"))
> +		pks.encoding = "x962";
> +	else if (!strcmp(pk->pkey_algo, "ecrdsa") ||
> +		   !strcmp(pk->pkey_algo, "sm2"))
> +		pks.encoding = "raw";
> +	else
> +		return -ENOPKG;
> +
>   	pks.digest = (u8 *)data;
>   	pks.digest_size = datalen;
>   	pks.s = hdr->sig;
> 

Looks good to me, so

Reviewed-by: Tianjia Zhang <tianjia.zhang@linux.alibaba.com>

Thanks,
Tianjia
diff mbox series

Patch

diff --git a/include/keys/asymmetric-type.h b/include/keys/asymmetric-type.h
index a29d3ff2e7e8..c432fdb8547f 100644
--- a/include/keys/asymmetric-type.h
+++ b/include/keys/asymmetric-type.h
@@ -72,6 +72,12 @@  const struct asymmetric_key_ids *asymmetric_key_ids(const struct key *key)
 	return key->payload.data[asym_key_ids];
 }
 
+static inline
+const struct public_key *asymmetric_key_public_key(const struct key *key)
+{
+	return key->payload.data[asym_crypto];
+}
+
 extern struct key *find_asymmetric_key(struct key *keyring,
 				       const struct asymmetric_key_id *id_0,
 				       const struct asymmetric_key_id *id_1,
diff --git a/security/integrity/digsig_asymmetric.c b/security/integrity/digsig_asymmetric.c
index a662024b4c70..29002d016607 100644
--- a/security/integrity/digsig_asymmetric.c
+++ b/security/integrity/digsig_asymmetric.c
@@ -84,6 +84,7 @@  int asymmetric_verify(struct key *keyring, const char *sig,
 {
 	struct public_key_signature pks;
 	struct signature_v2_hdr *hdr = (struct signature_v2_hdr *)sig;
+	const struct public_key *pk;
 	struct key *key;
 	int ret;
 
@@ -105,23 +106,19 @@  int asymmetric_verify(struct key *keyring, const char *sig,
 	memset(&pks, 0, sizeof(pks));
 
 	pks.hash_algo = hash_algo_name[hdr->hash_algo];
-	switch (hdr->hash_algo) {
-	case HASH_ALGO_STREEBOG_256:
-	case HASH_ALGO_STREEBOG_512:
-		/* EC-RDSA and Streebog should go together. */
-		pks.pkey_algo = "ecrdsa";
-		pks.encoding = "raw";
-		break;
-	case HASH_ALGO_SM3_256:
-		/* SM2 and SM3 should go together. */
-		pks.pkey_algo = "sm2";
-		pks.encoding = "raw";
-		break;
-	default:
-		pks.pkey_algo = "rsa";
+
+	pk = asymmetric_key_public_key(key);
+	pks.pkey_algo = pk->pkey_algo;
+	if (!strcmp(pk->pkey_algo, "rsa"))
 		pks.encoding = "pkcs1";
-		break;
-	}
+	else if (!strcmp(pk->pkey_algo, "ecdsa"))
+		pks.encoding = "x962";
+	else if (!strcmp(pk->pkey_algo, "ecrdsa") ||
+		   !strcmp(pk->pkey_algo, "sm2"))
+		pks.encoding = "raw";
+	else
+		return -ENOPKG;
+
 	pks.digest = (u8 *)data;
 	pks.digest_size = datalen;
 	pks.s = hdr->sig;