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 @@ -46,20 +46,39 @@ 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; }