aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWerner Koch <[email protected]>2024-09-09 15:33:29 +0000
committerWerner Koch <[email protected]>2024-09-09 15:33:29 +0000
commitcd79fc39736fda6ce38f1f79700cf658c47372f9 (patch)
treee4da5d060c6d487dbe7897ec7bf9441814b69e27
parentcore: Treat email-only user IDs with upper case letters as email address (diff)
downloadgpgme-cd79fc39736fda6ce38f1f79700cf658c47372f9.tar.gz
gpgme-cd79fc39736fda6ce38f1f79700cf658c47372f9.zip
core: New encryption flags GPGME_ENCRYPT_ADD_RECP and _CHG_RECP.
* src/gpgme.h.in (GPGME_ENCRYPT_ADD_RECP, GPGME_ENCRYPT_CHG_RECP): New flag values. * src/engine-gpg.c (have_cmd_modify_recipients): New. (gpg_encrypt): Check availability of the feature and prepare command. * tests/run-encrypt.c (main): New options --add-recipients and --change-recipients. -- GnuPG-bug-id: 1825
-rw-r--r--NEWS4
-rw-r--r--doc/gpgme.texi11
-rw-r--r--src/engine-gpg.c41
-rw-r--r--src/gpgme.h.in4
-rw-r--r--tests/run-encrypt.c14
5 files changed, 71 insertions, 3 deletions
diff --git a/NEWS b/NEWS
index fdca7ab1..e6d1467f 100644
--- a/NEWS
+++ b/NEWS
@@ -17,6 +17,8 @@ Noteworthy changes in version 1.24.0 (unrelease)
easier and to allow enabling/disabling of keys (requires GnuPG 2.4.6).
[T7239]
+ * New flag to re-encrypt OpenPGP data (requires GnuPG 2.5.1). [T1825]
+
* cpp: Provide information about designated revocation keys for a Key.
[T7118]
@@ -49,6 +51,8 @@ Noteworthy changes in version 1.24.0 (unrelease)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
GPGME_ENCRYPT_FILE NEW.
GPGME_SIG_MODE_FILE NEW.
+ GPGME_ENCRYPT_ADD_RECP NEW.
+ GPGME_ENCRYPT_CHG_RECP NEW.
gpgme_key_t EXTENDED: New field 'revkeys'.
gpgme_revocation_key_t NEW.
gpgme_set_ctx_flag EXTENDED: New flag 'import-options'.
diff --git a/doc/gpgme.texi b/doc/gpgme.texi
index a630e0e2..0e64254b 100644
--- a/doc/gpgme.texi
+++ b/doc/gpgme.texi
@@ -6760,6 +6760,17 @@ output should be additionally encrypted symmetrically even
if recipients are provided. This feature is only supported
for the OpenPGP crypto engine.
+@item GPGME_ENCRYPT_ADD_RECP
+@item GPGME_ENCRYPT_CHG_RECP
+@since{1.24.0}
+
+Instead of encrypting, decrypt the input and write an output which is
+additionally encrypted to the specified keys. The CHG flag is similar
+but does not add encryption to the specified keys but existing
+encryption keys by the new ones. This feature is only supported for
+the OpenPGP crypto engine and requires at least GnuPG version 2.5.1.
+
+
@item GPGME_ENCRYPT_THROW_KEYIDS
@since{1.8.0}
diff --git a/src/engine-gpg.c b/src/engine-gpg.c
index fc9c7f90..eba61ac4 100644
--- a/src/engine-gpg.c
+++ b/src/engine-gpg.c
@@ -456,6 +456,22 @@ have_option_proc_all_sigs (engine_gpg_t gpg)
}
+static int
+have_cmd_modify_recipients (engine_gpg_t gpg)
+{
+ static unsigned int flag;
+
+ if (flag)
+ ;
+ else if (have_gpg_version (gpg, "2.5.1"))
+ flag = 1|2;
+ else
+ flag = 1;
+
+ return !!(flag & 2);
+}
+
+
static void
free_argv (char **argv)
{
@@ -2403,11 +2419,32 @@ gpg_encrypt (void *engine, gpgme_key_t recp[], const char *recpstring,
if (gpg->flags.use_gpgtar && (flags & GPGME_ENCRYPT_WRAP))
return gpg_error (GPG_ERR_INV_VALUE);
+ if ((flags & (GPGME_ENCRYPT_ADD_RECP|GPGME_ENCRYPT_CHG_RECP))
+ && !have_cmd_modify_recipients (gpg))
+ return gpg_error (GPG_ERR_NOT_SUPPORTED);
+
if (recp || recpstring)
- err = add_arg (gpg, "--encrypt");
+ {
+ if ((flags & GPGME_ENCRYPT_ADD_RECP))
+ err = add_arg (gpg, "--add-recipients");
+ else if ((flags & GPGME_ENCRYPT_CHG_RECP))
+ err = add_arg (gpg, "--change-recipients");
+ else
+ err = add_arg (gpg, "--encrypt");
+ }
if (!err && ((flags & GPGME_ENCRYPT_SYMMETRIC) || (!recp && !recpstring)))
- err = add_arg (gpg, "--symmetric");
+ {
+ if (!recp && !recpstring)
+ {
+ if ((flags & GPGME_ENCRYPT_ADD_RECP))
+ err = add_arg (gpg, "--add-recipients");
+ else if ((flags & GPGME_ENCRYPT_CHG_RECP))
+ err = add_arg (gpg, "--change-recipients");
+ }
+ if (!err)
+ err = add_arg (gpg, "--symmetric");
+ }
if (!err && use_armor)
err = add_gpg_arg (gpg, "--armor");
diff --git a/src/gpgme.h.in b/src/gpgme.h.in
index a01a24a6..cdd945bf 100644
--- a/src/gpgme.h.in
+++ b/src/gpgme.h.in
@@ -1356,7 +1356,9 @@ typedef enum
GPGME_ENCRYPT_WRAP = 128,
GPGME_ENCRYPT_WANT_ADDRESS = 256,
GPGME_ENCRYPT_ARCHIVE = 512,
- GPGME_ENCRYPT_FILE = 1024
+ GPGME_ENCRYPT_FILE = 1024,
+ GPGME_ENCRYPT_ADD_RECP = 2048,
+ GPGME_ENCRYPT_CHG_RECP = 4096
}
gpgme_encrypt_flags_t;
diff --git a/tests/run-encrypt.c b/tests/run-encrypt.c
index 8e8b559c..5a10e593 100644
--- a/tests/run-encrypt.c
+++ b/tests/run-encrypt.c
@@ -143,6 +143,8 @@ show_usage (int ex)
" --openpgp use the OpenPGP protocol (default)\n"
" --cms use the CMS protocol\n"
" --uiserver use the UI server\n"
+ " --add-recipients use the re-encrypt feature\n"
+ " --change-recipients ditto, but clear existing keys\n"
" --loopback use a loopback pinentry\n"
" --key NAME encrypt to key NAME\n"
" --keystring NAMES encrypt to ';' delimited NAMES\n"
@@ -240,6 +242,18 @@ main (int argc, char **argv)
protocol = GPGME_PROTOCOL_UISERVER;
argc--; argv++;
}
+ else if (!strcmp (*argv, "--add-recipients"))
+ {
+ flags |= GPGME_ENCRYPT_ADD_RECP;
+ flags &= ~GPGME_ENCRYPT_CHG_RECP;
+ argc--; argv++;
+ }
+ else if (!strcmp (*argv, "--change-recipients"))
+ {
+ flags |= GPGME_ENCRYPT_CHG_RECP;
+ flags &= ~GPGME_ENCRYPT_ADD_RECP;
+ argc--; argv++;
+ }
else if (!strcmp (*argv, "--key"))
{
argc--; argv++;