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)
------------------------------------------------
* Allow symmetric encryption with gpgme_op_encrypt_sign.
* Interface changes relative to the 1.4.1 release:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
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
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,

View File

@ -1700,13 +1700,17 @@ 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 (!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))
@ -1714,9 +1718,11 @@ gpg_encrypt_sign (void *engine, gpgme_key_t 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);

View File

@ -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;
}