aboutsummaryrefslogtreecommitdiffstats
path: root/branches/gpgme-1-0-branch/tests/gpgsm
diff options
context:
space:
mode:
Diffstat (limited to 'branches/gpgme-1-0-branch/tests/gpgsm')
-rw-r--r--branches/gpgme-1-0-branch/tests/gpgsm/32100C27173EF6E9C4E9A25D3D69F86D37A4F93918
-rw-r--r--branches/gpgme-1-0-branch/tests/gpgsm/Makefile.am65
-rw-r--r--branches/gpgme-1-0-branch/tests/gpgsm/cert_dfn_pca01.derbin0 -> 1224 bytes
-rw-r--r--branches/gpgme-1-0-branch/tests/gpgsm/cert_dfn_pca15.derbin0 -> 1560 bytes
-rw-r--r--branches/gpgme-1-0-branch/tests/gpgsm/cert_g10code_test1.derbin0 -> 793 bytes
-rw-r--r--branches/gpgme-1-0-branch/tests/gpgsm/t-decrypt.c86
-rw-r--r--branches/gpgme-1-0-branch/tests/gpgsm/t-encrypt.c77
-rw-r--r--branches/gpgme-1-0-branch/tests/gpgsm/t-export.c85
-rw-r--r--branches/gpgme-1-0-branch/tests/gpgsm/t-genkey.c127
-rw-r--r--branches/gpgme-1-0-branch/tests/gpgsm/t-import.c174
-rw-r--r--branches/gpgme-1-0-branch/tests/gpgsm/t-keylist.c362
-rw-r--r--branches/gpgme-1-0-branch/tests/gpgsm/t-sign.c126
-rw-r--r--branches/gpgme-1-0-branch/tests/gpgsm/t-support.h99
-rw-r--r--branches/gpgme-1-0-branch/tests/gpgsm/t-verify.c151
14 files changed, 1370 insertions, 0 deletions
diff --git a/branches/gpgme-1-0-branch/tests/gpgsm/32100C27173EF6E9C4E9A25D3D69F86D37A4F939 b/branches/gpgme-1-0-branch/tests/gpgsm/32100C27173EF6E9C4E9A25D3D69F86D37A4F939
new file mode 100644
index 00000000..cf0535ff
--- /dev/null
+++ b/branches/gpgme-1-0-branch/tests/gpgsm/32100C27173EF6E9C4E9A25D3D69F86D37A4F939
@@ -0,0 +1,18 @@
+(private-key
+ (oid.1.2.840.113549.1.1.1
+ (n #00e0ce96f90b6c9e02f3922beada93fe50a875eac6bcc18bb9a9cf2e84965caa2d1ff95a7f542465c6c0c19d276e4526ce048868a7a914fd343cc3a87dd74291ffc565506d5bbb25cbac6a0e2dd1f8bcaab0d4a29c2f37c950f363484bf269f7891440464baf79827e03a36e70b814938eebdc63e964247be75dc58b014b7ea251#)
+ (e #010001#)
+ (d #046129F2489D71579BE0A75FE029BD6CDB574EBF57EA8A5B0FDA942CAB943B117D7BB95E5D28875E0F9FC5FCC06A72F6D502464DABDED78EF6B716177B83D5BDC543DC5D3FED932E59F5897E92E6F58A0F33424106A3B6FA2CBF877510E4AC21C3EE47851E97D12996222AC3566D4CCB0B83D164074ABF7DE655FC2446DA1781#)
+ (p #00e861b700e17e8afe6837e7512e35b6ca11d0ae47d8b85161c67baf64377213fe52d772f2035b3ca830af41d8a4120e1c1c70d12cc22f00d28d31dd48a8d424f1#)
+ (q #00f7a7ca5367c661f8e62df34f0d05c10c88e5492348dd7bddc942c9a8f369f935a07785d2db805215ed786e4285df1658eed3ce84f469b81b50d358407b4ad361#)
+ (u #304559a9ead56d2309d203811a641bb1a09626bc8eb36fffa23c968ec5bd891eebbafc73ae666e01ba7c8990bae06cc2bbe10b75e69fcacb353a6473079d8e9b#)
+ )
+)
+
+
+
+
+
+
+
+
diff --git a/branches/gpgme-1-0-branch/tests/gpgsm/Makefile.am b/branches/gpgme-1-0-branch/tests/gpgsm/Makefile.am
new file mode 100644
index 00000000..ba2e8d5a
--- /dev/null
+++ b/branches/gpgme-1-0-branch/tests/gpgsm/Makefile.am
@@ -0,0 +1,65 @@
+# Copyright (C) 2000 Werner Koch (dd9jn)
+# Copyright (C) 2001 g10 Code GmbH
+#
+# This file is part of GPGME.
+#
+# GPGME is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GPGME is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+
+## Process this file with automake to produce Makefile.in
+
+GPGSM = @GPGSM@
+
+TESTS_ENVIRONMENT = GNUPGHOME=. GPG_AGENT_INFO=
+
+noinst_HEADERS = t-support.h
+TESTS = t-import t-keylist t-encrypt t-verify t-decrypt t-sign t-export
+
+EXTRA_DIST = cert_dfn_pca01.der cert_dfn_pca15.der cert_g10code_test1.der \
+ $(key_id)
+
+INCLUDES = -I$(top_srcdir)/gpgme
+
+AM_CPPFLAGS = @GPG_ERROR_CFLAGS@
+LDADD = ../../gpgme/libgpgme.la
+
+# We don't run t-genkey in the test suite, because it takes too long
+# and needs a working pinentry.
+noinst_PROGRAMS = $(TESTS) t-genkey
+
+key_id := 32100C27173EF6E9C4E9A25D3D69F86D37A4F939
+
+DISTCLEANFILES = pubring.kbx pubring.kbx~ gpgsm.conf trustlist.txt \
+ private-keys-v1.d/$(key_id).key random_seed
+
+
+all-local: ./pubring.kbx ./gpgsm.conf ./private-keys-v1.d/$(key_id).key ./trustlist.txt
+
+./pubring.kbx: $(srcdir)/cert_g10code_test1.der
+ $(GPGSM) --homedir . --import $(srcdir)/cert_g10code_test1.der
+
+./gpgsm.conf:
+ echo disable-crl-checks > ./gpgsm.conf
+ echo faked-system-time 1008241200 >> ./gpgsm.conf
+
+./private-keys-v1.d/$(key_id).key: $(srcdir)/$(key_id)
+ test -d ./private-keys-v1.d || mkdir ./private-keys-v1.d
+ cp $(srcdir)/$(key_id) private-keys-v1.d/$(key_id).key
+
+./trustlist.txt:
+ echo $(key_id) > ./trustlist.txt
+ echo >> ./trustlist.txt
+ echo "# CN=test cert 1,OU=Aegypten Project,O=g10 Code GmbH,L=Düsseldorf,C=DE" >> ./trustlist.txt
+ echo "3CF405464F66ED4A7DF45BBDD1E4282E33BDB76E S" >> ./trustlist.txt
+
diff --git a/branches/gpgme-1-0-branch/tests/gpgsm/cert_dfn_pca01.der b/branches/gpgme-1-0-branch/tests/gpgsm/cert_dfn_pca01.der
new file mode 100644
index 00000000..f8b61d33
--- /dev/null
+++ b/branches/gpgme-1-0-branch/tests/gpgsm/cert_dfn_pca01.der
Binary files differ
diff --git a/branches/gpgme-1-0-branch/tests/gpgsm/cert_dfn_pca15.der b/branches/gpgme-1-0-branch/tests/gpgsm/cert_dfn_pca15.der
new file mode 100644
index 00000000..8d966506
--- /dev/null
+++ b/branches/gpgme-1-0-branch/tests/gpgsm/cert_dfn_pca15.der
Binary files differ
diff --git a/branches/gpgme-1-0-branch/tests/gpgsm/cert_g10code_test1.der b/branches/gpgme-1-0-branch/tests/gpgsm/cert_g10code_test1.der
new file mode 100644
index 00000000..a2199d27
--- /dev/null
+++ b/branches/gpgme-1-0-branch/tests/gpgsm/cert_g10code_test1.der
Binary files differ
diff --git a/branches/gpgme-1-0-branch/tests/gpgsm/t-decrypt.c b/branches/gpgme-1-0-branch/tests/gpgsm/t-decrypt.c
new file mode 100644
index 00000000..db507f0f
--- /dev/null
+++ b/branches/gpgme-1-0-branch/tests/gpgsm/t-decrypt.c
@@ -0,0 +1,86 @@
+/* t-encrypt.c - Regression test.
+ Copyright (C) 2000 Werner Koch (dd9jn)
+ Copyright (C) 2001, 2003 g10 Code GmbH
+
+ This file is part of GPGME.
+
+ GPGME is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ GPGME is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GPGME; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+
+/* We need to include config.h so that we know whether we are building
+ with large file system (LFS) support. */
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+
+#include <gpgme.h>
+#include "t-support.h"
+
+
+static const char test_text1[] = "Hallo Leute!\n";
+static const char test_cip1[] =
+"-----BEGIN CMS OBJECT-----\n"
+"MIAGCSqGSIb3DQEHA6CAMIACAQAxggEJMIIBBQIBADBwMGsxCzAJBgNVBAYTAkRF\n"
+"MRMwEQYDVQQHFApE/HNzZWxkb3JmMRYwFAYDVQQKEw1nMTAgQ29kZSBHbWJIMRkw\n"
+"FwYDVQQLExBBZWd5cHRlbiBQcm9qZWN0MRQwEgYDVQQDEwt0ZXN0IGNlcnQgMQIB\n"
+"ADALBgkqhkiG9w0BAQEEgYBOFcOfUtAav+XjKGM1RJtF+8JLkbnu46S3T3709Iok\n"
+"u+Z9dwpOyfHwxXOmjzkSKQSBBxxi6ar+sKjU/KfPIvaMpARwT+NfIVSCZRWIJ27z\n"
+"wbSrav/kcRRDDA0wXV7dHVmSLPUJNCpiFMNZbkYtI+ai15g0PVeDw+szYd9zdsjJ\n"
+"2zCABgkqhkiG9w0BBwEwFAYIKoZIhvcNAwcECA8gPQY2NtJToIAECAeoY3MIcz9h\n"
+"BAiiytWtOSmqnwAA\n"
+"-----END CMS OBJECT-----\n";
+
+
+int
+main (int argc, char *argv[])
+{
+ gpgme_ctx_t ctx;
+ gpgme_error_t err;
+ gpgme_data_t in, out;
+ gpgme_decrypt_result_t result;
+
+ init_gpgme (GPGME_PROTOCOL_CMS);
+
+ err = gpgme_new (&ctx);
+ fail_if_err (err);
+ gpgme_set_protocol (ctx, GPGME_PROTOCOL_CMS);
+
+ err = gpgme_data_new_from_mem (&in, test_cip1, strlen (test_cip1), 0);
+ fail_if_err (err);
+
+ err = gpgme_data_new (&out);
+ fail_if_err (err);
+
+ err = gpgme_op_decrypt (ctx, in, out);
+ fail_if_err (err);
+ result = gpgme_op_decrypt_result (ctx);
+ if (result->unsupported_algorithm)
+ {
+ fprintf (stderr, "%s:%i: unsupported algorithm: %s\n",
+ __FILE__, __LINE__, result->unsupported_algorithm);
+ exit (1);
+ }
+ print_data (out);
+
+ gpgme_data_release (in);
+ gpgme_data_release (out);
+ gpgme_release (ctx);
+ return 0;
+}
diff --git a/branches/gpgme-1-0-branch/tests/gpgsm/t-encrypt.c b/branches/gpgme-1-0-branch/tests/gpgsm/t-encrypt.c
new file mode 100644
index 00000000..a5c2dc1b
--- /dev/null
+++ b/branches/gpgme-1-0-branch/tests/gpgsm/t-encrypt.c
@@ -0,0 +1,77 @@
+/* t-encrypt.c - Regression test.
+ Copyright (C) 2000 Werner Koch (dd9jn)
+ Copyright (C) 2001, 2002, 2003 g10 Code GmbH
+
+ This file is part of GPGME.
+
+ GPGME is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ GPGME is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GPGME; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+/* We need to include config.h so that we know whether we are building
+ with large file system (LFS) support. */
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include <gpgme.h>
+
+#include "t-support.h"
+
+int
+main (int argc, char **argv)
+{
+ gpgme_ctx_t ctx;
+ gpgme_error_t err;
+ gpgme_data_t in, out;
+ gpgme_key_t key[] = { NULL, NULL };
+ gpgme_encrypt_result_t result;
+
+ init_gpgme (GPGME_PROTOCOL_CMS);
+
+ err = gpgme_new (&ctx);
+ fail_if_err (err);
+ gpgme_set_protocol (ctx, GPGME_PROTOCOL_CMS);
+ gpgme_set_armor (ctx, 1);
+
+ err = gpgme_data_new_from_mem (&in, "Hallo Leute\n", 12, 0);
+ fail_if_err (err);
+
+ err = gpgme_data_new (&out);
+ fail_if_err (err);
+
+ err = gpgme_get_key (ctx, "3CF405464F66ED4A7DF45BBDD1E4282E33BDB76E",
+ &key[0], 0);
+ fail_if_err (err);
+
+ err = gpgme_op_encrypt (ctx, key, 0, in, out);
+ fail_if_err (err);
+ result = gpgme_op_encrypt_result (ctx);
+ if (result->invalid_recipients)
+ {
+ fprintf (stderr, "Invalid recipient encountered: %s\n",
+ result->invalid_recipients->fpr);
+ exit (1);
+ }
+ print_data (out);
+
+ gpgme_key_unref (key[0]);
+ gpgme_data_release (in);
+ gpgme_data_release (out);
+ gpgme_release (ctx);
+ return 0;
+}
diff --git a/branches/gpgme-1-0-branch/tests/gpgsm/t-export.c b/branches/gpgme-1-0-branch/tests/gpgsm/t-export.c
new file mode 100644
index 00000000..9139f8c6
--- /dev/null
+++ b/branches/gpgme-1-0-branch/tests/gpgsm/t-export.c
@@ -0,0 +1,85 @@
+/* t-export.c - Regression test.
+ Copyright (C) 2000 Werner Koch (dd9jn)
+ Copyright (C) 2001, 2003 g10 Code GmbH
+
+ This file is part of GPGME.
+
+ GPGME is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ GPGME is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GPGME; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+/* We need to include config.h so that we know whether we are building
+ with large file system (LFS) support. */
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+#include <gpgme.h>
+#include "t-support.h"
+
+
+int
+main (int argc, char *argv[])
+{
+ gpgme_ctx_t ctx;
+ gpgme_error_t err;
+ gpgme_data_t out;
+ const char *pattern1[] = { "DFN Top Level Certification Authority", NULL };
+ const char *pattern2[] = { "3CF405464F66ED4A7DF45BBDD1E4282E33BDB76E",
+ "DFN Server Certification Authority",
+ NULL };
+
+ init_gpgme (GPGME_PROTOCOL_CMS);
+
+ err = gpgme_new (&ctx);
+ fail_if_err (err);
+ gpgme_set_protocol (ctx, GPGME_PROTOCOL_CMS);
+
+ gpgme_set_armor (ctx, 1);
+
+ /* Check exporting of one certificate. */
+ err = gpgme_data_new (&out);
+ fail_if_err (err);
+ err = gpgme_op_export_ext (ctx, pattern1, 0, out);
+ fail_if_err (err);
+
+ fflush (NULL);
+ fputs ("Begin Result:\n", stdout);
+ print_data (out);
+ fputs ("End Result.\n", stdout);
+
+ gpgme_data_release (out);
+
+ /* Check exporting of 2 certificates. */
+ err = gpgme_data_new (&out);
+ fail_if_err (err);
+ err = gpgme_op_export_ext (ctx, pattern2, 0, out);
+ fail_if_err (err);
+
+ fflush (NULL);
+ fputs ("Begin Result:\n", stdout);
+ print_data (out);
+ fputs ("End Result.\n", stdout);
+
+ gpgme_data_release (out);
+
+
+ gpgme_release (ctx);
+
+ return 0;
+}
diff --git a/branches/gpgme-1-0-branch/tests/gpgsm/t-genkey.c b/branches/gpgme-1-0-branch/tests/gpgsm/t-genkey.c
new file mode 100644
index 00000000..0c67597c
--- /dev/null
+++ b/branches/gpgme-1-0-branch/tests/gpgsm/t-genkey.c
@@ -0,0 +1,127 @@
+/* t-genkey.c - regression test
+ Copyright (C) 2000 Werner Koch (dd9jn)
+ Copyright (C) 2001, 2003 g10 Code GmbH
+
+ This file is part of GPGME.
+
+ GPGME is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ GPGME is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GPGME; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+/* We need to include config.h so that we know whether we are building
+ with large file system (LFS) support. */
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+
+#include <gpgme.h>
+#include "t-support.h"
+
+
+/* True if progress function printed something on the screen. */
+static int progress_called;
+
+static void
+progress (void *self, const char *what, int type, int current, int total)
+{
+ if (!strcmp (what, "primegen") && !current && !total
+ && (type == '.' || type == '+' || type == '!'
+ || type == '^' || type == '<' || type == '>'))
+ {
+ printf ("%c", type);
+ fflush (stdout);
+ progress_called = 1;
+ }
+ else
+ {
+ fprintf (stderr, "unknown progress `%s' %d %d %d\n", what, type,
+ current, total);
+ exit (1);
+ }
+}
+
+
+int
+main (int argc, char *argv[])
+{
+ gpgme_ctx_t ctx;
+ gpgme_error_t err;
+ const char *parms = "<GnupgKeyParms format=\"internal\">\n"
+ "Key-Type: RSA\n"
+ "Key-Length: 1024\n"
+ "Name-DN: C=de,O=g10 code,OU=Testlab,CN=Joe 2 Tester\n"
+ "Name-Email: [email protected]\n"
+ "</GnupgKeyParms>\n";
+ gpgme_genkey_result_t result;
+ gpgme_data_t certreq;
+
+ init_gpgme (GPGME_PROTOCOL_CMS);
+
+ err = gpgme_data_new (&certreq);
+ fail_if_err (err);
+
+ err = gpgme_new (&ctx);
+ fail_if_err (err);
+
+ gpgme_set_protocol (ctx, GPGME_PROTOCOL_CMS);
+ gpgme_set_armor (ctx, 1);
+
+ gpgme_set_progress_cb (ctx, progress, NULL);
+
+ err = gpgme_op_genkey (ctx, parms, certreq, NULL);
+ fail_if_err (err);
+
+ result = gpgme_op_genkey_result (ctx);
+ if (!result)
+ {
+ fprintf (stderr, "%s:%d: gpgme_op_genkey_result returns NULL\n",
+ __FILE__, __LINE__);
+ exit (1);
+ }
+ if (progress_called)
+ printf ("\n");
+
+ printf ("Generated key: %s (%s)\n", result->fpr ? result->fpr : "none",
+ result->primary ? (result->sub ? "primary, sub" : "primary")
+ : (result->sub ? "sub" : "none"));
+
+ if (result->fpr)
+ {
+ fprintf (stderr, "%s:%d: generated key has (unexpectdly) a fingerprint\n",
+ __FILE__, __LINE__);
+ exit (1);
+ }
+ if (!result->primary)
+ {
+ fprintf (stderr, "%s:%d: primary key was not generated\n",
+ __FILE__, __LINE__);
+ exit (1);
+ }
+ if (result->sub)
+ {
+ fprintf (stderr, "%s:%d: sub key was (unexpectedly) generated\n",
+ __FILE__, __LINE__);
+ exit (1);
+ }
+ gpgme_release (ctx);
+
+ print_data (certreq);
+ gpgme_data_release (certreq);
+
+ return 0;
+}
diff --git a/branches/gpgme-1-0-branch/tests/gpgsm/t-import.c b/branches/gpgme-1-0-branch/tests/gpgsm/t-import.c
new file mode 100644
index 00000000..50737bba
--- /dev/null
+++ b/branches/gpgme-1-0-branch/tests/gpgsm/t-import.c
@@ -0,0 +1,174 @@
+/* t-import.c - Regression test.
+ Copyright (C) 2000 Werner Koch (dd9jn)
+ Copyright (C) 2001, 2003 g10 Code GmbH
+
+ This file is part of GPGME.
+
+ GPGME is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ GPGME is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GPGME; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+/* We need to include config.h so that we know whether we are building
+ with large file system (LFS) support. */
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+
+#include <gpgme.h>
+
+#include "t-support.h"
+
+
+void
+check_result (gpgme_import_result_t result, char *fpr, int total,
+ int total_stat)
+{
+ if (result->considered != total)
+ {
+ fprintf (stderr, "Unexpected number of considered keys %i\n",
+ result->considered);
+ exit (1);
+ }
+ if (result->no_user_id != 0)
+ {
+ fprintf (stderr, "Unexpected number of user ids %i\n",
+ result->no_user_id);
+ exit (1);
+ }
+ if (result->imported != 0 && result->imported != 1)
+ {
+ fprintf (stderr, "Unexpected number of imported keys %i\n",
+ result->imported);
+ exit (1);
+ }
+ if (result->imported_rsa != 0)
+ {
+ fprintf (stderr, "Unexpected number of imported RSA keys %i\n",
+ result->imported_rsa);
+ exit (1);
+ }
+ if ((result->imported == 0 && result->unchanged != total)
+ || (result->imported == 1 && result->unchanged != total - 1))
+ {
+ fprintf (stderr, "Unexpected number of unchanged keys %i\n",
+ result->unchanged);
+ exit (1);
+ }
+ if (result->new_user_ids != 0)
+ {
+ fprintf (stderr, "Unexpected number of new user IDs %i\n",
+ result->new_user_ids);
+ exit (1);
+ }
+ if (result->new_sub_keys != 0)
+ {
+ fprintf (stderr, "Unexpected number of new sub keys %i\n",
+ result->new_sub_keys);
+ exit (1);
+ }
+ if (result->new_signatures != 0)
+ {
+ fprintf (stderr, "Unexpected number of new signatures %i\n",
+ result->new_signatures);
+ exit (1);
+ }
+ if (result->new_revocations != 0)
+ {
+ fprintf (stderr, "Unexpected number of new revocations %i\n",
+ result->new_revocations);
+ exit (1);
+ }
+ if (result->secret_read != 0)
+ {
+ fprintf (stderr, "Unexpected number of secret keys read %i\n",
+ result->secret_read);
+ exit (1);
+ }
+ if (result->secret_imported != 0)
+ {
+ fprintf (stderr, "Unexpected number of secret keys imported %i\n",
+ result->secret_imported);
+ exit (1);
+ }
+ if (result->secret_unchanged != 0)
+ {
+ fprintf (stderr, "Unexpected number of secret keys unchanged %i\n",
+ result->secret_unchanged);
+ exit (1);
+ }
+ if (result->not_imported != 0)
+ {
+ fprintf (stderr, "Unexpected number of secret keys not imported %i\n",
+ result->not_imported);
+ exit (1);
+ }
+
+ {
+ int n;
+ gpgme_import_status_t r;
+
+ for (n=0, r=result->imports; r; r=r->next)
+ n++;
+
+ if (n != total_stat)
+ {
+ fprintf (stderr, "Unexpected number of status reports\n");
+ exit (1);
+ }
+ }
+}
+
+
+int
+main (int argc, char **argv)
+{
+ gpgme_ctx_t ctx;
+ gpgme_error_t err;
+ gpgme_data_t in;
+ gpgme_import_result_t result;
+ const char *cert_1 = make_filename ("cert_dfn_pca01.der");
+ const char *cert_2 = make_filename ("cert_dfn_pca15.der");
+
+ init_gpgme (GPGME_PROTOCOL_CMS);
+
+ err = gpgme_new (&ctx);
+ fail_if_err (err);
+
+ gpgme_set_protocol (ctx, GPGME_PROTOCOL_CMS);
+
+ err = gpgme_data_new_from_file (&in, cert_1, 1);
+ fail_if_err (err);
+
+ err = gpgme_op_import (ctx, in);
+ fail_if_err (err);
+ result = gpgme_op_import_result (ctx);
+ check_result (result, "DFA56FB5FC41E3A8921F77AD1622EEFD9152A5AD", 1, 1);
+ gpgme_data_release (in);
+
+ err = gpgme_data_new_from_file (&in, cert_2, 1);
+ fail_if_err (err);
+
+ err = gpgme_op_import (ctx, in);
+ fail_if_err (err);
+ result = gpgme_op_import_result (ctx);
+ check_result (result, "2C8F3C356AB761CB3674835B792CDA52937F9285", 1, 2);
+ gpgme_data_release (in);
+
+ gpgme_release (ctx);
+ return 0;
+}
diff --git a/branches/gpgme-1-0-branch/tests/gpgsm/t-keylist.c b/branches/gpgme-1-0-branch/tests/gpgsm/t-keylist.c
new file mode 100644
index 00000000..be4e7cc6
--- /dev/null
+++ b/branches/gpgme-1-0-branch/tests/gpgsm/t-keylist.c
@@ -0,0 +1,362 @@
+/* t-keylist.c - regression test
+ Copyright (C) 2000 Werner Koch (dd9jn)
+ Copyright (C) 2001, 2003 g10 Code GmbH
+
+ This file is part of GPGME.
+
+ GPGME is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ GPGME is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GPGME; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+/* We need to include config.h so that we know whether we are building
+ with large file system (LFS) support. */
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include <gpgme.h>
+
+#include "t-support.h"
+
+
+struct
+{
+ char *fpr;
+ int secret;
+ long timestamp;
+ long expires;
+ char *issuer_serial;
+ char *issuer_name;
+ char *chain_id;
+ char *uid;
+ gpgme_validity_t validity;
+ unsigned int key_length;
+}
+keys[] =
+ {
+ { "3CF405464F66ED4A7DF45BBDD1E4282E33BDB76E", 1, 1007372198, 1038908198, "00",
+ "CN=test cert 1,OU=Aegypten Project,O=g10 Code GmbH,L=D\xc3\xbcsseldorf,C=DE",
+ "3CF405464F66ED4A7DF45BBDD1E4282E33BDB76E",
+ "CN=test cert 1,OU=Aegypten Project,O=g10 Code GmbH,L=D\xc3\xbcsseldorf,C=DE",
+ GPGME_VALIDITY_ULTIMATE, 1024
+ },
+ { "DFA56FB5FC41E3A8921F77AD1622EEFD9152A5AD", 0, 909684190, 1009821790, "01",
+ "1.2.840.113549.1.9.1=#63657274696679407063612E64666E2E6465,"
+ "CN=DFN Top Level Certification Authority,OU=DFN-PCA,"
+ "O=Deutsches Forschungsnetz,C=DE",
+ "DFA56FB5FC41E3A8921F77AD1622EEFD9152A5AD",
+ "1.2.840.113549.1.9.1=#63657274696679407063612E64666E2E6465,"
+ "CN=DFN Top Level Certification Authority,OU=DFN-PCA,"
+ "O=Deutsches Forschungsnetz,C=DE",
+ GPGME_VALIDITY_NEVER, 2048
+ },
+ { "2C8F3C356AB761CB3674835B792CDA52937F9285", 0, 973183644, 1009735200, "15",
+ "1.2.840.113549.1.9.1=#63657274696679407063612E64666E2E6465,"
+ "CN=DFN Top Level Certification Authority,OU=DFN-PCA,"
+ "O=Deutsches Forschungsnetz,C=DE",
+ "DFA56FB5FC41E3A8921F77AD1622EEFD9152A5AD",
+ "1.2.840.113549.1.9.1=#63657274696679407063612E64666E2E6465,"
+ "CN=DFN Server Certification Authority,OU=DFN-PCA,"
+ "O=Deutsches Forschungsnetz,C=DE",
+ GPGME_VALIDITY_UNKNOWN, 2048
+ },
+ { NULL }
+ };
+
+
+int
+main (int argc, char **argv)
+{
+ gpgme_error_t err;
+ gpgme_ctx_t ctx;
+ gpgme_key_t key;
+ gpgme_keylist_result_t result;
+ int i = 0;
+
+ init_gpgme (GPGME_PROTOCOL_CMS);
+
+ err = gpgme_new (&ctx);
+ fail_if_err (err);
+ gpgme_set_protocol (ctx, GPGME_PROTOCOL_CMS);
+
+ err = gpgme_op_keylist_start (ctx, NULL, 0);
+ fail_if_err (err);
+
+ while (!(err = gpgme_op_keylist_next (ctx, &key)))
+ {
+ if (!keys[i].fpr)
+ {
+ fprintf (stderr, "More keys returned than expected\n");
+ exit (1);
+ }
+
+ /* Global key flags. */
+ if (key->revoked)
+ {
+ fprintf (stderr, "Key unexpectedly revoked\n");
+ exit (1);
+ }
+ if (key->expired)
+ {
+ fprintf (stderr, "Key unexpectedly expired\n");
+ exit (1);
+ }
+ if (key->disabled)
+ {
+ fprintf (stderr, "Key unexpectedly disabled\n");
+ exit (1);
+ }
+ if (key->invalid)
+ {
+ fprintf (stderr, "Key unexpectedly invalid\n");
+ exit (1);
+ }
+ if (key->can_encrypt != keys[i].secret)
+ {
+ fprintf (stderr, "Key unexpectedly%s usable for encryption\n",
+ key->can_encrypt ? "" : " not");
+ exit (1);
+ }
+ if (key->can_sign != keys[i].secret)
+ {
+ fprintf (stderr, "Key unexpectedly%s usable for signing\n",
+ key->can_sign ? "" : " not");
+ exit (1);
+ }
+ if (!key->can_certify)
+ {
+ fprintf (stderr, "Key unexpectedly unusable for certifications\n");
+ exit (1);
+ }
+ if (key->secret != keys[i].secret)
+ {
+ fprintf (stderr, "Key unexpectedly%s secret\n",
+ key->secret ? "" : " not");
+ exit (1);
+ }
+ if (key->protocol != GPGME_PROTOCOL_CMS)
+ {
+ fprintf (stderr, "Key has unexpected protocol: %s\n",
+ gpgme_get_protocol_name (key->protocol));
+ exit (1);
+ }
+ if (!key->issuer_serial)
+ {
+ fprintf (stderr, "Key unexpectedly misses issuer serial\n");
+ exit (1);
+ }
+ if (strcmp (key->issuer_serial, keys[i].issuer_serial))
+ {
+ fprintf (stderr, "Key has unexpected issuer serial: %s\n",
+ key->issuer_serial);
+ exit (1);
+ }
+ if (!key->issuer_name)
+ {
+ fprintf (stderr, "Key unexpectedly misses issuer name\n");
+ exit (1);
+ }
+ if (strcmp (key->issuer_name, keys[i].issuer_name))
+ {
+ fprintf (stderr, "Key has unexpected issuer name: %s\n",
+ key->issuer_name);
+ exit (1);
+ }
+ if (key->chain_id && !keys[i].chain_id)
+ {
+ fprintf (stderr, "Key unexpectedly carries chain ID: %s\n",
+ key->chain_id);
+ exit (1);
+ }
+ if (!key->chain_id && keys[i].chain_id)
+ {
+ fprintf (stderr, "Key unexpectedly carries no chain ID\n");
+ exit (1);
+ }
+ if (key->chain_id && strcmp (key->chain_id, keys[i].chain_id))
+ {
+ fprintf (stderr, "Key carries unexpected chain ID: %s\n",
+ key->chain_id);
+ exit (1);
+ }
+ if (key->owner_trust != GPGME_VALIDITY_UNKNOWN)
+ {
+ fprintf (stderr, "Key has unexpected owner trust: %i\n",
+ key->owner_trust);
+ exit (1);
+ }
+ if (!key->subkeys || key->subkeys->next)
+ {
+ fprintf (stderr, "Key has unexpected number of subkeys\n");
+ exit (1);
+ }
+
+ /* Primary key. */
+ if (key->subkeys->revoked)
+ {
+ fprintf (stderr, "Primary key unexpectedly revoked\n");
+ exit (1);
+ }
+ if (key->subkeys->expired)
+ {
+ fprintf (stderr, "Primary key unexpectedly expired\n");
+ exit (1);
+ }
+ if (key->subkeys->disabled)
+ {
+ fprintf (stderr, "Primary key unexpectedly disabled\n");
+ exit (1);
+ }
+ if (key->subkeys->invalid)
+ {
+ fprintf (stderr, "Primary key unexpectedly invalid\n");
+ exit (1);
+ }
+ if (key->subkeys->can_encrypt != keys[i].secret)
+ {
+ fprintf (stderr, "Key unexpectedly%s usable for encryption\n",
+ key->subkeys->can_encrypt ? "" : " not");
+ exit (1);
+ }
+ if (key->subkeys->can_sign != keys[i].secret)
+ {
+ fprintf (stderr, "Key unexpectedly%s usable for signing\n",
+ key->subkeys->can_sign ? "" : " not");
+ exit (1);
+ }
+ if (!key->subkeys->can_certify)
+ {
+ fprintf (stderr, "Primary key unexpectedly unusable for certifications\n");
+ exit (1);
+ }
+ if (key->subkeys->secret)
+ {
+ fprintf (stderr, "Primary key unexpectedly secret\n");
+ exit (1);
+ }
+ if (key->subkeys->pubkey_algo != GPGME_PK_RSA)
+ {
+ fprintf (stderr, "Primary key has unexpected public key algo: %s\n",
+ gpgme_pubkey_algo_name (key->subkeys->pubkey_algo));
+ exit (1);
+ }
+ if (key->subkeys->length != keys[i].key_length)
+ {
+ fprintf (stderr, "Primary key has unexpected length: %i\n",
+ key->subkeys->length);
+ exit (1);
+ }
+ if (strcmp (key->subkeys->keyid, &keys[i].fpr[40 - 16]))
+ {
+ fprintf (stderr, "Primary key has unexpected key ID: %s\n",
+ key->subkeys->keyid);
+ exit (1);
+ }
+ if (strcmp (key->subkeys->fpr, keys[i].fpr))
+ {
+ fprintf (stderr, "Primary key has unexpected fingerprint: %s\n",
+ key->subkeys->fpr);
+ exit (1);
+ }
+ if (key->subkeys->timestamp != keys[i].timestamp)
+ {
+ fprintf (stderr, "Primary key unexpected timestamp: %lu\n",
+ key->subkeys->timestamp);
+ exit (1);
+ }
+ if (key->subkeys->expires != keys[i].expires)
+ {
+ fprintf (stderr, "Primary key unexpectedly expires: %lu\n",
+ key->subkeys->expires);
+ exit (1);
+ }
+
+ if (!key->uids || key->uids->next)
+ {
+ fprintf (stderr, "Key has unexpected number of user IDs\n");
+ exit (1);
+ }
+ if (key->uids->revoked)
+ {
+ fprintf (stderr, "User ID unexpectedly revoked\n");
+ exit (1);
+ }
+ if (key->uids->invalid)
+ {
+ fprintf (stderr, "User ID unexpectedly invalid\n");
+ exit (1);
+ }
+ if (key->uids->validity != keys[i].validity)
+ {
+ fprintf (stderr, "User ID unexpectedly validity: %i\n",
+ key->uids->validity);
+ exit (1);
+ }
+ if (key->uids->signatures)
+ {
+ fprintf (stderr, "User ID unexpectedly signed\n");
+ exit (1);
+ }
+ if (!key->uids->name || key->uids->name[0])
+ {
+ fprintf (stderr, "Unexpected name in user ID: %s\n",
+ key->uids->name);
+ exit (1);
+ }
+ if (!key->uids->comment || key->uids->comment[0])
+ {
+ fprintf (stderr, "Unexpected comment in user ID: %s\n",
+ key->uids->comment);
+ exit (1);
+ }
+ if (!key->uids->email || key->uids->email[0])
+ {
+ fprintf (stderr, "Unexpected email in user ID: %s\n",
+ key->uids->email);
+ exit (1);
+ }
+ if (!key->uids->uid || strcmp (key->uids->uid, keys[i].uid))
+ {
+ fprintf (stderr, "Unexpected uid in user ID: %s\n",
+ key->uids->uid);
+ exit (1);
+ }
+
+ gpgme_key_unref (key);
+ i++;
+ }
+ if (gpg_err_code (err) != GPG_ERR_EOF)
+ fail_if_err (err);
+ err = gpgme_op_keylist_end (ctx);
+ fail_if_err (err);
+
+ result = gpgme_op_keylist_result (ctx);
+ if (result->truncated)
+ {
+ fprintf (stderr, "Key listing unexpectedly truncated\n");
+ exit (1);
+ }
+
+ if (keys[i].fpr)
+ {
+ fprintf (stderr, "Less keys returned than expected\n");
+ exit (1);
+ }
+
+ gpgme_release (ctx);
+ return 0;
+}
diff --git a/branches/gpgme-1-0-branch/tests/gpgsm/t-sign.c b/branches/gpgme-1-0-branch/tests/gpgsm/t-sign.c
new file mode 100644
index 00000000..406c72f4
--- /dev/null
+++ b/branches/gpgme-1-0-branch/tests/gpgsm/t-sign.c
@@ -0,0 +1,126 @@
+/* t-sign.c - Regression test.
+ Copyright (C) 2000 Werner Koch (dd9jn)
+ Copyright (C) 2001, 2003 g10 Code GmbH
+
+ This file is part of GPGME.
+
+ GPGME is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ GPGME is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GPGME; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+/* We need to include config.h so that we know whether we are building
+ with large file system (LFS) support. */
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include <gpgme.h>
+#include "t-support.h"
+
+
+static void
+check_result (gpgme_sign_result_t result, gpgme_sig_mode_t type)
+{
+ if (result->invalid_signers)
+ {
+ fprintf (stderr, "Invalid signer found: %s\n",
+ result->invalid_signers->fpr);
+ exit (1);
+ }
+ if (!result->signatures || result->signatures->next)
+ {
+ fprintf (stderr, "Unexpected number of signatures created\n");
+ exit (1);
+ }
+ if (result->signatures->type != type)
+ {
+ fprintf (stderr, "Wrong type of signature created\n");
+ exit (1);
+ }
+ if (result->signatures->pubkey_algo != GPGME_PK_RSA)
+ {
+ fprintf (stderr, "Wrong pubkey algorithm reported: %i\n",
+ result->signatures->pubkey_algo);
+ exit (1);
+ }
+ if (result->signatures->hash_algo != GPGME_MD_SHA1)
+ {
+ fprintf (stderr, "Wrong hash algorithm reported: %i\n",
+ result->signatures->hash_algo);
+ exit (1);
+ }
+ if (result->signatures->sig_class != 0)
+ {
+ fprintf (stderr, "Wrong signature class reported: %u\n",
+ result->signatures->sig_class);
+ exit (1);
+ }
+ if (strcmp ("3CF405464F66ED4A7DF45BBDD1E4282E33BDB76E",
+ result->signatures->fpr))
+ {
+ fprintf (stderr, "Wrong fingerprint reported: %s\n",
+ result->signatures->fpr);
+ exit (1);
+ }
+}
+
+
+int
+main (int argc, char *argv[])
+{
+ gpgme_ctx_t ctx;
+ gpgme_error_t err;
+ gpgme_data_t in, out;
+ gpgme_sign_result_t result;
+
+ init_gpgme (GPGME_PROTOCOL_CMS);
+
+ err = gpgme_new (&ctx);
+ fail_if_err (err);
+
+ gpgme_set_protocol (ctx, GPGME_PROTOCOL_CMS);
+ gpgme_set_textmode (ctx, 1);
+ gpgme_set_armor (ctx, 1);
+
+ err = gpgme_data_new_from_mem (&in, "Hallo Leute!\n", 13, 0);
+ fail_if_err (err);
+
+ /* First a normal signature. */
+ err = gpgme_data_new (&out);
+ fail_if_err (err);
+ err = gpgme_op_sign (ctx, in, out, GPGME_SIG_MODE_NORMAL);
+ fail_if_err (err);
+ result = gpgme_op_sign_result (ctx);
+ check_result (result, GPGME_SIG_MODE_NORMAL);
+ print_data (out);
+ gpgme_data_release (out);
+
+ /* Now a detached signature. */
+ gpgme_data_seek (in, 0, SEEK_SET);
+ err = gpgme_data_new (&out);
+ fail_if_err (err);
+ err = gpgme_op_sign (ctx, in, out, GPGME_SIG_MODE_DETACH);
+ fail_if_err (err);
+ result = gpgme_op_sign_result (ctx);
+ check_result (result, GPGME_SIG_MODE_DETACH);
+ print_data (out);
+ gpgme_data_release (out);
+
+ gpgme_data_release (in);
+ gpgme_release (ctx);
+ return 0;
+}
diff --git a/branches/gpgme-1-0-branch/tests/gpgsm/t-support.h b/branches/gpgme-1-0-branch/tests/gpgsm/t-support.h
new file mode 100644
index 00000000..32a7b19e
--- /dev/null
+++ b/branches/gpgme-1-0-branch/tests/gpgsm/t-support.h
@@ -0,0 +1,99 @@
+/* t-support.h - Helper routines for regression tests.
+ Copyright (C) 2000 Werner Koch (dd9jn)
+ Copyright (C) 2001, 2002, 2003 g10 Code GmbH
+
+ This file is part of GPGME.
+
+ GPGME is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ GPGME is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GPGME; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#include <unistd.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <locale.h>
+
+#include <gpgme.h>
+
+#define fail_if_err(err) \
+ do \
+ { \
+ if (err) \
+ { \
+ fprintf (stderr, "%s:%d: %s: %s (%d.%d)\n", \
+ __FILE__, __LINE__, gpg_strsource (err), \
+ gpg_strerror (err), \
+ gpg_err_source (err), gpg_err_code (err)); \
+ exit (1); \
+ } \
+ } \
+ while (0)
+
+
+void
+print_data (gpgme_data_t dh)
+{
+#define BUF_SIZE 512
+ char buf[BUF_SIZE + 1];
+ int ret;
+
+ ret = gpgme_data_seek (dh, 0, SEEK_SET);
+ if (ret)
+ fail_if_err (gpg_error_from_errno (errno));
+ while ((ret = gpgme_data_read (dh, buf, BUF_SIZE)) > 0)
+ fwrite (buf, ret, 1, stdout);
+ if (ret < 0)
+ fail_if_err (gpg_error_from_errno (errno));
+}
+
+
+gpgme_error_t
+passphrase_cb (void *opaque, const char *uid_hint, const char *passphrase_info,
+ int last_was_bad, int fd)
+{
+ write (fd, "abc\n", 4);
+ return 0;
+}
+
+
+char *
+make_filename (const char *fname)
+{
+ const char *srcdir = getenv ("srcdir");
+ char *buf;
+
+ if (!srcdir)
+ srcdir = ".";
+ buf = malloc (strlen(srcdir) + strlen(fname) + 2);
+ if (!buf)
+ exit (8);
+ strcpy (buf, srcdir);
+ strcat (buf, "/");
+ strcat (buf, fname);
+ return buf;
+}
+
+
+void
+init_gpgme (gpgme_protocol_t proto)
+{
+ gpgme_error_t err;
+
+ gpgme_check_version (NULL);
+ setlocale (LC_ALL, "");
+ gpgme_set_locale (NULL, LC_CTYPE, setlocale (LC_CTYPE, NULL));
+ gpgme_set_locale (NULL, LC_MESSAGES, setlocale (LC_MESSAGES, NULL));
+
+ err = gpgme_engine_check_version (proto);
+ fail_if_err (err);
+}
diff --git a/branches/gpgme-1-0-branch/tests/gpgsm/t-verify.c b/branches/gpgme-1-0-branch/tests/gpgsm/t-verify.c
new file mode 100644
index 00000000..19652e37
--- /dev/null
+++ b/branches/gpgme-1-0-branch/tests/gpgsm/t-verify.c
@@ -0,0 +1,151 @@
+/* t-verify.c - Regression test.
+ Copyright (C) 2000 Werner Koch (dd9jn)
+ Copyright (C) 2001, 2002, 2003 g10 Code GmbH
+
+ This file is part of GPGME.
+
+ GPGME is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ GPGME is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GPGME; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+/* We need to include config.h so that we know whether we are building
+ with large file system (LFS) support. */
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include <gpgme.h>
+
+#include "t-support.h"
+
+
+static const char test_text1[] = "Hallo Leute!\n";
+static const char test_text1f[]= "Hallo Leute?\n";
+static const char test_sig1[] =
+"-----BEGIN CMS OBJECT-----\n"
+"MIAGCSqGSIb3DQEHAqCAMIACAQExCzAJBgUrDgMCGgUAMIAGCSqGSIb3DQEHAQAA\n"
+"MYIBOTCCATUCAQEwcDBrMQswCQYDVQQGEwJERTETMBEGA1UEBxQKRPxzc2VsZG9y\n"
+"ZjEWMBQGA1UEChMNZzEwIENvZGUgR21iSDEZMBcGA1UECxMQQWVneXB0ZW4gUHJv\n"
+"amVjdDEUMBIGA1UEAxMLdGVzdCBjZXJ0IDECAQAwBwYFKw4DAhqgJTAjBgkqhkiG\n"
+"9w0BCQQxFgQU7FC/ibH3lC9GE24RJJxa8zqP7wEwCwYJKoZIhvcNAQEBBIGAA3oC\n"
+"DUmKERmD1eoJYFw38y/qnncS/6ZPjWINDIphZeK8mzAANpvpIaRPf3sNBznb89QF\n"
+"mRgCXIWcjlHT0DTRLBf192Ve22IyKH00L52CqFsSN3a2sajqRUlXH8RY2D+Al71e\n"
+"MYdRclgjObCcoilA8fZ13VR4DiMJVFCxJL4qVWI=\n"
+"-----END CMS OBJECT-----\n";
+
+
+static void
+check_result (gpgme_verify_result_t result, int summary, char *fpr,
+ gpgme_error_t status, gpgme_validity_t validity)
+{
+ gpgme_signature_t sig;
+
+ sig = result->signatures;
+ if (!sig || sig->next)
+ {
+ fprintf (stderr, "%s:%i: Unexpected number of signatures\n",
+ __FILE__, __LINE__);
+ exit (1);
+ }
+ if (sig->summary != summary)
+ {
+ fprintf (stderr, "%s:%i: Unexpected signature summary: "
+ "want=0x%x have=0x%x\n",
+ __FILE__, __LINE__, summary, sig->summary);
+ exit (1);
+ }
+ if (strcmp (sig->fpr, fpr))
+ {
+ fprintf (stderr, "%s:%i: Unexpected fingerprint: %s\n",
+ __FILE__, __LINE__, sig->fpr);
+ exit (1);
+ }
+ if (gpg_err_code (sig->status) != status)
+ {
+ fprintf (stderr, "%s:%i: Unexpected signature status: %s\n",
+ __FILE__, __LINE__, gpgme_strerror (sig->status));
+ exit (1);
+ }
+ if (sig->notations)
+ {
+ fprintf (stderr, "%s:%i: Unexpected notation data\n",
+ __FILE__, __LINE__);
+ exit (1);
+ }
+ if (sig->wrong_key_usage)
+ {
+ fprintf (stderr, "%s:%i: Unexpectedly wrong key usage\n",
+ __FILE__, __LINE__);
+ exit (1);
+ }
+ if (sig->validity != validity)
+ {
+ fprintf (stderr, "%s:%i: Unexpected validity: %i\n",
+ __FILE__, __LINE__, sig->validity);
+ exit (1);
+ }
+ if (gpg_err_code (sig->validity_reason) != GPG_ERR_NO_ERROR)
+ {
+ fprintf (stderr, "%s:%i: Unexpected validity reason: %s\n",
+ __FILE__, __LINE__, gpgme_strerror (sig->validity_reason));
+ exit (1);
+ }
+}
+
+
+int
+main (int argc, char **argv)
+{
+ gpgme_ctx_t ctx;
+ gpgme_error_t err;
+ gpgme_data_t sig, text;
+ gpgme_verify_result_t result;
+
+ init_gpgme (GPGME_PROTOCOL_CMS);
+
+ err = gpgme_new (&ctx);
+ fail_if_err (err);
+ gpgme_set_protocol (ctx, GPGME_PROTOCOL_CMS);
+
+ /* Checking a valid message. */
+ err = gpgme_data_new_from_mem (&text, test_text1, strlen (test_text1), 0);
+ fail_if_err (err);
+ err = gpgme_data_new_from_mem (&sig, test_sig1, strlen (test_sig1), 0);
+ fail_if_err (err);
+
+ err = gpgme_op_verify (ctx, sig, text, NULL);
+ fail_if_err (err);
+ result = gpgme_op_verify_result (ctx);
+ check_result (result, GPGME_SIGSUM_VALID | GPGME_SIGSUM_GREEN,
+ "3CF405464F66ED4A7DF45BBDD1E4282E33BDB76E",
+ GPG_ERR_NO_ERROR, GPGME_VALIDITY_FULL);
+
+ /* Checking a manipulated message. */
+ gpgme_data_release (text);
+ err = gpgme_data_new_from_mem (&text, test_text1f, strlen (test_text1f), 0);
+ fail_if_err (err);
+ gpgme_data_seek (sig, 0, SEEK_SET);
+ err = gpgme_op_verify (ctx, sig, text, NULL);
+ fail_if_err (err);
+ result = gpgme_op_verify_result (ctx);
+ check_result (result, GPGME_SIGSUM_RED,
+ "3CF405464F66ED4A7DF45BBDD1E4282E33BDB76E",
+ GPG_ERR_BAD_SIGNATURE, GPGME_VALIDITY_UNKNOWN);
+
+ gpgme_release (ctx);
+ return 0;
+}