summaryrefslogtreecommitdiff
path: root/egg/test-dh.c
diff options
context:
space:
mode:
authorStef Walter <stefw@gnome.org>2014-03-02 16:43:19 +0100
committerStef Walter <stefw@gnome.org>2014-03-03 08:17:56 +0100
commit9019498dfef15efec4d12eee8becc55781062a30 (patch)
tree9bc43449cb2bf4cf228fa0fd86922341ce07419a /egg/test-dh.c
parent4a141c9e21268a9d6a531aaf6c15032979c85aa9 (diff)
downloadgcr-9019498dfef15efec4d12eee8becc55781062a30.tar.gz
Makefile.am: Single Makefile mode and parallel-tests
gtk-doc doesn't work as an included Makefile so continue to use SUBDIRS with docs/reference/* Run the tests using TAP. Unfortunately the GTest --tap output mode doesn't behave well in the face of failures, and doesn't output a test plan. Use our own tap-driver and tap-compiler for these reasons. This also fixes several builddir != srcdir issues and testing hacks that were sneaking around in the code base. Move the tests into the same directories as the code that it is testing.
Diffstat (limited to 'egg/test-dh.c')
-rw-r--r--egg/test-dh.c208
1 files changed, 208 insertions, 0 deletions
diff --git a/egg/test-dh.c b/egg/test-dh.c
new file mode 100644
index 0000000..c95f479
--- /dev/null
+++ b/egg/test-dh.c
@@ -0,0 +1,208 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
+/* test-dh.c: Test egg-dh.c
+
+ Copyright (C) 2009 Stefan Walter
+
+ The Gnome Keyring Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ The Gnome Keyring Library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the Gnome Library; see the file COPYING.LIB. If not,
+ see <http://www.gnu.org/licenses/>.
+
+ Author: Stef Walter <stef@memberwebs.com>
+*/
+
+#include "config.h"
+
+#include "egg/egg-dh.h"
+#include "egg/egg-secure-memory.h"
+#include "egg/egg-testing.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include <glib.h>
+#include <gcrypt.h>
+
+EGG_SECURE_DEFINE_GLIB_GLOBALS ();
+
+static void
+test_perform (void)
+{
+ gcry_mpi_t p, g;
+ gcry_mpi_t x1, X1;
+ gcry_mpi_t x2, X2;
+ gpointer k1, k2;
+ gboolean ret;
+ gsize n1, n2;
+
+ /* Load up the parameters */
+ if (!egg_dh_default_params ("ietf-ike-grp-modp-768", &p, &g))
+ g_assert_not_reached ();
+
+ /* Generate secrets */
+ ret = egg_dh_gen_pair (p, g, 0, &X1, &x1);
+ g_assert (ret);
+ ret = egg_dh_gen_pair (p, g, 0, &X2, &x2);
+ g_assert (ret);
+
+ /* Calculate keys */
+ k1 = egg_dh_gen_secret (X2, x1, p, &n1);
+ g_assert (k1);
+ k2 = egg_dh_gen_secret (X1, x2, p, &n2);
+ g_assert (k2);
+
+ /* Keys must be the same */
+ egg_assert_cmpsize (n1, ==, n2);
+ g_assert (memcmp (k1, k2, n1) == 0);
+
+ gcry_mpi_release (p);
+ gcry_mpi_release (g);
+ gcry_mpi_release (x1);
+ gcry_mpi_release (X1);
+ egg_secure_free (k1);
+ gcry_mpi_release (x2);
+ gcry_mpi_release (X2);
+ egg_secure_free (k2);
+}
+
+static void
+test_short_pair (void)
+{
+ gcry_mpi_t p, g;
+ gcry_mpi_t x1, X1;
+ gboolean ret;
+
+ /* Load up the parameters */
+ ret = egg_dh_default_params ("ietf-ike-grp-modp-1024", &p, &g);
+ g_assert (ret);
+ g_assert_cmpuint (gcry_mpi_get_nbits (p), ==, 1024);
+
+ /* Generate secrets */
+ ret = egg_dh_gen_pair (p, g, 512, &X1, &x1);
+ g_assert (ret);
+ g_assert_cmpuint (gcry_mpi_get_nbits (x1), <=, 512);
+
+ gcry_mpi_release (p);
+ gcry_mpi_release (g);
+ gcry_mpi_release (x1);
+ gcry_mpi_release (X1);
+}
+
+static void
+check_dh_default (const gchar *name, guint bits)
+{
+ gboolean ret;
+ gcry_mpi_t p, g, check;
+ gconstpointer prime, base;
+ gsize n_prime, n_base;
+ gcry_error_t gcry;
+
+ ret = egg_dh_default_params (name, &p, &g);
+ g_assert (ret);
+ g_assert_cmpint (gcry_mpi_get_nbits (p), ==, bits);
+ g_assert_cmpint (gcry_mpi_get_nbits (g), <, gcry_mpi_get_nbits (p));
+
+ ret = egg_dh_default_params_raw (name, &prime, &n_prime, &base, &n_base);
+ g_assert (ret);
+ g_assert (prime != NULL);
+ egg_assert_cmpsize (n_prime, >, 0);
+ g_assert (base != NULL);
+ egg_assert_cmpsize (n_base, >, 0);
+
+ gcry = gcry_mpi_scan (&check, GCRYMPI_FMT_USG, prime, n_prime, NULL);
+ g_assert (gcry == 0);
+ g_assert (gcry_mpi_cmp (check, p) == 0);
+ gcry_mpi_release (check);
+
+ gcry = gcry_mpi_scan (&check, GCRYMPI_FMT_USG, base, n_base, NULL);
+ g_assert (gcry == 0);
+ g_assert (gcry_mpi_cmp (check, g) == 0);
+ gcry_mpi_release (check);
+
+ gcry_mpi_release (p);
+ gcry_mpi_release (g);
+}
+
+static void
+test_default_768 (void)
+{
+ check_dh_default ("ietf-ike-grp-modp-768", 768);
+}
+
+static void
+test_default_1024 (void)
+{
+ check_dh_default ("ietf-ike-grp-modp-1024", 1024);
+}
+
+static void
+test_default_1536 (void)
+{
+ check_dh_default ("ietf-ike-grp-modp-1536", 1536);
+}
+
+static void
+test_default_2048 (void)
+{
+ check_dh_default ("ietf-ike-grp-modp-2048", 2048);
+}
+
+static void
+test_default_3072 (void)
+{
+ check_dh_default ("ietf-ike-grp-modp-3072", 3072);
+}
+
+static void
+test_default_4096 (void)
+{
+ check_dh_default ("ietf-ike-grp-modp-4096", 4096);
+}
+
+static void
+test_default_8192 (void)
+{
+ check_dh_default ("ietf-ike-grp-modp-8192", 8192);
+}
+
+static void
+test_default_bad (void)
+{
+ gboolean ret;
+ gcry_mpi_t p, g;
+
+ ret = egg_dh_default_params ("bad-name", &p, &g);
+ g_assert (!ret);
+}
+
+int
+main (int argc, char **argv)
+{
+ g_test_init (&argc, &argv, NULL);
+
+ if (!g_test_quick ()) {
+ g_test_add_func ("/dh/perform", test_perform);
+ g_test_add_func ("/dh/short_pair", test_short_pair);
+ }
+
+ g_test_add_func ("/dh/default_768", test_default_768);
+ g_test_add_func ("/dh/default_1024", test_default_1024);
+ g_test_add_func ("/dh/default_1536", test_default_1536);
+ g_test_add_func ("/dh/default_2048", test_default_2048);
+ g_test_add_func ("/dh/default_3072", test_default_3072);
+ g_test_add_func ("/dh/default_4096", test_default_4096);
+ g_test_add_func ("/dh/default_8192", test_default_8192);
+ g_test_add_func ("/dh/default_bad", test_default_bad);
+
+ return g_test_run ();
+}