#include <Python.h>
#define SSL_MODULE
#include "ssl.h"
static char ssl_doc[] = "\n\
Main file of the SSL sub module.\n\
See the file RATIONALE for a short explanation of hy this module was written.\n\
";
static char *CVSid = "@(#) $Id: ssl.c,v 1.2 2004/09/23 14:25:29 murata Exp $";
void **crypto_API;
PyObject *ssl_Error,
*ssl_ZeroReturnError,
*ssl_WantReadError,
*ssl_WantWriteError,
*ssl_WantX509LookupError,
*ssl_SysCallError;
static char ssl_Context_doc[] = "\n\
The factory function inserted in the module dictionary to create Context\n\
objects\n\
\n\
Arguments: spam - Always NULL\n\
args - The Python argument tuple, should be:\n\
method - The SSL method to use\n\
Returns: The Context object\n\
";
static PyObject *
ssl_Context(PyObject *spam, PyObject *args)
{
int method;
if (!PyArg_ParseTuple(args, "i:Context", &method))
return NULL;
return (PyObject *)ssl_Context_New(method);
}
static char ssl_Connection_doc[] = "\n\
The factory function inserted in the module dictionary to create Connection\n\
objects\n\
\n\
Arguments: spam - Always NULL\n\
args - The Python argument tuple, should be:\n\
ctx - An SSL Context to use for this connection\n\
sock - The socket to use for transport layer\n\
Returns: The Connection object\n\
";
static PyObject *
ssl_Connection(PyObject *spam, PyObject *args)
{
ssl_ContextObj *ctx;
PyObject *sock;
if (!PyArg_ParseTuple(args, "O!O:Connection", &ssl_Context_Type, &ctx, &sock))
return NULL;
return (PyObject *)ssl_Connection_New(ctx, sock);
}
static PyMethodDef ssl_methods[] = {
{ "Context", ssl_Context, METH_VARARGS, ssl_Context_doc },
{ "Connection", ssl_Connection, METH_VARARGS, ssl_Connection_doc },
{ NULL, NULL }
};
void
initSSL(void)
{
static void *ssl_API[ssl_API_pointers];
PyObject *ssl_api_object;
PyObject *module, *dict;
SSL_library_init();
ERR_load_SSL_strings();
import_crypto();
if ((module = Py_InitModule3("SSL", ssl_methods, ssl_doc)) == NULL)
return;
ssl_API[ssl_Context_New_NUM] = (void *)ssl_Context_New;
ssl_API[ssl_Connection_New_NUM] = (void *)ssl_Connection_New;
ssl_api_object = PyCObject_FromVoidPtr((void *)ssl_API, NULL);
if (ssl_api_object != NULL)
PyModule_AddObject(module, "_C_API", ssl_api_object);
#define ADD_EXCEPTION(_name, _base) \
do { \
ssl_##_name = PyErr_NewException("SSL."#_name, _base, NULL);\
if (ssl_##_name == NULL) \
goto error; \
if (PyModule_AddObject(module, #_name, ssl_##_name) != 0) \
goto error; \
} while (0)
ssl_Error = PyErr_NewException("SSL.Error", NULL, NULL);
if (ssl_Error == NULL)
goto error;
if (PyModule_AddObject(module, "Error", ssl_Error) != 0)
goto error;
ADD_EXCEPTION(ZeroReturnError, ssl_Error);
ADD_EXCEPTION(WantReadError, ssl_Error);
ADD_EXCEPTION(WantWriteError, ssl_Error);
ADD_EXCEPTION(WantX509LookupError, ssl_Error);
ADD_EXCEPTION(SysCallError, ssl_Error);
#undef ADD_EXCEPTION
PyModule_AddIntConstant(module, "SSLv2_METHOD", ssl_SSLv2_METHOD);
PyModule_AddIntConstant(module, "SSLv3_METHOD", ssl_SSLv3_METHOD);
PyModule_AddIntConstant(module, "SSLv23_METHOD", ssl_SSLv23_METHOD);
PyModule_AddIntConstant(module, "TLSv1_METHOD", ssl_TLSv1_METHOD);
PyModule_AddIntConstant(module, "VERIFY_NONE", SSL_VERIFY_NONE);
PyModule_AddIntConstant(module, "VERIFY_PEER", SSL_VERIFY_PEER);
PyModule_AddIntConstant(module, "VERIFY_FAIL_IF_NO_PEER_CERT",
SSL_VERIFY_FAIL_IF_NO_PEER_CERT);
PyModule_AddIntConstant(module, "VERIFY_CLIENT_ONCE",
SSL_VERIFY_CLIENT_ONCE);
PyModule_AddIntConstant(module, "FILETYPE_PEM", SSL_FILETYPE_PEM);
PyModule_AddIntConstant(module, "FILETYPE_ASN1", SSL_FILETYPE_ASN1);
PyModule_AddIntConstant(module, "OP_SINGLE_DH_USE", SSL_OP_SINGLE_DH_USE);
PyModule_AddIntConstant(module, "OP_EPHEMERAL_RSA", SSL_OP_EPHEMERAL_RSA);
PyModule_AddIntConstant(module, "OP_NO_SSLv2", SSL_OP_NO_SSLv2);
PyModule_AddIntConstant(module, "OP_NO_SSLv3", SSL_OP_NO_SSLv3);
PyModule_AddIntConstant(module, "OP_NO_TLSv1", SSL_OP_NO_TLSv1);
dict = PyModule_GetDict(module);
if (!init_ssl_context(dict))
goto error;
if (!init_ssl_connection(dict))
goto error;
error:
;
}