From 274cc26eaf822c137c38a715739c2e9bd61cdd25 Mon Sep 17 00:00:00 2001 From: Stef Walter Date: Thu, 31 Dec 2009 01:22:59 +0000 Subject: [PATCH] [egg] Implement some new asn1 tests, and fix problems. --- egg/Makefile.am | 1 + egg/egg-asn1x.c | 23 ++++-- egg/tests/Makefile.am | 8 +- egg/tests/test-asn1.c | 202 ++++++++++++++++++++++++++++++++++++++++++++++++++ egg/tests/tests.asn | 19 +++++ 5 files changed, 245 insertions(+), 8 deletions(-) create mode 100644 egg/tests/test-asn1.c create mode 100644 egg/tests/tests.asn diff --git a/egg/Makefile.am b/egg/Makefile.am index d8384e3..6e2642d 100644 --- a/egg/Makefile.am +++ b/egg/Makefile.am @@ -22,6 +22,7 @@ libegg_la_CFLAGS = \ libegg_la_SOURCES = \ egg-asn1.c egg-asn1.h \ + egg-asn1x.c egg-asn1x.h \ egg-buffer.c egg-buffer.h \ egg-cleanup.c egg-cleanup.h \ egg-dh.c egg-dh.h \ diff --git a/egg/egg-asn1x.c b/egg/egg-asn1x.c index b1ecc59..1c71e8f 100644 --- a/egg/egg-asn1x.c +++ b/egg/egg-asn1x.c @@ -931,6 +931,9 @@ egg_asn1x_decode (GNode *asn, gconstpointer data, gsize n_data) if (!anode_decode_anything (asn, &tlv)) return FALSE; + if (tlv.end - tlv.buf != n_data) + return FALSE; + return egg_asn1x_validate (asn); } @@ -1820,7 +1823,7 @@ anode_read_boolean (GNode *node, Atlv *tlv, gboolean *value) return FALSE; if (tlv->buf[tlv->off] == 0x00) *value = FALSE; - if (tlv->buf[tlv->off] == 0xFF) + else if (tlv->buf[tlv->off] == 0xFF) *value = TRUE; else return FALSE; @@ -2003,7 +2006,8 @@ egg_asn1x_get_boolean (GNode *node, gboolean *value) g_return_val_if_fail (anode_def_type (node) == TYPE_BOOLEAN, FALSE); tlv = anode_get_tlv_data (node); - g_return_val_if_fail (tlv, FALSE); + if (tlv == NULL) + return FALSE; return anode_read_boolean (node, tlv, value); } @@ -2035,7 +2039,8 @@ egg_asn1x_get_integer_as_ulong (GNode *node, gulong *value) g_return_val_if_fail (anode_def_type (node) == TYPE_INTEGER, FALSE); tlv = anode_get_tlv_data (node); - g_return_val_if_fail (tlv, FALSE); + if (tlv == NULL) + return FALSE; return anode_read_integer_as_ulong(node, tlv, value); } @@ -2066,7 +2071,8 @@ egg_asn1x_get_raw_value (GNode *node, gsize *n_content) g_return_val_if_fail (n_content, NULL); tlv = anode_get_tlv_data (node); - g_return_val_if_fail (tlv, NULL); + if (tlv == NULL) + return FALSE; g_return_val_if_fail (!(tlv->cls & ASN1_CLASS_STRUCTURED), NULL); *n_content = tlv->len; @@ -2099,7 +2105,8 @@ egg_asn1x_get_string_as_raw (GNode *node, EggAllocator allocator, gsize *n_strin g_return_val_if_fail (type == TYPE_OCTET_STRING || type == TYPE_GENERALSTRING, NULL); tlv = anode_get_tlv_data (node); - g_return_val_if_fail (tlv, NULL); + if (tlv == NULL) + return NULL; if (!anode_read_string (node, tlv, NULL, &length)) return NULL; @@ -2182,7 +2189,8 @@ egg_asn1x_get_time_as_long (GNode *node) g_return_val_if_fail (anode_def_type (node) == TYPE_TIME, -1); tlv = anode_get_tlv_data (node); - g_return_val_if_fail (tlv, -1); + if (tlv == NULL) + return -1; if (!anode_read_time (node, tlv, &time)) return -1; @@ -2199,7 +2207,8 @@ egg_asn1x_get_oid_as_string (GNode *node) g_return_val_if_fail (anode_def_type (node) == TYPE_OBJECT_ID, NULL); tlv = anode_get_tlv_data (node); - g_return_val_if_fail (tlv, NULL); + if (tlv == NULL) + return NULL; if (!anode_read_object_id (node, tlv, &oid)) return NULL; diff --git a/egg/tests/Makefile.am b/egg/tests/Makefile.am index 1c202e4..c7d6acc 100644 --- a/egg/tests/Makefile.am +++ b/egg/tests/Makefile.am @@ -1,8 +1,12 @@ asn1-def-test.h: test.asn $(ASN1PARSER) -o asn1-def-test.h $(srcdir)/test.asn +asn1-def-tests.h: tests.asn + $(ASN1PARSER) -o asn1-def-tests.h $(srcdir)/tests.asn + # Test files should be listed in order they need to run TESTING_FILES = \ + test-asn1.c \ unit-test-asn1.c \ test-dn.c \ unit-test-cleanup.c \ @@ -14,7 +18,8 @@ TESTING_FILES = \ unit-test-openssl.c \ unit-test-dh.c \ unit-test-spawn.c \ - asn1-def-test.h + asn1-def-test.h \ + asn1-def-tests.h UNIT_PROMPT = @@ -23,6 +28,7 @@ TESTING_LIBS = \ EXTRA_DIST = \ test.asn \ + tests.asn \ test-data include $(top_srcdir)/testing/testing.make diff --git a/egg/tests/test-asn1.c b/egg/tests/test-asn1.c new file mode 100644 index 0000000..d550984 --- /dev/null +++ b/egg/tests/test-asn1.c @@ -0,0 +1,202 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* test-asn1.c: Test ASN1 stuf + + 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, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + + Author: Stef Walter +*/ + +#include "config.h" + +#include "test-suite.h" + +#include "egg/egg-asn1x.h" + +#include + +#include +#include +#include + +#include "asn1-def-tests.h" + +const gchar I33[] = "\x02\x01\x2A"; +const gchar BFALSE[] = "\x01\x01\x00"; +const gchar BTRUE[] = "\x01\x01\xFF"; +const gchar SFARNSWORTH[] = "\x04\x0A""farnsworth"; +const gchar SIMPLICIT[] = "\x85\x08""implicit"; +const gchar SEXPLICIT[] = "\xE5\x0A\x04\x08""explicit"; +const gchar TGENERALIZED[] = "\x18\x0F""20070725130528Z"; + +#define XL(x) G_N_ELEMENTS (x) - 1 + +DEFINE_TEST(asn1_boolean) +{ + GNode *asn; + gboolean value; + + asn = egg_asn1x_create (tests_asn1_tab, "TestBoolean"); + g_assert (asn); + + /* Shouldn't succeed */ + if (egg_asn1x_get_boolean (asn, &value)) + g_assert_not_reached (); + + /* Decode a false */ + if (!egg_asn1x_decode (asn, BFALSE, XL (BFALSE))) + g_assert_not_reached (); + value = TRUE; + if (!egg_asn1x_get_boolean (asn, &value)) + g_assert_not_reached (); + g_assert (value == FALSE); + + /* Decode a true */ + if (!egg_asn1x_decode (asn, BTRUE, XL (BTRUE))) + g_assert_not_reached (); + value = FALSE; + if (!egg_asn1x_get_boolean (asn, &value)) + g_assert_not_reached (); + g_assert (value == TRUE); + + egg_asn1x_clear (asn); + + /* Shouldn't suceed after clear */ + if (egg_asn1x_get_boolean (asn, &value)) + g_assert_not_reached (); + + egg_asn1x_destroy (asn); +} + +DEFINE_TEST(asn1_integer) +{ + GNode *asn; + gulong value; + + asn = egg_asn1x_create (tests_asn1_tab, "TestInteger"); + g_assert (asn); + + /* Shouldn't succeed */ + if (egg_asn1x_get_integer_as_ulong (asn, &value)) + g_assert_not_reached (); + + /* Should suceed now */ + if (!egg_asn1x_decode (asn, I33, XL (I33))) + g_assert_not_reached (); + if (!egg_asn1x_get_integer_as_ulong (asn, &value)) + g_assert_not_reached (); + g_assert (value == 42); + + egg_asn1x_clear (asn); + + /* Shouldn't suceed after clear */ + if (egg_asn1x_get_integer_as_ulong (asn, &value)) + g_assert_not_reached (); + + egg_asn1x_destroy (asn); +} + +DEFINE_TEST(asn1_octet_string) +{ + GNode *asn; + gchar *value; + + asn = egg_asn1x_create (tests_asn1_tab, "TestOctetString"); + g_assert (asn); + + /* Shouldn't succeed */ + if (egg_asn1x_get_string_as_utf8 (asn, NULL)) + g_assert_not_reached (); + + /* Should work */ + if (!egg_asn1x_decode (asn, SFARNSWORTH, XL (SFARNSWORTH))) + g_assert_not_reached (); + value = egg_asn1x_get_string_as_utf8 (asn, NULL); + g_assert_cmpstr (value, ==, "farnsworth"); + g_free (value); + + egg_asn1x_clear (asn); + + /* Shouldn't succeed */ + if (egg_asn1x_get_string_as_utf8 (asn, NULL)) + g_assert_not_reached (); + + egg_asn1x_destroy (asn); +} + +DEFINE_TEST(asn1_generalized_time) +{ + GNode *asn; + glong value; + + asn = egg_asn1x_create (tests_asn1_tab, "TestGeneralized"); + g_assert (asn); + + /* Shouldn't succeed */ + value = egg_asn1x_get_time_as_long (asn); + g_assert (value == -1); + + /* Should work */ + if (!egg_asn1x_decode (asn, TGENERALIZED, XL (TGENERALIZED))) + g_assert_not_reached (); + value = egg_asn1x_get_time_as_long (asn); + g_assert (value == 1185368728); + + egg_asn1x_clear (asn); + + /* Shouldn't succeed */ + value = egg_asn1x_get_time_as_long (asn); + g_assert (value == -1); + + egg_asn1x_destroy (asn); +} + +DEFINE_TEST(asn1_implicit) +{ + GNode *asn; + gchar *value; + + asn = egg_asn1x_create (tests_asn1_tab, "TestImplicit"); + g_assert (asn); + + /* Should work */ + if (!egg_asn1x_decode (asn, SIMPLICIT, XL (SIMPLICIT))) + g_assert_not_reached (); + value = egg_asn1x_get_string_as_utf8 (asn, NULL); + g_assert_cmpstr (value, ==, "implicit"); + g_free (value); + + egg_asn1x_destroy (asn); +} + +DEFINE_TEST(asn1_explicit) +{ + GNode *asn; + gchar *value; + + asn = egg_asn1x_create (tests_asn1_tab, "TestExplicit"); + g_assert (asn); + + /* Should work */ + if (!egg_asn1x_decode (asn, SEXPLICIT, XL (SEXPLICIT))) + g_assert_not_reached (); + value = egg_asn1x_get_string_as_utf8 (asn, NULL); + g_assert_cmpstr (value, ==, "explicit"); + g_free (value); + + egg_asn1x_destroy (asn); +} diff --git a/egg/tests/tests.asn b/egg/tests/tests.asn new file mode 100644 index 0000000..ad23d5b --- /dev/null +++ b/egg/tests/tests.asn @@ -0,0 +1,19 @@ +TESTS { } + +DEFINITIONS EXPLICIT TAGS ::= + +BEGIN + +TestInteger ::= INTEGER + +TestBoolean ::= BOOLEAN + +TestOctetString ::= OCTET STRING + +TestGeneralized ::= GeneralizedTime + +TestImplicit ::= [5] IMPLICIT OCTET STRING + +TestExplicit ::= [5] EXPLICIT OCTET STRING + +END -- 2.7.4