aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--rpkid/ext/POW.c107
1 files changed, 64 insertions, 43 deletions
diff --git a/rpkid/ext/POW.c b/rpkid/ext/POW.c
index 1d7cb73c..82cbd12b 100644
--- a/rpkid/ext/POW.c
+++ b/rpkid/ext/POW.c
@@ -692,8 +692,9 @@ BIO_to_PyString_helper(BIO *bio)
* Do not read after eating.
*/
static ASN1_INTEGER *
-Python_Long_to_ASN1_INTEGER(PyObject *py_long)
+Python_Long_to_ASN1_INTEGER(PyObject *arg)
{
+ PyObject *obj = NULL;
ASN1_INTEGER *a = NULL;
unsigned char buf[RAW_ASNUMBER_BUFLEN];
unsigned char *b = buf;
@@ -701,9 +702,13 @@ Python_Long_to_ASN1_INTEGER(PyObject *py_long)
memset(buf, 0, sizeof(buf));
- if (_PyLong_AsByteArray((PyLongObject *) py_long, buf, sizeof(buf), 0, 0) < 0)
+ if ((obj = PyNumber_Long(arg)) == NULL ||
+ _PyLong_AsByteArray((PyLongObject *) obj, buf, sizeof(buf), 0, 0) < 0)
goto error;
+ Py_XDECREF(obj);
+ obj = NULL;
+
while (b < buf + sizeof(buf) - 1 && *b == 0)
b++;
len = buf + sizeof(buf) - b;
@@ -722,6 +727,7 @@ Python_Long_to_ASN1_INTEGER(PyObject *py_long)
return a;
error:
+ Py_XDECREF(obj);
ASN1_INTEGER_free(a);
return NULL;
}
@@ -1060,7 +1066,7 @@ static PyNumberMethods ipaddress_NumberMethods = {
static PyTypeObject ipaddresstype = {
PyObject_HEAD_INIT(NULL)
0, /* ob_size */
- "_POW.IPAddress", /* tp_name */
+ "POW.IPAddress", /* tp_name */
sizeof(ipaddress_object), /* tp_basicsize */
0, /* tp_itemsize */
0, /* tp_dealloc */
@@ -1961,14 +1967,33 @@ x509_object_get_rfc3779(x509_object *self)
for (j = 0; j < sk_IPAddressOrRange_num(f->ipAddressChoice->u.addressesOrRanges); j++) {
IPAddressOrRange *aor = sk_IPAddressOrRange_value(f->ipAddressChoice->u.addressesOrRanges,
j);
- unsigned char b_buf[RAW_IPADDR_BUFLEN], e_buf[RAW_IPADDR_BUFLEN];
+ ipaddress_object *addr_b = NULL;
+ ipaddress_object *addr_e = NULL;
+
+ if ((range_b = ipaddresstype.tp_alloc(&ipaddresstype, 0)) == NULL ||
+ (range_e = ipaddresstype.tp_alloc(&ipaddresstype, 0)) == NULL)
+ goto error;
- if ((addr_len = v3_addr_get_range(aor, afi, b_buf, e_buf, RAW_IPADDR_BUFLEN)) == 0)
+ addr_b = (ipaddress_object *) range_b;
+ addr_e = (ipaddress_object *) range_e;
+
+ if ((addr_len = v3_addr_get_range(aor, afi, addr_b->address, addr_e->address, sizeof(addr_b->address))) == 0)
lose_type_error("Couldn't unpack IP addresses from BIT STRINGs");
- if ((range_b = _PyLong_FromByteArray(b_buf, addr_len, 0, 0)) == NULL ||
- (range_e = _PyLong_FromByteArray(e_buf, addr_len, 0, 0)) == NULL ||
- (range = Py_BuildValue("(NN)", range_b, range_e)) == NULL)
+ switch (afi) {
+ case IANA_AFI_IPV4:
+ addr_b->version = addr_e->version = 4;
+ addr_b->length = addr_e->length = 4;
+ addr_b->af = addr_e->af = AF_INET;
+ break;
+ case IANA_AFI_IPV6:
+ addr_b->version = addr_e->version = 6;
+ addr_b->length = addr_e->length = 16;
+ addr_b->af = addr_e->af = AF_INET6;
+ break;
+ }
+
+ if ((range = Py_BuildValue("(NN)", range_b, range_e)) == NULL)
goto error;
PyTuple_SET_ITEM(*result_obj, j, range);
@@ -2014,6 +2039,10 @@ x509_object_set_rfc3779(x509_object *self, PyObject *args, PyObject *kwds)
PyObject *range_e = NULL;
ASIdentifiers *asid = NULL;
IPAddrBlocks *addr = NULL;
+ ASN1_INTEGER *asid_b = NULL;
+ ASN1_INTEGER *asid_e = NULL;
+ ipaddress_object *addr_b = NULL;
+ ipaddress_object *addr_e = NULL;
if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OOO", kwlist, &asn_arg, &ipv4_arg, &ipv6_arg))
goto error;
@@ -2037,37 +2066,26 @@ x509_object_set_rfc3779(x509_object *self, PyObject *args, PyObject *kwds)
goto error;
while ((item = PyIter_Next(iterator)) != NULL) {
- ASN1_INTEGER *b = NULL;
- ASN1_INTEGER *e = NULL;
if (!PyArg_ParseTuple(item, "OO", &range_b, &range_e) ||
- !PyLong_Check(range_b) ||
- !PyLong_Check(range_e))
- lose_type_error("ASID must be sequence of range pairs, or \"inherit\"");
-
- if ((b = Python_Long_to_ASN1_INTEGER(range_b)) == NULL)
+ (asid_b = Python_Long_to_ASN1_INTEGER(range_b)) == NULL)
goto error;
switch (PyObject_RichCompareBool(range_b, range_e, Py_EQ)) {
case 0:
- if ((e = Python_Long_to_ASN1_INTEGER(range_e)) == NULL) {
- ASN1_INTEGER_free(b);
+ if ((asid_e = Python_Long_to_ASN1_INTEGER(range_e)) == NULL)
goto error;
- }
+ break;
case 1:
break;
default:
- ASN1_INTEGER_free(b);
- lose_type_error("Couldn't compare range values");
+ goto error;
}
- if (!v3_asid_add_id_or_range(asid, V3_ASID_ASNUM, b, e)) {
- ASN1_INTEGER_free(b);
- ASN1_INTEGER_free(e);
+ if (!v3_asid_add_id_or_range(asid, V3_ASID_ASNUM, asid_b, asid_e))
lose_openssl_error("Couldn't add range to ASID");
- }
- b = e = NULL;
+ asid_b = asid_e = NULL;
Py_XDECREF(item);
item = range_b = range_e = NULL;
}
@@ -2119,26 +2137,27 @@ x509_object_set_rfc3779(x509_object *self, PyObject *args, PyObject *kwds)
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))
+ goto error;
- 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\"");
+ addr_b = (ipaddress_object *) range_b;
+ addr_e = (ipaddress_object *) range_e;
- 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 (!POW_IPAddress_Check(range_b) ||
+ !POW_IPAddress_Check(range_e) ||
+ addr_b->version != addr_e->version ||
+ addr_b->length != len ||
+ addr_e->length != len ||
+ memcmp(addr_b->address, addr_e->address, addr_b->length) > 0)
+ lose_type_error("IPAddrBlock must be sequence of address pairs, or \"inherit\"");
- if (!v3_addr_add_range(addr, afi, NULL, b_buf, e_buf))
+ if (!v3_addr_add_range(addr, afi, NULL, addr_b->address, addr_e->address))
lose_openssl_error("Couldn't add range to IPAddrBlock");
Py_XDECREF(item);
item = range_b = range_e = NULL;
+ addr_b = addr_e = NULL;
}
Py_XDECREF(iterator);
@@ -2155,6 +2174,8 @@ x509_object_set_rfc3779(x509_object *self, PyObject *args, PyObject *kwds)
Py_RETURN_NONE;
error:
+ ASN1_INTEGER_free(asid_b);
+ ASN1_INTEGER_free(asid_e);
ASIdentifiers_free(asid);
sk_IPAddressFamily_pop_free(addr, IPAddressFamily_free);
Py_XDECREF(iterator);
@@ -2232,7 +2253,7 @@ static char x509type__doc__[] =
static PyTypeObject x509type = {
PyObject_HEAD_INIT(0)
0, /* ob_size */
- "_POW.X509", /* tp_name */
+ "POW.X509", /* tp_name */
sizeof(x509_object), /* tp_basicsize */
0, /* tp_itemsize */
(destructor)x509_object_dealloc, /* tp_dealloc */
@@ -2505,7 +2526,7 @@ static char x509_storetype__doc__[] =
static PyTypeObject x509_storetype = {
PyObject_HEAD_INIT(0)
0, /* ob_size */
- "_POW.X509Store", /* tp_name */
+ "POW.X509Store", /* tp_name */
sizeof(x509_store_object), /* tp_basicsize */
0, /* tp_itemsize */
(destructor)x509_store_object_dealloc, /* tp_dealloc */
@@ -3197,7 +3218,7 @@ static char x509_crltype__doc__[] =
static PyTypeObject x509_crltype = {
PyObject_HEAD_INIT(0)
0, /* ob_size */
- "_POW.X509Crl", /* tp_name */
+ "POW.X509Crl", /* tp_name */
sizeof(x509_crl_object), /* tp_basicsize */
0, /* tp_itemsize */
(destructor)x509_crl_object_dealloc, /* tp_dealloc */
@@ -3595,7 +3616,7 @@ static char asymmetrictype__doc__[] =
static PyTypeObject asymmetrictype = {
PyObject_HEAD_INIT(0)
0, /* ob_size */
- "_POW.Asymmetric", /* tp_name */
+ "POW.Asymmetric", /* tp_name */
sizeof(asymmetric_object), /* tp_basicsize */
0, /* tp_itemsize */
(destructor)asymmetric_object_dealloc, /* tp_dealloc */
@@ -3789,7 +3810,7 @@ static char digesttype__doc__[] =
static PyTypeObject digesttype = {
PyObject_HEAD_INIT(0)
0, /* ob_size */
- "_POW.Digest", /* tp_name */
+ "POW.Digest", /* tp_name */
sizeof(digest_object), /* tp_basicsize */
0, /* tp_itemsize */
(destructor)digest_object_dealloc, /* tp_dealloc */
@@ -4369,7 +4390,7 @@ static char cmstype__doc__[] =
static PyTypeObject cmstype = {
PyObject_HEAD_INIT(0)
0, /* ob_size */
- "_POW.CMS", /* tp_name */
+ "POW.CMS", /* tp_name */
sizeof(cms_object), /* tp_basicsize */
0, /* tp_itemsize */
(destructor)cms_object_dealloc, /* tp_dealloc */