[git] GPGME - branch, master, updated. gpgme-1.11.1-19-g61f4532

by Andre Heinecke cvs at cvs.gnupg.org
Thu May 24 16:16:17 CEST 2018


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GnuPG Made Easy".

The branch, master has been updated
       via  61f4532ba979dea1acd8c7de9b7d56bb8ff552d5 (commit)
       via  5fbf81c18b277b30639ba09e8c5d21573b444b00 (commit)
      from  c679ed24778c997fee72d3613babad8680855882 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 61f4532ba979dea1acd8c7de9b7d56bb8ff552d5
Author: Andre Heinecke <aheinecke at intevation.de>
Date:   Thu May 24 16:15:14 2018 +0200

    json: Implement op_version
    
    * src/gpgme-json.c (op_version): New.
    (process_request): Extend for version.
    (protocol_to_string, add_ei_to_object): New helpers.

diff --git a/src/gpgme-json.c b/src/gpgme-json.c
index 3c0fbe9..774c915 100644
--- a/src/gpgme-json.c
+++ b/src/gpgme-json.c
@@ -780,7 +780,42 @@ add_signatures_object (cjson_t result, const char *name,
   return err;
 }
 
+static const char *
+protocol_to_string (gpgme_protocol_t proto)
+{
+  switch (proto)
+    {
+    case GPGME_PROTOCOL_OpenPGP: return "OpenPGP";
+    case GPGME_PROTOCOL_CMS:     return "CMS";
+    case GPGME_PROTOCOL_GPGCONF: return "gpgconf";
+    case GPGME_PROTOCOL_ASSUAN:  return "assuan";
+    case GPGME_PROTOCOL_G13:     return "g13";
+    case GPGME_PROTOCOL_UISERVER:return "uiserver";
+    case GPGME_PROTOCOL_SPAWN:   return "spawn";
+    default:
+                                 return "unknown";
+    }
+}
 
+static gpg_error_t
+add_ei_to_object (cjson_t result, gpgme_engine_info_t info)
+{
+  if (!cJSON_AddStringToObject (result, "protocol",
+                                protocol_to_string (info->protocol)))
+    return gpg_error_from_syserror ();
+  if (!cJSON_AddStringToObject (result, "fname", info->file_name))
+    return gpg_error_from_syserror ();
+  if (!cJSON_AddStringToObject (result, "version", info->version))
+    return gpg_error_from_syserror ();
+  if (!cJSON_AddStringToObject (result, "req_version", info->req_version))
+    return gpg_error_from_syserror ();
+  if (!cJSON_AddStringToObject (result, "homedir",
+                                info->home_dir ?
+                                info->home_dir :
+                                "default"))
+    return gpg_error_from_syserror ();
+  return 0;
+}
 

 /*
  * Implementation of the commands.
@@ -1504,8 +1539,57 @@ op_verify (cjson_t request, cjson_t result)
   gpgme_data_release (signature);
   return err;
 }
+

+static const char hlp_version[] =
+  "op:     \"version\"\n"
+  "\n"
+  "Response on success:\n"
+  "gpgme:  The GPGME Version.\n"
+  "info:   dump of engine info. containing:\n"
+  "        protocol: The protocol.\n"
+  "        fname:    The file name.\n"
+  "        version:  The version.\n"
+  "        req_ver:  The required version.\n"
+  "        homedir:  The homedir of the engine or \"default\".\n";
+static gpg_error_t
+op_version (cjson_t request, cjson_t result)
+{
+  gpg_error_t err = 0;
+  gpgme_engine_info_t ei = NULL;
+  cjson_t infos = xjson_CreateArray ();
 
+  if (!cJSON_AddStringToObject (result, "gpgme", gpgme_check_version (NULL)))
+    {
+      cJSON_Delete (infos);
+      return gpg_error_from_syserror ();
+    }
+
+  if ((err = gpgme_get_engine_info (&ei)))
+    {
+      cJSON_Delete (infos);
+      return err;
+    }
+
+  for (; ei; ei = ei->next)
+    {
+      cjson_t obj = xjson_CreateObject ();
+      if ((err = add_ei_to_object (obj, ei)))
+        {
+          cJSON_Delete (infos);
+          return err;
+        }
+      cJSON_AddItemToArray (infos, obj);
+    }
 
+  if (!cJSON_AddItemToObject (result, "info", infos))
+    {
+      err = gpg_error_from_syserror ();
+      cJSON_Delete (infos);
+      return err;
+    }
+
+  return 0;
+}
 

 static const char hlp_getmore[] =
   "op:     \"getmore\"\n"
@@ -1644,6 +1728,8 @@ process_request (const char *request)
     { "encrypt", op_encrypt, hlp_encrypt },
     { "decrypt", op_decrypt, hlp_decrypt },
     { "sign",    op_sign,    hlp_sign },
+    { "verify",  op_verify,  hlp_verify },
+    { "version", op_version, hlp_version },
     { "getmore", op_getmore, hlp_getmore },
     { "help",    op_help,    hlp_help },
     { NULL }

commit 5fbf81c18b277b30639ba09e8c5d21573b444b00
Author: Andre Heinecke <aheinecke at intevation.de>
Date:   Thu May 24 13:56:16 2018 +0200

    json: Implement op_verify
    
    * src/gpgme-json.c (op_verify): New.
    (hlp_help): Add verify.
    (process_request): Add verify.
    
    --
    Mostly works, except for detached, base64 encoded signatures,
    they are somehow not yet written to gpgme.

diff --git a/src/gpgme-json.c b/src/gpgme-json.c
index a755500..3c0fbe9 100644
--- a/src/gpgme-json.c
+++ b/src/gpgme-json.c
@@ -754,7 +754,7 @@ leave:
 /* Add an array of signature informations under the name "name". */
 static gpg_error_t
 add_signatures_object (cjson_t result, const char *name,
-                           gpgme_verify_result_t verify_result)
+                       gpgme_verify_result_t verify_result)
 {
   cjson_t response = xjson_CreateObject ();
   gpg_error_t err = 0;
@@ -1349,6 +1349,163 @@ op_sign (cjson_t request, cjson_t result)
   return err;
 }
 
+
+

+static const char hlp_verify[] =
+  "op:     \"verify\"\n"
+  "data:   The data to verify.\n"
+  "\n"
+  "Optional parameters:\n"
+  "protocol:      Either \"openpgp\" (default) or \"cms\".\n"
+  "chunksize:     Max number of bytes in the resulting \"data\".\n"
+  "signature:     A detached signature. If missing opaque is assumed.\n"
+  "\n"
+  "Optional boolean flags (default is false):\n"
+  "base64:        Input data is base64 encoded.\n"
+  "\n"
+  "Response on success:\n"
+  "type:   \"plaintext\"\n"
+  "data:   The verified data.  This may be base64 encoded.\n"
+  "base64: Boolean indicating whether data is base64 encoded.\n"
+  "info:   An object with signature information.\n"
+  "more:   Optional boolean indicating that \"getmore\" is required.";
+static gpg_error_t
+op_verify (cjson_t request, cjson_t result)
+{
+  gpg_error_t err;
+  gpgme_ctx_t ctx = NULL;
+  gpgme_protocol_t protocol;
+  size_t chunksize;
+  int opt_base64;
+  cjson_t j_input, j_signature;
+  gpgme_data_t input = NULL;
+  gpgme_data_t signature = NULL;
+  gpgme_data_t output = NULL;
+  gpgme_verify_result_t verify_result;
+
+  if ((err = get_protocol (request, &protocol)))
+    goto leave;
+  ctx = get_context (protocol);
+  if ((err = get_chunksize (request, &chunksize)))
+    goto leave;
+
+  if ((err = get_boolean_flag (request, "base64", 0, &opt_base64)))
+    goto leave;
+
+  /* Get the data.  Note that INPUT is a shallow data object with the
+   * storage hold in REQUEST.  */
+  j_input = cJSON_GetObjectItem (request, "data");
+  if (!j_input)
+    {
+      err = gpg_error (GPG_ERR_NO_DATA);
+      goto leave;
+    }
+  if (!cjson_is_string (j_input))
+    {
+      err = gpg_error (GPG_ERR_INV_VALUE);
+      goto leave;
+    }
+  if (opt_base64)
+    {
+      err = data_from_base64_string (&input, j_input);
+      if (err)
+        {
+          error_object (result, "Error decoding Base-64 encoded 'data': %s",
+                        gpg_strerror (err));
+          goto leave;
+        }
+    }
+  else
+    {
+      err = gpgme_data_new_from_mem (&input, j_input->valuestring,
+                                     strlen (j_input->valuestring), 0);
+      if (err)
+        {
+          error_object (result, "Error getting 'data': %s", gpg_strerror (err));
+          goto leave;
+        }
+    }
+
+  /* Get the signature.  */
+  j_signature = cJSON_GetObjectItem (request, "signature");
+  if (j_signature && cjson_is_string (j_signature))
+    {
+      if (opt_base64)
+        {
+          err = data_from_base64_string (&signature, j_signature);
+          if (err)
+            {
+              error_object (result, "Error decoding Base-64 encoded 'signature': %s",
+                            gpg_strerror (err));
+              goto leave;
+            }
+        }
+      else
+        {
+          err = gpgme_data_new_from_mem (&signature, j_signature->valuestring,
+                                         strlen (j_signature->valuestring),
+                                         0);
+          if (err)
+            {
+              error_object (result, "Error getting 'signature': %s",
+                            gpg_strerror (err));
+              goto leave;
+            }
+        }
+    }
+
+  /* Create an output data object.  */
+  err = gpgme_data_new (&output);
+  if (err)
+    {
+      error_object (result, "Error creating output data object: %s",
+                    gpg_strerror (err));
+      goto leave;
+    }
+
+  /* Decrypt.  */
+  err = gpgme_op_verify (ctx, signature,
+                         input, output);
+  if (err)
+    {
+      error_object (result, "Verify failed: %s", gpg_strerror (err));
+      goto leave;
+    }
+  gpgme_data_release (input);
+  input = NULL;
+  gpgme_data_release (signature);
+  signature = NULL;
+
+  verify_result = gpgme_op_verify_result (ctx);
+  if (verify_result && verify_result->signatures)
+    {
+      err = add_signatures_object (result, "info", verify_result);
+    }
+
+  if (err)
+    {
+      error_object (result, "Info output failed: %s", gpg_strerror (err));
+      goto leave;
+    }
+
+  err = make_data_object (result, output, chunksize, "plaintext", -1);
+  output = NULL;
+
+  if (err)
+    {
+      error_object (result, "Plaintext output failed: %s", gpg_strerror (err));
+      goto leave;
+    }
+
+ leave:
+  release_context (ctx);
+  gpgme_data_release (input);
+  gpgme_data_release (output);
+  gpgme_data_release (signature);
+  return err;
+}
+
+
 

 static const char hlp_getmore[] =
   "op:     \"getmore\"\n"

-----------------------------------------------------------------------

Summary of changes:
 src/gpgme-json.c | 245 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 244 insertions(+), 1 deletion(-)


hooks/post-receive
-- 
GnuPG Made Easy
http://git.gnupg.org




More information about the Gnupg-commits mailing list