diff options
author | Neal H. Walfield <[email protected]> | 2015-11-05 11:20:42 +0000 |
---|---|---|
committer | Neal H. Walfield <[email protected]> | 2015-11-05 13:16:33 +0000 |
commit | ec409e62aea6cc829299be794f9d035d033cb51b (patch) | |
tree | 751b85be355f5e858c384cd0d2d771fc7b372878 /g10/decrypt-data.c | |
parent | common: Add a function for copying data from one iobuf to another. (diff) | |
download | gnupg-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.c | 33 |
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); |