Blame egg/test-asn1x.c

Packit b00eeb
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
Packit b00eeb
/* test-asn1.c: Test ASN1 stuf
Packit b00eeb
Packit b00eeb
   Copyright (C) 2009 Stefan Walter
Packit b00eeb
Packit b00eeb
   The Gnome Keyring Library is free software; you can redistribute it and/or
Packit b00eeb
   modify it under the terms of the GNU Library General Public License as
Packit b00eeb
   published by the Free Software Foundation; either version 2 of the
Packit b00eeb
   License, or (at your option) any later version.
Packit b00eeb
Packit b00eeb
   The Gnome Keyring Library is distributed in the hope that it will be useful,
Packit b00eeb
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit b00eeb
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit b00eeb
   Library General Public License for more details.
Packit b00eeb
Packit b00eeb
   You should have received a copy of the GNU Library General Public
Packit b00eeb
   License along with the Gnome Library; see the file COPYING.LIB.  If not,
Packit b00eeb
   see <http://www.gnu.org/licenses/>.
Packit b00eeb
Packit b00eeb
   Author: Stef Walter <stef@memberwebs.com>
Packit b00eeb
*/
Packit b00eeb
Packit b00eeb
#include "config.h"
Packit b00eeb
Packit b00eeb
#include "egg/egg-asn1x.h"
Packit b00eeb
#include "egg/egg-asn1-defs.h"
Packit b00eeb
#include "egg/egg-testing.h"
Packit b00eeb
Packit b00eeb
#include <pwd.h>
Packit b00eeb
#include <stdlib.h>
Packit b00eeb
#include <unistd.h>
Packit b00eeb
Packit b00eeb
#if 0
Packit b00eeb
#include <libtasn1.h>
Packit b00eeb
static void
Packit b00eeb
build_personal_name (void)
Packit b00eeb
{
Packit b00eeb
	ASN1_TYPE asn1_pkix = NULL, asn;
Packit b00eeb
	guchar buffer[10024];
Packit b00eeb
	int res, len;
Packit b00eeb
Packit b00eeb
	res = asn1_array2tree ((ASN1_ARRAY_TYPE*)pkix_asn1_tab, &asn1_pkix, NULL);
Packit b00eeb
	g_assert (res == ASN1_SUCCESS);
Packit b00eeb
Packit b00eeb
	res = asn1_create_element (asn1_pkix, "PKIX1.PersonalName", &asn;;
Packit b00eeb
	g_assert (res == ASN1_SUCCESS);
Packit b00eeb
Packit b00eeb
	asn1_write_value (asn, "surname", "Turanga", 7);
Packit b00eeb
	asn1_write_value (asn, "given-name", "Leela", 5);
Packit b00eeb
	asn1_write_value (asn, "initials", NULL, 0);
Packit b00eeb
	asn1_write_value (asn, "generation-qualifier", "II", 2);
Packit b00eeb
Packit b00eeb
	len = sizeof (buffer);
Packit b00eeb
	res = asn1_der_coding (asn, "", buffer, &len, NULL);
Packit b00eeb
	g_assert (res == ASN1_SUCCESS);
Packit b00eeb
Packit b00eeb
	asn1_delete_structure (&asn;;
Packit b00eeb
	asn1_delete_structure (&asn1_pkix);
Packit b00eeb
Packit b00eeb
	if (!g_file_set_contents ("/tmp/personal-name.der", (gchar*)buffer, len, NULL))
Packit b00eeb
		g_assert (FALSE);
Packit b00eeb
Packit b00eeb
}
Packit b00eeb
#endif
Packit b00eeb
Packit b00eeb
typedef struct {
Packit b00eeb
	GBytes *data;
Packit b00eeb
} Test;
Packit b00eeb
Packit b00eeb
typedef struct {
Packit b00eeb
	const EggAsn1xDef *defs;
Packit b00eeb
	const gchar *filename;
Packit b00eeb
	const gchar *identifier;
Packit b00eeb
} Fixture;
Packit b00eeb
Packit b00eeb
static const Fixture parse_test_fixtures[] = {
Packit b00eeb
	{ pkix_asn1_tab, SRCDIR "/egg/fixtures/test-certificate-1.der", "Certificate" },
Packit b00eeb
	{ pkix_asn1_tab, SRCDIR "/egg/fixtures/test-pkcs8-1.der", "pkcs-8-PrivateKeyInfo" },
Packit b00eeb
	{ pk_asn1_tab, SRCDIR "/egg/fixtures/test-rsakey-1.der", "RSAPrivateKey" },
Packit b00eeb
	{ pkix_asn1_tab, SRCDIR "/egg/fixtures/test-pkcs7-1.der", "pkcs-7-ContentInfo" },
Packit b00eeb
	{ pkix_asn1_tab, SRCDIR "/egg/fixtures/test-pkcs7-2.der", "pkcs-7-ContentInfo" },
Packit b00eeb
};
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
setup (Test *test,
Packit b00eeb
       gconstpointer data)
Packit b00eeb
{
Packit b00eeb
	const gchar *filename = data;
Packit b00eeb
	GError *error = NULL;
Packit b00eeb
	gchar *contents;
Packit b00eeb
	gsize length;
Packit b00eeb
Packit b00eeb
	g_file_get_contents (filename, (gchar**)&contents, &length, &error);
Packit b00eeb
	g_assert_no_error (error);
Packit b00eeb
Packit b00eeb
	test->data = g_bytes_new_take (contents, length);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
setup_parsing (Test *test,
Packit b00eeb
               gconstpointer data)
Packit b00eeb
{
Packit b00eeb
	const Fixture *fixture = data;
Packit b00eeb
	setup (test, fixture->filename);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
teardown (Test *test,
Packit b00eeb
          gconstpointer unused)
Packit b00eeb
{
Packit b00eeb
	g_bytes_unref (test->data);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
test_decode_encode (Test *test,
Packit b00eeb
                    gconstpointer data)
Packit b00eeb
{
Packit b00eeb
	const Fixture *fixture = data;
Packit b00eeb
	GNode *asn;
Packit b00eeb
	GBytes *encoded;
Packit b00eeb
	gboolean ret;
Packit b00eeb
Packit b00eeb
	asn = egg_asn1x_create (fixture->defs, fixture->identifier);
Packit b00eeb
Packit b00eeb
	if (g_test_verbose ())
Packit b00eeb
		egg_asn1x_dump (asn);
Packit b00eeb
Packit b00eeb
	ret = egg_asn1x_decode (asn, test->data);
Packit b00eeb
	egg_asn1x_assert (ret == TRUE, asn);
Packit b00eeb
Packit b00eeb
	encoded = egg_asn1x_encode (asn, NULL);
Packit b00eeb
	egg_asn1x_assert (encoded != NULL, asn);
Packit b00eeb
Packit b00eeb
	/* Decode the encoding */
Packit b00eeb
	ret = egg_asn1x_decode (asn, encoded);
Packit b00eeb
	egg_asn1x_assert (ret == TRUE, asn);
Packit b00eeb
Packit b00eeb
	egg_asn1x_clear (asn);
Packit b00eeb
	egg_asn1x_destroy (asn);
Packit b00eeb
	g_bytes_unref (encoded);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
test_personal_name_invalid (Test *test,
Packit b00eeb
                            gconstpointer unused)
Packit b00eeb
{
Packit b00eeb
	GNode *asn;
Packit b00eeb
	gboolean ret;
Packit b00eeb
Packit b00eeb
	asn = egg_asn1x_create (pkix_asn1_tab, "PersonalName");
Packit b00eeb
Packit b00eeb
	if (g_test_verbose ())
Packit b00eeb
		egg_asn1x_dump (asn);
Packit b00eeb
Packit b00eeb
	ret = egg_asn1x_decode (asn, test->data);
Packit b00eeb
	g_assert (ret == FALSE);
Packit b00eeb
	g_assert (strstr (egg_asn1x_message (asn), "content size is out of bounds") != NULL);
Packit b00eeb
Packit b00eeb
	egg_asn1x_destroy (asn);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
test_pkcs12_decode (Test *test,
Packit b00eeb
                    gconstpointer unused)
Packit b00eeb
{
Packit b00eeb
	GNode *asn;
Packit b00eeb
	gboolean ret;
Packit b00eeb
Packit b00eeb
	asn = egg_asn1x_create (pkix_asn1_tab, "pkcs-12-PFX");
Packit b00eeb
Packit b00eeb
	if (g_test_verbose ())
Packit b00eeb
		egg_asn1x_dump (asn);
Packit b00eeb
Packit b00eeb
	ret = egg_asn1x_decode (asn, test->data);
Packit b00eeb
	egg_asn1x_assert (ret == TRUE, asn);
Packit b00eeb
Packit b00eeb
	egg_asn1x_destroy (asn);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
int
Packit b00eeb
main (int argc, char **argv)
Packit b00eeb
{
Packit b00eeb
	gchar *name;
Packit b00eeb
	gint i;
Packit b00eeb
Packit b00eeb
	g_test_init (&argc, &argv, NULL);
Packit b00eeb
Packit b00eeb
	for (i = 0; i < G_N_ELEMENTS (parse_test_fixtures); i++) {
Packit b00eeb
		name = g_strdup_printf ("/asn1x/encode-decode-%d-%s", i, parse_test_fixtures[i].identifier);
Packit b00eeb
		g_test_add (name, Test, &parse_test_fixtures[i], setup_parsing, test_decode_encode, teardown);
Packit b00eeb
		g_free (name);
Packit b00eeb
	}
Packit b00eeb
Packit b00eeb
	g_test_add ("/asn1x/pkcs12-decode/1", Test, SRCDIR "/egg/fixtures/test-pkcs12-1.der",
Packit b00eeb
	            setup, test_pkcs12_decode, teardown);
Packit b00eeb
	g_test_add ("/asn1x/pkcs5-personal-name/invalid", Test, SRCDIR "/egg/fixtures/test-personalname-invalid.der",
Packit b00eeb
	            setup, test_personal_name_invalid, teardown);
Packit b00eeb
Packit b00eeb
	return g_test_run ();
Packit b00eeb
}