common: Provide function to get public key algo names in our format.
authorWerner Koch <wk@gnupg.org>
Fri, 8 Feb 2019 11:10:45 +0000 (12:10 +0100)
committerWerner Koch <wk@gnupg.org>
Fri, 8 Feb 2019 11:10:45 +0000 (12:10 +0100)
* tools/card-tool-misc.c (pubkey_algo_string): Move to  ...
* common/sexputil.c (pubkey_algo_string): here.
--

The new gpg format for public key algorithms is useful at other places
as well.  Thus we make this new function available.  Note that the
code we use in gpg is not based on s-expressions and thus a new
function was required.

Signed-off-by: Werner Koch <wk@gnupg.org>
common/sexputil.c
common/util.h
tools/card-tool-misc.c
tools/card-tool.h

index 02e52d0..d3020e1 100644 (file)
@@ -577,3 +577,61 @@ get_pk_algo_from_canon_sexp (const unsigned char *keydata, size_t keydatalen)
   gcry_sexp_release (sexp);
   return algo;
 }
+
+
+/* Given the public key S_PKEY, return a new buffer with a descriptive
+ * string for its algorithm.  This function may return NULL on memory
+ * error. */
+char *
+pubkey_algo_string (gcry_sexp_t s_pkey)
+{
+  const char *prefix;
+  gcry_sexp_t l1;
+  char *algoname;
+  int algo;
+  char *result;
+
+  l1 = gcry_sexp_find_token (s_pkey, "public-key", 0);
+  if (!l1)
+    return xtrystrdup ("E_no_key");
+  {
+    gcry_sexp_t l_tmp = gcry_sexp_cadr (l1);
+    gcry_sexp_release (l1);
+    l1 = l_tmp;
+  }
+  algoname = gcry_sexp_nth_string (l1, 0);
+  gcry_sexp_release (l1);
+  if (!algoname)
+    return xtrystrdup ("E_no_algo");
+
+  algo = gcry_pk_map_name (algoname);
+  switch (algo)
+    {
+    case GCRY_PK_RSA: prefix = "rsa"; break;
+    case GCRY_PK_ELG: prefix = "elg"; break;
+    case GCRY_PK_DSA: prefix = "dsa"; break;
+    case GCRY_PK_ECC: prefix = "";  break;
+    default:          prefix = NULL; break;
+    }
+
+  if (prefix && *prefix)
+    result = xtryasprintf ("%s%u", prefix, gcry_pk_get_nbits (s_pkey));
+  else if (prefix)
+    {
+      const char *curve = gcry_pk_get_curve (s_pkey, 0, NULL);
+      const char *name = openpgp_oid_to_curve
+        (openpgp_curve_to_oid (curve, NULL), 0);
+
+      if (name)
+        result = xtrystrdup (name);
+      else if (curve)
+        result = xtryasprintf ("X_%s", curve);
+      else
+        result = xtrystrdup ("E_unknown");
+    }
+  else
+    result = xtryasprintf ("X_algo_%d", algo);
+
+  xfree (algoname);
+  return result;
+}
index 863f9e3..d5bb225 100644 (file)
@@ -189,6 +189,7 @@ gpg_error_t get_rsa_pk_from_canon_sexp (const unsigned char *keydata,
 int get_pk_algo_from_key (gcry_sexp_t key);
 int get_pk_algo_from_canon_sexp (const unsigned char *keydata,
                                  size_t keydatalen);
+char *pubkey_algo_string (gcry_sexp_t s_pkey);
 
 /*-- convert.c --*/
 int hex2bin (const char *string, void *buffer, size_t length);
index 5e0461c..06fcb67 100644 (file)
@@ -77,61 +77,3 @@ hex_to_buffer (const char *string, size_t *r_length)
   *r_length = n;
   return buffer;
 }
-
-
-
-/* Given the public key S_PKEY, return a new buffer with a descriptive
- * string for its algorithm.  This function always returns a string. */
-char *
-pubkey_algo_string (gcry_sexp_t s_pkey)
-{
-  const char *prefix;
-  gcry_sexp_t l1;
-  char *algoname;
-  int algo;
-  char *result;
-
-  l1 = gcry_sexp_find_token (s_pkey, "public-key", 0);
-  if (!l1)
-    return xstrdup ("E_no_key");
-  {
-    gcry_sexp_t l_tmp = gcry_sexp_cadr (l1);
-    gcry_sexp_release (l1);
-    l1 = l_tmp;
-  }
-  algoname = gcry_sexp_nth_string (l1, 0);
-  gcry_sexp_release (l1);
-  if (!algoname)
-    return xstrdup ("E_no_algo");
-
-  algo = gcry_pk_map_name (algoname);
-  switch (algo)
-    {
-    case GCRY_PK_RSA: prefix = "rsa"; break;
-    case GCRY_PK_ELG: prefix = "elg"; break;
-    case GCRY_PK_DSA: prefix = "dsa"; break;
-    case GCRY_PK_ECC: prefix = "";  break;
-    default:          prefix = NULL; break;
-    }
-
-  if (prefix && *prefix)
-    result = xasprintf ("%s%u", prefix, gcry_pk_get_nbits (s_pkey));
-  else if (prefix)
-    {
-      const char *curve = gcry_pk_get_curve (s_pkey, 0, NULL);
-      const char *name = openpgp_oid_to_curve
-        (openpgp_curve_to_oid (curve, NULL), 0);
-
-      if (name)
-        result = xstrdup (name);
-      else if (curve)
-        result = xasprintf ("X_%s", curve);
-      else
-        result = xstrdup ("E_unknown");
-    }
-  else
-    result = xasprintf ("X_algo_%d", algo);
-
-  xfree (algoname);
-  return result;
-}
index 9daf7e4..f49f253 100644 (file)
@@ -192,8 +192,6 @@ gpg_error_t test_get_matching_keys (const char *hexgrip);
 /*-- card-tool-misc.c --*/
 key_info_t find_kinfo (card_info_t info, const char *keyref);
 void *hex_to_buffer (const char *string, size_t *r_length);
-char *pubkey_algo_string (gcry_sexp_t s_pkey);
-
 
 /*-- card-call-scd.c --*/
 void release_card_info (card_info_t info);