blob: 5772d901de75219ada6a5649a39c636bb029bd73 [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"
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +020021#define PySSL_BEGIN_ALLOW_THREADS_S(save) \
22 do { if (_ssl_locks_count>0) { (save) = PyEval_SaveThread(); } } while (0)
23#define PySSL_END_ALLOW_THREADS_S(save) \
24 do { if (_ssl_locks_count>0) { PyEval_RestoreThread(save); } } while (0)
Thomas Wouters1b7f8912007-09-19 03:06:30 +000025#define PySSL_BEGIN_ALLOW_THREADS { \
Antoine Pitroucbb82eb2010-05-05 15:57:33 +000026 PyThreadState *_save = NULL; \
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +020027 PySSL_BEGIN_ALLOW_THREADS_S(_save);
28#define PySSL_BLOCK_THREADS PySSL_END_ALLOW_THREADS_S(_save);
29#define PySSL_UNBLOCK_THREADS PySSL_BEGIN_ALLOW_THREADS_S(_save);
30#define PySSL_END_ALLOW_THREADS PySSL_END_ALLOW_THREADS_S(_save); }
Thomas Wouters1b7f8912007-09-19 03:06:30 +000031
Antoine Pitroucbb82eb2010-05-05 15:57:33 +000032#else /* no WITH_THREAD */
Thomas Wouters1b7f8912007-09-19 03:06:30 +000033
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +020034#define PySSL_BEGIN_ALLOW_THREADS_S(save)
35#define PySSL_END_ALLOW_THREADS_S(save)
Thomas Wouters1b7f8912007-09-19 03:06:30 +000036#define PySSL_BEGIN_ALLOW_THREADS
37#define PySSL_BLOCK_THREADS
38#define PySSL_UNBLOCK_THREADS
39#define PySSL_END_ALLOW_THREADS
40
41#endif
42
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +000043enum py_ssl_error {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +000044 /* these mirror ssl.h */
45 PY_SSL_ERROR_NONE,
46 PY_SSL_ERROR_SSL,
47 PY_SSL_ERROR_WANT_READ,
48 PY_SSL_ERROR_WANT_WRITE,
49 PY_SSL_ERROR_WANT_X509_LOOKUP,
50 PY_SSL_ERROR_SYSCALL, /* look at error stack/return value/errno */
51 PY_SSL_ERROR_ZERO_RETURN,
52 PY_SSL_ERROR_WANT_CONNECT,
53 /* start of non ssl.h errorcodes */
54 PY_SSL_ERROR_EOF, /* special case of SSL_ERROR_SYSCALL */
55 PY_SSL_ERROR_NO_SOCKET, /* socket has been GC'd */
56 PY_SSL_ERROR_INVALID_ERROR_CODE
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +000057};
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000058
Thomas Woutersed03b412007-08-28 21:37:11 +000059enum py_ssl_server_or_client {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +000060 PY_SSL_CLIENT,
61 PY_SSL_SERVER
Thomas Woutersed03b412007-08-28 21:37:11 +000062};
63
64enum py_ssl_cert_requirements {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +000065 PY_SSL_CERT_NONE,
66 PY_SSL_CERT_OPTIONAL,
67 PY_SSL_CERT_REQUIRED
Thomas Woutersed03b412007-08-28 21:37:11 +000068};
69
70enum py_ssl_version {
Victor Stinner3de49192011-05-09 00:42:58 +020071#ifndef OPENSSL_NO_SSL2
Antoine Pitroucbb82eb2010-05-05 15:57:33 +000072 PY_SSL_VERSION_SSL2,
Victor Stinner3de49192011-05-09 00:42:58 +020073#endif
74 PY_SSL_VERSION_SSL3=1,
Antoine Pitroucbb82eb2010-05-05 15:57:33 +000075 PY_SSL_VERSION_SSL23,
76 PY_SSL_VERSION_TLS1
Thomas Woutersed03b412007-08-28 21:37:11 +000077};
78
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000079/* Include symbols from _socket module */
80#include "socketmodule.h"
81
Benjamin Petersonb173f782009-05-05 22:31:58 +000082static PySocketModule_APIObject PySocketModule;
83
Thomas Woutersed03b412007-08-28 21:37:11 +000084#if defined(HAVE_POLL_H)
Thomas Wouters0e3f5912006-08-11 14:57:12 +000085#include <poll.h>
86#elif defined(HAVE_SYS_POLL_H)
87#include <sys/poll.h>
88#endif
89
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000090/* Include OpenSSL header files */
91#include "openssl/rsa.h"
92#include "openssl/crypto.h"
93#include "openssl/x509.h"
Thomas Wouters1b7f8912007-09-19 03:06:30 +000094#include "openssl/x509v3.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000095#include "openssl/pem.h"
96#include "openssl/ssl.h"
97#include "openssl/err.h"
98#include "openssl/rand.h"
99
100/* SSL error object */
101static PyObject *PySSLErrorObject;
Antoine Pitrou41032a62011-10-27 23:56:55 +0200102static PyObject *PySSLZeroReturnErrorObject;
103static PyObject *PySSLWantReadErrorObject;
104static PyObject *PySSLWantWriteErrorObject;
105static PyObject *PySSLSyscallErrorObject;
106static PyObject *PySSLEOFErrorObject;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000107
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000108#ifdef WITH_THREAD
109
110/* serves as a flag to see whether we've initialized the SSL thread support. */
111/* 0 means no, greater than 0 means yes */
112
113static unsigned int _ssl_locks_count = 0;
114
115#endif /* def WITH_THREAD */
116
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000117/* SSL socket object */
118
119#define X509_NAME_MAXLEN 256
120
121/* RAND_* APIs got added to OpenSSL in 0.9.5 */
122#if OPENSSL_VERSION_NUMBER >= 0x0090500fL
123# define HAVE_OPENSSL_RAND 1
124#else
125# undef HAVE_OPENSSL_RAND
126#endif
127
Gregory P. Smithbd4dacb2010-10-13 03:53:21 +0000128/* SSL_CTX_clear_options() and SSL_clear_options() were first added in
129 * OpenSSL 0.9.8m but do not appear in some 0.9.9-dev versions such the
130 * 0.9.9 from "May 2008" that NetBSD 5.0 uses. */
131#if OPENSSL_VERSION_NUMBER >= 0x009080dfL && OPENSSL_VERSION_NUMBER != 0x00909000L
Antoine Pitroub5218772010-05-21 09:56:06 +0000132# define HAVE_SSL_CTX_CLEAR_OPTIONS
133#else
134# undef HAVE_SSL_CTX_CLEAR_OPTIONS
135#endif
136
Antoine Pitroud6494802011-07-21 01:11:30 +0200137/* In case of 'tls-unique' it will be 12 bytes for TLS, 36 bytes for
138 * older SSL, but let's be safe */
139#define PySSL_CB_MAXLEN 128
140
141/* SSL_get_finished got added to OpenSSL in 0.9.5 */
142#if OPENSSL_VERSION_NUMBER >= 0x0090500fL
143# define HAVE_OPENSSL_FINISHED 1
144#else
145# define HAVE_OPENSSL_FINISHED 0
146#endif
147
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000148typedef struct {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000149 PyObject_HEAD
Antoine Pitrou152efa22010-05-16 18:19:27 +0000150 SSL_CTX *ctx;
151} PySSLContext;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000152
Antoine Pitrou152efa22010-05-16 18:19:27 +0000153typedef struct {
154 PyObject_HEAD
155 PyObject *Socket; /* weakref to socket on which we're layered */
156 SSL *ssl;
157 X509 *peer_cert;
158 int shutdown_seen_zero;
Antoine Pitroud6494802011-07-21 01:11:30 +0200159 enum py_ssl_server_or_client socket_type;
Antoine Pitrou152efa22010-05-16 18:19:27 +0000160} PySSLSocket;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000161
Antoine Pitrou152efa22010-05-16 18:19:27 +0000162static PyTypeObject PySSLContext_Type;
163static PyTypeObject PySSLSocket_Type;
164
165static PyObject *PySSL_SSLwrite(PySSLSocket *self, PyObject *args);
166static PyObject *PySSL_SSLread(PySSLSocket *self, PyObject *args);
Thomas Woutersed03b412007-08-28 21:37:11 +0000167static int check_socket_and_wait_for_timeout(PySocketSockObject *s,
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000168 int writing);
Antoine Pitrou152efa22010-05-16 18:19:27 +0000169static PyObject *PySSL_peercert(PySSLSocket *self, PyObject *args);
170static PyObject *PySSL_cipher(PySSLSocket *self);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000171
Antoine Pitrou152efa22010-05-16 18:19:27 +0000172#define PySSLContext_Check(v) (Py_TYPE(v) == &PySSLContext_Type)
173#define PySSLSocket_Check(v) (Py_TYPE(v) == &PySSLSocket_Type)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000174
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +0000175typedef enum {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000176 SOCKET_IS_NONBLOCKING,
177 SOCKET_IS_BLOCKING,
178 SOCKET_HAS_TIMED_OUT,
179 SOCKET_HAS_BEEN_CLOSED,
180 SOCKET_TOO_LARGE_FOR_SELECT,
181 SOCKET_OPERATION_OK
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +0000182} timeout_state;
183
Thomas Woutersed03b412007-08-28 21:37:11 +0000184/* Wrap error strings with filename and line # */
185#define STRINGIFY1(x) #x
186#define STRINGIFY2(x) STRINGIFY1(x)
187#define ERRSTR1(x,y,z) (x ":" y ": " z)
188#define ERRSTR(x) ERRSTR1("_ssl.c", STRINGIFY2(__LINE__), x)
189
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000190/* XXX It might be helpful to augment the error message generated
191 below with the name of the SSL function that generated the error.
192 I expect it's obvious most of the time.
193*/
194
195static PyObject *
Antoine Pitrou152efa22010-05-16 18:19:27 +0000196PySSL_SetError(PySSLSocket *obj, int ret, char *filename, int lineno)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000197{
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000198 PyObject *v;
Antoine Pitrou41032a62011-10-27 23:56:55 +0200199 PyObject *type = PySSLErrorObject;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000200 char buf[2048];
201 char *errstr;
202 int err;
203 enum py_ssl_error p = PY_SSL_ERROR_NONE;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000204
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000205 assert(ret <= 0);
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +0000206
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000207 if (obj->ssl != NULL) {
208 err = SSL_get_error(obj->ssl, ret);
Thomas Woutersed03b412007-08-28 21:37:11 +0000209
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000210 switch (err) {
211 case SSL_ERROR_ZERO_RETURN:
Antoine Pitrou41032a62011-10-27 23:56:55 +0200212 errstr = "TLS/SSL connection has been closed (EOF)";
213 type = PySSLZeroReturnErrorObject;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000214 p = PY_SSL_ERROR_ZERO_RETURN;
215 break;
216 case SSL_ERROR_WANT_READ:
217 errstr = "The operation did not complete (read)";
Antoine Pitrou41032a62011-10-27 23:56:55 +0200218 type = PySSLWantReadErrorObject;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000219 p = PY_SSL_ERROR_WANT_READ;
220 break;
221 case SSL_ERROR_WANT_WRITE:
222 p = PY_SSL_ERROR_WANT_WRITE;
Antoine Pitrou41032a62011-10-27 23:56:55 +0200223 type = PySSLWantWriteErrorObject;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000224 errstr = "The operation did not complete (write)";
225 break;
226 case SSL_ERROR_WANT_X509_LOOKUP:
227 p = PY_SSL_ERROR_WANT_X509_LOOKUP;
Antoine Pitrou525807b2010-05-12 14:05:24 +0000228 errstr = "The operation did not complete (X509 lookup)";
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000229 break;
230 case SSL_ERROR_WANT_CONNECT:
231 p = PY_SSL_ERROR_WANT_CONNECT;
232 errstr = "The operation did not complete (connect)";
233 break;
234 case SSL_ERROR_SYSCALL:
235 {
236 unsigned long e = ERR_get_error();
237 if (e == 0) {
238 PySocketSockObject *s
239 = (PySocketSockObject *) PyWeakref_GetObject(obj->Socket);
240 if (ret == 0 || (((PyObject *)s) == Py_None)) {
Antoine Pitrou525807b2010-05-12 14:05:24 +0000241 p = PY_SSL_ERROR_EOF;
Antoine Pitrou41032a62011-10-27 23:56:55 +0200242 type = PySSLEOFErrorObject;
Antoine Pitrou525807b2010-05-12 14:05:24 +0000243 errstr = "EOF occurred in violation of protocol";
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000244 } else if (ret == -1) {
Antoine Pitrou525807b2010-05-12 14:05:24 +0000245 /* underlying BIO reported an I/O error */
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +0000246 Py_INCREF(s);
Antoine Pitrou9d74b422010-05-16 23:14:22 +0000247 ERR_clear_error();
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +0000248 v = s->errorhandler();
249 Py_DECREF(s);
250 return v;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000251 } else { /* possible? */
Antoine Pitrou525807b2010-05-12 14:05:24 +0000252 p = PY_SSL_ERROR_SYSCALL;
Antoine Pitrou41032a62011-10-27 23:56:55 +0200253 type = PySSLSyscallErrorObject;
Antoine Pitrou525807b2010-05-12 14:05:24 +0000254 errstr = "Some I/O error occurred";
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000255 }
256 } else {
257 p = PY_SSL_ERROR_SYSCALL;
258 /* XXX Protected by global interpreter lock */
259 errstr = ERR_error_string(e, NULL);
260 }
261 break;
262 }
263 case SSL_ERROR_SSL:
264 {
265 unsigned long e = ERR_get_error();
266 p = PY_SSL_ERROR_SSL;
267 if (e != 0)
268 /* XXX Protected by global interpreter lock */
269 errstr = ERR_error_string(e, NULL);
270 else { /* possible? */
Antoine Pitrou525807b2010-05-12 14:05:24 +0000271 errstr = "A failure in the SSL library occurred";
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000272 }
273 break;
274 }
275 default:
276 p = PY_SSL_ERROR_INVALID_ERROR_CODE;
277 errstr = "Invalid error code";
278 }
279 } else {
280 errstr = ERR_error_string(ERR_peek_last_error(), NULL);
281 }
282 PyOS_snprintf(buf, sizeof(buf), "_ssl.c:%d: %s", lineno, errstr);
Antoine Pitrou9d74b422010-05-16 23:14:22 +0000283 ERR_clear_error();
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000284 v = Py_BuildValue("(is)", p, buf);
285 if (v != NULL) {
Antoine Pitrou41032a62011-10-27 23:56:55 +0200286 PyErr_SetObject(type, v);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000287 Py_DECREF(v);
288 }
289 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000290}
291
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000292static PyObject *
293_setSSLError (char *errstr, int errcode, char *filename, int lineno) {
294
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000295 char buf[2048];
296 PyObject *v;
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000297
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000298 if (errstr == NULL) {
299 errcode = ERR_peek_last_error();
300 errstr = ERR_error_string(errcode, NULL);
301 }
302 PyOS_snprintf(buf, sizeof(buf), "_ssl.c:%d: %s", lineno, errstr);
Antoine Pitrou9d74b422010-05-16 23:14:22 +0000303 ERR_clear_error();
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000304 v = Py_BuildValue("(is)", errcode, buf);
305 if (v != NULL) {
306 PyErr_SetObject(PySSLErrorObject, v);
307 Py_DECREF(v);
308 }
309 return NULL;
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000310}
311
Antoine Pitrou152efa22010-05-16 18:19:27 +0000312static PySSLSocket *
313newPySSLSocket(SSL_CTX *ctx, PySocketSockObject *sock,
Antoine Pitroud5323212010-10-22 18:19:07 +0000314 enum py_ssl_server_or_client socket_type,
315 char *server_hostname)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000316{
Antoine Pitrou152efa22010-05-16 18:19:27 +0000317 PySSLSocket *self;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000318
Antoine Pitrou152efa22010-05-16 18:19:27 +0000319 self = PyObject_New(PySSLSocket, &PySSLSocket_Type);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000320 if (self == NULL)
321 return NULL;
Antoine Pitrou152efa22010-05-16 18:19:27 +0000322
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000323 self->peer_cert = NULL;
324 self->ssl = NULL;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000325 self->Socket = NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000326
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000327 /* Make sure the SSL error state is initialized */
328 (void) ERR_get_state();
329 ERR_clear_error();
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000330
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000331 PySSL_BEGIN_ALLOW_THREADS
Antoine Pitrou152efa22010-05-16 18:19:27 +0000332 self->ssl = SSL_new(ctx);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000333 PySSL_END_ALLOW_THREADS
Antoine Pitrou152efa22010-05-16 18:19:27 +0000334 SSL_set_fd(self->ssl, sock->sock_fd);
Antoine Pitrou0ae7b582010-04-09 20:42:09 +0000335#ifdef SSL_MODE_AUTO_RETRY
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000336 SSL_set_mode(self->ssl, SSL_MODE_AUTO_RETRY);
Antoine Pitrou0ae7b582010-04-09 20:42:09 +0000337#endif
Guido van Rossum4f707ac2003-01-31 18:13:18 +0000338
Antoine Pitroud5323212010-10-22 18:19:07 +0000339#ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME
340 if (server_hostname != NULL)
341 SSL_set_tlsext_host_name(self->ssl, server_hostname);
342#endif
343
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000344 /* If the socket is in non-blocking mode or timeout mode, set the BIO
345 * to non-blocking mode (blocking is the default)
346 */
Antoine Pitrou152efa22010-05-16 18:19:27 +0000347 if (sock->sock_timeout >= 0.0) {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000348 BIO_set_nbio(SSL_get_rbio(self->ssl), 1);
349 BIO_set_nbio(SSL_get_wbio(self->ssl), 1);
350 }
Guido van Rossum4f707ac2003-01-31 18:13:18 +0000351
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000352 PySSL_BEGIN_ALLOW_THREADS
353 if (socket_type == PY_SSL_CLIENT)
354 SSL_set_connect_state(self->ssl);
355 else
356 SSL_set_accept_state(self->ssl);
357 PySSL_END_ALLOW_THREADS
Martin v. Löwis09c35f72002-07-28 09:57:45 +0000358
Antoine Pitroud6494802011-07-21 01:11:30 +0200359 self->socket_type = socket_type;
Antoine Pitrou152efa22010-05-16 18:19:27 +0000360 self->Socket = PyWeakref_NewRef((PyObject *) sock, NULL);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000361 return self;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000362}
363
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000364/* SSL object methods */
365
Antoine Pitrou152efa22010-05-16 18:19:27 +0000366static PyObject *PySSL_SSLdo_handshake(PySSLSocket *self)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000367{
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000368 int ret;
369 int err;
370 int sockstate, nonblocking;
371 PySocketSockObject *sock
372 = (PySocketSockObject *) PyWeakref_GetObject(self->Socket);
Antoine Pitroud3f8ab82010-04-24 21:26:44 +0000373
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000374 if (((PyObject*)sock) == Py_None) {
375 _setSSLError("Underlying socket connection gone",
376 PY_SSL_ERROR_NO_SOCKET, __FILE__, __LINE__);
377 return NULL;
378 }
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +0000379 Py_INCREF(sock);
Antoine Pitroud3f8ab82010-04-24 21:26:44 +0000380
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000381 /* just in case the blocking state of the socket has been changed */
382 nonblocking = (sock->sock_timeout >= 0.0);
383 BIO_set_nbio(SSL_get_rbio(self->ssl), nonblocking);
384 BIO_set_nbio(SSL_get_wbio(self->ssl), nonblocking);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000385
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000386 /* Actually negotiate SSL connection */
387 /* XXX If SSL_do_handshake() returns 0, it's also a failure. */
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000388 do {
Bill Janssen6e027db2007-11-15 22:23:56 +0000389 PySSL_BEGIN_ALLOW_THREADS
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000390 ret = SSL_do_handshake(self->ssl);
391 err = SSL_get_error(self->ssl, ret);
392 PySSL_END_ALLOW_THREADS
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +0000393 if (PyErr_CheckSignals())
394 goto error;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000395 if (err == SSL_ERROR_WANT_READ) {
396 sockstate = check_socket_and_wait_for_timeout(sock, 0);
397 } else if (err == SSL_ERROR_WANT_WRITE) {
398 sockstate = check_socket_and_wait_for_timeout(sock, 1);
399 } else {
400 sockstate = SOCKET_OPERATION_OK;
401 }
402 if (sockstate == SOCKET_HAS_TIMED_OUT) {
Antoine Pitrouc4df7842010-12-03 19:59:41 +0000403 PyErr_SetString(PySocketModule.timeout_error,
Antoine Pitrou525807b2010-05-12 14:05:24 +0000404 ERRSTR("The handshake operation timed out"));
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +0000405 goto error;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000406 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
407 PyErr_SetString(PySSLErrorObject,
Antoine Pitrou525807b2010-05-12 14:05:24 +0000408 ERRSTR("Underlying socket has been closed."));
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +0000409 goto error;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000410 } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
411 PyErr_SetString(PySSLErrorObject,
Antoine Pitrou525807b2010-05-12 14:05:24 +0000412 ERRSTR("Underlying socket too large for select()."));
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +0000413 goto error;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000414 } else if (sockstate == SOCKET_IS_NONBLOCKING) {
415 break;
416 }
417 } while (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE);
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +0000418 Py_DECREF(sock);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000419 if (ret < 1)
420 return PySSL_SetError(self, ret, __FILE__, __LINE__);
Bill Janssen6e027db2007-11-15 22:23:56 +0000421
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000422 if (self->peer_cert)
423 X509_free (self->peer_cert);
424 PySSL_BEGIN_ALLOW_THREADS
425 self->peer_cert = SSL_get_peer_certificate(self->ssl);
426 PySSL_END_ALLOW_THREADS
427
428 Py_INCREF(Py_None);
429 return Py_None;
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +0000430
431error:
432 Py_DECREF(sock);
433 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000434}
435
Thomas Woutersed03b412007-08-28 21:37:11 +0000436static PyObject *
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000437_create_tuple_for_attribute (ASN1_OBJECT *name, ASN1_STRING *value) {
Thomas Woutersed03b412007-08-28 21:37:11 +0000438
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000439 char namebuf[X509_NAME_MAXLEN];
440 int buflen;
441 PyObject *name_obj;
442 PyObject *value_obj;
443 PyObject *attr;
444 unsigned char *valuebuf = NULL;
Thomas Woutersed03b412007-08-28 21:37:11 +0000445
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000446 buflen = OBJ_obj2txt(namebuf, sizeof(namebuf), name, 0);
447 if (buflen < 0) {
448 _setSSLError(NULL, 0, __FILE__, __LINE__);
449 goto fail;
450 }
451 name_obj = PyUnicode_FromStringAndSize(namebuf, buflen);
452 if (name_obj == NULL)
453 goto fail;
Guido van Rossumf06628b2007-11-21 20:01:53 +0000454
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000455 buflen = ASN1_STRING_to_UTF8(&valuebuf, value);
456 if (buflen < 0) {
457 _setSSLError(NULL, 0, __FILE__, __LINE__);
458 Py_DECREF(name_obj);
459 goto fail;
460 }
461 value_obj = PyUnicode_DecodeUTF8((char *) valuebuf,
Antoine Pitrou525807b2010-05-12 14:05:24 +0000462 buflen, "strict");
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000463 OPENSSL_free(valuebuf);
464 if (value_obj == NULL) {
465 Py_DECREF(name_obj);
466 goto fail;
467 }
468 attr = PyTuple_New(2);
469 if (attr == NULL) {
470 Py_DECREF(name_obj);
471 Py_DECREF(value_obj);
472 goto fail;
473 }
474 PyTuple_SET_ITEM(attr, 0, name_obj);
475 PyTuple_SET_ITEM(attr, 1, value_obj);
476 return attr;
Thomas Woutersed03b412007-08-28 21:37:11 +0000477
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000478 fail:
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000479 return NULL;
Thomas Woutersed03b412007-08-28 21:37:11 +0000480}
481
482static PyObject *
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000483_create_tuple_for_X509_NAME (X509_NAME *xname)
Thomas Woutersed03b412007-08-28 21:37:11 +0000484{
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000485 PyObject *dn = NULL; /* tuple which represents the "distinguished name" */
486 PyObject *rdn = NULL; /* tuple to hold a "relative distinguished name" */
487 PyObject *rdnt;
488 PyObject *attr = NULL; /* tuple to hold an attribute */
489 int entry_count = X509_NAME_entry_count(xname);
490 X509_NAME_ENTRY *entry;
491 ASN1_OBJECT *name;
492 ASN1_STRING *value;
493 int index_counter;
494 int rdn_level = -1;
495 int retcode;
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000496
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000497 dn = PyList_New(0);
498 if (dn == NULL)
499 return NULL;
500 /* now create another tuple to hold the top-level RDN */
501 rdn = PyList_New(0);
502 if (rdn == NULL)
503 goto fail0;
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000504
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000505 for (index_counter = 0;
506 index_counter < entry_count;
507 index_counter++)
508 {
509 entry = X509_NAME_get_entry(xname, index_counter);
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000510
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000511 /* check to see if we've gotten to a new RDN */
512 if (rdn_level >= 0) {
513 if (rdn_level != entry->set) {
514 /* yes, new RDN */
515 /* add old RDN to DN */
516 rdnt = PyList_AsTuple(rdn);
517 Py_DECREF(rdn);
518 if (rdnt == NULL)
519 goto fail0;
520 retcode = PyList_Append(dn, rdnt);
521 Py_DECREF(rdnt);
522 if (retcode < 0)
523 goto fail0;
524 /* create new RDN */
525 rdn = PyList_New(0);
526 if (rdn == NULL)
527 goto fail0;
528 }
529 }
530 rdn_level = entry->set;
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000531
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000532 /* now add this attribute to the current RDN */
533 name = X509_NAME_ENTRY_get_object(entry);
534 value = X509_NAME_ENTRY_get_data(entry);
535 attr = _create_tuple_for_attribute(name, value);
536 /*
537 fprintf(stderr, "RDN level %d, attribute %s: %s\n",
538 entry->set,
539 PyBytes_AS_STRING(PyTuple_GET_ITEM(attr, 0)),
540 PyBytes_AS_STRING(PyTuple_GET_ITEM(attr, 1)));
541 */
542 if (attr == NULL)
543 goto fail1;
544 retcode = PyList_Append(rdn, attr);
545 Py_DECREF(attr);
546 if (retcode < 0)
547 goto fail1;
548 }
549 /* now, there's typically a dangling RDN */
550 if ((rdn != NULL) && (PyList_Size(rdn) > 0)) {
551 rdnt = PyList_AsTuple(rdn);
552 Py_DECREF(rdn);
553 if (rdnt == NULL)
554 goto fail0;
555 retcode = PyList_Append(dn, rdnt);
556 Py_DECREF(rdnt);
557 if (retcode < 0)
558 goto fail0;
559 }
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000560
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000561 /* convert list to tuple */
562 rdnt = PyList_AsTuple(dn);
563 Py_DECREF(dn);
564 if (rdnt == NULL)
565 return NULL;
566 return rdnt;
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000567
568 fail1:
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000569 Py_XDECREF(rdn);
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000570
571 fail0:
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000572 Py_XDECREF(dn);
573 return NULL;
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000574}
575
576static PyObject *
577_get_peer_alt_names (X509 *certificate) {
Guido van Rossumf06628b2007-11-21 20:01:53 +0000578
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000579 /* this code follows the procedure outlined in
580 OpenSSL's crypto/x509v3/v3_prn.c:X509v3_EXT_print()
581 function to extract the STACK_OF(GENERAL_NAME),
582 then iterates through the stack to add the
583 names. */
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000584
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000585 int i, j;
586 PyObject *peer_alt_names = Py_None;
587 PyObject *v, *t;
588 X509_EXTENSION *ext = NULL;
589 GENERAL_NAMES *names = NULL;
590 GENERAL_NAME *name;
Benjamin Petersoneb1410f2010-10-13 22:06:39 +0000591 const X509V3_EXT_METHOD *method;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000592 BIO *biobuf = NULL;
593 char buf[2048];
594 char *vptr;
595 int len;
596 /* Issue #2973: ASN1_item_d2i() API changed in OpenSSL 0.9.6m */
Victor Stinner7124a412010-03-02 22:48:17 +0000597#if OPENSSL_VERSION_NUMBER >= 0x009060dfL
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000598 const unsigned char *p;
Victor Stinner7124a412010-03-02 22:48:17 +0000599#else
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000600 unsigned char *p;
Victor Stinner7124a412010-03-02 22:48:17 +0000601#endif
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000602
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000603 if (certificate == NULL)
604 return peer_alt_names;
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000605
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000606 /* get a memory buffer */
607 biobuf = BIO_new(BIO_s_mem());
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000608
Antoine Pitroud8c347a2011-10-01 19:20:25 +0200609 i = -1;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000610 while ((i = X509_get_ext_by_NID(
611 certificate, NID_subject_alt_name, i)) >= 0) {
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000612
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000613 if (peer_alt_names == Py_None) {
614 peer_alt_names = PyList_New(0);
615 if (peer_alt_names == NULL)
616 goto fail;
617 }
Guido van Rossumf06628b2007-11-21 20:01:53 +0000618
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000619 /* now decode the altName */
620 ext = X509_get_ext(certificate, i);
621 if(!(method = X509V3_EXT_get(ext))) {
622 PyErr_SetString
623 (PySSLErrorObject,
624 ERRSTR("No method for internalizing subjectAltName!"));
625 goto fail;
626 }
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000627
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000628 p = ext->value->data;
629 if (method->it)
630 names = (GENERAL_NAMES*)
631 (ASN1_item_d2i(NULL,
632 &p,
633 ext->value->length,
634 ASN1_ITEM_ptr(method->it)));
635 else
636 names = (GENERAL_NAMES*)
637 (method->d2i(NULL,
638 &p,
639 ext->value->length));
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000640
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000641 for(j = 0; j < sk_GENERAL_NAME_num(names); j++) {
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000642
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000643 /* get a rendering of each name in the set of names */
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000644
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000645 name = sk_GENERAL_NAME_value(names, j);
646 if (name->type == GEN_DIRNAME) {
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000647
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000648 /* we special-case DirName as a tuple of
649 tuples of attributes */
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000650
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000651 t = PyTuple_New(2);
652 if (t == NULL) {
653 goto fail;
654 }
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000655
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000656 v = PyUnicode_FromString("DirName");
657 if (v == NULL) {
658 Py_DECREF(t);
659 goto fail;
660 }
661 PyTuple_SET_ITEM(t, 0, v);
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000662
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000663 v = _create_tuple_for_X509_NAME (name->d.dirn);
664 if (v == NULL) {
665 Py_DECREF(t);
666 goto fail;
667 }
668 PyTuple_SET_ITEM(t, 1, v);
Guido van Rossumf06628b2007-11-21 20:01:53 +0000669
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000670 } else {
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000671
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000672 /* for everything else, we use the OpenSSL print form */
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000673
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000674 (void) BIO_reset(biobuf);
675 GENERAL_NAME_print(biobuf, name);
676 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
677 if (len < 0) {
678 _setSSLError(NULL, 0, __FILE__, __LINE__);
679 goto fail;
680 }
681 vptr = strchr(buf, ':');
682 if (vptr == NULL)
683 goto fail;
684 t = PyTuple_New(2);
685 if (t == NULL)
686 goto fail;
687 v = PyUnicode_FromStringAndSize(buf, (vptr - buf));
688 if (v == NULL) {
689 Py_DECREF(t);
690 goto fail;
691 }
692 PyTuple_SET_ITEM(t, 0, v);
693 v = PyUnicode_FromStringAndSize((vptr + 1),
694 (len - (vptr - buf + 1)));
695 if (v == NULL) {
696 Py_DECREF(t);
697 goto fail;
698 }
699 PyTuple_SET_ITEM(t, 1, v);
700 }
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000701
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000702 /* and add that rendering to the list */
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000703
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000704 if (PyList_Append(peer_alt_names, t) < 0) {
705 Py_DECREF(t);
706 goto fail;
707 }
708 Py_DECREF(t);
709 }
Antoine Pitrou116d6b92011-11-23 01:39:19 +0100710 sk_GENERAL_NAME_pop_free(names, GENERAL_NAME_free);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000711 }
712 BIO_free(biobuf);
713 if (peer_alt_names != Py_None) {
714 v = PyList_AsTuple(peer_alt_names);
715 Py_DECREF(peer_alt_names);
716 return v;
717 } else {
718 return peer_alt_names;
719 }
Guido van Rossumf06628b2007-11-21 20:01:53 +0000720
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000721
722 fail:
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000723 if (biobuf != NULL)
724 BIO_free(biobuf);
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000725
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000726 if (peer_alt_names != Py_None) {
727 Py_XDECREF(peer_alt_names);
728 }
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000729
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000730 return NULL;
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000731}
732
733static PyObject *
Antoine Pitroufb046912010-11-09 20:21:19 +0000734_decode_certificate(X509 *certificate) {
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000735
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000736 PyObject *retval = NULL;
737 BIO *biobuf = NULL;
738 PyObject *peer;
739 PyObject *peer_alt_names = NULL;
740 PyObject *issuer;
741 PyObject *version;
742 PyObject *sn_obj;
743 ASN1_INTEGER *serialNumber;
744 char buf[2048];
745 int len;
746 ASN1_TIME *notBefore, *notAfter;
747 PyObject *pnotBefore, *pnotAfter;
Thomas Woutersed03b412007-08-28 21:37:11 +0000748
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000749 retval = PyDict_New();
750 if (retval == NULL)
751 return NULL;
Thomas Woutersed03b412007-08-28 21:37:11 +0000752
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000753 peer = _create_tuple_for_X509_NAME(
754 X509_get_subject_name(certificate));
755 if (peer == NULL)
756 goto fail0;
757 if (PyDict_SetItemString(retval, (const char *) "subject", peer) < 0) {
758 Py_DECREF(peer);
759 goto fail0;
760 }
761 Py_DECREF(peer);
Thomas Woutersed03b412007-08-28 21:37:11 +0000762
Antoine Pitroufb046912010-11-09 20:21:19 +0000763 issuer = _create_tuple_for_X509_NAME(
764 X509_get_issuer_name(certificate));
765 if (issuer == NULL)
766 goto fail0;
767 if (PyDict_SetItemString(retval, (const char *)"issuer", issuer) < 0) {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000768 Py_DECREF(issuer);
Antoine Pitroufb046912010-11-09 20:21:19 +0000769 goto fail0;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000770 }
Antoine Pitroufb046912010-11-09 20:21:19 +0000771 Py_DECREF(issuer);
772
773 version = PyLong_FromLong(X509_get_version(certificate) + 1);
774 if (PyDict_SetItemString(retval, "version", version) < 0) {
775 Py_DECREF(version);
776 goto fail0;
777 }
778 Py_DECREF(version);
Guido van Rossumf06628b2007-11-21 20:01:53 +0000779
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000780 /* get a memory buffer */
781 biobuf = BIO_new(BIO_s_mem());
Guido van Rossumf06628b2007-11-21 20:01:53 +0000782
Antoine Pitroufb046912010-11-09 20:21:19 +0000783 (void) BIO_reset(biobuf);
784 serialNumber = X509_get_serialNumber(certificate);
785 /* should not exceed 20 octets, 160 bits, so buf is big enough */
786 i2a_ASN1_INTEGER(biobuf, serialNumber);
787 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
788 if (len < 0) {
789 _setSSLError(NULL, 0, __FILE__, __LINE__);
790 goto fail1;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000791 }
Antoine Pitroufb046912010-11-09 20:21:19 +0000792 sn_obj = PyUnicode_FromStringAndSize(buf, len);
793 if (sn_obj == NULL)
794 goto fail1;
795 if (PyDict_SetItemString(retval, "serialNumber", sn_obj) < 0) {
796 Py_DECREF(sn_obj);
797 goto fail1;
798 }
799 Py_DECREF(sn_obj);
800
801 (void) BIO_reset(biobuf);
802 notBefore = X509_get_notBefore(certificate);
803 ASN1_TIME_print(biobuf, notBefore);
804 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
805 if (len < 0) {
806 _setSSLError(NULL, 0, __FILE__, __LINE__);
807 goto fail1;
808 }
809 pnotBefore = PyUnicode_FromStringAndSize(buf, len);
810 if (pnotBefore == NULL)
811 goto fail1;
812 if (PyDict_SetItemString(retval, "notBefore", pnotBefore) < 0) {
813 Py_DECREF(pnotBefore);
814 goto fail1;
815 }
816 Py_DECREF(pnotBefore);
Thomas Woutersed03b412007-08-28 21:37:11 +0000817
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000818 (void) BIO_reset(biobuf);
819 notAfter = X509_get_notAfter(certificate);
820 ASN1_TIME_print(biobuf, notAfter);
821 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
822 if (len < 0) {
823 _setSSLError(NULL, 0, __FILE__, __LINE__);
824 goto fail1;
825 }
826 pnotAfter = PyUnicode_FromStringAndSize(buf, len);
827 if (pnotAfter == NULL)
828 goto fail1;
829 if (PyDict_SetItemString(retval, "notAfter", pnotAfter) < 0) {
830 Py_DECREF(pnotAfter);
831 goto fail1;
832 }
833 Py_DECREF(pnotAfter);
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000834
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000835 /* Now look for subjectAltName */
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000836
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000837 peer_alt_names = _get_peer_alt_names(certificate);
838 if (peer_alt_names == NULL)
839 goto fail1;
840 else if (peer_alt_names != Py_None) {
841 if (PyDict_SetItemString(retval, "subjectAltName",
842 peer_alt_names) < 0) {
843 Py_DECREF(peer_alt_names);
844 goto fail1;
845 }
846 Py_DECREF(peer_alt_names);
847 }
Guido van Rossumf06628b2007-11-21 20:01:53 +0000848
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000849 BIO_free(biobuf);
850 return retval;
Thomas Woutersed03b412007-08-28 21:37:11 +0000851
852 fail1:
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000853 if (biobuf != NULL)
854 BIO_free(biobuf);
Thomas Woutersed03b412007-08-28 21:37:11 +0000855 fail0:
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000856 Py_XDECREF(retval);
857 return NULL;
Thomas Woutersed03b412007-08-28 21:37:11 +0000858}
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000859
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000860
861static PyObject *
862PySSL_test_decode_certificate (PyObject *mod, PyObject *args) {
863
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000864 PyObject *retval = NULL;
Victor Stinner3800e1e2010-05-16 21:23:48 +0000865 PyObject *filename;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000866 X509 *x=NULL;
867 BIO *cert;
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000868
Antoine Pitroufb046912010-11-09 20:21:19 +0000869 if (!PyArg_ParseTuple(args, "O&:test_decode_certificate",
870 PyUnicode_FSConverter, &filename))
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000871 return NULL;
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000872
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000873 if ((cert=BIO_new(BIO_s_file())) == NULL) {
874 PyErr_SetString(PySSLErrorObject,
875 "Can't malloc memory to read file");
876 goto fail0;
877 }
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000878
Victor Stinner3800e1e2010-05-16 21:23:48 +0000879 if (BIO_read_filename(cert, PyBytes_AsString(filename)) <= 0) {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000880 PyErr_SetString(PySSLErrorObject,
881 "Can't open file");
882 goto fail0;
883 }
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000884
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000885 x = PEM_read_bio_X509_AUX(cert,NULL, NULL, NULL);
886 if (x == NULL) {
887 PyErr_SetString(PySSLErrorObject,
888 "Error decoding PEM-encoded file");
889 goto fail0;
890 }
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000891
Antoine Pitroufb046912010-11-09 20:21:19 +0000892 retval = _decode_certificate(x);
Mark Dickinsonee55df52010-08-03 18:31:54 +0000893 X509_free(x);
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000894
895 fail0:
Victor Stinner3800e1e2010-05-16 21:23:48 +0000896 Py_DECREF(filename);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000897 if (cert != NULL) BIO_free(cert);
898 return retval;
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000899}
900
901
902static PyObject *
Antoine Pitrou152efa22010-05-16 18:19:27 +0000903PySSL_peercert(PySSLSocket *self, PyObject *args)
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000904{
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000905 PyObject *retval = NULL;
906 int len;
907 int verification;
908 PyObject *binary_mode = Py_None;
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000909
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000910 if (!PyArg_ParseTuple(args, "|O:peer_certificate", &binary_mode))
911 return NULL;
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000912
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000913 if (!self->peer_cert)
914 Py_RETURN_NONE;
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000915
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000916 if (PyObject_IsTrue(binary_mode)) {
917 /* return cert in DER-encoded format */
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000918
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000919 unsigned char *bytes_buf = NULL;
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000920
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000921 bytes_buf = NULL;
922 len = i2d_X509(self->peer_cert, &bytes_buf);
923 if (len < 0) {
924 PySSL_SetError(self, len, __FILE__, __LINE__);
925 return NULL;
926 }
927 /* this is actually an immutable bytes sequence */
928 retval = PyBytes_FromStringAndSize
929 ((const char *) bytes_buf, len);
930 OPENSSL_free(bytes_buf);
931 return retval;
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000932
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000933 } else {
Antoine Pitrou152efa22010-05-16 18:19:27 +0000934 verification = SSL_CTX_get_verify_mode(SSL_get_SSL_CTX(self->ssl));
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000935 if ((verification & SSL_VERIFY_PEER) == 0)
936 return PyDict_New();
937 else
Antoine Pitroufb046912010-11-09 20:21:19 +0000938 return _decode_certificate(self->peer_cert);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000939 }
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000940}
941
942PyDoc_STRVAR(PySSL_peercert_doc,
943"peer_certificate([der=False]) -> certificate\n\
944\n\
945Returns the certificate for the peer. If no certificate was provided,\n\
946returns None. If a certificate was provided, but not validated, returns\n\
947an empty dictionary. Otherwise returns a dict containing information\n\
948about the peer certificate.\n\
949\n\
950If the optional argument is True, returns a DER-encoded copy of the\n\
951peer certificate, or None if no certificate was provided. This will\n\
952return the certificate even if it wasn't validated.");
953
Antoine Pitrou152efa22010-05-16 18:19:27 +0000954static PyObject *PySSL_cipher (PySSLSocket *self) {
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000955
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000956 PyObject *retval, *v;
Benjamin Petersoneb1410f2010-10-13 22:06:39 +0000957 const SSL_CIPHER *current;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000958 char *cipher_name;
959 char *cipher_protocol;
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000960
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000961 if (self->ssl == NULL)
Hirokazu Yamamoto524f1032010-12-09 10:49:00 +0000962 Py_RETURN_NONE;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000963 current = SSL_get_current_cipher(self->ssl);
964 if (current == NULL)
Hirokazu Yamamoto524f1032010-12-09 10:49:00 +0000965 Py_RETURN_NONE;
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000966
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000967 retval = PyTuple_New(3);
968 if (retval == NULL)
969 return NULL;
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000970
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000971 cipher_name = (char *) SSL_CIPHER_get_name(current);
972 if (cipher_name == NULL) {
Hirokazu Yamamoto524f1032010-12-09 10:49:00 +0000973 Py_INCREF(Py_None);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000974 PyTuple_SET_ITEM(retval, 0, Py_None);
975 } else {
976 v = PyUnicode_FromString(cipher_name);
977 if (v == NULL)
978 goto fail0;
979 PyTuple_SET_ITEM(retval, 0, v);
980 }
981 cipher_protocol = SSL_CIPHER_get_version(current);
982 if (cipher_protocol == NULL) {
Hirokazu Yamamoto524f1032010-12-09 10:49:00 +0000983 Py_INCREF(Py_None);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000984 PyTuple_SET_ITEM(retval, 1, Py_None);
985 } else {
986 v = PyUnicode_FromString(cipher_protocol);
987 if (v == NULL)
988 goto fail0;
989 PyTuple_SET_ITEM(retval, 1, v);
990 }
991 v = PyLong_FromLong(SSL_CIPHER_get_bits(current, NULL));
992 if (v == NULL)
993 goto fail0;
994 PyTuple_SET_ITEM(retval, 2, v);
995 return retval;
Guido van Rossumf06628b2007-11-21 20:01:53 +0000996
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000997 fail0:
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000998 Py_DECREF(retval);
999 return NULL;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001000}
1001
Antoine Pitrou152efa22010-05-16 18:19:27 +00001002static void PySSL_dealloc(PySSLSocket *self)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001003{
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001004 if (self->peer_cert) /* Possible not to have one? */
1005 X509_free (self->peer_cert);
1006 if (self->ssl)
1007 SSL_free(self->ssl);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001008 Py_XDECREF(self->Socket);
1009 PyObject_Del(self);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001010}
1011
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001012/* If the socket has a timeout, do a select()/poll() on the socket.
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001013 The argument writing indicates the direction.
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001014 Returns one of the possibilities in the timeout_state enum (above).
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001015 */
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001016
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001017static int
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001018check_socket_and_wait_for_timeout(PySocketSockObject *s, int writing)
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001019{
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001020 fd_set fds;
1021 struct timeval tv;
1022 int rc;
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001023
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001024 /* Nothing to do unless we're in timeout mode (not non-blocking) */
1025 if (s->sock_timeout < 0.0)
1026 return SOCKET_IS_BLOCKING;
1027 else if (s->sock_timeout == 0.0)
1028 return SOCKET_IS_NONBLOCKING;
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001029
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001030 /* Guard against closed socket */
1031 if (s->sock_fd < 0)
1032 return SOCKET_HAS_BEEN_CLOSED;
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001033
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001034 /* Prefer poll, if available, since you can poll() any fd
1035 * which can't be done with select(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001036#ifdef HAVE_POLL
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001037 {
1038 struct pollfd pollfd;
1039 int timeout;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001040
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001041 pollfd.fd = s->sock_fd;
1042 pollfd.events = writing ? POLLOUT : POLLIN;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001043
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001044 /* s->sock_timeout is in seconds, timeout in ms */
1045 timeout = (int)(s->sock_timeout * 1000 + 0.5);
1046 PySSL_BEGIN_ALLOW_THREADS
1047 rc = poll(&pollfd, 1, timeout);
1048 PySSL_END_ALLOW_THREADS
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001049
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001050 goto normal_return;
1051 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001052#endif
1053
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001054 /* Guard against socket too large for select*/
Charles-François Nataliaa26b272011-08-28 17:51:43 +02001055 if (!_PyIsSelectable_fd(s->sock_fd))
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001056 return SOCKET_TOO_LARGE_FOR_SELECT;
Neal Norwitz082b2df2006-02-07 07:04:46 +00001057
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001058 /* Construct the arguments to select */
1059 tv.tv_sec = (int)s->sock_timeout;
1060 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
1061 FD_ZERO(&fds);
1062 FD_SET(s->sock_fd, &fds);
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001063
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001064 /* See if the socket is ready */
1065 PySSL_BEGIN_ALLOW_THREADS
1066 if (writing)
1067 rc = select(s->sock_fd+1, NULL, &fds, NULL, &tv);
1068 else
1069 rc = select(s->sock_fd+1, &fds, NULL, NULL, &tv);
1070 PySSL_END_ALLOW_THREADS
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001071
Bill Janssen6e027db2007-11-15 22:23:56 +00001072#ifdef HAVE_POLL
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001073normal_return:
Bill Janssen6e027db2007-11-15 22:23:56 +00001074#endif
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001075 /* Return SOCKET_TIMED_OUT on timeout, SOCKET_OPERATION_OK otherwise
1076 (when we are able to write or when there's something to read) */
1077 return rc == 0 ? SOCKET_HAS_TIMED_OUT : SOCKET_OPERATION_OK;
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001078}
1079
Antoine Pitrou152efa22010-05-16 18:19:27 +00001080static PyObject *PySSL_SSLwrite(PySSLSocket *self, PyObject *args)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001081{
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001082 Py_buffer buf;
1083 int len;
1084 int sockstate;
1085 int err;
1086 int nonblocking;
1087 PySocketSockObject *sock
1088 = (PySocketSockObject *) PyWeakref_GetObject(self->Socket);
Bill Janssen54cc54c2007-12-14 22:08:56 +00001089
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001090 if (((PyObject*)sock) == Py_None) {
1091 _setSSLError("Underlying socket connection gone",
1092 PY_SSL_ERROR_NO_SOCKET, __FILE__, __LINE__);
1093 return NULL;
1094 }
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +00001095 Py_INCREF(sock);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001096
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +00001097 if (!PyArg_ParseTuple(args, "y*:write", &buf)) {
1098 Py_DECREF(sock);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001099 return NULL;
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +00001100 }
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001101
1102 /* just in case the blocking state of the socket has been changed */
1103 nonblocking = (sock->sock_timeout >= 0.0);
1104 BIO_set_nbio(SSL_get_rbio(self->ssl), nonblocking);
1105 BIO_set_nbio(SSL_get_wbio(self->ssl), nonblocking);
1106
1107 sockstate = check_socket_and_wait_for_timeout(sock, 1);
1108 if (sockstate == SOCKET_HAS_TIMED_OUT) {
Antoine Pitrouc4df7842010-12-03 19:59:41 +00001109 PyErr_SetString(PySocketModule.timeout_error,
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001110 "The write operation timed out");
1111 goto error;
1112 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
1113 PyErr_SetString(PySSLErrorObject,
1114 "Underlying socket has been closed.");
1115 goto error;
1116 } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
1117 PyErr_SetString(PySSLErrorObject,
1118 "Underlying socket too large for select().");
1119 goto error;
1120 }
1121 do {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001122 PySSL_BEGIN_ALLOW_THREADS
1123 len = SSL_write(self->ssl, buf.buf, buf.len);
1124 err = SSL_get_error(self->ssl, len);
1125 PySSL_END_ALLOW_THREADS
1126 if (PyErr_CheckSignals()) {
1127 goto error;
Bill Janssen54cc54c2007-12-14 22:08:56 +00001128 }
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001129 if (err == SSL_ERROR_WANT_READ) {
Antoine Pitrou525807b2010-05-12 14:05:24 +00001130 sockstate = check_socket_and_wait_for_timeout(sock, 0);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001131 } else if (err == SSL_ERROR_WANT_WRITE) {
Antoine Pitrou525807b2010-05-12 14:05:24 +00001132 sockstate = check_socket_and_wait_for_timeout(sock, 1);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001133 } else {
1134 sockstate = SOCKET_OPERATION_OK;
1135 }
1136 if (sockstate == SOCKET_HAS_TIMED_OUT) {
Antoine Pitrouc4df7842010-12-03 19:59:41 +00001137 PyErr_SetString(PySocketModule.timeout_error,
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001138 "The write operation timed out");
1139 goto error;
1140 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
1141 PyErr_SetString(PySSLErrorObject,
1142 "Underlying socket has been closed.");
1143 goto error;
1144 } else if (sockstate == SOCKET_IS_NONBLOCKING) {
1145 break;
1146 }
1147 } while (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001148
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +00001149 Py_DECREF(sock);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001150 PyBuffer_Release(&buf);
1151 if (len > 0)
1152 return PyLong_FromLong(len);
1153 else
1154 return PySSL_SetError(self, len, __FILE__, __LINE__);
Antoine Pitrou7d7aede2009-11-25 18:55:32 +00001155
1156error:
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +00001157 Py_DECREF(sock);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001158 PyBuffer_Release(&buf);
1159 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001160}
1161
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001162PyDoc_STRVAR(PySSL_SSLwrite_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001163"write(s) -> len\n\
1164\n\
1165Writes the string s into the SSL object. Returns the number\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001166of bytes written.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001167
Antoine Pitrou152efa22010-05-16 18:19:27 +00001168static PyObject *PySSL_SSLpending(PySSLSocket *self)
Bill Janssen6e027db2007-11-15 22:23:56 +00001169{
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001170 int count = 0;
Bill Janssen6e027db2007-11-15 22:23:56 +00001171
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001172 PySSL_BEGIN_ALLOW_THREADS
1173 count = SSL_pending(self->ssl);
1174 PySSL_END_ALLOW_THREADS
1175 if (count < 0)
1176 return PySSL_SetError(self, count, __FILE__, __LINE__);
1177 else
1178 return PyLong_FromLong(count);
Bill Janssen6e027db2007-11-15 22:23:56 +00001179}
1180
1181PyDoc_STRVAR(PySSL_SSLpending_doc,
1182"pending() -> count\n\
1183\n\
1184Returns the number of already decrypted bytes available for read,\n\
1185pending on the connection.\n");
1186
Antoine Pitrou152efa22010-05-16 18:19:27 +00001187static PyObject *PySSL_SSLread(PySSLSocket *self, PyObject *args)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001188{
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001189 PyObject *dest = NULL;
1190 Py_buffer buf;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001191 char *mem;
Antoine Pitrou24e561a2010-09-03 18:38:17 +00001192 int len, count;
1193 int buf_passed = 0;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001194 int sockstate;
1195 int err;
1196 int nonblocking;
1197 PySocketSockObject *sock
1198 = (PySocketSockObject *) PyWeakref_GetObject(self->Socket);
Bill Janssen54cc54c2007-12-14 22:08:56 +00001199
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001200 if (((PyObject*)sock) == Py_None) {
1201 _setSSLError("Underlying socket connection gone",
1202 PY_SSL_ERROR_NO_SOCKET, __FILE__, __LINE__);
1203 return NULL;
1204 }
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +00001205 Py_INCREF(sock);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001206
Antoine Pitrou24e561a2010-09-03 18:38:17 +00001207 buf.obj = NULL;
1208 buf.buf = NULL;
1209 if (!PyArg_ParseTuple(args, "i|w*:read", &len, &buf))
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +00001210 goto error;
1211
Antoine Pitrou24e561a2010-09-03 18:38:17 +00001212 if ((buf.buf == NULL) && (buf.obj == NULL)) {
1213 dest = PyBytes_FromStringAndSize(NULL, len);
1214 if (dest == NULL)
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +00001215 goto error;
Antoine Pitrou24e561a2010-09-03 18:38:17 +00001216 mem = PyBytes_AS_STRING(dest);
1217 }
1218 else {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001219 buf_passed = 1;
Antoine Pitrou24e561a2010-09-03 18:38:17 +00001220 mem = buf.buf;
1221 if (len <= 0 || len > buf.len) {
1222 len = (int) buf.len;
1223 if (buf.len != len) {
1224 PyErr_SetString(PyExc_OverflowError,
1225 "maximum length can't fit in a C 'int'");
1226 goto error;
1227 }
1228 }
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001229 }
1230
1231 /* just in case the blocking state of the socket has been changed */
1232 nonblocking = (sock->sock_timeout >= 0.0);
1233 BIO_set_nbio(SSL_get_rbio(self->ssl), nonblocking);
1234 BIO_set_nbio(SSL_get_wbio(self->ssl), nonblocking);
1235
1236 /* first check if there are bytes ready to be read */
1237 PySSL_BEGIN_ALLOW_THREADS
1238 count = SSL_pending(self->ssl);
1239 PySSL_END_ALLOW_THREADS
1240
1241 if (!count) {
1242 sockstate = check_socket_and_wait_for_timeout(sock, 0);
1243 if (sockstate == SOCKET_HAS_TIMED_OUT) {
Antoine Pitrouc4df7842010-12-03 19:59:41 +00001244 PyErr_SetString(PySocketModule.timeout_error,
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001245 "The read operation timed out");
1246 goto error;
1247 } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
1248 PyErr_SetString(PySSLErrorObject,
Antoine Pitrou525807b2010-05-12 14:05:24 +00001249 "Underlying socket too large for select().");
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001250 goto error;
1251 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
1252 count = 0;
1253 goto done;
Bill Janssen54cc54c2007-12-14 22:08:56 +00001254 }
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001255 }
1256 do {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001257 PySSL_BEGIN_ALLOW_THREADS
1258 count = SSL_read(self->ssl, mem, len);
1259 err = SSL_get_error(self->ssl, count);
1260 PySSL_END_ALLOW_THREADS
1261 if (PyErr_CheckSignals())
1262 goto error;
1263 if (err == SSL_ERROR_WANT_READ) {
Antoine Pitrou525807b2010-05-12 14:05:24 +00001264 sockstate = check_socket_and_wait_for_timeout(sock, 0);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001265 } else if (err == SSL_ERROR_WANT_WRITE) {
Antoine Pitrou525807b2010-05-12 14:05:24 +00001266 sockstate = check_socket_and_wait_for_timeout(sock, 1);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001267 } else if ((err == SSL_ERROR_ZERO_RETURN) &&
1268 (SSL_get_shutdown(self->ssl) ==
1269 SSL_RECEIVED_SHUTDOWN))
1270 {
1271 count = 0;
1272 goto done;
1273 } else {
1274 sockstate = SOCKET_OPERATION_OK;
1275 }
1276 if (sockstate == SOCKET_HAS_TIMED_OUT) {
Antoine Pitrouc4df7842010-12-03 19:59:41 +00001277 PyErr_SetString(PySocketModule.timeout_error,
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001278 "The read operation timed out");
1279 goto error;
1280 } else if (sockstate == SOCKET_IS_NONBLOCKING) {
1281 break;
1282 }
1283 } while (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE);
1284 if (count <= 0) {
1285 PySSL_SetError(self, count, __FILE__, __LINE__);
1286 goto error;
1287 }
Antoine Pitrou24e561a2010-09-03 18:38:17 +00001288
1289done:
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +00001290 Py_DECREF(sock);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001291 if (!buf_passed) {
Antoine Pitrou24e561a2010-09-03 18:38:17 +00001292 _PyBytes_Resize(&dest, count);
1293 return dest;
1294 }
1295 else {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001296 PyBuffer_Release(&buf);
1297 return PyLong_FromLong(count);
1298 }
Antoine Pitrou24e561a2010-09-03 18:38:17 +00001299
1300error:
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +00001301 Py_DECREF(sock);
Antoine Pitrou24e561a2010-09-03 18:38:17 +00001302 if (!buf_passed)
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +00001303 Py_XDECREF(dest);
Antoine Pitrou24e561a2010-09-03 18:38:17 +00001304 else
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001305 PyBuffer_Release(&buf);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001306 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001307}
1308
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001309PyDoc_STRVAR(PySSL_SSLread_doc,
Bill Janssen6e027db2007-11-15 22:23:56 +00001310"read([len]) -> string\n\
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001311\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001312Read up to len bytes from the SSL socket.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001313
Antoine Pitrou152efa22010-05-16 18:19:27 +00001314static PyObject *PySSL_SSLshutdown(PySSLSocket *self)
Bill Janssen40a0f662008-08-12 16:56:25 +00001315{
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001316 int err, ssl_err, sockstate, nonblocking;
1317 int zeros = 0;
1318 PySocketSockObject *sock
1319 = (PySocketSockObject *) PyWeakref_GetObject(self->Socket);
Bill Janssen40a0f662008-08-12 16:56:25 +00001320
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001321 /* Guard against closed socket */
1322 if ((((PyObject*)sock) == Py_None) || (sock->sock_fd < 0)) {
1323 _setSSLError("Underlying socket connection gone",
1324 PY_SSL_ERROR_NO_SOCKET, __FILE__, __LINE__);
1325 return NULL;
1326 }
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +00001327 Py_INCREF(sock);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001328
1329 /* Just in case the blocking state of the socket has been changed */
1330 nonblocking = (sock->sock_timeout >= 0.0);
1331 BIO_set_nbio(SSL_get_rbio(self->ssl), nonblocking);
1332 BIO_set_nbio(SSL_get_wbio(self->ssl), nonblocking);
1333
1334 while (1) {
1335 PySSL_BEGIN_ALLOW_THREADS
1336 /* Disable read-ahead so that unwrap can work correctly.
1337 * Otherwise OpenSSL might read in too much data,
1338 * eating clear text data that happens to be
1339 * transmitted after the SSL shutdown.
1340 * Should be safe to call repeatedly everytime this
1341 * function is used and the shutdown_seen_zero != 0
1342 * condition is met.
1343 */
1344 if (self->shutdown_seen_zero)
1345 SSL_set_read_ahead(self->ssl, 0);
1346 err = SSL_shutdown(self->ssl);
1347 PySSL_END_ALLOW_THREADS
1348 /* If err == 1, a secure shutdown with SSL_shutdown() is complete */
1349 if (err > 0)
1350 break;
1351 if (err == 0) {
1352 /* Don't loop endlessly; instead preserve legacy
1353 behaviour of trying SSL_shutdown() only twice.
1354 This looks necessary for OpenSSL < 0.9.8m */
1355 if (++zeros > 1)
1356 break;
1357 /* Shutdown was sent, now try receiving */
1358 self->shutdown_seen_zero = 1;
1359 continue;
Bill Janssen40a0f662008-08-12 16:56:25 +00001360 }
1361
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001362 /* Possibly retry shutdown until timeout or failure */
1363 ssl_err = SSL_get_error(self->ssl, err);
1364 if (ssl_err == SSL_ERROR_WANT_READ)
1365 sockstate = check_socket_and_wait_for_timeout(sock, 0);
1366 else if (ssl_err == SSL_ERROR_WANT_WRITE)
1367 sockstate = check_socket_and_wait_for_timeout(sock, 1);
1368 else
1369 break;
1370 if (sockstate == SOCKET_HAS_TIMED_OUT) {
1371 if (ssl_err == SSL_ERROR_WANT_READ)
Antoine Pitrouc4df7842010-12-03 19:59:41 +00001372 PyErr_SetString(PySocketModule.timeout_error,
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001373 "The read operation timed out");
1374 else
Antoine Pitrouc4df7842010-12-03 19:59:41 +00001375 PyErr_SetString(PySocketModule.timeout_error,
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001376 "The write operation timed out");
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +00001377 goto error;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001378 }
1379 else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
1380 PyErr_SetString(PySSLErrorObject,
1381 "Underlying socket too large for select().");
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +00001382 goto error;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001383 }
1384 else if (sockstate != SOCKET_OPERATION_OK)
1385 /* Retain the SSL error code */
1386 break;
1387 }
Antoine Pitrou2c4f98b2010-04-23 00:16:21 +00001388
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +00001389 if (err < 0) {
1390 Py_DECREF(sock);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001391 return PySSL_SetError(self, err, __FILE__, __LINE__);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001392 }
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +00001393 else
1394 /* It's already INCREF'ed */
1395 return (PyObject *) sock;
1396
1397error:
1398 Py_DECREF(sock);
1399 return NULL;
Bill Janssen40a0f662008-08-12 16:56:25 +00001400}
1401
1402PyDoc_STRVAR(PySSL_SSLshutdown_doc,
1403"shutdown(s) -> socket\n\
1404\n\
1405Does the SSL shutdown handshake with the remote end, and returns\n\
1406the underlying socket object.");
1407
Antoine Pitroud6494802011-07-21 01:11:30 +02001408#if HAVE_OPENSSL_FINISHED
1409static PyObject *
1410PySSL_tls_unique_cb(PySSLSocket *self)
1411{
1412 PyObject *retval = NULL;
1413 char buf[PySSL_CB_MAXLEN];
1414 int len;
1415
1416 if (SSL_session_reused(self->ssl) ^ !self->socket_type) {
1417 /* if session is resumed XOR we are the client */
1418 len = SSL_get_finished(self->ssl, buf, PySSL_CB_MAXLEN);
1419 }
1420 else {
1421 /* if a new session XOR we are the server */
1422 len = SSL_get_peer_finished(self->ssl, buf, PySSL_CB_MAXLEN);
1423 }
1424
1425 /* It cannot be negative in current OpenSSL version as of July 2011 */
1426 assert(len >= 0);
1427 if (len == 0)
1428 Py_RETURN_NONE;
1429
1430 retval = PyBytes_FromStringAndSize(buf, len);
1431
1432 return retval;
1433}
1434
1435PyDoc_STRVAR(PySSL_tls_unique_cb_doc,
1436"tls_unique_cb() -> bytes\n\
1437\n\
1438Returns the 'tls-unique' channel binding data, as defined by RFC 5929.\n\
1439\n\
1440If the TLS handshake is not yet complete, None is returned");
1441
1442#endif /* HAVE_OPENSSL_FINISHED */
Bill Janssen40a0f662008-08-12 16:56:25 +00001443
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001444static PyMethodDef PySSLMethods[] = {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001445 {"do_handshake", (PyCFunction)PySSL_SSLdo_handshake, METH_NOARGS},
1446 {"write", (PyCFunction)PySSL_SSLwrite, METH_VARARGS,
1447 PySSL_SSLwrite_doc},
1448 {"read", (PyCFunction)PySSL_SSLread, METH_VARARGS,
1449 PySSL_SSLread_doc},
1450 {"pending", (PyCFunction)PySSL_SSLpending, METH_NOARGS,
1451 PySSL_SSLpending_doc},
1452 {"peer_certificate", (PyCFunction)PySSL_peercert, METH_VARARGS,
1453 PySSL_peercert_doc},
1454 {"cipher", (PyCFunction)PySSL_cipher, METH_NOARGS},
1455 {"shutdown", (PyCFunction)PySSL_SSLshutdown, METH_NOARGS,
1456 PySSL_SSLshutdown_doc},
Antoine Pitroud6494802011-07-21 01:11:30 +02001457#if HAVE_OPENSSL_FINISHED
1458 {"tls_unique_cb", (PyCFunction)PySSL_tls_unique_cb, METH_NOARGS,
1459 PySSL_tls_unique_cb_doc},
1460#endif
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001461 {NULL, NULL}
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001462};
1463
Antoine Pitrou152efa22010-05-16 18:19:27 +00001464static PyTypeObject PySSLSocket_Type = {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001465 PyVarObject_HEAD_INIT(NULL, 0)
Antoine Pitrou152efa22010-05-16 18:19:27 +00001466 "_ssl._SSLSocket", /*tp_name*/
1467 sizeof(PySSLSocket), /*tp_basicsize*/
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001468 0, /*tp_itemsize*/
1469 /* methods */
1470 (destructor)PySSL_dealloc, /*tp_dealloc*/
1471 0, /*tp_print*/
1472 0, /*tp_getattr*/
1473 0, /*tp_setattr*/
1474 0, /*tp_reserved*/
1475 0, /*tp_repr*/
1476 0, /*tp_as_number*/
1477 0, /*tp_as_sequence*/
1478 0, /*tp_as_mapping*/
1479 0, /*tp_hash*/
1480 0, /*tp_call*/
1481 0, /*tp_str*/
1482 0, /*tp_getattro*/
1483 0, /*tp_setattro*/
1484 0, /*tp_as_buffer*/
1485 Py_TPFLAGS_DEFAULT, /*tp_flags*/
1486 0, /*tp_doc*/
1487 0, /*tp_traverse*/
1488 0, /*tp_clear*/
1489 0, /*tp_richcompare*/
1490 0, /*tp_weaklistoffset*/
1491 0, /*tp_iter*/
1492 0, /*tp_iternext*/
1493 PySSLMethods, /*tp_methods*/
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001494};
1495
Antoine Pitrou152efa22010-05-16 18:19:27 +00001496
1497/*
1498 * _SSLContext objects
1499 */
1500
1501static PyObject *
1502context_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1503{
1504 char *kwlist[] = {"protocol", NULL};
1505 PySSLContext *self;
1506 int proto_version = PY_SSL_VERSION_SSL23;
1507 SSL_CTX *ctx = NULL;
1508
1509 if (!PyArg_ParseTupleAndKeywords(
1510 args, kwds, "i:_SSLContext", kwlist,
1511 &proto_version))
1512 return NULL;
1513
1514 PySSL_BEGIN_ALLOW_THREADS
1515 if (proto_version == PY_SSL_VERSION_TLS1)
1516 ctx = SSL_CTX_new(TLSv1_method());
1517 else if (proto_version == PY_SSL_VERSION_SSL3)
1518 ctx = SSL_CTX_new(SSLv3_method());
Victor Stinner3de49192011-05-09 00:42:58 +02001519#ifndef OPENSSL_NO_SSL2
Antoine Pitrou152efa22010-05-16 18:19:27 +00001520 else if (proto_version == PY_SSL_VERSION_SSL2)
1521 ctx = SSL_CTX_new(SSLv2_method());
Victor Stinner3de49192011-05-09 00:42:58 +02001522#endif
Antoine Pitrou152efa22010-05-16 18:19:27 +00001523 else if (proto_version == PY_SSL_VERSION_SSL23)
1524 ctx = SSL_CTX_new(SSLv23_method());
1525 else
1526 proto_version = -1;
1527 PySSL_END_ALLOW_THREADS
1528
1529 if (proto_version == -1) {
1530 PyErr_SetString(PyExc_ValueError,
1531 "invalid protocol version");
1532 return NULL;
1533 }
1534 if (ctx == NULL) {
1535 PyErr_SetString(PySSLErrorObject,
1536 "failed to allocate SSL context");
1537 return NULL;
1538 }
1539
1540 assert(type != NULL && type->tp_alloc != NULL);
1541 self = (PySSLContext *) type->tp_alloc(type, 0);
1542 if (self == NULL) {
1543 SSL_CTX_free(ctx);
1544 return NULL;
1545 }
1546 self->ctx = ctx;
1547 /* Defaults */
1548 SSL_CTX_set_verify(self->ctx, SSL_VERIFY_NONE, NULL);
1549 SSL_CTX_set_options(self->ctx, SSL_OP_ALL);
1550
Antoine Pitroufc113ee2010-10-13 12:46:13 +00001551#define SID_CTX "Python"
1552 SSL_CTX_set_session_id_context(self->ctx, (const unsigned char *) SID_CTX,
1553 sizeof(SID_CTX));
1554#undef SID_CTX
1555
Antoine Pitrou152efa22010-05-16 18:19:27 +00001556 return (PyObject *)self;
1557}
1558
1559static void
1560context_dealloc(PySSLContext *self)
1561{
1562 SSL_CTX_free(self->ctx);
1563 Py_TYPE(self)->tp_free(self);
1564}
1565
1566static PyObject *
1567set_ciphers(PySSLContext *self, PyObject *args)
1568{
1569 int ret;
1570 const char *cipherlist;
1571
1572 if (!PyArg_ParseTuple(args, "s:set_ciphers", &cipherlist))
1573 return NULL;
1574 ret = SSL_CTX_set_cipher_list(self->ctx, cipherlist);
1575 if (ret == 0) {
Antoine Pitrou65ec8ae2010-05-16 19:56:32 +00001576 /* Clearing the error queue is necessary on some OpenSSL versions,
1577 otherwise the error will be reported again when another SSL call
1578 is done. */
1579 ERR_clear_error();
Antoine Pitrou152efa22010-05-16 18:19:27 +00001580 PyErr_SetString(PySSLErrorObject,
1581 "No cipher can be selected.");
1582 return NULL;
1583 }
1584 Py_RETURN_NONE;
1585}
1586
1587static PyObject *
1588get_verify_mode(PySSLContext *self, void *c)
1589{
1590 switch (SSL_CTX_get_verify_mode(self->ctx)) {
1591 case SSL_VERIFY_NONE:
1592 return PyLong_FromLong(PY_SSL_CERT_NONE);
1593 case SSL_VERIFY_PEER:
1594 return PyLong_FromLong(PY_SSL_CERT_OPTIONAL);
1595 case SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT:
1596 return PyLong_FromLong(PY_SSL_CERT_REQUIRED);
1597 }
1598 PyErr_SetString(PySSLErrorObject,
1599 "invalid return value from SSL_CTX_get_verify_mode");
1600 return NULL;
1601}
1602
1603static int
1604set_verify_mode(PySSLContext *self, PyObject *arg, void *c)
1605{
1606 int n, mode;
1607 if (!PyArg_Parse(arg, "i", &n))
1608 return -1;
1609 if (n == PY_SSL_CERT_NONE)
1610 mode = SSL_VERIFY_NONE;
1611 else if (n == PY_SSL_CERT_OPTIONAL)
1612 mode = SSL_VERIFY_PEER;
1613 else if (n == PY_SSL_CERT_REQUIRED)
1614 mode = SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT;
1615 else {
1616 PyErr_SetString(PyExc_ValueError,
1617 "invalid value for verify_mode");
1618 return -1;
1619 }
1620 SSL_CTX_set_verify(self->ctx, mode, NULL);
1621 return 0;
1622}
1623
1624static PyObject *
Antoine Pitroub5218772010-05-21 09:56:06 +00001625get_options(PySSLContext *self, void *c)
1626{
1627 return PyLong_FromLong(SSL_CTX_get_options(self->ctx));
1628}
1629
1630static int
1631set_options(PySSLContext *self, PyObject *arg, void *c)
1632{
1633 long new_opts, opts, set, clear;
1634 if (!PyArg_Parse(arg, "l", &new_opts))
1635 return -1;
1636 opts = SSL_CTX_get_options(self->ctx);
1637 clear = opts & ~new_opts;
1638 set = ~opts & new_opts;
1639 if (clear) {
1640#ifdef HAVE_SSL_CTX_CLEAR_OPTIONS
1641 SSL_CTX_clear_options(self->ctx, clear);
1642#else
1643 PyErr_SetString(PyExc_ValueError,
1644 "can't clear options before OpenSSL 0.9.8m");
1645 return -1;
1646#endif
1647 }
1648 if (set)
1649 SSL_CTX_set_options(self->ctx, set);
1650 return 0;
1651}
1652
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +02001653typedef struct {
1654 PyThreadState *thread_state;
1655 PyObject *callable;
1656 char *password;
1657 Py_ssize_t size;
1658 int error;
1659} _PySSLPasswordInfo;
1660
1661static int
1662_pwinfo_set(_PySSLPasswordInfo *pw_info, PyObject* password,
1663 const char *bad_type_error)
1664{
1665 /* Set the password and size fields of a _PySSLPasswordInfo struct
1666 from a unicode, bytes, or byte array object.
1667 The password field will be dynamically allocated and must be freed
1668 by the caller */
1669 PyObject *password_bytes = NULL;
1670 const char *data = NULL;
1671 Py_ssize_t size;
1672
1673 if (PyUnicode_Check(password)) {
1674 password_bytes = PyUnicode_AsEncodedString(password, NULL, NULL);
1675 if (!password_bytes) {
1676 goto error;
1677 }
1678 data = PyBytes_AS_STRING(password_bytes);
1679 size = PyBytes_GET_SIZE(password_bytes);
1680 } else if (PyBytes_Check(password)) {
1681 data = PyBytes_AS_STRING(password);
1682 size = PyBytes_GET_SIZE(password);
1683 } else if (PyByteArray_Check(password)) {
1684 data = PyByteArray_AS_STRING(password);
1685 size = PyByteArray_GET_SIZE(password);
1686 } else {
1687 PyErr_SetString(PyExc_TypeError, bad_type_error);
1688 goto error;
1689 }
1690
1691 free(pw_info->password);
1692 pw_info->password = malloc(size);
1693 if (!pw_info->password) {
1694 PyErr_SetString(PyExc_MemoryError,
1695 "unable to allocate password buffer");
1696 goto error;
1697 }
1698 memcpy(pw_info->password, data, size);
1699 pw_info->size = size;
1700
1701 Py_XDECREF(password_bytes);
1702 return 1;
1703
1704error:
1705 Py_XDECREF(password_bytes);
1706 return 0;
1707}
1708
1709static int
1710_password_callback(char *buf, int size, int rwflag, void *userdata)
1711{
1712 _PySSLPasswordInfo *pw_info = (_PySSLPasswordInfo*) userdata;
1713 PyObject *fn_ret = NULL;
1714
1715 PySSL_END_ALLOW_THREADS_S(pw_info->thread_state);
1716
1717 if (pw_info->callable) {
1718 fn_ret = PyObject_CallFunctionObjArgs(pw_info->callable, NULL);
1719 if (!fn_ret) {
1720 /* TODO: It would be nice to move _ctypes_add_traceback() into the
1721 core python API, so we could use it to add a frame here */
1722 goto error;
1723 }
1724
1725 if (!_pwinfo_set(pw_info, fn_ret,
1726 "password callback must return a string")) {
1727 goto error;
1728 }
1729 Py_CLEAR(fn_ret);
1730 }
1731
1732 if (pw_info->size > size) {
1733 PyErr_Format(PyExc_ValueError,
1734 "password cannot be longer than %d bytes", size);
1735 goto error;
1736 }
1737
1738 PySSL_BEGIN_ALLOW_THREADS_S(pw_info->thread_state);
1739 memcpy(buf, pw_info->password, pw_info->size);
1740 return pw_info->size;
1741
1742error:
1743 Py_XDECREF(fn_ret);
1744 PySSL_BEGIN_ALLOW_THREADS_S(pw_info->thread_state);
1745 pw_info->error = 1;
1746 return -1;
1747}
1748
Antoine Pitroub5218772010-05-21 09:56:06 +00001749static PyObject *
Antoine Pitrou152efa22010-05-16 18:19:27 +00001750load_cert_chain(PySSLContext *self, PyObject *args, PyObject *kwds)
1751{
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +02001752 char *kwlist[] = {"certfile", "keyfile", "password", NULL};
1753 PyObject *certfile, *keyfile = NULL, *password = NULL;
Antoine Pitrou152efa22010-05-16 18:19:27 +00001754 PyObject *certfile_bytes = NULL, *keyfile_bytes = NULL;
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +02001755 pem_password_cb *orig_passwd_cb = self->ctx->default_passwd_callback;
1756 void *orig_passwd_userdata = self->ctx->default_passwd_callback_userdata;
1757 _PySSLPasswordInfo pw_info = { NULL, NULL, NULL, 0, 0 };
Antoine Pitrou152efa22010-05-16 18:19:27 +00001758 int r;
1759
Giampaolo Rodolà745ab382010-08-29 19:25:49 +00001760 errno = 0;
Antoine Pitrou67e8e562010-09-01 20:55:41 +00001761 ERR_clear_error();
Antoine Pitrou152efa22010-05-16 18:19:27 +00001762 if (!PyArg_ParseTupleAndKeywords(args, kwds,
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +02001763 "O|OO:load_cert_chain", kwlist,
1764 &certfile, &keyfile, &password))
Antoine Pitrou152efa22010-05-16 18:19:27 +00001765 return NULL;
1766 if (keyfile == Py_None)
1767 keyfile = NULL;
1768 if (!PyUnicode_FSConverter(certfile, &certfile_bytes)) {
1769 PyErr_SetString(PyExc_TypeError,
1770 "certfile should be a valid filesystem path");
1771 return NULL;
1772 }
1773 if (keyfile && !PyUnicode_FSConverter(keyfile, &keyfile_bytes)) {
1774 PyErr_SetString(PyExc_TypeError,
1775 "keyfile should be a valid filesystem path");
1776 goto error;
1777 }
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +02001778 if (password && password != Py_None) {
1779 if (PyCallable_Check(password)) {
1780 pw_info.callable = password;
1781 } else if (!_pwinfo_set(&pw_info, password,
1782 "password should be a string or callable")) {
1783 goto error;
1784 }
1785 SSL_CTX_set_default_passwd_cb(self->ctx, _password_callback);
1786 SSL_CTX_set_default_passwd_cb_userdata(self->ctx, &pw_info);
1787 }
1788 PySSL_BEGIN_ALLOW_THREADS_S(pw_info.thread_state);
Antoine Pitrou152efa22010-05-16 18:19:27 +00001789 r = SSL_CTX_use_certificate_chain_file(self->ctx,
1790 PyBytes_AS_STRING(certfile_bytes));
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +02001791 PySSL_END_ALLOW_THREADS_S(pw_info.thread_state);
Antoine Pitrou152efa22010-05-16 18:19:27 +00001792 if (r != 1) {
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +02001793 if (pw_info.error) {
1794 ERR_clear_error();
1795 /* the password callback has already set the error information */
1796 }
1797 else if (errno != 0) {
Giampaolo Rodolàe0f98632010-09-01 19:28:49 +00001798 ERR_clear_error();
Giampaolo Rodolà745ab382010-08-29 19:25:49 +00001799 PyErr_SetFromErrno(PyExc_IOError);
1800 }
1801 else {
1802 _setSSLError(NULL, 0, __FILE__, __LINE__);
1803 }
Antoine Pitrou152efa22010-05-16 18:19:27 +00001804 goto error;
1805 }
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +02001806 PySSL_BEGIN_ALLOW_THREADS_S(pw_info.thread_state);
Antoine Pitrou9c254862011-04-03 18:15:34 +02001807 r = SSL_CTX_use_PrivateKey_file(self->ctx,
Antoine Pitrou152efa22010-05-16 18:19:27 +00001808 PyBytes_AS_STRING(keyfile ? keyfile_bytes : certfile_bytes),
1809 SSL_FILETYPE_PEM);
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +02001810 PySSL_END_ALLOW_THREADS_S(pw_info.thread_state);
1811 Py_CLEAR(keyfile_bytes);
1812 Py_CLEAR(certfile_bytes);
Antoine Pitrou152efa22010-05-16 18:19:27 +00001813 if (r != 1) {
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +02001814 if (pw_info.error) {
1815 ERR_clear_error();
1816 /* the password callback has already set the error information */
1817 }
1818 else if (errno != 0) {
Giampaolo Rodolàe0f98632010-09-01 19:28:49 +00001819 ERR_clear_error();
Giampaolo Rodolà745ab382010-08-29 19:25:49 +00001820 PyErr_SetFromErrno(PyExc_IOError);
1821 }
1822 else {
1823 _setSSLError(NULL, 0, __FILE__, __LINE__);
1824 }
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +02001825 goto error;
Antoine Pitrou152efa22010-05-16 18:19:27 +00001826 }
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +02001827 PySSL_BEGIN_ALLOW_THREADS_S(pw_info.thread_state);
Antoine Pitrou152efa22010-05-16 18:19:27 +00001828 r = SSL_CTX_check_private_key(self->ctx);
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +02001829 PySSL_END_ALLOW_THREADS_S(pw_info.thread_state);
Antoine Pitrou152efa22010-05-16 18:19:27 +00001830 if (r != 1) {
1831 _setSSLError(NULL, 0, __FILE__, __LINE__);
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +02001832 goto error;
Antoine Pitrou152efa22010-05-16 18:19:27 +00001833 }
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +02001834 SSL_CTX_set_default_passwd_cb(self->ctx, orig_passwd_cb);
1835 SSL_CTX_set_default_passwd_cb_userdata(self->ctx, orig_passwd_userdata);
1836 free(pw_info.password);
Antoine Pitrou152efa22010-05-16 18:19:27 +00001837 Py_RETURN_NONE;
1838
1839error:
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +02001840 SSL_CTX_set_default_passwd_cb(self->ctx, orig_passwd_cb);
1841 SSL_CTX_set_default_passwd_cb_userdata(self->ctx, orig_passwd_userdata);
1842 free(pw_info.password);
Antoine Pitrou152efa22010-05-16 18:19:27 +00001843 Py_XDECREF(keyfile_bytes);
1844 Py_XDECREF(certfile_bytes);
1845 return NULL;
1846}
1847
1848static PyObject *
1849load_verify_locations(PySSLContext *self, PyObject *args, PyObject *kwds)
1850{
1851 char *kwlist[] = {"cafile", "capath", NULL};
1852 PyObject *cafile = NULL, *capath = NULL;
1853 PyObject *cafile_bytes = NULL, *capath_bytes = NULL;
1854 const char *cafile_buf = NULL, *capath_buf = NULL;
1855 int r;
1856
Giampaolo Rodolà745ab382010-08-29 19:25:49 +00001857 errno = 0;
Antoine Pitrou152efa22010-05-16 18:19:27 +00001858 if (!PyArg_ParseTupleAndKeywords(args, kwds,
1859 "|OO:load_verify_locations", kwlist,
1860 &cafile, &capath))
1861 return NULL;
1862 if (cafile == Py_None)
1863 cafile = NULL;
1864 if (capath == Py_None)
1865 capath = NULL;
1866 if (cafile == NULL && capath == NULL) {
1867 PyErr_SetString(PyExc_TypeError,
1868 "cafile and capath cannot be both omitted");
1869 return NULL;
1870 }
1871 if (cafile && !PyUnicode_FSConverter(cafile, &cafile_bytes)) {
1872 PyErr_SetString(PyExc_TypeError,
1873 "cafile should be a valid filesystem path");
1874 return NULL;
1875 }
1876 if (capath && !PyUnicode_FSConverter(capath, &capath_bytes)) {
Victor Stinner80f75e62011-01-29 11:31:20 +00001877 Py_XDECREF(cafile_bytes);
Antoine Pitrou152efa22010-05-16 18:19:27 +00001878 PyErr_SetString(PyExc_TypeError,
1879 "capath should be a valid filesystem path");
1880 return NULL;
1881 }
1882 if (cafile)
1883 cafile_buf = PyBytes_AS_STRING(cafile_bytes);
1884 if (capath)
1885 capath_buf = PyBytes_AS_STRING(capath_bytes);
1886 PySSL_BEGIN_ALLOW_THREADS
1887 r = SSL_CTX_load_verify_locations(self->ctx, cafile_buf, capath_buf);
1888 PySSL_END_ALLOW_THREADS
1889 Py_XDECREF(cafile_bytes);
1890 Py_XDECREF(capath_bytes);
1891 if (r != 1) {
Giampaolo Rodolà745ab382010-08-29 19:25:49 +00001892 if (errno != 0) {
Giampaolo Rodolàe0f98632010-09-01 19:28:49 +00001893 ERR_clear_error();
Giampaolo Rodolà745ab382010-08-29 19:25:49 +00001894 PyErr_SetFromErrno(PyExc_IOError);
1895 }
1896 else {
1897 _setSSLError(NULL, 0, __FILE__, __LINE__);
1898 }
Antoine Pitrou152efa22010-05-16 18:19:27 +00001899 return NULL;
1900 }
1901 Py_RETURN_NONE;
1902}
1903
1904static PyObject *
1905context_wrap_socket(PySSLContext *self, PyObject *args, PyObject *kwds)
1906{
Antoine Pitroud5323212010-10-22 18:19:07 +00001907 char *kwlist[] = {"sock", "server_side", "server_hostname", NULL};
Antoine Pitrou152efa22010-05-16 18:19:27 +00001908 PySocketSockObject *sock;
1909 int server_side = 0;
Antoine Pitroud5323212010-10-22 18:19:07 +00001910 char *hostname = NULL;
1911 PyObject *hostname_obj, *res;
Antoine Pitrou152efa22010-05-16 18:19:27 +00001912
Antoine Pitroud5323212010-10-22 18:19:07 +00001913 /* server_hostname is either None (or absent), or to be encoded
1914 using the idna encoding. */
1915 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O!i|O!:_wrap_socket", kwlist,
Antoine Pitrou152efa22010-05-16 18:19:27 +00001916 PySocketModule.Sock_Type,
Antoine Pitroud5323212010-10-22 18:19:07 +00001917 &sock, &server_side,
1918 Py_TYPE(Py_None), &hostname_obj)) {
1919 PyErr_Clear();
1920 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O!iet:_wrap_socket", kwlist,
1921 PySocketModule.Sock_Type,
1922 &sock, &server_side,
1923 "idna", &hostname))
1924 return NULL;
1925#ifndef SSL_CTRL_SET_TLSEXT_HOSTNAME
1926 PyMem_Free(hostname);
1927 PyErr_SetString(PyExc_ValueError, "server_hostname is not supported "
1928 "by your OpenSSL library");
Antoine Pitrou152efa22010-05-16 18:19:27 +00001929 return NULL;
Antoine Pitroud5323212010-10-22 18:19:07 +00001930#endif
1931 }
Antoine Pitrou152efa22010-05-16 18:19:27 +00001932
Antoine Pitroud5323212010-10-22 18:19:07 +00001933 res = (PyObject *) newPySSLSocket(self->ctx, sock, server_side,
1934 hostname);
1935 if (hostname != NULL)
1936 PyMem_Free(hostname);
1937 return res;
Antoine Pitrou152efa22010-05-16 18:19:27 +00001938}
1939
Antoine Pitroub0182c82010-10-12 20:09:02 +00001940static PyObject *
1941session_stats(PySSLContext *self, PyObject *unused)
1942{
1943 int r;
1944 PyObject *value, *stats = PyDict_New();
1945 if (!stats)
1946 return NULL;
1947
1948#define ADD_STATS(SSL_NAME, KEY_NAME) \
1949 value = PyLong_FromLong(SSL_CTX_sess_ ## SSL_NAME (self->ctx)); \
1950 if (value == NULL) \
1951 goto error; \
1952 r = PyDict_SetItemString(stats, KEY_NAME, value); \
1953 Py_DECREF(value); \
1954 if (r < 0) \
1955 goto error;
1956
1957 ADD_STATS(number, "number");
1958 ADD_STATS(connect, "connect");
1959 ADD_STATS(connect_good, "connect_good");
1960 ADD_STATS(connect_renegotiate, "connect_renegotiate");
1961 ADD_STATS(accept, "accept");
1962 ADD_STATS(accept_good, "accept_good");
1963 ADD_STATS(accept_renegotiate, "accept_renegotiate");
1964 ADD_STATS(accept, "accept");
1965 ADD_STATS(hits, "hits");
1966 ADD_STATS(misses, "misses");
1967 ADD_STATS(timeouts, "timeouts");
1968 ADD_STATS(cache_full, "cache_full");
1969
1970#undef ADD_STATS
1971
1972 return stats;
1973
1974error:
1975 Py_DECREF(stats);
1976 return NULL;
1977}
1978
Antoine Pitrou664c2d12010-11-17 20:29:42 +00001979static PyObject *
1980set_default_verify_paths(PySSLContext *self, PyObject *unused)
1981{
1982 if (!SSL_CTX_set_default_verify_paths(self->ctx)) {
1983 _setSSLError(NULL, 0, __FILE__, __LINE__);
1984 return NULL;
1985 }
1986 Py_RETURN_NONE;
1987}
1988
Antoine Pitrou152efa22010-05-16 18:19:27 +00001989static PyGetSetDef context_getsetlist[] = {
Antoine Pitroub5218772010-05-21 09:56:06 +00001990 {"options", (getter) get_options,
1991 (setter) set_options, NULL},
Antoine Pitrou152efa22010-05-16 18:19:27 +00001992 {"verify_mode", (getter) get_verify_mode,
1993 (setter) set_verify_mode, NULL},
1994 {NULL}, /* sentinel */
1995};
1996
1997static struct PyMethodDef context_methods[] = {
1998 {"_wrap_socket", (PyCFunction) context_wrap_socket,
1999 METH_VARARGS | METH_KEYWORDS, NULL},
2000 {"set_ciphers", (PyCFunction) set_ciphers,
2001 METH_VARARGS, NULL},
2002 {"load_cert_chain", (PyCFunction) load_cert_chain,
2003 METH_VARARGS | METH_KEYWORDS, NULL},
2004 {"load_verify_locations", (PyCFunction) load_verify_locations,
2005 METH_VARARGS | METH_KEYWORDS, NULL},
Antoine Pitroub0182c82010-10-12 20:09:02 +00002006 {"session_stats", (PyCFunction) session_stats,
2007 METH_NOARGS, NULL},
Antoine Pitrou664c2d12010-11-17 20:29:42 +00002008 {"set_default_verify_paths", (PyCFunction) set_default_verify_paths,
2009 METH_NOARGS, NULL},
Antoine Pitrou152efa22010-05-16 18:19:27 +00002010 {NULL, NULL} /* sentinel */
2011};
2012
2013static PyTypeObject PySSLContext_Type = {
2014 PyVarObject_HEAD_INIT(NULL, 0)
2015 "_ssl._SSLContext", /*tp_name*/
2016 sizeof(PySSLContext), /*tp_basicsize*/
2017 0, /*tp_itemsize*/
2018 (destructor)context_dealloc, /*tp_dealloc*/
2019 0, /*tp_print*/
2020 0, /*tp_getattr*/
2021 0, /*tp_setattr*/
2022 0, /*tp_reserved*/
2023 0, /*tp_repr*/
2024 0, /*tp_as_number*/
2025 0, /*tp_as_sequence*/
2026 0, /*tp_as_mapping*/
2027 0, /*tp_hash*/
2028 0, /*tp_call*/
2029 0, /*tp_str*/
2030 0, /*tp_getattro*/
2031 0, /*tp_setattro*/
2032 0, /*tp_as_buffer*/
2033 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
2034 0, /*tp_doc*/
2035 0, /*tp_traverse*/
2036 0, /*tp_clear*/
2037 0, /*tp_richcompare*/
2038 0, /*tp_weaklistoffset*/
2039 0, /*tp_iter*/
2040 0, /*tp_iternext*/
2041 context_methods, /*tp_methods*/
2042 0, /*tp_members*/
2043 context_getsetlist, /*tp_getset*/
2044 0, /*tp_base*/
2045 0, /*tp_dict*/
2046 0, /*tp_descr_get*/
2047 0, /*tp_descr_set*/
2048 0, /*tp_dictoffset*/
2049 0, /*tp_init*/
2050 0, /*tp_alloc*/
2051 context_new, /*tp_new*/
2052};
2053
2054
2055
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002056#ifdef HAVE_OPENSSL_RAND
2057
2058/* helper routines for seeding the SSL PRNG */
2059static PyObject *
2060PySSL_RAND_add(PyObject *self, PyObject *args)
2061{
2062 char *buf;
2063 int len;
2064 double entropy;
2065
2066 if (!PyArg_ParseTuple(args, "s#d:RAND_add", &buf, &len, &entropy))
Antoine Pitrou525807b2010-05-12 14:05:24 +00002067 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002068 RAND_add(buf, len, entropy);
2069 Py_INCREF(Py_None);
2070 return Py_None;
2071}
2072
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002073PyDoc_STRVAR(PySSL_RAND_add_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002074"RAND_add(string, entropy)\n\
2075\n\
2076Mix string into the OpenSSL PRNG state. entropy (a float) is a lower\n\
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002077bound on the entropy contained in string. See RFC 1750.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002078
2079static PyObject *
Victor Stinner99c8b162011-05-24 12:05:19 +02002080PySSL_RAND(int len, int pseudo)
2081{
2082 int ok;
2083 PyObject *bytes;
2084 unsigned long err;
2085 const char *errstr;
2086 PyObject *v;
2087
2088 bytes = PyBytes_FromStringAndSize(NULL, len);
2089 if (bytes == NULL)
2090 return NULL;
2091 if (pseudo) {
2092 ok = RAND_pseudo_bytes((unsigned char*)PyBytes_AS_STRING(bytes), len);
2093 if (ok == 0 || ok == 1)
2094 return Py_BuildValue("NO", bytes, ok == 1 ? Py_True : Py_False);
2095 }
2096 else {
2097 ok = RAND_bytes((unsigned char*)PyBytes_AS_STRING(bytes), len);
2098 if (ok == 1)
2099 return bytes;
2100 }
2101 Py_DECREF(bytes);
2102
2103 err = ERR_get_error();
2104 errstr = ERR_reason_error_string(err);
2105 v = Py_BuildValue("(ks)", err, errstr);
2106 if (v != NULL) {
2107 PyErr_SetObject(PySSLErrorObject, v);
2108 Py_DECREF(v);
2109 }
2110 return NULL;
2111}
2112
2113static PyObject *
2114PySSL_RAND_bytes(PyObject *self, PyObject *args)
2115{
2116 int len;
2117 if (!PyArg_ParseTuple(args, "i:RAND_bytes", &len))
2118 return NULL;
2119 return PySSL_RAND(len, 0);
2120}
2121
2122PyDoc_STRVAR(PySSL_RAND_bytes_doc,
2123"RAND_bytes(n) -> bytes\n\
2124\n\
2125Generate n cryptographically strong pseudo-random bytes.");
2126
2127static PyObject *
2128PySSL_RAND_pseudo_bytes(PyObject *self, PyObject *args)
2129{
2130 int len;
2131 if (!PyArg_ParseTuple(args, "i:RAND_pseudo_bytes", &len))
2132 return NULL;
2133 return PySSL_RAND(len, 1);
2134}
2135
2136PyDoc_STRVAR(PySSL_RAND_pseudo_bytes_doc,
2137"RAND_pseudo_bytes(n) -> (bytes, is_cryptographic)\n\
2138\n\
2139Generate n pseudo-random bytes. is_cryptographic is True if the bytes\
2140generated are cryptographically strong.");
2141
2142static PyObject *
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002143PySSL_RAND_status(PyObject *self)
2144{
Christian Heimes217cfd12007-12-02 14:31:20 +00002145 return PyLong_FromLong(RAND_status());
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002146}
2147
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002148PyDoc_STRVAR(PySSL_RAND_status_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002149"RAND_status() -> 0 or 1\n\
2150\n\
Bill Janssen6e027db2007-11-15 22:23:56 +00002151Returns 1 if the OpenSSL PRNG has been seeded with enough data and 0 if not.\n\
2152It is necessary to seed the PRNG with RAND_add() on some platforms before\n\
2153using the ssl() function.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002154
2155static PyObject *
Victor Stinnerf9faaad2010-05-16 21:36:37 +00002156PySSL_RAND_egd(PyObject *self, PyObject *args)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002157{
Victor Stinnerf9faaad2010-05-16 21:36:37 +00002158 PyObject *path;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002159 int bytes;
2160
Victor Stinnerf9faaad2010-05-16 21:36:37 +00002161 if (!PyArg_ParseTuple(args, "O&|i:RAND_egd",
2162 PyUnicode_FSConverter, &path))
2163 return NULL;
2164
2165 bytes = RAND_egd(PyBytes_AsString(path));
2166 Py_DECREF(path);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002167 if (bytes == -1) {
Antoine Pitrou525807b2010-05-12 14:05:24 +00002168 PyErr_SetString(PySSLErrorObject,
2169 "EGD connection failed or EGD did not return "
2170 "enough data to seed the PRNG");
2171 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002172 }
Christian Heimes217cfd12007-12-02 14:31:20 +00002173 return PyLong_FromLong(bytes);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002174}
2175
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002176PyDoc_STRVAR(PySSL_RAND_egd_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002177"RAND_egd(path) -> bytes\n\
2178\n\
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002179Queries the entropy gather daemon (EGD) on the socket named by 'path'.\n\
2180Returns number of bytes read. Raises SSLError if connection to EGD\n\
2181fails or if it does provide enough data to seed PRNG.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002182
2183#endif
2184
Bill Janssen40a0f662008-08-12 16:56:25 +00002185
2186
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002187/* List of functions exported by this module. */
2188
2189static PyMethodDef PySSL_methods[] = {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002190 {"_test_decode_cert", PySSL_test_decode_certificate,
2191 METH_VARARGS},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002192#ifdef HAVE_OPENSSL_RAND
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002193 {"RAND_add", PySSL_RAND_add, METH_VARARGS,
2194 PySSL_RAND_add_doc},
Victor Stinner99c8b162011-05-24 12:05:19 +02002195 {"RAND_bytes", PySSL_RAND_bytes, METH_VARARGS,
2196 PySSL_RAND_bytes_doc},
2197 {"RAND_pseudo_bytes", PySSL_RAND_pseudo_bytes, METH_VARARGS,
2198 PySSL_RAND_pseudo_bytes_doc},
Victor Stinnerf9faaad2010-05-16 21:36:37 +00002199 {"RAND_egd", PySSL_RAND_egd, METH_VARARGS,
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002200 PySSL_RAND_egd_doc},
2201 {"RAND_status", (PyCFunction)PySSL_RAND_status, METH_NOARGS,
2202 PySSL_RAND_status_doc},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002203#endif
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002204 {NULL, NULL} /* Sentinel */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002205};
2206
2207
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002208#ifdef WITH_THREAD
2209
2210/* an implementation of OpenSSL threading operations in terms
2211 of the Python C thread library */
2212
2213static PyThread_type_lock *_ssl_locks = NULL;
2214
2215static unsigned long _ssl_thread_id_function (void) {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002216 return PyThread_get_thread_ident();
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002217}
2218
Bill Janssen6e027db2007-11-15 22:23:56 +00002219static void _ssl_thread_locking_function
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002220 (int mode, int n, const char *file, int line) {
2221 /* this function is needed to perform locking on shared data
2222 structures. (Note that OpenSSL uses a number of global data
2223 structures that will be implicitly shared whenever multiple
2224 threads use OpenSSL.) Multi-threaded applications will
2225 crash at random if it is not set.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002226
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002227 locking_function() must be able to handle up to
2228 CRYPTO_num_locks() different mutex locks. It sets the n-th
2229 lock if mode & CRYPTO_LOCK, and releases it otherwise.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002230
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002231 file and line are the file number of the function setting the
2232 lock. They can be useful for debugging.
2233 */
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002234
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002235 if ((_ssl_locks == NULL) ||
2236 (n < 0) || ((unsigned)n >= _ssl_locks_count))
2237 return;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002238
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002239 if (mode & CRYPTO_LOCK) {
2240 PyThread_acquire_lock(_ssl_locks[n], 1);
2241 } else {
2242 PyThread_release_lock(_ssl_locks[n]);
2243 }
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002244}
2245
2246static int _setup_ssl_threads(void) {
2247
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002248 unsigned int i;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002249
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002250 if (_ssl_locks == NULL) {
2251 _ssl_locks_count = CRYPTO_num_locks();
2252 _ssl_locks = (PyThread_type_lock *)
2253 malloc(sizeof(PyThread_type_lock) * _ssl_locks_count);
2254 if (_ssl_locks == NULL)
2255 return 0;
2256 memset(_ssl_locks, 0,
2257 sizeof(PyThread_type_lock) * _ssl_locks_count);
2258 for (i = 0; i < _ssl_locks_count; i++) {
2259 _ssl_locks[i] = PyThread_allocate_lock();
2260 if (_ssl_locks[i] == NULL) {
2261 unsigned int j;
2262 for (j = 0; j < i; j++) {
2263 PyThread_free_lock(_ssl_locks[j]);
2264 }
2265 free(_ssl_locks);
2266 return 0;
2267 }
2268 }
2269 CRYPTO_set_locking_callback(_ssl_thread_locking_function);
2270 CRYPTO_set_id_callback(_ssl_thread_id_function);
2271 }
2272 return 1;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002273}
2274
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002275#endif /* def HAVE_THREAD */
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002276
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002277PyDoc_STRVAR(module_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002278"Implementation module for SSL socket operations. See the socket module\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002279for documentation.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002280
Martin v. Löwis1a214512008-06-11 05:26:20 +00002281
2282static struct PyModuleDef _sslmodule = {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002283 PyModuleDef_HEAD_INIT,
2284 "_ssl",
2285 module_doc,
2286 -1,
2287 PySSL_methods,
2288 NULL,
2289 NULL,
2290 NULL,
2291 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00002292};
2293
Antoine Pitroub9ac25d2011-07-08 18:47:06 +02002294
2295static void
2296parse_openssl_version(unsigned long libver,
2297 unsigned int *major, unsigned int *minor,
2298 unsigned int *fix, unsigned int *patch,
2299 unsigned int *status)
2300{
2301 *status = libver & 0xF;
2302 libver >>= 4;
2303 *patch = libver & 0xFF;
2304 libver >>= 8;
2305 *fix = libver & 0xFF;
2306 libver >>= 8;
2307 *minor = libver & 0xFF;
2308 libver >>= 8;
2309 *major = libver & 0xFF;
2310}
2311
Antoine Pitroua0e0e232011-10-22 23:41:52 +02002312PyDoc_STRVAR(SSLError_doc,
2313"An error occurred in the SSL implementation.");
2314
Antoine Pitrou41032a62011-10-27 23:56:55 +02002315PyDoc_STRVAR(SSLZeroReturnError_doc,
2316"SSL/TLS session closed cleanly.");
2317
2318PyDoc_STRVAR(SSLWantReadError_doc,
2319"Non-blocking SSL socket needs to read more data\n"
2320"before the requested operation can be completed.");
2321
2322PyDoc_STRVAR(SSLWantWriteError_doc,
2323"Non-blocking SSL socket needs to write more data\n"
2324"before the requested operation can be completed.");
2325
2326PyDoc_STRVAR(SSLSyscallError_doc,
2327"System error when attempting SSL operation.");
2328
2329PyDoc_STRVAR(SSLEOFError_doc,
2330"SSL/TLS connection terminated abruptly.");
2331
Antoine Pitroua0e0e232011-10-22 23:41:52 +02002332
Mark Hammondfe51c6d2002-08-02 02:27:13 +00002333PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00002334PyInit__ssl(void)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002335{
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002336 PyObject *m, *d, *r;
2337 unsigned long libver;
2338 unsigned int major, minor, fix, patch, status;
2339 PySocketModule_APIObject *socket_api;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002340
Antoine Pitrou152efa22010-05-16 18:19:27 +00002341 if (PyType_Ready(&PySSLContext_Type) < 0)
2342 return NULL;
2343 if (PyType_Ready(&PySSLSocket_Type) < 0)
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002344 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002345
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002346 m = PyModule_Create(&_sslmodule);
2347 if (m == NULL)
2348 return NULL;
2349 d = PyModule_GetDict(m);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002350
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002351 /* Load _socket module and its C API */
2352 socket_api = PySocketModule_ImportModuleAndAPI();
2353 if (!socket_api)
2354 return NULL;
2355 PySocketModule = *socket_api;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002356
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002357 /* Init OpenSSL */
2358 SSL_load_error_strings();
2359 SSL_library_init();
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002360#ifdef WITH_THREAD
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002361 /* note that this will start threading if not already started */
2362 if (!_setup_ssl_threads()) {
2363 return NULL;
2364 }
Thomas Wouters1b7f8912007-09-19 03:06:30 +00002365#endif
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002366 OpenSSL_add_all_algorithms();
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002367
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002368 /* Add symbols to module dict */
Antoine Pitroua0e0e232011-10-22 23:41:52 +02002369 PySSLErrorObject = PyErr_NewExceptionWithDoc("ssl.SSLError",
2370 SSLError_doc,
2371 PyExc_OSError,
2372 NULL);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002373 if (PySSLErrorObject == NULL)
2374 return NULL;
Antoine Pitrou41032a62011-10-27 23:56:55 +02002375 PySSLZeroReturnErrorObject = PyErr_NewExceptionWithDoc(
2376 "ssl.SSLZeroReturnError", SSLZeroReturnError_doc,
2377 PySSLErrorObject, NULL);
2378 PySSLWantReadErrorObject = PyErr_NewExceptionWithDoc(
2379 "ssl.SSLWantReadError", SSLWantReadError_doc,
2380 PySSLErrorObject, NULL);
2381 PySSLWantWriteErrorObject = PyErr_NewExceptionWithDoc(
2382 "ssl.SSLWantWriteError", SSLWantWriteError_doc,
2383 PySSLErrorObject, NULL);
2384 PySSLSyscallErrorObject = PyErr_NewExceptionWithDoc(
2385 "ssl.SSLSyscallError", SSLSyscallError_doc,
2386 PySSLErrorObject, NULL);
2387 PySSLEOFErrorObject = PyErr_NewExceptionWithDoc(
2388 "ssl.SSLEOFError", SSLEOFError_doc,
2389 PySSLErrorObject, NULL);
2390 if (PySSLZeroReturnErrorObject == NULL
2391 || PySSLWantReadErrorObject == NULL
2392 || PySSLWantWriteErrorObject == NULL
2393 || PySSLSyscallErrorObject == NULL
2394 || PySSLEOFErrorObject == NULL)
2395 return NULL;
2396 if (PyDict_SetItemString(d, "SSLError", PySSLErrorObject) != 0
2397 || PyDict_SetItemString(d, "SSLZeroReturnError", PySSLZeroReturnErrorObject) != 0
2398 || PyDict_SetItemString(d, "SSLWantReadError", PySSLWantReadErrorObject) != 0
2399 || PyDict_SetItemString(d, "SSLWantWriteError", PySSLWantWriteErrorObject) != 0
2400 || PyDict_SetItemString(d, "SSLSyscallError", PySSLSyscallErrorObject) != 0
2401 || PyDict_SetItemString(d, "SSLEOFError", PySSLEOFErrorObject) != 0)
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002402 return NULL;
Antoine Pitrou152efa22010-05-16 18:19:27 +00002403 if (PyDict_SetItemString(d, "_SSLContext",
2404 (PyObject *)&PySSLContext_Type) != 0)
2405 return NULL;
2406 if (PyDict_SetItemString(d, "_SSLSocket",
2407 (PyObject *)&PySSLSocket_Type) != 0)
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002408 return NULL;
2409 PyModule_AddIntConstant(m, "SSL_ERROR_ZERO_RETURN",
2410 PY_SSL_ERROR_ZERO_RETURN);
2411 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_READ",
2412 PY_SSL_ERROR_WANT_READ);
2413 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_WRITE",
2414 PY_SSL_ERROR_WANT_WRITE);
2415 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_X509_LOOKUP",
2416 PY_SSL_ERROR_WANT_X509_LOOKUP);
2417 PyModule_AddIntConstant(m, "SSL_ERROR_SYSCALL",
2418 PY_SSL_ERROR_SYSCALL);
2419 PyModule_AddIntConstant(m, "SSL_ERROR_SSL",
2420 PY_SSL_ERROR_SSL);
2421 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_CONNECT",
2422 PY_SSL_ERROR_WANT_CONNECT);
2423 /* non ssl.h errorcodes */
2424 PyModule_AddIntConstant(m, "SSL_ERROR_EOF",
2425 PY_SSL_ERROR_EOF);
2426 PyModule_AddIntConstant(m, "SSL_ERROR_INVALID_ERROR_CODE",
2427 PY_SSL_ERROR_INVALID_ERROR_CODE);
2428 /* cert requirements */
2429 PyModule_AddIntConstant(m, "CERT_NONE",
2430 PY_SSL_CERT_NONE);
2431 PyModule_AddIntConstant(m, "CERT_OPTIONAL",
2432 PY_SSL_CERT_OPTIONAL);
2433 PyModule_AddIntConstant(m, "CERT_REQUIRED",
2434 PY_SSL_CERT_REQUIRED);
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00002435
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002436 /* protocol versions */
Victor Stinner3de49192011-05-09 00:42:58 +02002437#ifndef OPENSSL_NO_SSL2
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002438 PyModule_AddIntConstant(m, "PROTOCOL_SSLv2",
2439 PY_SSL_VERSION_SSL2);
Victor Stinner3de49192011-05-09 00:42:58 +02002440#endif
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002441 PyModule_AddIntConstant(m, "PROTOCOL_SSLv3",
2442 PY_SSL_VERSION_SSL3);
2443 PyModule_AddIntConstant(m, "PROTOCOL_SSLv23",
2444 PY_SSL_VERSION_SSL23);
2445 PyModule_AddIntConstant(m, "PROTOCOL_TLSv1",
2446 PY_SSL_VERSION_TLS1);
Antoine Pitrou04f6a322010-04-05 21:40:07 +00002447
Antoine Pitroub5218772010-05-21 09:56:06 +00002448 /* protocol options */
2449 PyModule_AddIntConstant(m, "OP_ALL", SSL_OP_ALL);
2450 PyModule_AddIntConstant(m, "OP_NO_SSLv2", SSL_OP_NO_SSLv2);
2451 PyModule_AddIntConstant(m, "OP_NO_SSLv3", SSL_OP_NO_SSLv3);
2452 PyModule_AddIntConstant(m, "OP_NO_TLSv1", SSL_OP_NO_TLSv1);
2453
Antoine Pitroud5323212010-10-22 18:19:07 +00002454#ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME
2455 r = Py_True;
2456#else
2457 r = Py_False;
2458#endif
2459 Py_INCREF(r);
2460 PyModule_AddObject(m, "HAS_SNI", r);
2461
Antoine Pitroud6494802011-07-21 01:11:30 +02002462#if HAVE_OPENSSL_FINISHED
2463 r = Py_True;
2464#else
2465 r = Py_False;
2466#endif
2467 Py_INCREF(r);
2468 PyModule_AddObject(m, "HAS_TLS_UNIQUE", r);
2469
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002470 /* OpenSSL version */
2471 /* SSLeay() gives us the version of the library linked against,
2472 which could be different from the headers version.
2473 */
2474 libver = SSLeay();
2475 r = PyLong_FromUnsignedLong(libver);
2476 if (r == NULL)
2477 return NULL;
2478 if (PyModule_AddObject(m, "OPENSSL_VERSION_NUMBER", r))
2479 return NULL;
Antoine Pitroub9ac25d2011-07-08 18:47:06 +02002480 parse_openssl_version(libver, &major, &minor, &fix, &patch, &status);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002481 r = Py_BuildValue("IIIII", major, minor, fix, patch, status);
2482 if (r == NULL || PyModule_AddObject(m, "OPENSSL_VERSION_INFO", r))
2483 return NULL;
2484 r = PyUnicode_FromString(SSLeay_version(SSLEAY_VERSION));
2485 if (r == NULL || PyModule_AddObject(m, "OPENSSL_VERSION", r))
2486 return NULL;
Antoine Pitrou04f6a322010-04-05 21:40:07 +00002487
Antoine Pitroub9ac25d2011-07-08 18:47:06 +02002488 libver = OPENSSL_VERSION_NUMBER;
2489 parse_openssl_version(libver, &major, &minor, &fix, &patch, &status);
2490 r = Py_BuildValue("IIIII", major, minor, fix, patch, status);
2491 if (r == NULL || PyModule_AddObject(m, "_OPENSSL_API_VERSION", r))
2492 return NULL;
2493
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002494 return m;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002495}