diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/engine-gpg.c | 45 |
1 files changed, 43 insertions, 2 deletions
diff --git a/src/engine-gpg.c b/src/engine-gpg.c index efab80ac..3edac6ca 100644 --- a/src/engine-gpg.c +++ b/src/engine-gpg.c @@ -42,6 +42,7 @@ #include "priv-io.h" #include "sema.h" #include "debug.h" +#include "data.h" #include "engine-backend.h" @@ -1483,6 +1484,35 @@ start (engine_gpg_t gpg) } +/* Add the --input-size-hint option if requested. */ +static gpgme_error_t +add_input_size_hint (engine_gpg_t gpg, gpgme_data_t data) +{ + gpgme_error_t err; + gpgme_off_t value = _gpgme_data_get_size_hint (data); + char numbuf[50]; /* Large enough for even 2^128 in base-10. */ + char *p; + + if (!value || !have_gpg_version (gpg, "2.1.15")) + return 0; + + err = add_arg (gpg, "--input-size-hint"); + if (!err) + { + p = numbuf + sizeof numbuf; + *--p = 0; + do + { + *--p = '0' + (value % 10); + value /= 10; + } + while (value); + err = add_arg (gpg, p); + } + return err; +} + + static gpgme_error_t gpg_decrypt (void *engine, gpgme_data_t ciph, gpgme_data_t plain) { @@ -1499,6 +1529,8 @@ gpg_decrypt (void *engine, gpgme_data_t ciph, gpgme_data_t plain) if (!err) err = add_data (gpg, plain, 1, 1); if (!err) + err = add_input_size_hint (gpg, ciph); + if (!err) err = add_arg (gpg, "--"); if (!err) err = add_data (gpg, ciph, -1, 0); @@ -1764,6 +1796,8 @@ gpg_encrypt (void *engine, gpgme_key_t recp[], gpgme_encrypt_flags_t flags, err = add_arg (gpg, gpgme_data_get_file_name (plain)); } if (!err) + err = add_input_size_hint (gpg, plain); + if (!err) err = add_arg (gpg, "--"); if (!err) err = add_data (gpg, plain, -1, 0); @@ -1837,6 +1871,8 @@ gpg_encrypt_sign (void *engine, gpgme_key_t recp[], err = add_arg (gpg, gpgme_data_get_file_name (plain)); } if (!err) + err = add_input_size_hint (gpg, plain); + if (!err) err = add_arg (gpg, "--"); if (!err) err = add_data (gpg, plain, -1, 0); @@ -2291,7 +2327,7 @@ gpg_keylist_build_options (engine_gpg_t gpg, int secret_only, err = add_arg (gpg, "--with-colons"); /* Since gpg 2.1.15 fingerprints are always printed, thus there is - * no more need to explictly reqeust them. */ + * no more need to explictly request them. */ if (!have_gpg_version (gpg, "2.1.15")) { if (!err) @@ -2436,6 +2472,8 @@ gpg_sign (void *engine, gpgme_data_t in, gpgme_data_t out, /* Tell the gpg object about the data. */ if (!err) + err = add_input_size_hint (gpg, in); + if (!err) err = add_arg (gpg, "--"); if (!err) err = add_data (gpg, in, -1, 0); @@ -2481,11 +2519,12 @@ gpg_verify (void *engine, gpgme_data_t sig, gpgme_data_t signed_text, if (plaintext) { /* Normal or cleartext signature. */ - err = add_arg (gpg, "--output"); if (!err) err = add_arg (gpg, "-"); if (!err) + err = add_input_size_hint (gpg, sig); + if (!err) err = add_arg (gpg, "--"); if (!err) err = add_data (gpg, sig, -1, 0); @@ -2496,6 +2535,8 @@ gpg_verify (void *engine, gpgme_data_t sig, gpgme_data_t signed_text, { err = add_arg (gpg, "--verify"); if (!err) + err = add_input_size_hint (gpg, signed_text); + if (!err) err = add_arg (gpg, "--"); if (!err) err = add_data (gpg, sig, -1, 0); |