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 <g10bts@curetheitch.com>
GnuPG-bug-id: 1440
This commit is contained in:
Werner Koch 2013-05-22 15:30:12 +01:00
parent 0c1de7abd5
commit 567e6481d7
4 changed files with 62 additions and 14 deletions

2
NEWS
View File

@ -1,6 +1,8 @@
Noteworthy changes in version 1.4.2 (unreleased) 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: * Interface changes relative to the 1.4.1 release:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
gpgme_off_t NEW. gpgme_off_t NEW.

View File

@ -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 static gpgme_error_t
encrypt_sign_start (gpgme_ctx_t ctx, int synchronous, gpgme_key_t recp[], encrypt_sign_start (gpgme_ctx_t ctx, int synchronous, gpgme_key_t recp[],
gpgme_encrypt_flags_t flags, gpgme_encrypt_flags_t flags,
gpgme_data_t plain, gpgme_data_t cipher) gpgme_data_t plain, gpgme_data_t cipher)
{ {
gpgme_error_t err; gpgme_error_t err;
int symmetric;
err = _gpgme_op_reset (ctx, synchronous); err = _gpgme_op_reset (ctx, synchronous);
if (err) if (err)
return err; return err;
symmetric = !recp;
if (!plain) if (!plain)
return gpg_error (GPG_ERR_NO_DATA); 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); return gpg_error (GPG_ERR_INV_VALUE);
err = _gpgme_op_encrypt_init_result (ctx); 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, _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, return _gpgme_engine_op_encrypt_sign (ctx->engine, recp, flags, plain,
cipher, ctx->use_armor, cipher, ctx->use_armor,

View File

@ -1700,23 +1700,29 @@ gpg_encrypt_sign (void *engine, gpgme_key_t recp[],
{ {
engine_gpg_t gpg = engine; engine_gpg_t gpg = engine;
gpgme_error_t err; gpgme_error_t err;
int symmetric = !recp;
err = add_arg (gpg, symmetric ? "--symmetric" : "--encrypt");
err = add_arg (gpg, "--encrypt");
if (!err) if (!err)
err = add_arg (gpg, "--sign"); err = add_arg (gpg, "--sign");
if (!err && use_armor) if (!err && use_armor)
err = add_arg (gpg, "--armor"); err = add_arg (gpg, "--armor");
/* If we know that all recipients are valid (full or ultimate trust) if (!symmetric)
we can suppress further checks. */ {
if (!err && (flags & GPGME_ENCRYPT_ALWAYS_TRUST)) /* If we know that all recipients are valid (full or ultimate trust)
err = add_arg (gpg, "--always-trust"); we can suppress further checks. */
if (!err && (flags & GPGME_ENCRYPT_ALWAYS_TRUST))
err = add_arg (gpg, "--always-trust");
if (!err) if (!err)
err = append_args_from_recipients (gpg, recp); err = append_args_from_recipients (gpg, recp);
}
if (!err) if (!err)
err = append_args_from_signers (gpg, ctx); err = append_args_from_signers (gpg, ctx);
if (!err) if (!err)
err = append_args_from_sig_notations (gpg, ctx); err = append_args_from_sig_notations (gpg, ctx);

View File

@ -3,17 +3,17 @@
Copyright (C) 2001, 2002, 2003, 2004 g10 Code GmbH Copyright (C) 2001, 2002, 2003, 2004 g10 Code GmbH
This file is part of GPGME. This file is part of GPGME.
GPGME is free software; you can redistribute it and/or modify it GPGME is free software; you can redistribute it and/or modify it
under the terms of the GNU Lesser General Public License as under the terms of the GNU Lesser General Public License as
published by the Free Software Foundation; either version 2.1 of published by the Free Software Foundation; either version 2.1 of
the License, or (at your option) any later version. the License, or (at your option) any later version.
GPGME is distributed in the hope that it will be useful, but GPGME is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details. Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public You should have received a copy of the GNU Lesser General Public
License along with this program; if not, write to the Free Software License along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 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) main (int argc, char **argv)
{ {
gpgme_ctx_t ctx; gpgme_ctx_t ctx;
@ -95,7 +95,7 @@ main (int argc, char **argv)
char *agent_info; char *agent_info;
init_gpgme (GPGME_PROTOCOL_OpenPGP); init_gpgme (GPGME_PROTOCOL_OpenPGP);
err = gpgme_new (&ctx); err = gpgme_new (&ctx);
fail_if_err (err); fail_if_err (err);
gpgme_set_textmode (ctx, 1); gpgme_set_textmode (ctx, 1);
@ -135,6 +135,24 @@ main (int argc, char **argv)
gpgme_key_unref (key[1]); gpgme_key_unref (key[1]);
gpgme_data_release (in); gpgme_data_release (in);
gpgme_data_release (out); 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); gpgme_release (ctx);
return 0; return 0;
} }