summaryrefslogtreecommitdiff
path: root/egg
diff options
context:
space:
mode:
authorStef Walter <stef@memberwebs.com>2009-12-25 00:11:28 +0000
committerStef Walter <stef@memberwebs.com>2010-06-24 03:00:13 +0000
commit83a8ec545f064d153ae9fd2de64b6a5a2d39f6a4 (patch)
treed72118c0ce76563d76f6051b7099dc3e52de18e3 /egg
parent69e835a7ad4996f18b6f0c5b02fc3623a12e376f (diff)
downloadgnome-keyring-83a8ec545f064d153ae9fd2de64b6a5a2d39f6a4.tar.gz
[egg] Add asn functionality for clearing a tree.
Diffstat (limited to 'egg')
-rw-r--r--egg/egg-asn1x.c65
-rw-r--r--egg/egg-asn1x.h2
-rw-r--r--egg/tests/test-asn1x.c64
3 files changed, 80 insertions, 51 deletions
diff --git a/egg/egg-asn1x.c b/egg/egg-asn1x.c
index 4cde7984..2fa30d8a 100644
--- a/egg/egg-asn1x.c
+++ b/egg/egg-asn1x.c
@@ -119,12 +119,20 @@ anode_new (const ASN1_ARRAY_TYPE *def)
return g_node_new (an);
}
-static gboolean
-anode_free_func (GNode *node, gpointer unused)
+static void
+anode_clear (GNode *node)
{
Anode *an = node->data;
if (an->data);
g_slice_free_chain (Atlv, an->data, next);
+ an->data = NULL;
+}
+
+static gboolean
+anode_free_func (GNode *node, gpointer unused)
+{
+ Anode *an = node->data;
+ anode_clear (node);
g_slice_free (Anode, an);
return FALSE;
}
@@ -132,9 +140,10 @@ anode_free_func (GNode *node, gpointer unused)
static void
anode_destroy (GNode *node)
{
+ if (!G_NODE_IS_ROOT (node))
+ g_node_unlink (node);
g_node_traverse (node, G_IN_ORDER, G_TRAVERSE_ALL, -1, anode_free_func, NULL);
g_node_destroy (node);
-
}
static gpointer
@@ -762,6 +771,8 @@ egg_asn1x_decode (GNode *asn, gconstpointer data, gsize n_data)
g_return_val_if_fail (data, FALSE);
g_return_val_if_fail (n_data, FALSE);
+ egg_asn1x_clear (asn);
+
if (!anode_decode_tlv_for_data (data, (const guchar*)data + n_data, &tlv))
return FALSE;
@@ -911,8 +922,12 @@ egg_asn1x_create (const ASN1_ARRAY_TYPE *defs, const gchar *identifier)
return root;
}
+/* -----------------------------------------------------------------------------------
+ * DUMPING
+ */
+
static gboolean
-traverse_and_dump (GNode *node, gpointer data)
+traverse_and_dump (GNode *node, gpointer unused)
{
guint i, depth;
GString *output;
@@ -956,9 +971,47 @@ traverse_and_dump (GNode *node, gpointer data)
void
egg_asn1x_dump (GNode *asn)
{
- guint depth = 0;
g_return_if_fail (asn);
- g_node_traverse (asn, G_PRE_ORDER, G_TRAVERSE_ALL, -1, traverse_and_dump, &depth);
+ g_node_traverse (asn, G_PRE_ORDER, G_TRAVERSE_ALL, -1, traverse_and_dump, NULL);
+}
+
+/* -----------------------------------------------------------------------------------
+ * CLEARING and DESTROYING
+ */
+
+static gboolean
+traverse_and_clear (GNode *node, gpointer unused)
+{
+ GNode *child, *next;
+ gint type;
+
+ anode_clear (node);
+
+ type = anode_def_type (node);
+ if (type == TYPE_SET_OF || type == TYPE_SEQUENCE_OF) {
+
+ /* The first 'real' child is the template */
+ child = anode_child_with_real_type (node);
+ g_return_val_if_fail (child, TRUE);
+
+ /* And any others are extras */
+ child = anode_next_with_real_type (child);
+ while (child) {
+ next = anode_next_with_real_type (child);
+ anode_destroy (child);
+ child = next;
+ }
+ }
+
+ /* Don't stop traversal */
+ return FALSE;
+}
+
+void
+egg_asn1x_clear (GNode *asn)
+{
+ g_return_if_fail (asn);
+ g_node_traverse (asn, G_POST_ORDER, G_TRAVERSE_ALL, -1, traverse_and_clear, NULL);
}
void
diff --git a/egg/egg-asn1x.h b/egg/egg-asn1x.h
index 94acb559..43c72b7e 100644
--- a/egg/egg-asn1x.h
+++ b/egg/egg-asn1x.h
@@ -39,6 +39,8 @@ GNode* egg_asn1x_create (const ASN1_ARRAY_TYPE *defs,
void egg_asn1x_dump (GNode *asn);
+void egg_asn1x_clear (GNode *asn);
+
gboolean egg_asn1x_decode (GNode *asn,
gconstpointer data,
gsize n_data);
diff --git a/egg/tests/test-asn1x.c b/egg/tests/test-asn1x.c
index 99f45159..ce966cfb 100644
--- a/egg/tests/test-asn1x.c
+++ b/egg/tests/test-asn1x.c
@@ -43,65 +43,39 @@ build_personal_name (void)
}
#endif
-static int
-run (void)
+static void
+test_some_asn1_stuff (const ASN1_ARRAY_TYPE *defs, const gchar *file, const gchar *identifier)
{
GNode *asn;
gpointer data;
gsize n_data;
- /* Build up a personal name, which is a set */
-#if 0
- build_personal_name ();
-#endif
-
- data = testing_data_read ("test-certificate-1.der", &n_data);
- asn = egg_asn1x_create (pkix_asn1_tab, "Certificate");
- egg_asn1x_dump (asn);
- if (!egg_asn1x_decode (asn, data, n_data))
- g_assert_not_reached ();
- egg_asn1x_destroy (asn);
- g_free (data);
-
- data = testing_data_read ("test-pkcs8-1.der", &n_data);
- asn = egg_asn1x_create (pkix_asn1_tab, "pkcs-8-PrivateKeyInfo");
+ data = testing_data_read (file, &n_data);
+ asn = egg_asn1x_create (defs, identifier);
egg_asn1x_dump (asn);
if (!egg_asn1x_decode (asn, data, n_data))
g_assert_not_reached ();
+ egg_asn1x_clear (asn);
egg_asn1x_destroy (asn);
g_free (data);
+}
- data = testing_data_read ("test-rsakey-1.der", &n_data);
- asn = egg_asn1x_create (pk_asn1_tab, "RSAPrivateKey");
- egg_asn1x_dump (asn);
- if (!egg_asn1x_decode (asn, data, n_data))
- g_assert_not_reached ();
- egg_asn1x_destroy (asn);
- g_free (data);
+static int
+run (void)
+{
- data = testing_data_read ("test-personalname-1.der", &n_data);
- asn = egg_asn1x_create (pkix_asn1_tab, "PersonalName");
- egg_asn1x_dump (asn);
- if (!egg_asn1x_decode (asn, data, n_data))
- g_assert_not_reached ();
- egg_asn1x_destroy (asn);
- g_free (data);
+ /* Build up a personal name, which is a set */
+#if 0
+ build_personal_name ();
+#endif
- data = testing_data_read ("test-pkcs7-1.der", &n_data);
- asn = egg_asn1x_create (pkix_asn1_tab, "pkcs-7-ContentInfo");
- egg_asn1x_dump (asn);
- if (!egg_asn1x_decode (asn, data, n_data))
- g_assert_not_reached ();
- egg_asn1x_destroy (asn);
- g_free (data);
- data = testing_data_read ("test-pkcs12-1.der", &n_data);
- asn = egg_asn1x_create (pkix_asn1_tab, "pkcs-12-PFX");
- egg_asn1x_dump (asn);
- if (!egg_asn1x_decode (asn, data, n_data))
- g_assert_not_reached ();
- egg_asn1x_destroy (asn);
- g_free (data);
+ test_some_asn1_stuff (pkix_asn1_tab, "test-certificate-1.der", "Certificate");
+ test_some_asn1_stuff (pkix_asn1_tab, "test-pkcs8-1.der", "pkcs-8-PrivateKeyInfo");
+ test_some_asn1_stuff (pk_asn1_tab, "test-rsakey-1.der", "RSAPrivateKey");
+ test_some_asn1_stuff (pkix_asn1_tab, "test-personalname-1.der", "PersonalName");
+ test_some_asn1_stuff (pkix_asn1_tab, "test-pkcs7-1.der", "pkcs-7-ContentInfo");
+ test_some_asn1_stuff (pkix_asn1_tab, "test-pkcs12-1.der", "pkcs-12-PFX");
return 0;
}