core: Send a input-size-hint for gpgsm.

* src/engine-gpgsm.c (send_input_size_hint): New.
(gpgsm_decrypt): Send hint.
(gpgsm_encrypt): Send hint.
(gpgsm_sign): Send hint.
(gpgsm_verify): Send hint.
--
GnuPG-bug-id: 6534
This commit is contained in:
Werner Koch 2023-06-15 13:00:01 +02:00
parent 8796456d23
commit 91bbb1e482
No known key found for this signature in database
GPG Key ID: E3FDFF218E45B72B

View File

@ -1232,6 +1232,38 @@ gpgsm_reset (void *engine)
#endif #endif
/* Send the input-size-hint option. Note that we need to send it
* always so that we don't actually use a wrong hint from the last
* command. */
static gpgme_error_t
send_input_size_hint (engine_gpgsm_t gpgsm, gpgme_data_t data)
{
gpg_error_t err;
uint64_t value;
char numbuf[50]; /* Large enough for even 2^128 in base-10. */
char cmd[100];
char *p;
value = _gpgme_data_get_size_hint (data);
if (!value)
value = 0;
p = numbuf + sizeof numbuf;
*--p = 0;
do
{
*--p = '0' + (value % 10);
value /= 10;
}
while (value);
snprintf (cmd, sizeof cmd, "OPTION input-size-hint=%s", p);
err = gpgsm_assuan_simple_command (gpgsm, cmd, NULL, NULL);
if (gpg_err_code (err) == GPG_ERR_UNKNOWN_OPTION)
err = 0; /* Ignore error from older gpgsm versions. */
return err;
}
static gpgme_error_t static gpgme_error_t
gpgsm_decrypt (void *engine, gpgsm_decrypt (void *engine,
@ -1256,6 +1288,10 @@ gpgsm_decrypt (void *engine,
if (!gpgsm) if (!gpgsm)
return gpg_error (GPG_ERR_INV_VALUE); return gpg_error (GPG_ERR_INV_VALUE);
err = send_input_size_hint (gpgsm, ciph);
if (err)
return err;
gpgsm->input_cb.data = ciph; gpgsm->input_cb.data = ciph;
err = gpgsm_set_fd (gpgsm, INPUT_FD, map_data_enc (gpgsm->input_cb.data)); err = gpgsm_set_fd (gpgsm, INPUT_FD, map_data_enc (gpgsm->input_cb.data));
if (err) if (err)
@ -1480,6 +1516,10 @@ gpgsm_encrypt (void *engine, gpgme_key_t recp[], const char *recpstring,
return err; return err;
} }
err = send_input_size_hint (gpgsm, plain);
if (err)
return err;
gpgsm->input_cb.data = plain; gpgsm->input_cb.data = plain;
err = gpgsm_set_fd (gpgsm, INPUT_FD, map_data_enc (gpgsm->input_cb.data)); err = gpgsm_set_fd (gpgsm, INPUT_FD, map_data_enc (gpgsm->input_cb.data));
if (err) if (err)
@ -2096,6 +2136,10 @@ gpgsm_sign (void *engine, gpgme_data_t in, gpgme_data_t out,
return err; return err;
} }
err = send_input_size_hint (gpgsm, in);
if (err)
return err;
gpgsm->input_cb.data = in; gpgsm->input_cb.data = in;
err = gpgsm_set_fd (gpgsm, INPUT_FD, map_data_enc (gpgsm->input_cb.data)); err = gpgsm_set_fd (gpgsm, INPUT_FD, map_data_enc (gpgsm->input_cb.data));
if (err) if (err)
@ -2137,6 +2181,10 @@ gpgsm_verify (void *engine, gpgme_verify_flags_t flags, gpgme_data_t sig,
if (!signed_text) if (!signed_text)
{ {
/* Normal or cleartext signature. */ /* Normal or cleartext signature. */
err = send_input_size_hint (gpgsm, sig);
if (err)
return err;
if (plaintext) if (plaintext)
{ {
gpgsm->output_cb.data = plaintext; gpgsm->output_cb.data = plaintext;
@ -2152,6 +2200,10 @@ gpgsm_verify (void *engine, gpgme_verify_flags_t flags, gpgme_data_t sig,
else else
{ {
/* Detached signature. */ /* Detached signature. */
err = send_input_size_hint (gpgsm, signed_text);
if (err)
return err;
gpgsm->message_cb.data = signed_text; gpgsm->message_cb.data = signed_text;
err = gpgsm_set_fd (gpgsm, MESSAGE_FD, 0); err = gpgsm_set_fd (gpgsm, MESSAGE_FD, 0);
gpgsm_clear_fd (gpgsm, OUTPUT_FD); gpgsm_clear_fd (gpgsm, OUTPUT_FD);