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:
parent
0c1de7abd5
commit
567e6481d7
2
NEWS
2
NEWS
@ -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.
|
||||||
|
@ -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,
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user