aboutsummaryrefslogtreecommitdiffstats
path: root/g10/decrypt-data.c
diff options
context:
space:
mode:
authorNeal H. Walfield <[email protected]>2015-11-05 11:20:42 +0000
committerNeal H. Walfield <[email protected]>2015-11-05 13:16:33 +0000
commitec409e62aea6cc829299be794f9d035d033cb51b (patch)
tree751b85be355f5e858c384cd0d2d771fc7b372878 /g10/decrypt-data.c
parentcommon: Add a function for copying data from one iobuf to another. (diff)
downloadgnupg-ec409e62aea6cc829299be794f9d035d033cb51b.tar.gz
gnupg-ec409e62aea6cc829299be794f9d035d033cb51b.zip
gpg: Add support for unwrapping the outer level of encryption.
* g10/decrypt-data.c (decrypt_data): If OPT.UNWRAP_ENCRYPTION is set, copy the data to the output file instead of continuing to process it. * g10/gpg.c (enum cmd_and_opt_values): Add new value oUnwrap. (opts): Handle oUnwrap. (main): Likewise. * g10/options.h (opt): Add field unwrap_encryption. * g10/plaintext.c (handle_plaintext): Break the output file selection functionality into ... (get_output_file): ... this new function. -- Signed-off-by: Neal H. Walfield <[email protected]> GnuPG-bug-id: 1060 Debian-bug-id: 282061
Diffstat (limited to 'g10/decrypt-data.c')
-rw-r--r--g10/decrypt-data.c33
1 files changed, 32 insertions, 1 deletions
diff --git a/g10/decrypt-data.c b/g10/decrypt-data.c
index 570a71d11..b575f39dd 100644
--- a/g10/decrypt-data.c
+++ b/g10/decrypt-data.c
@@ -221,7 +221,38 @@ decrypt_data (ctrl_t ctrl, void *procctx, PKT_encrypted *ed, DEK *dek)
else
iobuf_push_filter ( ed->buf, decode_filter, dfx );
- proc_packets (ctrl, procctx, ed->buf );
+ if (opt.unwrap_encryption)
+ {
+ char *filename;
+ estream_t fp;
+ rc = get_output_file ("", 0, ed->buf, &filename, &fp);
+ if (! rc)
+ {
+ iobuf_t output = iobuf_esopen (fp, "w", 0);
+ armor_filter_context_t *afx = NULL;
+
+ if (opt.armor)
+ {
+ afx = new_armor_context ();
+ push_armor_filter (afx, output);
+ }
+
+ iobuf_copy (output, ed->buf);
+ if ((rc = iobuf_error (ed->buf)))
+ log_error (_("error reading: %s\n"),
+ filename, gpg_strerror (rc));
+ else if ((rc = iobuf_error (output)))
+ log_error (_("error writing output ('%s'): %s\n"),
+ filename, gpg_strerror (rc));
+
+ iobuf_close (output);
+ if (afx)
+ release_armor_context (afx);
+ }
+ }
+ else
+ proc_packets (ctrl, procctx, ed->buf );
+
ed->buf = NULL;
if (dfx->eof_seen > 1 )
rc = gpg_error (GPG_ERR_INV_PACKET);