[Pkg-gnupg-commit] [gpgme] 17/412: Add gpgme_pubkey_algo_string

Daniel Kahn Gillmor dkg at fifthhorseman.net
Thu Sep 22 21:26:05 UTC 2016


This is an automated email from the git hooks/post-receive script.

dkg pushed a commit to branch master
in repository gpgme.

commit c4b6b35bfa98e478f1d13f4ce3e664771f2604c2
Author: Werner Koch <wk at gnupg.org>
Date:   Sun Aug 30 19:04:44 2015 +0200

    Add gpgme_pubkey_algo_string
    
    * src/gpgme.h.in (GPGME_PK_EDDSA): New.
    (gpgme_pubkey_algo_string): New.
    * src/conversion.c (_gpgme_map_pk_algo): Add new algo.
    * src/gpgme.c (gpgme_pubkey_algo_string): New.
    (gpgme_pubkey_algo_name): Reformat.
    
    Signed-off-by: Werner Koch <wk at gnupg.org>
---
 NEWS              |  7 +++++
 doc/gpgme.texi    | 21 ++++++++++++---
 src/conversion.c  |  1 +
 src/data-mem.c    |  3 ++-
 src/gpgme.c       | 81 +++++++++++++++++++++++++++++++++++++------------------
 src/gpgme.def     |  2 ++
 src/gpgme.h.in    | 10 +++++--
 src/libgpgme.vers |  2 ++
 8 files changed, 94 insertions(+), 33 deletions(-)

diff --git a/NEWS b/NEWS
index 7bf140b..85c084f 100644
--- a/NEWS
+++ b/NEWS
@@ -1,6 +1,13 @@
 Noteworthy changes in version 1.6.1 (unreleased) [C25/A14/R_]
 ------------------------------------------------
 
+ * New function to format a GnuPG style public key algorithm string.
+
+ * Interface changes relative to the 1.6.0 release:
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ gpgme_pubkey_algo_string       NEW.
+ GPGME_PK_EDDSA                 NEW.
+
 
 Noteworthy changes in version 1.6.0 (2015-08-26) [C25/A14/R0]
 ------------------------------------------------
diff --git a/doc/gpgme.texi b/doc/gpgme.texi
index c02a30f..a764ce4 100644
--- a/doc/gpgme.texi
+++ b/doc/gpgme.texi
@@ -1161,6 +1161,9 @@ Algorithm as defined by FIPS 186-2 and RFC-6637.
 This value indicates ECDH, the Eliptic Curve Diffie-Hellmann
 encryption algorithm as defined by RFC-6637.
 
+ at item GPGME_PK_EDDSA
+This value indicates the EdDSA algorithm.
+
 @end table
 @end deftp
 
@@ -1174,6 +1177,14 @@ If @var{algo} is not a valid public key algorithm, @code{NULL} is
 returned.
 @end deftypefun
 
+ at deftypefun {char *} gpgme_pubkey_algo_string (@w{gpgme_subkey_t @var{key}})
+The function @code{gpgme_pubkey_algo_string} is a convenience function
+to build and return an algorithm string in the same way GnuPG does
+(e.g. ``rsa2048'' or ``ed25519'').  The caller must free the result
+using @code{gpgme_free}.  On error (e.g. invalid argument or memory
+exhausted), the function returns NULL and sets @code{ERRNO}.
+ at end deftypefun
+
 
 @node Hash Algorithms
 @section Hash Algorithms
@@ -1954,9 +1965,11 @@ case, the data object @var{dh} is destroyed.
 
 @deftypefun void gpgme_free (@w{void *@var{buffer}})
 The function @code{gpgme_free} releases the memory returned by
- at code{gpgme_data_release_and_get_mem}.  It should be used instead of
-the system libraries @code{free} function in case different allocators
-are used in a single program.
+ at code{gpgme_data_release_and_get_mem} and
+ at code{gpgme_pubkey_algo_string}.  It should be used instead of the
+system libraries @code{free} function in case different allocators are
+used by a program.  This is often the case if gpgme is used under
+Windows as a DLL.
 @end deftypefun
 
 
@@ -2838,7 +2851,7 @@ True if the secret key is stored on a smart card.
 The serial number of a smart card holding this key or @code{NULL}.
 
 @item char *curve
-For ECC algoritms the name of the curve.
+For ECC algorithms the name of the curve.
 
 @end table
 @end deftp
diff --git a/src/conversion.c b/src/conversion.c
index d04a6be..0992225 100644
--- a/src/conversion.c
+++ b/src/conversion.c
@@ -427,6 +427,7 @@ _gpgme_map_pk_algo (int algo, gpgme_protocol_t protocol)
         case 18: algo = GPGME_PK_ECDH; break;
         case 19: algo = GPGME_PK_ECDSA; break;
         case 20: break;
+        case 22: algo = GPGME_PK_EDDSA; break;
         default: algo = 0; break; /* Unknown.  */
         }
     }
diff --git a/src/data-mem.c b/src/data-mem.c
index e06a920..a498b82 100644
--- a/src/data-mem.c
+++ b/src/data-mem.c
@@ -271,7 +271,8 @@ gpgme_data_release_and_get_mem (gpgme_data_t dh, size_t *r_len)
 }
 
 
-/* Release the memory returned by gpgme_data_release_and_get_mem().  */
+/* Release the memory returned by gpgme_data_release_and_get_mem() and
+   some other functions.  */
 void
 gpgme_free (void *buffer)
 {
diff --git a/src/gpgme.c b/src/gpgme.c
index 0cf999a..343e775 100644
--- a/src/gpgme.c
+++ b/src/gpgme.c
@@ -1,7 +1,7 @@
 /* gpgme.c - GnuPG Made Easy.
    Copyright (C) 2000 Werner Koch (dd9jn)
    Copyright (C) 2001, 2002, 2003, 2004, 2005, 2007, 2012,
-                 2014 g10 Code GmbH
+                 2014, 2015 g10 Code GmbH
 
    This file is part of GPGME.
 
@@ -994,41 +994,70 @@ gpgme_sig_notation_get (gpgme_ctx_t ctx)
   return ctx->sig_notations;
 }
 
+
 

-const char *
-gpgme_pubkey_algo_name (gpgme_pubkey_algo_t algo)
+/* Return a public key algorithm string made of the algorithm and size
+   or the curve name.  May return NULL on error.  Caller must free the
+   result using gpgme_free.  */
+char *
+gpgme_pubkey_algo_string (gpgme_subkey_t subkey)
 {
-  switch (algo)
+  const char *prefix = NULL;
+  char *result;
+
+  if (!subkey)
     {
-    case GPGME_PK_RSA:
-      return "RSA";
+      gpg_err_set_errno (EINVAL);
+      return NULL;
+    }
 
+  switch (subkey->pubkey_algo)
+    {
+    case GPGME_PK_RSA:
     case GPGME_PK_RSA_E:
-      return "RSA-E";
-
-    case GPGME_PK_RSA_S:
-      return "RSA-S";
-
-    case GPGME_PK_ELG_E:
-      return "ELG-E";
-
-    case GPGME_PK_DSA:
-      return "DSA";
-
+    case GPGME_PK_RSA_S: prefix = "rsa"; break;
+    case GPGME_PK_ELG_E: prefix = "elg"; break;
+    case GPGME_PK_DSA:	 prefix = "dsa"; break;
+    case GPGME_PK_ELG:   prefix = "xxx"; break;
     case GPGME_PK_ECC:
-      return "ECC";
+    case GPGME_PK_ECDH:
+    case GPGME_PK_ECDSA:
+    case GPGME_PK_EDDSA: prefix = "";    break;
+    }
 
-    case GPGME_PK_ELG:
-      return "ELG";
+  if (prefix && *prefix)
+    {
+      char buffer[40];
+      snprintf (buffer, sizeof buffer, "%s%u", prefix, subkey->length);
+      result = strdup (buffer);
+    }
+  else if (prefix && subkey->curve && *subkey->curve)
+    result = strdup (subkey->curve);
+  else if (prefix)
+    result =  strdup ("E_error");
+  else
+    result = strdup  ("unknown");
 
-    case GPGME_PK_ECDSA:
-      return "ECDSA";
+  return result;
+}
 
-    case GPGME_PK_ECDH:
-      return "ECDH";
 
-    default:
-      return NULL;
+const char *
+gpgme_pubkey_algo_name (gpgme_pubkey_algo_t algo)
+{
+  switch (algo)
+    {
+    case GPGME_PK_RSA:   return "RSA";
+    case GPGME_PK_RSA_E: return "RSA-E";
+    case GPGME_PK_RSA_S: return "RSA-S";
+    case GPGME_PK_ELG_E: return "ELG-E";
+    case GPGME_PK_DSA:   return "DSA";
+    case GPGME_PK_ECC:   return "ECC";
+    case GPGME_PK_ELG:   return "ELG";
+    case GPGME_PK_ECDSA: return "ECDSA";
+    case GPGME_PK_ECDH:  return "ECDH";
+    case GPGME_PK_EDDSA: return "EdDSA";
+    default:             return NULL;
     }
 }
 
diff --git a/src/gpgme.def b/src/gpgme.def
index a3f5fb4..3b56aaa 100644
--- a/src/gpgme.def
+++ b/src/gpgme.def
@@ -223,5 +223,7 @@ EXPORTS
 
     gpgme_set_status_cb                   @167
     gpgme_get_status_cb                   @168
+
+    gpgme_pubkey_algo_string              @169
 ; END
 
diff --git a/src/gpgme.h.in b/src/gpgme.h.in
index 6cea2c7..e7216cb 100644
--- a/src/gpgme.h.in
+++ b/src/gpgme.h.in
@@ -261,7 +261,8 @@ typedef enum
     GPGME_PK_ECC   = 18,
     GPGME_PK_ELG   = 20,
     GPGME_PK_ECDSA = 301,
-    GPGME_PK_ECDH  = 302
+    GPGME_PK_ECDH  = 302,
+    GPGME_PK_EDDSA = 303
   }
 gpgme_pubkey_algo_t;
 
@@ -1218,7 +1219,8 @@ gpgme_error_t gpgme_data_new_from_mem (gpgme_data_t *r_dh,
    size is returned in R_LEN.  */
 char *gpgme_data_release_and_get_mem (gpgme_data_t dh, size_t *r_len);
 
-/* Release the memory returned by gpgme_data_release_and_get_mem().  */
+/* Release the memory returned by gpgme_data_release_and_get_mem() and
+   some other functions.  */
 void gpgme_free (void *buffer);
 
 gpgme_error_t gpgme_data_new_from_cbs (gpgme_data_t *dh,
@@ -2232,6 +2234,10 @@ gpgme_error_t gpgme_engine_check_version (gpgme_protocol_t proto);
 void gpgme_result_ref (void *result);
 void gpgme_result_unref (void *result);
 
+/* Return a public key algorithm string (e.g. "rsa2048").  Caller must
+   free using gpgme_free.  */
+char *gpgme_pubkey_algo_string (gpgme_subkey_t subkey);
+
 /* Return a statically allocated string with the name of the public
    key algorithm ALGO, or NULL if that name is not known.  */
 const char *gpgme_pubkey_algo_name (gpgme_pubkey_algo_t algo);
diff --git a/src/libgpgme.vers b/src/libgpgme.vers
index 6687571..c677190 100644
--- a/src/libgpgme.vers
+++ b/src/libgpgme.vers
@@ -98,6 +98,8 @@ GPGME_1.1 {
 
     gpgme_set_status_cb;
     gpgme_get_status_cb;
+
+    gpgme_pubkey_algo_string;
 };
 
 

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-gnupg/gpgme.git



More information about the Pkg-gnupg-commit mailing list