diff options
-rw-r--r-- | rpkid/ext/POW.c | 1268 |
1 files changed, 543 insertions, 725 deletions
diff --git a/rpkid/ext/POW.c b/rpkid/ext/POW.c index 2ac5b682..fdb863d0 100644 --- a/rpkid/ext/POW.c +++ b/rpkid/ext/POW.c @@ -197,6 +197,11 @@ typedef struct { /*========== C structs ==========*/ +/* Declarations */ + +static PyObject * +x509_revoked_object_new(PyTypeObject *type, PyObject *args, PyObject *kwds); + /*========== helper functions ==========*/ /* @@ -347,16 +352,20 @@ set_openssl_exception(PyObject *error_class, const char *msg) Py_XDECREF(errors); } -static PyObject * -x509_object_helper_set_name(X509_NAME *name, PyObject *dn_obj) +static X509_NAME * +x509_object_helper_set_name(PyObject *dn_obj) { PyObject *rdn_obj = NULL; PyObject *pair_obj = NULL; PyObject *type_obj = NULL; PyObject *value_obj = NULL; + X509_NAME *name = NULL; char *type_str, *value_str; int asn1_type, i, j; + if ((name = X509_NAME_new()) == NULL) + lose_no_memory(); + for (i = 0; i < PySequence_Size(dn_obj); i++) { if ((rdn_obj = PySequence_GetItem(dn_obj, i)) == NULL) @@ -397,9 +406,10 @@ x509_object_helper_set_name(X509_NAME *name, PyObject *dn_obj) rdn_obj = NULL; } - Py_RETURN_NONE; + return name; error: + X509_NAME_free(name); Py_XDECREF(rdn_obj); Py_XDECREF(pair_obj); Py_XDECREF(type_obj); @@ -630,35 +640,30 @@ BIO_to_PyString_helper(BIO *bio) /*========== helper functions ==========*/ /*========== X509 code ==========*/ -static x509_object * -x509_object_new(void) + +static PyObject * +x509_object_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { x509_object *self; - if ((self = PyObject_New(x509_object, &x509type)) == NULL) - goto error; - - self->x509 = X509_new(); - return self; - - error: + if ((self = (x509_object *) type->tp_alloc(type, 0)) != NULL && + (self->x509 = X509_new()) != NULL) + return (PyObject *) self; Py_XDECREF(self); return NULL; } -/* - * This function is pretty dumb. Most of the work is done by the module - * function pow_module_pem_read(). - */ static x509_object * x509_object_pem_read(BIO *in) { - x509_object *self; + x509_object *self = NULL; - if ((self = PyObject_New(x509_object, &x509type)) == NULL) + if ((self = (x509_object *) x509_object_new(&x509type, NULL, NULL)) == NULL) goto error; + X509_free(self->x509); + if ((self->x509 = PEM_read_bio_X509(in, NULL, NULL, NULL)) == NULL) lose_openssl_error("Couldn't load PEM encoded certificate"); @@ -674,14 +679,11 @@ static x509_object * x509_object_der_read(unsigned char *src, int len) { x509_object *self; - unsigned char *ptr = src; - if ((self = PyObject_New(x509_object, &x509type)) == NULL) + if ((self = (x509_object *) x509_object_new(&x509type, NULL, NULL)) == NULL) goto error; - self->x509 = X509_new(); - - if(!d2i_X509(&self->x509, (const unsigned char **) &ptr, len)) + if(!d2i_X509(&self->x509, (const unsigned char **) &src, len)) lose_openssl_error("Couldn't load PEM encoded certificate"); return self; @@ -692,11 +694,6 @@ x509_object_der_read(unsigned char *src, int len) return NULL; } -/* - * Unlike the previous function this creates the BIO itself. The BIO_s_mem - * is used as a buffer which the certificate is read into, from this buffer - * it is read into a char[] and returned as a string. - */ static PyObject * x509_object_write_helper(x509_object *self, int format) { @@ -791,7 +788,6 @@ static char x509_object_set_public_key__doc__[] = "</method>\n" ; - static PyObject * x509_object_set_public_key(x509_object *self, PyObject *args) { @@ -804,11 +800,9 @@ x509_object_set_public_key(x509_object *self, PyObject *args) if ((pkey = EVP_PKEY_new()) == NULL) lose_no_memory(); - if (!EVP_PKEY_assign_RSA(pkey, asym->cipher)) - lose("EVP_PKEY assignment error"); - - if (!X509_set_pubkey(self->x509,pkey)) - lose("Couldn't set certificate's public key"); + if (!EVP_PKEY_assign_RSA(pkey, asym->cipher) || + !X509_set_pubkey(self->x509, pkey)) + lose_openssl_error("Couldn't set certificate's public key"); Py_RETURN_NONE; @@ -847,7 +841,6 @@ static char x509_object_sign__doc__[] = "</method>\n" ; - static PyObject * x509_object_sign(x509_object *self, PyObject *args) { @@ -866,13 +859,13 @@ x509_object_sign(x509_object *self, PyObject *args) lose("Don't know how to use this type of key"); if (!EVP_PKEY_assign_RSA(pkey, asym->cipher)) - lose("EVP_PKEY assignment error"); + lose_openssl_error("EVP_PKEY assignment error"); if ((digest_method = evp_digest_factory(digest_type)) == NULL) lose("Unsupported digest algorithm"); if (!X509_sign(self->x509, pkey, digest_method)) - lose("Couldn't sign certificate"); + lose_openssl_error("Couldn't sign certificate"); Py_RETURN_NONE; @@ -979,27 +972,22 @@ static char x509_object_set_serial__doc__[] = static PyObject * x509_object_set_serial(x509_object *self, PyObject *args) { - long serial = 0; - ASN1_INTEGER *asn1i = NULL; + long c_serial = 0; + ASN1_INTEGER *asn1_serial = NULL; - if (!PyArg_ParseTuple(args, "l", &serial)) + if (!PyArg_ParseTuple(args, "l", &c_serial)) goto error; - if ((asn1i = ASN1_INTEGER_new()) == NULL) + if ((asn1_serial = ASN1_INTEGER_new()) == NULL || + !ASN1_INTEGER_set(asn1_serial, c_serial) || + !X509_set_serialNumber(self->x509, asn1_serial)) lose_no_memory(); - if (!ASN1_INTEGER_set(asn1i, serial)) - lose("Couldn't set ASN.1 integer"); - - if (!X509_set_serialNumber(self->x509, asn1i)) - lose("Couldn't set certificate serial"); - - ASN1_INTEGER_free(asn1i); - + ASN1_INTEGER_free(asn1_serial); Py_RETURN_NONE; error: - ASN1_INTEGER_free(asn1i); + ASN1_INTEGER_free(asn1_serial); return NULL; } @@ -1040,16 +1028,13 @@ static PyObject * x509_object_get_issuer(x509_object *self, PyObject *args) { PyObject *result = NULL; - X509_NAME *name = NULL; int format = OIDNAME_FORMAT; if (!PyArg_ParseTuple(args, "|i", &format)) goto error; - if ((name = X509_get_issuer_name(self->x509)) == NULL) - lose_openssl_error("Couldn't get issuer name"); - - result = x509_object_helper_get_name(name, format); + result = x509_object_helper_get_name(X509_get_issuer_name(self->x509), + format); error: /* Fall through */ return result; @@ -1076,16 +1061,13 @@ static PyObject * x509_object_get_subject(x509_object *self, PyObject *args) { PyObject *result = NULL; - X509_NAME *name = NULL; int format = OIDNAME_FORMAT; if (!PyArg_ParseTuple(args, "|i", &format)) goto error; - if ((name = X509_get_subject_name(self->x509)) == NULL) - lose("Couldn't get subject name"); - - result = x509_object_helper_get_name(name, format); + result = x509_object_helper_get_name(X509_get_subject_name(self->x509), + format); error: /* Fall through */ return result; @@ -1120,14 +1102,11 @@ x509_object_set_subject(x509_object *self, PyObject *args) if (!PyTuple_Check(name_sequence) && !PyList_Check(name_sequence)) lose_type_error("Inapropriate type"); - if ((name = X509_NAME_new()) == NULL) - lose_no_memory(); - - if (!x509_object_helper_set_name(name, name_sequence)) + if ((name = x509_object_helper_set_name(name_sequence)) == NULL) goto error; if (!X509_set_subject_name(self->x509, name)) - lose("Unable to set name"); + lose("Unable to set subject name"); X509_NAME_free(name); @@ -1167,14 +1146,11 @@ x509_object_set_issuer(x509_object *self, PyObject *args) if (!PyTuple_Check(name_sequence) && !PyList_Check(name_sequence)) lose_type_error("Inapropriate type"); - if ((name = X509_NAME_new()) == NULL) - lose_no_memory(); - - if (!x509_object_helper_set_name(name, name_sequence)) + if ((name = x509_object_helper_set_name(name_sequence)) == NULL) goto error; if (!X509_set_issuer_name(self->x509, name)) - lose("Unable to set name"); + lose("Unable to set issuer name"); X509_NAME_free(name); @@ -1201,7 +1177,6 @@ static char x509_object_get_not_before__doc__[] = " </para>\n" " </body>\n" "</method>\n" - ; static PyObject * @@ -1366,11 +1341,9 @@ x509_object_add_extension(x509_object *self, PyObject *args) if ((extn = X509_EXTENSION_create_by_NID(NULL, nid, critical, octetString)) == NULL) lose_openssl_error("Unable to create ASN.1 X.509 Extension object"); - if (!self->x509->cert_info->extensions && - (self->x509->cert_info->extensions = sk_X509_EXTENSION_new_null()) == NULL) - lose_no_memory(); - - if (!sk_X509_EXTENSION_push(self->x509->cert_info->extensions, extn)) + if ((!self->x509->cert_info->extensions && + (self->x509->cert_info->extensions = sk_X509_EXTENSION_new_null()) == NULL) || + !sk_X509_EXTENSION_push(self->x509->cert_info->extensions, extn)) lose_no_memory(); Py_RETURN_NONE; @@ -1421,12 +1394,7 @@ static char x509_object_count_extensions__doc__[] = static PyObject * x509_object_count_extensions(x509_object *self) { - int num = 0; - - if (self->x509->cert_info->extensions) - num = sk_X509_EXTENSION_num(self->x509->cert_info->extensions); - - return Py_BuildValue("i", num); + return Py_BuildValue("i", sk_X509_EXTENSION_num(self->x509->cert_info->extensions)); } static char x509_object_get_extension__doc__[] = @@ -1448,21 +1416,15 @@ static char x509_object_get_extension__doc__[] = static PyObject * x509_object_get_extension(x509_object *self, PyObject *args) { - int num = 0, index = 0, ext_nid = 0; + int ext_num = 0, ext_nid = 0; char const *ext_ln = NULL; char unknown_ext [] = "unknown"; X509_EXTENSION *ext; - if (!PyArg_ParseTuple(args, "i", &index)) + if (!PyArg_ParseTuple(args, "i", &ext_num)) goto error; - if (self->x509->cert_info->extensions) - num = sk_X509_EXTENSION_num(self->x509->cert_info->extensions); - - if (index >= num) - lose("Certificate doesn't have that many extensions"); - - if ((ext = sk_X509_EXTENSION_value(self->x509->cert_info->extensions, index)) == NULL) + if ((ext = sk_X509_EXTENSION_value(self->x509->cert_info->extensions, ext_num)) == NULL) lose_openssl_error("Couldn't get extension"); if ((ext_nid = OBJ_obj2nid(ext->object)) == NID_undef) @@ -1554,17 +1516,11 @@ static struct PyMethodDef x509_object_methods[] = { {NULL} }; -static PyObject * -x509_object_getattr(x509_object *self, char *name) -{ - return Py_FindMethod(x509_object_methods, (PyObject *)self, name); -} - static void -x509_object_dealloc(x509_object *self, char *name) +x509_object_dealloc(x509_object *self) { X509_free(self->x509); - PyObject_Del(self); + self->ob_type->tp_free((PyObject*) self); } static char x509type__doc__[] = @@ -1616,45 +1572,59 @@ static char x509type__doc__[] = ; static PyTypeObject x509type = { - PyObject_HEAD_INIT(0) - 0, /*ob_size*/ - "X509", /*tp_name*/ - sizeof(x509_object), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - (destructor)x509_object_dealloc, /*tp_dealloc*/ - (printfunc)0, /*tp_print*/ - (getattrfunc)x509_object_getattr, /*tp_getattr*/ - (setattrfunc)0, /*tp_setattr*/ - (cmpfunc)0, /*tp_compare*/ - (reprfunc)0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - (hashfunc)0, /*tp_hash*/ - (ternaryfunc)0, /*tp_call*/ - (reprfunc)0, /*tp_str*/ - 0, - 0, - 0, - 0, - x509type__doc__ /* Documentation string */ + PyObject_HEAD_INIT(0) + 0, /* ob_size */ + "_POW.X509", /* tp_name */ + sizeof(x509_object), /* tp_basicsize */ + 0, /* tp_itemsize */ + (destructor)x509_object_dealloc, /* tp_dealloc */ + 0, /* tp_print */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_compare */ + 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + x509type__doc__, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + x509_object_methods, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + 0, /* tp_alloc */ + x509_object_new, /* tp_new */ }; + /*========== X509 Code ==========*/ /*========== x509 store Code ==========*/ -static x509_store_object * -x509_store_object_new(void) + +static PyObject * +x509_store_object_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { x509_store_object *self = NULL; - if ((self = PyObject_New(x509_store_object, &x509_storetype)) == NULL) - goto error; - - self->store = X509_STORE_new(); - - return self; - - error: + if ((self = (x509_store_object *) type->tp_alloc(type, 0)) != NULL && + (self->store = X509_STORE_new()) != NULL) + return (PyObject *) self; Py_XDECREF(self); return NULL; @@ -1918,17 +1888,11 @@ static struct PyMethodDef x509_store_object_methods[] = { {NULL} }; -static PyObject * -x509_store_object_getattr(x509_store_object *self, char *name) -{ - return Py_FindMethod(x509_store_object_methods, (PyObject *)self, name); -} - static void -x509_store_object_dealloc(x509_store_object *self, char *name) +x509_store_object_dealloc(x509_store_object *self) { X509_STORE_free(self->store); - PyObject_Del(self); + self->ob_type->tp_free((PyObject*) self); } static char x509_storetype__doc__[] = @@ -1970,45 +1934,59 @@ static char x509_storetype__doc__[] = ; static PyTypeObject x509_storetype = { - PyObject_HEAD_INIT(0) - 0, /*ob_size*/ - "X509Store", /*tp_name*/ - sizeof(x509_store_object), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - (destructor)x509_store_object_dealloc, /*tp_dealloc*/ - (printfunc)0, /*tp_print*/ - (getattrfunc)x509_store_object_getattr, /*tp_getattr*/ - (setattrfunc)0, /*tp_setattr*/ - (cmpfunc)0, /*tp_compare*/ - (reprfunc)0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - (hashfunc)0, /*tp_hash*/ - (ternaryfunc)0, /*tp_call*/ - (reprfunc)0, /*tp_str*/ - 0, - 0, - 0, - 0, - x509_storetype__doc__ /* Documentation string */ + PyObject_HEAD_INIT(0) + 0, /* ob_size */ + "_POW.X509Store", /* tp_name */ + sizeof(x509_store_object), /* tp_basicsize */ + 0, /* tp_itemsize */ + (destructor)x509_store_object_dealloc, /* tp_dealloc */ + 0, /* tp_print */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_compare */ + 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + x509_storetype__doc__, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + x509_store_object_methods, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + 0, /* tp_alloc */ + x509_store_object_new, /* tp_new */ }; + /*========== x509 store Code ==========*/ /*========== x509 crl Code ==========*/ -static x509_crl_object * -x509_crl_object_new(void) + +static PyObject * +x509_crl_object_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { x509_crl_object *self = NULL; - if ((self = PyObject_New(x509_crl_object, &x509_crltype)) == NULL) - goto error; - - self->crl = X509_CRL_new(); - - return self; - - error: + if ((self = (x509_crl_object *) type->tp_alloc(type, 0)) != NULL && + (self->crl = X509_CRL_new()) != NULL) + return (PyObject *) self; Py_XDECREF(self); return NULL; @@ -2019,11 +1997,13 @@ x509_crl_object_pem_read(BIO *in) { x509_crl_object *self; - if ((self = PyObject_New(x509_crl_object, &x509_crltype)) == NULL) + if ((self = (x509_crl_object *) x509_crl_object_new(&x509_crltype, NULL, NULL)) == NULL) goto error; + X509_CRL_free(self->crl); + if ((self->crl = PEM_read_bio_X509_CRL(in, NULL, NULL, NULL)) == NULL) - lose_openssl_error("Couldn't load CRL"); + lose_openssl_error("Couldn't PEM encoded load CRL"); return self; @@ -2037,16 +2017,12 @@ static x509_crl_object * x509_crl_object_der_read(unsigned char *src, int len) { x509_crl_object *self; - unsigned char* ptr = src; - if ((self = PyObject_New(x509_crl_object, &x509_crltype)) == NULL) + if ((self = (x509_crl_object *) x509_crl_object_new(&x509_crltype, NULL, NULL)) == NULL) goto error; - if ((self->crl = X509_CRL_new()) == NULL) - lose_no_memory(); - - if (!d2i_X509_CRL(&self->crl, (const unsigned char **) &ptr, len)) - lose_openssl_error("Couldn't load CRL"); + if (!d2i_X509_CRL(&self->crl, (const unsigned char **) &src, len)) + lose_openssl_error("Couldn't load DER encoded CRL"); return self; @@ -2074,16 +2050,7 @@ static char x509_crl_object_get_version__doc__[] = static PyObject * x509_crl_object_get_version(x509_crl_object *self) { - long version = 0; - - if ((version = ASN1_INTEGER_get(self->crl->crl->version)) == -1) - lose("Couldn't get CRL version"); - - return Py_BuildValue("l", version); - - error: - - return NULL; + return Py_BuildValue("l", ASN1_INTEGER_get(self->crl->crl->version)); } static char x509_crl_object_set_version__doc__[] = @@ -2107,23 +2074,16 @@ static PyObject * x509_crl_object_set_version(x509_crl_object *self, PyObject *args) { long version = 0; - ASN1_INTEGER *asn1_version = NULL; if (!PyArg_ParseTuple(args, "i", &version)) goto error; - if ((asn1_version = ASN1_INTEGER_new()) == NULL) + if (!X509_CRL_set_version(self->crl, version)) lose_no_memory(); - if (!ASN1_INTEGER_set(asn1_version, version)) - lose_openssl_error("Couldn't set CRL version"); - - self->crl->crl->version = asn1_version; - Py_RETURN_NONE; error: - ASN1_INTEGER_free(asn1_version); return NULL; } @@ -2189,14 +2149,11 @@ x509_crl_object_set_issuer(x509_crl_object *self, PyObject *args) if (!PyTuple_Check(name_sequence) && !PyList_Check(name_sequence)) lose_type_error("Inapropriate type"); - if ((name = X509_NAME_new()) == NULL) - lose_no_memory(); - - if (!x509_object_helper_set_name(name, name_sequence)) + if ((name = x509_object_helper_set_name(name_sequence)) == NULL) goto error; - if (!X509_NAME_set(&self->crl->crl->issuer, name)) - lose_openssl_error("Unable to set name"); + if (!X509_CRL_set_issuer_name(self->crl, name)) + lose_openssl_error("Unable to set issuer name"); X509_NAME_free(name); @@ -2407,7 +2364,7 @@ x509_crl_object_set_revoked(x509_crl_object *self, PyObject *args) if (!PyArg_ParseTuple(args, "O", &revoked_sequence)) goto error; - if (!PyTuple_Check(revoked_sequence) && !PyList_Check(revoked_sequence)) + if (!PySequence_Check(revoked_sequence)) lose_type_error("inapropriate type"); size = PySequence_Size(revoked_sequence); @@ -2418,11 +2375,11 @@ x509_crl_object_set_revoked(x509_crl_object *self, PyObject *args) if (!X_X509_revoked_Check(revoked)) lose_type_error("inapropriate type"); - if ((tmp_revoked = X509_REVOKED_dup(revoked->revoked)) == NULL) + if ((tmp_revoked = X509_REVOKED_dup(revoked->revoked)) == NULL || + !X509_CRL_add0_revoked(self->crl, tmp_revoked)) lose_no_memory(); - if (!X509_CRL_add0_revoked(self->crl, tmp_revoked)) - lose("Couldn't add revokation to stack"); + tmp_revoked = NULL; Py_XDECREF(revoked); revoked = NULL; @@ -2431,9 +2388,8 @@ x509_crl_object_set_revoked(x509_crl_object *self, PyObject *args) Py_RETURN_NONE; error: - + X509_REVOKED_free(tmp_revoked); Py_XDECREF(revoked); - return NULL; } @@ -2450,9 +2406,11 @@ x509_crl_object_helper_get_revoked(STACK_OF(X509_REVOKED) *revoked) lose_no_memory(); for (i = 0; i < no_entries; i++) { - if ((revoke_obj = PyObject_New(x509_revoked_object, &x509_revokedtype)) == NULL) + if ((revoke_obj = (x509_revoked_object *) x509_revoked_object_new(&x509_revokedtype, NULL, NULL)) == NULL) lose_no_memory(); + X509_REVOKED_free(revoke_obj->revoked); + if ((revoke_obj->revoked = X509_REVOKED_dup(sk_X509_REVOKED_value(revoked, i))) == NULL) goto error; @@ -2580,28 +2538,27 @@ x509_crl_object_add_extension(x509_crl_object *self, PyObject *args) if (!PyArg_ParseTuple(args, "sis#", &name, &critical, &buf, &len)) goto error; - if ((octetString = M_ASN1_OCTET_STRING_new()) == NULL) + if ((octetString = ASN1_OCTET_STRING_new()) == NULL || + !ASN1_OCTET_STRING_set(octetString, buf, len)) lose_no_memory(); - if (!ASN1_OCTET_STRING_set(octetString, buf, len)) - lose_openssl_error("Couldn't set ASN.1 OCTET STRING"); - if ((nid = OBJ_txt2nid(name)) == NID_undef) lose("Extension has unknown object identifier"); if ((extn = X509_EXTENSION_create_by_NID(NULL, nid, critical, octetString)) == NULL) lose_openssl_error("Unable to create ASN.1 X.509 Extension object"); - if (!self->crl->crl->extensions && - (self->crl->crl->extensions = sk_X509_EXTENSION_new_null()) == NULL) - lose_no_memory(); + octetString = NULL; - if (!sk_X509_EXTENSION_push(self->crl->crl->extensions, extn)) + if ((!self->crl->crl->extensions && + (self->crl->crl->extensions = sk_X509_EXTENSION_new_null()) == NULL) || + !sk_X509_EXTENSION_push(self->crl->crl->extensions, extn)) lose_no_memory(); Py_RETURN_NONE; error: + ASN1_OCTET_STRING_free(octetString); X509_EXTENSION_free(extn); return NULL; } @@ -2647,12 +2604,7 @@ static char x509_crl_object_count_extensions__doc__[] = static PyObject * x509_crl_object_count_extensions(x509_crl_object *self) { - int num = 0; - - if (self->crl->crl->extensions) - num = sk_X509_EXTENSION_num(self->crl->crl->extensions); - - return Py_BuildValue("i", num); + return Py_BuildValue("i", sk_X509_EXTENSION_num(self->crl->crl->extensions)); } static char x509_crl_object_get_extension__doc__[] = @@ -2674,7 +2626,7 @@ static char x509_crl_object_get_extension__doc__[] = static PyObject * x509_crl_object_get_extension(x509_crl_object *self, PyObject *args) { - int num = 0, index = 0, ext_nid = 0; + int ext_num = 0, ext_nid = 0; char const *ext_ln = NULL; char unknown_ext [] = "unknown"; X509_EXTENSION *ext; @@ -2682,14 +2634,7 @@ x509_crl_object_get_extension(x509_crl_object *self, PyObject *args) if (!PyArg_ParseTuple(args, "i", &index)) goto error; - if (self->crl->crl->extensions) - num = sk_X509_EXTENSION_num(self->crl->crl->extensions); - - - if (index >= num) - lose("CRL does not have that many extensions"); - - if ((ext = sk_X509_EXTENSION_value(self->crl->crl->extensions, index)) == NULL) + if ((ext = sk_X509_EXTENSION_value(self->crl->crl->extensions, ext_num)) == NULL) lose_openssl_error("Couldn't get extension"); if ((ext_nid = OBJ_obj2nid(ext->object)) == NID_undef) @@ -2750,13 +2695,11 @@ x509_crl_object_sign(x509_crl_object *self, PyObject *args) if (asym->key_type != RSA_PRIVATE_KEY) lose("Don't know how to use this type of key"); - if (!EVP_PKEY_assign_RSA(pkey, asym->cipher)) - lose_openssl_error("EVP_PKEY assignment error"); - if ((digest_method = evp_digest_factory(digest_type)) == NULL) lose("Unsupported digest algorithm"); - if (!X509_CRL_sign(self->crl, pkey, digest_method)) + if (!EVP_PKEY_assign_RSA(pkey, asym->cipher) || + !X509_CRL_sign(self->crl, pkey, digest_method)) lose_openssl_error("Couldn't sign CRL"); Py_RETURN_NONE; @@ -2939,17 +2882,11 @@ static struct PyMethodDef x509_crl_object_methods[] = { {NULL} }; -static PyObject * -x509_crl_object_getattr(x509_crl_object *self, char *name) -{ - return Py_FindMethod(x509_crl_object_methods, (PyObject *)self, name); -} - static void -x509_crl_object_dealloc(x509_crl_object *self, char *name) +x509_crl_object_dealloc(x509_crl_object *self) { X509_CRL_free(self->crl); - PyObject_Del(self); + self->ob_type->tp_free((PyObject*) self); } static char x509_crltype__doc__[] = @@ -2968,42 +2905,62 @@ static char x509_crltype__doc__[] = static PyTypeObject x509_crltype = { PyObject_HEAD_INIT(0) - 0, /*ob_size*/ - "X509Crl", /*tp_name*/ - sizeof(x509_crl_object), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - (destructor)x509_crl_object_dealloc, /*tp_dealloc*/ - (printfunc)0, /*tp_print*/ - (getattrfunc)x509_crl_object_getattr, /*tp_getattr*/ - (setattrfunc)0, /*tp_setattr*/ - (cmpfunc)0, /*tp_compare*/ - (reprfunc)0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - (hashfunc)0, /*tp_hash*/ - (ternaryfunc)0, /*tp_call*/ - (reprfunc)0, /*tp_str*/ - 0, - 0, - 0, - 0, - x509_crltype__doc__ /* Documentation string */ + 0, /* ob_size */ + "_POW.X509Crl", /* tp_name */ + sizeof(x509_crl_object), /* tp_basicsize */ + 0, /* tp_itemsize */ + (destructor)x509_crl_object_dealloc, /* tp_dealloc */ + 0, /* tp_print */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_compare */ + 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + x509_crltype__doc__, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + x509_crl_object_methods, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + 0, /* tp_alloc */ + x509_crl_object_new, /* tp_new */ }; + /*========== x509 crl Code ==========*/ /*========== revoked Code ==========*/ -static x509_revoked_object* x509_revoked_object_new(void) + +static PyObject * +x509_revoked_object_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { x509_revoked_object *self = NULL; - if ((self = PyObject_New(x509_revoked_object, &x509_revokedtype)) == NULL) + if ((self = (x509_revoked_object *) type->tp_alloc(type, 0)) == NULL) goto error; if ((self->revoked = X509_REVOKED_new()) == NULL) - lose_no_memory(); + goto error; - return self; + return (PyObject *) self; error: @@ -3011,6 +2968,28 @@ static x509_revoked_object* x509_revoked_object_new(void) return NULL; } +static int +x509_revoked_object_init(x509_revoked_object *self, PyObject *args, PyObject *kwds) +{ + static char *kwlist[] = {"serial", "date", NULL}; + int serial = -1; + char *date = NULL; + + if (!PyArg_ParseTupleAndKeywords(args, kwds, "|is", kwlist, &serial, &date)) + goto error; + + if (serial != -1 && !ASN1_INTEGER_set(self->revoked->serialNumber, serial)) + lose_no_memory(); + + if (date != NULL && !python_ASN1_TIME_set_string(self->revoked->revocationDate, date)) + lose_no_memory(); + + return 0; + + error: + return -1; +} + static char x509_revoked_object_set_serial__doc__[] = "<method>\n" " <header>\n" @@ -3037,7 +3016,7 @@ x509_revoked_object_set_serial(x509_revoked_object *self, PyObject *args) goto error; if (!ASN1_INTEGER_set(self->revoked->serialNumber, serial)) - lose("Unable to set serial number"); + lose_no_memory(); Py_RETURN_NONE; @@ -3064,16 +3043,7 @@ static char x509_revoked_object_get_serial__doc__[] = static PyObject * x509_revoked_object_get_serial(x509_revoked_object *self) { - int serial = 0; - - if ((serial = ASN1_INTEGER_get(self->revoked->serialNumber)) == -1) - lose("Unable to get serial number"); - - return Py_BuildValue("i", serial); - - error: - - return NULL; + return Py_BuildValue("i", ASN1_INTEGER_get(self->revoked->serialNumber)); } static char x509_revoked_object_get_date__doc__[] = @@ -3183,27 +3153,27 @@ X509_revoked_object_add_extension(x509_revoked_object *self, PyObject *args) if (!PyArg_ParseTuple(args, "sis#", &name, &critical, &buf, &len)) goto error; - if ((octetString = M_ASN1_OCTET_STRING_new()) == NULL) + if ((octetString = ASN1_OCTET_STRING_new()) == NULL || + !ASN1_OCTET_STRING_set(octetString, buf, strlen((char *) buf))) lose_no_memory(); - if (!ASN1_OCTET_STRING_set(octetString, buf, strlen((char *) buf))) - lose_openssl_error("Couldn't set ASN.1 OCTET STRING"); - if ((nid = OBJ_txt2nid(name)) == NID_undef) lose("Extension has unknown object identifier"); if ((extn = X509_EXTENSION_create_by_NID(NULL, nid, critical, octetString)) == NULL) lose_openssl_error("Unable to create ASN.1 X.509 Extension object"); - if (!self->revoked->extensions && (self->revoked->extensions = sk_X509_EXTENSION_new_null()) == NULL) - lose_no_memory(); + octetString = NULL; - if (!sk_X509_EXTENSION_push(self->revoked->extensions, extn)) + if ((!self->revoked->extensions && + (self->revoked->extensions = sk_X509_EXTENSION_new_null()) == NULL) || + !sk_X509_EXTENSION_push(self->revoked->extensions, extn)) lose_no_memory(); Py_RETURN_NONE; error: + ASN1_OCTET_STRING_free(octetString); X509_EXTENSION_free(extn); return NULL; } @@ -3249,16 +3219,7 @@ static char X509_revoked_object_count_extensions__doc__[] = static PyObject * X509_revoked_object_count_extensions(x509_revoked_object *self) { - int num = 0; - - if (self->revoked->extensions) - num = sk_X509_EXTENSION_num(self->revoked->extensions); - - return Py_BuildValue("i", num); - - error: - - return NULL; + return Py_BuildValue("i", sk_X509_EXTENSION_num(self->revoked->extensions)); } static char X509_revoked_object_get_extension__doc__[] = @@ -3280,21 +3241,15 @@ static char X509_revoked_object_get_extension__doc__[] = static PyObject * X509_revoked_object_get_extension(x509_revoked_object *self, PyObject *args) { - int num = 0, index = 0, ext_nid = 0; + int ext_num = 0, ext_nid = 0; char const *ext_ln = NULL; char unknown_ext [] = "unknown"; X509_EXTENSION *ext; - if (!PyArg_ParseTuple(args, "i", &index)) + if (!PyArg_ParseTuple(args, "i", &ext_num)) goto error; - if (self->revoked->extensions) - num = sk_X509_EXTENSION_num(self->revoked->extensions); - - if (index >= num) - lose("Revocation object doesn't have that many extensions"); - - if ((ext = sk_X509_EXTENSION_value(self->revoked->extensions, index)) == NULL) + if ((ext = sk_X509_EXTENSION_value(self->revoked->extensions, ext_num)) == NULL) lose_openssl_error("Couldn't get extension"); if ((ext_nid = OBJ_obj2nid(ext->object)) == NID_undef) @@ -3322,17 +3277,11 @@ static struct PyMethodDef x509_revoked_object_methods[] = { {NULL} }; -static PyObject * -x509_revoked_object_getattr(x509_revoked_object *self, char *name) -{ - return Py_FindMethod(x509_revoked_object_methods, (PyObject *) self, name); -} - static void -x509_revoked_object_dealloc(x509_revoked_object *self, char *name) +x509_revoked_object_dealloc(x509_revoked_object *self) { X509_REVOKED_free(self->revoked); - PyObject_Del(self); + self->ob_type->tp_free((PyObject*) self); } static char x509_revokedtype__doc__[] = @@ -3357,54 +3306,97 @@ static char x509_revokedtype__doc__[] = static PyTypeObject x509_revokedtype = { PyObject_HEAD_INIT(0) - 0, /*ob_size*/ - "X509Revoked", /*tp_name*/ - sizeof(x509_revoked_object), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - (destructor)x509_revoked_object_dealloc, /*tp_dealloc*/ - (printfunc)0, /*tp_print*/ - (getattrfunc)x509_revoked_object_getattr, /*tp_getattr*/ - (setattrfunc)0, /*tp_setattr*/ - (cmpfunc)0, /*tp_compare*/ - (reprfunc)0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - (hashfunc)0, /*tp_hash*/ - (ternaryfunc)0, /*tp_call*/ - (reprfunc)0, /*tp_str*/ - 0, - 0, - 0, - 0, - x509_revokedtype__doc__ /* Documentation string */ + 0, /* ob_size */ + "_POW.X509Revoked", /* tp_name */ + sizeof(x509_revoked_object), /* tp_basicsize */ + 0, /* tp_itemsize */ + (destructor)x509_revoked_object_dealloc, /* tp_dealloc */ + 0, /* tp_print */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_compare */ + 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + x509_revokedtype__doc__, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + x509_revoked_object_methods, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc) x509_revoked_object_init, /* tp_init */ + 0, /* tp_alloc */ + x509_revoked_object_new, /* tp_new */ }; + /*========== x509 revoked Code ==========*/ /*========== asymmetric Object ==========*/ -static asymmetric_object * -asymmetric_object_new(int cipher_type, int key_size) + +static PyObject * +asymmetric_object_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { asymmetric_object *self = NULL; - if ((self = PyObject_New(asymmetric_object, &asymmetrictype)) == NULL) + if ((self = (asymmetric_object *) type->tp_alloc(type, 0)) == NULL) + goto error; + + self->cipher = NULL; + + return (PyObject *) self; + + error: + + Py_XDECREF(self); + return NULL; +} + +static int +asymmetric_object_init(asymmetric_object *self, PyObject *args, PyObject *kwds) +{ + static char *kwlist[] = {"cipher", "key_size", NULL}; + int cipher_type = RSA_CIPHER, key_size = 2048; + + if (!PyArg_ParseTupleAndKeywords(args, kwds, "|ii", kwlist, &cipher_type, &key_size)) goto error; if (cipher_type != RSA_CIPHER) - lose("Unsupported cipher"); + lose("unsupported cipher"); + + switch (self->cipher_type) { + + case RSA_CIPHER: + RSA_free(self->cipher); + break; + } if ((self->cipher = RSA_generate_key(key_size, RSA_F4, NULL, NULL)) == NULL) - lose_openssl_error("Couldn't generate key"); + lose("could not generate key"); self->key_type = RSA_PRIVATE_KEY; self->cipher_type = RSA_CIPHER; - return self; + return 0; error: - - Py_XDECREF(self); - return NULL; + return -1; } static asymmetric_object * @@ -3412,7 +3404,7 @@ asymmetric_object_pem_read(int key_type, BIO *in, char *pass) { asymmetric_object *self = NULL; - if ((self = PyObject_New(asymmetric_object, &asymmetrictype)) == NULL) + if ((self = (asymmetric_object *) asymmetric_object_new(&asymmetrictype, NULL, NULL)) == NULL) goto error; switch (key_type) { @@ -3438,7 +3430,6 @@ asymmetric_object_pem_read(int key_type, BIO *in, char *pass) return self; error: - Py_XDECREF(self); return NULL; } @@ -3447,15 +3438,14 @@ static asymmetric_object * asymmetric_object_der_read(int key_type, unsigned char *src, int len) { asymmetric_object *self = NULL; - unsigned char *ptr = src; - if ((self = PyObject_New(asymmetric_object, &asymmetrictype)) == NULL) + if ((self = (asymmetric_object *) asymmetric_object_new(&asymmetrictype, NULL, NULL)) == NULL) goto error; switch (key_type) { case RSA_PUBLIC_KEY: - if ((self->cipher = d2i_RSA_PUBKEY(NULL, (const unsigned char **) &ptr, len)) == NULL) + if ((self->cipher = d2i_RSA_PUBKEY(NULL, (const unsigned char **) &src, len)) == NULL) lose_openssl_error("Couldn't load public key"); self->key_type = RSA_PUBLIC_KEY; @@ -3464,7 +3454,7 @@ asymmetric_object_der_read(int key_type, unsigned char *src, int len) case RSA_PRIVATE_KEY: - if ((self->cipher = d2i_RSAPrivateKey(NULL, (const unsigned char **) &ptr, len)) == NULL) + if ((self->cipher = d2i_RSAPrivateKey(NULL, (const unsigned char **) &src, len)) == NULL) lose_openssl_error("Couldn't load private key"); self->key_type = RSA_PRIVATE_KEY; @@ -3992,21 +3982,15 @@ static struct PyMethodDef asymmetric_object_methods[] = { {NULL} }; -static PyObject * -asymmetric_object_getattr(asymmetric_object *self, char *name) -{ - return Py_FindMethod(asymmetric_object_methods, (PyObject *)self, name); -} - static void -asymmetric_object_dealloc(asymmetric_object *self, char *name) +asymmetric_object_dealloc(asymmetric_object *self) { - switch(self->cipher_type) { + switch (self->cipher_type) { case RSA_CIPHER: RSA_free(self->cipher); break; } - PyObject_Del(self); + self->ob_type->tp_free((PyObject*) self); } static char asymmetrictype__doc__[] = @@ -4024,53 +4008,90 @@ static char asymmetrictype__doc__[] = "</class>\n" ; + static PyTypeObject asymmetrictype = { - PyObject_HEAD_INIT(0) - 0, /*ob_size*/ - "Asymmetric", /*tp_name*/ - sizeof(asymmetric_object), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - (destructor)asymmetric_object_dealloc, /*tp_dealloc*/ - (printfunc)0, /*tp_print*/ - (getattrfunc)asymmetric_object_getattr, /*tp_getattr*/ - (setattrfunc)0, /*tp_setattr*/ - (cmpfunc)0, /*tp_compare*/ - (reprfunc)0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - (hashfunc)0, /*tp_hash*/ - (ternaryfunc)0, /*tp_call*/ - (reprfunc)0, /*tp_str*/ - 0, - 0, - 0, - 0, - asymmetrictype__doc__ /* Documentation string */ + PyObject_HEAD_INIT(0) + 0, /* ob_size */ + "_POW.Asymmetric", /* tp_name */ + sizeof(asymmetric_object), /* tp_basicsize */ + 0, /* tp_itemsize */ + (destructor)asymmetric_object_dealloc, /* tp_dealloc */ + 0, /* tp_print */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_compare */ + 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + asymmetrictype__doc__, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + asymmetric_object_methods, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc) asymmetric_object_init, /* tp_init */ + 0, /* tp_alloc */ + asymmetric_object_new, /* tp_new */ }; + /*========== asymmetric Code ==========*/ /*========== digest Code ==========*/ -static digest_object * -digest_object_new(int digest_type) + +static PyObject * +digest_object_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { digest_object *self = NULL; + + if ((self = (digest_object *) type->tp_alloc(type, 0)) == NULL) + goto error; + + self->digest_type = 0; + + return (PyObject *) self; + + error: + return NULL; +} + +static int +digest_object_init(digest_object *self, PyObject *args, PyObject *kwds) +{ + static char *kwlist[] = {"digest_type", NULL}; const EVP_MD *digest_method = NULL; + int digest_type = 0; - if ((self = PyObject_New(digest_object, &digesttype)) == NULL) + if (!PyArg_ParseTupleAndKeywords(args, kwds, "i", kwlist, &digest_type)) goto error; if ((digest_method = evp_digest_factory(digest_type)) == NULL) lose("Unsupported digest algorithm"); - EVP_DigestInit(&self->digest_ctx, digest_method); + self->digest_type = digest_type; + if (!EVP_DigestInit(&self->digest_ctx, digest_method)) + lose_openssl_error("Couldn't initialize digest"); - return self; + return 0; error: - - Py_XDECREF(self); - return NULL; + return -1; } static char digest_object_update__doc__[] = @@ -4099,12 +4120,12 @@ digest_object_update(digest_object *self, PyObject *args) if (!PyArg_ParseTuple(args, "s#", &data, &len)) goto error; - EVP_DigestUpdate(&self->digest_ctx, data, len); + if (!EVP_DigestUpdate(&self->digest_ctx, data, len)) + lose_openssl_error("EVP_DigestUpdate() failed"); Py_RETURN_NONE; error: - return NULL; } @@ -4128,7 +4149,7 @@ digest_object_copy(digest_object *self, PyObject *args) { digest_object *new = NULL; - if ((new = PyObject_New(digest_object, &digesttype)) == NULL) + if ((new = (digest_object *) digest_object_new(&digesttype, NULL, NULL)) == NULL) goto error; new->digest_type = self->digest_type; @@ -4164,26 +4185,19 @@ static PyObject * digest_object_digest(digest_object *self) { unsigned char digest_text[EVP_MAX_MD_SIZE]; - void *md_copy = NULL; + EVP_MD_CTX ctx; unsigned digest_len = 0; - if ((md_copy = malloc(sizeof(EVP_MD_CTX))) == NULL) - lose_no_memory(); - - if (!EVP_MD_CTX_copy(md_copy, &self->digest_ctx)) - lose("Couldn't copy digest"); + if (!EVP_MD_CTX_copy(&ctx, &self->digest_ctx)) + lose_openssl_error("Couldn't copy digest"); - EVP_DigestFinal(md_copy, digest_text, &digest_len); + EVP_DigestFinal(&ctx, digest_text, &digest_len); - free(md_copy); + EVP_MD_CTX_cleanup(&ctx); return Py_BuildValue("s#", digest_text, digest_len); error: - - if (md_copy) - free(md_copy); - return NULL; } @@ -4194,17 +4208,11 @@ static struct PyMethodDef digest_object_methods[] = { {NULL} }; -static PyObject * -digest_object_getattr(digest_object *self, char *name) -{ - return Py_FindMethod(digest_object_methods, (PyObject *)self, name); -} - static void -digest_object_dealloc(digest_object *self, char *name) +digest_object_dealloc(digest_object *self) { EVP_MD_CTX_cleanup(&self->digest_ctx); - PyObject_Del(self); + self->ob_type->tp_free((PyObject*) self); } static char digesttype__doc__[] = @@ -4232,46 +4240,61 @@ static char digesttype__doc__[] = "</class>\n" ; + static PyTypeObject digesttype = { PyObject_HEAD_INIT(0) - 0, /*ob_size*/ - "Digest", /*tp_name*/ - sizeof(digest_object), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - (destructor)digest_object_dealloc, /*tp_dealloc*/ - (printfunc)0, /*tp_print*/ - (getattrfunc)digest_object_getattr, /*tp_getattr*/ - (setattrfunc)0, /*tp_setattr*/ - (cmpfunc)0, /*tp_compare*/ - (reprfunc)0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - (hashfunc)0, /*tp_hash*/ - (ternaryfunc)0, /*tp_call*/ - (reprfunc)0, /*tp_str*/ - 0, - 0, - 0, - 0, - digesttype__doc__ /* Documentation string */ + 0, /* ob_size */ + "_POW.Digest", /* tp_name */ + sizeof(digest_object), /* tp_basicsize */ + 0, /* tp_itemsize */ + (destructor)digest_object_dealloc, /* tp_dealloc */ + 0, /* tp_print */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_compare */ + 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + digesttype__doc__, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + digest_object_methods, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc) digest_object_init, /* tp_init */ + 0, /* tp_alloc */ + digest_object_new, /* tp_new */ }; + /*========== digest Code ==========*/ /*========== CMS code ==========*/ -static cms_object * -cms_object_new(void) + +static PyObject * +cms_object_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { cms_object *self; - if ((self = PyObject_New(cms_object, &cmstype)) == NULL) - goto error; - - self->cms = NULL; - return self; - - error: - + if ((self = (cms_object *) type->tp_alloc(type, 0)) != NULL) + return (PyObject *) self; + Py_XDECREF(self); return NULL; } @@ -4281,7 +4304,7 @@ cms_object_pem_read(BIO *in) { cms_object *self; - if ((self = PyObject_New(cms_object, &cmstype)) == NULL) + if ((self = (cms_object *) cms_object_new(&cmstype, NULL, NULL)) == NULL) goto error; if ((self->cms = PEM_read_bio_CMS(in, NULL, NULL, NULL)) == NULL) @@ -4290,7 +4313,6 @@ cms_object_pem_read(BIO *in) return self; error: - Py_XDECREF(self); return NULL; } @@ -4301,13 +4323,11 @@ cms_object_der_read(char *src, int len) cms_object *self; BIO *bio = NULL; - if ((self = PyObject_New(cms_object, &cmstype)) == NULL) + if ((self = (cms_object *) cms_object_new(&cmstype, NULL, NULL)) == NULL) goto error; - if ((self->cms = CMS_ContentInfo_new()) == NULL) - lose_no_memory(); - - if ((bio = BIO_new_mem_buf(src, len)) == NULL) + if ((self->cms = CMS_ContentInfo_new()) == NULL || + (bio = BIO_new_mem_buf(src, len)) == NULL) lose_no_memory(); if (!d2i_CMS_bio(bio, &self->cms)) @@ -4748,22 +4768,20 @@ cms_object_pprint(cms_object *self) result = BIO_to_PyString_helper(bio); error: /* fall through */ - assert_no_unhandled_openssl_errors(); - BIO_free(bio); - return result; } - static PyObject * cms_object_helper_get_cert(void *cert) { - x509_object *obj = PyObject_New(x509_object, &x509type); + x509_object *obj = (x509_object *) x509_object_new(&x509type, NULL, NULL); - if (obj) + if (obj) { + X509_free(obj->x509); obj->x509 = cert; + } return (PyObject *) obj; } @@ -4804,10 +4822,12 @@ cms_object_certs(cms_object *self) static PyObject * cms_object_helper_get_crl(void *crl) { - x509_crl_object *obj = PyObject_New(x509_crl_object, &x509_crltype); + x509_crl_object *obj = (x509_crl_object *) x509_crl_object_new(&x509_crltype, NULL, NULL); - if (obj) + if (obj) { + X509_CRL_free(obj->crl); obj->crl = crl; + } return (PyObject *) obj; } @@ -4858,17 +4878,11 @@ static struct PyMethodDef cms_object_methods[] = { {NULL} }; -static PyObject * -cms_object_getattr(cms_object *self, char *name) -{ - return Py_FindMethod(cms_object_methods, (PyObject *)self, name); -} - static void -cms_object_dealloc(cms_object *self, char *name) +cms_object_dealloc(cms_object *self) { CMS_ContentInfo_free(self->cms); - PyObject_Del(self); + self->ob_type->tp_free((PyObject*) self); } static char cmstype__doc__[] = @@ -4885,168 +4899,51 @@ static char cmstype__doc__[] = ; static PyTypeObject cmstype = { - PyObject_HEAD_INIT(0) - 0, /*ob_size*/ - "CMS", /*tp_name*/ - sizeof(cms_object), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - (destructor)cms_object_dealloc, /*tp_dealloc*/ - (printfunc)0, /*tp_print*/ - (getattrfunc)cms_object_getattr, /*tp_getattr*/ - (setattrfunc)0, /*tp_setattr*/ - (cmpfunc)0, /*tp_compare*/ - (reprfunc)0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - (hashfunc)0, /*tp_hash*/ - (ternaryfunc)0, /*tp_call*/ - (reprfunc)0, /*tp_str*/ - 0, - 0, - 0, - 0, - cmstype__doc__ /* Documentation string */ + PyObject_HEAD_INIT(0) + 0, /* ob_size */ + "_POW.CMS", /* tp_name */ + sizeof(cms_object), /* tp_basicsize */ + 0, /* tp_itemsize */ + (destructor)cms_object_dealloc, /* tp_dealloc */ + 0, /* tp_print */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_compare */ + 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ + cmstype__doc__, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + cms_object_methods, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + 0, /* tp_alloc */ + cms_object_new, /* tp_new */ }; + /*========== CMS Code ==========*/ /*========== module functions ==========*/ -static char pow_module_new_x509__doc__[] = -"<constructor>\n" -" <header>\n" -" <memberof>X509</memberof>\n" -" </header>\n" -" <body>\n" -" <para>\n" -" This constructor creates a skeletal X509 certificate object.\n" -" It won't be any use at all until several structures\n" -" have been created using it's member functions.\n" -" </para>\n" -" </body>\n" -"</constructor>\n" -; - -static PyObject * -pow_module_new_x509 (PyObject *self) -{ - return (PyObject *) x509_object_new(); -} - -static char pow_module_new_asymmetric__doc__[] = -"<constructor>\n" -" <header>\n" -" <memberof>Asymmetric</memberof>\n" -" <parameter>ciphertype = RSA_CIPHER</parameter>\n" -" <parameter>keylength = 1024</parameter>\n" -" </header>\n" -" <body>\n" -" <para>\n" -" This constructor builds a new cipher object. Only RSA ciphers\n" -" are currently support, so the first argument should always be\n" -" <constant>RSA_CIPHER</constant>. The second argument,\n" -" <parameter>keylength</parameter>,\n" -" is normally 512, 768, 1024 or 2048. Key lengths as short as 512\n" -" bits are generally considered weak, and can be cracked by\n" -" determined attackers without tremendous expense.\n" -" </para>\n" -" <example>\n" -" <title><classname>asymmetric</classname> class usage</title>\n" -" <programlisting>\n" -" privateFile = open('test/private.key', 'w')\n" -" publicFile = open('test/public.key', 'w')\n" -"\n" -" passphrase = 'my silly passphrase'\n" -" md5 = POW.Digest(POW.SHA256_DIGEST)\n" -" md5.update(passphrase)\n" -" password = md5.digest()\n" -"\n" -" rsa = POW.Asymmetric(POW.RSA_CIPHER, 1024)\n" -" privateFile.write(rsa.pemWrite(\n" -" POW.RSA_PRIVATE_KEY, password))\n" -" publicFile.write(rsa.pemWrite(POW.RSA_PUBLIC_KEY))\n" -"\n" -" privateFile.close()\n" -" publicFile.close()\n" -" </programlisting>\n" -" </example>\n" -" </body>\n" -"</constructor>\n" -; - -static PyObject * -pow_module_new_asymmetric (PyObject *self, PyObject *args) -{ - int cipher_type = RSA_CIPHER, key_size = 1024; - - if (!PyArg_ParseTuple(args, "|ii", &cipher_type, &key_size)) - goto error; - - return (PyObject*) asymmetric_object_new(cipher_type, key_size); - - error: - - return NULL; -} - -static char pow_module_new_digest__doc__[] = -"<constructor>\n" -" <header>\n" -" <memberof>Digest</memberof>\n" -" <parameter>type</parameter>\n" -" </header>\n" -" <body>\n" -" <para>\n" -" This constructor creates a new <classname>Digest</classname>\n" -" object. The parameter <parameter>type</parameter> specifies what kind\n" -" of digest to create and should be one of the following:\n" -" </para>\n" -" <simplelist>\n" -" <member><constant>MD5_DIGEST</constant></member>\n" -" <member><constant>SHA_DIGEST</constant></member>\n" -" <member><constant>SHA1_DIGEST</constant></member>\n" -" <member><constant>SHA256_DIGEST</constant></member>\n" -" <member><constant>SHA384_DIGEST</constant></member>\n" -" <member><constant>SHA512_DIGEST</constant></member>\n" -" </simplelist>\n" -" </body>\n" -"</constructor>\n" -; - -static PyObject * -pow_module_new_digest (PyObject *self, PyObject *args) -{ - int digest_type = 0; - - if (!PyArg_ParseTuple(args, "i", &digest_type)) - goto error; - - return (PyObject*) digest_object_new(digest_type); - - error: - - return NULL; -} - -static char pow_module_new_cms__doc__[] = -"<constructor>\n" -" <header>\n" -" <memberof>CMS</memberof>\n" -" </header>\n" -" <body>\n" -" <para>\n" -" This constructor creates a skeletal CMS object.\n" -" </para>\n" -" </body>\n" -"</constructor>\n" -; - -static PyObject * -pow_module_new_cms (PyObject *self) -{ - return (PyObject *) cms_object_new(); -} - static char pow_module_pem_read__doc__[] = "<modulefunction>\n" " <header>\n" @@ -5126,7 +5023,6 @@ pow_module_pem_read (PyObject *self, PyObject *args) return NULL; } - static char pow_module_der_read__doc__[] = "<modulefunction>\n" " <header>\n" @@ -5194,88 +5090,6 @@ pow_module_der_read (PyObject *self, PyObject *args) return NULL; } -static char pow_module_new_x509_store__doc__[] = -"<constructor>\n" -" <header>\n" -" <memberof>X509Store</memberof>\n" -" </header>\n" -" <body>\n" -" <para>\n" -" This constructor takes no arguments. The\n" -" <classname>X509Store</classname> returned cannot be used for\n" -" verifying certificates until at least one trusted certificate has been\n" -" added.\n" -" </para>\n" -" </body>\n" -"</constructor>\n" -; - -static PyObject * -pow_module_new_x509_store (PyObject *self) -{ - return (PyObject *) x509_store_object_new(); -} - -static char pow_module_new_x509_crl__doc__[] = -"<constructor>\n" -" <header>\n" -" <memberof>x509_crl</memberof>\n" -" </header>\n" -" <body>\n" -" <para>\n" -" This constructor builds an empty CRL.\n" -" </para>\n" -" </body>\n" -"</constructor>\n" -; - -static PyObject * -pow_module_new_x509_crl (PyObject *self) -{ - return (PyObject *) x509_crl_object_new(); -} - -static char pow_module_new_x509_revoked__doc__[] = -"<constructor>\n" -" <header>\n" -" <memberof>X509Revoked</memberof>\n" -" <parameter>serial</parameter>\n" -" <parameter>date</parameter>\n" -" </header>\n" -" <body>\n" -" <para>\n" -" This constructor builds a X509 Revoked structure. <parameter>serial</parameter>\n" -" should be an integer and <parameter>date</parameter> should be and\n" -" UTCTime string.\n" -" </para>\n" -" </body>\n" -"</constructor>\n" -; - -static PyObject * -pow_module_new_x509_revoked (PyObject *self, PyObject *args) -{ - int serial = -1; - char *date = NULL; - x509_revoked_object *revoke = NULL; - - if (!PyArg_ParseTuple(args, "|is", &serial, &date)) - goto error; - - revoke = x509_revoked_object_new(); - if (serial != -1 && !ASN1_INTEGER_set(revoke->revoked->serialNumber, serial)) - lose("Unable to set serial number"); - - if (date != NULL && !python_ASN1_TIME_set_string(revoke->revoked->revocationDate, date)) - lose_type_error("Couldn't set revocationDate"); - - return (PyObject*) revoke; - - error: - - return NULL; -} - static char pow_module_add_object__doc__[] = "<modulefunction>\n" " <header>\n" @@ -5519,15 +5333,8 @@ pow_module_read_random_file(PyObject *self, PyObject *args) } static struct PyMethodDef pow_module_methods[] = { - Define_Method(X509, pow_module_new_x509, METH_NOARGS), Define_Method(pemRead, pow_module_pem_read, METH_VARARGS), Define_Method(derRead, pow_module_der_read, METH_VARARGS), - Define_Method(Digest, pow_module_new_digest, METH_VARARGS), - Define_Method(CMS, pow_module_new_cms, METH_NOARGS), - Define_Method(Asymmetric, pow_module_new_asymmetric, METH_VARARGS), - Define_Method(X509Store, pow_module_new_x509_store, METH_NOARGS), - Define_Method(X509Crl, pow_module_new_x509_crl, METH_NOARGS), - Define_Method(X509Revoked, pow_module_new_x509_revoked, METH_VARARGS), Define_Method(getError, pow_module_get_error, METH_NOARGS), Define_Method(clearError, pow_module_clear_error, METH_NOARGS), Define_Method(seed, pow_module_seed, METH_VARARGS), @@ -5537,24 +5344,34 @@ static struct PyMethodDef pow_module_methods[] = { Define_Method(addObject, pow_module_add_object, METH_VARARGS), {NULL} }; -/*========== module functions ==========*/ +/*========== module functions ==========*/ /*==========================================================================*/ + void init_POW(void) { - PyObject *m; + PyObject *m = Py_InitModule3("_POW", pow_module_methods, pow_module__doc__); + +#define Define_Class(__type__) \ + do { \ + char *__name__ = strchr(__type__.tp_name, '.'); \ + if (PyType_Ready(&__type__) == 0 && __name__ != NULL) { \ + Py_INCREF(&__type__); \ + PyModule_AddObject(m, __name__+1, (PyObject *) &__type__); \ + } \ + } while (0) - x509type.ob_type = &PyType_Type; - x509_storetype.ob_type = &PyType_Type; - x509_crltype.ob_type = &PyType_Type; - x509_revokedtype.ob_type = &PyType_Type; - asymmetrictype.ob_type = &PyType_Type; - digesttype.ob_type = &PyType_Type; - cmstype.ob_type = &PyType_Type; + Define_Class(x509type); + Define_Class(x509_storetype); + Define_Class(x509_crltype); + Define_Class(x509_revokedtype); + Define_Class(asymmetrictype); + Define_Class(digesttype); + Define_Class(cmstype); - m = Py_InitModule3("_POW", pow_module_methods, pow_module__doc__); +#undef Define_Class #define Define_Exception(__name__, __parent__) \ PyModule_AddObject(m, #__name__, ((__name__##Object) \ @@ -5645,6 +5462,7 @@ init_POW(void) if (PyErr_Occurred()) Py_FatalError("Can't initialize module POW"); } + /*==========================================================================*/ /* |