blob: a5145552e8429a018ab72cb545aae0b507652d17 [file] [log] [blame]
Thomas Woutersed03b412007-08-28 21:37:11 +00001/* SSL socket module
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002
3 SSL support based on patches by Brian E Gallew and Laszlo Kovacs.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004 Re-worked a bit by Bill Janssen to add server-side support and
Bill Janssen6e027db2007-11-15 22:23:56 +00005 certificate decoding. Chris Stawarz contributed some non-blocking
6 patches.
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00007
Thomas Wouters1b7f8912007-09-19 03:06:30 +00008 This module is imported by ssl.py. It should *not* be used
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00009 directly.
10
Thomas Wouters1b7f8912007-09-19 03:06:30 +000011 XXX should partial writes be enabled, SSL_MODE_ENABLE_PARTIAL_WRITE?
Antoine Pitrou2c4f98b2010-04-23 00:16:21 +000012
13 XXX integrate several "shutdown modes" as suggested in
14 http://bugs.python.org/issue8108#msg102867 ?
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000015*/
16
17#include "Python.h"
Thomas Woutersed03b412007-08-28 21:37:11 +000018
Thomas Wouters1b7f8912007-09-19 03:06:30 +000019#ifdef WITH_THREAD
20#include "pythread.h"
21#define PySSL_BEGIN_ALLOW_THREADS { \
Antoine Pitroucbb82eb2010-05-05 15:57:33 +000022 PyThreadState *_save = NULL; \
23 if (_ssl_locks_count>0) {_save = PyEval_SaveThread();}
24#define PySSL_BLOCK_THREADS if (_ssl_locks_count>0){PyEval_RestoreThread(_save)};
25#define PySSL_UNBLOCK_THREADS if (_ssl_locks_count>0){_save = PyEval_SaveThread()};
26#define PySSL_END_ALLOW_THREADS if (_ssl_locks_count>0){PyEval_RestoreThread(_save);} \
27 }
Thomas Wouters1b7f8912007-09-19 03:06:30 +000028
Antoine Pitroucbb82eb2010-05-05 15:57:33 +000029#else /* no WITH_THREAD */
Thomas Wouters1b7f8912007-09-19 03:06:30 +000030
31#define PySSL_BEGIN_ALLOW_THREADS
32#define PySSL_BLOCK_THREADS
33#define PySSL_UNBLOCK_THREADS
34#define PySSL_END_ALLOW_THREADS
35
36#endif
37
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +000038enum py_ssl_error {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +000039 /* these mirror ssl.h */
40 PY_SSL_ERROR_NONE,
41 PY_SSL_ERROR_SSL,
42 PY_SSL_ERROR_WANT_READ,
43 PY_SSL_ERROR_WANT_WRITE,
44 PY_SSL_ERROR_WANT_X509_LOOKUP,
45 PY_SSL_ERROR_SYSCALL, /* look at error stack/return value/errno */
46 PY_SSL_ERROR_ZERO_RETURN,
47 PY_SSL_ERROR_WANT_CONNECT,
48 /* start of non ssl.h errorcodes */
49 PY_SSL_ERROR_EOF, /* special case of SSL_ERROR_SYSCALL */
50 PY_SSL_ERROR_NO_SOCKET, /* socket has been GC'd */
51 PY_SSL_ERROR_INVALID_ERROR_CODE
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +000052};
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000053
Thomas Woutersed03b412007-08-28 21:37:11 +000054enum py_ssl_server_or_client {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +000055 PY_SSL_CLIENT,
56 PY_SSL_SERVER
Thomas Woutersed03b412007-08-28 21:37:11 +000057};
58
59enum py_ssl_cert_requirements {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +000060 PY_SSL_CERT_NONE,
61 PY_SSL_CERT_OPTIONAL,
62 PY_SSL_CERT_REQUIRED
Thomas Woutersed03b412007-08-28 21:37:11 +000063};
64
65enum py_ssl_version {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +000066 PY_SSL_VERSION_SSL2,
67 PY_SSL_VERSION_SSL3,
68 PY_SSL_VERSION_SSL23,
69 PY_SSL_VERSION_TLS1
Thomas Woutersed03b412007-08-28 21:37:11 +000070};
71
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000072/* Include symbols from _socket module */
73#include "socketmodule.h"
74
Benjamin Petersonb173f782009-05-05 22:31:58 +000075static PySocketModule_APIObject PySocketModule;
76
Thomas Woutersed03b412007-08-28 21:37:11 +000077#if defined(HAVE_POLL_H)
Thomas Wouters0e3f5912006-08-11 14:57:12 +000078#include <poll.h>
79#elif defined(HAVE_SYS_POLL_H)
80#include <sys/poll.h>
81#endif
82
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000083/* Include OpenSSL header files */
84#include "openssl/rsa.h"
85#include "openssl/crypto.h"
86#include "openssl/x509.h"
Thomas Wouters1b7f8912007-09-19 03:06:30 +000087#include "openssl/x509v3.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000088#include "openssl/pem.h"
89#include "openssl/ssl.h"
90#include "openssl/err.h"
91#include "openssl/rand.h"
92
93/* SSL error object */
94static PyObject *PySSLErrorObject;
95
Thomas Wouters1b7f8912007-09-19 03:06:30 +000096#ifdef WITH_THREAD
97
98/* serves as a flag to see whether we've initialized the SSL thread support. */
99/* 0 means no, greater than 0 means yes */
100
101static unsigned int _ssl_locks_count = 0;
102
103#endif /* def WITH_THREAD */
104
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000105/* SSL socket object */
106
107#define X509_NAME_MAXLEN 256
108
109/* RAND_* APIs got added to OpenSSL in 0.9.5 */
110#if OPENSSL_VERSION_NUMBER >= 0x0090500fL
111# define HAVE_OPENSSL_RAND 1
112#else
113# undef HAVE_OPENSSL_RAND
114#endif
115
Gregory P. Smithbd4dacb2010-10-13 03:53:21 +0000116/* SSL_CTX_clear_options() and SSL_clear_options() were first added in
117 * OpenSSL 0.9.8m but do not appear in some 0.9.9-dev versions such the
118 * 0.9.9 from "May 2008" that NetBSD 5.0 uses. */
119#if OPENSSL_VERSION_NUMBER >= 0x009080dfL && OPENSSL_VERSION_NUMBER != 0x00909000L
Antoine Pitroub5218772010-05-21 09:56:06 +0000120# define HAVE_SSL_CTX_CLEAR_OPTIONS
121#else
122# undef HAVE_SSL_CTX_CLEAR_OPTIONS
123#endif
124
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000125typedef struct {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000126 PyObject_HEAD
Antoine Pitrou152efa22010-05-16 18:19:27 +0000127 SSL_CTX *ctx;
128} PySSLContext;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000129
Antoine Pitrou152efa22010-05-16 18:19:27 +0000130typedef struct {
131 PyObject_HEAD
132 PyObject *Socket; /* weakref to socket on which we're layered */
133 SSL *ssl;
134 X509 *peer_cert;
135 int shutdown_seen_zero;
136} PySSLSocket;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000137
Antoine Pitrou152efa22010-05-16 18:19:27 +0000138static PyTypeObject PySSLContext_Type;
139static PyTypeObject PySSLSocket_Type;
140
141static PyObject *PySSL_SSLwrite(PySSLSocket *self, PyObject *args);
142static PyObject *PySSL_SSLread(PySSLSocket *self, PyObject *args);
Thomas Woutersed03b412007-08-28 21:37:11 +0000143static int check_socket_and_wait_for_timeout(PySocketSockObject *s,
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000144 int writing);
Antoine Pitrou152efa22010-05-16 18:19:27 +0000145static PyObject *PySSL_peercert(PySSLSocket *self, PyObject *args);
146static PyObject *PySSL_cipher(PySSLSocket *self);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000147
Antoine Pitrou152efa22010-05-16 18:19:27 +0000148#define PySSLContext_Check(v) (Py_TYPE(v) == &PySSLContext_Type)
149#define PySSLSocket_Check(v) (Py_TYPE(v) == &PySSLSocket_Type)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000150
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +0000151typedef enum {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000152 SOCKET_IS_NONBLOCKING,
153 SOCKET_IS_BLOCKING,
154 SOCKET_HAS_TIMED_OUT,
155 SOCKET_HAS_BEEN_CLOSED,
156 SOCKET_TOO_LARGE_FOR_SELECT,
157 SOCKET_OPERATION_OK
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +0000158} timeout_state;
159
Thomas Woutersed03b412007-08-28 21:37:11 +0000160/* Wrap error strings with filename and line # */
161#define STRINGIFY1(x) #x
162#define STRINGIFY2(x) STRINGIFY1(x)
163#define ERRSTR1(x,y,z) (x ":" y ": " z)
164#define ERRSTR(x) ERRSTR1("_ssl.c", STRINGIFY2(__LINE__), x)
165
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000166/* XXX It might be helpful to augment the error message generated
167 below with the name of the SSL function that generated the error.
168 I expect it's obvious most of the time.
169*/
170
171static PyObject *
Antoine Pitrou152efa22010-05-16 18:19:27 +0000172PySSL_SetError(PySSLSocket *obj, int ret, char *filename, int lineno)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000173{
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000174 PyObject *v;
175 char buf[2048];
176 char *errstr;
177 int err;
178 enum py_ssl_error p = PY_SSL_ERROR_NONE;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000179
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000180 assert(ret <= 0);
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +0000181
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000182 if (obj->ssl != NULL) {
183 err = SSL_get_error(obj->ssl, ret);
Thomas Woutersed03b412007-08-28 21:37:11 +0000184
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000185 switch (err) {
186 case SSL_ERROR_ZERO_RETURN:
187 errstr = "TLS/SSL connection has been closed";
188 p = PY_SSL_ERROR_ZERO_RETURN;
189 break;
190 case SSL_ERROR_WANT_READ:
191 errstr = "The operation did not complete (read)";
192 p = PY_SSL_ERROR_WANT_READ;
193 break;
194 case SSL_ERROR_WANT_WRITE:
195 p = PY_SSL_ERROR_WANT_WRITE;
196 errstr = "The operation did not complete (write)";
197 break;
198 case SSL_ERROR_WANT_X509_LOOKUP:
199 p = PY_SSL_ERROR_WANT_X509_LOOKUP;
Antoine Pitrou525807b2010-05-12 14:05:24 +0000200 errstr = "The operation did not complete (X509 lookup)";
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000201 break;
202 case SSL_ERROR_WANT_CONNECT:
203 p = PY_SSL_ERROR_WANT_CONNECT;
204 errstr = "The operation did not complete (connect)";
205 break;
206 case SSL_ERROR_SYSCALL:
207 {
208 unsigned long e = ERR_get_error();
209 if (e == 0) {
210 PySocketSockObject *s
211 = (PySocketSockObject *) PyWeakref_GetObject(obj->Socket);
212 if (ret == 0 || (((PyObject *)s) == Py_None)) {
Antoine Pitrou525807b2010-05-12 14:05:24 +0000213 p = PY_SSL_ERROR_EOF;
214 errstr = "EOF occurred in violation of protocol";
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000215 } else if (ret == -1) {
Antoine Pitrou525807b2010-05-12 14:05:24 +0000216 /* underlying BIO reported an I/O error */
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +0000217 Py_INCREF(s);
Antoine Pitrou9d74b422010-05-16 23:14:22 +0000218 ERR_clear_error();
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +0000219 v = s->errorhandler();
220 Py_DECREF(s);
221 return v;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000222 } else { /* possible? */
Antoine Pitrou525807b2010-05-12 14:05:24 +0000223 p = PY_SSL_ERROR_SYSCALL;
224 errstr = "Some I/O error occurred";
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000225 }
226 } else {
227 p = PY_SSL_ERROR_SYSCALL;
228 /* XXX Protected by global interpreter lock */
229 errstr = ERR_error_string(e, NULL);
230 }
231 break;
232 }
233 case SSL_ERROR_SSL:
234 {
235 unsigned long e = ERR_get_error();
236 p = PY_SSL_ERROR_SSL;
237 if (e != 0)
238 /* XXX Protected by global interpreter lock */
239 errstr = ERR_error_string(e, NULL);
240 else { /* possible? */
Antoine Pitrou525807b2010-05-12 14:05:24 +0000241 errstr = "A failure in the SSL library occurred";
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000242 }
243 break;
244 }
245 default:
246 p = PY_SSL_ERROR_INVALID_ERROR_CODE;
247 errstr = "Invalid error code";
248 }
249 } else {
250 errstr = ERR_error_string(ERR_peek_last_error(), NULL);
251 }
252 PyOS_snprintf(buf, sizeof(buf), "_ssl.c:%d: %s", lineno, errstr);
Antoine Pitrou9d74b422010-05-16 23:14:22 +0000253 ERR_clear_error();
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000254 v = Py_BuildValue("(is)", p, buf);
255 if (v != NULL) {
256 PyErr_SetObject(PySSLErrorObject, v);
257 Py_DECREF(v);
258 }
259 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000260}
261
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000262static PyObject *
263_setSSLError (char *errstr, int errcode, char *filename, int lineno) {
264
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000265 char buf[2048];
266 PyObject *v;
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000267
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000268 if (errstr == NULL) {
269 errcode = ERR_peek_last_error();
270 errstr = ERR_error_string(errcode, NULL);
271 }
272 PyOS_snprintf(buf, sizeof(buf), "_ssl.c:%d: %s", lineno, errstr);
Antoine Pitrou9d74b422010-05-16 23:14:22 +0000273 ERR_clear_error();
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000274 v = Py_BuildValue("(is)", errcode, buf);
275 if (v != NULL) {
276 PyErr_SetObject(PySSLErrorObject, v);
277 Py_DECREF(v);
278 }
279 return NULL;
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000280}
281
Antoine Pitrou152efa22010-05-16 18:19:27 +0000282static PySSLSocket *
283newPySSLSocket(SSL_CTX *ctx, PySocketSockObject *sock,
Antoine Pitroud5323212010-10-22 18:19:07 +0000284 enum py_ssl_server_or_client socket_type,
285 char *server_hostname)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000286{
Antoine Pitrou152efa22010-05-16 18:19:27 +0000287 PySSLSocket *self;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000288
Antoine Pitrou152efa22010-05-16 18:19:27 +0000289 self = PyObject_New(PySSLSocket, &PySSLSocket_Type);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000290 if (self == NULL)
291 return NULL;
Antoine Pitrou152efa22010-05-16 18:19:27 +0000292
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000293 self->peer_cert = NULL;
294 self->ssl = NULL;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000295 self->Socket = NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000296
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000297 /* Make sure the SSL error state is initialized */
298 (void) ERR_get_state();
299 ERR_clear_error();
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000300
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000301 PySSL_BEGIN_ALLOW_THREADS
Antoine Pitrou152efa22010-05-16 18:19:27 +0000302 self->ssl = SSL_new(ctx);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000303 PySSL_END_ALLOW_THREADS
Antoine Pitrou152efa22010-05-16 18:19:27 +0000304 SSL_set_fd(self->ssl, sock->sock_fd);
Antoine Pitrou0ae7b582010-04-09 20:42:09 +0000305#ifdef SSL_MODE_AUTO_RETRY
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000306 SSL_set_mode(self->ssl, SSL_MODE_AUTO_RETRY);
Antoine Pitrou0ae7b582010-04-09 20:42:09 +0000307#endif
Guido van Rossum4f707ac2003-01-31 18:13:18 +0000308
Antoine Pitroud5323212010-10-22 18:19:07 +0000309#ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME
310 if (server_hostname != NULL)
311 SSL_set_tlsext_host_name(self->ssl, server_hostname);
312#endif
313
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000314 /* If the socket is in non-blocking mode or timeout mode, set the BIO
315 * to non-blocking mode (blocking is the default)
316 */
Antoine Pitrou152efa22010-05-16 18:19:27 +0000317 if (sock->sock_timeout >= 0.0) {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000318 BIO_set_nbio(SSL_get_rbio(self->ssl), 1);
319 BIO_set_nbio(SSL_get_wbio(self->ssl), 1);
320 }
Guido van Rossum4f707ac2003-01-31 18:13:18 +0000321
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000322 PySSL_BEGIN_ALLOW_THREADS
323 if (socket_type == PY_SSL_CLIENT)
324 SSL_set_connect_state(self->ssl);
325 else
326 SSL_set_accept_state(self->ssl);
327 PySSL_END_ALLOW_THREADS
Martin v. Löwis09c35f72002-07-28 09:57:45 +0000328
Antoine Pitrou152efa22010-05-16 18:19:27 +0000329 self->Socket = PyWeakref_NewRef((PyObject *) sock, NULL);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000330 return self;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000331}
332
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000333/* SSL object methods */
334
Antoine Pitrou152efa22010-05-16 18:19:27 +0000335static PyObject *PySSL_SSLdo_handshake(PySSLSocket *self)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000336{
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000337 int ret;
338 int err;
339 int sockstate, nonblocking;
340 PySocketSockObject *sock
341 = (PySocketSockObject *) PyWeakref_GetObject(self->Socket);
Antoine Pitroud3f8ab82010-04-24 21:26:44 +0000342
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000343 if (((PyObject*)sock) == Py_None) {
344 _setSSLError("Underlying socket connection gone",
345 PY_SSL_ERROR_NO_SOCKET, __FILE__, __LINE__);
346 return NULL;
347 }
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +0000348 Py_INCREF(sock);
Antoine Pitroud3f8ab82010-04-24 21:26:44 +0000349
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000350 /* just in case the blocking state of the socket has been changed */
351 nonblocking = (sock->sock_timeout >= 0.0);
352 BIO_set_nbio(SSL_get_rbio(self->ssl), nonblocking);
353 BIO_set_nbio(SSL_get_wbio(self->ssl), nonblocking);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000354
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000355 /* Actually negotiate SSL connection */
356 /* XXX If SSL_do_handshake() returns 0, it's also a failure. */
357 sockstate = 0;
358 do {
Bill Janssen6e027db2007-11-15 22:23:56 +0000359 PySSL_BEGIN_ALLOW_THREADS
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000360 ret = SSL_do_handshake(self->ssl);
361 err = SSL_get_error(self->ssl, ret);
362 PySSL_END_ALLOW_THREADS
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +0000363 if (PyErr_CheckSignals())
364 goto error;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000365 if (err == SSL_ERROR_WANT_READ) {
366 sockstate = check_socket_and_wait_for_timeout(sock, 0);
367 } else if (err == SSL_ERROR_WANT_WRITE) {
368 sockstate = check_socket_and_wait_for_timeout(sock, 1);
369 } else {
370 sockstate = SOCKET_OPERATION_OK;
371 }
372 if (sockstate == SOCKET_HAS_TIMED_OUT) {
Antoine Pitrouc4df7842010-12-03 19:59:41 +0000373 PyErr_SetString(PySocketModule.timeout_error,
Antoine Pitrou525807b2010-05-12 14:05:24 +0000374 ERRSTR("The handshake operation timed out"));
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +0000375 goto error;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000376 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
377 PyErr_SetString(PySSLErrorObject,
Antoine Pitrou525807b2010-05-12 14:05:24 +0000378 ERRSTR("Underlying socket has been closed."));
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +0000379 goto error;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000380 } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
381 PyErr_SetString(PySSLErrorObject,
Antoine Pitrou525807b2010-05-12 14:05:24 +0000382 ERRSTR("Underlying socket too large for select()."));
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +0000383 goto error;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000384 } else if (sockstate == SOCKET_IS_NONBLOCKING) {
385 break;
386 }
387 } while (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE);
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +0000388 Py_DECREF(sock);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000389 if (ret < 1)
390 return PySSL_SetError(self, ret, __FILE__, __LINE__);
Bill Janssen6e027db2007-11-15 22:23:56 +0000391
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000392 if (self->peer_cert)
393 X509_free (self->peer_cert);
394 PySSL_BEGIN_ALLOW_THREADS
395 self->peer_cert = SSL_get_peer_certificate(self->ssl);
396 PySSL_END_ALLOW_THREADS
397
398 Py_INCREF(Py_None);
399 return Py_None;
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +0000400
401error:
402 Py_DECREF(sock);
403 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000404}
405
Thomas Woutersed03b412007-08-28 21:37:11 +0000406static PyObject *
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000407_create_tuple_for_attribute (ASN1_OBJECT *name, ASN1_STRING *value) {
Thomas Woutersed03b412007-08-28 21:37:11 +0000408
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000409 char namebuf[X509_NAME_MAXLEN];
410 int buflen;
411 PyObject *name_obj;
412 PyObject *value_obj;
413 PyObject *attr;
414 unsigned char *valuebuf = NULL;
Thomas Woutersed03b412007-08-28 21:37:11 +0000415
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000416 buflen = OBJ_obj2txt(namebuf, sizeof(namebuf), name, 0);
417 if (buflen < 0) {
418 _setSSLError(NULL, 0, __FILE__, __LINE__);
419 goto fail;
420 }
421 name_obj = PyUnicode_FromStringAndSize(namebuf, buflen);
422 if (name_obj == NULL)
423 goto fail;
Guido van Rossumf06628b2007-11-21 20:01:53 +0000424
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000425 buflen = ASN1_STRING_to_UTF8(&valuebuf, value);
426 if (buflen < 0) {
427 _setSSLError(NULL, 0, __FILE__, __LINE__);
428 Py_DECREF(name_obj);
429 goto fail;
430 }
431 value_obj = PyUnicode_DecodeUTF8((char *) valuebuf,
Antoine Pitrou525807b2010-05-12 14:05:24 +0000432 buflen, "strict");
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000433 OPENSSL_free(valuebuf);
434 if (value_obj == NULL) {
435 Py_DECREF(name_obj);
436 goto fail;
437 }
438 attr = PyTuple_New(2);
439 if (attr == NULL) {
440 Py_DECREF(name_obj);
441 Py_DECREF(value_obj);
442 goto fail;
443 }
444 PyTuple_SET_ITEM(attr, 0, name_obj);
445 PyTuple_SET_ITEM(attr, 1, value_obj);
446 return attr;
Thomas Woutersed03b412007-08-28 21:37:11 +0000447
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000448 fail:
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000449 return NULL;
Thomas Woutersed03b412007-08-28 21:37:11 +0000450}
451
452static PyObject *
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000453_create_tuple_for_X509_NAME (X509_NAME *xname)
Thomas Woutersed03b412007-08-28 21:37:11 +0000454{
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000455 PyObject *dn = NULL; /* tuple which represents the "distinguished name" */
456 PyObject *rdn = NULL; /* tuple to hold a "relative distinguished name" */
457 PyObject *rdnt;
458 PyObject *attr = NULL; /* tuple to hold an attribute */
459 int entry_count = X509_NAME_entry_count(xname);
460 X509_NAME_ENTRY *entry;
461 ASN1_OBJECT *name;
462 ASN1_STRING *value;
463 int index_counter;
464 int rdn_level = -1;
465 int retcode;
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000466
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000467 dn = PyList_New(0);
468 if (dn == NULL)
469 return NULL;
470 /* now create another tuple to hold the top-level RDN */
471 rdn = PyList_New(0);
472 if (rdn == NULL)
473 goto fail0;
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000474
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000475 for (index_counter = 0;
476 index_counter < entry_count;
477 index_counter++)
478 {
479 entry = X509_NAME_get_entry(xname, index_counter);
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000480
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000481 /* check to see if we've gotten to a new RDN */
482 if (rdn_level >= 0) {
483 if (rdn_level != entry->set) {
484 /* yes, new RDN */
485 /* add old RDN to DN */
486 rdnt = PyList_AsTuple(rdn);
487 Py_DECREF(rdn);
488 if (rdnt == NULL)
489 goto fail0;
490 retcode = PyList_Append(dn, rdnt);
491 Py_DECREF(rdnt);
492 if (retcode < 0)
493 goto fail0;
494 /* create new RDN */
495 rdn = PyList_New(0);
496 if (rdn == NULL)
497 goto fail0;
498 }
499 }
500 rdn_level = entry->set;
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000501
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000502 /* now add this attribute to the current RDN */
503 name = X509_NAME_ENTRY_get_object(entry);
504 value = X509_NAME_ENTRY_get_data(entry);
505 attr = _create_tuple_for_attribute(name, value);
506 /*
507 fprintf(stderr, "RDN level %d, attribute %s: %s\n",
508 entry->set,
509 PyBytes_AS_STRING(PyTuple_GET_ITEM(attr, 0)),
510 PyBytes_AS_STRING(PyTuple_GET_ITEM(attr, 1)));
511 */
512 if (attr == NULL)
513 goto fail1;
514 retcode = PyList_Append(rdn, attr);
515 Py_DECREF(attr);
516 if (retcode < 0)
517 goto fail1;
518 }
519 /* now, there's typically a dangling RDN */
520 if ((rdn != NULL) && (PyList_Size(rdn) > 0)) {
521 rdnt = PyList_AsTuple(rdn);
522 Py_DECREF(rdn);
523 if (rdnt == NULL)
524 goto fail0;
525 retcode = PyList_Append(dn, rdnt);
526 Py_DECREF(rdnt);
527 if (retcode < 0)
528 goto fail0;
529 }
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000530
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000531 /* convert list to tuple */
532 rdnt = PyList_AsTuple(dn);
533 Py_DECREF(dn);
534 if (rdnt == NULL)
535 return NULL;
536 return rdnt;
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000537
538 fail1:
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000539 Py_XDECREF(rdn);
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000540
541 fail0:
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000542 Py_XDECREF(dn);
543 return NULL;
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000544}
545
546static PyObject *
547_get_peer_alt_names (X509 *certificate) {
Guido van Rossumf06628b2007-11-21 20:01:53 +0000548
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000549 /* this code follows the procedure outlined in
550 OpenSSL's crypto/x509v3/v3_prn.c:X509v3_EXT_print()
551 function to extract the STACK_OF(GENERAL_NAME),
552 then iterates through the stack to add the
553 names. */
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000554
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000555 int i, j;
556 PyObject *peer_alt_names = Py_None;
557 PyObject *v, *t;
558 X509_EXTENSION *ext = NULL;
559 GENERAL_NAMES *names = NULL;
560 GENERAL_NAME *name;
Benjamin Petersoneb1410f2010-10-13 22:06:39 +0000561 const X509V3_EXT_METHOD *method;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000562 BIO *biobuf = NULL;
563 char buf[2048];
564 char *vptr;
565 int len;
566 /* Issue #2973: ASN1_item_d2i() API changed in OpenSSL 0.9.6m */
Victor Stinner7124a412010-03-02 22:48:17 +0000567#if OPENSSL_VERSION_NUMBER >= 0x009060dfL
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000568 const unsigned char *p;
Victor Stinner7124a412010-03-02 22:48:17 +0000569#else
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000570 unsigned char *p;
Victor Stinner7124a412010-03-02 22:48:17 +0000571#endif
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000572
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000573 if (certificate == NULL)
574 return peer_alt_names;
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000575
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000576 /* get a memory buffer */
577 biobuf = BIO_new(BIO_s_mem());
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000578
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000579 i = 0;
580 while ((i = X509_get_ext_by_NID(
581 certificate, NID_subject_alt_name, i)) >= 0) {
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000582
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000583 if (peer_alt_names == Py_None) {
584 peer_alt_names = PyList_New(0);
585 if (peer_alt_names == NULL)
586 goto fail;
587 }
Guido van Rossumf06628b2007-11-21 20:01:53 +0000588
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000589 /* now decode the altName */
590 ext = X509_get_ext(certificate, i);
591 if(!(method = X509V3_EXT_get(ext))) {
592 PyErr_SetString
593 (PySSLErrorObject,
594 ERRSTR("No method for internalizing subjectAltName!"));
595 goto fail;
596 }
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000597
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000598 p = ext->value->data;
599 if (method->it)
600 names = (GENERAL_NAMES*)
601 (ASN1_item_d2i(NULL,
602 &p,
603 ext->value->length,
604 ASN1_ITEM_ptr(method->it)));
605 else
606 names = (GENERAL_NAMES*)
607 (method->d2i(NULL,
608 &p,
609 ext->value->length));
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000610
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000611 for(j = 0; j < sk_GENERAL_NAME_num(names); j++) {
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000612
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000613 /* get a rendering of each name in the set of names */
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000614
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000615 name = sk_GENERAL_NAME_value(names, j);
616 if (name->type == GEN_DIRNAME) {
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000617
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000618 /* we special-case DirName as a tuple of
619 tuples of attributes */
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000620
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000621 t = PyTuple_New(2);
622 if (t == NULL) {
623 goto fail;
624 }
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000625
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000626 v = PyUnicode_FromString("DirName");
627 if (v == NULL) {
628 Py_DECREF(t);
629 goto fail;
630 }
631 PyTuple_SET_ITEM(t, 0, v);
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000632
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000633 v = _create_tuple_for_X509_NAME (name->d.dirn);
634 if (v == NULL) {
635 Py_DECREF(t);
636 goto fail;
637 }
638 PyTuple_SET_ITEM(t, 1, v);
Guido van Rossumf06628b2007-11-21 20:01:53 +0000639
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000640 } else {
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000641
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000642 /* for everything else, we use the OpenSSL print form */
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000643
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000644 (void) BIO_reset(biobuf);
645 GENERAL_NAME_print(biobuf, name);
646 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
647 if (len < 0) {
648 _setSSLError(NULL, 0, __FILE__, __LINE__);
649 goto fail;
650 }
651 vptr = strchr(buf, ':');
652 if (vptr == NULL)
653 goto fail;
654 t = PyTuple_New(2);
655 if (t == NULL)
656 goto fail;
657 v = PyUnicode_FromStringAndSize(buf, (vptr - buf));
658 if (v == NULL) {
659 Py_DECREF(t);
660 goto fail;
661 }
662 PyTuple_SET_ITEM(t, 0, v);
663 v = PyUnicode_FromStringAndSize((vptr + 1),
664 (len - (vptr - buf + 1)));
665 if (v == NULL) {
666 Py_DECREF(t);
667 goto fail;
668 }
669 PyTuple_SET_ITEM(t, 1, v);
670 }
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000671
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000672 /* and add that rendering to the list */
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000673
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000674 if (PyList_Append(peer_alt_names, t) < 0) {
675 Py_DECREF(t);
676 goto fail;
677 }
678 Py_DECREF(t);
679 }
680 }
681 BIO_free(biobuf);
682 if (peer_alt_names != Py_None) {
683 v = PyList_AsTuple(peer_alt_names);
684 Py_DECREF(peer_alt_names);
685 return v;
686 } else {
687 return peer_alt_names;
688 }
Guido van Rossumf06628b2007-11-21 20:01:53 +0000689
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000690
691 fail:
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000692 if (biobuf != NULL)
693 BIO_free(biobuf);
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000694
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000695 if (peer_alt_names != Py_None) {
696 Py_XDECREF(peer_alt_names);
697 }
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000698
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000699 return NULL;
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000700}
701
702static PyObject *
Antoine Pitroufb046912010-11-09 20:21:19 +0000703_decode_certificate(X509 *certificate) {
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000704
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000705 PyObject *retval = NULL;
706 BIO *biobuf = NULL;
707 PyObject *peer;
708 PyObject *peer_alt_names = NULL;
709 PyObject *issuer;
710 PyObject *version;
711 PyObject *sn_obj;
712 ASN1_INTEGER *serialNumber;
713 char buf[2048];
714 int len;
715 ASN1_TIME *notBefore, *notAfter;
716 PyObject *pnotBefore, *pnotAfter;
Thomas Woutersed03b412007-08-28 21:37:11 +0000717
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000718 retval = PyDict_New();
719 if (retval == NULL)
720 return NULL;
Thomas Woutersed03b412007-08-28 21:37:11 +0000721
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000722 peer = _create_tuple_for_X509_NAME(
723 X509_get_subject_name(certificate));
724 if (peer == NULL)
725 goto fail0;
726 if (PyDict_SetItemString(retval, (const char *) "subject", peer) < 0) {
727 Py_DECREF(peer);
728 goto fail0;
729 }
730 Py_DECREF(peer);
Thomas Woutersed03b412007-08-28 21:37:11 +0000731
Antoine Pitroufb046912010-11-09 20:21:19 +0000732 issuer = _create_tuple_for_X509_NAME(
733 X509_get_issuer_name(certificate));
734 if (issuer == NULL)
735 goto fail0;
736 if (PyDict_SetItemString(retval, (const char *)"issuer", issuer) < 0) {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000737 Py_DECREF(issuer);
Antoine Pitroufb046912010-11-09 20:21:19 +0000738 goto fail0;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000739 }
Antoine Pitroufb046912010-11-09 20:21:19 +0000740 Py_DECREF(issuer);
741
742 version = PyLong_FromLong(X509_get_version(certificate) + 1);
743 if (PyDict_SetItemString(retval, "version", version) < 0) {
744 Py_DECREF(version);
745 goto fail0;
746 }
747 Py_DECREF(version);
Guido van Rossumf06628b2007-11-21 20:01:53 +0000748
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000749 /* get a memory buffer */
750 biobuf = BIO_new(BIO_s_mem());
Guido van Rossumf06628b2007-11-21 20:01:53 +0000751
Antoine Pitroufb046912010-11-09 20:21:19 +0000752 (void) BIO_reset(biobuf);
753 serialNumber = X509_get_serialNumber(certificate);
754 /* should not exceed 20 octets, 160 bits, so buf is big enough */
755 i2a_ASN1_INTEGER(biobuf, serialNumber);
756 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
757 if (len < 0) {
758 _setSSLError(NULL, 0, __FILE__, __LINE__);
759 goto fail1;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000760 }
Antoine Pitroufb046912010-11-09 20:21:19 +0000761 sn_obj = PyUnicode_FromStringAndSize(buf, len);
762 if (sn_obj == NULL)
763 goto fail1;
764 if (PyDict_SetItemString(retval, "serialNumber", sn_obj) < 0) {
765 Py_DECREF(sn_obj);
766 goto fail1;
767 }
768 Py_DECREF(sn_obj);
769
770 (void) BIO_reset(biobuf);
771 notBefore = X509_get_notBefore(certificate);
772 ASN1_TIME_print(biobuf, notBefore);
773 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
774 if (len < 0) {
775 _setSSLError(NULL, 0, __FILE__, __LINE__);
776 goto fail1;
777 }
778 pnotBefore = PyUnicode_FromStringAndSize(buf, len);
779 if (pnotBefore == NULL)
780 goto fail1;
781 if (PyDict_SetItemString(retval, "notBefore", pnotBefore) < 0) {
782 Py_DECREF(pnotBefore);
783 goto fail1;
784 }
785 Py_DECREF(pnotBefore);
Thomas Woutersed03b412007-08-28 21:37:11 +0000786
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000787 (void) BIO_reset(biobuf);
788 notAfter = X509_get_notAfter(certificate);
789 ASN1_TIME_print(biobuf, notAfter);
790 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
791 if (len < 0) {
792 _setSSLError(NULL, 0, __FILE__, __LINE__);
793 goto fail1;
794 }
795 pnotAfter = PyUnicode_FromStringAndSize(buf, len);
796 if (pnotAfter == NULL)
797 goto fail1;
798 if (PyDict_SetItemString(retval, "notAfter", pnotAfter) < 0) {
799 Py_DECREF(pnotAfter);
800 goto fail1;
801 }
802 Py_DECREF(pnotAfter);
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000803
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000804 /* Now look for subjectAltName */
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000805
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000806 peer_alt_names = _get_peer_alt_names(certificate);
807 if (peer_alt_names == NULL)
808 goto fail1;
809 else if (peer_alt_names != Py_None) {
810 if (PyDict_SetItemString(retval, "subjectAltName",
811 peer_alt_names) < 0) {
812 Py_DECREF(peer_alt_names);
813 goto fail1;
814 }
815 Py_DECREF(peer_alt_names);
816 }
Guido van Rossumf06628b2007-11-21 20:01:53 +0000817
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000818 BIO_free(biobuf);
819 return retval;
Thomas Woutersed03b412007-08-28 21:37:11 +0000820
821 fail1:
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000822 if (biobuf != NULL)
823 BIO_free(biobuf);
Thomas Woutersed03b412007-08-28 21:37:11 +0000824 fail0:
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000825 Py_XDECREF(retval);
826 return NULL;
Thomas Woutersed03b412007-08-28 21:37:11 +0000827}
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000828
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000829
830static PyObject *
831PySSL_test_decode_certificate (PyObject *mod, PyObject *args) {
832
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000833 PyObject *retval = NULL;
Victor Stinner3800e1e2010-05-16 21:23:48 +0000834 PyObject *filename;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000835 X509 *x=NULL;
836 BIO *cert;
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000837
Antoine Pitroufb046912010-11-09 20:21:19 +0000838 if (!PyArg_ParseTuple(args, "O&:test_decode_certificate",
839 PyUnicode_FSConverter, &filename))
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000840 return NULL;
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000841
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000842 if ((cert=BIO_new(BIO_s_file())) == NULL) {
843 PyErr_SetString(PySSLErrorObject,
844 "Can't malloc memory to read file");
845 goto fail0;
846 }
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000847
Victor Stinner3800e1e2010-05-16 21:23:48 +0000848 if (BIO_read_filename(cert, PyBytes_AsString(filename)) <= 0) {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000849 PyErr_SetString(PySSLErrorObject,
850 "Can't open file");
851 goto fail0;
852 }
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000853
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000854 x = PEM_read_bio_X509_AUX(cert,NULL, NULL, NULL);
855 if (x == NULL) {
856 PyErr_SetString(PySSLErrorObject,
857 "Error decoding PEM-encoded file");
858 goto fail0;
859 }
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000860
Antoine Pitroufb046912010-11-09 20:21:19 +0000861 retval = _decode_certificate(x);
Mark Dickinsonee55df52010-08-03 18:31:54 +0000862 X509_free(x);
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000863
864 fail0:
Victor Stinner3800e1e2010-05-16 21:23:48 +0000865 Py_DECREF(filename);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000866 if (cert != NULL) BIO_free(cert);
867 return retval;
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000868}
869
870
871static PyObject *
Antoine Pitrou152efa22010-05-16 18:19:27 +0000872PySSL_peercert(PySSLSocket *self, PyObject *args)
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000873{
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000874 PyObject *retval = NULL;
875 int len;
876 int verification;
877 PyObject *binary_mode = Py_None;
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000878
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000879 if (!PyArg_ParseTuple(args, "|O:peer_certificate", &binary_mode))
880 return NULL;
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000881
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000882 if (!self->peer_cert)
883 Py_RETURN_NONE;
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000884
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000885 if (PyObject_IsTrue(binary_mode)) {
886 /* return cert in DER-encoded format */
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000887
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000888 unsigned char *bytes_buf = NULL;
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000889
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000890 bytes_buf = NULL;
891 len = i2d_X509(self->peer_cert, &bytes_buf);
892 if (len < 0) {
893 PySSL_SetError(self, len, __FILE__, __LINE__);
894 return NULL;
895 }
896 /* this is actually an immutable bytes sequence */
897 retval = PyBytes_FromStringAndSize
898 ((const char *) bytes_buf, len);
899 OPENSSL_free(bytes_buf);
900 return retval;
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000901
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000902 } else {
Antoine Pitrou152efa22010-05-16 18:19:27 +0000903 verification = SSL_CTX_get_verify_mode(SSL_get_SSL_CTX(self->ssl));
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000904 if ((verification & SSL_VERIFY_PEER) == 0)
905 return PyDict_New();
906 else
Antoine Pitroufb046912010-11-09 20:21:19 +0000907 return _decode_certificate(self->peer_cert);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000908 }
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000909}
910
911PyDoc_STRVAR(PySSL_peercert_doc,
912"peer_certificate([der=False]) -> certificate\n\
913\n\
914Returns the certificate for the peer. If no certificate was provided,\n\
915returns None. If a certificate was provided, but not validated, returns\n\
916an empty dictionary. Otherwise returns a dict containing information\n\
917about the peer certificate.\n\
918\n\
919If the optional argument is True, returns a DER-encoded copy of the\n\
920peer certificate, or None if no certificate was provided. This will\n\
921return the certificate even if it wasn't validated.");
922
Antoine Pitrou152efa22010-05-16 18:19:27 +0000923static PyObject *PySSL_cipher (PySSLSocket *self) {
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000924
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000925 PyObject *retval, *v;
Benjamin Petersoneb1410f2010-10-13 22:06:39 +0000926 const SSL_CIPHER *current;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000927 char *cipher_name;
928 char *cipher_protocol;
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000929
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000930 if (self->ssl == NULL)
931 return Py_None;
932 current = SSL_get_current_cipher(self->ssl);
933 if (current == NULL)
934 return Py_None;
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000935
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000936 retval = PyTuple_New(3);
937 if (retval == NULL)
938 return NULL;
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000939
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000940 cipher_name = (char *) SSL_CIPHER_get_name(current);
941 if (cipher_name == NULL) {
942 PyTuple_SET_ITEM(retval, 0, Py_None);
943 } else {
944 v = PyUnicode_FromString(cipher_name);
945 if (v == NULL)
946 goto fail0;
947 PyTuple_SET_ITEM(retval, 0, v);
948 }
949 cipher_protocol = SSL_CIPHER_get_version(current);
950 if (cipher_protocol == NULL) {
951 PyTuple_SET_ITEM(retval, 1, Py_None);
952 } else {
953 v = PyUnicode_FromString(cipher_protocol);
954 if (v == NULL)
955 goto fail0;
956 PyTuple_SET_ITEM(retval, 1, v);
957 }
958 v = PyLong_FromLong(SSL_CIPHER_get_bits(current, NULL));
959 if (v == NULL)
960 goto fail0;
961 PyTuple_SET_ITEM(retval, 2, v);
962 return retval;
Guido van Rossumf06628b2007-11-21 20:01:53 +0000963
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000964 fail0:
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000965 Py_DECREF(retval);
966 return NULL;
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000967}
968
Antoine Pitrou152efa22010-05-16 18:19:27 +0000969static void PySSL_dealloc(PySSLSocket *self)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000970{
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000971 if (self->peer_cert) /* Possible not to have one? */
972 X509_free (self->peer_cert);
973 if (self->ssl)
974 SSL_free(self->ssl);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000975 Py_XDECREF(self->Socket);
976 PyObject_Del(self);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000977}
978
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000979/* If the socket has a timeout, do a select()/poll() on the socket.
Guido van Rossum99d4abf2003-01-27 22:22:50 +0000980 The argument writing indicates the direction.
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +0000981 Returns one of the possibilities in the timeout_state enum (above).
Guido van Rossum99d4abf2003-01-27 22:22:50 +0000982 */
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +0000983
Guido van Rossum99d4abf2003-01-27 22:22:50 +0000984static int
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +0000985check_socket_and_wait_for_timeout(PySocketSockObject *s, int writing)
Guido van Rossum99d4abf2003-01-27 22:22:50 +0000986{
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000987 fd_set fds;
988 struct timeval tv;
989 int rc;
Guido van Rossum99d4abf2003-01-27 22:22:50 +0000990
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000991 /* Nothing to do unless we're in timeout mode (not non-blocking) */
992 if (s->sock_timeout < 0.0)
993 return SOCKET_IS_BLOCKING;
994 else if (s->sock_timeout == 0.0)
995 return SOCKET_IS_NONBLOCKING;
Guido van Rossum99d4abf2003-01-27 22:22:50 +0000996
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000997 /* Guard against closed socket */
998 if (s->sock_fd < 0)
999 return SOCKET_HAS_BEEN_CLOSED;
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001000
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001001 /* Prefer poll, if available, since you can poll() any fd
1002 * which can't be done with select(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001003#ifdef HAVE_POLL
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001004 {
1005 struct pollfd pollfd;
1006 int timeout;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001007
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001008 pollfd.fd = s->sock_fd;
1009 pollfd.events = writing ? POLLOUT : POLLIN;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001010
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001011 /* s->sock_timeout is in seconds, timeout in ms */
1012 timeout = (int)(s->sock_timeout * 1000 + 0.5);
1013 PySSL_BEGIN_ALLOW_THREADS
1014 rc = poll(&pollfd, 1, timeout);
1015 PySSL_END_ALLOW_THREADS
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001016
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001017 goto normal_return;
1018 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001019#endif
1020
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001021 /* Guard against socket too large for select*/
Martin v. Löwisf84d1b92006-02-11 09:27:05 +00001022#ifndef Py_SOCKET_FD_CAN_BE_GE_FD_SETSIZE
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001023 if (s->sock_fd >= FD_SETSIZE)
1024 return SOCKET_TOO_LARGE_FOR_SELECT;
Martin v. Löwisf84d1b92006-02-11 09:27:05 +00001025#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +00001026
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001027 /* Construct the arguments to select */
1028 tv.tv_sec = (int)s->sock_timeout;
1029 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
1030 FD_ZERO(&fds);
1031 FD_SET(s->sock_fd, &fds);
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001032
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001033 /* See if the socket is ready */
1034 PySSL_BEGIN_ALLOW_THREADS
1035 if (writing)
1036 rc = select(s->sock_fd+1, NULL, &fds, NULL, &tv);
1037 else
1038 rc = select(s->sock_fd+1, &fds, NULL, NULL, &tv);
1039 PySSL_END_ALLOW_THREADS
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001040
Bill Janssen6e027db2007-11-15 22:23:56 +00001041#ifdef HAVE_POLL
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001042normal_return:
Bill Janssen6e027db2007-11-15 22:23:56 +00001043#endif
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001044 /* Return SOCKET_TIMED_OUT on timeout, SOCKET_OPERATION_OK otherwise
1045 (when we are able to write or when there's something to read) */
1046 return rc == 0 ? SOCKET_HAS_TIMED_OUT : SOCKET_OPERATION_OK;
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001047}
1048
Antoine Pitrou152efa22010-05-16 18:19:27 +00001049static PyObject *PySSL_SSLwrite(PySSLSocket *self, PyObject *args)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001050{
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001051 Py_buffer buf;
1052 int len;
1053 int sockstate;
1054 int err;
1055 int nonblocking;
1056 PySocketSockObject *sock
1057 = (PySocketSockObject *) PyWeakref_GetObject(self->Socket);
Bill Janssen54cc54c2007-12-14 22:08:56 +00001058
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001059 if (((PyObject*)sock) == Py_None) {
1060 _setSSLError("Underlying socket connection gone",
1061 PY_SSL_ERROR_NO_SOCKET, __FILE__, __LINE__);
1062 return NULL;
1063 }
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +00001064 Py_INCREF(sock);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001065
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +00001066 if (!PyArg_ParseTuple(args, "y*:write", &buf)) {
1067 Py_DECREF(sock);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001068 return NULL;
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +00001069 }
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001070
1071 /* just in case the blocking state of the socket has been changed */
1072 nonblocking = (sock->sock_timeout >= 0.0);
1073 BIO_set_nbio(SSL_get_rbio(self->ssl), nonblocking);
1074 BIO_set_nbio(SSL_get_wbio(self->ssl), nonblocking);
1075
1076 sockstate = check_socket_and_wait_for_timeout(sock, 1);
1077 if (sockstate == SOCKET_HAS_TIMED_OUT) {
Antoine Pitrouc4df7842010-12-03 19:59:41 +00001078 PyErr_SetString(PySocketModule.timeout_error,
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001079 "The write operation timed out");
1080 goto error;
1081 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
1082 PyErr_SetString(PySSLErrorObject,
1083 "Underlying socket has been closed.");
1084 goto error;
1085 } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
1086 PyErr_SetString(PySSLErrorObject,
1087 "Underlying socket too large for select().");
1088 goto error;
1089 }
1090 do {
1091 err = 0;
1092 PySSL_BEGIN_ALLOW_THREADS
1093 len = SSL_write(self->ssl, buf.buf, buf.len);
1094 err = SSL_get_error(self->ssl, len);
1095 PySSL_END_ALLOW_THREADS
1096 if (PyErr_CheckSignals()) {
1097 goto error;
Bill Janssen54cc54c2007-12-14 22:08:56 +00001098 }
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001099 if (err == SSL_ERROR_WANT_READ) {
Antoine Pitrou525807b2010-05-12 14:05:24 +00001100 sockstate = check_socket_and_wait_for_timeout(sock, 0);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001101 } else if (err == SSL_ERROR_WANT_WRITE) {
Antoine Pitrou525807b2010-05-12 14:05:24 +00001102 sockstate = check_socket_and_wait_for_timeout(sock, 1);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001103 } else {
1104 sockstate = SOCKET_OPERATION_OK;
1105 }
1106 if (sockstate == SOCKET_HAS_TIMED_OUT) {
Antoine Pitrouc4df7842010-12-03 19:59:41 +00001107 PyErr_SetString(PySocketModule.timeout_error,
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001108 "The write operation timed out");
1109 goto error;
1110 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
1111 PyErr_SetString(PySSLErrorObject,
1112 "Underlying socket has been closed.");
1113 goto error;
1114 } else if (sockstate == SOCKET_IS_NONBLOCKING) {
1115 break;
1116 }
1117 } while (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001118
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +00001119 Py_DECREF(sock);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001120 PyBuffer_Release(&buf);
1121 if (len > 0)
1122 return PyLong_FromLong(len);
1123 else
1124 return PySSL_SetError(self, len, __FILE__, __LINE__);
Antoine Pitrou7d7aede2009-11-25 18:55:32 +00001125
1126error:
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +00001127 Py_DECREF(sock);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001128 PyBuffer_Release(&buf);
1129 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001130}
1131
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001132PyDoc_STRVAR(PySSL_SSLwrite_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001133"write(s) -> len\n\
1134\n\
1135Writes the string s into the SSL object. Returns the number\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001136of bytes written.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001137
Antoine Pitrou152efa22010-05-16 18:19:27 +00001138static PyObject *PySSL_SSLpending(PySSLSocket *self)
Bill Janssen6e027db2007-11-15 22:23:56 +00001139{
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001140 int count = 0;
Bill Janssen6e027db2007-11-15 22:23:56 +00001141
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001142 PySSL_BEGIN_ALLOW_THREADS
1143 count = SSL_pending(self->ssl);
1144 PySSL_END_ALLOW_THREADS
1145 if (count < 0)
1146 return PySSL_SetError(self, count, __FILE__, __LINE__);
1147 else
1148 return PyLong_FromLong(count);
Bill Janssen6e027db2007-11-15 22:23:56 +00001149}
1150
1151PyDoc_STRVAR(PySSL_SSLpending_doc,
1152"pending() -> count\n\
1153\n\
1154Returns the number of already decrypted bytes available for read,\n\
1155pending on the connection.\n");
1156
Antoine Pitrou152efa22010-05-16 18:19:27 +00001157static PyObject *PySSL_SSLread(PySSLSocket *self, PyObject *args)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001158{
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001159 PyObject *dest = NULL;
1160 Py_buffer buf;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001161 char *mem;
Antoine Pitrou24e561a2010-09-03 18:38:17 +00001162 int len, count;
1163 int buf_passed = 0;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001164 int sockstate;
1165 int err;
1166 int nonblocking;
1167 PySocketSockObject *sock
1168 = (PySocketSockObject *) PyWeakref_GetObject(self->Socket);
Bill Janssen54cc54c2007-12-14 22:08:56 +00001169
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001170 if (((PyObject*)sock) == Py_None) {
1171 _setSSLError("Underlying socket connection gone",
1172 PY_SSL_ERROR_NO_SOCKET, __FILE__, __LINE__);
1173 return NULL;
1174 }
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +00001175 Py_INCREF(sock);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001176
Antoine Pitrou24e561a2010-09-03 18:38:17 +00001177 buf.obj = NULL;
1178 buf.buf = NULL;
1179 if (!PyArg_ParseTuple(args, "i|w*:read", &len, &buf))
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +00001180 goto error;
1181
Antoine Pitrou24e561a2010-09-03 18:38:17 +00001182 if ((buf.buf == NULL) && (buf.obj == NULL)) {
1183 dest = PyBytes_FromStringAndSize(NULL, len);
1184 if (dest == NULL)
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +00001185 goto error;
Antoine Pitrou24e561a2010-09-03 18:38:17 +00001186 mem = PyBytes_AS_STRING(dest);
1187 }
1188 else {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001189 buf_passed = 1;
Antoine Pitrou24e561a2010-09-03 18:38:17 +00001190 mem = buf.buf;
1191 if (len <= 0 || len > buf.len) {
1192 len = (int) buf.len;
1193 if (buf.len != len) {
1194 PyErr_SetString(PyExc_OverflowError,
1195 "maximum length can't fit in a C 'int'");
1196 goto error;
1197 }
1198 }
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001199 }
1200
1201 /* just in case the blocking state of the socket has been changed */
1202 nonblocking = (sock->sock_timeout >= 0.0);
1203 BIO_set_nbio(SSL_get_rbio(self->ssl), nonblocking);
1204 BIO_set_nbio(SSL_get_wbio(self->ssl), nonblocking);
1205
1206 /* first check if there are bytes ready to be read */
1207 PySSL_BEGIN_ALLOW_THREADS
1208 count = SSL_pending(self->ssl);
1209 PySSL_END_ALLOW_THREADS
1210
1211 if (!count) {
1212 sockstate = check_socket_and_wait_for_timeout(sock, 0);
1213 if (sockstate == SOCKET_HAS_TIMED_OUT) {
Antoine Pitrouc4df7842010-12-03 19:59:41 +00001214 PyErr_SetString(PySocketModule.timeout_error,
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001215 "The read operation timed out");
1216 goto error;
1217 } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
1218 PyErr_SetString(PySSLErrorObject,
Antoine Pitrou525807b2010-05-12 14:05:24 +00001219 "Underlying socket too large for select().");
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001220 goto error;
1221 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
1222 count = 0;
1223 goto done;
Bill Janssen54cc54c2007-12-14 22:08:56 +00001224 }
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001225 }
1226 do {
1227 err = 0;
1228 PySSL_BEGIN_ALLOW_THREADS
1229 count = SSL_read(self->ssl, mem, len);
1230 err = SSL_get_error(self->ssl, count);
1231 PySSL_END_ALLOW_THREADS
1232 if (PyErr_CheckSignals())
1233 goto error;
1234 if (err == SSL_ERROR_WANT_READ) {
Antoine Pitrou525807b2010-05-12 14:05:24 +00001235 sockstate = check_socket_and_wait_for_timeout(sock, 0);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001236 } else if (err == SSL_ERROR_WANT_WRITE) {
Antoine Pitrou525807b2010-05-12 14:05:24 +00001237 sockstate = check_socket_and_wait_for_timeout(sock, 1);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001238 } else if ((err == SSL_ERROR_ZERO_RETURN) &&
1239 (SSL_get_shutdown(self->ssl) ==
1240 SSL_RECEIVED_SHUTDOWN))
1241 {
1242 count = 0;
1243 goto done;
1244 } else {
1245 sockstate = SOCKET_OPERATION_OK;
1246 }
1247 if (sockstate == SOCKET_HAS_TIMED_OUT) {
Antoine Pitrouc4df7842010-12-03 19:59:41 +00001248 PyErr_SetString(PySocketModule.timeout_error,
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001249 "The read operation timed out");
1250 goto error;
1251 } else if (sockstate == SOCKET_IS_NONBLOCKING) {
1252 break;
1253 }
1254 } while (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE);
1255 if (count <= 0) {
1256 PySSL_SetError(self, count, __FILE__, __LINE__);
1257 goto error;
1258 }
Antoine Pitrou24e561a2010-09-03 18:38:17 +00001259
1260done:
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +00001261 Py_DECREF(sock);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001262 if (!buf_passed) {
Antoine Pitrou24e561a2010-09-03 18:38:17 +00001263 _PyBytes_Resize(&dest, count);
1264 return dest;
1265 }
1266 else {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001267 PyBuffer_Release(&buf);
1268 return PyLong_FromLong(count);
1269 }
Antoine Pitrou24e561a2010-09-03 18:38:17 +00001270
1271error:
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +00001272 Py_DECREF(sock);
Antoine Pitrou24e561a2010-09-03 18:38:17 +00001273 if (!buf_passed)
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +00001274 Py_XDECREF(dest);
Antoine Pitrou24e561a2010-09-03 18:38:17 +00001275 else
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001276 PyBuffer_Release(&buf);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001277 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001278}
1279
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001280PyDoc_STRVAR(PySSL_SSLread_doc,
Bill Janssen6e027db2007-11-15 22:23:56 +00001281"read([len]) -> string\n\
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001282\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001283Read up to len bytes from the SSL socket.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001284
Antoine Pitrou152efa22010-05-16 18:19:27 +00001285static PyObject *PySSL_SSLshutdown(PySSLSocket *self)
Bill Janssen40a0f662008-08-12 16:56:25 +00001286{
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001287 int err, ssl_err, sockstate, nonblocking;
1288 int zeros = 0;
1289 PySocketSockObject *sock
1290 = (PySocketSockObject *) PyWeakref_GetObject(self->Socket);
Bill Janssen40a0f662008-08-12 16:56:25 +00001291
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001292 /* Guard against closed socket */
1293 if ((((PyObject*)sock) == Py_None) || (sock->sock_fd < 0)) {
1294 _setSSLError("Underlying socket connection gone",
1295 PY_SSL_ERROR_NO_SOCKET, __FILE__, __LINE__);
1296 return NULL;
1297 }
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +00001298 Py_INCREF(sock);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001299
1300 /* Just in case the blocking state of the socket has been changed */
1301 nonblocking = (sock->sock_timeout >= 0.0);
1302 BIO_set_nbio(SSL_get_rbio(self->ssl), nonblocking);
1303 BIO_set_nbio(SSL_get_wbio(self->ssl), nonblocking);
1304
1305 while (1) {
1306 PySSL_BEGIN_ALLOW_THREADS
1307 /* Disable read-ahead so that unwrap can work correctly.
1308 * Otherwise OpenSSL might read in too much data,
1309 * eating clear text data that happens to be
1310 * transmitted after the SSL shutdown.
1311 * Should be safe to call repeatedly everytime this
1312 * function is used and the shutdown_seen_zero != 0
1313 * condition is met.
1314 */
1315 if (self->shutdown_seen_zero)
1316 SSL_set_read_ahead(self->ssl, 0);
1317 err = SSL_shutdown(self->ssl);
1318 PySSL_END_ALLOW_THREADS
1319 /* If err == 1, a secure shutdown with SSL_shutdown() is complete */
1320 if (err > 0)
1321 break;
1322 if (err == 0) {
1323 /* Don't loop endlessly; instead preserve legacy
1324 behaviour of trying SSL_shutdown() only twice.
1325 This looks necessary for OpenSSL < 0.9.8m */
1326 if (++zeros > 1)
1327 break;
1328 /* Shutdown was sent, now try receiving */
1329 self->shutdown_seen_zero = 1;
1330 continue;
Bill Janssen40a0f662008-08-12 16:56:25 +00001331 }
1332
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001333 /* Possibly retry shutdown until timeout or failure */
1334 ssl_err = SSL_get_error(self->ssl, err);
1335 if (ssl_err == SSL_ERROR_WANT_READ)
1336 sockstate = check_socket_and_wait_for_timeout(sock, 0);
1337 else if (ssl_err == SSL_ERROR_WANT_WRITE)
1338 sockstate = check_socket_and_wait_for_timeout(sock, 1);
1339 else
1340 break;
1341 if (sockstate == SOCKET_HAS_TIMED_OUT) {
1342 if (ssl_err == SSL_ERROR_WANT_READ)
Antoine Pitrouc4df7842010-12-03 19:59:41 +00001343 PyErr_SetString(PySocketModule.timeout_error,
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001344 "The read operation timed out");
1345 else
Antoine Pitrouc4df7842010-12-03 19:59:41 +00001346 PyErr_SetString(PySocketModule.timeout_error,
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001347 "The write operation timed out");
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +00001348 goto error;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001349 }
1350 else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
1351 PyErr_SetString(PySSLErrorObject,
1352 "Underlying socket too large for select().");
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +00001353 goto error;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001354 }
1355 else if (sockstate != SOCKET_OPERATION_OK)
1356 /* Retain the SSL error code */
1357 break;
1358 }
Antoine Pitrou2c4f98b2010-04-23 00:16:21 +00001359
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +00001360 if (err < 0) {
1361 Py_DECREF(sock);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001362 return PySSL_SetError(self, err, __FILE__, __LINE__);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001363 }
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +00001364 else
1365 /* It's already INCREF'ed */
1366 return (PyObject *) sock;
1367
1368error:
1369 Py_DECREF(sock);
1370 return NULL;
Bill Janssen40a0f662008-08-12 16:56:25 +00001371}
1372
1373PyDoc_STRVAR(PySSL_SSLshutdown_doc,
1374"shutdown(s) -> socket\n\
1375\n\
1376Does the SSL shutdown handshake with the remote end, and returns\n\
1377the underlying socket object.");
1378
1379
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001380static PyMethodDef PySSLMethods[] = {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001381 {"do_handshake", (PyCFunction)PySSL_SSLdo_handshake, METH_NOARGS},
1382 {"write", (PyCFunction)PySSL_SSLwrite, METH_VARARGS,
1383 PySSL_SSLwrite_doc},
1384 {"read", (PyCFunction)PySSL_SSLread, METH_VARARGS,
1385 PySSL_SSLread_doc},
1386 {"pending", (PyCFunction)PySSL_SSLpending, METH_NOARGS,
1387 PySSL_SSLpending_doc},
1388 {"peer_certificate", (PyCFunction)PySSL_peercert, METH_VARARGS,
1389 PySSL_peercert_doc},
1390 {"cipher", (PyCFunction)PySSL_cipher, METH_NOARGS},
1391 {"shutdown", (PyCFunction)PySSL_SSLshutdown, METH_NOARGS,
1392 PySSL_SSLshutdown_doc},
1393 {NULL, NULL}
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001394};
1395
Antoine Pitrou152efa22010-05-16 18:19:27 +00001396static PyTypeObject PySSLSocket_Type = {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001397 PyVarObject_HEAD_INIT(NULL, 0)
Antoine Pitrou152efa22010-05-16 18:19:27 +00001398 "_ssl._SSLSocket", /*tp_name*/
1399 sizeof(PySSLSocket), /*tp_basicsize*/
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001400 0, /*tp_itemsize*/
1401 /* methods */
1402 (destructor)PySSL_dealloc, /*tp_dealloc*/
1403 0, /*tp_print*/
1404 0, /*tp_getattr*/
1405 0, /*tp_setattr*/
1406 0, /*tp_reserved*/
1407 0, /*tp_repr*/
1408 0, /*tp_as_number*/
1409 0, /*tp_as_sequence*/
1410 0, /*tp_as_mapping*/
1411 0, /*tp_hash*/
1412 0, /*tp_call*/
1413 0, /*tp_str*/
1414 0, /*tp_getattro*/
1415 0, /*tp_setattro*/
1416 0, /*tp_as_buffer*/
1417 Py_TPFLAGS_DEFAULT, /*tp_flags*/
1418 0, /*tp_doc*/
1419 0, /*tp_traverse*/
1420 0, /*tp_clear*/
1421 0, /*tp_richcompare*/
1422 0, /*tp_weaklistoffset*/
1423 0, /*tp_iter*/
1424 0, /*tp_iternext*/
1425 PySSLMethods, /*tp_methods*/
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001426};
1427
Antoine Pitrou152efa22010-05-16 18:19:27 +00001428
1429/*
1430 * _SSLContext objects
1431 */
1432
1433static PyObject *
1434context_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1435{
1436 char *kwlist[] = {"protocol", NULL};
1437 PySSLContext *self;
1438 int proto_version = PY_SSL_VERSION_SSL23;
1439 SSL_CTX *ctx = NULL;
1440
1441 if (!PyArg_ParseTupleAndKeywords(
1442 args, kwds, "i:_SSLContext", kwlist,
1443 &proto_version))
1444 return NULL;
1445
1446 PySSL_BEGIN_ALLOW_THREADS
1447 if (proto_version == PY_SSL_VERSION_TLS1)
1448 ctx = SSL_CTX_new(TLSv1_method());
1449 else if (proto_version == PY_SSL_VERSION_SSL3)
1450 ctx = SSL_CTX_new(SSLv3_method());
1451 else if (proto_version == PY_SSL_VERSION_SSL2)
1452 ctx = SSL_CTX_new(SSLv2_method());
1453 else if (proto_version == PY_SSL_VERSION_SSL23)
1454 ctx = SSL_CTX_new(SSLv23_method());
1455 else
1456 proto_version = -1;
1457 PySSL_END_ALLOW_THREADS
1458
1459 if (proto_version == -1) {
1460 PyErr_SetString(PyExc_ValueError,
1461 "invalid protocol version");
1462 return NULL;
1463 }
1464 if (ctx == NULL) {
1465 PyErr_SetString(PySSLErrorObject,
1466 "failed to allocate SSL context");
1467 return NULL;
1468 }
1469
1470 assert(type != NULL && type->tp_alloc != NULL);
1471 self = (PySSLContext *) type->tp_alloc(type, 0);
1472 if (self == NULL) {
1473 SSL_CTX_free(ctx);
1474 return NULL;
1475 }
1476 self->ctx = ctx;
1477 /* Defaults */
1478 SSL_CTX_set_verify(self->ctx, SSL_VERIFY_NONE, NULL);
1479 SSL_CTX_set_options(self->ctx, SSL_OP_ALL);
1480
Antoine Pitroufc113ee2010-10-13 12:46:13 +00001481#define SID_CTX "Python"
1482 SSL_CTX_set_session_id_context(self->ctx, (const unsigned char *) SID_CTX,
1483 sizeof(SID_CTX));
1484#undef SID_CTX
1485
Antoine Pitrou152efa22010-05-16 18:19:27 +00001486 return (PyObject *)self;
1487}
1488
1489static void
1490context_dealloc(PySSLContext *self)
1491{
1492 SSL_CTX_free(self->ctx);
1493 Py_TYPE(self)->tp_free(self);
1494}
1495
1496static PyObject *
1497set_ciphers(PySSLContext *self, PyObject *args)
1498{
1499 int ret;
1500 const char *cipherlist;
1501
1502 if (!PyArg_ParseTuple(args, "s:set_ciphers", &cipherlist))
1503 return NULL;
1504 ret = SSL_CTX_set_cipher_list(self->ctx, cipherlist);
1505 if (ret == 0) {
Antoine Pitrou65ec8ae2010-05-16 19:56:32 +00001506 /* Clearing the error queue is necessary on some OpenSSL versions,
1507 otherwise the error will be reported again when another SSL call
1508 is done. */
1509 ERR_clear_error();
Antoine Pitrou152efa22010-05-16 18:19:27 +00001510 PyErr_SetString(PySSLErrorObject,
1511 "No cipher can be selected.");
1512 return NULL;
1513 }
1514 Py_RETURN_NONE;
1515}
1516
1517static PyObject *
1518get_verify_mode(PySSLContext *self, void *c)
1519{
1520 switch (SSL_CTX_get_verify_mode(self->ctx)) {
1521 case SSL_VERIFY_NONE:
1522 return PyLong_FromLong(PY_SSL_CERT_NONE);
1523 case SSL_VERIFY_PEER:
1524 return PyLong_FromLong(PY_SSL_CERT_OPTIONAL);
1525 case SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT:
1526 return PyLong_FromLong(PY_SSL_CERT_REQUIRED);
1527 }
1528 PyErr_SetString(PySSLErrorObject,
1529 "invalid return value from SSL_CTX_get_verify_mode");
1530 return NULL;
1531}
1532
1533static int
1534set_verify_mode(PySSLContext *self, PyObject *arg, void *c)
1535{
1536 int n, mode;
1537 if (!PyArg_Parse(arg, "i", &n))
1538 return -1;
1539 if (n == PY_SSL_CERT_NONE)
1540 mode = SSL_VERIFY_NONE;
1541 else if (n == PY_SSL_CERT_OPTIONAL)
1542 mode = SSL_VERIFY_PEER;
1543 else if (n == PY_SSL_CERT_REQUIRED)
1544 mode = SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT;
1545 else {
1546 PyErr_SetString(PyExc_ValueError,
1547 "invalid value for verify_mode");
1548 return -1;
1549 }
1550 SSL_CTX_set_verify(self->ctx, mode, NULL);
1551 return 0;
1552}
1553
1554static PyObject *
Antoine Pitroub5218772010-05-21 09:56:06 +00001555get_options(PySSLContext *self, void *c)
1556{
1557 return PyLong_FromLong(SSL_CTX_get_options(self->ctx));
1558}
1559
1560static int
1561set_options(PySSLContext *self, PyObject *arg, void *c)
1562{
1563 long new_opts, opts, set, clear;
1564 if (!PyArg_Parse(arg, "l", &new_opts))
1565 return -1;
1566 opts = SSL_CTX_get_options(self->ctx);
1567 clear = opts & ~new_opts;
1568 set = ~opts & new_opts;
1569 if (clear) {
1570#ifdef HAVE_SSL_CTX_CLEAR_OPTIONS
1571 SSL_CTX_clear_options(self->ctx, clear);
1572#else
1573 PyErr_SetString(PyExc_ValueError,
1574 "can't clear options before OpenSSL 0.9.8m");
1575 return -1;
1576#endif
1577 }
1578 if (set)
1579 SSL_CTX_set_options(self->ctx, set);
1580 return 0;
1581}
1582
1583static PyObject *
Antoine Pitrou152efa22010-05-16 18:19:27 +00001584load_cert_chain(PySSLContext *self, PyObject *args, PyObject *kwds)
1585{
1586 char *kwlist[] = {"certfile", "keyfile", NULL};
1587 PyObject *certfile, *keyfile = NULL;
1588 PyObject *certfile_bytes = NULL, *keyfile_bytes = NULL;
1589 int r;
1590
Giampaolo Rodolà745ab382010-08-29 19:25:49 +00001591 errno = 0;
Antoine Pitrou67e8e562010-09-01 20:55:41 +00001592 ERR_clear_error();
Antoine Pitrou152efa22010-05-16 18:19:27 +00001593 if (!PyArg_ParseTupleAndKeywords(args, kwds,
1594 "O|O:load_cert_chain", kwlist,
1595 &certfile, &keyfile))
1596 return NULL;
1597 if (keyfile == Py_None)
1598 keyfile = NULL;
1599 if (!PyUnicode_FSConverter(certfile, &certfile_bytes)) {
1600 PyErr_SetString(PyExc_TypeError,
1601 "certfile should be a valid filesystem path");
1602 return NULL;
1603 }
1604 if (keyfile && !PyUnicode_FSConverter(keyfile, &keyfile_bytes)) {
1605 PyErr_SetString(PyExc_TypeError,
1606 "keyfile should be a valid filesystem path");
1607 goto error;
1608 }
1609 PySSL_BEGIN_ALLOW_THREADS
1610 r = SSL_CTX_use_certificate_chain_file(self->ctx,
1611 PyBytes_AS_STRING(certfile_bytes));
1612 PySSL_END_ALLOW_THREADS
1613 if (r != 1) {
Giampaolo Rodolà745ab382010-08-29 19:25:49 +00001614 if (errno != 0) {
Giampaolo Rodolàe0f98632010-09-01 19:28:49 +00001615 ERR_clear_error();
Giampaolo Rodolà745ab382010-08-29 19:25:49 +00001616 PyErr_SetFromErrno(PyExc_IOError);
1617 }
1618 else {
1619 _setSSLError(NULL, 0, __FILE__, __LINE__);
1620 }
Antoine Pitrou152efa22010-05-16 18:19:27 +00001621 goto error;
1622 }
1623 PySSL_BEGIN_ALLOW_THREADS
1624 r = SSL_CTX_use_RSAPrivateKey_file(self->ctx,
1625 PyBytes_AS_STRING(keyfile ? keyfile_bytes : certfile_bytes),
1626 SSL_FILETYPE_PEM);
1627 PySSL_END_ALLOW_THREADS
1628 Py_XDECREF(keyfile_bytes);
1629 Py_XDECREF(certfile_bytes);
1630 if (r != 1) {
Giampaolo Rodolà745ab382010-08-29 19:25:49 +00001631 if (errno != 0) {
Giampaolo Rodolàe0f98632010-09-01 19:28:49 +00001632 ERR_clear_error();
Giampaolo Rodolà745ab382010-08-29 19:25:49 +00001633 PyErr_SetFromErrno(PyExc_IOError);
1634 }
1635 else {
1636 _setSSLError(NULL, 0, __FILE__, __LINE__);
1637 }
Antoine Pitrou152efa22010-05-16 18:19:27 +00001638 return NULL;
1639 }
1640 PySSL_BEGIN_ALLOW_THREADS
1641 r = SSL_CTX_check_private_key(self->ctx);
1642 PySSL_END_ALLOW_THREADS
1643 if (r != 1) {
1644 _setSSLError(NULL, 0, __FILE__, __LINE__);
1645 return NULL;
1646 }
1647 Py_RETURN_NONE;
1648
1649error:
1650 Py_XDECREF(keyfile_bytes);
1651 Py_XDECREF(certfile_bytes);
1652 return NULL;
1653}
1654
1655static PyObject *
1656load_verify_locations(PySSLContext *self, PyObject *args, PyObject *kwds)
1657{
1658 char *kwlist[] = {"cafile", "capath", NULL};
1659 PyObject *cafile = NULL, *capath = NULL;
1660 PyObject *cafile_bytes = NULL, *capath_bytes = NULL;
1661 const char *cafile_buf = NULL, *capath_buf = NULL;
1662 int r;
1663
Giampaolo Rodolà745ab382010-08-29 19:25:49 +00001664 errno = 0;
Antoine Pitrou152efa22010-05-16 18:19:27 +00001665 if (!PyArg_ParseTupleAndKeywords(args, kwds,
1666 "|OO:load_verify_locations", kwlist,
1667 &cafile, &capath))
1668 return NULL;
1669 if (cafile == Py_None)
1670 cafile = NULL;
1671 if (capath == Py_None)
1672 capath = NULL;
1673 if (cafile == NULL && capath == NULL) {
1674 PyErr_SetString(PyExc_TypeError,
1675 "cafile and capath cannot be both omitted");
1676 return NULL;
1677 }
1678 if (cafile && !PyUnicode_FSConverter(cafile, &cafile_bytes)) {
1679 PyErr_SetString(PyExc_TypeError,
1680 "cafile should be a valid filesystem path");
1681 return NULL;
1682 }
1683 if (capath && !PyUnicode_FSConverter(capath, &capath_bytes)) {
1684 Py_DECREF(cafile_bytes);
1685 PyErr_SetString(PyExc_TypeError,
1686 "capath should be a valid filesystem path");
1687 return NULL;
1688 }
1689 if (cafile)
1690 cafile_buf = PyBytes_AS_STRING(cafile_bytes);
1691 if (capath)
1692 capath_buf = PyBytes_AS_STRING(capath_bytes);
1693 PySSL_BEGIN_ALLOW_THREADS
1694 r = SSL_CTX_load_verify_locations(self->ctx, cafile_buf, capath_buf);
1695 PySSL_END_ALLOW_THREADS
1696 Py_XDECREF(cafile_bytes);
1697 Py_XDECREF(capath_bytes);
1698 if (r != 1) {
Giampaolo Rodolà745ab382010-08-29 19:25:49 +00001699 if (errno != 0) {
Giampaolo Rodolàe0f98632010-09-01 19:28:49 +00001700 ERR_clear_error();
Giampaolo Rodolà745ab382010-08-29 19:25:49 +00001701 PyErr_SetFromErrno(PyExc_IOError);
1702 }
1703 else {
1704 _setSSLError(NULL, 0, __FILE__, __LINE__);
1705 }
Antoine Pitrou152efa22010-05-16 18:19:27 +00001706 return NULL;
1707 }
1708 Py_RETURN_NONE;
1709}
1710
1711static PyObject *
1712context_wrap_socket(PySSLContext *self, PyObject *args, PyObject *kwds)
1713{
Antoine Pitroud5323212010-10-22 18:19:07 +00001714 char *kwlist[] = {"sock", "server_side", "server_hostname", NULL};
Antoine Pitrou152efa22010-05-16 18:19:27 +00001715 PySocketSockObject *sock;
1716 int server_side = 0;
Antoine Pitroud5323212010-10-22 18:19:07 +00001717 char *hostname = NULL;
1718 PyObject *hostname_obj, *res;
Antoine Pitrou152efa22010-05-16 18:19:27 +00001719
Antoine Pitroud5323212010-10-22 18:19:07 +00001720 /* server_hostname is either None (or absent), or to be encoded
1721 using the idna encoding. */
1722 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O!i|O!:_wrap_socket", kwlist,
Antoine Pitrou152efa22010-05-16 18:19:27 +00001723 PySocketModule.Sock_Type,
Antoine Pitroud5323212010-10-22 18:19:07 +00001724 &sock, &server_side,
1725 Py_TYPE(Py_None), &hostname_obj)) {
1726 PyErr_Clear();
1727 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O!iet:_wrap_socket", kwlist,
1728 PySocketModule.Sock_Type,
1729 &sock, &server_side,
1730 "idna", &hostname))
1731 return NULL;
1732#ifndef SSL_CTRL_SET_TLSEXT_HOSTNAME
1733 PyMem_Free(hostname);
1734 PyErr_SetString(PyExc_ValueError, "server_hostname is not supported "
1735 "by your OpenSSL library");
Antoine Pitrou152efa22010-05-16 18:19:27 +00001736 return NULL;
Antoine Pitroud5323212010-10-22 18:19:07 +00001737#endif
1738 }
Antoine Pitrou152efa22010-05-16 18:19:27 +00001739
Antoine Pitroud5323212010-10-22 18:19:07 +00001740 res = (PyObject *) newPySSLSocket(self->ctx, sock, server_side,
1741 hostname);
1742 if (hostname != NULL)
1743 PyMem_Free(hostname);
1744 return res;
Antoine Pitrou152efa22010-05-16 18:19:27 +00001745}
1746
Antoine Pitroub0182c82010-10-12 20:09:02 +00001747static PyObject *
1748session_stats(PySSLContext *self, PyObject *unused)
1749{
1750 int r;
1751 PyObject *value, *stats = PyDict_New();
1752 if (!stats)
1753 return NULL;
1754
1755#define ADD_STATS(SSL_NAME, KEY_NAME) \
1756 value = PyLong_FromLong(SSL_CTX_sess_ ## SSL_NAME (self->ctx)); \
1757 if (value == NULL) \
1758 goto error; \
1759 r = PyDict_SetItemString(stats, KEY_NAME, value); \
1760 Py_DECREF(value); \
1761 if (r < 0) \
1762 goto error;
1763
1764 ADD_STATS(number, "number");
1765 ADD_STATS(connect, "connect");
1766 ADD_STATS(connect_good, "connect_good");
1767 ADD_STATS(connect_renegotiate, "connect_renegotiate");
1768 ADD_STATS(accept, "accept");
1769 ADD_STATS(accept_good, "accept_good");
1770 ADD_STATS(accept_renegotiate, "accept_renegotiate");
1771 ADD_STATS(accept, "accept");
1772 ADD_STATS(hits, "hits");
1773 ADD_STATS(misses, "misses");
1774 ADD_STATS(timeouts, "timeouts");
1775 ADD_STATS(cache_full, "cache_full");
1776
1777#undef ADD_STATS
1778
1779 return stats;
1780
1781error:
1782 Py_DECREF(stats);
1783 return NULL;
1784}
1785
Antoine Pitrou664c2d12010-11-17 20:29:42 +00001786static PyObject *
1787set_default_verify_paths(PySSLContext *self, PyObject *unused)
1788{
1789 if (!SSL_CTX_set_default_verify_paths(self->ctx)) {
1790 _setSSLError(NULL, 0, __FILE__, __LINE__);
1791 return NULL;
1792 }
1793 Py_RETURN_NONE;
1794}
1795
Antoine Pitrou152efa22010-05-16 18:19:27 +00001796static PyGetSetDef context_getsetlist[] = {
Antoine Pitroub5218772010-05-21 09:56:06 +00001797 {"options", (getter) get_options,
1798 (setter) set_options, NULL},
Antoine Pitrou152efa22010-05-16 18:19:27 +00001799 {"verify_mode", (getter) get_verify_mode,
1800 (setter) set_verify_mode, NULL},
1801 {NULL}, /* sentinel */
1802};
1803
1804static struct PyMethodDef context_methods[] = {
1805 {"_wrap_socket", (PyCFunction) context_wrap_socket,
1806 METH_VARARGS | METH_KEYWORDS, NULL},
1807 {"set_ciphers", (PyCFunction) set_ciphers,
1808 METH_VARARGS, NULL},
1809 {"load_cert_chain", (PyCFunction) load_cert_chain,
1810 METH_VARARGS | METH_KEYWORDS, NULL},
1811 {"load_verify_locations", (PyCFunction) load_verify_locations,
1812 METH_VARARGS | METH_KEYWORDS, NULL},
Antoine Pitroub0182c82010-10-12 20:09:02 +00001813 {"session_stats", (PyCFunction) session_stats,
1814 METH_NOARGS, NULL},
Antoine Pitrou664c2d12010-11-17 20:29:42 +00001815 {"set_default_verify_paths", (PyCFunction) set_default_verify_paths,
1816 METH_NOARGS, NULL},
Antoine Pitrou152efa22010-05-16 18:19:27 +00001817 {NULL, NULL} /* sentinel */
1818};
1819
1820static PyTypeObject PySSLContext_Type = {
1821 PyVarObject_HEAD_INIT(NULL, 0)
1822 "_ssl._SSLContext", /*tp_name*/
1823 sizeof(PySSLContext), /*tp_basicsize*/
1824 0, /*tp_itemsize*/
1825 (destructor)context_dealloc, /*tp_dealloc*/
1826 0, /*tp_print*/
1827 0, /*tp_getattr*/
1828 0, /*tp_setattr*/
1829 0, /*tp_reserved*/
1830 0, /*tp_repr*/
1831 0, /*tp_as_number*/
1832 0, /*tp_as_sequence*/
1833 0, /*tp_as_mapping*/
1834 0, /*tp_hash*/
1835 0, /*tp_call*/
1836 0, /*tp_str*/
1837 0, /*tp_getattro*/
1838 0, /*tp_setattro*/
1839 0, /*tp_as_buffer*/
1840 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
1841 0, /*tp_doc*/
1842 0, /*tp_traverse*/
1843 0, /*tp_clear*/
1844 0, /*tp_richcompare*/
1845 0, /*tp_weaklistoffset*/
1846 0, /*tp_iter*/
1847 0, /*tp_iternext*/
1848 context_methods, /*tp_methods*/
1849 0, /*tp_members*/
1850 context_getsetlist, /*tp_getset*/
1851 0, /*tp_base*/
1852 0, /*tp_dict*/
1853 0, /*tp_descr_get*/
1854 0, /*tp_descr_set*/
1855 0, /*tp_dictoffset*/
1856 0, /*tp_init*/
1857 0, /*tp_alloc*/
1858 context_new, /*tp_new*/
1859};
1860
1861
1862
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001863#ifdef HAVE_OPENSSL_RAND
1864
1865/* helper routines for seeding the SSL PRNG */
1866static PyObject *
1867PySSL_RAND_add(PyObject *self, PyObject *args)
1868{
1869 char *buf;
1870 int len;
1871 double entropy;
1872
1873 if (!PyArg_ParseTuple(args, "s#d:RAND_add", &buf, &len, &entropy))
Antoine Pitrou525807b2010-05-12 14:05:24 +00001874 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001875 RAND_add(buf, len, entropy);
1876 Py_INCREF(Py_None);
1877 return Py_None;
1878}
1879
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001880PyDoc_STRVAR(PySSL_RAND_add_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001881"RAND_add(string, entropy)\n\
1882\n\
1883Mix string into the OpenSSL PRNG state. entropy (a float) is a lower\n\
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001884bound on the entropy contained in string. See RFC 1750.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001885
1886static PyObject *
1887PySSL_RAND_status(PyObject *self)
1888{
Christian Heimes217cfd12007-12-02 14:31:20 +00001889 return PyLong_FromLong(RAND_status());
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001890}
1891
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001892PyDoc_STRVAR(PySSL_RAND_status_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001893"RAND_status() -> 0 or 1\n\
1894\n\
Bill Janssen6e027db2007-11-15 22:23:56 +00001895Returns 1 if the OpenSSL PRNG has been seeded with enough data and 0 if not.\n\
1896It is necessary to seed the PRNG with RAND_add() on some platforms before\n\
1897using the ssl() function.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001898
1899static PyObject *
Victor Stinnerf9faaad2010-05-16 21:36:37 +00001900PySSL_RAND_egd(PyObject *self, PyObject *args)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001901{
Victor Stinnerf9faaad2010-05-16 21:36:37 +00001902 PyObject *path;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001903 int bytes;
1904
Victor Stinnerf9faaad2010-05-16 21:36:37 +00001905 if (!PyArg_ParseTuple(args, "O&|i:RAND_egd",
1906 PyUnicode_FSConverter, &path))
1907 return NULL;
1908
1909 bytes = RAND_egd(PyBytes_AsString(path));
1910 Py_DECREF(path);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001911 if (bytes == -1) {
Antoine Pitrou525807b2010-05-12 14:05:24 +00001912 PyErr_SetString(PySSLErrorObject,
1913 "EGD connection failed or EGD did not return "
1914 "enough data to seed the PRNG");
1915 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001916 }
Christian Heimes217cfd12007-12-02 14:31:20 +00001917 return PyLong_FromLong(bytes);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001918}
1919
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001920PyDoc_STRVAR(PySSL_RAND_egd_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001921"RAND_egd(path) -> bytes\n\
1922\n\
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001923Queries the entropy gather daemon (EGD) on the socket named by 'path'.\n\
1924Returns number of bytes read. Raises SSLError if connection to EGD\n\
1925fails or if it does provide enough data to seed PRNG.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001926
1927#endif
1928
Bill Janssen40a0f662008-08-12 16:56:25 +00001929
1930
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001931/* List of functions exported by this module. */
1932
1933static PyMethodDef PySSL_methods[] = {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001934 {"_test_decode_cert", PySSL_test_decode_certificate,
1935 METH_VARARGS},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001936#ifdef HAVE_OPENSSL_RAND
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001937 {"RAND_add", PySSL_RAND_add, METH_VARARGS,
1938 PySSL_RAND_add_doc},
Victor Stinnerf9faaad2010-05-16 21:36:37 +00001939 {"RAND_egd", PySSL_RAND_egd, METH_VARARGS,
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001940 PySSL_RAND_egd_doc},
1941 {"RAND_status", (PyCFunction)PySSL_RAND_status, METH_NOARGS,
1942 PySSL_RAND_status_doc},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001943#endif
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001944 {NULL, NULL} /* Sentinel */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001945};
1946
1947
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001948#ifdef WITH_THREAD
1949
1950/* an implementation of OpenSSL threading operations in terms
1951 of the Python C thread library */
1952
1953static PyThread_type_lock *_ssl_locks = NULL;
1954
1955static unsigned long _ssl_thread_id_function (void) {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001956 return PyThread_get_thread_ident();
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001957}
1958
Bill Janssen6e027db2007-11-15 22:23:56 +00001959static void _ssl_thread_locking_function
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001960 (int mode, int n, const char *file, int line) {
1961 /* this function is needed to perform locking on shared data
1962 structures. (Note that OpenSSL uses a number of global data
1963 structures that will be implicitly shared whenever multiple
1964 threads use OpenSSL.) Multi-threaded applications will
1965 crash at random if it is not set.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001966
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001967 locking_function() must be able to handle up to
1968 CRYPTO_num_locks() different mutex locks. It sets the n-th
1969 lock if mode & CRYPTO_LOCK, and releases it otherwise.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001970
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001971 file and line are the file number of the function setting the
1972 lock. They can be useful for debugging.
1973 */
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001974
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001975 if ((_ssl_locks == NULL) ||
1976 (n < 0) || ((unsigned)n >= _ssl_locks_count))
1977 return;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001978
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001979 if (mode & CRYPTO_LOCK) {
1980 PyThread_acquire_lock(_ssl_locks[n], 1);
1981 } else {
1982 PyThread_release_lock(_ssl_locks[n]);
1983 }
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001984}
1985
1986static int _setup_ssl_threads(void) {
1987
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001988 unsigned int i;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001989
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001990 if (_ssl_locks == NULL) {
1991 _ssl_locks_count = CRYPTO_num_locks();
1992 _ssl_locks = (PyThread_type_lock *)
1993 malloc(sizeof(PyThread_type_lock) * _ssl_locks_count);
1994 if (_ssl_locks == NULL)
1995 return 0;
1996 memset(_ssl_locks, 0,
1997 sizeof(PyThread_type_lock) * _ssl_locks_count);
1998 for (i = 0; i < _ssl_locks_count; i++) {
1999 _ssl_locks[i] = PyThread_allocate_lock();
2000 if (_ssl_locks[i] == NULL) {
2001 unsigned int j;
2002 for (j = 0; j < i; j++) {
2003 PyThread_free_lock(_ssl_locks[j]);
2004 }
2005 free(_ssl_locks);
2006 return 0;
2007 }
2008 }
2009 CRYPTO_set_locking_callback(_ssl_thread_locking_function);
2010 CRYPTO_set_id_callback(_ssl_thread_id_function);
2011 }
2012 return 1;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002013}
2014
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002015#endif /* def HAVE_THREAD */
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002016
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002017PyDoc_STRVAR(module_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002018"Implementation module for SSL socket operations. See the socket module\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002019for documentation.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002020
Martin v. Löwis1a214512008-06-11 05:26:20 +00002021
2022static struct PyModuleDef _sslmodule = {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002023 PyModuleDef_HEAD_INIT,
2024 "_ssl",
2025 module_doc,
2026 -1,
2027 PySSL_methods,
2028 NULL,
2029 NULL,
2030 NULL,
2031 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00002032};
2033
Mark Hammondfe51c6d2002-08-02 02:27:13 +00002034PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00002035PyInit__ssl(void)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002036{
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002037 PyObject *m, *d, *r;
2038 unsigned long libver;
2039 unsigned int major, minor, fix, patch, status;
2040 PySocketModule_APIObject *socket_api;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002041
Antoine Pitrou152efa22010-05-16 18:19:27 +00002042 if (PyType_Ready(&PySSLContext_Type) < 0)
2043 return NULL;
2044 if (PyType_Ready(&PySSLSocket_Type) < 0)
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002045 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002046
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002047 m = PyModule_Create(&_sslmodule);
2048 if (m == NULL)
2049 return NULL;
2050 d = PyModule_GetDict(m);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002051
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002052 /* Load _socket module and its C API */
2053 socket_api = PySocketModule_ImportModuleAndAPI();
2054 if (!socket_api)
2055 return NULL;
2056 PySocketModule = *socket_api;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002057
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002058 /* Init OpenSSL */
2059 SSL_load_error_strings();
2060 SSL_library_init();
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002061#ifdef WITH_THREAD
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002062 /* note that this will start threading if not already started */
2063 if (!_setup_ssl_threads()) {
2064 return NULL;
2065 }
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002066#endif
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002067 OpenSSL_add_all_algorithms();
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002068
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002069 /* Add symbols to module dict */
2070 PySSLErrorObject = PyErr_NewException("ssl.SSLError",
2071 PySocketModule.error,
2072 NULL);
2073 if (PySSLErrorObject == NULL)
2074 return NULL;
2075 if (PyDict_SetItemString(d, "SSLError", PySSLErrorObject) != 0)
2076 return NULL;
Antoine Pitrou152efa22010-05-16 18:19:27 +00002077 if (PyDict_SetItemString(d, "_SSLContext",
2078 (PyObject *)&PySSLContext_Type) != 0)
2079 return NULL;
2080 if (PyDict_SetItemString(d, "_SSLSocket",
2081 (PyObject *)&PySSLSocket_Type) != 0)
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002082 return NULL;
2083 PyModule_AddIntConstant(m, "SSL_ERROR_ZERO_RETURN",
2084 PY_SSL_ERROR_ZERO_RETURN);
2085 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_READ",
2086 PY_SSL_ERROR_WANT_READ);
2087 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_WRITE",
2088 PY_SSL_ERROR_WANT_WRITE);
2089 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_X509_LOOKUP",
2090 PY_SSL_ERROR_WANT_X509_LOOKUP);
2091 PyModule_AddIntConstant(m, "SSL_ERROR_SYSCALL",
2092 PY_SSL_ERROR_SYSCALL);
2093 PyModule_AddIntConstant(m, "SSL_ERROR_SSL",
2094 PY_SSL_ERROR_SSL);
2095 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_CONNECT",
2096 PY_SSL_ERROR_WANT_CONNECT);
2097 /* non ssl.h errorcodes */
2098 PyModule_AddIntConstant(m, "SSL_ERROR_EOF",
2099 PY_SSL_ERROR_EOF);
2100 PyModule_AddIntConstant(m, "SSL_ERROR_INVALID_ERROR_CODE",
2101 PY_SSL_ERROR_INVALID_ERROR_CODE);
2102 /* cert requirements */
2103 PyModule_AddIntConstant(m, "CERT_NONE",
2104 PY_SSL_CERT_NONE);
2105 PyModule_AddIntConstant(m, "CERT_OPTIONAL",
2106 PY_SSL_CERT_OPTIONAL);
2107 PyModule_AddIntConstant(m, "CERT_REQUIRED",
2108 PY_SSL_CERT_REQUIRED);
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00002109
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002110 /* protocol versions */
2111 PyModule_AddIntConstant(m, "PROTOCOL_SSLv2",
2112 PY_SSL_VERSION_SSL2);
2113 PyModule_AddIntConstant(m, "PROTOCOL_SSLv3",
2114 PY_SSL_VERSION_SSL3);
2115 PyModule_AddIntConstant(m, "PROTOCOL_SSLv23",
2116 PY_SSL_VERSION_SSL23);
2117 PyModule_AddIntConstant(m, "PROTOCOL_TLSv1",
2118 PY_SSL_VERSION_TLS1);
Antoine Pitrou04f6a322010-04-05 21:40:07 +00002119
Antoine Pitroub5218772010-05-21 09:56:06 +00002120 /* protocol options */
2121 PyModule_AddIntConstant(m, "OP_ALL", SSL_OP_ALL);
2122 PyModule_AddIntConstant(m, "OP_NO_SSLv2", SSL_OP_NO_SSLv2);
2123 PyModule_AddIntConstant(m, "OP_NO_SSLv3", SSL_OP_NO_SSLv3);
2124 PyModule_AddIntConstant(m, "OP_NO_TLSv1", SSL_OP_NO_TLSv1);
2125
Antoine Pitroud5323212010-10-22 18:19:07 +00002126#ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME
2127 r = Py_True;
2128#else
2129 r = Py_False;
2130#endif
2131 Py_INCREF(r);
2132 PyModule_AddObject(m, "HAS_SNI", r);
2133
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002134 /* OpenSSL version */
2135 /* SSLeay() gives us the version of the library linked against,
2136 which could be different from the headers version.
2137 */
2138 libver = SSLeay();
2139 r = PyLong_FromUnsignedLong(libver);
2140 if (r == NULL)
2141 return NULL;
2142 if (PyModule_AddObject(m, "OPENSSL_VERSION_NUMBER", r))
2143 return NULL;
2144 status = libver & 0xF;
2145 libver >>= 4;
2146 patch = libver & 0xFF;
2147 libver >>= 8;
2148 fix = libver & 0xFF;
2149 libver >>= 8;
2150 minor = libver & 0xFF;
2151 libver >>= 8;
2152 major = libver & 0xFF;
2153 r = Py_BuildValue("IIIII", major, minor, fix, patch, status);
2154 if (r == NULL || PyModule_AddObject(m, "OPENSSL_VERSION_INFO", r))
2155 return NULL;
2156 r = PyUnicode_FromString(SSLeay_version(SSLEAY_VERSION));
2157 if (r == NULL || PyModule_AddObject(m, "OPENSSL_VERSION", r))
2158 return NULL;
Antoine Pitrou04f6a322010-04-05 21:40:07 +00002159
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002160 return m;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002161}