diff options
| author | Ingo Klöcker <[email protected]> | 2023-07-28 14:15:12 +0000 | 
|---|---|---|
| committer | Ingo Klöcker <[email protected]> | 2023-07-28 14:15:12 +0000 | 
| commit | a9b28c79e92f6194ea52c7d33213f2a0dc9bd013 (patch) | |
| tree | 7a077657ad431e815ea621beb4c556f50e876f6d /tests/gpg/t-support.h | |
| parent | core: Return bad data error instead of general error on unexpected data (diff) | |
| download | gpgme-a9b28c79e92f6194ea52c7d33213f2a0dc9bd013.tar.gz gpgme-a9b28c79e92f6194ea52c7d33213f2a0dc9bd013.zip | |
core: Prevent wrong plaintext when verifying clearsigned signature
* src/engine-gpg.c (gpg_verify): Use a separate pipe instead of stdout
for reading the plaintext.
* tests/gpg/t-support.h (PGM): Define if undefined.
(print_data): Undefine BUF_SIZE.
(check_data): New.
* tests/gpg/t-verify.c (clearsigned_plus_key_block): New.
(main): Add test.
--
Reading the plaintext from stdout is a bad idea because gpg can also
print other stuff on stdout, e.g. the keys contained in a public key
block. This is fixed by reading the plaintext via a special pipe.
GnuPG-bug-id: 6622
Diffstat (limited to '')
| -rw-r--r-- | tests/gpg/t-support.h | 44 | 
1 files changed, 44 insertions, 0 deletions
| diff --git a/tests/gpg/t-support.h b/tests/gpg/t-support.h index b3f54e57..0c1a73ed 100644 --- a/tests/gpg/t-support.h +++ b/tests/gpg/t-support.h @@ -32,6 +32,10 @@  #include <gpgme.h> +#ifndef PGM +#define PGM "unknown program; define PGM before including t-support.h" +#endif +  #ifndef DIM  #define DIM(v)		     (sizeof(v)/sizeof((v)[0]))  #endif @@ -99,6 +103,46 @@ print_data (gpgme_data_t dh)      fwrite (buf, ret, 1, stdout);    if (ret < 0)      fail_if_err (gpgme_err_code_from_errno (errno)); +#undef BUF_SIZE +} + + +void +check_data (gpgme_data_t dh, const char *expected) +{ +#define BUF_SIZE 512 +  char buf[BUF_SIZE + 1]; +  int expectedlen; +  int ret; + +  if (!expected) +    { +      fprintf (stderr, "%s:%i: Expected data must not be NULL.\n", +               PGM, __LINE__); +      exit (1); +    } +  expectedlen = strlen (expected); +  if (expectedlen > BUF_SIZE) +    { +      fprintf (stderr, "%s:%i: Size of expected data (%d) is greater than " +               "BUF_SIZE (%d).\n", PGM, __LINE__, expectedlen, BUF_SIZE); +      exit (1); +    } + +  ret = gpgme_data_seek (dh, 0, SEEK_SET); +  if (ret) +    fail_if_err (gpgme_err_code_from_errno (errno)); +  if ((ret = gpgme_data_read (dh, buf, BUF_SIZE)) < 0) +    fail_if_err (gpgme_err_code_from_errno (errno)); +  buf[ret] = 0; +  if (ret != expectedlen || strncmp (buf, expected, expectedlen)) +    { +      fprintf (stderr, "%s:%i: Got unexpected data\n", PGM, __LINE__); +      fprintf (stderr, "Expected data:\n---\n%s---\n", expected); +      fprintf (stderr, "Actual data:\n---\n%s---\n", buf); +      exit (1); +    } +#undef BUF_SIZE  } | 
