X509Name.get_components
diff --git a/src/crypto/x509name.c b/src/crypto/x509name.c
index 5827ccb..06c0153 100644
--- a/src/crypto/x509name.c
+++ b/src/crypto/x509name.c
@@ -274,6 +274,60 @@
}
+static char crypto_X509Name_get_components_doc[] = "\n\
+Returns the split-up components of this name.\n\
+\n\
+Arguments: self - The X509 object\n\
+ args - The Python argument tuple, should be empty\n\
+Returns: List of tuples (name, value).\n\
+";
+
+static PyObject *
+crypto_X509Name_get_components(crypto_X509NameObj *self, PyObject *args)
+{
+ int n, i;
+ X509_NAME *name = self->x509_name;
+ PyObject *list;
+
+ if (!PyArg_ParseTuple(args, ":get_components"))
+ return NULL;
+
+ n = X509_NAME_entry_count(name);
+ list = PyList_New(n);
+ for (i = 0; i < n; i++)
+ {
+ X509_NAME_ENTRY *ent;
+ ASN1_OBJECT *fname;
+ ASN1_STRING *fval;
+ int nid;
+ int l;
+ unsigned char buf[100];
+ unsigned char *str;
+ PyObject *tuple;
+
+ ent = X509_NAME_get_entry(name, i);
+
+ fname = X509_NAME_ENTRY_get_object(ent);
+ fval = X509_NAME_ENTRY_get_data(ent);
+
+ l = ASN1_STRING_length(fval);
+ str = ASN1_STRING_data(fval);
+
+ nid = OBJ_obj2nid(fname);
+
+ /* printf("fname is %s len=%d str=%s\n", OBJ_nid2sn(nid), l, str); */
+
+ tuple = PyTuple_New(2);
+ PyTuple_SetItem(tuple, 0, PyString_FromString(OBJ_nid2sn(nid)));
+ PyTuple_SetItem(tuple, 1, PyString_FromStringAndSize(str, l));
+
+ PyList_SetItem(list, i, tuple);
+ }
+
+ return list;
+}
+
+
/*
* Call the visitproc on all contained objects.
*
@@ -337,6 +391,7 @@
{
ADD_METHOD(hash),
ADD_METHOD(der),
+ ADD_METHOD(get_components),
{ NULL, NULL }
};
#undef ADD_METHOD