diff options
-rw-r--r-- | h/rpki/sk_manifest.h | 2 | ||||
-rw-r--r-- | h/rpki/sk_roa.h | 2 | ||||
-rw-r--r-- | rpkid/ext/POW.c | 706 | ||||
-rw-r--r-- | rpkid/rpki/x509.py | 93 |
4 files changed, 624 insertions, 179 deletions
diff --git a/h/rpki/sk_manifest.h b/h/rpki/sk_manifest.h index 01bcb15f..ead7cbe4 100644 --- a/h/rpki/sk_manifest.h +++ b/h/rpki/sk_manifest.h @@ -1,6 +1,6 @@ /* * Automatically generated, do not edit. - * Generator $Id: defstack.awk 3985 2011-09-15 00:04:23Z sra $ + * Generator $Id: defstack.py 4725 2012-09-19 21:28:34Z sra $ */ #ifndef __RPKI_MANIFEST_H__DEFSTACK_H__ diff --git a/h/rpki/sk_roa.h b/h/rpki/sk_roa.h index 6232b5a8..cb5c5e17 100644 --- a/h/rpki/sk_roa.h +++ b/h/rpki/sk_roa.h @@ -1,6 +1,6 @@ /* * Automatically generated, do not edit. - * Generator $Id: defstack.awk 3985 2011-09-15 00:04:23Z sra $ + * Generator $Id: defstack.py 4725 2012-09-19 21:28:34Z sra $ */ #ifndef __RPKI_ROA_H__DEFSTACK_H__ diff --git a/rpkid/ext/POW.c b/rpkid/ext/POW.c index b0a4dea6..7ab7b0b4 100644 --- a/rpkid/ext/POW.c +++ b/rpkid/ext/POW.c @@ -303,9 +303,15 @@ typedef struct { */ #if 0 -#define KVETCH(_msg_) write(2, _msg_ "\n", sizeof(_msg_)) +#define KVETCH(_msg_) write(2, _msg_ "\n", sizeof(_msg_)) #else -#define KVETCH(_msg_) +#define KVETCH(_msg_) ((void) 0) +#endif + +#if 0 +#define ENTERING(_name_) KVETCH("Entering " #_name_ "()") +#else +#define ENTERING(_name_) ((void) 0) #endif /* @@ -903,6 +909,23 @@ create_missing_nids(void) return 1; } +static PyObject * +ASN1_OBJECT_to_PyString(const ASN1_OBJECT *oid) +{ + PyObject *result = NULL; + char buf[512]; + + ENTERING(ASN1_OBJECT_to_PyString); + + if (OBJ_obj2txt(buf, sizeof(buf), oid, 1) <= 0) + lose_openssl_error("Couldn't translate OID"); + + result = PyString_FromString(buf); + + error: + return result; +} + /* @@ -1289,6 +1312,8 @@ x509_object_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { x509_object *self; + ENTERING(x509_object_new); + if ((self = (x509_object *) type->tp_alloc(type, 0)) != NULL && (self->x509 = X509_new()) != NULL) return (PyObject *) self; @@ -1297,17 +1322,25 @@ x509_object_new(PyTypeObject *type, PyObject *args, PyObject *kwds) return NULL; } +static void +x509_object_dealloc(x509_object *self) +{ + ENTERING(x509_object_dealloc); + X509_free(self->x509); + self->ob_type->tp_free((PyObject*) self); +} + static PyObject * x509_object_pem_read_helper(PyTypeObject *type, BIO *bio) { x509_object *self = NULL; + ENTERING(x509_object_pem_read_helper); + if ((self = (x509_object *) x509_object_new(type, NULL, NULL)) == NULL) goto error; - X509_free(self->x509); - - if ((self->x509 = PEM_read_bio_X509(bio, NULL, NULL, NULL)) == NULL) + if (!PEM_read_bio_X509(bio, &self->x509, NULL, NULL)) lose_openssl_error("Couldn't load PEM encoded certificate"); return (PyObject *) self; @@ -1323,6 +1356,8 @@ x509_object_der_read_helper(PyTypeObject *type, BIO *bio) { x509_object *self; + ENTERING(x509_object_der_read_helper); + if ((self = (x509_object *) x509_object_new(type, NULL, NULL)) == NULL) goto error; @@ -1343,6 +1378,7 @@ static char x509_object_pem_read__doc__[] = static PyObject * x509_object_pem_read(PyTypeObject *type, PyObject *args) { + ENTERING(x509_object_pem_read); return read_from_string_helper(x509_object_pem_read_helper, type, args); } @@ -1353,6 +1389,7 @@ static char x509_object_pem_read_file__doc__[] = static PyObject * x509_object_pem_read_file(PyTypeObject *type, PyObject *args) { + ENTERING(x509_object_pem_read_file); return read_from_file_helper(x509_object_pem_read_helper, type, args); } @@ -1363,6 +1400,7 @@ static char x509_object_der_read__doc__[] = static PyObject * x509_object_der_read(PyTypeObject *type, PyObject *args) { + ENTERING(x509_object_der_read); return read_from_string_helper(x509_object_der_read_helper, type, args); } @@ -1373,6 +1411,7 @@ static char x509_object_der_read_file__doc__[] = static PyObject * x509_object_der_read_file(PyTypeObject *type, PyObject *args) { + ENTERING(x509_object_der_read_file); return read_from_file_helper(x509_object_der_read_helper, type, args); } @@ -1386,6 +1425,8 @@ x509_object_pem_write(x509_object *self) PyObject *result = NULL; BIO *bio = NULL; + ENTERING(x509_object_pem_write); + if ((bio = BIO_new(BIO_s_mem())) == NULL) lose_no_memory(); @@ -1409,6 +1450,8 @@ x509_object_der_write(x509_object *self) PyObject *result = NULL; BIO *bio = NULL; + ENTERING(x509_object_der_write); + if ((bio = BIO_new(BIO_s_mem())) == NULL) lose_no_memory(); @@ -1432,6 +1475,8 @@ x509_object_get_public_key(x509_object *self) PyTypeObject *type = &POW_Asymmetric_Type; asymmetric_object *asym = NULL; + ENTERING(x509_object_get_public_key); + if ((asym = (asymmetric_object *) type->tp_alloc(type, 0)) == NULL) goto error; @@ -1456,6 +1501,8 @@ x509_object_set_public_key(x509_object *self, PyObject *args) { asymmetric_object *asym; + ENTERING(x509_object_set_public_key); + if (!PyArg_ParseTuple(args, "O!", &POW_Asymmetric_Type, &asym)) goto error; @@ -1494,6 +1541,8 @@ x509_object_sign(x509_object *self, PyObject *args) int digest_type = SHA256_DIGEST; const EVP_MD *digest_method = NULL; + ENTERING(x509_object_sign); + if (!PyArg_ParseTuple(args, "O!|i", &POW_Asymmetric_Type, &asym, &digest_type)) goto error; @@ -1516,6 +1565,7 @@ static char x509_object_get_version__doc__[] = static PyObject * x509_object_get_version(x509_object *self) { + ENTERING(x509_object_get_version); return Py_BuildValue("l", X509_get_version(self->x509)); } @@ -1529,6 +1579,8 @@ x509_object_set_version(x509_object *self, PyObject *args) { long version = 0; + ENTERING(x509_object_set_version); + if (!PyArg_ParseTuple(args, "l", &version)) goto error; @@ -1549,6 +1601,7 @@ static char x509_object_get_serial__doc__[] = static PyObject * x509_object_get_serial(x509_object *self) { + ENTERING(x509_object_get_serial); return Py_BuildValue("N", ASN1_INTEGER_to_PyLong(X509_get_serialNumber(self->x509))); } @@ -1563,6 +1616,8 @@ x509_object_set_serial(x509_object *self, PyObject *args) ASN1_INTEGER *a_serial = NULL; PyObject *p_serial = NULL; + ENTERING(x509_object_set_serial); + if (!PyArg_ParseTuple(args, "O", &p_serial) || (a_serial = PyLong_to_ASN1_INTEGER(p_serial)) == NULL) goto error; @@ -1606,6 +1661,8 @@ x509_object_get_issuer(x509_object *self, PyObject *args) PyObject *result = NULL; int format = OIDNAME_FORMAT; + ENTERING(x509_object_get_issuer); + if (!PyArg_ParseTuple(args, "|i", &format)) goto error; @@ -1628,6 +1685,8 @@ x509_object_get_subject(x509_object *self, PyObject *args) PyObject *result = NULL; int format = OIDNAME_FORMAT; + ENTERING(x509_object_get_subject); + if (!PyArg_ParseTuple(args, "|i", &format)) goto error; @@ -1650,6 +1709,8 @@ x509_object_set_subject(x509_object *self, PyObject *args) PyObject *name_sequence = NULL; X509_NAME *name = NULL; + ENTERING(x509_object_set_subject); + if (!PyArg_ParseTuple(args, "O", &name_sequence)) goto error; @@ -1683,6 +1744,8 @@ x509_object_set_issuer(x509_object *self, PyObject *args) PyObject *name_sequence = NULL; X509_NAME *name = NULL; + ENTERING(x509_object_set_issuer); + if (!PyArg_ParseTuple(args, "O", &name_sequence)) goto error; @@ -1715,6 +1778,7 @@ static char x509_object_get_not_before__doc__[] = static PyObject * x509_object_get_not_before (x509_object *self) { + ENTERING(x509_object_get_not_before); return ASN1_TIME_to_Python(X509_get_notBefore(self->x509)); } @@ -1729,6 +1793,7 @@ static char x509_object_get_not_after__doc__[] = static PyObject * x509_object_get_not_after (x509_object *self) { + ENTERING(x509_object_get_not_after); return ASN1_TIME_to_Python(X509_get_notAfter(self->x509)); } @@ -1747,6 +1812,8 @@ x509_object_set_not_after (x509_object *self, PyObject *args) char *s = NULL; ASN1_TIME *t = NULL; + ENTERING(x509_object_set_not_after); + if (!PyArg_ParseTuple(args, "s", &s)) goto error; @@ -1779,6 +1846,8 @@ x509_object_set_not_before (x509_object *self, PyObject *args) char *s = NULL; ASN1_TIME *t = NULL; + ENTERING(x509_object_set_not_before); + if (!PyArg_ParseTuple(args, "s", &s)) goto error; @@ -1825,6 +1894,8 @@ x509_object_add_extension(x509_object *self, PyObject *args) ASN1_OCTET_STRING *octetString = NULL; X509_EXTENSION *ext = NULL; + ENTERING(x509_object_add_extension); + if (!PyArg_ParseTuple(args, "sOs#", &name, &critical, &buf, &len)) goto error; @@ -1864,6 +1935,8 @@ x509_object_clear_extensions(x509_object *self) { X509_EXTENSION *ext; + ENTERING(x509_object_clear_extensions); + while ((ext = X509_delete_ext(self->x509, 0)) != NULL) X509_EXTENSION_free(ext); @@ -1877,6 +1950,7 @@ static char x509_object_count_extensions__doc__[] = static PyObject * x509_object_count_extensions(x509_object *self) { + ENTERING(x509_object_count_extensions); return Py_BuildValue("i", X509_get_ext_count(self->x509)); } @@ -1895,6 +1969,8 @@ x509_object_get_extension(x509_object *self, PyObject *args) char oid[512]; int slot = 0; + ENTERING(x509_object_get_extension); + if (!PyArg_ParseTuple(args, "i", &slot)) goto error; @@ -1921,6 +1997,8 @@ static char x509_object_get_ski__doc__[] = static PyObject * x509_object_get_ski(x509_object *self, PyObject *args) { + ENTERING(x509_object_get_ski); + (void) X509_check_ca(self->x509); /* Calls x509v3_cache_extensions() */ if (self->x509->skid == NULL) @@ -1943,6 +2021,8 @@ x509_object_set_ski(x509_object *self, PyObject *args) const unsigned char *buf = NULL; int len, ok = 0; + ENTERING(x509_object_set_ski); + if (!PyArg_ParseTuple(args, "s#", &buf, &len)) goto error; @@ -1978,6 +2058,8 @@ static char x509_object_get_aki__doc__[] = static PyObject * x509_object_get_aki(x509_object *self, PyObject *args) { + ENTERING(x509_object_get_aki); + (void) X509_check_ca(self->x509); /* Calls x509v3_cache_extensions() */ if (self->x509->akid == NULL || self->x509->akid->keyid == NULL) @@ -2001,6 +2083,8 @@ x509_object_set_aki(x509_object *self, PyObject *args) const unsigned char *buf = NULL; int len, ok = 0; + ENTERING(x509_object_set_aki); + if (!PyArg_ParseTuple(args, "s#", &buf, &len)) goto error; @@ -2042,6 +2126,8 @@ x509_object_get_key_usage(x509_object *self) PyObject *result = NULL; PyObject *token = NULL; + ENTERING(x509_object_get_key_usage); + if ((ext = X509_get_ext_d2i(self->x509, NID_key_usage, NULL, NULL)) == NULL) Py_RETURN_NONE; @@ -2091,6 +2177,8 @@ x509_object_set_key_usage(x509_object *self, PyObject *args) const char *t; int ok = 0; + ENTERING(x509_object_set_key_usage); + if ((ext = ASN1_BIT_STRING_new()) == NULL) lose_no_memory(); @@ -2157,6 +2245,8 @@ x509_object_get_rfc3779(x509_object *self) IPAddrBlocks *addr = NULL; int i, j; + ENTERING(x509_object_get_rfc3779); + if ((asid = X509_get_ext_d2i(self->x509, NID_sbgp_autonomousSysNum, NULL, NULL)) != NULL) { switch (asid->asnum->type) { @@ -2326,6 +2416,8 @@ x509_object_set_rfc3779(x509_object *self, PyObject *args, PyObject *kwds) ipaddress_object *addr_b = NULL; ipaddress_object *addr_e = NULL; + ENTERING(x509_object_set_rfc3779); + if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OOO", kwlist, &asn_arg, &ipv4_arg, &ipv6_arg)) goto error; @@ -2480,6 +2572,8 @@ x509_object_get_basic_constraints(x509_object *self) BASIC_CONSTRAINTS *ext = NULL; PyObject *result; + ENTERING(x509_object_get_basic_constraints); + if ((ext = X509_get_ext_d2i(self->x509, NID_basic_constraints, NULL, NULL)) == NULL) Py_RETURN_NONE; @@ -2517,6 +2611,8 @@ x509_object_set_basic_constraints(x509_object *self, PyObject *args) long pathlen = -1; int ok = 0; + ENTERING(x509_object_set_basic_constraints); + if (!PyArg_ParseTuple(args, "O|OO", &is_ca, &pathlen_obj, &critical)) goto error; @@ -2572,6 +2668,8 @@ x509_object_get_sia(x509_object *self) PyObject *obj; int i, nid; + ENTERING(x509_object_get_sia); + if ((ext = X509_get_ext_d2i(self->x509, NID_sinfo_access, NULL, NULL)) == NULL) Py_RETURN_NONE; @@ -2668,6 +2766,8 @@ x509_object_set_sia(x509_object *self, PyObject *args) Py_ssize_t urilen; char *uri; + ENTERING(x509_object_set_sia); + if (!PyArg_ParseTuple(args, "OOO", &caRepository, &rpkiManifest, &signedObject)) goto error; @@ -2755,6 +2855,8 @@ x509_object_get_aia(x509_object *self) PyObject *obj; int i, n = 0; + ENTERING(x509_object_get_aia); + if ((ext = X509_get_ext_d2i(self->x509, NID_info_access, NULL, NULL)) == NULL) Py_RETURN_NONE; @@ -2807,6 +2909,8 @@ x509_object_set_aia(x509_object *self, PyObject *args) Py_ssize_t urilen; char *uri; + ENTERING(x509_object_set_aia); + if (!PyArg_ParseTuple(args, "O", &caIssuers)) goto error; @@ -2879,6 +2983,8 @@ x509_object_get_crldp(x509_object *self) PyObject *obj; int i, n = 0; + ENTERING(x509_object_get_crldp); + if ((ext = X509_get_ext_d2i(self->x509, NID_crl_distribution_points, NULL, NULL)) == NULL || (dp = sk_DIST_POINT_value(ext, 0)) == NULL || dp->distpoint == NULL || @@ -2933,6 +3039,8 @@ x509_object_set_crldp(x509_object *self, PyObject *args) char *uri; int ok = 0; + ENTERING(x509_object_set_crldp); + if (!PyArg_ParseTuple(args, "O", &fullNames)) goto error; @@ -3008,6 +3116,8 @@ x509_object_get_certificate_policies(x509_object *self) PyObject *obj; int i; + ENTERING(x509_object_get_certificate_policies); + if ((ext = X509_get_ext_d2i(self->x509, NID_certificate_policies, NULL, NULL)) == NULL) Py_RETURN_NONE; @@ -3016,12 +3126,8 @@ x509_object_get_certificate_policies(x509_object *self) for (i = 0; i < sk_POLICYINFO_num(ext); i++) { POLICYINFO *p = sk_POLICYINFO_value(ext, i); - char oid[512]; - if (OBJ_obj2txt(oid, sizeof(oid), p->policyid, 1) <= 0) - lose_openssl_error("Couldn't translate OID"); - - if ((obj = PyString_FromString(oid)) == NULL) + if ((obj = ASN1_OBJECT_to_PyString(p->policyid)) == NULL) goto error; PyTuple_SET_ITEM(result, i, obj); @@ -3052,6 +3158,8 @@ x509_object_set_certificate_policies(x509_object *self, PyObject *args) const char *oid; int ok = 0; + ENTERING(x509_object_set_certificate_policies); + if (!PyArg_ParseTuple(args, "O", &policies)) goto error; @@ -3114,6 +3222,8 @@ x509_object_pprint(x509_object *self) PyObject *result = NULL; BIO *bio = NULL; + ENTERING(x509_object_pprint); + if ((bio = BIO_new(BIO_s_mem())) == NULL) lose_no_memory(); @@ -3175,13 +3285,6 @@ static struct PyMethodDef x509_object_methods[] = { {NULL} }; -static void -x509_object_dealloc(x509_object *self) -{ - X509_free(self->x509); - self->ob_type->tp_free((PyObject*) self); -} - static char POW_X509_Type__doc__[] = "This class represents an X.509 certificate.\n" "\n" @@ -3241,6 +3344,8 @@ x509_store_object_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { x509_store_object *self = NULL; + ENTERING(x509_store_object_new); + if ((self = (x509_store_object *) type->tp_alloc(type, 0)) != NULL && (self->store = X509_STORE_new()) != NULL) return (PyObject *) self; @@ -3249,6 +3354,14 @@ x509_store_object_new(PyTypeObject *type, PyObject *args, PyObject *kwds) return NULL; } +static void +x509_store_object_dealloc(x509_store_object *self) +{ + ENTERING(x509_store_object_dealloc); + X509_STORE_free(self->store); + self->ob_type->tp_free((PyObject*) self); +} + #if ENABLE_X509_CERTIFICATE_SIGNATURE_AND_VERIFICATION #warning Check X509_verify_cert options /* @@ -3289,7 +3402,6 @@ x509_store_object_verify(x509_store_object *self, PyObject *args) return PyBool_FromLong(ok); error: - return NULL; } @@ -3320,9 +3432,7 @@ x509_store_object_verify_chain(x509_store_object *self, PyObject *args) goto error; X509_STORE_CTX_init(&ctx, self->store, x509->x509, x509_stack); - ok = X509_verify_cert(&ctx) == 1; - X509_STORE_CTX_cleanup(&ctx); sk_X509_free(x509_stack); @@ -3371,11 +3481,8 @@ x509_store_object_verify_detailed(x509_store_object *self, PyObject *args) goto error; X509_STORE_CTX_init(&ctx, self->store, x509->x509, x509_stack); - ok = X509_verify_cert(&ctx) == 1; - result = Py_BuildValue("(iii)", ok, ctx.error, ctx.error_depth); - X509_STORE_CTX_cleanup(&ctx); error: /* fall through */ @@ -3400,6 +3507,8 @@ x509_store_object_add_trust(x509_store_object *self, PyObject *args) { x509_object *x509 = NULL; + ENTERING(x509_store_object_add_trust); + if (!PyArg_ParseTuple(args, "O!", &POW_X509_Type, &x509)) goto error; @@ -3423,6 +3532,8 @@ x509_store_object_add_crl(x509_store_object *self, PyObject *args) { crl_object *crl = NULL; + ENTERING(x509_store_object_add_crl); + if (!PyArg_ParseTuple(args, "O!", &POW_CRL_Type, &crl)) goto error; @@ -3446,13 +3557,6 @@ static struct PyMethodDef x509_store_object_methods[] = { {NULL} }; -static void -x509_store_object_dealloc(x509_store_object *self) -{ - X509_STORE_free(self->store); - self->ob_type->tp_free((PyObject*) self); -} - static char POW_X509Store_Type__doc__[] = "This class provides basic access to the OpenSSL certificate store\n" "mechanism used in X.509 and CMS verification.\n" @@ -3513,6 +3617,8 @@ crl_object_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { crl_object *self = NULL; + ENTERING(crl_object_new); + if ((self = (crl_object *) type->tp_alloc(type, 0)) != NULL && (self->crl = X509_CRL_new()) != NULL) return (PyObject *) self; @@ -3521,17 +3627,25 @@ crl_object_new(PyTypeObject *type, PyObject *args, PyObject *kwds) return NULL; } +static void +crl_object_dealloc(crl_object *self) +{ + ENTERING(crl_object_dealloc); + X509_CRL_free(self->crl); + self->ob_type->tp_free((PyObject*) self); +} + static PyObject * crl_object_pem_read_helper(PyTypeObject *type, BIO *bio) { crl_object *self; + ENTERING(crl_object_pem_read_helper); + if ((self = (crl_object *) crl_object_new(type, NULL, NULL)) == NULL) goto error; - X509_CRL_free(self->crl); - - if ((self->crl = PEM_read_bio_X509_CRL(bio, NULL, NULL, NULL)) == NULL) + if (!PEM_read_bio_X509_CRL(bio, &self->crl, NULL, NULL)) lose_openssl_error("Couldn't PEM encoded load CRL"); return (PyObject *) self; @@ -3546,6 +3660,8 @@ crl_object_der_read_helper(PyTypeObject *type, BIO *bio) { crl_object *self; + ENTERING(crl_object_der_read_helper); + if ((self = (crl_object *) crl_object_new(type, NULL, NULL)) == NULL) goto error; @@ -3566,6 +3682,7 @@ static char crl_object_pem_read__doc__[] = static PyObject * crl_object_pem_read(PyTypeObject *type, PyObject *args) { + ENTERING(crl_object_pem_read); return read_from_string_helper(crl_object_pem_read_helper, type, args); } @@ -3576,6 +3693,7 @@ static char crl_object_pem_read_file__doc__[] = static PyObject * crl_object_pem_read_file(PyTypeObject *type, PyObject *args) { + ENTERING(crl_object_pem_read_file); return read_from_file_helper(crl_object_pem_read_helper, type, args); } @@ -3586,6 +3704,7 @@ static char crl_object_der_read__doc__[] = static PyObject * crl_object_der_read(PyTypeObject *type, PyObject *args) { + ENTERING(crl_object_der_read); return read_from_string_helper(crl_object_der_read_helper, type, args); } @@ -3596,6 +3715,7 @@ static char crl_object_der_read_file__doc__[] = static PyObject * crl_object_der_read_file(PyTypeObject *type, PyObject *args) { + ENTERING(crl_object_der_read_file); return read_from_file_helper(crl_object_der_read_helper, type, args); } @@ -3606,6 +3726,7 @@ static char crl_object_get_version__doc__[] = static PyObject * crl_object_get_version(crl_object *self) { + ENTERING(crl_object_get_version); return Py_BuildValue("l", X509_CRL_get_version(self->crl)); } @@ -3620,6 +3741,8 @@ crl_object_set_version(crl_object *self, PyObject *args) { long version = 0; + ENTERING(crl_object_set_version); + if (!PyArg_ParseTuple(args, "i", &version)) goto error; @@ -3643,6 +3766,8 @@ crl_object_get_issuer(crl_object *self, PyObject *args) PyObject *result = NULL; int format = OIDNAME_FORMAT; + ENTERING(crl_object_get_issuer); + if (!PyArg_ParseTuple(args, "|i", &format)) goto error; @@ -3663,6 +3788,8 @@ crl_object_set_issuer(crl_object *self, PyObject *args) PyObject *name_sequence = NULL; X509_NAME *name = NULL; + ENTERING(crl_object_set_issuer); + if (!PyArg_ParseTuple(args, "O", &name_sequence)) goto error; @@ -3705,6 +3832,8 @@ crl_object_set_this_update (crl_object *self, PyObject *args) char *s = NULL; ASN1_TIME *t = NULL; + ENTERING(crl_object_set_this_update); + if (!PyArg_ParseTuple(args, "s", &s)) goto error; @@ -3733,6 +3862,7 @@ static char crl_object_get_this_update__doc__[] = static PyObject * crl_object_get_this_update (crl_object *self) { + ENTERING(crl_object_get_this_update); return ASN1_TIME_to_Python(X509_CRL_get_lastUpdate(self->crl)); /* sic */ } @@ -3751,6 +3881,8 @@ crl_object_set_next_update (crl_object *self, PyObject *args) char *s = NULL; ASN1_TIME *t = NULL; + ENTERING(crl_object_set_next_update); + if (!PyArg_ParseTuple(args, "s", &s)) goto error; @@ -3779,6 +3911,7 @@ static char crl_object_get_next_update__doc__[] = static PyObject * crl_object_get_next_update (crl_object *self) { + ENTERING(crl_object_get_next_update); return ASN1_TIME_to_Python(X509_CRL_get_nextUpdate(self->crl)); } @@ -3804,6 +3937,8 @@ crl_object_add_revocations(crl_object *self, PyObject *args) int ok = 0; char *c_date; + ENTERING(crl_object_add_revocations); + if (!PyArg_ParseTuple(args, "O", &iterable) || (iterator = PyObject_GetIter(iterable)) == NULL) goto error; @@ -3872,6 +4007,8 @@ crl_object_get_revoked(crl_object *self) PyObject *date = NULL; int i; + ENTERING(crl_object_get_revoked); + if ((revoked = X509_CRL_get_REVOKED(self->crl)) == NULL) lose("Inexplicable NULL revocation list pointer"); @@ -3917,6 +4054,8 @@ crl_object_add_extension(crl_object *self, PyObject *args) ASN1_OCTET_STRING *octetString = NULL; X509_EXTENSION *ext = NULL; + ENTERING(crl_object_add_extension); + if (!PyArg_ParseTuple(args, "sOs#", &name, &critical, &buf, &len)) goto error; @@ -3956,6 +4095,8 @@ crl_object_clear_extensions(crl_object *self) { X509_EXTENSION *ext; + ENTERING(crl_object_clear_extensions); + while ((ext = X509_CRL_delete_ext(self->crl, 0)) != NULL) X509_EXTENSION_free(ext); @@ -3969,6 +4110,7 @@ static char crl_object_count_extensions__doc__[] = static PyObject * crl_object_count_extensions(crl_object *self) { + ENTERING(crl_object_count_extensions); return Py_BuildValue("i", X509_CRL_get_ext_count(self->crl)); } @@ -3987,6 +4129,8 @@ crl_object_get_extension(crl_object *self, PyObject *args) char oid[512]; int slot = 0; + ENTERING(crl_object_get_extension); + if (!PyArg_ParseTuple(args, "i", &slot)) goto error; @@ -4031,6 +4175,8 @@ crl_object_sign(crl_object *self, PyObject *args) int digest_type = SHA256_DIGEST; const EVP_MD *digest_method = NULL; + ENTERING(crl_object_sign); + if (!PyArg_ParseTuple(args, "O!|i", &POW_Asymmetric_Type, &asym, &digest_type)) goto error; @@ -4059,6 +4205,8 @@ crl_object_verify(crl_object *self, PyObject *args) { asymmetric_object *asym; + ENTERING(crl_object_verify); + if (!PyArg_ParseTuple(args, "O!", &POW_Asymmetric_Type, &asym)) goto error; @@ -4078,6 +4226,8 @@ crl_object_pem_write(crl_object *self) PyObject *result = NULL; BIO *bio = NULL; + ENTERING(crl_object_pem_write); + if ((bio = BIO_new(BIO_s_mem())) == NULL) lose_no_memory(); @@ -4101,6 +4251,8 @@ crl_object_der_write(crl_object *self) PyObject *result = NULL; BIO *bio = NULL; + ENTERING(crl_object_der_write); + if ((bio = BIO_new(BIO_s_mem())) == NULL) lose_no_memory(); @@ -4127,6 +4279,8 @@ crl_object_get_aki(crl_object *self, PyObject *args) int empty = (ext == NULL || ext->keyid == NULL); PyObject *result = NULL; + ENTERING(crl_object_get_aki); + if (!empty) result = Py_BuildValue("s#", ASN1_STRING_data(ext->keyid), ASN1_STRING_length(ext->keyid)); @@ -4151,6 +4305,8 @@ crl_object_set_aki(crl_object *self, PyObject *args) const unsigned char *buf = NULL; int len, ok = 0; + ENTERING(crl_object_set_aki); + if (!PyArg_ParseTuple(args, "s#", &buf, &len)) goto error; @@ -4184,6 +4340,8 @@ crl_object_get_crl_number(crl_object *self) ASN1_INTEGER *ext = X509_CRL_get_ext_d2i(self->crl, NID_crl_number, NULL, NULL); PyObject *result = NULL; + ENTERING(crl_object_get_crl_number); + if (ext == NULL) Py_RETURN_NONE; @@ -4204,6 +4362,8 @@ crl_object_set_crl_number(crl_object *self, PyObject *args) ASN1_INTEGER *ext = NULL; PyObject *crl_number = NULL; + ENTERING(crl_object_set_crl_number); + if (!PyArg_ParseTuple(args, "O", &crl_number) || (ext = PyLong_to_ASN1_INTEGER(crl_number)) == NULL) goto error; @@ -4229,6 +4389,8 @@ crl_object_pprint(crl_object *self) PyObject *result = NULL; BIO *bio = NULL; + ENTERING(crl_object_pprint); + if ((bio = BIO_new(BIO_s_mem())) == NULL) lose_no_memory(); @@ -4273,13 +4435,6 @@ static struct PyMethodDef crl_object_methods[] = { {NULL} }; -static void -crl_object_dealloc(crl_object *self) -{ - X509_CRL_free(self->crl); - self->ob_type->tp_free((PyObject*) self); -} - static char POW_CRL_Type__doc__[] = "This class provides access to OpenSSL X509 CRL management facilities.\n" ; @@ -4337,6 +4492,8 @@ asymmetric_object_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { asymmetric_object *self = NULL; + ENTERING(asymmetric_object_new); + if ((self = (asymmetric_object *) type->tp_alloc(type, 0)) == NULL) goto error; @@ -4358,6 +4515,8 @@ asymmetric_object_init(asymmetric_object *self, PyObject *args, PyObject *kwds) EVP_PKEY_CTX *ctx = NULL; int ok = 0; + ENTERING(asymmetric_object_init); + if (!PyArg_ParseTupleAndKeywords(args, kwds, "|ii", kwlist, &cipher_type, &key_size)) goto error; @@ -4397,15 +4556,25 @@ asymmetric_object_init(asymmetric_object *self, PyObject *args, PyObject *kwds) return -1; } +static void +asymmetric_object_dealloc(asymmetric_object *self) +{ + ENTERING(asymmetric_object_dealloc); + EVP_PKEY_free(self->pkey); + self->ob_type->tp_free((PyObject*) self); +} + static PyObject * asymmetric_object_pem_read_private_helper(PyTypeObject *type, BIO *bio, char *pass) { asymmetric_object *self = NULL; + ENTERING(asymmetric_object_pem_read_private_helper); + if ((self = (asymmetric_object *) asymmetric_object_new(type, NULL, NULL)) == NULL) goto error; - if ((self->pkey = PEM_read_bio_PrivateKey(bio, NULL, NULL, pass)) == NULL) + if (!PEM_read_bio_PrivateKey(bio, &self->pkey, NULL, pass)) lose_openssl_error("Couldn't load private key"); return (PyObject *) self; @@ -4436,6 +4605,8 @@ asymmetric_object_pem_read_private(PyTypeObject *type, PyObject *args) BIO *bio = NULL; int len = 0; + ENTERING(asymmetric_object_pem_read_private); + if (!PyArg_ParseTuple(args, "s#|s", &src, &len, &pass)) goto error; @@ -4462,6 +4633,8 @@ asymmetric_object_pem_read_private_file(PyTypeObject *type, PyObject *args) char *pass = NULL; BIO *bio = NULL; + ENTERING(asymmetric_object_pem_read_private_file); + if (!PyArg_ParseTuple(args, "s|s", &filename, &pass)) goto error; @@ -4480,10 +4653,12 @@ asymmetric_object_der_read_private_helper(PyTypeObject *type, BIO *bio) { asymmetric_object *self = NULL; + ENTERING(asymmetric_object_der_read_private_helper); + if ((self = (asymmetric_object *) asymmetric_object_new(&POW_Asymmetric_Type, NULL, NULL)) == NULL) goto error; - if ((self->pkey = d2i_PrivateKey_bio(bio, NULL)) == NULL) + if (!d2i_PrivateKey_bio(bio, &self->pkey)) lose_openssl_error("Couldn't load private key"); return (PyObject *) self; @@ -4501,6 +4676,7 @@ static char asymmetric_object_der_read_private__doc__[] = static PyObject * asymmetric_object_der_read_private(PyTypeObject *type, PyObject *args) { + ENTERING(asymmetric_object_der_read_private); return read_from_string_helper(asymmetric_object_der_read_private_helper, type, args); } @@ -4511,6 +4687,7 @@ static char asymmetric_object_der_read_private_file__doc__[] = static PyObject * asymmetric_object_der_read_private_file(PyTypeObject *type, PyObject *args) { + ENTERING(asymmetric_object_der_read_private_file); return read_from_file_helper(asymmetric_object_der_read_private_helper, type, args); } @@ -4519,10 +4696,12 @@ asymmetric_object_pem_read_public_helper(PyTypeObject *type, BIO *bio) { asymmetric_object *self = NULL; + ENTERING(asymmetric_object_pem_read_public_helper); + if ((self = (asymmetric_object *) asymmetric_object_new(&POW_Asymmetric_Type, NULL, NULL)) == NULL) goto error; - if ((self->pkey = PEM_read_bio_PUBKEY(bio, NULL, NULL, NULL)) == NULL) + if (!PEM_read_bio_PUBKEY(bio, &self->pkey, NULL, NULL)) lose_openssl_error("Couldn't load public key"); return (PyObject *) self; @@ -4537,10 +4716,12 @@ asymmetric_object_der_read_public_helper(PyTypeObject *type, BIO *bio) { asymmetric_object *self = NULL; + ENTERING(asymmetric_object_der_read_public_helper); + if ((self = (asymmetric_object *) asymmetric_object_new(&POW_Asymmetric_Type, NULL, NULL)) == NULL) goto error; - if ((self->pkey = d2i_PUBKEY_bio(bio, NULL)) == NULL) + if (!d2i_PUBKEY_bio(bio, &self->pkey)) lose_openssl_error("Couldn't load public key"); return (PyObject *) self; @@ -4558,6 +4739,7 @@ static char asymmetric_object_pem_read_public__doc__[] = static PyObject * asymmetric_object_pem_read_public(PyTypeObject *type, PyObject *args) { + ENTERING(asymmetric_object_pem_read_public); return read_from_string_helper(asymmetric_object_pem_read_public_helper, type, args); } @@ -4568,6 +4750,7 @@ static char asymmetric_object_pem_read_public_file__doc__[] = static PyObject * asymmetric_object_pem_read_public_file(PyTypeObject *type, PyObject *args) { + ENTERING(asymmetric_object_pem_read_public_file); return read_from_file_helper(asymmetric_object_pem_read_public_helper, type, args); } @@ -4578,6 +4761,7 @@ static char asymmetric_object_der_read_public__doc__[] = static PyObject * asymmetric_object_der_read_public(PyTypeObject *type, PyObject *args) { + ENTERING(asymmetric_object_der_read_public); return read_from_string_helper(asymmetric_object_der_read_public_helper, type, args); } @@ -4588,6 +4772,7 @@ static char asymmetric_object_der_read_public_file__doc__[] = static PyObject * asymmetric_object_der_read_public_file(PyTypeObject *type, PyObject *args) { + ENTERING(asymmetric_object_der_read_public_file); return read_from_file_helper(asymmetric_object_der_read_public_helper, type, args); } @@ -4607,6 +4792,8 @@ asymmetric_object_pem_write_private(asymmetric_object *self, PyObject *args) const EVP_CIPHER *evp_method = NULL; BIO *bio = NULL; + ENTERING(asymmetric_object_pem_write_private); + if (!PyArg_ParseTuple(args, "|s", &passphrase)) goto error; @@ -4636,6 +4823,8 @@ asymmetric_object_pem_write_public(asymmetric_object *self) PyObject *result = NULL; BIO *bio = NULL; + ENTERING(asymmetric_object_pem_write_public); + if ((bio = BIO_new(BIO_s_mem())) == NULL) lose_no_memory(); @@ -4659,6 +4848,8 @@ asymmetric_object_der_write_private(asymmetric_object *self) PyObject *result = NULL; BIO *bio = NULL; + ENTERING(asymmetric_object_der_write_private); + if ((bio = BIO_new(BIO_s_mem())) == NULL) lose_no_memory(); @@ -4682,6 +4873,8 @@ asymmetric_object_der_write_public(asymmetric_object *self) PyObject *result = NULL; BIO *bio = NULL; + ENTERING(asymmetric_object_der_write_public); + if ((bio = BIO_new(BIO_s_mem())) == NULL) lose_no_memory(); @@ -4720,6 +4913,8 @@ asymmetric_object_sign(asymmetric_object *self, PyObject *args) EVP_PKEY_CTX *ctx = NULL; PyObject *result = NULL; + ENTERING(asymmetric_object_sign); + if (!PyArg_ParseTuple(args, "s#i", &digest_text, &digest_len, &digest_type)) goto error; @@ -4782,6 +4977,8 @@ asymmetric_object_verify(asymmetric_object *self, PyObject *args) EVP_PKEY_CTX *ctx = NULL; int ok = 0, result; + ENTERING(asymmetric_object_verify); + if (!PyArg_ParseTuple(args, "s#s#i", &signed_text, &signed_len, &digest_text, &digest_len, @@ -4826,13 +5023,6 @@ static struct PyMethodDef asymmetric_object_methods[] = { {NULL} }; -static void -asymmetric_object_dealloc(asymmetric_object *self) -{ - EVP_PKEY_free(self->pkey); - self->ob_type->tp_free((PyObject*) self); -} - static char POW_Asymmetric_Type__doc__[] = "This class provides basic access to RSA signature and verification.\n" "\n" @@ -4892,6 +5082,8 @@ digest_object_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { digest_object *self = NULL; + ENTERING(digest_object_new); + if ((self = (digest_object *) type->tp_alloc(type, 0)) == NULL) goto error; @@ -4910,6 +5102,8 @@ digest_object_init(digest_object *self, PyObject *args, PyObject *kwds) const EVP_MD *digest_method = NULL; int digest_type = 0; + ENTERING(digest_object_init); + if (!PyArg_ParseTupleAndKeywords(args, kwds, "i", kwlist, &digest_type)) goto error; @@ -4926,6 +5120,14 @@ digest_object_init(digest_object *self, PyObject *args, PyObject *kwds) return -1; } +static void +digest_object_dealloc(digest_object *self) +{ + ENTERING(digest_object_dealloc); + EVP_MD_CTX_cleanup(&self->digest_ctx); + self->ob_type->tp_free((PyObject*) self); +} + static char digest_object_update__doc__[] = "This method adds data to a digest.\n" "\n" @@ -4938,6 +5140,8 @@ digest_object_update(digest_object *self, PyObject *args) char *data = NULL; int len = 0; + ENTERING(digest_object_update); + if (!PyArg_ParseTuple(args, "s#", &data, &len)) goto error; @@ -4959,6 +5163,8 @@ digest_object_copy(digest_object *self, PyObject *args) { digest_object *new = NULL; + ENTERING(digest_object_copy); + if ((new = (digest_object *) digest_object_new(&POW_Digest_Type, NULL, NULL)) == NULL) goto error; @@ -4992,6 +5198,8 @@ digest_object_digest(digest_object *self) EVP_MD_CTX ctx; unsigned digest_len = 0; + ENTERING(digest_object_digest); + if (!EVP_MD_CTX_copy(&ctx, &self->digest_ctx)) lose_openssl_error("Couldn't copy digest"); @@ -5012,13 +5220,6 @@ static struct PyMethodDef digest_object_methods[] = { {NULL} }; -static void -digest_object_dealloc(digest_object *self) -{ - EVP_MD_CTX_cleanup(&self->digest_ctx); - self->ob_type->tp_free((PyObject*) self); -} - static char POW_Digest_Type__doc__[] = "This class provides access to the digest functionality of OpenSSL.\n" "It emulates the digest modules in the Python Standard Library, but\n" @@ -5088,6 +5289,8 @@ cms_object_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { cms_object *self; + ENTERING(cms_object_new); + if ((self = (cms_object *) type->tp_alloc(type, 0)) != NULL) return (PyObject *) self; @@ -5095,15 +5298,25 @@ cms_object_new(PyTypeObject *type, PyObject *args, PyObject *kwds) return NULL; } +static void +cms_object_dealloc(cms_object *self) +{ + ENTERING(cms_object_dealloc); + CMS_ContentInfo_free(self->cms); + self->ob_type->tp_free((PyObject*) self); +} + static PyObject * cms_object_pem_read_helper(PyTypeObject *type, BIO *bio) { cms_object *self; + ENTERING(cms_object_pem_read_helper); + if ((self = (cms_object *) type->tp_new(type, NULL, NULL)) == NULL) goto error; - if ((self->cms = PEM_read_bio_CMS(bio, NULL, NULL, NULL)) == NULL) + if (!PEM_read_bio_CMS(bio, &self->cms, NULL, NULL)) lose_openssl_error("Couldn't load PEM encoded CMS message"); return (PyObject *) self; @@ -5118,12 +5331,11 @@ cms_object_der_read_helper(PyTypeObject *type, BIO *bio) { cms_object *self; + ENTERING(cms_object_der_read_helper); + if ((self = (cms_object *) type->tp_new(type, NULL, NULL)) == NULL) goto error; - if ((self->cms = CMS_ContentInfo_new()) == NULL) - lose_no_memory(); - if (!d2i_CMS_bio(bio, &self->cms)) lose_openssl_error("Couldn't load DER encoded CMS message"); @@ -5141,6 +5353,7 @@ static char cms_object_pem_read__doc__[] = static PyObject * cms_object_pem_read(PyTypeObject *type, PyObject *args) { + ENTERING(cms_object_pem_read); return read_from_string_helper(cms_object_pem_read_helper, type, args); } @@ -5151,6 +5364,7 @@ static char cms_object_pem_read_file__doc__[] = static PyObject * cms_object_pem_read_file(PyTypeObject *type, PyObject *args) { + ENTERING(cms_object_pem_read_file); return read_from_file_helper(cms_object_pem_read_helper, type, args); } @@ -5161,6 +5375,7 @@ static char cms_object_der_read__doc__[] = static PyObject * cms_object_der_read(PyTypeObject *type, PyObject *args) { + ENTERING(cms_object_der_read); return read_from_string_helper(cms_object_der_read_helper, type, args); } @@ -5171,6 +5386,7 @@ static char cms_object_der_read_file__doc__[] = static PyObject * cms_object_der_read_file(PyTypeObject *type, PyObject *args) { + ENTERING(cms_object_der_read_file); return read_from_file_helper(cms_object_der_read_helper, type, args); } @@ -5184,6 +5400,8 @@ cms_object_pem_write(cms_object *self) PyObject *result = NULL; BIO *bio = NULL; + ENTERING(cms_object_pem_write); + if ((bio = BIO_new(BIO_s_mem())) == NULL) lose_no_memory(); @@ -5207,6 +5425,8 @@ cms_object_der_write(cms_object *self) PyObject *result = NULL; BIO *bio = NULL; + ENTERING(cms_object_der_write); + if ((bio = BIO_new(BIO_s_mem())) == NULL) lose_no_memory(); @@ -5236,6 +5456,8 @@ cms_object_sign_helper(cms_object *self, CMS_ContentInfo *cms = NULL; ASN1_OBJECT *econtent_type = NULL; + ENTERING(cms_object_sign_helper); + assert_no_unhandled_openssl_errors(); flags &= CMS_NOCERTS | CMS_NOATTR; @@ -5354,6 +5576,8 @@ cms_object_sign(cms_object *self, PyObject *args) BIO *bio = NULL; int ok = 0; + ENTERING(cms_object_sign); + if (!PyArg_ParseTuple(args, "O!O!s#|OOsI", &POW_X509_Type, &signcert, &POW_Asymmetric_Type, &signkey, @@ -5371,8 +5595,13 @@ cms_object_sign(cms_object *self, PyObject *args) assert_no_unhandled_openssl_errors(); - ok = cms_object_sign_helper(self, bio, signcert, signkey, - x509_sequence, crl_sequence, oid, flags); + if (!cms_object_sign_helper(self, bio, signcert, signkey, + x509_sequence, crl_sequence, oid, flags)) + lose_openssl_error("Couldn't sign CMS object"); + + assert_no_unhandled_openssl_errors(); + + ok = 1; error: BIO_free(bio); @@ -5395,6 +5624,8 @@ cms_object_verify_helper(cms_object *self, PyObject *args, PyObject *kwds) unsigned flags = 0, ok = 0; BIO *bio = NULL; + ENTERING(cms_object_verify_helper); + if (!PyArg_ParseTupleAndKeywords(args, kwds, "O!|OI", kwlist, &POW_X509Store_Type, &store, &certs_sequence, &flags)) goto error; @@ -5454,6 +5685,8 @@ cms_object_verify(cms_object *self, PyObject *args, PyObject *kwds) PyObject *result = NULL; BIO *bio = NULL; + ENTERING(cms_object_verify); + if ((bio = cms_object_verify_helper(self, args, kwds)) != NULL) result = BIO_to_PyString_helper(bio); @@ -5470,17 +5703,15 @@ cms_object_eContentType(cms_object *self) { const ASN1_OBJECT *oid = NULL; PyObject *result = NULL; - char buf[512]; + + ENTERING(cms_object_eContentType); if ((oid = CMS_get0_eContentType(self->cms)) == NULL) lose_openssl_error("Couldn't extract eContentType from CMS message"); - if (OBJ_obj2txt(buf, sizeof(buf), oid, 1) <= 0) - lose("Couldn't translate OID"); - assert_no_unhandled_openssl_errors(); - result = Py_BuildValue("s", buf); + result = ASN1_OBJECT_to_PyString(oid); error: return result; @@ -5500,6 +5731,8 @@ cms_object_signingTime(cms_object *self) ASN1_TYPE *so = NULL; int i; + ENTERING(cms_object_signingTime); + if ((sis = CMS_get0_SignerInfos(self->cms)) == NULL) lose_openssl_error("Couldn't extract signerInfos from CMS message[1]"); @@ -5548,6 +5781,8 @@ cms_object_pprint(cms_object *self) BIO *bio = NULL; PyObject *result = NULL; + ENTERING(cms_object_pprint); + if ((bio = BIO_new(BIO_s_mem())) == NULL) lose_no_memory(); @@ -5564,13 +5799,15 @@ cms_object_pprint(cms_object *self) static PyObject * cms_object_helper_get_cert(void *cert) { - x509_object *obj = (x509_object *) x509_object_new(&POW_X509_Type, NULL, NULL); + x509_object *obj; - if (obj) { - X509_free(obj->x509); - obj->x509 = cert; - } + ENTERING(cms_object_helper_get_cert); + if ((obj = (x509_object *) x509_object_new(&POW_X509_Type, NULL, NULL)) == NULL) + return NULL; + + X509_free(obj->x509); + obj->x509 = cert; return (PyObject *) obj; } @@ -5586,6 +5823,8 @@ cms_object_certs(cms_object *self) STACK_OF(X509) *certs = NULL; PyObject *result = NULL; + ENTERING(cms_object_certs); + if ((certs = CMS_get1_certs(self->cms)) != NULL) result = stack_to_tuple_helper(CHECKED_PTR_OF(STACK_OF(X509), certs), cms_object_helper_get_cert); @@ -5602,13 +5841,15 @@ cms_object_certs(cms_object *self) static PyObject * cms_object_helper_get_crl(void *crl) { - crl_object *obj = (crl_object *) crl_object_new(&POW_CRL_Type, NULL, NULL); + crl_object *obj; - if (obj) { - X509_CRL_free(obj->crl); - obj->crl = crl; - } + ENTERING(cms_object_helper_get_crl); + + if ((obj = (crl_object *) crl_object_new(&POW_CRL_Type, NULL, NULL)) == NULL) + return NULL; + X509_CRL_free(obj->crl); + obj->crl = crl; return (PyObject *) obj; } @@ -5623,6 +5864,8 @@ cms_object_crls(cms_object *self) STACK_OF(X509_CRL) *crls = NULL; PyObject *result = NULL; + ENTERING(cms_object_crls); + if ((crls = CMS_get1_crls(self->cms)) != NULL) result = stack_to_tuple_helper(CHECKED_PTR_OF(STACK_OF(X509_CRL), crls), cms_object_helper_get_crl); @@ -5653,13 +5896,6 @@ static struct PyMethodDef cms_object_methods[] = { {NULL} }; -static void -cms_object_dealloc(cms_object *self) -{ - CMS_ContentInfo_free(self->cms); - self->ob_type->tp_free((PyObject*) self); -} - static char POW_CMS_Type__doc__[] = "This class provides basic access OpenSSL's CMS functionality.\n" "At present this only handes signed objects, as those are the\n" @@ -5719,6 +5955,8 @@ manifest_object_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { manifest_object *self = NULL; + ENTERING(manifest_object_new); + if ((self = (manifest_object *) cms_object_new(type, args, kwds)) != NULL && (self->manifest = Manifest_new()) != NULL) return (PyObject *) self; @@ -5727,6 +5965,14 @@ manifest_object_new(PyTypeObject *type, PyObject *args, PyObject *kwds) return NULL; } +static void +manifest_object_dealloc(manifest_object *self) +{ + ENTERING(manifest_object_dealloc); + Manifest_free(self->manifest); + cms_object_dealloc(&self->cms); +} + static char manifest_object_verify__doc__[] = "Needs doc.\n" ; @@ -5737,12 +5983,11 @@ manifest_object_verify(manifest_object *self, PyObject *args, PyObject *kwds) BIO *bio = NULL; int ok = 0; + ENTERING(manifest_object_verify); + if ((bio = cms_object_verify_helper(&self->cms, args, kwds)) == NULL) goto error; - Manifest_free(self->manifest); - self->manifest = NULL; - if (!ASN1_item_d2i_bio(ASN1_ITEM_rptr(Manifest), bio, &self->manifest)) lose_openssl_error("Couldn't decode manifest"); @@ -5762,6 +6007,8 @@ manifest_object_der_read_helper(PyTypeObject *type, BIO *bio) { manifest_object *self; + ENTERING(manifest_object_der_read_helper); + if ((self = (manifest_object *) cms_object_der_read_helper(type, bio)) != NULL) self->manifest = NULL; @@ -5775,14 +6022,28 @@ static char manifest_object_der_read__doc__[] = static PyObject * manifest_object_der_read(PyTypeObject *type, PyObject *args) { + ENTERING(manifest_object_der_read); return read_from_string_helper(manifest_object_der_read_helper, type, args); } +static char manifest_object_der_read_file__doc__[] = + "Class method to read a DER-encoded manifest object from a file.\n" + ; + +static PyObject * +manifest_object_der_read_file(PyTypeObject *type, PyObject *args) +{ + ENTERING(manifest_object_der_read_file); + return read_from_file_helper(manifest_object_der_read_helper, type, args); +} + static PyObject * manifest_object_pem_read_helper(PyTypeObject *type, BIO *bio) { manifest_object *self; + ENTERING(manifest_object_pem_read_helper); + if ((self = (manifest_object *) cms_object_pem_read_helper(type, bio)) != NULL) self->manifest = NULL; @@ -5796,6 +6057,7 @@ static char manifest_object_pem_read__doc__[] = static PyObject * manifest_object_pem_read(PyTypeObject *type, PyObject *args) { + ENTERING(manifest_object_pem_read); return read_from_string_helper(manifest_object_pem_read_helper, type, args); } @@ -5806,19 +6068,10 @@ static char manifest_object_pem_read_file__doc__[] = static PyObject * manifest_object_pem_read_file(PyTypeObject *type, PyObject *args) { + ENTERING(manifest_object_pem_read_file); return read_from_file_helper(manifest_object_pem_read_helper, type, args); } -static char manifest_object_der_read_file__doc__[] = - "Class method to read a DER-encoded manifest object from a file.\n" - ; - -static PyObject * -manifest_object_der_read_file(PyTypeObject *type, PyObject *args) -{ - return read_from_file_helper(manifest_object_der_read_helper, type, args); -} - static char manifest_object_get_version__doc__[] = "This method returns the version number of this manifest.\n" ; @@ -5826,6 +6079,8 @@ static char manifest_object_get_version__doc__[] = static PyObject * manifest_object_get_version(manifest_object *self) { + ENTERING(manifest_object_get_version); + if (self->manifest == NULL) lose_not_verified("Can't report version of unverified manifest"); @@ -5853,6 +6108,8 @@ manifest_object_set_version(manifest_object *self, PyObject *args) { int version = 0; + ENTERING(manifest_object_set_version); + if (!PyArg_ParseTuple(args, "|i", &version)) goto error; @@ -5878,6 +6135,8 @@ static char manifest_object_get_manifest_number__doc__[] = static PyObject * manifest_object_get_manifest_number(manifest_object *self) { + ENTERING(manifest_object_get_manifest_number); + if (self->manifest == NULL) lose_not_verified("Can't get manifestNumber of unverified manifest"); @@ -5900,6 +6159,8 @@ manifest_object_set_manifest_number(manifest_object *self, PyObject *args) PyObject *zero = NULL; int ok = 0; + ENTERING(manifest_object_set_manifest_number); + if (!PyArg_ParseTuple(args, "O", &manifestNumber)) goto error; @@ -5945,6 +6206,8 @@ manifest_object_set_this_update (manifest_object *self, PyObject *args) ASN1_TIME *t = NULL; char *s = NULL; + ENTERING(manifest_object_set_this_update); + if (!PyArg_ParseTuple(args, "s", &s)) goto error; @@ -5971,6 +6234,8 @@ static char manifest_object_get_this_update__doc__[] = static PyObject * manifest_object_get_this_update (manifest_object *self) { + ENTERING(manifest_object_get_this_update); + if (self->manifest == NULL) lose_not_verified("Can't get thisUpdate value of unverified manifest"); @@ -5993,6 +6258,8 @@ manifest_object_set_next_update (manifest_object *self, PyObject *args) ASN1_TIME *t = NULL; char *s = NULL; + ENTERING(manifest_object_set_next_update); + if (!PyArg_ParseTuple(args, "s", &s)) goto error; @@ -6019,6 +6286,8 @@ static char manifest_object_get_next_update__doc__[] = static PyObject * manifest_object_get_next_update (manifest_object *self) { + ENTERING(manifest_object_get_next_update); + if (self->manifest == NULL) lose_not_verified("Can't extract nextUpdate value of unverified manifest"); @@ -6036,15 +6305,13 @@ static PyObject * manifest_object_get_algorithm(manifest_object *self) { PyObject *result = NULL; - char oid[512]; + + ENTERING(manifest_object_get_algorithm); if (self->manifest == NULL) lose_not_verified("Can't extract algorithm OID of unverified manifest"); - if (OBJ_obj2txt(oid, sizeof(oid), self->manifest->fileHashAlg, 1) <= 0) - lose("Couldn't translate OID"); - - result = Py_BuildValue("s", oid); + result = ASN1_OBJECT_to_PyString(self->manifest->fileHashAlg); error: return result; @@ -6060,6 +6327,8 @@ manifest_object_set_algorithm(manifest_object *self, PyObject *args) ASN1_OBJECT *oid = NULL; const char *s = NULL; + ENTERING(manifest_object_set_algorithm); + if (!PyArg_ParseTuple(args, "s", &s)) goto error; @@ -6098,6 +6367,8 @@ manifest_object_add_files(manifest_object *self, PyObject *args) char *hash = NULL; int filelen, hashlen, ok = 0; + ENTERING(manifest_object_add_files); + if (self->manifest == NULL) lose_not_verified("Can't add files to unverified manifest"); @@ -6146,6 +6417,8 @@ manifest_object_get_files(manifest_object *self) PyObject *item = NULL; int i; + ENTERING(manifest_object_get_files); + if (self->manifest == NULL) lose_not_verified("Can't get files from unverified manifest"); @@ -6179,7 +6452,6 @@ static char manifest_object_sign__doc__[] = "Needs doc.\n" ; - static PyObject * manifest_object_sign(manifest_object *self, PyObject *args) { @@ -6193,6 +6465,8 @@ manifest_object_sign(manifest_object *self, PyObject *args) BIO *bio = NULL; int ok = 0; + ENTERING(manifest_object_sign); + if (!PyArg_ParseTuple(args, "O!O!s#|OOsI", &POW_X509_Type, &signcert, &POW_Asymmetric_Type, &signkey, @@ -6209,12 +6483,17 @@ manifest_object_sign(manifest_object *self, PyObject *args) assert_no_unhandled_openssl_errors(); if (!ASN1_item_i2d_bio(ASN1_ITEM_rptr(Manifest), bio, self->manifest)) - lose_openssl_error("Unable to write manifest"); + lose_openssl_error("Couldn't encode manifest"); + + assert_no_unhandled_openssl_errors(); + + if (!cms_object_sign_helper(&self->cms, bio, signcert, signkey, + x509_sequence, crl_sequence, oid, flags)) + lose_openssl_error("Couldn't sign manifest"); assert_no_unhandled_openssl_errors(); - ok = cms_object_sign_helper(&self->cms, bio, signcert, signkey, - x509_sequence, crl_sequence, oid, flags); + ok = 1; error: BIO_free(bio); @@ -6247,13 +6526,6 @@ static struct PyMethodDef manifest_object_methods[] = { {NULL} }; -static void -manifest_object_dealloc(manifest_object *self) -{ - Manifest_free(self->manifest); - self->cms.ob_type->tp_free((PyObject*) self); -} - static char POW_Manifest_Type__doc__[] = "This class provides access to RPKI manifest payload.\n" ; @@ -6311,6 +6583,8 @@ roa_object_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { roa_object *self = NULL; + ENTERING(roa_object_new); + if ((self = (roa_object *) cms_object_new(type, args, kwds)) != NULL && (self->roa = ROA_new()) != NULL) return (PyObject *) self; @@ -6319,6 +6593,14 @@ roa_object_new(PyTypeObject *type, PyObject *args, PyObject *kwds) return NULL; } +static void +roa_object_dealloc(roa_object *self) +{ + ENTERING(roa_object_dealloc); + ROA_free(self->roa); + cms_object_dealloc(&self->cms); +} + static char roa_object_verify__doc__[] = "Needs doc. For now, see CMS.verify().\n" ; @@ -6329,11 +6611,10 @@ roa_object_verify(roa_object *self, PyObject *args, PyObject *kwds) BIO *bio = NULL; int ok = 0; + ENTERING(roa_object_verify); + if ((bio = cms_object_verify_helper(&self->cms, args, kwds)) == NULL) goto error; - - ROA_free(self->roa); - self->roa = NULL; if (!ASN1_item_d2i_bio(ASN1_ITEM_rptr(ROA), bio, &self->roa)) lose_openssl_error("Couldn't decode ROA"); @@ -6354,6 +6635,8 @@ roa_object_pem_read_helper(PyTypeObject *type, BIO *bio) { roa_object *self; + ENTERING(roa_object_pem_read_helper); + if ((self = (roa_object *) cms_object_pem_read_helper(type, bio)) != NULL) self->roa = NULL; @@ -6365,6 +6648,8 @@ roa_object_der_read_helper(PyTypeObject *type, BIO *bio) { roa_object *self; + ENTERING(roa_object_der_read_helper); + if ((self = (roa_object *) cms_object_der_read_helper(type, bio)) != NULL) self->roa = NULL; @@ -6378,6 +6663,7 @@ static char roa_object_pem_read__doc__[] = static PyObject * roa_object_pem_read(PyTypeObject *type, PyObject *args) { + ENTERING(roa_object_pem_read); return read_from_string_helper(roa_object_pem_read_helper, type, args); } @@ -6388,6 +6674,7 @@ static char roa_object_pem_read_file__doc__[] = static PyObject * roa_object_pem_read_file(PyTypeObject *type, PyObject *args) { + ENTERING(roa_object_pem_read_file); return read_from_file_helper(roa_object_pem_read_helper, type, args); } @@ -6398,6 +6685,7 @@ static char roa_object_der_read__doc__[] = static PyObject * roa_object_der_read(PyTypeObject *type, PyObject *args) { + ENTERING(roa_object_der_read); return read_from_string_helper(roa_object_der_read_helper, type, args); } @@ -6408,6 +6696,7 @@ static char roa_object_der_read_file__doc__[] = static PyObject * roa_object_der_read_file(PyTypeObject *type, PyObject *args) { + ENTERING(roa_object_der_read_file); return read_from_file_helper(roa_object_der_read_helper, type, args); } @@ -6418,6 +6707,8 @@ static char roa_object_get_version__doc__[] = static PyObject * roa_object_get_version(roa_object *self) { + ENTERING(roa_object_get_version); + if (self->roa == NULL) lose_not_verified("Can't get version of unverified ROA"); @@ -6445,6 +6736,8 @@ roa_object_set_version(roa_object *self, PyObject *args) { int version = 0; + ENTERING(roa_object_set_version); + if (self->roa == NULL) lose_not_verified("Can't set version of unverified ROA"); @@ -6470,6 +6763,8 @@ static char roa_object_get_asid__doc__[] = static PyObject * roa_object_get_asid(roa_object *self) { + ENTERING(roa_object_get_asid); + if (self->roa == NULL) lose_not_verified("Can't get ASN of unverified ROA"); @@ -6492,6 +6787,8 @@ roa_object_set_asid(roa_object *self, PyObject *args) PyObject *zero = NULL; int ok = 0; + ENTERING(roa_object_set_asid); + if (self->roa == NULL) lose_not_verified("Can't set ASN of unverified ROA"); @@ -6542,6 +6839,8 @@ roa_object_get_prefixes(roa_object *self) ipaddress_object *addr = NULL; int i, j; + ENTERING(roa_object_get_prefixes); + if (self->roa == NULL) lose_not_verified("Can't get prefixes from unverified ROA"); @@ -6645,6 +6944,8 @@ roa_object_set_prefixes(roa_object *self, PyObject *args, PyObject *kwds) PyObject *item = NULL; int afi, ok = 0; + ENTERING(roa_object_set_prefixes); + if (self->roa == NULL) lose_not_verified("Can't set prefixes of unverified ROA"); @@ -6778,6 +7079,8 @@ roa_object_sign(roa_object *self, PyObject *args) BIO *bio = NULL; int ok = 0; + ENTERING(roa_object_sign); + if (!PyArg_ParseTuple(args, "O!O!s#|OOsI", &POW_X509_Type, &signcert, &POW_Asymmetric_Type, &signkey, @@ -6794,12 +7097,17 @@ roa_object_sign(roa_object *self, PyObject *args) assert_no_unhandled_openssl_errors(); if (!ASN1_item_i2d_bio(ASN1_ITEM_rptr(ROA), bio, self->roa)) - lose_openssl_error("Unable to write ROA"); + lose_openssl_error("Couldn't encode ROA"); assert_no_unhandled_openssl_errors(); - ok = cms_object_sign_helper(&self->cms, bio, signcert, signkey, - x509_sequence, crl_sequence, oid, flags); + if (!cms_object_sign_helper(&self->cms, bio, signcert, signkey, + x509_sequence, crl_sequence, oid, flags)) + lose_openssl_error("Couldn't sign ROA"); + + assert_no_unhandled_openssl_errors(); + + ok = 1; error: BIO_free(bio); @@ -6826,13 +7134,6 @@ static struct PyMethodDef roa_object_methods[] = { {NULL} }; -static void -roa_object_dealloc(roa_object *self) -{ - ROA_free(self->roa); - self->cms.ob_type->tp_free((PyObject*) self); -} - static char POW_ROA_Type__doc__[] = "This class provides access to RPKI roa payload.\n" ; @@ -6890,6 +7191,8 @@ pkcs10_object_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { pkcs10_object *self; + ENTERING(pkcs10_object_new); + if ((self = (pkcs10_object *) type->tp_alloc(type, 0)) != NULL && (self->pkcs10 = X509_REQ_new()) != NULL && (self->exts = sk_X509_EXTENSION_new_null()) != NULL) @@ -6899,24 +7202,37 @@ pkcs10_object_new(PyTypeObject *type, PyObject *args, PyObject *kwds) return NULL; } +static void +pkcs10_object_dealloc(pkcs10_object *self) +{ + ENTERING(pkcs10_object_dealloc); + X509_REQ_free(self->pkcs10); + sk_X509_EXTENSION_pop_free(self->exts, X509_EXTENSION_free); + self->ob_type->tp_free((PyObject*) self); +} + static PyObject * pkcs10_object_pem_read_helper(PyTypeObject *type, BIO *bio) { pkcs10_object *self = NULL; + ENTERING(pkcs10_object_pem_read_helper); + + assert_no_unhandled_openssl_errors(); + if ((self = (pkcs10_object *) pkcs10_object_new(type, NULL, NULL)) == NULL) goto error; - X509_REQ_free(self->pkcs10); - sk_X509_EXTENSION_pop_free(self->exts, X509_EXTENSION_free); - self->pkcs10 = NULL; - self->exts = NULL; + assert_no_unhandled_openssl_errors(); - if ((self->pkcs10 = PEM_read_bio_X509_REQ(bio, NULL, NULL, NULL)) == NULL) + if (!PEM_read_bio_X509_REQ(bio, &self->pkcs10, NULL, NULL)) lose_openssl_error("Couldn't load PEM encoded PKCS#10 request"); + sk_X509_EXTENSION_pop_free(self->exts, X509_EXTENSION_free); self->exts = X509_REQ_get_extensions(self->pkcs10); + assert_no_unhandled_openssl_errors(); + return (PyObject *) self; error: @@ -6930,17 +7246,23 @@ pkcs10_object_der_read_helper(PyTypeObject *type, BIO *bio) { pkcs10_object *self; + ENTERING(pkcs10_object_der_read_helper); + + assert_no_unhandled_openssl_errors(); + if ((self = (pkcs10_object *) pkcs10_object_new(type, NULL, NULL)) == NULL) goto error; - sk_X509_EXTENSION_pop_free(self->exts, X509_EXTENSION_free); - self->exts = NULL; + assert_no_unhandled_openssl_errors(); if (!d2i_X509_REQ_bio(bio, &self->pkcs10)) lose_openssl_error("Couldn't load DER encoded PKCS#10 request"); + sk_X509_EXTENSION_pop_free(self->exts, X509_EXTENSION_free); self->exts = X509_REQ_get_extensions(self->pkcs10); + assert_no_unhandled_openssl_errors(); + return (PyObject *) self; error: @@ -6955,6 +7277,7 @@ static char pkcs10_object_pem_read__doc__[] = static PyObject * pkcs10_object_pem_read(PyTypeObject *type, PyObject *args) { + ENTERING(pkcs10_object_pem_read); return read_from_string_helper(pkcs10_object_pem_read_helper, type, args); } @@ -6965,6 +7288,7 @@ static char pkcs10_object_pem_read_file__doc__[] = static PyObject * pkcs10_object_pem_read_file(PyTypeObject *type, PyObject *args) { + ENTERING(pkcs10_object_pem_read_file); return read_from_file_helper(pkcs10_object_pem_read_helper, type, args); } @@ -6975,6 +7299,7 @@ static char pkcs10_object_der_read__doc__[] = static PyObject * pkcs10_object_der_read(PyTypeObject *type, PyObject *args) { + ENTERING(pkcs10_object_der_read); return read_from_string_helper(pkcs10_object_der_read_helper, type, args); } @@ -6985,6 +7310,7 @@ static char pkcs10_object_der_read_file__doc__[] = static PyObject * pkcs10_object_der_read_file(PyTypeObject *type, PyObject *args) { + ENTERING(pkcs10_object_der_read_file); return read_from_file_helper(pkcs10_object_der_read_helper, type, args); } @@ -6998,6 +7324,8 @@ pkcs10_object_pem_write(pkcs10_object *self) PyObject *result = NULL; BIO *bio = NULL; + ENTERING(pkcs10_object_pem_write); + if ((bio = BIO_new(BIO_s_mem())) == NULL) lose_no_memory(); @@ -7021,6 +7349,8 @@ pkcs10_object_der_write(pkcs10_object *self) PyObject *result = NULL; BIO *bio = NULL; + ENTERING(pkcs10_object_der_write); + if ((bio = BIO_new(BIO_s_mem())) == NULL) lose_no_memory(); @@ -7044,6 +7374,8 @@ pkcs10_object_get_public_key(pkcs10_object *self) PyTypeObject *type = &POW_Asymmetric_Type; asymmetric_object *asym = NULL; + ENTERING(pkcs10_object_get_public_key); + if ((asym = (asymmetric_object *) type->tp_alloc(type, 0)) == NULL) goto error; @@ -7068,6 +7400,8 @@ pkcs10_object_set_public_key(pkcs10_object *self, PyObject *args) { asymmetric_object *asym; + ENTERING(pkcs10_object_set_public_key); + if (!PyArg_ParseTuple(args, "O!", &POW_Asymmetric_Type, &asym)) goto error; @@ -7106,6 +7440,8 @@ pkcs10_object_sign(pkcs10_object *self, PyObject *args) int loc, digest_type = SHA256_DIGEST; const EVP_MD *digest_method = NULL; + ENTERING(pkcs10_object_sign); + if (!PyArg_ParseTuple(args, "O!|i", &POW_Asymmetric_Type, &asym, &digest_type)) goto error; @@ -7138,6 +7474,8 @@ pkcs10_object_verify(pkcs10_object *self) EVP_PKEY *pkey = NULL; int status; + ENTERING(pkcs10_object_verify); + if ((pkey = X509_REQ_get_pubkey(self->pkcs10)) == NULL) lose_openssl_error("Couldn't extract public key from PKCS#10 for verification"); @@ -7159,6 +7497,7 @@ static char pkcs10_object_get_version__doc__[] = static PyObject * pkcs10_object_get_version(pkcs10_object *self) { + ENTERING(pkcs10_object_get_version); return Py_BuildValue("l", X509_REQ_get_version(self->pkcs10)); } @@ -7173,6 +7512,8 @@ pkcs10_object_set_version(pkcs10_object *self, PyObject *args) { long version = 0; + ENTERING(pkcs10_object_set_version); + if (!PyArg_ParseTuple(args, "|l", &version)) goto error; @@ -7201,6 +7542,8 @@ pkcs10_object_get_subject(pkcs10_object *self, PyObject *args) PyObject *result = NULL; int format = OIDNAME_FORMAT; + ENTERING(pkcs10_object_get_subject); + if (!PyArg_ParseTuple(args, "|i", &format)) goto error; @@ -7223,6 +7566,8 @@ pkcs10_object_set_subject(pkcs10_object *self, PyObject *args) PyObject *name_sequence = NULL; X509_NAME *name = NULL; + ENTERING(pkcs10_object_set_subject); + if (!PyArg_ParseTuple(args, "O", &name_sequence)) goto error; @@ -7259,6 +7604,8 @@ pkcs10_object_get_key_usage(pkcs10_object *self) PyObject *result = NULL; PyObject *token = NULL; + ENTERING(pkcs10_object_get_key_usage); + if ((ext = X509V3_get_d2i(self->exts, NID_key_usage, NULL, NULL)) == NULL) Py_RETURN_NONE; @@ -7308,6 +7655,8 @@ pkcs10_object_set_key_usage(pkcs10_object *self, PyObject *args) const char *t; int ok = 0; + ENTERING(pkcs10_object_set_key_usage); + if ((ext = ASN1_BIT_STRING_new()) == NULL) lose_no_memory(); @@ -7367,6 +7716,8 @@ pkcs10_object_get_basic_constraints(pkcs10_object *self) BASIC_CONSTRAINTS *ext = NULL; PyObject *result; + ENTERING(pkcs10_object_get_basic_constraints); + if ((ext = X509V3_get_d2i(self->exts, NID_basic_constraints, NULL, NULL)) == NULL) Py_RETURN_NONE; @@ -7404,6 +7755,8 @@ pkcs10_object_set_basic_constraints(pkcs10_object *self, PyObject *args) long pathlen = -1; int ok = 0; + ENTERING(pkcs10_object_set_basic_constraints); + if (!PyArg_ParseTuple(args, "O|OO", &is_ca, &pathlen_obj, &critical)) goto error; @@ -7459,6 +7812,8 @@ pkcs10_object_get_sia(pkcs10_object *self) PyObject *obj; int i, nid; + ENTERING(pkcs10_object_get_sia); + if ((ext = X509V3_get_d2i(self->exts, NID_sinfo_access, NULL, NULL)) == NULL) Py_RETURN_NONE; @@ -7555,6 +7910,8 @@ pkcs10_object_set_sia(pkcs10_object *self, PyObject *args) Py_ssize_t urilen; char *uri; + ENTERING(pkcs10_object_set_sia); + if (!PyArg_ParseTuple(args, "OOO", &caRepository, &rpkiManifest, &signedObject)) goto error; @@ -7625,6 +7982,57 @@ pkcs10_object_set_sia(pkcs10_object *self, PyObject *args) return NULL; } +static char pkcs10_object_get_signature_algorithm__doc__[] = + "Extract signature algorithm OID from this request.\n" + ; + +static PyObject * +pkcs10_object_get_signature_algorithm(pkcs10_object *self) +{ + ASN1_OBJECT *oid = NULL; + + ENTERING(pkcs10_object_get_signature_algorithm); + + X509_ALGOR_get0(&oid, NULL, NULL, self->pkcs10->sig_alg); + + return ASN1_OBJECT_to_PyString(oid); +} + +static char pkcs10_object_get_extension_oids__doc__[] = + "Get the set of extension OIDs used in this request. This is mostly\n" + "useful for enforcing restrictions on what extensions are allowed to be\n" + "present, to conform with a profile.\n" + ; + +static PyObject * +pkcs10_object_get_extension_oids(pkcs10_object *self) +{ + PyObject *result = NULL; + PyObject *oid = NULL; + int i; + + ENTERING(pkcs10_object_get_extension_oids); + + if ((result = PyFrozenSet_New(NULL)) == NULL) + goto error; + + for (i = 0; i < sk_X509_EXTENSION_num(self->exts); i++) { + X509_EXTENSION *ext = sk_X509_EXTENSION_value(self->exts, i); + if ((oid = ASN1_OBJECT_to_PyString(ext->object)) == NULL || + PySet_Add(result, oid) < 0) + goto error; + Py_XDECREF(oid); + oid = NULL; + } + + return result; + + error: + Py_XDECREF(result); + Py_XDECREF(oid); + return NULL; +} + /* * May want EKU handlers eventually, skip for now. */ @@ -7639,6 +8047,8 @@ pkcs10_object_pprint(pkcs10_object *self) PyObject *result = NULL; BIO *bio = NULL; + ENTERING(pkcs10_object_pprint); + if ((bio = BIO_new(BIO_s_mem())) == NULL) lose_no_memory(); @@ -7670,6 +8080,8 @@ static struct PyMethodDef pkcs10_object_methods[] = { Define_Method(setBasicConstraints, pkcs10_object_set_basic_constraints, METH_VARARGS), Define_Method(getSIA, pkcs10_object_get_sia, METH_NOARGS), Define_Method(setSIA, pkcs10_object_set_sia, METH_VARARGS), + Define_Method(getSignatureAlgorithm, pkcs10_object_get_signature_algorithm, METH_NOARGS), + Define_Method(getExtensionOIDs, pkcs10_object_get_extension_oids, METH_NOARGS), Define_Class_Method(pemRead, pkcs10_object_pem_read, METH_VARARGS), Define_Class_Method(pemReadFile, pkcs10_object_pem_read_file, METH_VARARGS), Define_Class_Method(derRead, pkcs10_object_der_read, METH_VARARGS), @@ -7677,14 +8089,6 @@ static struct PyMethodDef pkcs10_object_methods[] = { {NULL} }; -static void -pkcs10_object_dealloc(pkcs10_object *self) -{ - X509_REQ_free(self->pkcs10); - sk_X509_EXTENSION_pop_free(self->exts, X509_EXTENSION_free); - self->ob_type->tp_free((PyObject*) self); -} - static char POW_PKCS10_Type__doc__[] = "This class represents a PKCS#10 request.\n" "\n" @@ -7733,9 +8137,6 @@ static PyTypeObject POW_PKCS10_Type = { pkcs10_object_new, /* tp_new */ }; - - - /* @@ -7759,6 +8160,8 @@ pow_module_add_object(PyObject *self, PyObject *args) { char *oid = NULL, *sn = NULL, *ln = NULL; + ENTERING(pow_module_add_object); + if (!PyArg_ParseTuple(args, "sss", &oid, &sn, &ln)) goto error; @@ -7783,6 +8186,8 @@ pow_module_get_error(PyObject *self) unsigned long error = ERR_get_error(); char buf[256]; + ENTERING(pow_module_get_error); + if (!error) Py_RETURN_NONE; @@ -7797,6 +8202,7 @@ static char pow_module_clear_error__doc__[] = static PyObject * pow_module_clear_error(PyObject *self) { + ENTERING(pow_module_clear_error); ERR_clear_error(); Py_RETURN_NONE; } @@ -7814,6 +8220,8 @@ pow_module_seed(PyObject *self, PyObject *args) char *data = NULL; int datalen = 0; + ENTERING(pow_module_seed); + if (!PyArg_ParseTuple(args, "s#", &data, &datalen)) goto error; @@ -7842,6 +8250,8 @@ pow_module_add(PyObject *self, PyObject *args) int datalen = 0; double entropy = 0; + ENTERING(pow_module_add); + if (!PyArg_ParseTuple(args, "s#d", &data, &datalen, &entropy)) goto error; @@ -7865,6 +8275,8 @@ pow_module_write_random_file(PyObject *self, PyObject *args) { char *filename = NULL; + ENTERING(pow_module_write_random_file); + if (!PyArg_ParseTuple(args, "s", &filename)) goto error; @@ -7890,6 +8302,8 @@ pow_module_read_random_file(PyObject *self, PyObject *args) char *file = NULL; int len = -1; + ENTERING(pow_module_read_random_file); + if (!PyArg_ParseTuple(args, "s|i", &file, &len)) goto error; diff --git a/rpkid/rpki/x509.py b/rpkid/rpki/x509.py index c65fbb72..4cd4a5c2 100644 --- a/rpkid/rpki/x509.py +++ b/rpkid/rpki/x509.py @@ -596,7 +596,7 @@ class X509(DER_object): """ Extract the public key from this certificate. """ - return RSApublic(DER = self.get_POWpkix().tbs.subjectPublicKeyInfo.toString()) + return RSApublic(POW = self.get_POW().getPublicKey()) def get_SKI(self): """ @@ -632,7 +632,7 @@ class X509(DER_object): resources = resources, is_ca = is_ca, aki = self.get_SKI(), - issuer_name = self.get_POWpkix().getSubject()) + issuer_name = self.getSubject()) @classmethod @@ -658,7 +658,7 @@ class X509(DER_object): resources = resources, is_ca = True, aki = ski, - issuer_name = (((rpki.oids.name2oid["commonName"], ("printableString", cn)),),)) + issuer_name = X501DN.from_cn(cn)) @staticmethod @@ -679,7 +679,7 @@ class X509(DER_object): cert = rpki.POW.pkix.Certificate() cert.setVersion(2) cert.setSerial(serial) - cert.setIssuer(issuer_name) + cert.setIssuer(issuer_name.get_POWpkix()) cert.setSubject((((rpki.oids.name2oid["commonName"], ("printableString", cn)),),)) cert.setNotBefore(now.toASN1tuple()) cert.setNotAfter(notAfter.toASN1tuple()) @@ -839,7 +839,6 @@ class X509(DER_object): """ return self.getNotBefore() - class PKCS10(DER_object): """ Class to hold a PKCS #10 request. @@ -847,7 +846,20 @@ class PKCS10(DER_object): formats = ("DER", "POW", "POWpkix") pem_converter = PEM_converter("CERTIFICATE REQUEST") - + + ## @var expected_ca_keyUsage + # KeyUsage extension flags expected for CA requests. + + expected_ca_keyUsage = frozenset(("keyCertSign", "cRLSign")) + + ## @var allowed_extensions + # Extensions allowed by RPKI profile. + + allowed_extensions = frozenset(rpki.oids.safe_name2dotted(name) + for name in ("basicConstraints", + "keyUsage", + "subjectInfoAccess")) + def get_DER(self): """ Get the DER value of this certification request. @@ -892,7 +904,7 @@ class PKCS10(DER_object): """ Extract the public key from this certification request. """ - return RSApublic(DER = self.get_POWpkix().certificationRequestInfo.subjectPublicKeyInfo.toString()) + return RSApublic(POW = self.get_POW().getPublicKey()) def check_valid_rpki(self): """ @@ -909,44 +921,63 @@ class PKCS10(DER_object): RPKI profile only allows EKU for EE certificates. """ - if not self.get_POWpkix().verify(): + if not self.get_POW().verify(): raise rpki.exceptions.BadPKCS10, "Signature check failed" - if self.get_POWpkix().certificationRequestInfo.version.get() != 0: - raise rpki.exceptions.BadPKCS10, \ - "Bad version number %s" % self.get_POWpkix().certificationRequestInfo.version + ver = self.get_POW().getVersion() - if rpki.oids.oid2name.get(self.get_POWpkix().signatureAlgorithm.algorithm.get()) != "sha256WithRSAEncryption": - raise rpki.exceptions.BadPKCS10, "Bad signature algorithm %s" % self.get_POWpkix().signatureAlgorithm + if ver != 0: + raise rpki.exceptions.BadPKCS10, "Bad version number %s" % ver - exts = dict((rpki.oids.oid2name.get(oid, oid), value) - for (oid, critical, value) in self.get_POWpkix().getExtensions()) + alg = rpki.oids.safe_dotted2name(self.get_POW().getSignatureAlgorithm()) - if any(oid not in ("basicConstraints", "keyUsage", "subjectInfoAccess") for oid in exts): - raise rpki.exceptions.BadExtension, "Forbidden extension(s) in certificate request" + if alg != "sha256WithRSAEncryption": + raise rpki.exceptions.BadPKCS10, "Bad signature algorithm %s" % alg - if "basicConstraints" not in exts or not exts["basicConstraints"][0]: + bc = self.get_POW().getBasicConstraints() + + if bc is None or not bc[0]: raise rpki.exceptions.BadPKCS10, "Request for EE certificate not allowed here" - if exts["basicConstraints"][1] is not None: + if bc[1] is not None: raise rpki.exceptions.BadPKCS10, "basicConstraints must not specify Path Length" - if "keyUsage" in exts and (not exts["keyUsage"][5] or not exts["keyUsage"][6]): - raise rpki.exceptions.BadPKCS10, "keyUsage doesn't match basicConstraints" + ku = self.get_POW().getKeyUsage() - sias = dict((rpki.oids.oid2name.get(oid, oid), value[1]) - for oid, value in exts.get("subjectInfoAccess", ()) - if value[0] == "uri" and value[1].startswith("rsync://")) + if ku is not None and self.expected_ca_keyUsage != ku: + raise rpki.exceptions.BadPKCS10, "keyUsage doesn't match basicConstraints: %r" % ku - for oid in ("id-ad-caRepository", "id-ad-rpkiManifest"): - if oid not in sias: - raise rpki.exceptions.BadPKCS10, "Certificate request is missing SIA %s" % oid + if any(oid not in self.allowed_extensions + for oid in self.get_POW().getExtensionOIDs()): + raise rpki.exceptions.BadExtension, "Forbidden extension(s) in certificate request" + + sias = self.get_POW().getSIA() + + if sias is None: + raise rpki.exceptions.BadPKCS10, "Certificate request is missing SIA extension" + + caRepository, rpkiManifest, signedObject = sias + + if signedObject: + raise rpki.exceptions.BadPKCS10, "CA certificate request has SIA id-ad-signedObject" + + if not caRepository: + raise rpki.exceptions.BadPKCS10, "Certificate request is missing SIA id-ad-caRepository" + + if not any(uri.startswith("rsync://") for uri in caRepository): + raise rpki.exceptions.BadPKCS10, "Certificate request SIA id-ad-caRepository contains no rsync URIs" + + if not rpkiManifest: + raise rpki.exceptions.BadPKCS10, "Certificate request is missing SIA id-ad-rpkiManifest" + + if not any(uri.startswith("rsync://") for uri in rpkiManifest): + raise rpki.exceptions.BadPKCS10, "Certificate request SIA id-ad-rpkiManifest contains no rsync URIs" - if not sias["id-ad-caRepository"].endswith("/"): - raise rpki.exceptions.BadPKCS10, "Certificate request id-ad-caRepository does not end with slash: %r" % sias["id-ad-caRepository"] + if any(uri.startswith("rsync://") and not uri.endswith("/") for uri in caRepository): + raise rpki.exceptions.BadPKCS10, "Certificate request SIA id-ad-caRepository does not end with slash" - if sias["id-ad-rpkiManifest"].endswith("/"): - raise rpki.exceptions.BadPKCS10, "Certificate request id-ad-rpkiManifest ends with slash: %r" % sias["id-ad-rpkiManifest"] + if any(uri.startswith("rsync://") and uri.endswith("/") for uri in rpkiManifest): + raise rpki.exceptions.BadPKCS10, "Certificate request SIA id-ad-rpkiManifest ends with slash" @classmethod def create_ca(cls, keypair, sia = None): |