Index: src/encrypt-sign.c =================================================================== --- src/encrypt-sign.c +++ src/encrypt-sign.c @@ -45,6 +45,16 @@ return err; } +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_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[], @@ -52,14 +62,20 @@ gpgme_data_t plain, gpgme_data_t cipher) { gpgme_error_t err; + int symmetric = 0; err = _gpgme_op_reset (ctx, synchronous); if (err) return err; + if (!recp) + symmetric = 1; + 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,8 +95,11 @@ } _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, ctx /* FIXME */); Index: src/engine-gpg.c =================================================================== --- src/engine-gpg.c +++ src/engine-gpg.c @@ -1671,25 +1671,31 @@ { 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) + if (!err) err = append_args_from_signers (gpg, ctx); - if (!err) + + if (!err) err = append_args_from_sig_notations (gpg, ctx); + } /* Tell the gpg object about the data. */ if (!err)