File g10-allow-ECC-added-keys-for-authentication-and-sign.patch of Package gpg2

From c0a7a33ab3206f16fd6b3a4db3d81adaec2bc583 Mon Sep 17 00:00:00 2001
From: James Bottomley <James.Bottomley@HansenPartnership.com>
Date: Sun, 16 Jul 2023 08:33:26 -0400
Subject: [PATCH] g10: allow ECC added keys for authentication and signing

Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
---
 common/sexputil.c | 18 ++++++++++++++++--
 g10/keygen.c      |  9 ++++++++-
 2 files changed, 24 insertions(+), 3 deletions(-)

diff --git a/common/sexputil.c b/common/sexputil.c
index c7471be85..ecee217db 100644
--- a/common/sexputil.c
+++ b/common/sexputil.c
@@ -1048,12 +1048,26 @@ int
 get_pk_algo_from_canon_sexp (const unsigned char *keydata, size_t keydatalen)
 {
   gcry_sexp_t sexp;
-  int algo;
+  enum gcry_pk_algos algo;
+  char *algostr;
 
   if (gcry_sexp_sscan (&sexp, NULL, keydata, keydatalen))
     return 0;
 
-  algo = get_pk_algo_from_key (sexp);
+  algostr = pubkey_algo_string (sexp, &algo);
+  if (algo == GCRY_PK_ECC)
+    {
+      if (!strcmp (algostr, "ed25519"))
+	algo = PUBKEY_ALGO_EDDSA;
+      else if (!strcmp (algostr, "ed448"))
+	algo = PUBKEY_ALGO_EDDSA;
+      else if (!strcmp (algostr, "cv25519"))
+	algo = PUBKEY_ALGO_ECDH;
+      else if (!strcmp (algostr, "cv448"))
+	algo = PUBKEY_ALGO_ECDH;
+      /* cannot determine other ECC keys without knowing usage */
+    }
+  xfree (algostr);
   gcry_sexp_release (sexp);
   return algo;
 }
diff --git a/g10/keygen.c b/g10/keygen.c
index 1605bff89..145218b62 100644
--- a/g10/keygen.c
+++ b/g10/keygen.c
@@ -2257,7 +2257,14 @@ ask_algo (ctrl_t ctrl, int addmode, int *r_subkey_algo, unsigned int *r_usage,
           xfree (keygrip);
           keygrip = answer;
           answer = NULL;
-          *r_usage = ask_key_flags (algo, addmode, 0);
+	  if (algo == GCRY_PK_ECC)
+	    {
+	      *r_usage = ask_key_flags (algo, addmode, ~0);
+	      if (*r_usage & (PUBKEY_USAGE_SIG | PUBKEY_USAGE_AUTH))
+		algo = PUBKEY_ALGO_ECDSA;
+	    }
+	  else
+	    *r_usage = ask_key_flags (algo, addmode, 0);
           break;
 	}
       else if ((algo == 14 || !strcmp (answer, "cardkey")) && r_keygrip)
-- 
2.35.3

openSUSE Build Service is sponsored by