aboutsummaryrefslogtreecommitdiffstats
path: root/tests/gpg/t-support.h
diff options
context:
space:
mode:
authorIngo Klöcker <[email protected]>2023-07-28 14:15:12 +0000
committerIngo Klöcker <[email protected]>2023-07-28 14:15:12 +0000
commita9b28c79e92f6194ea52c7d33213f2a0dc9bd013 (patch)
tree7a077657ad431e815ea621beb4c556f50e876f6d /tests/gpg/t-support.h
parentcore: Return bad data error instead of general error on unexpected data (diff)
downloadgpgme-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 'tests/gpg/t-support.h')
-rw-r--r--tests/gpg/t-support.h44
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
}