diff options
| author | Werner Koch <[email protected]> | 2013-05-22 14:30:12 +0000 | 
|---|---|---|
| committer | Werner Koch <[email protected]> | 2013-05-22 14:31:51 +0000 | 
| commit | 567e6481d767af60390d649897b897a8b0e7e9a5 (patch) | |
| tree | 4ebe710383116afcad1f84e9f974760ffb481243 | |
| parent | gpgme-tool: Allow for symmetric encryption. (diff) | |
| download | gpgme-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-- | NEWS | 2 | ||||
| -rw-r--r-- | src/encrypt-sign.c | 26 | ||||
| -rw-r--r-- | src/engine-gpg.c | 20 | ||||
| -rw-r--r-- | tests/gpg/t-encrypt-sign.c | 28 | 
4 files changed, 62 insertions, 14 deletions
| @@ -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;  } | 
