aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--rpkid/ext/POW.c60
1 files changed, 37 insertions, 23 deletions
diff --git a/rpkid/ext/POW.c b/rpkid/ext/POW.c
index 1e5cd0cb..3e2ad60c 100644
--- a/rpkid/ext/POW.c
+++ b/rpkid/ext/POW.c
@@ -564,50 +564,61 @@ set_openssl_ssl_exception(const ssl_object *self, const int ret)
}
static PyObject *
-X509_object_helper_set_name(X509_NAME *name, PyObject *name_sequence)
+X509_object_helper_set_name(X509_NAME *name, PyObject *dn_obj)
{
+ PyObject *rdn_obj = NULL;
PyObject *pair_obj = NULL;
PyObject *type_obj = NULL;
PyObject *value_obj = NULL;
char *type_str, *value_str;
- int asn1_type, i;
+ int asn1_type, i, j;
- for (i = 0; i < PySequence_Size(name_sequence); i++) {
+ for (i = 0; i < PySequence_Size(dn_obj); i++) {
- if ((pair_obj = PySequence_GetItem(name_sequence, i)) == NULL)
+ if ((rdn_obj = PySequence_GetItem(dn_obj, i)) == NULL)
goto error;
- if (!PySequence_Check(pair_obj) || PySequence_Size(pair_obj) != 2)
- lose_type_error("each name entry must be a two-element sequence");
+ if (!PySequence_Check(rdn_obj) || PySequence_Size(rdn_obj) == 0)
+ lose_type_error("each RDN must be a sequence with at least one element");
- if ((type_obj = PySequence_GetItem(pair_obj, 0)) == NULL ||
- (type_str = PyString_AsString(type_obj)) == NULL ||
- (value_obj = PySequence_GetItem(pair_obj, 1)) == NULL ||
- (value_str = PyString_AsString(value_obj)) == NULL)
- goto error;
+ for (j = 0; j < PySequence_Size(rdn_obj); j++) {
+
+ if ((pair_obj = PySequence_GetItem(rdn_obj, j)) == NULL)
+ goto error;
+
+ if (!PySequence_Check(pair_obj) || PySequence_Size(pair_obj) != 2)
+ lose_type_error("each name entry must be a two-element sequence");
+
+ if ((type_obj = PySequence_GetItem(pair_obj, 0)) == NULL ||
+ (type_str = PyString_AsString(type_obj)) == NULL ||
+ (value_obj = PySequence_GetItem(pair_obj, 1)) == NULL ||
+ (value_str = PyString_AsString(value_obj)) == NULL)
+ goto error;
- if ((asn1_type = ASN1_PRINTABLE_type(value_str, -1)) != V_ASN1_PRINTABLESTRING)
- asn1_type = V_ASN1_UTF8STRING;
+ if ((asn1_type = ASN1_PRINTABLE_type(value_str, -1)) != V_ASN1_PRINTABLESTRING)
+ asn1_type = V_ASN1_UTF8STRING;
- if (!X509_NAME_add_entry_by_txt(name, type_str, asn1_type,
- value_str, strlen(value_str), -1, 0))
- lose("unable to add name entry");
+ if (!X509_NAME_add_entry_by_txt(name, type_str, asn1_type,
+ value_str, strlen(value_str), -1, j > 0))
+ lose("unable to add name entry");
- Py_XDECREF(pair_obj);
- Py_XDECREF(type_obj);
- Py_XDECREF(value_obj);
+ Py_XDECREF(pair_obj);
+ Py_XDECREF(type_obj);
+ Py_XDECREF(value_obj);
+ pair_obj = type_obj = value_obj = NULL;
+ }
- pair_obj = type_obj = value_obj = NULL;
+ Py_XDECREF(rdn_obj);
+ rdn_obj = NULL;
}
Py_RETURN_NONE;
error:
-
+ Py_XDECREF(rdn_obj);
Py_XDECREF(pair_obj);
Py_XDECREF(type_obj);
Py_XDECREF(value_obj);
-
return NULL;
}
@@ -629,6 +640,9 @@ X509_object_helper_get_name(X509_NAME *name, int format)
if ((entry = X509_NAME_get_entry(name, i)) == NULL)
lose("could not get certificate name");
+ if (entry->set != i)
+ lose("sorry, this code does not support multi-value RDNs yet");
+
switch (format) {
case SHORTNAME_FORMAT:
oid = OBJ_nid2sn(OBJ_obj2nid(entry->object));
@@ -649,7 +663,7 @@ X509_object_helper_get_name(X509_NAME *name, int format)
oid = oidbuf;
}
- if ((item = Py_BuildValue("ss#", oid, entry->value->data, entry->value->length)) == NULL)
+ if ((item = Py_BuildValue("((ss#))", oid, entry->value->data, entry->value->length)) == NULL)
goto error;
PyTuple_SET_ITEM(result, i, item);