aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Austein <sra@hactrn.net>2012-09-12 13:59:01 +0000
committerRob Austein <sra@hactrn.net>2012-09-12 13:59:01 +0000
commitc659199ed5b01816ceb09f0cf54a4d95b778de3e (patch)
tree5582ed9b4e92a3ae62f1802517d925c275a45df4
parent5920d57f472709c34a96839aab748b924291812f (diff)
Checkpoint
svn path=/branches/tk274/; revision=4711
-rw-r--r--rpkid/ext/POW.c64
1 files changed, 62 insertions, 2 deletions
diff --git a/rpkid/ext/POW.c b/rpkid/ext/POW.c
index fff82b7a..3016a7f1 100644
--- a/rpkid/ext/POW.c
+++ b/rpkid/ext/POW.c
@@ -1685,7 +1685,7 @@ x509_object_set_rfc3779(x509_object *self, PyObject *args, PyObject *kwds)
b = e = NULL;
Py_XDECREF(item);
- item = NULL;
+ item = range_b = range_e = NULL;
}
if (!v3_asid_canonize(asid) ||
@@ -1698,12 +1698,72 @@ x509_object_set_rfc3779(x509_object *self, PyObject *args, PyObject *kwds)
}
}
- if (ipv4_arg != Py_None || ipv6_arg != Py_None) {
+ /*
+ * Will almost certainly need to split this up into multiple functions.
+ * For the moment, just inline IPv4 case, refactor later.
+ */
+
+ if (ipv4_arg != Py_None /* || ipv6_arg != Py_None */ ) {
+
+ if ((addr = sk_IPAddressFamily_new_null()) == NULL)
+ lose_no_memory();
+
+ {
+ int afi = IANA_AFI_IPV4;
+ int len = 4;
+
+ if (PyString_Check(asn_arg)) {
+
+ if (strcmp(PyString_AsString(ipv4_arg), "inherit"))
+ lose_type_error("IPv4 argument must be sequence of range pairs, or \"inherit\"");
+
+ if (!v3_addr_add_inherit(addr, afi, NULL))
+ lose_no_memory();
+
+ } else {
+
+ if ((iterator = PyObject_GetIter(ipv4_arg)) == NULL)
+ goto error;
+
+ while ((item = PyIter_Next(iterator)) != NULL) {
+ unsigned char b_buf[RAW_IPADDR_BUFLEN], e_buf[RAW_IPADDR_BUFLEN];
+
+ memset(b_buf, 0, sizeof(b_buf));
+ memset(e_buf, 0, sizeof(e_buf));
+
+ if (!PyArg_ParseTuple(item, "OO", &range_b, &range_e) ||
+ !PyLong_Check(range_b) ||
+ !PyLong_Check(range_e) ||
+ PyObject_RichCompareBool(range_b, range_e, Py_LE) != 1)
+ lose_type_error("IPAddrBlock must be sequence of range pairs, or \"inherit\"");
+
+ if (_PyLong_AsByteArray((PyLongObject *) range_b, b_buf, len, 0, 0) < 0 ||
+ _PyLong_AsByteArray((PyLongObject *) range_e, e_buf, len, 0, 0) < 0)
+ goto error;
+
+ if (!v3_addr_add_range(addr, afi, NULL, b_buf, e_buf))
+ lose_openssl_error("Couldn't add range to IPAddrBlock");
+
+ Py_XDECREF(item);
+ item = range_b = range_e = NULL;
+ }
+
+ Py_XDECREF(iterator);
+ iterator = NULL;
+ }
+ }
+
+ if (!v3_addr_canonize(addr) ||
+ !X509_add1_ext_i2d(self->x509, NID_sbgp_ipAddrBlock,
+ addr, 1, X509V3_ADD_REPLACE))
+ lose_openssl_error("Couldn't add IPAddrBlock extension to certificate");
}
Py_RETURN_NONE;
error:
+ ASIdentifiers_free(asid);
+ sk_IPAddressFamily_pop_free(addr, IPAddressFamily_free);
Py_XDECREF(iterator);
Py_XDECREF(item);
return NULL;