aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWerner Koch <[email protected]>2013-05-22 14:30:12 +0000
committerWerner Koch <[email protected]>2013-05-22 14:31:51 +0000
commit567e6481d767af60390d649897b897a8b0e7e9a5 (patch)
tree4ebe710383116afcad1f84e9f974760ffb481243
parentgpgme-tool: Allow for symmetric encryption. (diff)
downloadgpgme-567e6481d767af60390d649897b897a8b0e7e9a5.tar.gz
gpgme-567e6481d767af60390d649897b897a8b0e7e9a5.zip
Allow symmetric encryption with gpgme_op_encrypt_sign.
* 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 <[email protected]> GnuPG-bug-id: 1440
-rw-r--r--NEWS2
-rw-r--r--src/encrypt-sign.c26
-rw-r--r--src/engine-gpg.c20
-rw-r--r--tests/gpg/t-encrypt-sign.c28
4 files changed, 62 insertions, 14 deletions
diff --git a/NEWS b/NEWS
index dc67bf73..3a583d3e 100644
--- 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.
diff --git a/src/encrypt-sign.c b/src/encrypt-sign.c
index cb0ea619..4f484e90 100644
--- a/src/encrypt-sign.c
+++ b/src/encrypt-sign.c
@@ -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,
diff --git a/src/engine-gpg.c b/src/engine-gpg.c
index 3f025030..65012fab 100644
--- a/src/engine-gpg.c
+++ b/src/engine-gpg.c
@@ -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);
diff --git a/tests/gpg/t-encrypt-sign.c b/tests/gpg/t-encrypt-sign.c
index 9d003405..1e1262f3 100644
--- a/tests/gpg/t-encrypt-sign.c
+++ b/tests/gpg/t-encrypt-sign.c
@@ -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;
}