Allow symmetric encryption with gpgme_op_encrypt_sign.
authorWerner Koch <wk@gnupg.org>
Wed, 22 May 2013 14:30:12 +0000 (15:30 +0100)
committerWerner Koch <wk@gnupg.org>
Wed, 22 May 2013 14:31:51 +0000 (16:31 +0200)
* src/encrypt-sign.c (encrypt_sym_status_handler): New.
(encrypt_sign_start): Handle recp == NULL case.
* src/engine-gpg.c (gpg_encrypt_sign): Implement symmetric encryption.
* tests/gpg/t-encrypt-sign.c (main): Add a test case for this.
--

Co-authored-by: Kyle L. Huff <g10bts@curetheitch.com>
GnuPG-bug-id: 1440

NEWS
src/encrypt-sign.c
src/engine-gpg.c
tests/gpg/t-encrypt-sign.c

diff --git a/NEWS b/NEWS
index dc67bf7..3a583d3 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,6 +1,8 @@
 Noteworthy changes in version 1.4.2 (unreleased)
 ------------------------------------------------
 
+ * Allow symmetric encryption with gpgme_op_encrypt_sign.
+
  * Interface changes relative to the 1.4.1 release:
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  gpgme_off_t                    NEW.
index cb0ea61..4f484e9 100644 (file)
@@ -47,19 +47,38 @@ encrypt_sign_status_handler (void *priv, gpgme_status_code_t code, char *args)
 
 
 static gpgme_error_t
+encrypt_sym_status_handler (void *priv, gpgme_status_code_t code, char *args)
+{
+  gpgme_error_t err;
+
+  err = _gpgme_progress_status_handler (priv, code, args);
+  if (!err)
+    err = _gpgme_sign_status_handler (priv, code, args);
+  if (!err)
+    err = _gpgme_passphrase_status_handler (priv, code, args);
+  return err;
+}
+
+
+static gpgme_error_t
 encrypt_sign_start (gpgme_ctx_t ctx, int synchronous, gpgme_key_t recp[],
                    gpgme_encrypt_flags_t flags,
                    gpgme_data_t plain, gpgme_data_t cipher)
 {
   gpgme_error_t err;
+  int symmetric;
 
   err = _gpgme_op_reset (ctx, synchronous);
   if (err)
     return err;
 
+  symmetric = !recp;
+
   if (!plain)
     return gpg_error (GPG_ERR_NO_DATA);
-  if (!cipher || !recp)
+  if (!cipher)
+    return gpg_error (GPG_ERR_INV_VALUE);
+  if (recp && !*recp)
     return gpg_error (GPG_ERR_INV_VALUE);
 
   err = _gpgme_op_encrypt_init_result (ctx);
@@ -79,7 +98,10 @@ encrypt_sign_start (gpgme_ctx_t ctx, int synchronous, gpgme_key_t recp[],
     }
 
   _gpgme_engine_set_status_handler (ctx->engine,
-                                   encrypt_sign_status_handler, ctx);
+                                    symmetric
+                                    ? encrypt_sym_status_handler
+                                    : encrypt_sign_status_handler,
+                                   ctx);
 
   return _gpgme_engine_op_encrypt_sign (ctx->engine, recp, flags, plain,
                                        cipher, ctx->use_armor,
index 3f02503..65012fa 100644 (file)
@@ -1700,23 +1700,29 @@ gpg_encrypt_sign (void *engine, gpgme_key_t recp[],
 {
   engine_gpg_t gpg = engine;
   gpgme_error_t err;
+  int symmetric = !recp;
+
+  err = add_arg (gpg, symmetric ? "--symmetric" : "--encrypt");
 
-  err = add_arg (gpg, "--encrypt");
   if (!err)
     err = add_arg (gpg, "--sign");
   if (!err && use_armor)
     err = add_arg (gpg, "--armor");
 
-  /* If we know that all recipients are valid (full or ultimate trust)
-     we can suppress further checks.  */
-  if (!err && (flags & GPGME_ENCRYPT_ALWAYS_TRUST))
-    err = add_arg (gpg, "--always-trust");
+  if (!symmetric)
+    {
+      /* If we know that all recipients are valid (full or ultimate trust)
+        we can suppress further checks.  */
+      if (!err && (flags & GPGME_ENCRYPT_ALWAYS_TRUST))
+       err = add_arg (gpg, "--always-trust");
 
-  if (!err)
-    err = append_args_from_recipients (gpg, recp);
+      if (!err)
+       err = append_args_from_recipients (gpg, recp);
+    }
 
   if (!err)
     err = append_args_from_signers (gpg, ctx);
+
   if (!err)
     err = append_args_from_sig_notations (gpg, ctx);
 
index 9d00340..1e1262f 100644 (file)
@@ -3,17 +3,17 @@
    Copyright (C) 2001, 2002, 2003, 2004 g10 Code GmbH
 
    This file is part of GPGME.
+
    GPGME is free software; you can redistribute it and/or modify it
    under the terms of the GNU Lesser General Public License as
    published by the Free Software Foundation; either version 2.1 of
    the License, or (at your option) any later version.
-   
+
    GPGME is distributed in the hope that it will be useful, but
    WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    Lesser General Public License for more details.
-   
+
    You should have received a copy of the GNU Lesser General Public
    License along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
@@ -83,7 +83,7 @@ check_result (gpgme_sign_result_t result, gpgme_sig_mode_t type)
 }
 
 
-int 
+int
 main (int argc, char **argv)
 {
   gpgme_ctx_t ctx;
@@ -95,7 +95,7 @@ main (int argc, char **argv)
   char *agent_info;
 
   init_gpgme (GPGME_PROTOCOL_OpenPGP);
-    
+
   err = gpgme_new (&ctx);
   fail_if_err (err);
   gpgme_set_textmode (ctx, 1);
@@ -135,6 +135,24 @@ main (int argc, char **argv)
   gpgme_key_unref (key[1]);
   gpgme_data_release (in);
   gpgme_data_release (out);
+
+  /* Now a second time using symmetric encryption.  */
+  err = gpgme_data_new_from_mem (&in, "Hallo Leute\n", 12, 0);
+  fail_if_err (err);
+
+  err = gpgme_data_new (&out);
+  fail_if_err (err);
+
+  err = gpgme_op_encrypt_sign (ctx, NULL, GPGME_ENCRYPT_ALWAYS_TRUST, in, out);
+  fail_if_err (err);
+  sign_result = gpgme_op_sign_result (ctx);
+  check_result (sign_result, GPGME_SIG_MODE_NORMAL);
+  print_data (out);
+
+  gpgme_data_release (in);
+  gpgme_data_release (out);
+
+
   gpgme_release (ctx);
   return 0;
 }