summaryrefslogtreecommitdiff
path: root/tests/run-encrypt.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/run-encrypt.c')
-rw-r--r--tests/run-encrypt.c251
1 files changed, 200 insertions, 51 deletions
diff --git a/tests/run-encrypt.c b/tests/run-encrypt.c
index 7b0e29a..80c4072 100644
--- a/tests/run-encrypt.c
+++ b/tests/run-encrypt.c
@@ -36,6 +36,7 @@
static int verbose;
+static int cancel_after_progress;
static char *
@@ -63,7 +64,10 @@ status_cb (void *opaque, const char *keyword, const char *value)
static void
progress_cb (void *opaque, const char *what, int type, int current, int total)
{
- (void)opaque;
+ static int count;
+ gpgme_ctx_t ctx = opaque;
+ gpg_error_t err;
+
(void)type;
if (total)
@@ -73,14 +77,28 @@ progress_cb (void *opaque, const char *what, int type, int current, int total)
else
fprintf (stderr, "progress for '%s' %d\n", nonnull(what), current);
fflush (stderr);
+ count++;
+ if (cancel_after_progress && count > cancel_after_progress)
+ {
+ err = gpgme_cancel_async (ctx);
+ if (err)
+ fprintf (stderr, "gpgme_cancel failed: %s <%s>\n",
+ gpg_strerror (err), gpg_strsource (err));
+ else
+ {
+ fprintf (stderr, "operation canceled\n");
+ cancel_after_progress = 0;
+ }
+ }
}
static void
-print_result (gpgme_encrypt_result_t result)
+print_encrypt_result (gpgme_encrypt_result_t result)
{
gpgme_invalid_key_t invkey;
+ printf ("\nEncryption results\n");
for (invkey = result->invalid_recipients; invkey; invkey = invkey->next)
printf ("Encryption key `%s' not used: %s <%s>\n",
nonnull (invkey->fpr),
@@ -88,6 +106,30 @@ print_result (gpgme_encrypt_result_t result)
}
+static void
+print_sign_result (gpgme_sign_result_t result)
+{
+ gpgme_invalid_key_t invkey;
+ gpgme_new_signature_t sig;
+
+ printf ("\nSigning results\n");
+ for (invkey = result->invalid_signers; invkey; invkey = invkey->next)
+ printf ("Signing key `%s' not used: %s <%s>\n",
+ nonnull (invkey->fpr),
+ gpg_strerror (invkey->reason), gpg_strsource (invkey->reason));
+
+ for (sig = result->signatures; sig; sig = sig->next)
+ {
+ printf ("Key fingerprint: %s\n", nonnull (sig->fpr));
+ printf ("Signature type : %d\n", sig->type);
+ printf ("Public key algo: %d\n", sig->pubkey_algo);
+ printf ("Hash algo .....: %d\n", sig->hash_algo);
+ printf ("Creation time .: %ld\n", sig->timestamp);
+ printf ("Sig class .....: 0x%u\n", sig->sig_class);
+ }
+}
+
+
static int
show_usage (int ex)
@@ -95,6 +137,7 @@ show_usage (int ex)
fputs ("usage: " PGM " [options] FILE\n\n"
"Options:\n"
" --verbose run in verbose mode\n"
+ " --sign sign data before encryption\n"
" --status print status lines from the backend\n"
" --progress print progress info\n"
" --openpgp use the OpenPGP protocol (default)\n"
@@ -104,9 +147,15 @@ show_usage (int ex)
" --key NAME encrypt to key NAME\n"
" --keystring NAMES encrypt to ';' delimited NAMES\n"
" --throw-keyids use this option\n"
+ " --always-trust use this option\n"
" --no-symkey-cache disable the use of that cache\n"
" --wrap assume input is valid OpenPGP message\n"
" --symmetric encrypt symmetric (OpenPGP only)\n"
+ " --archive encrypt given file or directory into an archive\n"
+ " --directory DIR switch to directory DIR before encrypting into an archive\n"
+ " --output FILE write output to FILE instead of stdout\n"
+ " --diagnostics print diagnostics\n"
+ " --cancel N cancel after N progress lines\n"
, stderr);
exit (ex);
}
@@ -120,7 +169,8 @@ main (int argc, char **argv)
gpgme_ctx_t ctx;
gpgme_protocol_t protocol = GPGME_PROTOCOL_OpenPGP;
gpgme_data_t in, out;
- gpgme_encrypt_result_t result;
+ gpgme_encrypt_result_t encrypt_result;
+ gpgme_sign_result_t sign_result;
int print_status = 0;
int print_progress = 0;
int use_loopback = 0;
@@ -128,10 +178,14 @@ main (int argc, char **argv)
gpgme_key_t keys[10+1];
int keycount = 0;
char *keystring = NULL;
+ const char *directory = NULL;
+ const char *output = NULL;
int i;
- gpgme_encrypt_flags_t flags = GPGME_ENCRYPT_ALWAYS_TRUST;
+ gpgme_encrypt_flags_t flags = 0;
gpgme_off_t offset;
int no_symkey_cache = 0;
+ int diagnostics = 0;
+ int sign = 0;
if (argc)
{ argc--; argv++; }
@@ -154,6 +208,11 @@ main (int argc, char **argv)
verbose = 1;
argc--; argv++;
}
+ else if (!strcmp (*argv, "--sign"))
+ {
+ sign = 1;
+ argc--; argv++;
+ }
else if (!strcmp (*argv, "--status"))
{
print_status = 1;
@@ -205,6 +264,11 @@ main (int argc, char **argv)
flags |= GPGME_ENCRYPT_THROW_KEYIDS;
argc--; argv++;
}
+ else if (!strcmp (*argv, "--always-trust"))
+ {
+ flags |= GPGME_ENCRYPT_ALWAYS_TRUST;
+ argc--; argv++;
+ }
else if (!strcmp (*argv, "--wrap"))
{
flags |= GPGME_ENCRYPT_WRAP;
@@ -225,6 +289,40 @@ main (int argc, char **argv)
no_symkey_cache = 1;
argc--; argv++;
}
+ else if (!strcmp (*argv, "--archive"))
+ {
+ flags |= GPGME_ENCRYPT_ARCHIVE;
+ argc--; argv++;
+ }
+ else if (!strcmp (*argv, "--directory"))
+ {
+ argc--; argv++;
+ if (!argc)
+ show_usage (1);
+ directory = *argv;
+ argc--; argv++;
+ }
+ else if (!strcmp (*argv, "--output"))
+ {
+ argc--; argv++;
+ if (!argc)
+ show_usage (1);
+ output = *argv;
+ argc--; argv++;
+ }
+ else if (!strcmp (*argv, "--diagnostics"))
+ {
+ diagnostics = 1;
+ argc--; argv++;
+ }
+ else if (!strcmp (*argv, "--cancel"))
+ {
+ argc--; argv++;
+ if (!argc)
+ show_usage (1);
+ cancel_after_progress = atoi (*argv);
+ argc--; argv++;
+ }
else if (!strncmp (*argv, "--", 2))
show_usage (1);
@@ -244,8 +342,8 @@ main (int argc, char **argv)
gpgme_set_status_cb (ctx, status_cb, NULL);
gpgme_set_ctx_flag (ctx, "full-status", "1");
}
- if (print_progress)
- gpgme_set_progress_cb (ctx, progress_cb, NULL);
+ if (print_progress || cancel_after_progress)
+ gpgme_set_progress_cb (ctx, progress_cb, ctx);
if (use_loopback)
{
gpgme_set_pinentry_mode (ctx, GPGME_PINENTRY_MODE_LOOPBACK);
@@ -269,66 +367,117 @@ main (int argc, char **argv)
}
keys[i] = NULL;
- err = gpgme_data_new_from_file (&in, *argv, 1);
- if (err)
+ if (flags & GPGME_ENCRYPT_ARCHIVE)
{
- fprintf (stderr, PGM ": error reading `%s': %s\n",
- *argv, gpg_strerror (err));
- exit (1);
- }
- offset = gpgme_data_seek (in, 0, SEEK_END);
- if (offset == (gpgme_off_t)(-1))
- {
- err = gpg_error_from_syserror ();
- fprintf (stderr, PGM ": error seeking `%s': %s\n",
- *argv, gpg_strerror (err));
- exit (1);
+ const char *path = *argv;
+ err = gpgme_data_new_from_mem (&in, path, strlen (path), 0);
+ fail_if_err (err);
+ if (directory)
+ {
+ err = gpgme_data_set_file_name (in, directory);
+ fail_if_err (err);
+ }
}
- if (gpgme_data_seek (in, 0, SEEK_SET) == (gpgme_off_t)(-1))
+ else
{
- err = gpg_error_from_syserror ();
- fprintf (stderr, PGM ": error seeking `%s': %s\n",
- *argv, gpg_strerror (err));
- exit (1);
- }
- {
- char numbuf[50];
- char *p;
-
- p = numbuf + sizeof numbuf;
- *--p = 0;
- do
- {
- *--p = '0' + (offset % 10);
- offset /= 10;
- }
- while (offset);
- err = gpgme_data_set_flag (in, "size-hint", p);
- if (err)
+ err = gpgme_data_new_from_file (&in, *argv, 1);
+ if (err)
+ {
+ fprintf (stderr, PGM ": error reading `%s': %s\n",
+ *argv, gpg_strerror (err));
+ exit (1);
+ }
+ offset = gpgme_data_seek (in, 0, SEEK_END);
+ if (offset == (gpgme_off_t)(-1))
+ {
+ err = gpg_error_from_syserror ();
+ fprintf (stderr, PGM ": error seeking `%s': %s\n",
+ *argv, gpg_strerror (err));
+ exit (1);
+ }
+ if (gpgme_data_seek (in, 0, SEEK_SET) == (gpgme_off_t)(-1))
+ {
+ err = gpg_error_from_syserror ();
+ fprintf (stderr, PGM ": error seeking `%s': %s\n",
+ *argv, gpg_strerror (err));
+ exit (1);
+ }
{
- fprintf (stderr, PGM ": error setting size-hint for `%s': %s\n",
- *argv, gpg_strerror (err));
- exit (1);
+ char numbuf[50];
+ char *p;
+
+ p = numbuf + sizeof numbuf;
+ *--p = 0;
+ do
+ {
+ *--p = '0' + (offset % 10);
+ offset /= 10;
+ }
+ while (offset);
+ err = gpgme_data_set_flag (in, "size-hint", p);
+ if (err)
+ {
+ fprintf (stderr, PGM ": error setting size-hint for `%s': %s\n",
+ *argv, gpg_strerror (err));
+ exit (1);
+ }
}
- }
+ }
err = gpgme_data_new (&out);
fail_if_err (err);
+ if (output)
+ {
+ err = gpgme_data_set_file_name (out, output);
+ fail_if_err (err);
+ }
+
+ if (sign)
+ err = gpgme_op_encrypt_sign_ext (ctx, keycount ? keys : NULL, keystring,
+ flags, in, out);
+ else
+ err = gpgme_op_encrypt_ext (ctx, keycount ? keys : NULL, keystring,
+ flags, in, out);
+
+ if (diagnostics)
+ {
+ gpgme_data_t diag;
+ gpgme_error_t diag_err;
- err = gpgme_op_encrypt_ext (ctx, keycount ? keys : NULL, keystring,
- flags, in, out);
- result = gpgme_op_encrypt_result (ctx);
- if (result)
- print_result (result);
+ gpgme_data_new (&diag);
+ diag_err = gpgme_op_getauditlog (ctx, diag, GPGME_AUDITLOG_DIAG);
+ if (diag_err)
+ {
+ fprintf (stderr, PGM ": getting diagnostics failed: %s\n",
+ gpgme_strerror (diag_err));
+ }
+ else
+ {
+ fputs ("Begin Diagnostics:\n", stdout);
+ print_data (diag);
+ fputs ("End Diagnostics.\n", stdout);
+ }
+ gpgme_data_release (diag);
+ }
+
+ sign_result = gpgme_op_sign_result (ctx);
+ if (sign_result)
+ print_sign_result (sign_result);
+ encrypt_result = gpgme_op_encrypt_result (ctx);
+ if (encrypt_result)
+ print_encrypt_result (encrypt_result);
if (err)
{
fprintf (stderr, PGM ": encrypting failed: %s\n", gpg_strerror (err));
exit (1);
}
- fputs ("Begin Output:\n", stdout);
- print_data (out);
- fputs ("End Output.\n", stdout);
+ if (!output)
+ {
+ fputs ("Begin Output:\n", stdout);
+ print_data (out);
+ fputs ("End Output.\n", stdout);
+ }
gpgme_data_release (out);
gpgme_data_release (in);