aboutsummaryrefslogtreecommitdiffstats
path: root/common
diff options
context:
space:
mode:
Diffstat (limited to 'common')
-rw-r--r--common/sexputil.c44
-rw-r--r--common/util.h1
2 files changed, 45 insertions, 0 deletions
diff --git a/common/sexputil.c b/common/sexputil.c
index e6fc84da0..15fd7cf1d 100644
--- a/common/sexputil.c
+++ b/common/sexputil.c
@@ -1194,3 +1194,47 @@ cipher_mode_to_string (int mode)
default: return "[?]";
}
}
+
+/* Return the cannonical name of the ECC curve in KEY. */
+const char *
+get_ecc_curve_from_key (gcry_sexp_t key)
+{
+ gcry_sexp_t list = NULL;
+ gcry_sexp_t l2 = NULL;
+ const char *curve_name = NULL;
+ char *name = NULL;
+
+ /* Check that the first element is valid. */
+ list = gcry_sexp_find_token (key, "public-key", 0);
+ if (!list)
+ list = gcry_sexp_find_token (key, "private-key", 0);
+ if (!list)
+ list = gcry_sexp_find_token (key, "protected-private-key", 0);
+ if (!list)
+ list = gcry_sexp_find_token (key, "shadowed-private-key", 0);
+ if (!list)
+ goto leave;
+
+ l2 = gcry_sexp_cadr (list);
+ gcry_sexp_release (list);
+ list = l2;
+ l2 = NULL;
+
+ name = gcry_sexp_nth_string (list, 0);
+ if (!name)
+ goto leave;
+
+ if (gcry_pk_map_name (name) != GCRY_PK_ECC)
+ goto leave;
+
+ l2 = gcry_sexp_find_token (list, "curve", 0);
+ xfree (name);
+ name = gcry_sexp_nth_string (l2, 1);
+ curve_name = openpgp_oid_or_name_to_curve (name, 1);
+ gcry_sexp_release (l2);
+
+ leave:
+ xfree (name);
+ gcry_sexp_release (list);
+ return curve_name;
+}
diff --git a/common/util.h b/common/util.h
index 238b8f1bc..f8447aea7 100644
--- a/common/util.h
+++ b/common/util.h
@@ -196,6 +196,7 @@ char *pubkey_algo_string (gcry_sexp_t s_pkey, enum gcry_pk_algos *r_algoid);
const char *pubkey_algo_to_string (int algo);
const char *hash_algo_to_string (int algo);
const char *cipher_mode_to_string (int mode);
+const char *get_ecc_curve_from_key (gcry_sexp_t key);
/*-- convert.c --*/
int hex2bin (const char *string, void *buffer, size_t length);