diff --git a/OpenSSL/ssl/connection.c b/OpenSSL/ssl/connection.c
deleted file mode 100755
index 9428376..0000000
--- a/OpenSSL/ssl/connection.c
+++ /dev/null
@@ -1,1725 +0,0 @@
-/*
- * connection.c
- *
- * Copyright (C) AB Strakt
- * Copyright (C) Jean-Paul Calderone
- * See LICENSE for details.
- *
- * SSL Connection objects and methods.
- * See the file RATIONALE for a short explanation of why this module was written.
- *
- * Reviewed 2001-07-23
- */
-#include <Python.h>
-
-#ifndef MS_WINDOWS
-#  include <sys/socket.h>
-#  include <netinet/in.h>
-#  if !(defined(__BEOS__) || defined(__CYGWIN__))
-#    include <netinet/tcp.h>
-#  endif
-#else
-#  include <winsock.h>
-#  include <wincrypt.h>
-#endif
-
-#define SSL_MODULE
-#include <openssl/bio.h>
-#include <openssl/err.h>
-#include "ssl.h"
-
-/**
- * If we are on UNIX, fine, just use PyErr_SetFromErrno. If we are on Windows,
- * apply some black winsock voodoo. This is basically just copied from Python's
- * socketmodule.c
- *
- * Arguments: None
- * Returns:   None
- */
-static void
-syscall_from_errno(void)
-{
-#ifdef MS_WINDOWS
-    int errnum = WSAGetLastError();
-    if (errnum)
-    {
-        static struct { int num; const char *msg; } *msgp, msgs[] = {
-            { WSAEINTR, "Interrupted system call" },
-            { WSAEBADF, "Bad file descriptor" },
-            { WSAEACCES, "Permission denied" },
-            { WSAEFAULT, "Bad address" },
-            { WSAEINVAL, "Invalid argument" },
-            { WSAEMFILE, "Too many open files" },
-            { WSAEWOULDBLOCK, "The socket operation could not complete "
-                    "without blocking" },
-            { WSAEINPROGRESS, "Operation now in progress" },
-            { WSAEALREADY, "Operation already in progress" },
-            { WSAENOTSOCK, "Socket operation on non-socket" },
-            { WSAEDESTADDRREQ, "Destination address required" },
-            { WSAEMSGSIZE, "Message too long" },
-            { WSAEPROTOTYPE, "Protocol wrong type for socket" },
-            { WSAENOPROTOOPT, "Protocol not available" },
-            { WSAEPROTONOSUPPORT, "Protocol not supported" },
-            { WSAESOCKTNOSUPPORT, "Socket type not supported" },
-            { WSAEOPNOTSUPP, "Operation not supported" },
-            { WSAEPFNOSUPPORT, "Protocol family not supported" },
-            { WSAEAFNOSUPPORT, "Address family not supported" },
-            { WSAEADDRINUSE, "Address already in use" },
-            { WSAEADDRNOTAVAIL, "Can't assign requested address" },
-            { WSAENETDOWN, "Network is down" },
-            { WSAENETUNREACH, "Network is unreachable" },
-            { WSAENETRESET, "Network dropped connection on reset" },
-            { WSAECONNABORTED, "Software caused connection abort" },
-            { WSAECONNRESET, "Connection reset by peer" },
-            { WSAENOBUFS, "No buffer space available" },
-            { WSAEISCONN, "Socket is already connected" },
-            { WSAENOTCONN, "Socket is not connected" },
-            { WSAESHUTDOWN, "Can't send after socket shutdown" },
-            { WSAETOOMANYREFS, "Too many references: can't splice" },
-            { WSAETIMEDOUT, "Operation timed out" },
-            { WSAECONNREFUSED, "Connection refused" },
-            { WSAELOOP, "Too many levels of symbolic links" },
-            { WSAENAMETOOLONG, "File name too long" },
-            { WSAEHOSTDOWN, "Host is down" },
-            { WSAEHOSTUNREACH, "No route to host" },
-            { WSAENOTEMPTY, "Directory not empty" },
-            { WSAEPROCLIM, "Too many processes" },
-            { WSAEUSERS, "Too many users" },
-            { WSAEDQUOT, "Disc quota exceeded" },
-            { WSAESTALE, "Stale NFS file handle" },
-            { WSAEREMOTE, "Too many levels of remote in path" },
-            { WSASYSNOTREADY, "Network subsystem is unvailable" },
-            { WSAVERNOTSUPPORTED, "WinSock version is not supported" },
-            { WSANOTINITIALISED, "Successful WSAStartup() not yet performed" },
-            { WSAEDISCON, "Graceful shutdown in progress" },
-            /* Resolver errors */
-            { WSAHOST_NOT_FOUND, "No such host is known" },
-            { WSATRY_AGAIN, "Host not found, or server failed" },
-            { WSANO_RECOVERY, "Unexpected server error encountered" },
-            { WSANO_DATA, "Valid name without requested data" },
-            { WSANO_ADDRESS, "No address, look for MX record" },
-            { 0, NULL }
-        };
-        PyObject *v;
-        const char *msg = "winsock error";
-
-        for (msgp = msgs; msgp->msg; msgp++)
-        {
-            if (errnum == msgp->num)
-            {
-                msg = msgp->msg;
-                break;
-            }
-        }
-
-        v = Py_BuildValue("(is)", errnum, msg);
-        if (v != NULL)
-        {
-            PyErr_SetObject(ssl_SysCallError, v);
-            Py_DECREF(v);
-        }
-        return;
-    }
-#else
-    PyErr_SetFromErrno(ssl_SysCallError);
-#endif
-}
-
-/*
- * Handle errors raised by BIO functions.
- *
- * Arguments: bio - The BIO object
- *            ret - The return value of the BIO_ function.
- * Returns: None, the calling function should return NULL;
- */
-static void
-handle_bio_errors(BIO* bio, int ret)
-{
-    if (BIO_should_retry(bio)) {
-        if (BIO_should_read(bio)) {
-            PyErr_SetNone(ssl_WantReadError);
-        } else if (BIO_should_write(bio)) {
-            PyErr_SetNone(ssl_WantWriteError);
-        } else if (BIO_should_io_special(bio)) {
-            /*
-             * It's somewhat unclear what this means.  From the OpenSSL source,
-             * it seems like it should not be triggered by the memory BIO, so
-             * for the time being, this case shouldn't come up.  The SSL BIO
-             * (which I think should be named the socket BIO) may trigger this
-             * case if its socket is not yet connected or it is busy doing
-             * something related to x509.
-             */
-            PyErr_SetString(PyExc_ValueError, "BIO_should_io_special");
-        } else {
-            /*
-             * I hope this is dead code.  The BIO documentation suggests that
-             * one of the above three checks should always be true.
-             */
-            PyErr_SetString(PyExc_ValueError, "unknown bio failure");
-        }
-    } else {
-        /*
-         * If we aren't to retry, it's really an error, so fall back to the
-         * normal error reporting code.  However, the BIO interface does not
-         * specify a uniform error reporting mechanism.  We can only hope that
-         * the code which triggered the error also kindly pushed something onto
-         * the error stack.
-         */
-        exception_from_error_queue(ssl_Error);
-    }
-}
-
-/*
- * Handle errors raised by SSL I/O functions. NOTE: Not SSL_shutdown ;)
- *
- * Arguments: ssl - The SSL object
- *            err - The return code from SSL_get_error
- *            ret - The return code from the SSL I/O function
- * Returns:   None, the calling function should return NULL
- */
-static void
-handle_ssl_errors(SSL *ssl, int err, int ret)
-{
-    switch (err)
-    {
-	/*
-         * Strange as it may seem, ZeroReturn is not an error per se. It means
-         * that the SSL Connection has been closed correctly (note, not the
-         * transport layer!), i.e. closure alerts have been exchanged. This is
-         * an exception since
-         *  + There's an SSL "error" code for it
-         *  + You have to deal with it in any case, close the transport layer
-         *    etc
-         */
-        case SSL_ERROR_ZERO_RETURN:
-            PyErr_SetNone(ssl_ZeroReturnError);
-            break;
-
-        /*
-         * The WantXYZ exceptions don't mean that there's an error, just that
-         * nothing could be read/written just now, maybe because the transport
-         * layer would block on the operation, or that there's not enough data
-         * available to fill an entire SSL record.
-         */
-        case SSL_ERROR_WANT_READ:
-            PyErr_SetNone(ssl_WantReadError);
-            break;
-
-        case SSL_ERROR_WANT_WRITE:
-            PyErr_SetNone(ssl_WantWriteError);
-            break;
-
-        case SSL_ERROR_WANT_X509_LOOKUP:
-            PyErr_SetNone(ssl_WantX509LookupError);
-            break;
-
-        case SSL_ERROR_SYSCALL:
-            if (ERR_peek_error() == 0)
-            {
-                if (ret < 0)
-                {
-                    syscall_from_errno();
-                }
-                else
-                {
-                    PyObject *v;
-
-                    v = Py_BuildValue("(is)", -1, "Unexpected EOF");
-                    if (v != NULL)
-                    {
-                        PyErr_SetObject(ssl_SysCallError, v);
-                        Py_DECREF(v);
-                    }
-                }
-                break;
-            }
-
-	/* NOTE: Fall-through here, we don't want to duplicate code, right? */
-
-        case SSL_ERROR_SSL:
-            ;
-        default:
-	    exception_from_error_queue(ssl_Error);
-            break;
-    }
-}
-
-/*
- * Here be member methods of the Connection "class"
- */
-
-static char ssl_Connection_get_context_doc[] = "\n\
-Get session context\n\
-\n\
-:return: A Context object\n\
-";
-static PyObject *
-ssl_Connection_get_context(ssl_ConnectionObj *self, PyObject *args) {
-    if (!PyArg_ParseTuple(args, ":get_context")) {
-        return NULL;
-    }
-
-    Py_INCREF(self->context);
-    return (PyObject *)self->context;
-}
-
-static char ssl_Connection_set_context_doc[] = "\n\
-Switch this connection to a new session context\n\
-\n\
-:param context: A :py:class:`Context` instance giving the new session context to use.\n\
-\n\
-";
-static PyObject *
-ssl_Connection_set_context(ssl_ConnectionObj *self, PyObject *args) {
-    ssl_ContextObj *ctx;
-    ssl_ContextObj *old;
-
-    if (!PyArg_ParseTuple(args, "O!:set_context", &ssl_Context_Type, &ctx)) {
-        return NULL;
-    }
-
-    /* This Connection will hold on to this context now.  Make sure it stays
-     * alive.
-     */
-    Py_INCREF(ctx);
-
-    /* XXX The unit tests don't actually verify that this call is made.
-     * They're satisfied if self->context gets updated.
-     */
-    SSL_set_SSL_CTX(self->ssl, ctx->ctx);
-
-    /* Swap the old out and the new in.
-     */
-    old = self->context;
-    self->context = ctx;
-
-    /* XXX The unit tests don't verify that this reference is dropped.
-     */
-    Py_DECREF(old);
-
-    Py_INCREF(Py_None);
-    return Py_None;
-}
-
-static char ssl_Connection_get_servername_doc[] = "\n\
-Retrieve the servername extension value if provided in the client hello\n\
-message, or None if there wasn't one.\n\
-\n\
-:return: A byte string giving the server name or :py:data:`None`.\n\
-\n\
-";
-static PyObject *
-ssl_Connection_get_servername(ssl_ConnectionObj *self, PyObject *args) {
-    int type = TLSEXT_NAMETYPE_host_name;
-    const char *name;
-
-    if (!PyArg_ParseTuple(args, ":get_servername")) {
-        return NULL;
-    }
-
-    name = SSL_get_servername(self->ssl, type);
-
-    if (name == NULL) {
-        Py_INCREF(Py_None);
-        return Py_None;
-    } else {
-        return PyBytes_FromString(name);
-    }
-}
-
-
-static char ssl_Connection_set_tlsext_host_name_doc[] = "\n\
-Set the value of the servername extension to send in the client hello.\n\
-\n\
-:param name: A byte string giving the name.\n\
-\n\
-";
-static PyObject *
-ssl_Connection_set_tlsext_host_name(ssl_ConnectionObj *self, PyObject *args) {
-    char *buf;
-
-    if (!PyArg_ParseTuple(args, BYTESTRING_FMT ":set_tlsext_host_name", &buf)) {
-        return NULL;
-    }
-
-    /* XXX I guess this can fail sometimes? */
-    SSL_set_tlsext_host_name(self->ssl, buf);
-
-    Py_INCREF(Py_None);
-    return Py_None;
-}
-
-
-
-static char ssl_Connection_pending_doc[] = "\n\
-Get the number of bytes that can be safely read from the connection\n\
-\n\
-:return: The number of bytes available in the receive buffer.\n\
-";
-static PyObject *
-ssl_Connection_pending(ssl_ConnectionObj *self, PyObject *args) {
-    int ret;
-
-    if (!PyArg_ParseTuple(args, ":pending")) {
-        return NULL;
-    }
-
-    ret = SSL_pending(self->ssl);
-    return PyLong_FromLong((long)ret);
-}
-
-static char ssl_Connection_bio_write_doc[] = "\n\
-When using non-socket connections this function sends\n\
-\"dirty\" data that would have traveled in on the network.\n\
-\n\
-:param buf: The string to put into the memory BIO.\n\
-:return: The number of bytes written\n\
-";
-static PyObject *
-ssl_Connection_bio_write(ssl_ConnectionObj *self, PyObject *args)
-{
-    char *buf;
-    int len, ret;
-
-    if (self->into_ssl == NULL) 
-    {
-            PyErr_SetString(PyExc_TypeError, "Connection sock was not None");
-            return NULL;
-    }
-
-    if (!PyArg_ParseTuple(args, "s#|i:bio_write", &buf, &len))
-        return NULL;
-
-    ret = BIO_write(self->into_ssl, buf, len);
-
-    if (PyErr_Occurred())
-    {
-        flush_error_queue();
-        return NULL;
-    }
-
-    if (ret <= 0) {
-        /*
-         * There was a problem with the BIO_write of some sort.
-         */
-        handle_bio_errors(self->into_ssl, ret);
-        return NULL;
-    }
-
-    return PyLong_FromLong((long)ret);
-}
-
-static char ssl_Connection_send_doc[] = "\n\
-Send data on the connection. NOTE: If you get one of the WantRead,\n\
-WantWrite or WantX509Lookup exceptions on this, you have to call the\n\
-method again with the SAME buffer.\n\
-\n\
-:param buf: The string to send\n\
-:param flags: (optional) Included for compatibility with the socket\n\
-              API, the value is ignored\n\
-:return: The number of bytes written\n\
-";
-static PyObject *
-ssl_Connection_send(ssl_ConnectionObj *self, PyObject *args) {
-    int len, ret, err, flags;
-    char *buf;
-
-#if PY_VERSION_HEX >= 0x02060000
-
-    /*
-     * Sit back and I'll tell you a story of intrigue and corruption, deceit and
-     * murder.
-     *
-     * A Py_buffer is used to hold any kind of byte-like data - a string, a
-     * memoryview, a buffer, etc.  PyArg_ParseTuple takes whatever kind of
-     * object was supplied, notices the "s*" format specifier, and tries to copy
-     * the metadata for that object into the Py_buffer also passed in.
-     *
-     * According to the Python documentation:
-     *
-     *     ... the caller is responsible for calling PyBuffer_Release with the
-     *     structure after it has processed the data.
-     *
-     * Correct use of PyBuffer_Release is necessary due to the fact that
-     * Py_buffer must hold a reference to the original Python object from which
-     * it was initialized.  PyBuffer_Release will decrement the reference count
-     * of that original object, allowing it to eventually be deallocated - but
-     * only after the Py_buffer is no longer in use.
-     *
-     * To support failures partway through parsing a format string,
-     * PyArg_ParseTuple maintains an internal PyListObject of PyCObjects it has
-     * created so far.  This allows it to easily clean up these objects when
-     * parsing fails, before returning an error to the caller (incidentally, it
-     * also makes sure to clean up the Py_buffer it initialized in this case, by
-     * calling PyBuffer_Release - which means the caller *must not* use
-     * PyBuffer_Release when PyArg_ParseTuple fails; not exactly what the
-     * documentation directs).
-     *
-     * The PyCObjects are given destructors which clean up some structure
-     * PyArg_ParseTuple has created (or initialized) - often another PyObject
-     * which needs to be decref'd.
-     *
-     * When parsing completes, the reference count of the PyListObject is merely
-     * decremented.  The normal Python garbage collection logic (the reference
-     * counting logic, in this case) takes over and collects both the list and
-     * all of the objects in it.  When each PyCObject in the list is collected,
-     * it triggers its destructor to clean up the structure it wraps.  This all
-     * happens immediately, before the Py_XDECREF of the PyListObject returns.
-     *
-     * The PyListObject is similarly destroyed in the success case, but not
-     * until each PyCObject it contains has had its destructor set to NULL to
-     * prevent it from cleaning up its contents.
-     *
-     * When PyArg_ParseTuple returns in an error case, therefore,
-     * PyRelease_Buffer has already been used on the Py_buffer passed to
-     * PyArg_ParseTuple.
-     *
-     * This is fortuitous, as the Py_buffer is typically (always?) allocated on
-     * the stack of the caller of PyArg_ParseTuple.  Once that caller returns,
-     * that stack memory is no longer valid, and the Py_buffer may no longer be
-     * used.
-     *
-     * On a Python runtime which does not use reference counting, the
-     * PyListObject may not actually be collected before Py_XDECREF returns.  It
-     * may not even be collected before PyArg_ParseTuple returns.  In fact, in
-     * particularly unfortunate cases, it may even not be collected before the
-     * caller of PyArg_ParseTuple returns.  It may not be called until long,
-     * long after the stack memory the Py_buffer was allocated on has been
-     * re-used for some other function call, after the memory holding a pointer
-     * to the structure that owns the memory the Py_buffer wrapped has been
-     * overwritten.  When PyBuffer_Release is used on the Py_buffer in this
-     * case, it will try to decrement a random integer - probably part of a
-     * local variable on some part of the stack.
-     *
-     * The PyPy runtime does not use reference counting.
-     *
-     * The solution adopted here is to allocate the Py_buffer on the heap,
-     * instead.  As there is no mechanism for learning when the PyCObject used
-     * by PyArg_ParseTuple to do its internal cleanup has had its way with the
-     * Py_buffer, the Py_buffer is leaked in the error case, to ensure it is
-     * still valid whenever PyBuffer_Release is called on it.
-     *
-     * Real programs should rarely, if ever, trigger the error case of
-     * PyArg_ParseTuple, so this is probably okay.  Plus, I'm tired of this
-     * stupid bug. -exarkun
-     */
-
-    Py_buffer *pbuf = PyMem_Malloc(sizeof *pbuf);
-
-    if (!PyArg_ParseTuple(args, "s*|i:send", pbuf, &flags)) {
-        return NULL;
-    }
-
-    buf = pbuf->buf;
-    len = pbuf->len;
-#else
-
-    if (!PyArg_ParseTuple(args, "s#|i:send", &buf, &len, &flags)) {
-        return NULL;
-    }
-#endif
-
-    MY_BEGIN_ALLOW_THREADS(self->tstate)
-    ret = SSL_write(self->ssl, buf, len);
-    MY_END_ALLOW_THREADS(self->tstate)
-
-#if PY_VERSION_HEX >= 0x02060000
-    PyBuffer_Release(pbuf);
-    PyMem_Free(pbuf);
-#endif
-
-    if (PyErr_Occurred())
-    {
-        flush_error_queue();
-        return NULL;
-    }
-
-    err = SSL_get_error(self->ssl, ret);
-    if (err == SSL_ERROR_NONE)
-    {
-        return PyLong_FromLong((long)ret);
-    }
-    else
-    {
-        handle_ssl_errors(self->ssl, err, ret);
-        return NULL;
-    }
-}
-
-static char ssl_Connection_sendall_doc[] = "\n\
-Send \"all\" data on the connection. This calls send() repeatedly until\n\
-all data is sent. If an error occurs, it's impossible to tell how much data\n\
-has been sent.\n\
-\n\
-:param buf: The string to send\n\
-:param flags: (optional) Included for compatibility with the socket\n\
-              API, the value is ignored\n\
-:return: The number of bytes written\n\
-";
-static PyObject *
-ssl_Connection_sendall(ssl_ConnectionObj *self, PyObject *args)
-{
-    char *buf;
-    int len, ret, err, flags;
-    PyObject *pyret = Py_None;
-
-#if PY_VERSION_HEX >= 0x02060000
-    Py_buffer *pbuf = PyMem_Malloc(sizeof *pbuf);
-
-    if (!PyArg_ParseTuple(args, "s*|i:sendall", pbuf, &flags)) {
-        return NULL;
-    }
-
-    buf = pbuf->buf;
-    len = pbuf->len;
-#else
-    if (!PyArg_ParseTuple(args, "s#|i:sendall", &buf, &len, &flags)) {
-        return NULL;
-    }
-#endif
-
-    do {
-        MY_BEGIN_ALLOW_THREADS(self->tstate)
-        ret = SSL_write(self->ssl, buf, len);
-        MY_END_ALLOW_THREADS(self->tstate)
-        if (PyErr_Occurred())
-        {
-            flush_error_queue();
-            pyret = NULL;
-            break;
-        }
-        err = SSL_get_error(self->ssl, ret);
-        if (err == SSL_ERROR_NONE)
-        {
-            buf += ret;
-            len -= ret;
-        }
-        else if (err == SSL_ERROR_SSL || err == SSL_ERROR_SYSCALL ||
-                 err == SSL_ERROR_ZERO_RETURN)
-        {
-            handle_ssl_errors(self->ssl, err, ret);
-            pyret = NULL;
-            break;
-        }
-    } while (len > 0);
-
-#if PY_VERSION_HEX >= 0x02060000
-    PyBuffer_Release(pbuf);
-    PyMem_Free(pbuf);
-#endif
-
-    Py_XINCREF(pyret);
-    return pyret;
-}
-
-static char ssl_Connection_recv_doc[] = "\n\
-Receive data on the connection. NOTE: If you get one of the WantRead,\n\
-WantWrite or WantX509Lookup exceptions on this, you have to call the\n\
-method again with the SAME buffer.\n\
-\n\
-:param bufsiz: The maximum number of bytes to read\n\
-:param flags: (optional) Included for compatibility with the socket\n\
-              API, the value is ignored\n\
-:return: The string read from the Connection\n\
-";
-static PyObject *
-ssl_Connection_recv(ssl_ConnectionObj *self, PyObject *args)
-{
-    int bufsiz, ret, err, flags;
-    PyObject *buf;
-
-    if (!PyArg_ParseTuple(args, "i|i:recv", &bufsiz, &flags))
-        return NULL;
-
-    buf = PyBytes_FromStringAndSize(NULL, bufsiz);
-    if (buf == NULL)
-        return NULL;
-
-    MY_BEGIN_ALLOW_THREADS(self->tstate)
-    ret = SSL_read(self->ssl, PyBytes_AsString(buf), bufsiz);
-    MY_END_ALLOW_THREADS(self->tstate)
-
-    if (PyErr_Occurred())
-    {
-        Py_DECREF(buf);
-        flush_error_queue();
-        return NULL;
-    }
-
-    err = SSL_get_error(self->ssl, ret);
-    if (err == SSL_ERROR_NONE)
-    {
-        if (ret != bufsiz && _PyBytes_Resize(&buf, ret) < 0)
-            return NULL;
-        return buf;
-    }
-    else
-    {
-        handle_ssl_errors(self->ssl, err, ret);
-        Py_DECREF(buf);
-        return NULL;
-    }
-}
-
-static char ssl_Connection_bio_read_doc[] = "\n\
-When using non-socket connections this function reads\n\
-the \"dirty\" data that would have traveled away on the network.\n\
-\n\
-:param bufsiz: The maximum number of bytes to read\n\
-:return: The string read.\n\
-";
-static PyObject *
-ssl_Connection_bio_read(ssl_ConnectionObj *self, PyObject *args)
-{
-    int bufsiz, ret;
-    PyObject *buf;
-
-    if (self->from_ssl == NULL) 
-    {
-            PyErr_SetString(PyExc_TypeError, "Connection sock was not None");
-            return NULL;
-    }
-
-    if (!PyArg_ParseTuple(args, "i:bio_read", &bufsiz))
-        return NULL;
-
-    buf = PyBytes_FromStringAndSize(NULL, bufsiz);
-    if (buf == NULL)
-        return NULL;
-
-    ret = BIO_read(self->from_ssl, PyBytes_AsString(buf), bufsiz);
-
-    if (PyErr_Occurred())
-    {
-        Py_DECREF(buf);
-        flush_error_queue();
-        return NULL;
-    }
-
-    if (ret <= 0) {
-        /*
-         * There was a problem with the BIO_read of some sort.
-         */
-        handle_bio_errors(self->from_ssl, ret);
-        Py_DECREF(buf);
-        return NULL;
-    }
-
-    /*
-     * Shrink the string to match the number of bytes we actually read.
-     */
-    if (ret != bufsiz && _PyBytes_Resize(&buf, ret) < 0)
-    {
-        Py_DECREF(buf);
-        return NULL;
-    }
-    return buf;
-}
-
-static char ssl_Connection_renegotiate_doc[] = "\n\
-Renegotiate the session\n\
-\n\
-:return: True if the renegotiation can be started, false otherwise\n\
-";
-static PyObject *
-ssl_Connection_renegotiate(ssl_ConnectionObj *self, PyObject *args) {
-    int ret;
-
-    if (!PyArg_ParseTuple(args, ":renegotiate")) {
-        return NULL;
-    }
-
-    MY_BEGIN_ALLOW_THREADS(self->tstate);
-    ret = SSL_renegotiate(self->ssl);
-    MY_END_ALLOW_THREADS(self->tstate);
-
-    if (PyErr_Occurred()) {
-        flush_error_queue();
-        return NULL;
-    }
-
-    return PyLong_FromLong((long)ret);
-}
-
-static char ssl_Connection_do_handshake_doc[] = "\n\
-Perform an SSL handshake (usually called after renegotiate() or one of\n\
-set_*_state()). This can raise the same exceptions as send and recv.\n\
-\n\
-:return: None.\n\
-";
-static PyObject *
-ssl_Connection_do_handshake(ssl_ConnectionObj *self, PyObject *args)
-{
-    int ret, err;
-
-    if (!PyArg_ParseTuple(args, ":do_handshake"))
-        return NULL;
-
-    MY_BEGIN_ALLOW_THREADS(self->tstate);
-    ret = SSL_do_handshake(self->ssl);
-    MY_END_ALLOW_THREADS(self->tstate);
-
-    if (PyErr_Occurred())
-    {
-        flush_error_queue();
-        return NULL;
-    }
-
-    err = SSL_get_error(self->ssl, ret);
-    if (err == SSL_ERROR_NONE)
-    {
-        Py_INCREF(Py_None);
-        return Py_None;
-    }
-    else
-    {
-        handle_ssl_errors(self->ssl, err, ret);
-        return NULL;
-    }
-}
-
-#if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x00907000L
-static char ssl_Connection_renegotiate_pending_doc[] = "\n\
-Check if there's a renegotiation in progress, it will return false once\n\
-a renegotiation is finished.\n\
-\n\
-:return: Whether there's a renegotiation in progress\n\
-";
-static PyObject *
-ssl_Connection_renegotiate_pending(ssl_ConnectionObj *self, PyObject *args)
-{
-    if (!PyArg_ParseTuple(args, ":renegotiate_pending"))
-        return NULL;
-
-    return PyLong_FromLong((long)SSL_renegotiate_pending(self->ssl));
-}
-#endif
-
-static char ssl_Connection_total_renegotiations_doc[] = "\n\
-Find out the total number of renegotiations.\n\
-\n\
-:return: The number of renegotiations.\n\
-";
-static PyObject *
-ssl_Connection_total_renegotiations(ssl_ConnectionObj *self, PyObject *args)
-{
-    if (!PyArg_ParseTuple(args, ":total_renegotiations"))
-        return NULL;
-
-    return PyLong_FromLong(SSL_total_renegotiations(self->ssl));
-}
-
-static char ssl_Connection_set_accept_state_doc[] = "\n\
-Set the connection to work in server mode. The handshake will be handled\n\
-automatically by read/write.\n\
-\n\
-:return: None\n\
-";
-static PyObject *
-ssl_Connection_set_accept_state(ssl_ConnectionObj *self, PyObject *args)
-{
-    if (!PyArg_ParseTuple(args, ":set_accept_state"))
-        return NULL;
-
-    SSL_set_accept_state(self->ssl);
-
-    Py_INCREF(Py_None);
-    return Py_None;
-}
-
-static char ssl_Connection_set_connect_state_doc[] = "\n\
-Set the connection to work in client mode. The handshake will be handled\n\
-automatically by read/write.\n\
-\n\
-:return: None\n\
-";
-static PyObject *
-ssl_Connection_set_connect_state(ssl_ConnectionObj *self, PyObject *args)
-{
-    if (!PyArg_ParseTuple(args, ":set_connect_state"))
-        return NULL;
-
-    SSL_set_connect_state(self->ssl);
-
-    Py_INCREF(Py_None);
-    return Py_None;
-}
-
-static char ssl_Connection_connect_doc[] = "\n\
-Connect to remote host and set up client-side SSL\n\
-\n\
-:param addr: A remote address\n\
-:return: What the socket's connect method returns\n\
-";
-static PyObject *
-ssl_Connection_connect(ssl_ConnectionObj *self, PyObject *args)
-{
-    PyObject *meth, *ret;
-
-    if ((meth = PyObject_GetAttrString(self->socket, "connect")) == NULL)
-        return NULL;
-
-    SSL_set_connect_state(self->ssl);
-
-    ret = PyEval_CallObject(meth, args);
-    Py_DECREF(meth);
-    if (ret == NULL)
-        return NULL;
-
-    return ret;
-}
-
-static char ssl_Connection_connect_ex_doc[] = "\n\
-Connect to remote host and set up client-side SSL. Note that if the socket's\n\
-connect_ex method doesn't return 0, SSL won't be initialized.\n\
-\n\
-:param addr: A remove address\n\
-:return: What the socket's connect_ex method returns\n\
-";
-static PyObject *
-ssl_Connection_connect_ex(ssl_ConnectionObj *self, PyObject *args)
-{
-    PyObject *meth, *ret;
-
-    if ((meth = PyObject_GetAttrString(self->socket, "connect_ex")) == NULL)
-        return NULL;
-
-    SSL_set_connect_state(self->ssl);
-
-    ret = PyEval_CallObject(meth, args);
-    Py_DECREF(meth);
-    return ret;
-}
-
-static char ssl_Connection_accept_doc[] = "\n\
-Accept incoming connection and set up SSL on it\n\
-\n\
-:return: A (conn,addr) pair where conn is a Connection and addr is an\n\
-         address\n\
-";
-static PyObject *
-ssl_Connection_accept(ssl_ConnectionObj *self, PyObject *args)
-{
-    PyObject *tuple, *socket, *address, *meth;
-    ssl_ConnectionObj *conn;
-
-    if ((meth = PyObject_GetAttrString(self->socket, "accept")) == NULL)
-        return NULL;
-    tuple = PyEval_CallObject(meth, args);
-    Py_DECREF(meth);
-    if (tuple == NULL)
-        return NULL;
-
-    socket  = PyTuple_GetItem(tuple, 0);
-    Py_INCREF(socket);
-    address = PyTuple_GetItem(tuple, 1);
-    Py_INCREF(address);
-    Py_DECREF(tuple);
-
-    conn = ssl_Connection_New(self->context, socket);
-    Py_DECREF(socket);
-    if (conn == NULL)
-    {
-        Py_DECREF(address);
-        return NULL;
-    }
-
-    SSL_set_accept_state(conn->ssl);
-
-    tuple = Py_BuildValue("(OO)", conn, address);
-
-    Py_DECREF(conn);
-    Py_DECREF(address);
-
-    return tuple;
-}
-
-static char ssl_Connection_bio_shutdown_doc[] = "\n\
-When using non-socket connections this function signals end of\n\
-data on the input for this connection.\n\
-\n\
-:return: None\n\
-";
-
-static PyObject *
-ssl_Connection_bio_shutdown(ssl_ConnectionObj *self, PyObject *args)
-{
-    if (self->from_ssl == NULL) 
-    {
-            PyErr_SetString(PyExc_TypeError, "Connection sock was not None");
-            return NULL;
-    }
-
-    BIO_set_mem_eof_return(self->into_ssl, 0);
-    Py_INCREF(Py_None);
-    return Py_None;
-}
-
-
-
-static char ssl_Connection_shutdown_doc[] = "\n\
-Send closure alert\n\
-\n\
-:return: True if the shutdown completed successfully (i.e. both sides\n\
-         have sent closure alerts), false otherwise (i.e. you have to\n\
-         wait for a ZeroReturnError on a recv() method call\n\
-";
-static PyObject *
-ssl_Connection_shutdown(ssl_ConnectionObj *self, PyObject *args)
-{
-    int ret;
-
-    if (!PyArg_ParseTuple(args, ":shutdown"))
-        return NULL;
-
-    MY_BEGIN_ALLOW_THREADS(self->tstate)
-    ret = SSL_shutdown(self->ssl);
-    MY_END_ALLOW_THREADS(self->tstate)
-
-    if (PyErr_Occurred())
-    {
-        flush_error_queue();
-        return NULL;
-    }
-
-    if (ret < 0)
-    {
-        exception_from_error_queue(ssl_Error);
-        return NULL;
-    }
-    else if (ret > 0)
-    {
-        Py_INCREF(Py_True);
-        return Py_True;
-    }
-    else
-    {
-        Py_INCREF(Py_False);
-        return Py_False;
-    }
-}
-
-static char ssl_Connection_get_cipher_list_doc[] = "\n\
-Get the session cipher list\n\
-\n\
-:return: A list of cipher strings\n\
-";
-static PyObject *
-ssl_Connection_get_cipher_list(ssl_ConnectionObj *self, PyObject *args)
-{
-    int idx = 0;
-    const char *ret;
-    PyObject *lst, *item;
-
-    if (!PyArg_ParseTuple(args, ":get_cipher_list"))
-        return NULL;
-
-    lst = PyList_New(0);
-    while ((ret = SSL_get_cipher_list(self->ssl, idx)) != NULL)
-    {
-        item = PyText_FromString(ret);
-        PyList_Append(lst, item);
-        Py_DECREF(item);
-        idx++;
-    }
-    return lst;
-}
-
-static char ssl_Connection_get_client_ca_list_doc[] = "\n\
-Get CAs whose certificates are suggested for client authentication.\n\
-\n\
-:return: If this is a server connection, a list of X509Names representing\n\
-    the acceptable CAs as set by :py:meth:`OpenSSL.SSL.Context.set_client_ca_list` or\n\
-    :py:meth:`OpenSSL.SSL.Context.add_client_ca`.  If this is a client connection,\n\
-    the list of such X509Names sent by the server, or an empty list if that\n\
-    has not yet happened.\n\
-";
-
-static PyObject *
-ssl_Connection_get_client_ca_list(ssl_ConnectionObj *self, PyObject *args) {
-    STACK_OF(X509_NAME) *CANames;
-    PyObject *CAList;
-    int i, n;
-
-    if (!PyArg_ParseTuple(args, ":get_client_ca_list")) {
-        return NULL;
-    }
-    CANames = SSL_get_client_CA_list(self->ssl);
-    if (CANames == NULL) {
-        return PyList_New(0);
-    }
-    n = sk_X509_NAME_num(CANames);
-    CAList = PyList_New(n);
-    if (CAList == NULL) {
-        return NULL;
-    }
-    for (i = 0; i < n; i++) {
-        X509_NAME *CAName;
-        PyObject *CA;
-
-        CAName = X509_NAME_dup(sk_X509_NAME_value(CANames, i));
-        if (CAName == NULL) {
-            Py_DECREF(CAList);
-            exception_from_error_queue(ssl_Error);
-            return NULL;
-        }
-        CA = (PyObject *)new_x509name(CAName, 1);
-        if (CA == NULL) {
-            X509_NAME_free(CAName);
-            Py_DECREF(CAList);
-            return NULL;
-        }
-        if (PyList_SetItem(CAList, i, CA)) {
-            Py_DECREF(CA);
-            Py_DECREF(CAList);
-            return NULL;
-        }
-    }
-    return CAList;
-}
-
-static char ssl_Connection_makefile_doc[] = "\n\
-The makefile() method is not implemented, since there is no dup semantics\n\
-for SSL connections\n\
-\n\
-:raise NotImplementedError\n\
-";
-static PyObject *
-ssl_Connection_makefile(ssl_ConnectionObj *self, PyObject *args)
-{
-    PyErr_SetString(PyExc_NotImplementedError, "Cannot make file object of SSL.Connection");
-    return NULL;
-}
-
-static char ssl_Connection_get_app_data_doc[] = "\n\
-Get application data\n\
-\n\
-:return: The application data\n\
-";
-static PyObject *
-ssl_Connection_get_app_data(ssl_ConnectionObj *self, PyObject *args)
-{
-    if (!PyArg_ParseTuple(args, ":get_app_data"))
-        return NULL;
-
-    Py_INCREF(self->app_data);
-    return self->app_data;
-}
-
-static char ssl_Connection_set_app_data_doc[] = "\n\
-Set application data\n\
-\n\
-:param data - The application data\n\
-:return: None\n\
-";
-static PyObject *
-ssl_Connection_set_app_data(ssl_ConnectionObj *self, PyObject *args)
-{
-    PyObject *data;
-
-    if (!PyArg_ParseTuple(args, "O:set_app_data", &data))
-        return NULL;
-
-    Py_DECREF(self->app_data);
-    Py_INCREF(data);
-    self->app_data = data;
-
-    Py_INCREF(Py_None);
-    return Py_None;
-}
-
-static char ssl_Connection_get_shutdown_doc[] = "\n\
-Get shutdown state\n\
-\n\
-:return: The shutdown state, a bitvector of SENT_SHUTDOWN, RECEIVED_SHUTDOWN.\n\
-";
-static PyObject *
-ssl_Connection_get_shutdown(ssl_ConnectionObj *self, PyObject *args)
-{
-    if (!PyArg_ParseTuple(args, ":get_shutdown"))
-        return NULL;
-
-    return PyLong_FromLong((long)SSL_get_shutdown(self->ssl));
-}
-
-static char ssl_Connection_set_shutdown_doc[] = "\n\
-Set shutdown state\n\
-\n\
-:param state - bitvector of SENT_SHUTDOWN, RECEIVED_SHUTDOWN.\n\
-:return: None\n\
-";
-static PyObject *
-ssl_Connection_set_shutdown(ssl_ConnectionObj *self, PyObject *args)
-{
-    int shutdown;
-
-    if (!PyArg_ParseTuple(args, "i:set_shutdown", &shutdown))
-        return NULL;
-
-    SSL_set_shutdown(self->ssl, shutdown);
-    Py_INCREF(Py_None);
-    return Py_None;
-}
-
-static char ssl_Connection_state_string_doc[] = "\n\
-Get a verbose state description\n\
-\n\
-:return: A string representing the state\n\
-";
-static PyObject *
-ssl_Connection_state_string(ssl_ConnectionObj *self, PyObject *args)
-{
-    if (!PyArg_ParseTuple(args, ":state_string"))
-        return NULL;
-
-    return PyText_FromString(SSL_state_string_long(self->ssl));
-}
-
-static char ssl_Connection_client_random_doc[] = "\n\
-Get a copy of the client hello nonce.\n\
-\n\
-:return: A string representing the state\n\
-";
-static PyObject *
-ssl_Connection_client_random(ssl_ConnectionObj *self, PyObject *args)
-{
-    if (!PyArg_ParseTuple(args, ":client_random"))
-        return NULL;
-
-    if (self->ssl->session == NULL) {
-        Py_INCREF(Py_None);
-        return Py_None;
-    }
-    return PyBytes_FromStringAndSize( (const char *) self->ssl->s3->client_random, SSL3_RANDOM_SIZE);
-}
-
-static char ssl_Connection_server_random_doc[] = "\n\
-Get a copy of the server hello nonce.\n\
-\n\
-:return: A string representing the state\n\
-";
-static PyObject *
-ssl_Connection_server_random(ssl_ConnectionObj *self, PyObject *args)
-{
-    if (!PyArg_ParseTuple(args, ":server_random"))
-        return NULL;
-
-    if (self->ssl->session == NULL) {
-        Py_INCREF(Py_None);
-        return Py_None;
-    }
-    return PyBytes_FromStringAndSize( (const char *) self->ssl->s3->server_random, SSL3_RANDOM_SIZE);
-}
-
-static char ssl_Connection_master_key_doc[] = "\n\
-Get a copy of the master key.\n\
-\n\
-:return: A string representing the state\n\
-";
-static PyObject *
-ssl_Connection_master_key(ssl_ConnectionObj *self, PyObject *args)
-{
-    if (!PyArg_ParseTuple(args, ":master_key"))
-        return NULL;
-
-    if (self->ssl->session == NULL) {
-        Py_INCREF(Py_None);
-        return Py_None;
-    }
-    return PyBytes_FromStringAndSize( (const char *) self->ssl->session->master_key, self->ssl->session->master_key_length);
-}
-
-static char ssl_Connection_sock_shutdown_doc[] = "\n\
-See shutdown(2)\n\
-\n\
-:return: What the socket's shutdown() method returns\n\
-";
-static PyObject *
-ssl_Connection_sock_shutdown(ssl_ConnectionObj *self, PyObject *args)
-{
-    PyObject *meth, *ret;
-
-    if ((meth = PyObject_GetAttrString(self->socket, "shutdown")) == NULL)
-        return NULL;
-    ret = PyEval_CallObject(meth, args);
-    Py_DECREF(meth);
-    return ret;
-}
-
-static char ssl_Connection_get_peer_certificate_doc[] = "\n\
-Retrieve the other side's certificate (if any)\n\
-\n\
-:return: The peer's certificate\n\
-";
-static PyObject *
-ssl_Connection_get_peer_certificate(ssl_ConnectionObj *self, PyObject *args)
-{
-    X509 *cert;
-
-    if (!PyArg_ParseTuple(args, ":get_peer_certificate"))
-        return NULL;
-
-    cert = SSL_get_peer_certificate(self->ssl);
-    if (cert != NULL)
-    {
-        return (PyObject *)new_x509(cert, 1);
-    }
-    else
-    {
-        Py_INCREF(Py_None);
-        return Py_None;
-    }
-}
-
-static char ssl_Connection_get_peer_cert_chain_doc[] = "\n\
-Retrieve the other side's certificate (if any)\n\
-\n\
-:return: A list of X509 instances giving the peer's certificate chain,\n\
-         or None if it does not have one.\n\
-";
-static PyObject *
-ssl_Connection_get_peer_cert_chain(ssl_ConnectionObj *self, PyObject *args) {
-    STACK_OF(X509) *sk;
-    PyObject *chain;
-    crypto_X509Obj *cert;
-    Py_ssize_t i;
-
-    if (!PyArg_ParseTuple(args, ":get_peer_cert_chain")) {
-        return NULL;
-    }
-
-    sk = SSL_get_peer_cert_chain(self->ssl);
-    if (sk != NULL) {
-        chain = PyList_New(sk_X509_num(sk));
-        for (i = 0; i < sk_X509_num(sk); i++) {
-            cert = new_x509(sk_X509_value(sk, i), 1);
-            if (!cert) {
-                /* XXX Untested */
-                Py_DECREF(chain);
-                return NULL;
-            }
-            CRYPTO_add(&cert->x509->references, 1, CRYPTO_LOCK_X509);
-            PyList_SET_ITEM(chain, i, (PyObject *)cert);
-        }
-        return chain;
-    } else {
-        Py_INCREF(Py_None);
-        return Py_None;
-    }
-
-}
-
-static char ssl_Connection_want_read_doc[] = "\n\
-Checks if more data has to be read from the transport layer to complete an\n\
-operation.\n\
-\n\
-:return: True iff more data has to be read\n\
-";
-static PyObject *
-ssl_Connection_want_read(ssl_ConnectionObj *self, PyObject *args)
-{
-    if (!PyArg_ParseTuple(args, ":want_read"))
-        return NULL;
-
-    return PyLong_FromLong((long)SSL_want_read(self->ssl));
-}
-
-static char ssl_Connection_want_write_doc[] = "\n\
-Checks if there is data to write to the transport layer to complete an\n\
-operation.\n\
-\n\
-:return: True iff there is data to write\n\
-";
-static PyObject *
-ssl_Connection_want_write(ssl_ConnectionObj *self, PyObject *args)
-{
-    if (!PyArg_ParseTuple(args, ":want_write"))
-        return NULL;
-
-    return PyLong_FromLong((long)SSL_want_write(self->ssl));
-}
-
-static char ssl_Connection_get_session_doc[] = "\n\
-Returns the Session currently used.\n\
-\n\
-@return: An instance of :py:class:`OpenSSL.SSL.Session` or :py:obj:`None` if\n\
-    no session exists.\n\
-";
-static PyObject *
-ssl_Connection_get_session(ssl_ConnectionObj *self, PyObject *args) {
-    ssl_SessionObj *session;
-    SSL_SESSION *native_session;
-
-    if (!PyArg_ParseTuple(args, ":get_session")) {
-        return NULL;
-    }
-
-    native_session = SSL_get1_session(self->ssl);
-
-    if (native_session == NULL) {
-        Py_INCREF(Py_None);
-        return Py_None;
-    }
-
-    session = ssl_Session_from_SSL_SESSION(native_session);
-    if (!session) {
-        Py_INCREF(Py_None);
-        return Py_None;
-    }
-
-    return (PyObject*)session;
-}
-
-static char ssl_Connection_set_session_doc[] = "\n\
-Set the session to be used when the TLS/SSL connection is established.\n\
-\n\
-:param session: A Session instance representing the session to use.\n\
-:returns: None\n\
-";
-static PyObject *
-ssl_Connection_set_session(ssl_ConnectionObj *self, PyObject *args) {
-    ssl_SessionObj *session;
-
-    if (!PyArg_ParseTuple(args, "O!:set_session", &ssl_Session_Type, &session)) {
-        return NULL;
-    }
-
-    if (SSL_set_session(self->ssl, session->session) == 0) {
-        /* The only case which leads to this seems to be a mismatch, between
-         * this connection and the session, of the SSL method.
-         */
-        exception_from_error_queue(ssl_Error);
-        return NULL;
-    }
-
-    Py_INCREF(Py_None);
-    return Py_None;
-}
-
-/*
- * Member methods in the Connection object
- * ADD_METHOD(name) expands to a correct PyMethodDef declaration
- *   {  'name', (PyCFunction)ssl_Connection_name, METH_VARARGS }
- * for convenience
- * ADD_ALIAS(name,real) creates an "alias" of the ssl_Connection_real
- * function with the name 'name'
- */
-#define ADD_METHOD(name)        \
-    { #name, (PyCFunction)ssl_Connection_##name, METH_VARARGS, ssl_Connection_##name##_doc }
-#define ADD_ALIAS(name,real)    \
-    { #name, (PyCFunction)ssl_Connection_##real, METH_VARARGS, ssl_Connection_##real##_doc }
-static PyMethodDef ssl_Connection_methods[] =
-{
-    ADD_METHOD(get_context),
-    ADD_METHOD(set_context),
-    ADD_METHOD(get_servername),
-    ADD_METHOD(set_tlsext_host_name),
-    ADD_METHOD(pending),
-    ADD_METHOD(send),
-    ADD_ALIAS (write, send),
-    ADD_METHOD(sendall),
-    ADD_METHOD(recv),
-    ADD_ALIAS (read, recv),
-    ADD_METHOD(bio_read),
-    ADD_METHOD(bio_write),
-    ADD_METHOD(renegotiate),
-    ADD_METHOD(do_handshake),
-#if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x00907000L
-    ADD_METHOD(renegotiate_pending),
-#endif
-    ADD_METHOD(total_renegotiations),
-    ADD_METHOD(connect),
-    ADD_METHOD(connect_ex),
-    ADD_METHOD(accept),
-    ADD_METHOD(bio_shutdown),
-    ADD_METHOD(shutdown),
-    ADD_METHOD(get_cipher_list),
-    ADD_METHOD(get_client_ca_list),
-    ADD_METHOD(makefile),
-    ADD_METHOD(get_app_data),
-    ADD_METHOD(set_app_data),
-    ADD_METHOD(get_shutdown),
-    ADD_METHOD(set_shutdown),
-    ADD_METHOD(state_string),
-    ADD_METHOD(server_random),
-    ADD_METHOD(client_random),
-    ADD_METHOD(master_key),
-    ADD_METHOD(sock_shutdown),
-    ADD_METHOD(get_peer_certificate),
-    ADD_METHOD(get_peer_cert_chain),
-    ADD_METHOD(want_read),
-    ADD_METHOD(want_write),
-    ADD_METHOD(set_accept_state),
-    ADD_METHOD(set_connect_state),
-    ADD_METHOD(get_session),
-    ADD_METHOD(set_session),
-    { NULL, NULL }
-};
-#undef ADD_ALIAS
-#undef ADD_METHOD
-
-static char ssl_Connection_doc[] = "\n\
-Connection(context, socket) -> Connection instance\n\
-\n\
-Create a new Connection object, using the given OpenSSL.SSL.Context instance\n\
-and socket.\n\
-\n\
-:param context: An SSL Context to use for this connection\n\
-:param socket: The socket to use for transport layer\n\
-";
-
-/*
- * Initializer used by ssl_Connection_new and ssl_Connection_New.  *Not*
- * tp_init.  This takes an already allocated ssl_ConnectionObj, a context, and
- * a optionally a socket, and glues them all together.
- */
-static ssl_ConnectionObj*
-ssl_Connection_init(ssl_ConnectionObj *self, ssl_ContextObj *ctx, PyObject *sock) {
-    int fd;
-
-    Py_INCREF(ctx);
-    self->context = ctx;
-
-    Py_INCREF(sock);
-    self->socket = sock;
-
-    self->ssl = NULL;
-    self->from_ssl = NULL;
-    self->into_ssl = NULL;
-
-    Py_INCREF(Py_None);
-    self->app_data = Py_None;
-
-    self->tstate = NULL;
-
-    self->ssl = SSL_new(self->context->ctx);
-    SSL_set_app_data(self->ssl, self);
-
-    if (self->socket == Py_None)
-    {
-        /* If it's not a socket or file, treat it like a memory buffer, 
-         * so crazy people can do things like EAP-TLS. */
-        self->into_ssl = BIO_new(BIO_s_mem());
-        self->from_ssl = BIO_new(BIO_s_mem());
-        if (self->into_ssl == NULL || self->from_ssl == NULL)
-            goto error;
-        SSL_set_bio(self->ssl, self->into_ssl, self->from_ssl);
-    } 
-    else 
-    {
-        fd = PyObject_AsFileDescriptor(self->socket);
-        if (fd < 0)
-        {
-            Py_DECREF(self);
-            return NULL;
-        } 
-        else 
-        {
-            SSL_set_fd(self->ssl, (SOCKET_T)fd);
-        }
-    }
-    return self;
-
-error:
-    BIO_free(self->into_ssl);  /* NULL safe */
-    BIO_free(self->from_ssl);  /* NULL safe */
-    Py_DECREF(self);
-    return NULL;
-}
-
-/*
- * Constructor for Connection objects
- *
- * Arguments: ctx  - An SSL Context to use for this connection
- *            sock - The socket to use for transport layer
- * Returns:   The newly created Connection object
- */
-ssl_ConnectionObj *
-ssl_Connection_New(ssl_ContextObj *ctx, PyObject *sock) {
-    ssl_ConnectionObj *self;
-
-    self = PyObject_GC_New(ssl_ConnectionObj, &ssl_Connection_Type);
-    if (self == NULL) {
-        return NULL;
-    }
-    self = ssl_Connection_init(self, ctx, sock);
-    if (self == NULL) {
-        return NULL;
-    }
-    PyObject_GC_Track((PyObject *)self);
-    return self;
-}
-
-static PyObject*
-ssl_Connection_new(PyTypeObject *subtype, PyObject *args, PyObject *kwargs) {
-    ssl_ConnectionObj *self;
-    ssl_ContextObj *ctx;
-    PyObject *sock;
-    static char *kwlist[] = {"context", "socket", NULL};
-
-    if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!O:Connection", kwlist,
-                                     &ssl_Context_Type, &ctx, &sock)) {
-        return NULL;
-    }
-
-    self = (ssl_ConnectionObj *)subtype->tp_alloc(subtype, 1);
-    if (self == NULL) {
-        return NULL;
-    }
-
-    return (PyObject *)ssl_Connection_init(self, ctx, sock);
-}
-
-/*
- * Find attribute
- *
- * Arguments: self - The Connection object
- *            name - The attribute name
- * Returns:   A Python object for the attribute, or NULL if something went
- *            wrong
- */
-static PyObject *
-ssl_Connection_getattro(ssl_ConnectionObj *self, PyObject *nameobj) {
-    PyObject *meth;
-
-    meth = PyObject_GenericGetAttr((PyObject*)self, nameobj);
-    if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_AttributeError)) {
-        PyErr_Clear();
-        /* Try looking it up in the "socket" instead. */
-        meth = PyObject_GenericGetAttr(self->socket, nameobj);
-    }
-
-    return meth;
-}
-
-/*
- * Call the visitproc on all contained objects.
- *
- * Arguments: self - The Connection object
- *            visit - Function to call
- *            arg - Extra argument to visit
- * Returns:   0 if all goes well, otherwise the return code from the first
- *            call that gave non-zero result.
- */
-static int
-ssl_Connection_traverse(ssl_ConnectionObj *self, visitproc visit, void *arg)
-{
-    int ret = 0;
-
-    if (ret == 0 && self->context != NULL)
-        ret = visit((PyObject *)self->context, arg);
-    if (ret == 0 && self->socket != NULL)
-        ret = visit(self->socket, arg);
-    if (ret == 0 && self->app_data != NULL)
-        ret = visit(self->app_data, arg);
-    return ret;
-}
-
-/*
- * Decref all contained objects and zero the pointers.
- *
- * Arguments: self - The Connection object
- * Returns:   Always 0.
- */
-static int
-ssl_Connection_clear(ssl_ConnectionObj *self)
-{
-    Py_XDECREF(self->context);
-    self->context = NULL;
-    Py_XDECREF(self->socket);
-    self->socket = NULL;
-    Py_XDECREF(self->app_data);
-    self->app_data = NULL;
-    self->into_ssl = NULL; /* was cleaned up by SSL_free() */
-    self->from_ssl = NULL; /* was cleaned up by SSL_free() */
-    return 0;
-}
-
-/*
- * Deallocate the memory used by the Connection object
- *
- * Arguments: self - The Connection object
- * Returns:   None
- */
-static void
-ssl_Connection_dealloc(ssl_ConnectionObj *self)
-{
-    PyObject_GC_UnTrack(self);
-    if (self->ssl != NULL)
-        SSL_free(self->ssl);
-    ssl_Connection_clear(self);
-    PyObject_GC_Del(self);
-}
-
-PyTypeObject ssl_Connection_Type = {
-    PyOpenSSL_HEAD_INIT(&PyType_Type, 0)
-    "OpenSSL.SSL.Connection",
-    sizeof(ssl_ConnectionObj),
-    0,
-    (destructor)ssl_Connection_dealloc,
-    NULL, /* print */
-    NULL, /* tp_getattr */
-    NULL, /* setattr */
-    NULL, /* compare */
-    NULL, /* repr */
-    NULL, /* as_number */
-    NULL, /* as_sequence */
-    NULL, /* as_mapping */
-    NULL, /* hash */
-    NULL, /* call */
-    NULL, /* str */
-    (getattrofunc)ssl_Connection_getattro, /* getattro */
-    NULL, /* setattro */
-    NULL, /* as_buffer */
-    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,
-    ssl_Connection_doc, /* doc */
-    (traverseproc)ssl_Connection_traverse,
-    (inquiry)ssl_Connection_clear,
-    NULL, /* tp_richcompare */
-    0, /* tp_weaklistoffset */
-    NULL, /* tp_iter */
-    NULL, /* tp_iternext */
-    ssl_Connection_methods, /* tp_methods */
-    NULL, /* tp_members */
-    NULL, /* tp_getset */
-    NULL, /* tp_base */
-    NULL, /* tp_dict */
-    NULL, /* tp_descr_get */
-    NULL, /* tp_descr_set */
-    0, /* tp_dictoffset */
-    NULL, /* tp_init */
-    NULL, /* tp_alloc */
-    ssl_Connection_new, /* tp_new */
-};
-
-
-/*
- * Initiailze the Connection part of the SSL sub module
- *
- * Arguments: dict - The OpenSSL.SSL module
- * Returns:   1 for success, 0 otherwise
- */
-int
-init_ssl_connection(PyObject *module) {
-
-    if (PyType_Ready(&ssl_Connection_Type) < 0) {
-        return 0;
-    }
-
-    /* PyModule_AddObject steals a reference.
-     */
-    Py_INCREF((PyObject *)&ssl_Connection_Type);
-    if (PyModule_AddObject(module, "Connection", (PyObject *)&ssl_Connection_Type) != 0) {
-        return 0;
-    }
-
-    /* PyModule_AddObject steals a reference.
-     */
-    Py_INCREF((PyObject *)&ssl_Connection_Type);
-    if (PyModule_AddObject(module, "ConnectionType", (PyObject *)&ssl_Connection_Type) != 0) {
-        return 0;
-    }
-
-    return 1;
-}
-
diff --git a/OpenSSL/ssl/connection.h b/OpenSSL/ssl/connection.h
deleted file mode 100644
index 59f659b..0000000
--- a/OpenSSL/ssl/connection.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * connection.h
- *
- * Copyright (C) AB Strakt
- * See LICENSE for details.
- *
- * Export SSL Connection data structures and functions.
- * See the file RATIONALE for a short explanation of why this module was written.
- *
- * Reviewed 2001-07-23
- *
- */
-#ifndef PyOpenSSL_SSL_CONNECTION_H_
-#define PyOpenSSL_SSL_CONNECTION_H_
-
-#include <Python.h>
-#include <openssl/ssl.h>
-
-/* shamelessly stolen from socketmodule.c */
-#ifdef MS_WINDOWS
-#  include <winsock.h>
-typedef SOCKET SOCKET_T;
-#  ifdef MS_WIN64
-#    define SIZEOF_SOCKET_T 8
-#  else
-#    define SIZEOF_SOCKET_T 4
-#  endif
-#else
-typedef int SOCKET_T;
-#  define SIZEOF_SOCKET_T SIZEOF_INT
-#endif
-
-
-extern  int                      init_ssl_connection      (PyObject *);
-
-extern  PyTypeObject      ssl_Connection_Type;
-
-#define ssl_Connection_Check(v) ((v)->ob_type == &ssl_Connection_Type)
-
-typedef struct {
-    PyObject_HEAD
-    SSL                 *ssl;
-    ssl_ContextObj      *context;
-    PyObject            *socket;
-    PyThreadState       *tstate; /* This field is no longer used. */
-    PyObject            *app_data;
-    BIO                 *into_ssl, *from_ssl;  /* for connections without file descriptors */
-} ssl_ConnectionObj;
-
-
-
-#endif
-
diff --git a/OpenSSL/ssl/context.c b/OpenSSL/ssl/context.c
deleted file mode 100644
index 84180b8..0000000
--- a/OpenSSL/ssl/context.c
+++ /dev/null
@@ -1,1501 +0,0 @@
-/*
- * context.c
- *
- * Copyright (C) AB Strakt
- * Copyright (C) Jean-Paul Calderone
- * See LICENSE for details.
- *
- * SSL Context objects and their methods.
- * See the file RATIONALE for a short explanation of why this module was written.
- *
- * Reviewed 2001-07-23
- */
-#include <Python.h>
-
-#if PY_VERSION_HEX >= 0x02050000
-# define PYARG_PARSETUPLE_FORMAT const char
-# define PYOBJECT_GETATTRSTRING_TYPE const char*
-#else
-# define PYARG_PARSETUPLE_FORMAT char
-# define PYOBJECT_GETATTRSTRING_TYPE char*
-#endif
-
-#ifndef MS_WINDOWS
-#  include <sys/socket.h>
-#  include <netinet/in.h>
-#  if !(defined(__BEOS__) || defined(__CYGWIN__))
-#    include <netinet/tcp.h>
-#  endif
-#else
-#  include <winsock.h>
-#  include <wincrypt.h>
-#endif
-
-#define SSL_MODULE
-#include "ssl.h"
-
-/*
- * CALLBACKS
- *
- * Callbacks work like this: We provide a "global" callback in C which
- * transforms the arguments into a Python argument tuple and calls the
- * corresponding Python callback, and then parsing the return value back into
- * things the C function can return.
- *
- * Three caveats:
- *  + How do we find the Context object where the Python callbacks are stored?
- *  + What about multithreading and execution frames?
- *  + What about Python callbacks that raise exceptions?
- *
- * The solution to the first issue is trivial if the callback provides
- * "userdata" functionality. Since the only callbacks that don't provide
- * userdata do provide a pointer to an SSL structure, we can associate an SSL
- * object and a Connection one-to-one via the SSL_set/get_app_data()
- * functions.
- *
- * The solution to the other issue is to rewrite the Py_BEGIN_ALLOW_THREADS
- * macro allowing it (or rather a new macro) to specify where to save the
- * thread state (in our case, as a member of the Connection/Context object) so
- * we can retrieve it again before calling the Python callback.
- */
-
-/*
- * Globally defined passphrase callback.  This is called from OpenSSL
- * internally.  The GIL will not be held when this function is invoked.  It
- * must not be held when the function returns.
- *
- * Arguments: buf    - Buffer to store the returned passphrase in
- *            maxlen - Maximum length of the passphrase
- *            verify - If true, the passphrase callback should ask for a
- *                     password twice and verify they're equal. If false, only
- *                     ask once.
- *            arg    - User data, always a Context object
- * Returns:   The length of the password if successful, 0 otherwise
- */
-static int
-global_passphrase_callback(char *buf, int maxlen, int verify, void *arg)
-{
-    /*
-     * Initialize len here because we're always going to return it, and we
-     * might jump to the return before it gets initialized in any other way.
-     */
-    int len = 0;
-    char *str;
-    PyObject *argv, *ret = NULL;
-    ssl_ContextObj *ctx = (ssl_ContextObj *)arg;
-
-    /*
-     * GIL isn't held yet.  First things first - acquire it, or any Python API
-     * we invoke might segfault or blow up the sun.  The reverse will be done
-     * before returning.
-     */
-    MY_END_ALLOW_THREADS(ctx->tstate);
-
-    /* The Python callback is called with a (maxlen,verify,userdata) tuple */
-    argv = Py_BuildValue("(iiO)", maxlen, verify, ctx->passphrase_userdata);
-
-    /*
-     * XXX Didn't check argv to see if it was NULL. -exarkun
-     */
-    ret = PyEval_CallObject(ctx->passphrase_callback, argv);
-    Py_DECREF(argv);
-
-    if (ret == NULL) {
-        /*
-         * The callback raised an exception.  It will be raised by whatever
-         * Python API triggered this callback.
-         */
-        goto out;
-    }
-
-    if (!PyObject_IsTrue(ret)) {
-        /*
-         * Returned "", or None, or something.  Treat it as no passphrase.
-         */
-        Py_DECREF(ret);
-	goto out;
-    }
-
-    if (!PyBytes_Check(ret)) {
-        /*
-         * XXX Returned something that wasn't a string.  This is bogus.  We'll
-         * return 0 and OpenSSL will treat it as an error, resulting in an
-         * exception from whatever Python API triggered this callback.
-         */
-        Py_DECREF(ret);
-        goto out;
-    }
-
-    len = PyBytes_Size(ret);
-    if (len > maxlen) {
-        /*
-         * Returned more than we said they were allowed to return.  Just
-         * truncate it.  Might be better to raise an exception,
-         * instead. -exarkun
-         */
-        len = maxlen;
-    }
-
-    str = PyBytes_AsString(ret);
-    strncpy(buf, str, len);
-    Py_XDECREF(ret);
-
-  out:
-    /*
-     * This function is returning into OpenSSL.  Release the GIL again.
-     */
-    MY_BEGIN_ALLOW_THREADS(ctx->tstate);
-    return len;
-}
-
-/*
- * Globally defined verify callback
- *
- * Arguments: ok       - True everything is OK "so far", false otherwise
- *            x509_ctx - Contains the certificate being checked, the current
- *                       error number and depth, and the Connection we're
- *                       dealing with
- * Returns:   True if everything is okay, false otherwise
- */
-static int
-global_verify_callback(int ok, X509_STORE_CTX *x509_ctx)
-{
-    PyObject *argv, *ret;
-    SSL *ssl;
-    ssl_ConnectionObj *conn;
-    crypto_X509Obj *cert;
-    int errnum, errdepth, c_ret;
-
-    // Get Connection object to check thread state
-    ssl = (SSL *)X509_STORE_CTX_get_app_data(x509_ctx);
-    conn = (ssl_ConnectionObj *)SSL_get_app_data(ssl);
-
-    MY_END_ALLOW_THREADS(conn->tstate);
-
-    cert = new_x509(X509_STORE_CTX_get_current_cert(x509_ctx), 0);
-    errnum = X509_STORE_CTX_get_error(x509_ctx);
-    errdepth = X509_STORE_CTX_get_error_depth(x509_ctx);
-
-    argv = Py_BuildValue("(OOiii)", (PyObject *)conn, (PyObject *)cert,
-                                    errnum, errdepth, ok);
-    Py_DECREF(cert);
-    ret = PyEval_CallObject(conn->context->verify_callback, argv);
-    Py_DECREF(argv);
-
-    if (ret != NULL && PyObject_IsTrue(ret)) {
-        X509_STORE_CTX_set_error(x509_ctx, X509_V_OK);
-        Py_DECREF(ret);
-        c_ret = 1;
-    } else {
-        c_ret = 0;
-    }
-
-    MY_BEGIN_ALLOW_THREADS(conn->tstate);
-    return c_ret;
-}
-
-/*
- * Globally defined info callback.  This is called from OpenSSL internally.
- * The GIL will not be held when this function is invoked.  It must not be held
- * when the function returns.
- *
- * Arguments: ssl   - The Connection
- *            where - The part of the SSL code that called us
- *            _ret  - The return code of the SSL function that called us
- * Returns:   None
- */
-static void
-global_info_callback(const SSL *ssl, int where, int _ret)
-{
-    ssl_ConnectionObj *conn = (ssl_ConnectionObj *)SSL_get_app_data(ssl);
-    PyObject *argv, *ret;
-
-    /*
-     * GIL isn't held yet.  First things first - acquire it, or any Python API
-     * we invoke might segfault or blow up the sun.  The reverse will be done
-     * before returning.
-     */
-    MY_END_ALLOW_THREADS(conn->tstate);
-
-    argv = Py_BuildValue("(Oii)", (PyObject *)conn, where, _ret);
-    ret = PyEval_CallObject(conn->context->info_callback, argv);
-    Py_DECREF(argv);
-
-    if (ret == NULL) {
-        /*
-         * XXX - This should be reported somehow. -exarkun
-         */
-        PyErr_Clear();
-    } else {
-        Py_DECREF(ret);
-    }
-
-    /*
-     * This function is returning into OpenSSL.  Release the GIL again.
-     */
-    MY_BEGIN_ALLOW_THREADS(conn->tstate);
-    return;
-}
-
-/*
- * Globally defined TLS extension server name callback.  This is called from
- * OpenSSL internally.  The GIL will not be held when this function is invoked.
- * It must not be held when the function returns.
- *
- * ssl represents the connection this callback is for
- *
- * alert is a pointer to the alert value which maybe will be emitted to the
- * client if there is an error handling the client hello (which contains the
- * server name).  This is an out parameter, maybe.
- *
- * arg is an arbitrary pointer specified by SSL_CTX_set_tlsext_servername_arg.
- * It will be NULL for all pyOpenSSL uses.
- */
-static int
-global_tlsext_servername_callback(const SSL *ssl, int *alert, void *arg) {
-    int result = 0;
-    PyObject *argv, *ret;
-    ssl_ConnectionObj *conn = (ssl_ConnectionObj *)SSL_get_app_data(ssl);
-
-    /*
-     * GIL isn't held yet.  First things first - acquire it, or any Python API
-     * we invoke might segfault or blow up the sun.  The reverse will be done
-     * before returning.
-     */
-    MY_END_ALLOW_THREADS(conn->tstate);
-
-    argv = Py_BuildValue("(O)", (PyObject *)conn);
-    ret = PyEval_CallObject(conn->context->tlsext_servername_callback, argv);
-    Py_DECREF(argv);
-    Py_DECREF(ret);
-
-    /*
-     * This function is returning into OpenSSL.  Release the GIL again.
-     */
-    MY_BEGIN_ALLOW_THREADS(conn->tstate);
-    return result;
-}
-
-/*
- * More recent builds of OpenSSL may have SSLv2 completely disabled.
- */
-#ifdef OPENSSL_NO_SSL2
-#define SSLv2_METHOD_TEXT ""
-#else
-#define SSLv2_METHOD_TEXT " SSLv2_METHOD"
-#endif
-
-#ifdef SSL_OP_NO_TLSv1_1
-#define TLSv1_1_METHOD_TEXT " TLSv1_1_METHOD"
-#endif
-
-#ifdef SSL_OP_NO_TLSv1_2
-#define TLSv1_2_METHOD_TEXT " TLSv1_2_METHOD"
-#endif
-
-static char ssl_Context_doc[] = "\n\
-Context(method) -> Context instance\n\
-\n\
-OpenSSL.SSL.Context instances define the parameters for setting up new SSL\n\
-connections.\n\
-\n\
-:param method: One of:" SSLv2_METHOD_TEXT " SSLv3_METHOD SSLv23_METHOD TLSv1_METHOD" TLSv1_1_METHOD_TEXT TLSv1_2_METHOD_TEXT "\n\
-";
-
-#undef SSLv2_METHOD_TEXT
-#undef TLSv1_1_METHOD_TEXT
-#undef TLSv1_2_METHOD_TEXT
-
-static char ssl_Context_load_verify_locations_doc[] = "\n\
-Let SSL know where we can find trusted certificates for the certificate\n\
-chain\n\
-\n\
-:param cafile: In which file we can find the certificates\n\
-:param capath: In which directory we can find the certificates\n\
-:return: None\n\
-";
-static PyObject *
-ssl_Context_load_verify_locations(ssl_ContextObj *self, PyObject *args) {
-    char *cafile = NULL;
-    char *capath = NULL;
-
-    if (!PyArg_ParseTuple(args, "z|z:load_verify_locations", &cafile, &capath)) {
-        return NULL;
-    }
-
-    if (!SSL_CTX_load_verify_locations(self->ctx, cafile, capath))
-    {
-        exception_from_error_queue(ssl_Error);
-        return NULL;
-    }
-    else
-    {
-        Py_INCREF(Py_None);
-        return Py_None;
-    }
-}
-
-static char ssl_Context_set_default_verify_paths_doc[] = "\n\
-Use the platform-specific CA certificate locations\n\
-\n\
-:return: None\n\
-";
-static PyObject *
-ssl_Context_set_default_verify_paths(ssl_ContextObj *self, PyObject *args) {
-    if (!PyArg_ParseTuple(args, ":set_default_verify_paths")) {
-        return NULL;
-    }
-
-    /*
-     * XXX Error handling for SSL_CTX_set_default_verify_paths is untested.
-     * -exarkun
-     */
-    if (!SSL_CTX_set_default_verify_paths(self->ctx)) {
-        exception_from_error_queue(ssl_Error);
-        return NULL;
-    }
-    Py_INCREF(Py_None);
-    return Py_None;
-};
-
-
-static char ssl_Context_set_passwd_cb_doc[] = "\n\
-Set the passphrase callback\n\
-\n\
-:param callback: The Python callback to use\n\
-:param userdata: (optional) A Python object which will be given as\n\
-                 argument to the callback\n\
-:return: None\n\
-";
-static PyObject *
-ssl_Context_set_passwd_cb(ssl_ContextObj *self, PyObject *args)
-{
-    PyObject *callback = NULL, *userdata = Py_None;
-
-    if (!PyArg_ParseTuple(args, "O|O:set_passwd_cb", &callback, &userdata))
-        return NULL;
-
-    if (!PyCallable_Check(callback))
-    {
-        PyErr_SetString(PyExc_TypeError, "expected PyCallable");
-        return NULL;
-    }
-
-    Py_DECREF(self->passphrase_callback);
-    Py_INCREF(callback);
-    self->passphrase_callback = callback;
-    SSL_CTX_set_default_passwd_cb(self->ctx, global_passphrase_callback);
-
-    Py_DECREF(self->passphrase_userdata);
-    Py_INCREF(userdata);
-    self->passphrase_userdata = userdata;
-    SSL_CTX_set_default_passwd_cb_userdata(self->ctx, (void *)self);
-
-    Py_INCREF(Py_None);
-    return Py_None;
-}
-
-static PyTypeObject *
-type_modified_error(const char *name) {
-    PyErr_Format(PyExc_RuntimeError,
-                 "OpenSSL.crypto's '%s' attribute has been modified",
-                 name);
-    return NULL;
-}
-
-static PyTypeObject *
-import_crypto_type(const char *name, size_t objsize) {
-    PyObject *module, *type, *name_attr;
-    PyTypeObject *res;
-    int right_name;
-
-    module = PyImport_ImportModule("OpenSSL.crypto");
-    if (module == NULL) {
-        return NULL;
-    }
-    type = PyObject_GetAttrString(module, (PYOBJECT_GETATTRSTRING_TYPE)name);
-    Py_DECREF(module);
-    if (type == NULL) {
-        return NULL;
-    }
-    if (!(PyType_Check(type))) {
-        Py_DECREF(type);
-        return type_modified_error(name);
-    }
-    name_attr = PyObject_GetAttrString(type, "__name__");
-    if (name_attr == NULL) {
-        Py_DECREF(type);
-        return NULL;
-    }
-
-#ifdef PY3
-    {
-        PyObject* asciiname = PyUnicode_AsASCIIString(name_attr);
-        Py_DECREF(name_attr);
-        name_attr = asciiname;
-    }
-#endif
-    right_name = (PyBytes_CheckExact(name_attr) &&
-                  strcmp(name, PyBytes_AsString(name_attr)) == 0);
-    Py_DECREF(name_attr);
-    res = (PyTypeObject *)type;
-    if (!right_name || res->tp_basicsize != objsize) {
-        Py_DECREF(type);
-        return type_modified_error(name);
-    }
-    return res;
-}
-
-static crypto_X509Obj *
-parse_certificate_argument(const char* format, PyObject* args) {
-    static PyTypeObject *crypto_X509_type = NULL;
-    crypto_X509Obj *cert;
-
-    if (!crypto_X509_type) {
-        crypto_X509_type = import_crypto_type("X509", sizeof(crypto_X509Obj));
-        if (!crypto_X509_type) {
-            return NULL;
-        }
-    }
-    if (!PyArg_ParseTuple(args, (PYARG_PARSETUPLE_FORMAT *)format,
-                          crypto_X509_type, &cert)) {
-        return NULL;
-    }
-    return cert;
-}
-
-static char ssl_Context_add_extra_chain_cert_doc[] = "\n\
-Add certificate to chain\n\
-\n\
-:param certobj: The X509 certificate object to add to the chain\n\
-:return: None\n\
-";
-
-static PyObject *
-ssl_Context_add_extra_chain_cert(ssl_ContextObj *self, PyObject *args)
-{
-    X509* cert_original;
-    crypto_X509Obj *cert = parse_certificate_argument(
-        "O!:add_extra_chain_cert", args);
-    if (cert == NULL)
-    {
-        return NULL;
-    }
-    if (!(cert_original = X509_dup(cert->x509)))
-    {
-        /* exception_from_error_queue(ssl_Error); */
-        PyErr_SetString(PyExc_RuntimeError, "X509_dup failed");
-        return NULL;
-    }
-    if (!SSL_CTX_add_extra_chain_cert(self->ctx, cert_original))
-    {
-        X509_free(cert_original);
-        exception_from_error_queue(ssl_Error);
-        return NULL;
-    }
-    else
-    {
-        Py_INCREF(Py_None);
-        return Py_None;
-    }
-}
-
-
-static char ssl_Context_use_certificate_chain_file_doc[] = "\n\
-Load a certificate chain from a file\n\
-\n\
-:param certfile: The name of the certificate chain file\n\
-:return: None\n\
-";
-static PyObject *
-ssl_Context_use_certificate_chain_file(ssl_ContextObj *self, PyObject *args)
-{
-    char *certfile;
-
-    if (!PyArg_ParseTuple(args, "s:use_certificate_chain_file", &certfile))
-        return NULL;
-
-    if (!SSL_CTX_use_certificate_chain_file(self->ctx, certfile))
-    {
-        exception_from_error_queue(ssl_Error);
-        return NULL;
-    }
-    else
-    {
-        Py_INCREF(Py_None);
-        return Py_None;
-    }
-}
-
-
-static char ssl_Context_use_certificate_file_doc[] = "\n\
-Load a certificate from a file\n\
-\n\
-:param certfile: The name of the certificate file\n\
-:param filetype: (optional) The encoding of the file, default is PEM\n\
-:return: None\n\
-";
-static PyObject *
-ssl_Context_use_certificate_file(ssl_ContextObj *self, PyObject *args)
-{
-    char *certfile;
-    int filetype = SSL_FILETYPE_PEM;
-
-    if (!PyArg_ParseTuple(args, "s|i:use_certificate_file", &certfile, &filetype))
-        return NULL;
-
-    if (!SSL_CTX_use_certificate_file(self->ctx, certfile, filetype))
-    {
-        exception_from_error_queue(ssl_Error);
-        return NULL;
-    }
-    else
-    {
-        Py_INCREF(Py_None);
-        return Py_None;
-    }
-}
-
-static char ssl_Context_use_certificate_doc[] = "\n\
-Load a certificate from a X509 object\n\
-\n\
-:param cert: The X509 object\n\
-:return: None\n\
-";
-static PyObject *
-ssl_Context_use_certificate(ssl_ContextObj *self, PyObject *args)
-{
-    crypto_X509Obj *cert = parse_certificate_argument(
-        "O!:use_certificate", args);
-    if (cert == NULL) {
-        return NULL;
-    }
-    
-    if (!SSL_CTX_use_certificate(self->ctx, cert->x509))
-    {
-        exception_from_error_queue(ssl_Error);
-        return NULL;
-    }
-    else
-    {
-        Py_INCREF(Py_None);
-        return Py_None;
-    }
-}
-
-static char ssl_Context_use_privatekey_file_doc[] = "\n\
-Load a private key from a file\n\
-\n\
-:param keyfile: The name of the key file\n\
-:param filetype: (optional) The encoding of the file, default is PEM\n\
-:return: None\n\
-";
-static PyObject *
-ssl_Context_use_privatekey_file(ssl_ContextObj *self, PyObject *args)
-{
-    char *keyfile;
-    int filetype = SSL_FILETYPE_PEM, ret;
-
-    if (!PyArg_ParseTuple(args, "s|i:use_privatekey_file", &keyfile, &filetype))
-        return NULL;
-
-    MY_BEGIN_ALLOW_THREADS(self->tstate);
-    ret = SSL_CTX_use_PrivateKey_file(self->ctx, keyfile, filetype);
-    MY_END_ALLOW_THREADS(self->tstate);
-
-    if (PyErr_Occurred())
-    {
-        flush_error_queue();
-        return NULL;
-    }
-
-    if (!ret)
-    {
-        exception_from_error_queue(ssl_Error);
-        return NULL;
-    }
-    else
-    {
-        Py_INCREF(Py_None);
-        return Py_None;
-    }
-}
-
-static char ssl_Context_use_privatekey_doc[] = "\n\
-Load a private key from a PKey object\n\
-\n\
-:param pkey: The PKey object\n\
-:return: None\n\
-";
-static PyObject *
-ssl_Context_use_privatekey(ssl_ContextObj *self, PyObject *args) {
-    static PyTypeObject *crypto_PKey_type = NULL;
-    crypto_PKeyObj *pkey;
-
-    if (!crypto_PKey_type) {
-        crypto_PKey_type = import_crypto_type("PKey", sizeof(crypto_PKeyObj));
-        if (!crypto_PKey_type) {
-            return NULL;
-        }
-    }
-    if (!PyArg_ParseTuple(args, "O!:use_privatekey", crypto_PKey_type, &pkey)) {
-        return NULL;
-    }
-
-    if (!SSL_CTX_use_PrivateKey(self->ctx, pkey->pkey)) {
-        exception_from_error_queue(ssl_Error);
-        return NULL;
-    } else {
-        Py_INCREF(Py_None);
-        return Py_None;
-    }
-}
-
-static char ssl_Context_check_privatekey_doc[] = "\n\
-Check that the private key and certificate match up\n\
-\n\
-:return: None (raises an exception if something's wrong)\n\
-";
-static PyObject *
-ssl_Context_check_privatekey(ssl_ContextObj *self, PyObject *args)
-{
-    if (!PyArg_ParseTuple(args, ":check_privatekey"))
-        return NULL;
-
-    if (!SSL_CTX_check_private_key(self->ctx))
-    {
-        exception_from_error_queue(ssl_Error);
-        return NULL;
-    }
-    else
-    {
-        Py_INCREF(Py_None);
-        return Py_None;
-    }
-}
-
-static char ssl_Context_load_client_ca_doc[] = "\n\
-Load the trusted certificates that will be sent to the client (basically\n\
-telling the client \"These are the guys I trust\").  Does not actually\n\
-imply any of the certificates are trusted; that must be configured\n\
-separately.\n\
-\n\
-:param cafile: The name of the certificates file\n\
-:return: None\n\
-";
-static PyObject *
-ssl_Context_load_client_ca(ssl_ContextObj *self, PyObject *args)
-{
-    char *cafile;
-
-    if (!PyArg_ParseTuple(args, "s:load_client_ca", &cafile))
-        return NULL;
-
-    SSL_CTX_set_client_CA_list(self->ctx, SSL_load_client_CA_file(cafile));
-
-    Py_INCREF(Py_None);
-    return Py_None;
-}
-
-static char ssl_Context_set_session_id_doc[] = "\n\
-Set the session identifier.  This is needed if you want to do session\n\
-resumption.\n\
-\n\
-:param buf: A Python object that can be safely converted to a string\n\
-:returns: None\n\
-";
-static PyObject *
-ssl_Context_set_session_id(ssl_ContextObj *self, PyObject *args)
-{
-    unsigned char *buf;
-    unsigned int len;
-
-    if (!PyArg_ParseTuple(args, "s#:set_session_id", &buf, &len))
-        return NULL;
-
-    if (!SSL_CTX_set_session_id_context(self->ctx, buf, len))
-    {
-        exception_from_error_queue(ssl_Error);
-        return NULL;
-    }
-    else
-    {
-        Py_INCREF(Py_None);
-        return Py_None;
-    }
-}
-
-static char ssl_Context_set_session_cache_mode_doc[] = "\n\
-Enable/disable session caching and specify the mode used.\n\
-\n\
-:param mode: One or more of the SESS_CACHE_* flags (combine using bitwise or)\n\
-:returns: The previously set caching mode.\n\
-";
-static PyObject *
-ssl_Context_set_session_cache_mode(ssl_ContextObj *self, PyObject *args) {
-    long mode, result;
-
-    if (!PyArg_ParseTuple(args, "l:set_session_cache_mode", &mode)) {
-        return NULL;
-    }
-
-    result = SSL_CTX_set_session_cache_mode(self->ctx, mode);
-    return PyLong_FromLong(result);
-
-}
-
-static char ssl_Context_get_session_cache_mode_doc[] = "\n\
-:returns: The currently used cache mode.\n\
-";
-static PyObject *
-ssl_Context_get_session_cache_mode(ssl_ContextObj *self, PyObject *args) {
-    long result;
-
-    if (!PyArg_ParseTuple(args, ":get_session_cache_mode")) {
-        return NULL;
-    }
-    result = SSL_CTX_get_session_cache_mode(self->ctx);
-    return PyLong_FromLong(result);
-}
-
-static char ssl_Context_set_verify_doc[] = "\n\
-Set the verify mode and verify callback\n\
-\n\
-:param mode: The verify mode, this is either VERIFY_NONE or\n\
-             VERIFY_PEER combined with possible other flags\n\
-:param callback: The Python callback to use\n\
-:return: None\n\
-\n\
-See SSL_CTX_set_verify(3SSL) for further details.\n\
-";
-static PyObject *
-ssl_Context_set_verify(ssl_ContextObj *self, PyObject *args)
-{
-    int mode;
-    PyObject *callback = NULL;
-
-    if (!PyArg_ParseTuple(args, "iO:set_verify", &mode, &callback))
-        return NULL;
-
-    if (!PyCallable_Check(callback))
-    {
-        PyErr_SetString(PyExc_TypeError, "expected PyCallable");
-        return NULL;
-    }
-
-    Py_DECREF(self->verify_callback);
-    Py_INCREF(callback);
-    self->verify_callback = callback;
-    SSL_CTX_set_verify(self->ctx, mode, global_verify_callback);
-
-    Py_INCREF(Py_None);
-    return Py_None;
-}
-
-static char ssl_Context_set_verify_depth_doc[] = "\n\
-Set the verify depth\n\
-\n\
-:param depth: An integer specifying the verify depth\n\
-:return: None\n\
-";
-static PyObject *
-ssl_Context_set_verify_depth(ssl_ContextObj *self, PyObject *args)
-{
-    int depth;
-
-    if (!PyArg_ParseTuple(args, "i:set_verify_depth", &depth))
-        return NULL;
-
-    SSL_CTX_set_verify_depth(self->ctx, depth);
-    Py_INCREF(Py_None);
-    return Py_None;
-}
-
-static char ssl_Context_get_verify_mode_doc[] = "\n\
-Get the verify mode\n\
-\n\
-:return: The verify mode\n\
-";
-static PyObject *
-ssl_Context_get_verify_mode(ssl_ContextObj *self, PyObject *args)
-{
-    int mode;
-
-    if (!PyArg_ParseTuple(args, ":get_verify_mode"))
-        return NULL;
-
-    mode = SSL_CTX_get_verify_mode(self->ctx);
-    return PyLong_FromLong((long)mode);
-}
-
-static char ssl_Context_get_verify_depth_doc[] = "\n\
-Get the verify depth\n\
-\n\
-:return: The verify depth\n\
-";
-static PyObject *
-ssl_Context_get_verify_depth(ssl_ContextObj *self, PyObject *args)
-{
-    int depth;
-
-    if (!PyArg_ParseTuple(args, ":get_verify_depth"))
-        return NULL;
-
-    depth = SSL_CTX_get_verify_depth(self->ctx);
-    return PyLong_FromLong((long)depth);
-}
-
-static char ssl_Context_load_tmp_dh_doc[] = "\n\
-Load parameters for Ephemeral Diffie-Hellman\n\
-\n\
-:param dhfile: The file to load EDH parameters from\n\
-:return: None\n\
-";
-static PyObject *
-ssl_Context_load_tmp_dh(ssl_ContextObj *self, PyObject *args)
-{
-    char *dhfile;
-    BIO *bio;
-    DH *dh;
-
-    if (!PyArg_ParseTuple(args, "s:load_tmp_dh", &dhfile))
-        return NULL;
-
-    bio = BIO_new_file(dhfile, "r");
-    if (bio == NULL) {
-        exception_from_error_queue(ssl_Error);
-        return NULL;
-    }
-
-    dh = PEM_read_bio_DHparams(bio, NULL, NULL, NULL);
-    SSL_CTX_set_tmp_dh(self->ctx, dh);
-    DH_free(dh);
-    BIO_free(bio);
-
-    Py_INCREF(Py_None);
-    return Py_None;
-}
-
-static char ssl_Context_set_cipher_list_doc[] = "\n\
-Change the cipher list\n\
-\n\
-:param cipher_list: A cipher list, see ciphers(1)\n\
-:return: None\n\
-";
-static PyObject *
-ssl_Context_set_cipher_list(ssl_ContextObj *self, PyObject *args)
-{
-    char *cipher_list;
-
-    if (!PyArg_ParseTuple(args, "s:set_cipher_list", &cipher_list))
-        return NULL;
-
-    if (!SSL_CTX_set_cipher_list(self->ctx, cipher_list))
-    {
-        exception_from_error_queue(ssl_Error);
-        return NULL;
-    }
-    else
-    {
-        Py_INCREF(Py_None);
-        return Py_None;
-    }
-}
-
-static char ssl_Context_set_client_ca_list_doc[] = "\n\
-Set the list of preferred client certificate signers for this server context.\n\
-\n\
-This list of certificate authorities will be sent to the client when the\n\
-server requests a client certificate.\n\
-\n\
-:param certificate_authorities: a sequence of X509Names.\n\
-:return: None\n\
-";
-
-static PyObject *
-ssl_Context_set_client_ca_list(ssl_ContextObj *self, PyObject *args)
-{
-    static PyTypeObject *X509NameType;
-    PyObject *sequence, *tuple, *item;
-    crypto_X509NameObj *name;
-    X509_NAME *sslname;
-    STACK_OF(X509_NAME) *CANames;
-    Py_ssize_t length;
-    int i;
-
-    if (X509NameType == NULL) {
-        X509NameType = import_crypto_type("X509Name", sizeof(crypto_X509NameObj));
-        if (X509NameType == NULL) {
-            return NULL;
-        }
-    }
-    if (!PyArg_ParseTuple(args, "O:set_client_ca_list", &sequence)) {
-        return NULL;
-    }
-    tuple = PySequence_Tuple(sequence);
-    if (tuple == NULL) {
-        return NULL;
-    }
-    length = PyTuple_Size(tuple);
-    if (length >= INT_MAX) {
-        PyErr_SetString(PyExc_ValueError, "client CA list is too long");
-        Py_DECREF(tuple);
-        return NULL;
-    }
-    CANames = sk_X509_NAME_new_null();
-    if (CANames == NULL) {
-        Py_DECREF(tuple);
-        exception_from_error_queue(ssl_Error);
-        return NULL;
-    }
-    for (i = 0; i < length; i++) {
-        item = PyTuple_GetItem(tuple, i);
-        if (item->ob_type != X509NameType) {
-            PyErr_Format(PyExc_TypeError,
-                         "client CAs must be X509Name objects, not %s objects",
-                         item->ob_type->tp_name);
-            sk_X509_NAME_free(CANames);
-            Py_DECREF(tuple);
-            return NULL;
-        }
-        name = (crypto_X509NameObj *)item;
-        sslname = X509_NAME_dup(name->x509_name);
-        if (sslname == NULL) {
-            sk_X509_NAME_free(CANames);
-            Py_DECREF(tuple);
-            exception_from_error_queue(ssl_Error);
-            return NULL;
-        }
-        if (!sk_X509_NAME_push(CANames, sslname)) {
-            X509_NAME_free(sslname);
-            sk_X509_NAME_free(CANames);
-            Py_DECREF(tuple);
-            exception_from_error_queue(ssl_Error);
-            return NULL;
-        }
-    }
-    Py_DECREF(tuple);
-    SSL_CTX_set_client_CA_list(self->ctx, CANames);
-    Py_INCREF(Py_None);
-    return Py_None;
-}
-
-static char ssl_Context_add_client_ca_doc[] = "\n\
-Add the CA certificate to the list of preferred signers for this context.\n\
-\n\
-The list of certificate authorities will be sent to the client when the\n\
-server requests a client certificate.\n\
-\n\
-:param certificate_authority: certificate authority's X509 certificate.\n\
-:return: None\n\
-";
-
-static PyObject *
-ssl_Context_add_client_ca(ssl_ContextObj *self, PyObject *args)
-{
-    crypto_X509Obj *cert;
-
-    cert = parse_certificate_argument("O!:add_client_ca", args);
-    if (cert == NULL) {
-        return NULL;
-    }
-    if (!SSL_CTX_add_client_CA(self->ctx, cert->x509)) {
-        exception_from_error_queue(ssl_Error);
-        return NULL;
-    }
-    Py_INCREF(Py_None);
-    return Py_None;
-}
-
-static char ssl_Context_set_timeout_doc[] = "\n\
-Set session timeout\n\
-\n\
-:param timeout: The timeout in seconds\n\
-:return: The previous session timeout\n\
-";
-static PyObject *
-ssl_Context_set_timeout(ssl_ContextObj *self, PyObject *args)
-{
-    long t, ret;
-
-    if (!PyArg_ParseTuple(args, "l:set_timeout", &t))
-        return NULL;
-
-    ret = SSL_CTX_set_timeout(self->ctx, t);
-    return PyLong_FromLong(ret);
-}
-
-static char ssl_Context_get_timeout_doc[] = "\n\
-Get the session timeout\n\
-\n\
-:return: The session timeout\n\
-";
-static PyObject *
-ssl_Context_get_timeout(ssl_ContextObj *self, PyObject *args)
-{
-    long ret;
-
-    if (!PyArg_ParseTuple(args, ":get_timeout"))
-        return NULL;
-
-    ret = SSL_CTX_get_timeout(self->ctx);
-    return PyLong_FromLong(ret);
-}
-
-static char ssl_Context_set_info_callback_doc[] = "\n\
-Set the info callback\n\
-\n\
-:param callback: The Python callback to use\n\
-:return: None\n\
-";
-static PyObject *
-ssl_Context_set_info_callback(ssl_ContextObj *self, PyObject *args)
-{
-    PyObject *callback;
-
-    if (!PyArg_ParseTuple(args, "O:set_info_callback", &callback))
-        return NULL;
-
-    if (!PyCallable_Check(callback))
-    {
-        PyErr_SetString(PyExc_TypeError, "expected PyCallable");
-        return NULL;
-    }
-
-    Py_DECREF(self->info_callback);
-    Py_INCREF(callback);
-    self->info_callback = callback;
-    SSL_CTX_set_info_callback(self->ctx, global_info_callback);
-
-    Py_INCREF(Py_None);
-    return Py_None;
-}
-
-static char ssl_Context_get_app_data_doc[] = "\n\
-Get the application data (supplied via set_app_data())\n\
-\n\
-:return: The application data\n\
-";
-static PyObject *
-ssl_Context_get_app_data(ssl_ContextObj *self, PyObject *args)
-{
-    if (!PyArg_ParseTuple(args, ":get_app_data"))
-        return NULL;
-
-    Py_INCREF(self->app_data);
-    return self->app_data;
-}
-
-static char ssl_Context_set_app_data_doc[] = "\n\
-Set the application data (will be returned from get_app_data())\n\
-\n\
-:param data: Any Python object\n\
-:return: None\n\
-";
-static PyObject *
-ssl_Context_set_app_data(ssl_ContextObj *self, PyObject *args)
-{
-    PyObject *data;
-
-    if (!PyArg_ParseTuple(args, "O:set_app_data", &data))
-        return NULL;
-
-    Py_DECREF(self->app_data);
-    Py_INCREF(data);
-    self->app_data = data;
-
-    Py_INCREF(Py_None);
-    return Py_None;
-}
-
-static char ssl_Context_get_cert_store_doc[] = "\n\
-Get the certificate store for the context\n\
-\n\
-:return: A X509Store object\n\
-";
-static PyObject *
-ssl_Context_get_cert_store(ssl_ContextObj *self, PyObject *args)
-{
-    X509_STORE *store;
-
-    if (!PyArg_ParseTuple(args, ":get_cert_store"))
-        return NULL;
-
-    if ((store = SSL_CTX_get_cert_store(self->ctx)) == NULL)
-    {
-        Py_INCREF(Py_None);
-        return Py_None;
-    }
-    else
-    {
-        return (PyObject *)new_x509store(store, 0);
-    }
-}
-
-static char ssl_Context_set_options_doc[] = "\n\
-Add options. Options set before are not cleared!\n\
-\n\
-:param options: The options to add.\n\
-:return: The new option bitmask.\n\
-";
-static PyObject *
-ssl_Context_set_options(ssl_ContextObj *self, PyObject *args)
-{
-    long options;
-
-    if (!PyArg_ParseTuple(args, "l:set_options", &options))
-        return NULL;
-
-    return PyLong_FromLong(SSL_CTX_set_options(self->ctx, options));
-}
-
-static char ssl_Context_set_mode_doc[] = "\n\
-Add modes via bitmask. Modes set before are not cleared!\n\
-\n\
-:param mode: The mode to add.\n\
-:return: The new mode bitmask.\n\
-";
-static PyObject *
-ssl_Context_set_mode(ssl_ContextObj *self, PyObject *args) {
-    long mode;
-
-    if (!PyArg_ParseTuple(args, "l:set_mode", &mode)) {
-        return NULL;
-    }
-
-    return PyLong_FromLong(SSL_CTX_set_mode(self->ctx, mode));
-}
-
-static char ssl_Context_set_tlsext_servername_callback_doc[] = "\n\
-Specify a callback function to be called when clients specify a server name.\n\
-\n\
-:param callback: The callback function.  It will be invoked with one\n\
-    argument, the Connection instance.\n\
-\n\
-";
-static PyObject *
-ssl_Context_set_tlsext_servername_callback(ssl_ContextObj *self, PyObject *args) {
-    PyObject *callback;
-    PyObject *old;
-
-    if (!PyArg_ParseTuple(args, "O:set_tlsext_servername_callback", &callback)) {
-        return NULL;
-    }
-
-    Py_INCREF(callback);
-    old = self->tlsext_servername_callback;
-    self->tlsext_servername_callback = callback;
-    Py_DECREF(old);
-
-    SSL_CTX_set_tlsext_servername_callback(self->ctx, global_tlsext_servername_callback);
-    SSL_CTX_set_tlsext_servername_arg(self->ctx, NULL);
-
-    Py_INCREF(Py_None);
-    return Py_None;
-}
-
-
-/*
- * Member methods in the Context object
- * ADD_METHOD(name) expands to a correct PyMethodDef declaration
- *   {  'name', (PyCFunction)ssl_Context_name, METH_VARARGS }
- * for convenience
- * ADD_ALIAS(name,real) creates an "alias" of the ssl_Context_real
- * function with the name 'name'
- */
-#define ADD_METHOD(name) { #name, (PyCFunction)ssl_Context_##name, METH_VARARGS, ssl_Context_##name##_doc }
-static PyMethodDef ssl_Context_methods[] = {
-    ADD_METHOD(load_verify_locations),
-    ADD_METHOD(set_passwd_cb),
-    ADD_METHOD(set_default_verify_paths),
-    ADD_METHOD(use_certificate_chain_file),
-    ADD_METHOD(use_certificate_file),
-    ADD_METHOD(use_certificate),
-    ADD_METHOD(add_extra_chain_cert),
-    ADD_METHOD(use_privatekey_file),
-    ADD_METHOD(use_privatekey),
-    ADD_METHOD(check_privatekey),
-    ADD_METHOD(load_client_ca),
-    ADD_METHOD(set_session_id),
-    ADD_METHOD(set_session_cache_mode),
-    ADD_METHOD(get_session_cache_mode),
-    ADD_METHOD(set_verify),
-    ADD_METHOD(set_verify_depth),
-    ADD_METHOD(get_verify_mode),
-    ADD_METHOD(get_verify_depth),
-    ADD_METHOD(load_tmp_dh),
-    ADD_METHOD(set_cipher_list),
-    ADD_METHOD(set_client_ca_list),
-    ADD_METHOD(add_client_ca),
-    ADD_METHOD(set_timeout),
-    ADD_METHOD(get_timeout),
-    ADD_METHOD(set_info_callback),
-    ADD_METHOD(get_app_data),
-    ADD_METHOD(set_app_data),
-    ADD_METHOD(get_cert_store),
-    ADD_METHOD(set_options),
-    ADD_METHOD(set_mode),
-    ADD_METHOD(set_tlsext_servername_callback),
-    { NULL, NULL }
-};
-#undef ADD_METHOD
-
-/*
- * Despite the name which might suggest otherwise, this is not the tp_init for
- * the Context type.  It's just the common initialization code shared by the
- * two _{Nn}ew functions below.
- */
-static ssl_ContextObj*
-ssl_Context_init(ssl_ContextObj *self, int i_method) {
-#if (OPENSSL_VERSION_NUMBER >> 28) == 0x01
-    const
-#endif
-    SSL_METHOD *method;
-
-    switch (i_method) {
-        case ssl_SSLv2_METHOD:
-#ifdef OPENSSL_NO_SSL2
-            PyErr_SetString(PyExc_ValueError, "SSLv2_METHOD not supported by this version of OpenSSL");
-            return NULL;
-#else
-            method = SSLv2_method();
-#endif
-            break;
-        case ssl_SSLv23_METHOD:
-            method = SSLv23_method();
-            break;
-        case ssl_SSLv3_METHOD:
-            method = SSLv3_method();
-            break;
-        case ssl_TLSv1_METHOD:
-            method = TLSv1_method();
-            break;
-        case ssl_TLSv1_1_METHOD:
-#ifdef SSL_OP_NO_TLSv1_1
-            method = TLSv1_1_method();
-#else
-            PyErr_SetString(PyExc_ValueError, "TLSv1_1_method not supported by this version of OpenSSL");
-            return NULL;
-#endif
-            break;
-        case ssl_TLSv1_2_METHOD:
-#ifdef SSL_OP_NO_TLSv1_2
-            method = TLSv1_2_method();
-#else
-            PyErr_SetString(PyExc_ValueError, "TLSv1_2_method not supported by this version of OpenSSL");
-            return NULL;
-#endif
-            break;
-        default:
-            PyErr_SetString(PyExc_ValueError, "No such protocol");
-            return NULL;
-    }
-
-    self->ctx = SSL_CTX_new(method);
-    if (self->ctx == NULL) {
-        exception_from_error_queue(ssl_Error);
-        return NULL;
-    }
-
-    Py_INCREF(Py_None);
-    self->passphrase_callback = Py_None;
-    Py_INCREF(Py_None);
-    self->verify_callback = Py_None;
-    Py_INCREF(Py_None);
-    self->info_callback = Py_None;
-
-    Py_INCREF(Py_None);
-    self->tlsext_servername_callback = Py_None;
-
-    Py_INCREF(Py_None);
-    self->passphrase_userdata = Py_None;
-
-    Py_INCREF(Py_None);
-    self->app_data = Py_None;
-
-    /* Some initialization that's required to operate smoothly in Python */
-    SSL_CTX_set_app_data(self->ctx, self);
-    SSL_CTX_set_mode(self->ctx, SSL_MODE_ENABLE_PARTIAL_WRITE |
-                                SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER |
-                                SSL_MODE_AUTO_RETRY);
-
-    self->tstate = NULL;
-
-    return self;
-}
-
-/*
- * This one is exposed in the CObject API.  I want to deprecate it.
- */
-ssl_ContextObj*
-ssl_Context_New(int i_method) {
-    ssl_ContextObj *self;
-
-    self = PyObject_GC_New(ssl_ContextObj, &ssl_Context_Type);
-    if (self == NULL) {
-       return (ssl_ContextObj *)PyErr_NoMemory();
-    }
-    self = ssl_Context_init(self, i_method);
-    PyObject_GC_Track((PyObject *)self);
-    return self;
-}
-
-
-/*
- * This one is the tp_new of the Context type.  It's great.
- */
-static PyObject*
-ssl_Context_new(PyTypeObject *subtype, PyObject *args, PyObject *kwargs) {
-    int i_method;
-    ssl_ContextObj *self;
-    static char *kwlist[] = {"method", NULL};
-
-    if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i:Context", kwlist, &i_method)) {
-        return NULL;
-    }
-
-    self = (ssl_ContextObj *)subtype->tp_alloc(subtype, 1);
-    if (self == NULL) {
-        return NULL;
-    }
-
-    return (PyObject *)ssl_Context_init(self, i_method);
-}
-
-/*
- * Call the visitproc on all contained objects.
- *
- * Arguments: self - The Context object
- *            visit - Function to call
- *            arg - Extra argument to visit
- * Returns:   0 if all goes well, otherwise the return code from the first
- *            call that gave non-zero result.
- */
-static int
-ssl_Context_traverse(ssl_ContextObj *self, visitproc visit, void *arg)
-{
-    int ret = 0;
-
-    if (ret == 0 && self->passphrase_callback != NULL)
-        ret = visit((PyObject *)self->passphrase_callback, arg);
-    if (ret == 0 && self->passphrase_userdata != NULL)
-        ret = visit((PyObject *)self->passphrase_userdata, arg);
-    if (ret == 0 && self->verify_callback != NULL)
-        ret = visit((PyObject *)self->verify_callback, arg);
-    if (ret == 0 && self->info_callback != NULL)
-        ret = visit((PyObject *)self->info_callback, arg);
-    if (ret == 0 && self->app_data != NULL)
-        ret = visit(self->app_data, arg);
-    return ret;
-}
-
-/*
- * Decref all contained objects and zero the pointers.
- *
- * Arguments: self - The Context object
- * Returns:   Always 0.
- */
-static int
-ssl_Context_clear(ssl_ContextObj *self)
-{
-    Py_XDECREF(self->passphrase_callback);
-    self->passphrase_callback = NULL;
-    Py_XDECREF(self->passphrase_userdata);
-    self->passphrase_userdata = NULL;
-    Py_XDECREF(self->verify_callback);
-    self->verify_callback = NULL;
-    Py_XDECREF(self->info_callback);
-    self->info_callback = NULL;
-    Py_XDECREF(self->app_data);
-    self->app_data = NULL;
-    return 0;
-}
-
-/*
- * Deallocate the memory used by the Context object
- *
- * Arguments: self - The Context object
- * Returns:   None
- */
-static void
-ssl_Context_dealloc(ssl_ContextObj *self)
-{
-    PyObject_GC_UnTrack((PyObject *)self);
-    SSL_CTX_free(self->ctx);
-    ssl_Context_clear(self);
-    PyObject_GC_Del(self);
-}
-
-
-PyTypeObject ssl_Context_Type = {
-    PyOpenSSL_HEAD_INIT(&PyType_Type, 0)
-    "OpenSSL.SSL.Context",
-    sizeof(ssl_ContextObj),
-    0,
-    (destructor)ssl_Context_dealloc, /* tp_dealloc */
-    NULL, /* print */
-    NULL, /* tp_getattr */
-    NULL, /* setattr */
-    NULL, /* compare */
-    NULL, /* repr */
-    NULL, /* as_number */
-    NULL, /* as_sequence */
-    NULL, /* as_mapping */
-    NULL, /* hash */
-    NULL, /* call */
-    NULL, /* str */
-    NULL, /* getattro */
-    NULL, /* setattro */
-    NULL, /* as_buffer */
-    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE, /* tp_flags */
-    ssl_Context_doc, /* tp_doc */
-    (traverseproc)ssl_Context_traverse, /* tp_traverse */
-    (inquiry)ssl_Context_clear, /* tp_clear */
-    NULL, /* tp_richcompare */
-    0, /* tp_weaklistoffset */
-    NULL, /* tp_iter */
-    NULL, /* tp_iternext */
-    ssl_Context_methods, /* tp_methods */
-    NULL, /* tp_members */
-    NULL, /* tp_getset */
-    NULL, /* tp_base */
-    NULL, /* tp_dict */
-    NULL, /* tp_descr_get */
-    NULL, /* tp_descr_set */
-    0, /* tp_dictoffset */
-    NULL, /* tp_init */
-    NULL, /* tp_alloc */
-    ssl_Context_new, /* tp_new */
-};
-
-
-/*
- * Initialize the Context part of the SSL sub module
- *
- * Arguments: dict - The OpenSSL.SSL module
- * Returns:   1 for success, 0 otherwise
- */
-int
-init_ssl_context(PyObject *module) {
-
-    if (PyType_Ready(&ssl_Context_Type) < 0) {
-        return 0;
-    }
-
-    /* PyModule_AddObject steals a reference.
-     */
-    Py_INCREF((PyObject *)&ssl_Context_Type);
-    if (PyModule_AddObject(module, "Context", (PyObject *)&ssl_Context_Type) < 0) {
-        return 0;
-    }
-
-    /* PyModule_AddObject steals a reference.
-     */
-    Py_INCREF((PyObject *)&ssl_Context_Type);
-    if (PyModule_AddObject(module, "ContextType", (PyObject *)&ssl_Context_Type) < 0) {
-        return 0;
-    }
-
-    return 1;
-}
-
diff --git a/OpenSSL/ssl/context.h b/OpenSSL/ssl/context.h
deleted file mode 100644
index 989d8f1..0000000
--- a/OpenSSL/ssl/context.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * context.h
- *
- * Copyright (C) AB Strakt
- * See LICENSE for details.
- *
- * Export SSL Context object data structures and functions.
- * See the file RATIONALE for a short explanation of why this module was written.
- *
- * Reviewed 2001-07-23
- *
- */
-#ifndef PyOpenSSL_SSL_CONTEXT_H_
-#define PyOpenSSL_SSL_CONTEXT_H_
-
-#include <Python.h>
-#include <openssl/ssl.h>
-
-extern  int                   init_ssl_context      (PyObject *);
-
-extern  PyTypeObject      ssl_Context_Type;
-
-#define ssl_Context_Check(v) ((v)->ob_type == &ssl_Context_Type)
-
-typedef struct {
-    PyObject_HEAD
-    SSL_CTX             *ctx;
-    PyObject            *passphrase_callback,
-                        *passphrase_userdata,
-                        *verify_callback,
-                        *info_callback,
-                        *tlsext_servername_callback,
-                        *app_data;
-    PyThreadState       *tstate;
-} ssl_ContextObj;
-
-#define ssl_SSLv2_METHOD      (1)
-#define ssl_SSLv3_METHOD      (2)
-#define ssl_SSLv23_METHOD     (3)
-#define ssl_TLSv1_METHOD      (4)
-#define ssl_TLSv1_1_METHOD    (5)
-#define ssl_TLSv1_2_METHOD    (6)
-
-
-#endif
diff --git a/OpenSSL/ssl/session.c b/OpenSSL/ssl/session.c
deleted file mode 100644
index f9932a4..0000000
--- a/OpenSSL/ssl/session.c
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * session.c
- *
- * Copyright (C) Jean-Paul Calderone
- * Copyright (C) Alejandro Alvarez Ayllon
- * See LICENSE for details.
- *
- * SSL Session object data structures and functions.
- *
- */
-#include <Python.h>
-#define SSL_MODULE
-#include "ssl.h"
-
-static char ssl_Session_doc[] = "\n\
-Session() -> Session instance\n\
-\n\
-";
-
-/*
- * Initialize an already-constructed Session instance with an OpenSSL session
- * structure (or NULL).  A reference to the OpenSSL session structure is stolen.
- */
-static ssl_SessionObj*
-ssl_Session_init(ssl_SessionObj *self, SSL_SESSION *native_session) {
-    self->session = native_session;
-    return self;
-}
-
-/*
- * Create a Session object
- */
-static PyObject*
-ssl_Session_new(PyTypeObject *subtype, PyObject *args, PyObject *kwargs) {
-    ssl_SessionObj *self;
-
-    if (!PyArg_ParseTuple(args, ":Session")) {
-        return NULL;
-    }
-
-    self = PyObject_New(ssl_SessionObj, &ssl_Session_Type);
-    if (self == NULL) {
-        return NULL;
-    }
-
-    return (PyObject *)ssl_Session_init(self, NULL);
-}
-
-/*
- * Create a Session object from an existing SSL_SESSION*.  A reference to the
- * SSL_SESSION* is stolen.
- */
-ssl_SessionObj*
-ssl_Session_from_SSL_SESSION(SSL_SESSION *native_session) {
-    ssl_SessionObj *self;
-
-    self = PyObject_New(ssl_SessionObj, &ssl_Session_Type);
-    if (self == NULL) {
-        return NULL;
-    }
-
-    return ssl_Session_init(self, native_session);
-}
-
-/*
- * Discard the reference to the OpenSSL session structure, if there is one, so
- * that it can be freed if it is no longer in use.  Also release the memory for
- * the Python object.
- */
-static void
-ssl_Session_dealloc(ssl_SessionObj *self) {
-    if (self->session != NULL) {
-        SSL_SESSION_free(self->session);
-        self->session = NULL;
-    }
-    Py_TYPE(self)->tp_free((PyObject*)self);
-}
-
-/*
- * Member methods in the Session object
- * ADD_METHOD(name) expands to a correct PyMethodDef declaration
- *   {  'name', (PyCFunction)ssl_Session_name, METH_VARARGS }
- * for convenience
- * ADD_ALIAS(name,real) creates an "alias" of the ssl_Session_real
- * function with the name 'name'
- */
-#define ADD_METHOD(name) { #name, (PyCFunction)ssl_Session_##name, METH_VARARGS, ssl_Session_##name##_doc }
-static PyMethodDef ssl_Session_methods[] = {
-    { NULL, NULL }
-};
-#undef ADD_METHOD
-
-/*
- * The Python Session type definition.
- */
-PyTypeObject ssl_Session_Type = {
-    PyOpenSSL_HEAD_INIT(&PyType_Type, 0)
-    "OpenSSL.SSL.Session",
-    sizeof(ssl_SessionObj),
-    0,
-    (destructor)ssl_Session_dealloc, /* tp_dealloc */
-    NULL, /* print */
-    NULL, /* tp_getattr */
-    NULL, /* setattr */
-    NULL, /* compare */
-    NULL, /* repr */
-    NULL, /* as_number */
-    NULL, /* as_sequence */
-    NULL, /* as_mapping */
-    NULL, /* hash */
-    NULL, /* call */
-    NULL, /* str */
-    NULL, /* getattro */
-    NULL, /* setattro */
-    NULL, /* as_buffer */
-    Py_TPFLAGS_DEFAULT, // Py_TPFLAGS_HAVE_GC, /* tp_flags */
-    ssl_Session_doc, /* tp_doc */
-    NULL, // (traverseproc)ssl_Session_traverse, /* tp_traverse */
-    NULL, // (inquiry)ssl_Session_clear, /* tp_clear */
-    NULL, /* tp_richcompare */
-    0, /* tp_weaklistoffset */
-    NULL, /* tp_iter */
-    NULL, /* tp_iternext */
-    ssl_Session_methods, /* tp_methods */
-    NULL, /* tp_members */
-    NULL, /* tp_getset */
-    NULL, /* tp_base */
-    NULL, /* tp_dict */
-    NULL, /* tp_descr_get */
-    NULL, /* tp_descr_set */
-    0, /* tp_dictoffset */
-    NULL, /* tp_init */
-    NULL, /* tp_alloc */
-    ssl_Session_new, /* tp_new */
-};
-
-/*
- * Initialize the Session part of the SSL sub module
- *
- * Arguments: dict - The OpenSSL.SSL module
- * Returns:   1 for success, 0 otherwise
- */
-int
-init_ssl_session(PyObject *module) {
-
-    if (PyType_Ready(&ssl_Session_Type) < 0) {
-        return 0;
-    }
-
-    /* PyModule_AddObject steals a reference.
-     */
-    Py_INCREF((PyObject *)&ssl_Session_Type);
-    if (PyModule_AddObject(module, "Session", (PyObject *)&ssl_Session_Type) < 0) {
-        return 0;
-    }
-
-    return 1;
-}
-
diff --git a/OpenSSL/ssl/session.h b/OpenSSL/ssl/session.h
deleted file mode 100644
index 4e8de11..0000000
--- a/OpenSSL/ssl/session.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * session.h
- * Copyright (C) Jean-Paul Calderone
- * See LICENSE for details.
- *
- * Defined here is the Python type which represents an SSL session by wrapping
- * an OpenSSL SSL_SESSION*.
- *
- */
-
-#ifndef PyOpenSSL_SSL_SESSION_H_
-#define PyOpenSSL_SSL_SESSION_H_
-
-#include <Python.h>
-#include <openssl/ssl.h>
-
-typedef struct {
-    PyObject_HEAD
-    SSL_SESSION *session;
-} ssl_SessionObj;
-
-extern PyTypeObject ssl_Session_Type;
-
-extern int init_ssl_session(PyObject *);
-extern ssl_SessionObj *ssl_Session_from_SSL_SESSION(SSL_SESSION *native_session);
-
-#endif
diff --git a/OpenSSL/ssl/ssl.c b/OpenSSL/ssl/ssl.c
deleted file mode 100644
index 0087cbb..0000000
--- a/OpenSSL/ssl/ssl.c
+++ /dev/null
@@ -1,326 +0,0 @@
-/*
- * ssl.c
- *
- * Copyright (C) AB Strakt
- * Copyright (C) Jean-Paul Calderone
- * See LICENSE for details.
- *
- * Main file of the SSL sub module.
- * See the file RATIONALE for a short explanation of why this module was written.
- *
- * Reviewed 2001-07-23
- */
-#include <Python.h>
-
-#ifndef MS_WINDOWS
-#  include <sys/socket.h>
-#  include <netinet/in.h>
-#  if !(defined(__BEOS__) || defined(__CYGWIN__))
-#    include <netinet/tcp.h>
-#  endif
-#else
-#  include <winsock.h>
-#  include <wincrypt.h>
-#endif
-
-#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 why this module was written.\n\
-";
-
-crypto_X509Obj* (*new_x509)(X509*, int);
-crypto_X509NameObj* (*new_x509name)(X509_NAME*, int);
-crypto_X509StoreObj* (*new_x509store)(X509_STORE*, int);
-
-
-#ifndef PY3
-void **crypto_API;
-#endif
-
-int _pyOpenSSL_tstate_key;
-
-/* Exceptions defined by the SSL submodule */
-PyObject *ssl_Error,                   /* Base class              */
-         *ssl_ZeroReturnError,         /* Used with SSL_get_error */
-         *ssl_WantReadError,           /* ...                     */
-         *ssl_WantWriteError,          /* ...                     */
-         *ssl_WantX509LookupError,     /* ...                     */
-         *ssl_SysCallError;            /* Uses (errno,errstr)     */
-
-static char ssl_SSLeay_version_doc[] = "\n\
-Return a string describing the version of OpenSSL in use.\n\
-\n\
-:param type: One of the SSLEAY_ constants defined in this module.\n\
-";
-
-static PyObject *
-ssl_SSLeay_version(PyObject *spam, PyObject *args) {
-    int t;
-    const char *version;
-
-    if (!PyArg_ParseTuple(args, "i:SSLeay_version", &t)) {
-        return NULL;
-    }
-
-    version = SSLeay_version(t);
-    return PyBytes_FromStringAndSize(version, strlen(version));
-}
-
-
-
-/* Methods in the OpenSSL.SSL module */
-static PyMethodDef ssl_methods[] = {
-    { "SSLeay_version", ssl_SSLeay_version, METH_VARARGS, ssl_SSLeay_version_doc },
-    { NULL, NULL }
-};
-
-#ifdef PY3
-static struct PyModuleDef sslmodule = {
-    PyModuleDef_HEAD_INIT,
-    "xSSL",
-    ssl_doc,
-    -1,
-    ssl_methods
-};
-#endif
-
-/*
- * Initialize SSL sub module
- *
- * Arguments: None
- * Returns:   None
- */
-PyOpenSSL_MODINIT(xSSL) {
-    PyObject *module;
-#ifndef PY3
-    static void *ssl_API[ssl_API_pointers];
-    PyObject *ssl_api_object;
-
-    import_crypto();
-
-    new_x509 = crypto_X509_New;
-    new_x509name = crypto_X509Name_New;
-    new_x509store = crypto_X509Store_New;
-#else
-#   ifdef _WIN32
-    HMODULE crypto = GetModuleHandle("crypto.pyd");
-    if (crypto == NULL) {
-        PyErr_SetString(PyExc_RuntimeError, "Unable to get crypto module");
-        PyOpenSSL_MODRETURN(NULL);
-    }
-
-    new_x509 = (crypto_X509Obj* (*)(X509*, int))GetProcAddress(crypto, "crypto_X509_New");
-    new_x509name = (crypto_X509NameObj* (*)(X509_NAME*, int))GetProcAddress(crypto, "crypto_X509Name_New");
-    new_x509store = (crypto_X509StoreObj* (*)(X509_STORE*, int))GetProcAddress(crypto, "crypto_X509Store_New");
-#   else
-    new_x509 = crypto_X509_New;
-    new_x509name = crypto_X509Name_New;
-    new_x509store = crypto_X509Store_New;
-#   endif
-#endif
-
-    SSL_library_init();
-    ERR_load_SSL_strings();
-
-#ifdef PY3
-    module = PyModule_Create(&sslmodule);
-#else
-    module = Py_InitModule3("xSSL", ssl_methods, ssl_doc);
-#endif
-    if (module == NULL) {
-        PyOpenSSL_MODRETURN(NULL);
-    }
-
-#ifndef PY3
-    /* Initialize the C API pointer array */
-    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 steals a reference.
-         */
-        Py_INCREF(ssl_api_object);
-        PyModule_AddObject(module, "_C_API", ssl_api_object);
-    }
-#endif
-
-    /* Exceptions */
-/*
- * ADD_EXCEPTION(dict,name,base) expands to a correct Exception declaration,
- * inserting OpenSSL.SSL.name into dict, derviving the exception from base.
- */
-#define ADD_EXCEPTION(_name, _base)                                     \
-do {                                                                    \
-    ssl_##_name = PyErr_NewException("OpenSSL.SSL."#_name, _base, NULL);\
-    if (ssl_##_name == NULL)                                            \
-        goto error;                                                     \
-    /* PyModule_AddObject steals a reference. */                        \
-    Py_INCREF(ssl_##_name);                                             \
-    if (PyModule_AddObject(module, #_name, ssl_##_name) != 0)           \
-        goto error;                                                     \
-} while (0)
-
-    ssl_Error = PyErr_NewException("OpenSSL.SSL.Error", NULL, NULL);
-    if (ssl_Error == NULL) {
-        goto error;
-    }
-
-    /* PyModule_AddObject steals a reference. */
-    Py_INCREF(ssl_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
-
-    /* Method constants */
-    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, "TLSv1_1_METHOD",  ssl_TLSv1_1_METHOD);
-    PyModule_AddIntConstant(module, "TLSv1_2_METHOD",  ssl_TLSv1_2_METHOD);
-
-    /* Verify constants */
-    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);
-
-    /* File type constants */
-    PyModule_AddIntConstant(module, "FILETYPE_PEM",  SSL_FILETYPE_PEM);
-    PyModule_AddIntConstant(module, "FILETYPE_ASN1", SSL_FILETYPE_ASN1);
-
-    /* SSL option constants */
-    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);
-#ifdef SSL_OP_NO_TLSv1_1
-    PyModule_AddIntConstant(module, "OP_NO_TLSv1_1", SSL_OP_NO_TLSv1_1);
-#endif
-#ifdef SSL_OP_NO_TLSv1_2
-    PyModule_AddIntConstant(module, "OP_NO_TLSv1_2", SSL_OP_NO_TLSv1_2);
-#endif
-
-    /* More SSL option constants */
-    PyModule_AddIntConstant(module, "OP_MICROSOFT_SESS_ID_BUG", SSL_OP_MICROSOFT_SESS_ID_BUG);
-    PyModule_AddIntConstant(module, "OP_NETSCAPE_CHALLENGE_BUG", SSL_OP_NETSCAPE_CHALLENGE_BUG);
-    PyModule_AddIntConstant(module, "OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG", SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG);
-    PyModule_AddIntConstant(module, "OP_SSLREF2_REUSE_CERT_TYPE_BUG", SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG);
-    PyModule_AddIntConstant(module, "OP_MICROSOFT_BIG_SSLV3_BUFFER", SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER);
-    PyModule_AddIntConstant(module, "OP_MSIE_SSLV2_RSA_PADDING", SSL_OP_MSIE_SSLV2_RSA_PADDING);
-    PyModule_AddIntConstant(module, "OP_SSLEAY_080_CLIENT_DH_BUG", SSL_OP_SSLEAY_080_CLIENT_DH_BUG);
-    PyModule_AddIntConstant(module, "OP_TLS_D5_BUG", SSL_OP_TLS_D5_BUG);
-    PyModule_AddIntConstant(module, "OP_TLS_BLOCK_PADDING_BUG", SSL_OP_TLS_BLOCK_PADDING_BUG);
-    PyModule_AddIntConstant(module, "OP_DONT_INSERT_EMPTY_FRAGMENTS", SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS);
-    PyModule_AddIntConstant(module, "OP_ALL", SSL_OP_ALL);
-    PyModule_AddIntConstant(module, "OP_CIPHER_SERVER_PREFERENCE", SSL_OP_CIPHER_SERVER_PREFERENCE);
-    PyModule_AddIntConstant(module, "OP_TLS_ROLLBACK_BUG", SSL_OP_TLS_ROLLBACK_BUG);
-    PyModule_AddIntConstant(module, "OP_PKCS1_CHECK_1", SSL_OP_PKCS1_CHECK_1);
-    PyModule_AddIntConstant(module, "OP_PKCS1_CHECK_2", SSL_OP_PKCS1_CHECK_2);
-    PyModule_AddIntConstant(module, "OP_NETSCAPE_CA_DN_BUG", SSL_OP_NETSCAPE_CA_DN_BUG);
-    PyModule_AddIntConstant(module, "OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG", SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG);
-
-#ifdef SSL_OP_NO_COMPRESSION
-    PyModule_AddIntConstant(module, "OP_NO_COMPRESSION", SSL_OP_NO_COMPRESSION);
-#endif
-
-    /* DTLS related options.  The first two of these were introduced in
-     * 2005, the third in 2007.  To accomodate systems which are still using
-     * older versions, make them optional. */
-#ifdef SSL_OP_NO_QUERY_MTU
-    PyModule_AddIntConstant(module, "OP_NO_QUERY_MTU", SSL_OP_NO_QUERY_MTU);
-#endif
-#ifdef SSL_OP_COOKIE_EXCHANGE
-    PyModule_AddIntConstant(module, "OP_COOKIE_EXCHANGE", SSL_OP_COOKIE_EXCHANGE);
-#endif
-#ifdef SSL_OP_NO_TICKET
-    PyModule_AddIntConstant(module, "OP_NO_TICKET", SSL_OP_NO_TICKET);
-#endif
-
-    /* For SSL_set_shutdown */
-    PyModule_AddIntConstant(module, "SENT_SHUTDOWN", SSL_SENT_SHUTDOWN);
-    PyModule_AddIntConstant(module, "RECEIVED_SHUTDOWN", SSL_RECEIVED_SHUTDOWN);
-
-    /* For set_info_callback */
-    PyModule_AddIntConstant(module, "SSL_ST_CONNECT", SSL_ST_CONNECT);
-    PyModule_AddIntConstant(module, "SSL_ST_ACCEPT", SSL_ST_ACCEPT);
-    PyModule_AddIntConstant(module, "SSL_ST_MASK", SSL_ST_MASK);
-    PyModule_AddIntConstant(module, "SSL_ST_INIT", SSL_ST_INIT);
-    PyModule_AddIntConstant(module, "SSL_ST_BEFORE", SSL_ST_BEFORE);
-    PyModule_AddIntConstant(module, "SSL_ST_OK", SSL_ST_OK);
-    PyModule_AddIntConstant(module, "SSL_ST_RENEGOTIATE", SSL_ST_RENEGOTIATE);
-    PyModule_AddIntConstant(module, "SSL_CB_LOOP", SSL_CB_LOOP);
-    PyModule_AddIntConstant(module, "SSL_CB_EXIT", SSL_CB_EXIT);
-    PyModule_AddIntConstant(module, "SSL_CB_READ", SSL_CB_READ);
-    PyModule_AddIntConstant(module, "SSL_CB_WRITE", SSL_CB_WRITE);
-    PyModule_AddIntConstant(module, "SSL_CB_ALERT", SSL_CB_ALERT);
-    PyModule_AddIntConstant(module, "SSL_CB_READ_ALERT", SSL_CB_READ_ALERT);
-    PyModule_AddIntConstant(module, "SSL_CB_WRITE_ALERT", SSL_CB_WRITE_ALERT);
-    PyModule_AddIntConstant(module, "SSL_CB_ACCEPT_LOOP", SSL_CB_ACCEPT_LOOP);
-    PyModule_AddIntConstant(module, "SSL_CB_ACCEPT_EXIT", SSL_CB_ACCEPT_EXIT);
-    PyModule_AddIntConstant(module, "SSL_CB_CONNECT_LOOP", SSL_CB_CONNECT_LOOP);
-    PyModule_AddIntConstant(module, "SSL_CB_CONNECT_EXIT", SSL_CB_CONNECT_EXIT);
-    PyModule_AddIntConstant(module, "SSL_CB_HANDSHAKE_START", SSL_CB_HANDSHAKE_START);
-    PyModule_AddIntConstant(module, "SSL_CB_HANDSHAKE_DONE", SSL_CB_HANDSHAKE_DONE);
-
-    /* Version information indicators, used with SSLeay_version */
-    PyModule_AddIntConstant(module, "SSLEAY_VERSION", SSLEAY_VERSION);
-    PyModule_AddIntConstant(module, "SSLEAY_CFLAGS", SSLEAY_CFLAGS);
-    PyModule_AddIntConstant(module, "SSLEAY_BUILT_ON", SSLEAY_BUILT_ON);
-    PyModule_AddIntConstant(module, "SSLEAY_PLATFORM", SSLEAY_PLATFORM);
-    PyModule_AddIntConstant(module, "SSLEAY_DIR", SSLEAY_DIR);
-
-    /* Cache modes */
-#define CACHE_MODE(mode) \
-    PyModule_AddIntConstant(module, "SESS_CACHE_" #mode, SSL_SESS_CACHE_##mode)
-
-    CACHE_MODE(OFF);
-    CACHE_MODE(CLIENT);
-    CACHE_MODE(SERVER);
-    CACHE_MODE(BOTH);
-    CACHE_MODE(NO_AUTO_CLEAR);
-    CACHE_MODE(NO_INTERNAL_LOOKUP);
-    CACHE_MODE(NO_INTERNAL_STORE);
-    CACHE_MODE(NO_INTERNAL);
-#undef CACHE_MODE
-
-    /* Straight up version number */
-    PyModule_AddIntConstant(module, "OPENSSL_VERSION_NUMBER", OPENSSL_VERSION_NUMBER);
-
-    /* SSL modes constants */
-#ifdef SSL_MODE_RELEASE_BUFFERS
-    PyModule_AddIntConstant(module, "MODE_RELEASE_BUFFERS", SSL_MODE_RELEASE_BUFFERS);
-#endif
-
-    if (!init_ssl_context(module))
-        goto error;
-    if (!init_ssl_session(module))
-        goto error;
-    if (!init_ssl_connection(module))
-        goto error;
-
-#ifdef WITH_THREAD
-    /*
-     * Initialize this module's threading support structures.
-     */
-    _pyOpenSSL_tstate_key = PyThread_create_key();
-#endif
-
-    PyOpenSSL_MODRETURN(module);
-
-error:
-    PyOpenSSL_MODRETURN(NULL);
-    ;
-}
diff --git a/OpenSSL/ssl/ssl.h b/OpenSSL/ssl/ssl.h
deleted file mode 100644
index 3074ba5..0000000
--- a/OpenSSL/ssl/ssl.h
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * ssl.h
- *
- * Copyright (C) AB Strakt
- * See LICENSE for details.
- *
- * Export functions and exceptions from the SSL sub module.
- * See the file RATIONALE for a short explanation of why this module was written.
- *
- * Reviewed 2001-07-23
- *
- */
-#ifndef PyOpenSSL_SSL_H_
-#define PyOpenSSL_SSL_H_
-
-#include <Python.h>
-#include <pythread.h>
-#include "context.h"
-#include "session.h"
-#include "connection.h"
-#include "../util.h"
-#include "../crypto/crypto.h"
-
-extern PyObject *ssl_Error,               /* Base class              */
-                *ssl_ZeroReturnError,     /* Used with SSL_get_erorr */
-                *ssl_WantReadError,       /* ...                     */
-                *ssl_WantWriteError,      /* ...                     */
-                *ssl_WantX509LookupError, /* ...                     */
-                *ssl_SysCallError;        /* Uses (errno,errstr)     */
-
-#define ssl_Context_New_NUM       0
-#define ssl_Context_New_RETURN    ssl_ContextObj *
-#define ssl_Context_New_PROTO     (int method)
-
-#define ssl_Connection_New_NUM    1
-#define ssl_Connection_New_RETURN ssl_ConnectionObj *
-#define ssl_Connection_New_PROTO  (ssl_ContextObj *ctx, PyObject *sock)
-
-#define ssl_API_pointers          2
-
-#ifdef WITH_THREAD
-extern int _pyOpenSSL_tstate_key;
-#endif /* WITH_THREAD */
-
-#ifdef SSL_MODULE
-
-extern ssl_Context_New_RETURN    ssl_Context_New    ssl_Context_New_PROTO;
-extern ssl_Connection_New_RETURN ssl_Connection_New ssl_Connection_New_PROTO;
-
-extern crypto_X509Obj* (*new_x509)(X509*, int);
-extern crypto_X509NameObj* (*new_x509name)(X509_NAME*, int);
-extern crypto_X509StoreObj* (*new_x509store)(X509_STORE*, int);
-
-#else /* SSL_MODULE */
-
-extern void **ssl_API;
-
-#define ssl_Context_New \
- (*(ssl_Context_New_RETURN (*)ssl_Context_New_PROTO) ssl_API[ssl_Context_New_NUM])
-#define ssl_Connection_New \
- (*(ssl_Connection_New_RETURN (*)ssl_Connection_New_PROTO) ssl_API[ssl_Connection_New_NUM])
-
-#define import_SSL() \
-{ \
-  PyObject *module = PyImport_ImportModule("OpenSSL.SSL"); \
-  if (module != NULL) { \
-    PyObject *module_dict = PyModule_GetDict(module); \
-    PyObject *c_api_object = PyDict_GetItemString(module_dict, "_C_API"); \
-    if (PyCObject_Check(c_api_object)) { \
-      ssl_API = (void **)PyCObject_AsVoidPtr(c_api_object); \
-    } \
-  } \
-}
-
-#endif /* SSL_MODULE */
-
-#endif /* PyOpenSSL_SSL_H_ */
