blob: 4619cda60034fdc2b18316de728ea19781cae585 [file] [log] [blame]
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +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.
Bill Janssen98d19da2007-09-10 21:51:02 +00004 Re-worked a bit by Bill Janssen to add server-side support and
Bill Janssen934b16d2008-06-28 22:19:33 +00005 certificate decoding. Chris Stawarz contributed some non-blocking
6 patches.
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00007
Bill Janssen98d19da2007-09-10 21:51:02 +00008 This module is imported by ssl.py. It should *not* be used
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00009 directly.
10
Bill Janssen98d19da2007-09-10 21:51:02 +000011 XXX should partial writes be enabled, SSL_MODE_ENABLE_PARTIAL_WRITE?
Antoine Pitrou07072162010-04-23 21:07:58 +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"
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +000018
Bill Janssen98d19da2007-09-10 21:51:02 +000019#ifdef WITH_THREAD
20#include "pythread.h"
21#define PySSL_BEGIN_ALLOW_THREADS { \
Antoine Pitrou7fd622a2010-05-05 15:59:19 +000022 PyThreadState *_save = NULL; \
23 if (_ssl_locks_count>0) {_save = PyEval_SaveThread();}
24#define PySSL_BLOCK_THREADS if (_ssl_locks_count>0){PyEval_RestoreThread(_save)};
25#define PySSL_UNBLOCK_THREADS if (_ssl_locks_count>0){_save = PyEval_SaveThread()};
26#define PySSL_END_ALLOW_THREADS if (_ssl_locks_count>0){PyEval_RestoreThread(_save);} \
27 }
Bill Janssen98d19da2007-09-10 21:51:02 +000028
Antoine Pitrou7fd622a2010-05-05 15:59:19 +000029#else /* no WITH_THREAD */
Bill Janssen98d19da2007-09-10 21:51:02 +000030
31#define PySSL_BEGIN_ALLOW_THREADS
32#define PySSL_BLOCK_THREADS
33#define PySSL_UNBLOCK_THREADS
34#define PySSL_END_ALLOW_THREADS
35
36#endif
37
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +000038enum py_ssl_error {
Antoine Pitrou7fd622a2010-05-05 15:59:19 +000039 /* these mirror ssl.h */
40 PY_SSL_ERROR_NONE,
41 PY_SSL_ERROR_SSL,
42 PY_SSL_ERROR_WANT_READ,
43 PY_SSL_ERROR_WANT_WRITE,
44 PY_SSL_ERROR_WANT_X509_LOOKUP,
45 PY_SSL_ERROR_SYSCALL, /* look at error stack/return value/errno */
46 PY_SSL_ERROR_ZERO_RETURN,
47 PY_SSL_ERROR_WANT_CONNECT,
48 /* start of non ssl.h errorcodes */
49 PY_SSL_ERROR_EOF, /* special case of SSL_ERROR_SYSCALL */
50 PY_SSL_ERROR_INVALID_ERROR_CODE
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +000051};
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000052
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +000053enum py_ssl_server_or_client {
Antoine Pitrou7fd622a2010-05-05 15:59:19 +000054 PY_SSL_CLIENT,
55 PY_SSL_SERVER
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +000056};
57
58enum py_ssl_cert_requirements {
Antoine Pitrou7fd622a2010-05-05 15:59:19 +000059 PY_SSL_CERT_NONE,
60 PY_SSL_CERT_OPTIONAL,
61 PY_SSL_CERT_REQUIRED
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +000062};
63
64enum py_ssl_version {
Antoine Pitrou7fd622a2010-05-05 15:59:19 +000065 PY_SSL_VERSION_SSL2,
66 PY_SSL_VERSION_SSL3,
67 PY_SSL_VERSION_SSL23,
68 PY_SSL_VERSION_TLS1
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +000069};
70
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000071/* Include symbols from _socket module */
72#include "socketmodule.h"
73
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +000074#if defined(HAVE_POLL_H)
Anthony Baxter93ab5fa2006-07-11 02:04:09 +000075#include <poll.h>
76#elif defined(HAVE_SYS_POLL_H)
77#include <sys/poll.h>
78#endif
79
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000080/* Include OpenSSL header files */
81#include "openssl/rsa.h"
82#include "openssl/crypto.h"
83#include "openssl/x509.h"
Bill Janssen98d19da2007-09-10 21:51:02 +000084#include "openssl/x509v3.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000085#include "openssl/pem.h"
86#include "openssl/ssl.h"
87#include "openssl/err.h"
88#include "openssl/rand.h"
89
90/* SSL error object */
91static PyObject *PySSLErrorObject;
92
Bill Janssen98d19da2007-09-10 21:51:02 +000093#ifdef WITH_THREAD
94
95/* serves as a flag to see whether we've initialized the SSL thread support. */
96/* 0 means no, greater than 0 means yes */
97
98static unsigned int _ssl_locks_count = 0;
99
100#endif /* def WITH_THREAD */
101
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000102/* SSL socket object */
103
104#define X509_NAME_MAXLEN 256
105
106/* RAND_* APIs got added to OpenSSL in 0.9.5 */
107#if OPENSSL_VERSION_NUMBER >= 0x0090500fL
108# define HAVE_OPENSSL_RAND 1
109#else
110# undef HAVE_OPENSSL_RAND
111#endif
112
113typedef struct {
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000114 PyObject_HEAD
115 PySocketSockObject *Socket; /* Socket on which we're layered */
116 SSL_CTX* ctx;
117 SSL* ssl;
118 X509* peer_cert;
119 char server[X509_NAME_MAXLEN];
120 char issuer[X509_NAME_MAXLEN];
121 int shutdown_seen_zero;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000122
123} PySSLObject;
124
Jeremy Hylton938ace62002-07-17 16:30:39 +0000125static PyTypeObject PySSL_Type;
126static PyObject *PySSL_SSLwrite(PySSLObject *self, PyObject *args);
127static PyObject *PySSL_SSLread(PySSLObject *self, PyObject *args);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000128static int check_socket_and_wait_for_timeout(PySocketSockObject *s,
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000129 int writing);
Bill Janssen98d19da2007-09-10 21:51:02 +0000130static PyObject *PySSL_peercert(PySSLObject *self, PyObject *args);
131static PyObject *PySSL_cipher(PySSLObject *self);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000132
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000133#define PySSLObject_Check(v) (Py_TYPE(v) == &PySSL_Type)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000134
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +0000135typedef enum {
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000136 SOCKET_IS_NONBLOCKING,
137 SOCKET_IS_BLOCKING,
138 SOCKET_HAS_TIMED_OUT,
139 SOCKET_HAS_BEEN_CLOSED,
140 SOCKET_TOO_LARGE_FOR_SELECT,
141 SOCKET_OPERATION_OK
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +0000142} timeout_state;
143
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000144/* Wrap error strings with filename and line # */
145#define STRINGIFY1(x) #x
146#define STRINGIFY2(x) STRINGIFY1(x)
147#define ERRSTR1(x,y,z) (x ":" y ": " z)
148#define ERRSTR(x) ERRSTR1("_ssl.c", STRINGIFY2(__LINE__), x)
149
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000150/* XXX It might be helpful to augment the error message generated
151 below with the name of the SSL function that generated the error.
152 I expect it's obvious most of the time.
153*/
154
155static PyObject *
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000156PySSL_SetError(PySSLObject *obj, int ret, char *filename, int lineno)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000157{
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000158 PyObject *v;
159 char buf[2048];
160 char *errstr;
161 int err;
162 enum py_ssl_error p = PY_SSL_ERROR_NONE;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000163
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000164 assert(ret <= 0);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000165
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000166 if (obj->ssl != NULL) {
167 err = SSL_get_error(obj->ssl, ret);
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +0000168
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000169 switch (err) {
170 case SSL_ERROR_ZERO_RETURN:
171 errstr = "TLS/SSL connection has been closed";
172 p = PY_SSL_ERROR_ZERO_RETURN;
173 break;
174 case SSL_ERROR_WANT_READ:
175 errstr = "The operation did not complete (read)";
176 p = PY_SSL_ERROR_WANT_READ;
177 break;
178 case SSL_ERROR_WANT_WRITE:
179 p = PY_SSL_ERROR_WANT_WRITE;
180 errstr = "The operation did not complete (write)";
181 break;
182 case SSL_ERROR_WANT_X509_LOOKUP:
183 p = PY_SSL_ERROR_WANT_X509_LOOKUP;
Antoine Pitrou96125cf2010-05-12 14:05:34 +0000184 errstr = "The operation did not complete (X509 lookup)";
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000185 break;
186 case SSL_ERROR_WANT_CONNECT:
187 p = PY_SSL_ERROR_WANT_CONNECT;
188 errstr = "The operation did not complete (connect)";
189 break;
190 case SSL_ERROR_SYSCALL:
191 {
192 unsigned long e = ERR_get_error();
193 if (e == 0) {
194 if (ret == 0 || !obj->Socket) {
Antoine Pitrou96125cf2010-05-12 14:05:34 +0000195 p = PY_SSL_ERROR_EOF;
196 errstr = "EOF occurred in violation of protocol";
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000197 } else if (ret == -1) {
Antoine Pitrou96125cf2010-05-12 14:05:34 +0000198 /* underlying BIO reported an I/O error */
Antoine Pitroub6e3e3a2010-05-16 23:14:34 +0000199 ERR_clear_error();
Antoine Pitrou96125cf2010-05-12 14:05:34 +0000200 return obj->Socket->errorhandler();
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000201 } else { /* possible? */
Antoine Pitrou96125cf2010-05-12 14:05:34 +0000202 p = PY_SSL_ERROR_SYSCALL;
203 errstr = "Some I/O error occurred";
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000204 }
205 } else {
206 p = PY_SSL_ERROR_SYSCALL;
207 /* XXX Protected by global interpreter lock */
208 errstr = ERR_error_string(e, NULL);
209 }
210 break;
211 }
212 case SSL_ERROR_SSL:
213 {
214 unsigned long e = ERR_get_error();
215 p = PY_SSL_ERROR_SSL;
216 if (e != 0)
217 /* XXX Protected by global interpreter lock */
218 errstr = ERR_error_string(e, NULL);
219 else { /* possible? */
Antoine Pitrou96125cf2010-05-12 14:05:34 +0000220 errstr = "A failure in the SSL library occurred";
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000221 }
222 break;
223 }
224 default:
225 p = PY_SSL_ERROR_INVALID_ERROR_CODE;
226 errstr = "Invalid error code";
227 }
228 } else {
229 errstr = ERR_error_string(ERR_peek_last_error(), NULL);
230 }
231 PyOS_snprintf(buf, sizeof(buf), "_ssl.c:%d: %s", lineno, errstr);
Antoine Pitroub6e3e3a2010-05-16 23:14:34 +0000232 ERR_clear_error();
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000233 v = Py_BuildValue("(is)", p, buf);
234 if (v != NULL) {
235 PyErr_SetObject(PySSLErrorObject, v);
236 Py_DECREF(v);
237 }
238 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000239}
240
Bill Janssen98d19da2007-09-10 21:51:02 +0000241static PyObject *
242_setSSLError (char *errstr, int errcode, char *filename, int lineno) {
243
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000244 char buf[2048];
245 PyObject *v;
Bill Janssen98d19da2007-09-10 21:51:02 +0000246
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000247 if (errstr == NULL) {
248 errcode = ERR_peek_last_error();
249 errstr = ERR_error_string(errcode, NULL);
250 }
251 PyOS_snprintf(buf, sizeof(buf), "_ssl.c:%d: %s", lineno, errstr);
Antoine Pitroub6e3e3a2010-05-16 23:14:34 +0000252 ERR_clear_error();
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000253 v = Py_BuildValue("(is)", errcode, buf);
254 if (v != NULL) {
255 PyErr_SetObject(PySSLErrorObject, v);
256 Py_DECREF(v);
257 }
258 return NULL;
Bill Janssen98d19da2007-09-10 21:51:02 +0000259}
260
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000261static PySSLObject *
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000262newPySSLObject(PySocketSockObject *Sock, char *key_file, char *cert_file,
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000263 enum py_ssl_server_or_client socket_type,
264 enum py_ssl_cert_requirements certreq,
265 enum py_ssl_version proto_version,
266 char *cacerts_file)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000267{
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000268 PySSLObject *self;
269 char *errstr = NULL;
270 int ret;
271 int verification_mode;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000272
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000273 self = PyObject_New(PySSLObject, &PySSL_Type); /* Create new object */
274 if (self == NULL)
275 return NULL;
276 memset(self->server, '\0', sizeof(char) * X509_NAME_MAXLEN);
277 memset(self->issuer, '\0', sizeof(char) * X509_NAME_MAXLEN);
278 self->peer_cert = NULL;
279 self->ssl = NULL;
280 self->ctx = NULL;
281 self->Socket = NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000282
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000283 /* Make sure the SSL error state is initialized */
284 (void) ERR_get_state();
285 ERR_clear_error();
Bill Janssen98d19da2007-09-10 21:51:02 +0000286
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000287 if ((key_file && !cert_file) || (!key_file && cert_file)) {
288 errstr = ERRSTR("Both the key & certificate files "
289 "must be specified");
290 goto fail;
291 }
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000292
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000293 if ((socket_type == PY_SSL_SERVER) &&
294 ((key_file == NULL) || (cert_file == NULL))) {
295 errstr = ERRSTR("Both the key & certificate files "
296 "must be specified for server-side operation");
297 goto fail;
298 }
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000299
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000300 PySSL_BEGIN_ALLOW_THREADS
301 if (proto_version == PY_SSL_VERSION_TLS1)
302 self->ctx = SSL_CTX_new(TLSv1_method()); /* Set up context */
303 else if (proto_version == PY_SSL_VERSION_SSL3)
304 self->ctx = SSL_CTX_new(SSLv3_method()); /* Set up context */
305 else if (proto_version == PY_SSL_VERSION_SSL2)
306 self->ctx = SSL_CTX_new(SSLv2_method()); /* Set up context */
307 else if (proto_version == PY_SSL_VERSION_SSL23)
308 self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */
309 PySSL_END_ALLOW_THREADS
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000310
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000311 if (self->ctx == NULL) {
312 errstr = ERRSTR("Invalid SSL protocol variant specified.");
313 goto fail;
314 }
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000315
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000316 if (certreq != PY_SSL_CERT_NONE) {
317 if (cacerts_file == NULL) {
318 errstr = ERRSTR("No root certificates specified for "
Antoine Pitrou96125cf2010-05-12 14:05:34 +0000319 "verification of other-side certificates.");
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000320 goto fail;
321 } else {
322 PySSL_BEGIN_ALLOW_THREADS
323 ret = SSL_CTX_load_verify_locations(self->ctx,
324 cacerts_file,
325 NULL);
326 PySSL_END_ALLOW_THREADS
327 if (ret != 1) {
328 _setSSLError(NULL, 0, __FILE__, __LINE__);
329 goto fail;
330 }
331 }
332 }
333 if (key_file) {
334 PySSL_BEGIN_ALLOW_THREADS
335 ret = SSL_CTX_use_PrivateKey_file(self->ctx, key_file,
336 SSL_FILETYPE_PEM);
337 PySSL_END_ALLOW_THREADS
338 if (ret != 1) {
339 _setSSLError(NULL, ret, __FILE__, __LINE__);
340 goto fail;
341 }
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000342
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000343 PySSL_BEGIN_ALLOW_THREADS
344 ret = SSL_CTX_use_certificate_chain_file(self->ctx,
345 cert_file);
346 PySSL_END_ALLOW_THREADS
347 if (ret != 1) {
348 /*
349 fprintf(stderr, "ret is %d, errcode is %lu, %lu, with file \"%s\"\n",
350 ret, ERR_peek_error(), ERR_peek_last_error(), cert_file);
351 */
352 if (ERR_peek_last_error() != 0) {
353 _setSSLError(NULL, ret, __FILE__, __LINE__);
354 goto fail;
355 }
356 }
357 }
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000358
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000359 /* ssl compatibility */
360 SSL_CTX_set_options(self->ctx, SSL_OP_ALL);
Bill Janssen98d19da2007-09-10 21:51:02 +0000361
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000362 verification_mode = SSL_VERIFY_NONE;
363 if (certreq == PY_SSL_CERT_OPTIONAL)
364 verification_mode = SSL_VERIFY_PEER;
365 else if (certreq == PY_SSL_CERT_REQUIRED)
366 verification_mode = (SSL_VERIFY_PEER |
367 SSL_VERIFY_FAIL_IF_NO_PEER_CERT);
368 SSL_CTX_set_verify(self->ctx, verification_mode,
369 NULL); /* set verify lvl */
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000370
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000371 PySSL_BEGIN_ALLOW_THREADS
372 self->ssl = SSL_new(self->ctx); /* New ssl struct */
373 PySSL_END_ALLOW_THREADS
374 SSL_set_fd(self->ssl, Sock->sock_fd); /* Set the socket for SSL */
Antoine Pitrou206685b2010-04-09 20:44:09 +0000375#ifdef SSL_MODE_AUTO_RETRY
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000376 SSL_set_mode(self->ssl, SSL_MODE_AUTO_RETRY);
Antoine Pitrou206685b2010-04-09 20:44:09 +0000377#endif
Guido van Rossum4f707ac2003-01-31 18:13:18 +0000378
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000379 /* If the socket is in non-blocking mode or timeout mode, set the BIO
380 * to non-blocking mode (blocking is the default)
381 */
382 if (Sock->sock_timeout >= 0.0) {
383 /* Set both the read and write BIO's to non-blocking mode */
384 BIO_set_nbio(SSL_get_rbio(self->ssl), 1);
385 BIO_set_nbio(SSL_get_wbio(self->ssl), 1);
386 }
Guido van Rossum4f707ac2003-01-31 18:13:18 +0000387
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000388 PySSL_BEGIN_ALLOW_THREADS
389 if (socket_type == PY_SSL_CLIENT)
390 SSL_set_connect_state(self->ssl);
391 else
392 SSL_set_accept_state(self->ssl);
393 PySSL_END_ALLOW_THREADS
Martin v. Löwis09c35f72002-07-28 09:57:45 +0000394
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000395 self->Socket = Sock;
396 Py_INCREF(self->Socket);
397 return self;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000398 fail:
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000399 if (errstr)
400 PyErr_SetString(PySSLErrorObject, errstr);
401 Py_DECREF(self);
402 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000403}
404
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000405static PyObject *
Guido van Rossum780b80d2007-08-27 18:42:23 +0000406PySSL_sslwrap(PyObject *self, PyObject *args)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000407{
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000408 PySocketSockObject *Sock;
409 int server_side = 0;
410 int verification_mode = PY_SSL_CERT_NONE;
411 int protocol = PY_SSL_VERSION_SSL23;
412 char *key_file = NULL;
413 char *cert_file = NULL;
414 char *cacerts_file = NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000415
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000416 if (!PyArg_ParseTuple(args, "O!i|zziiz:sslwrap",
417 PySocketModule.Sock_Type,
418 &Sock,
419 &server_side,
420 &key_file, &cert_file,
421 &verification_mode, &protocol,
422 &cacerts_file))
423 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000424
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000425 /*
426 fprintf(stderr,
427 "server_side is %d, keyfile %p, certfile %p, verify_mode %d, "
428 "protocol %d, certs %p\n",
429 server_side, key_file, cert_file, verification_mode,
430 protocol, cacerts_file);
431 */
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000432
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000433 return (PyObject *) newPySSLObject(Sock, key_file, cert_file,
434 server_side, verification_mode,
435 protocol, cacerts_file);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000436}
437
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000438PyDoc_STRVAR(ssl_doc,
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000439"sslwrap(socket, server_side, [keyfile, certfile, certs_mode, protocol,\n"
440" cacertsfile]) -> sslobject");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000441
442/* SSL object methods */
443
Bill Janssen934b16d2008-06-28 22:19:33 +0000444static PyObject *PySSL_SSLdo_handshake(PySSLObject *self)
445{
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000446 int ret;
447 int err;
448 int sockstate, nonblocking;
Antoine Pitrouc689d962010-04-24 20:13:37 +0000449
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000450 /* just in case the blocking state of the socket has been changed */
451 nonblocking = (self->Socket->sock_timeout >= 0.0);
452 BIO_set_nbio(SSL_get_rbio(self->ssl), nonblocking);
453 BIO_set_nbio(SSL_get_wbio(self->ssl), nonblocking);
Bill Janssen934b16d2008-06-28 22:19:33 +0000454
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000455 /* Actually negotiate SSL connection */
456 /* XXX If SSL_do_handshake() returns 0, it's also a failure. */
457 sockstate = 0;
458 do {
459 PySSL_BEGIN_ALLOW_THREADS
460 ret = SSL_do_handshake(self->ssl);
461 err = SSL_get_error(self->ssl, ret);
462 PySSL_END_ALLOW_THREADS
463 if(PyErr_CheckSignals()) {
464 return NULL;
465 }
466 if (err == SSL_ERROR_WANT_READ) {
467 sockstate = check_socket_and_wait_for_timeout(self->Socket, 0);
468 } else if (err == SSL_ERROR_WANT_WRITE) {
469 sockstate = check_socket_and_wait_for_timeout(self->Socket, 1);
470 } else {
471 sockstate = SOCKET_OPERATION_OK;
472 }
473 if (sockstate == SOCKET_HAS_TIMED_OUT) {
474 PyErr_SetString(PySSLErrorObject,
Antoine Pitrou96125cf2010-05-12 14:05:34 +0000475 ERRSTR("The handshake operation timed out"));
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000476 return NULL;
477 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
478 PyErr_SetString(PySSLErrorObject,
Antoine Pitrou96125cf2010-05-12 14:05:34 +0000479 ERRSTR("Underlying socket has been closed."));
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000480 return NULL;
481 } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
482 PyErr_SetString(PySSLErrorObject,
Antoine Pitrou96125cf2010-05-12 14:05:34 +0000483 ERRSTR("Underlying socket too large for select()."));
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000484 return NULL;
485 } else if (sockstate == SOCKET_IS_NONBLOCKING) {
486 break;
487 }
488 } while (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE);
489 if (ret < 1)
490 return PySSL_SetError(self, ret, __FILE__, __LINE__);
Bill Janssen934b16d2008-06-28 22:19:33 +0000491
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000492 if (self->peer_cert)
493 X509_free (self->peer_cert);
494 PySSL_BEGIN_ALLOW_THREADS
495 if ((self->peer_cert = SSL_get_peer_certificate(self->ssl))) {
496 X509_NAME_oneline(X509_get_subject_name(self->peer_cert),
497 self->server, X509_NAME_MAXLEN);
498 X509_NAME_oneline(X509_get_issuer_name(self->peer_cert),
499 self->issuer, X509_NAME_MAXLEN);
500 }
501 PySSL_END_ALLOW_THREADS
Bill Janssen934b16d2008-06-28 22:19:33 +0000502
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000503 Py_INCREF(Py_None);
504 return Py_None;
Bill Janssen934b16d2008-06-28 22:19:33 +0000505}
506
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000507static PyObject *
508PySSL_server(PySSLObject *self)
509{
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000510 return PyString_FromString(self->server);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000511}
512
513static PyObject *
514PySSL_issuer(PySSLObject *self)
515{
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000516 return PyString_FromString(self->issuer);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000517}
518
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000519static PyObject *
Bill Janssen98d19da2007-09-10 21:51:02 +0000520_create_tuple_for_attribute (ASN1_OBJECT *name, ASN1_STRING *value) {
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000521
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000522 char namebuf[X509_NAME_MAXLEN];
523 int buflen;
524 PyObject *name_obj;
525 PyObject *value_obj;
526 PyObject *attr;
527 unsigned char *valuebuf = NULL;
Guido van Rossum780b80d2007-08-27 18:42:23 +0000528
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000529 buflen = OBJ_obj2txt(namebuf, sizeof(namebuf), name, 0);
530 if (buflen < 0) {
531 _setSSLError(NULL, 0, __FILE__, __LINE__);
532 goto fail;
533 }
534 name_obj = PyString_FromStringAndSize(namebuf, buflen);
535 if (name_obj == NULL)
536 goto fail;
537
538 buflen = ASN1_STRING_to_UTF8(&valuebuf, value);
539 if (buflen < 0) {
540 _setSSLError(NULL, 0, __FILE__, __LINE__);
541 Py_DECREF(name_obj);
542 goto fail;
543 }
544 value_obj = PyUnicode_DecodeUTF8((char *) valuebuf,
Antoine Pitrou96125cf2010-05-12 14:05:34 +0000545 buflen, "strict");
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000546 OPENSSL_free(valuebuf);
547 if (value_obj == NULL) {
548 Py_DECREF(name_obj);
549 goto fail;
550 }
551 attr = PyTuple_New(2);
552 if (attr == NULL) {
553 Py_DECREF(name_obj);
554 Py_DECREF(value_obj);
555 goto fail;
556 }
557 PyTuple_SET_ITEM(attr, 0, name_obj);
558 PyTuple_SET_ITEM(attr, 1, value_obj);
559 return attr;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000560
Bill Janssen98d19da2007-09-10 21:51:02 +0000561 fail:
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000562 return NULL;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000563}
564
565static PyObject *
Bill Janssen98d19da2007-09-10 21:51:02 +0000566_create_tuple_for_X509_NAME (X509_NAME *xname)
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000567{
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000568 PyObject *dn = NULL; /* tuple which represents the "distinguished name" */
569 PyObject *rdn = NULL; /* tuple to hold a "relative distinguished name" */
570 PyObject *rdnt;
571 PyObject *attr = NULL; /* tuple to hold an attribute */
572 int entry_count = X509_NAME_entry_count(xname);
573 X509_NAME_ENTRY *entry;
574 ASN1_OBJECT *name;
575 ASN1_STRING *value;
576 int index_counter;
577 int rdn_level = -1;
578 int retcode;
Bill Janssen98d19da2007-09-10 21:51:02 +0000579
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000580 dn = PyList_New(0);
581 if (dn == NULL)
582 return NULL;
583 /* now create another tuple to hold the top-level RDN */
584 rdn = PyList_New(0);
585 if (rdn == NULL)
586 goto fail0;
Bill Janssen98d19da2007-09-10 21:51:02 +0000587
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000588 for (index_counter = 0;
589 index_counter < entry_count;
590 index_counter++)
591 {
592 entry = X509_NAME_get_entry(xname, index_counter);
Bill Janssen98d19da2007-09-10 21:51:02 +0000593
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000594 /* check to see if we've gotten to a new RDN */
595 if (rdn_level >= 0) {
596 if (rdn_level != entry->set) {
597 /* yes, new RDN */
598 /* add old RDN to DN */
599 rdnt = PyList_AsTuple(rdn);
600 Py_DECREF(rdn);
601 if (rdnt == NULL)
602 goto fail0;
603 retcode = PyList_Append(dn, rdnt);
604 Py_DECREF(rdnt);
605 if (retcode < 0)
606 goto fail0;
607 /* create new RDN */
608 rdn = PyList_New(0);
609 if (rdn == NULL)
610 goto fail0;
611 }
612 }
613 rdn_level = entry->set;
Bill Janssen98d19da2007-09-10 21:51:02 +0000614
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000615 /* now add this attribute to the current RDN */
616 name = X509_NAME_ENTRY_get_object(entry);
617 value = X509_NAME_ENTRY_get_data(entry);
618 attr = _create_tuple_for_attribute(name, value);
619 /*
620 fprintf(stderr, "RDN level %d, attribute %s: %s\n",
621 entry->set,
622 PyString_AS_STRING(PyTuple_GET_ITEM(attr, 0)),
623 PyString_AS_STRING(PyTuple_GET_ITEM(attr, 1)));
624 */
625 if (attr == NULL)
626 goto fail1;
627 retcode = PyList_Append(rdn, attr);
628 Py_DECREF(attr);
629 if (retcode < 0)
630 goto fail1;
631 }
632 /* now, there's typically a dangling RDN */
633 if ((rdn != NULL) && (PyList_Size(rdn) > 0)) {
634 rdnt = PyList_AsTuple(rdn);
635 Py_DECREF(rdn);
636 if (rdnt == NULL)
637 goto fail0;
638 retcode = PyList_Append(dn, rdnt);
639 Py_DECREF(rdnt);
640 if (retcode < 0)
641 goto fail0;
642 }
Bill Janssen98d19da2007-09-10 21:51:02 +0000643
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000644 /* convert list to tuple */
645 rdnt = PyList_AsTuple(dn);
646 Py_DECREF(dn);
647 if (rdnt == NULL)
648 return NULL;
649 return rdnt;
Bill Janssen98d19da2007-09-10 21:51:02 +0000650
651 fail1:
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000652 Py_XDECREF(rdn);
Bill Janssen98d19da2007-09-10 21:51:02 +0000653
654 fail0:
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000655 Py_XDECREF(dn);
656 return NULL;
Bill Janssen98d19da2007-09-10 21:51:02 +0000657}
658
659static PyObject *
660_get_peer_alt_names (X509 *certificate) {
Bill Janssen98d19da2007-09-10 21:51:02 +0000661
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000662 /* this code follows the procedure outlined in
663 OpenSSL's crypto/x509v3/v3_prn.c:X509v3_EXT_print()
664 function to extract the STACK_OF(GENERAL_NAME),
665 then iterates through the stack to add the
666 names. */
Bill Janssen98d19da2007-09-10 21:51:02 +0000667
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000668 int i, j;
669 PyObject *peer_alt_names = Py_None;
670 PyObject *v, *t;
671 X509_EXTENSION *ext = NULL;
672 GENERAL_NAMES *names = NULL;
673 GENERAL_NAME *name;
674 X509V3_EXT_METHOD *method;
675 BIO *biobuf = NULL;
676 char buf[2048];
677 char *vptr;
678 int len;
679 const unsigned char *p;
Bill Janssen98d19da2007-09-10 21:51:02 +0000680
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000681 if (certificate == NULL)
682 return peer_alt_names;
Bill Janssen98d19da2007-09-10 21:51:02 +0000683
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000684 /* get a memory buffer */
685 biobuf = BIO_new(BIO_s_mem());
Bill Janssen98d19da2007-09-10 21:51:02 +0000686
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000687 i = 0;
688 while ((i = X509_get_ext_by_NID(
689 certificate, NID_subject_alt_name, i)) >= 0) {
Bill Janssen98d19da2007-09-10 21:51:02 +0000690
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000691 if (peer_alt_names == Py_None) {
692 peer_alt_names = PyList_New(0);
693 if (peer_alt_names == NULL)
694 goto fail;
695 }
Bill Janssen98d19da2007-09-10 21:51:02 +0000696
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000697 /* now decode the altName */
698 ext = X509_get_ext(certificate, i);
699 if(!(method = X509V3_EXT_get(ext))) {
700 PyErr_SetString(PySSLErrorObject,
701 ERRSTR("No method for internalizing subjectAltName!"));
702 goto fail;
703 }
Bill Janssen98d19da2007-09-10 21:51:02 +0000704
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000705 p = ext->value->data;
706 if (method->it)
707 names = (GENERAL_NAMES*) (ASN1_item_d2i(NULL,
708 &p,
709 ext->value->length,
710 ASN1_ITEM_ptr(method->it)));
711 else
712 names = (GENERAL_NAMES*) (method->d2i(NULL,
713 &p,
714 ext->value->length));
Bill Janssen98d19da2007-09-10 21:51:02 +0000715
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000716 for(j = 0; j < sk_GENERAL_NAME_num(names); j++) {
Bill Janssen98d19da2007-09-10 21:51:02 +0000717
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000718 /* get a rendering of each name in the set of names */
Bill Janssen98d19da2007-09-10 21:51:02 +0000719
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000720 name = sk_GENERAL_NAME_value(names, j);
721 if (name->type == GEN_DIRNAME) {
Bill Janssen98d19da2007-09-10 21:51:02 +0000722
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000723 /* we special-case DirName as a tuple of tuples of attributes */
Bill Janssen98d19da2007-09-10 21:51:02 +0000724
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000725 t = PyTuple_New(2);
726 if (t == NULL) {
727 goto fail;
728 }
Bill Janssen98d19da2007-09-10 21:51:02 +0000729
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000730 v = PyString_FromString("DirName");
731 if (v == NULL) {
732 Py_DECREF(t);
733 goto fail;
734 }
735 PyTuple_SET_ITEM(t, 0, v);
Bill Janssen98d19da2007-09-10 21:51:02 +0000736
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000737 v = _create_tuple_for_X509_NAME (name->d.dirn);
738 if (v == NULL) {
739 Py_DECREF(t);
740 goto fail;
741 }
742 PyTuple_SET_ITEM(t, 1, v);
Bill Janssen98d19da2007-09-10 21:51:02 +0000743
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000744 } else {
Bill Janssen98d19da2007-09-10 21:51:02 +0000745
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000746 /* for everything else, we use the OpenSSL print form */
747
748 (void) BIO_reset(biobuf);
749 GENERAL_NAME_print(biobuf, name);
750 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
751 if (len < 0) {
752 _setSSLError(NULL, 0, __FILE__, __LINE__);
753 goto fail;
754 }
755 vptr = strchr(buf, ':');
756 if (vptr == NULL)
757 goto fail;
758 t = PyTuple_New(2);
759 if (t == NULL)
760 goto fail;
761 v = PyString_FromStringAndSize(buf, (vptr - buf));
762 if (v == NULL) {
763 Py_DECREF(t);
764 goto fail;
765 }
766 PyTuple_SET_ITEM(t, 0, v);
767 v = PyString_FromStringAndSize((vptr + 1), (len - (vptr - buf + 1)));
768 if (v == NULL) {
769 Py_DECREF(t);
770 goto fail;
771 }
772 PyTuple_SET_ITEM(t, 1, v);
773 }
774
775 /* and add that rendering to the list */
776
777 if (PyList_Append(peer_alt_names, t) < 0) {
778 Py_DECREF(t);
779 goto fail;
780 }
781 Py_DECREF(t);
782 }
783 }
784 BIO_free(biobuf);
785 if (peer_alt_names != Py_None) {
786 v = PyList_AsTuple(peer_alt_names);
787 Py_DECREF(peer_alt_names);
788 return v;
789 } else {
790 return peer_alt_names;
791 }
792
Bill Janssen98d19da2007-09-10 21:51:02 +0000793
794 fail:
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000795 if (biobuf != NULL)
796 BIO_free(biobuf);
Bill Janssen98d19da2007-09-10 21:51:02 +0000797
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000798 if (peer_alt_names != Py_None) {
799 Py_XDECREF(peer_alt_names);
800 }
Bill Janssen98d19da2007-09-10 21:51:02 +0000801
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000802 return NULL;
Bill Janssen98d19da2007-09-10 21:51:02 +0000803}
804
805static PyObject *
806_decode_certificate (X509 *certificate, int verbose) {
807
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000808 PyObject *retval = NULL;
809 BIO *biobuf = NULL;
810 PyObject *peer;
811 PyObject *peer_alt_names = NULL;
812 PyObject *issuer;
813 PyObject *version;
814 PyObject *sn_obj;
815 ASN1_INTEGER *serialNumber;
816 char buf[2048];
817 int len;
818 ASN1_TIME *notBefore, *notAfter;
819 PyObject *pnotBefore, *pnotAfter;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000820
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000821 retval = PyDict_New();
822 if (retval == NULL)
823 return NULL;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000824
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000825 peer = _create_tuple_for_X509_NAME(
826 X509_get_subject_name(certificate));
827 if (peer == NULL)
828 goto fail0;
829 if (PyDict_SetItemString(retval, (const char *) "subject", peer) < 0) {
830 Py_DECREF(peer);
831 goto fail0;
832 }
833 Py_DECREF(peer);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000834
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000835 if (verbose) {
836 issuer = _create_tuple_for_X509_NAME(
837 X509_get_issuer_name(certificate));
838 if (issuer == NULL)
839 goto fail0;
840 if (PyDict_SetItemString(retval, (const char *)"issuer", issuer) < 0) {
841 Py_DECREF(issuer);
842 goto fail0;
843 }
844 Py_DECREF(issuer);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000845
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000846 version = PyInt_FromLong(X509_get_version(certificate) + 1);
847 if (PyDict_SetItemString(retval, "version", version) < 0) {
848 Py_DECREF(version);
849 goto fail0;
850 }
851 Py_DECREF(version);
852 }
Bill Janssen98d19da2007-09-10 21:51:02 +0000853
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000854 /* get a memory buffer */
855 biobuf = BIO_new(BIO_s_mem());
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000856
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000857 if (verbose) {
Bill Janssen98d19da2007-09-10 21:51:02 +0000858
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000859 (void) BIO_reset(biobuf);
860 serialNumber = X509_get_serialNumber(certificate);
861 /* should not exceed 20 octets, 160 bits, so buf is big enough */
862 i2a_ASN1_INTEGER(biobuf, serialNumber);
863 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
864 if (len < 0) {
865 _setSSLError(NULL, 0, __FILE__, __LINE__);
866 goto fail1;
867 }
868 sn_obj = PyString_FromStringAndSize(buf, len);
869 if (sn_obj == NULL)
870 goto fail1;
871 if (PyDict_SetItemString(retval, "serialNumber", sn_obj) < 0) {
872 Py_DECREF(sn_obj);
873 goto fail1;
874 }
875 Py_DECREF(sn_obj);
Bill Janssen98d19da2007-09-10 21:51:02 +0000876
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000877 (void) BIO_reset(biobuf);
878 notBefore = X509_get_notBefore(certificate);
879 ASN1_TIME_print(biobuf, notBefore);
880 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
881 if (len < 0) {
882 _setSSLError(NULL, 0, __FILE__, __LINE__);
883 goto fail1;
884 }
885 pnotBefore = PyString_FromStringAndSize(buf, len);
886 if (pnotBefore == NULL)
887 goto fail1;
888 if (PyDict_SetItemString(retval, "notBefore", pnotBefore) < 0) {
889 Py_DECREF(pnotBefore);
890 goto fail1;
891 }
892 Py_DECREF(pnotBefore);
893 }
894
895 (void) BIO_reset(biobuf);
896 notAfter = X509_get_notAfter(certificate);
897 ASN1_TIME_print(biobuf, notAfter);
898 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
899 if (len < 0) {
900 _setSSLError(NULL, 0, __FILE__, __LINE__);
901 goto fail1;
902 }
903 pnotAfter = PyString_FromStringAndSize(buf, len);
904 if (pnotAfter == NULL)
905 goto fail1;
906 if (PyDict_SetItemString(retval, "notAfter", pnotAfter) < 0) {
907 Py_DECREF(pnotAfter);
908 goto fail1;
909 }
910 Py_DECREF(pnotAfter);
911
912 /* Now look for subjectAltName */
913
914 peer_alt_names = _get_peer_alt_names(certificate);
915 if (peer_alt_names == NULL)
916 goto fail1;
917 else if (peer_alt_names != Py_None) {
918 if (PyDict_SetItemString(retval, "subjectAltName",
919 peer_alt_names) < 0) {
920 Py_DECREF(peer_alt_names);
921 goto fail1;
922 }
923 Py_DECREF(peer_alt_names);
924 }
925
926 BIO_free(biobuf);
927 return retval;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000928
929 fail1:
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000930 if (biobuf != NULL)
931 BIO_free(biobuf);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000932 fail0:
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000933 Py_XDECREF(retval);
934 return NULL;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000935}
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000936
Bill Janssen98d19da2007-09-10 21:51:02 +0000937
938static PyObject *
939PySSL_test_decode_certificate (PyObject *mod, PyObject *args) {
940
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000941 PyObject *retval = NULL;
942 char *filename = NULL;
943 X509 *x=NULL;
944 BIO *cert;
945 int verbose = 1;
Bill Janssen98d19da2007-09-10 21:51:02 +0000946
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000947 if (!PyArg_ParseTuple(args, "s|i:test_decode_certificate", &filename, &verbose))
948 return NULL;
Bill Janssen98d19da2007-09-10 21:51:02 +0000949
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000950 if ((cert=BIO_new(BIO_s_file())) == NULL) {
951 PyErr_SetString(PySSLErrorObject, "Can't malloc memory to read file");
952 goto fail0;
953 }
Bill Janssen98d19da2007-09-10 21:51:02 +0000954
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000955 if (BIO_read_filename(cert,filename) <= 0) {
956 PyErr_SetString(PySSLErrorObject, "Can't open file");
957 goto fail0;
958 }
Bill Janssen98d19da2007-09-10 21:51:02 +0000959
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000960 x = PEM_read_bio_X509_AUX(cert,NULL, NULL, NULL);
961 if (x == NULL) {
962 PyErr_SetString(PySSLErrorObject, "Error decoding PEM-encoded file");
963 goto fail0;
964 }
Bill Janssen98d19da2007-09-10 21:51:02 +0000965
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000966 retval = _decode_certificate(x, verbose);
Mark Dickinsonc1ef2fa2010-08-03 18:50:32 +0000967 X509_free(x);
Bill Janssen98d19da2007-09-10 21:51:02 +0000968
969 fail0:
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000970
971 if (cert != NULL) BIO_free(cert);
972 return retval;
Bill Janssen98d19da2007-09-10 21:51:02 +0000973}
974
975
976static PyObject *
977PySSL_peercert(PySSLObject *self, PyObject *args)
978{
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000979 PyObject *retval = NULL;
980 int len;
981 int verification;
982 PyObject *binary_mode = Py_None;
Bill Janssen98d19da2007-09-10 21:51:02 +0000983
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000984 if (!PyArg_ParseTuple(args, "|O:peer_certificate", &binary_mode))
985 return NULL;
Bill Janssen98d19da2007-09-10 21:51:02 +0000986
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000987 if (!self->peer_cert)
988 Py_RETURN_NONE;
Bill Janssen98d19da2007-09-10 21:51:02 +0000989
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000990 if (PyObject_IsTrue(binary_mode)) {
991 /* return cert in DER-encoded format */
Bill Janssen98d19da2007-09-10 21:51:02 +0000992
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000993 unsigned char *bytes_buf = NULL;
Bill Janssen98d19da2007-09-10 21:51:02 +0000994
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000995 bytes_buf = NULL;
996 len = i2d_X509(self->peer_cert, &bytes_buf);
997 if (len < 0) {
998 PySSL_SetError(self, len, __FILE__, __LINE__);
999 return NULL;
1000 }
1001 retval = PyString_FromStringAndSize((const char *) bytes_buf, len);
1002 OPENSSL_free(bytes_buf);
1003 return retval;
Bill Janssen98d19da2007-09-10 21:51:02 +00001004
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001005 } else {
Bill Janssen98d19da2007-09-10 21:51:02 +00001006
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001007 verification = SSL_CTX_get_verify_mode(self->ctx);
1008 if ((verification & SSL_VERIFY_PEER) == 0)
1009 return PyDict_New();
1010 else
1011 return _decode_certificate (self->peer_cert, 0);
1012 }
Bill Janssen98d19da2007-09-10 21:51:02 +00001013}
1014
1015PyDoc_STRVAR(PySSL_peercert_doc,
1016"peer_certificate([der=False]) -> certificate\n\
1017\n\
1018Returns the certificate for the peer. If no certificate was provided,\n\
1019returns None. If a certificate was provided, but not validated, returns\n\
1020an empty dictionary. Otherwise returns a dict containing information\n\
1021about the peer certificate.\n\
1022\n\
1023If the optional argument is True, returns a DER-encoded copy of the\n\
1024peer certificate, or None if no certificate was provided. This will\n\
1025return the certificate even if it wasn't validated.");
1026
1027static PyObject *PySSL_cipher (PySSLObject *self) {
1028
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001029 PyObject *retval, *v;
1030 SSL_CIPHER *current;
1031 char *cipher_name;
1032 char *cipher_protocol;
Bill Janssen98d19da2007-09-10 21:51:02 +00001033
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001034 if (self->ssl == NULL)
1035 return Py_None;
1036 current = SSL_get_current_cipher(self->ssl);
1037 if (current == NULL)
1038 return Py_None;
Bill Janssen98d19da2007-09-10 21:51:02 +00001039
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001040 retval = PyTuple_New(3);
1041 if (retval == NULL)
1042 return NULL;
Bill Janssen98d19da2007-09-10 21:51:02 +00001043
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001044 cipher_name = (char *) SSL_CIPHER_get_name(current);
1045 if (cipher_name == NULL) {
1046 PyTuple_SET_ITEM(retval, 0, Py_None);
1047 } else {
1048 v = PyString_FromString(cipher_name);
1049 if (v == NULL)
1050 goto fail0;
1051 PyTuple_SET_ITEM(retval, 0, v);
1052 }
1053 cipher_protocol = SSL_CIPHER_get_version(current);
1054 if (cipher_protocol == NULL) {
1055 PyTuple_SET_ITEM(retval, 1, Py_None);
1056 } else {
1057 v = PyString_FromString(cipher_protocol);
1058 if (v == NULL)
1059 goto fail0;
1060 PyTuple_SET_ITEM(retval, 1, v);
1061 }
1062 v = PyInt_FromLong(SSL_CIPHER_get_bits(current, NULL));
1063 if (v == NULL)
1064 goto fail0;
1065 PyTuple_SET_ITEM(retval, 2, v);
1066 return retval;
1067
Bill Janssen98d19da2007-09-10 21:51:02 +00001068 fail0:
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001069 Py_DECREF(retval);
1070 return NULL;
Bill Janssen98d19da2007-09-10 21:51:02 +00001071}
1072
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001073static void PySSL_dealloc(PySSLObject *self)
1074{
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001075 if (self->peer_cert) /* Possible not to have one? */
1076 X509_free (self->peer_cert);
1077 if (self->ssl)
1078 SSL_free(self->ssl);
1079 if (self->ctx)
1080 SSL_CTX_free(self->ctx);
1081 Py_XDECREF(self->Socket);
1082 PyObject_Del(self);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001083}
1084
Anthony Baxter93ab5fa2006-07-11 02:04:09 +00001085/* If the socket has a timeout, do a select()/poll() on the socket.
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001086 The argument writing indicates the direction.
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001087 Returns one of the possibilities in the timeout_state enum (above).
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001088 */
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001089
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001090static int
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001091check_socket_and_wait_for_timeout(PySocketSockObject *s, int writing)
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001092{
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001093 fd_set fds;
1094 struct timeval tv;
1095 int rc;
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001096
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001097 /* Nothing to do unless we're in timeout mode (not non-blocking) */
1098 if (s->sock_timeout < 0.0)
1099 return SOCKET_IS_BLOCKING;
1100 else if (s->sock_timeout == 0.0)
1101 return SOCKET_IS_NONBLOCKING;
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001102
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001103 /* Guard against closed socket */
1104 if (s->sock_fd < 0)
1105 return SOCKET_HAS_BEEN_CLOSED;
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001106
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001107 /* Prefer poll, if available, since you can poll() any fd
1108 * which can't be done with select(). */
Anthony Baxter93ab5fa2006-07-11 02:04:09 +00001109#ifdef HAVE_POLL
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001110 {
1111 struct pollfd pollfd;
1112 int timeout;
Anthony Baxter93ab5fa2006-07-11 02:04:09 +00001113
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001114 pollfd.fd = s->sock_fd;
1115 pollfd.events = writing ? POLLOUT : POLLIN;
Anthony Baxter93ab5fa2006-07-11 02:04:09 +00001116
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001117 /* s->sock_timeout is in seconds, timeout in ms */
1118 timeout = (int)(s->sock_timeout * 1000 + 0.5);
1119 PySSL_BEGIN_ALLOW_THREADS
1120 rc = poll(&pollfd, 1, timeout);
1121 PySSL_END_ALLOW_THREADS
Anthony Baxter93ab5fa2006-07-11 02:04:09 +00001122
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001123 goto normal_return;
1124 }
Anthony Baxter93ab5fa2006-07-11 02:04:09 +00001125#endif
1126
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001127 /* Guard against socket too large for select*/
Martin v. Löwisf84d1b92006-02-11 09:27:05 +00001128#ifndef Py_SOCKET_FD_CAN_BE_GE_FD_SETSIZE
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001129 if (s->sock_fd >= FD_SETSIZE)
1130 return SOCKET_TOO_LARGE_FOR_SELECT;
Martin v. Löwisf84d1b92006-02-11 09:27:05 +00001131#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +00001132
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001133 /* Construct the arguments to select */
1134 tv.tv_sec = (int)s->sock_timeout;
1135 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
1136 FD_ZERO(&fds);
1137 FD_SET(s->sock_fd, &fds);
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001138
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001139 /* See if the socket is ready */
1140 PySSL_BEGIN_ALLOW_THREADS
1141 if (writing)
1142 rc = select(s->sock_fd+1, NULL, &fds, NULL, &tv);
1143 else
1144 rc = select(s->sock_fd+1, &fds, NULL, NULL, &tv);
1145 PySSL_END_ALLOW_THREADS
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001146
Bill Janssen934b16d2008-06-28 22:19:33 +00001147#ifdef HAVE_POLL
Anthony Baxter93ab5fa2006-07-11 02:04:09 +00001148normal_return:
Bill Janssen934b16d2008-06-28 22:19:33 +00001149#endif
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001150 /* Return SOCKET_TIMED_OUT on timeout, SOCKET_OPERATION_OK otherwise
1151 (when we are able to write or when there's something to read) */
1152 return rc == 0 ? SOCKET_HAS_TIMED_OUT : SOCKET_OPERATION_OK;
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001153}
1154
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001155static PyObject *PySSL_SSLwrite(PySSLObject *self, PyObject *args)
1156{
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001157 char *data;
1158 int len;
1159 int count;
1160 int sockstate;
1161 int err;
1162 int nonblocking;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001163
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001164 if (!PyArg_ParseTuple(args, "s#:write", &data, &count))
1165 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001166
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001167 /* just in case the blocking state of the socket has been changed */
1168 nonblocking = (self->Socket->sock_timeout >= 0.0);
1169 BIO_set_nbio(SSL_get_rbio(self->ssl), nonblocking);
1170 BIO_set_nbio(SSL_get_wbio(self->ssl), nonblocking);
Bill Janssen934b16d2008-06-28 22:19:33 +00001171
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001172 sockstate = check_socket_and_wait_for_timeout(self->Socket, 1);
1173 if (sockstate == SOCKET_HAS_TIMED_OUT) {
1174 PyErr_SetString(PySSLErrorObject,
1175 "The write operation timed out");
1176 return NULL;
1177 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
1178 PyErr_SetString(PySSLErrorObject,
1179 "Underlying socket has been closed.");
1180 return NULL;
1181 } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
1182 PyErr_SetString(PySSLErrorObject,
1183 "Underlying socket too large for select().");
1184 return NULL;
1185 }
1186 do {
1187 err = 0;
1188 PySSL_BEGIN_ALLOW_THREADS
1189 len = SSL_write(self->ssl, data, count);
1190 err = SSL_get_error(self->ssl, len);
1191 PySSL_END_ALLOW_THREADS
1192 if(PyErr_CheckSignals()) {
1193 return NULL;
1194 }
1195 if (err == SSL_ERROR_WANT_READ) {
Antoine Pitrou96125cf2010-05-12 14:05:34 +00001196 sockstate = check_socket_and_wait_for_timeout(self->Socket, 0);
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001197 } else if (err == SSL_ERROR_WANT_WRITE) {
Antoine Pitrou96125cf2010-05-12 14:05:34 +00001198 sockstate = check_socket_and_wait_for_timeout(self->Socket, 1);
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001199 } else {
1200 sockstate = SOCKET_OPERATION_OK;
1201 }
1202 if (sockstate == SOCKET_HAS_TIMED_OUT) {
1203 PyErr_SetString(PySSLErrorObject,
1204 "The write operation timed out");
1205 return NULL;
1206 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
1207 PyErr_SetString(PySSLErrorObject,
1208 "Underlying socket has been closed.");
1209 return NULL;
1210 } else if (sockstate == SOCKET_IS_NONBLOCKING) {
1211 break;
1212 }
1213 } while (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE);
1214 if (len > 0)
1215 return PyInt_FromLong(len);
1216 else
1217 return PySSL_SetError(self, len, __FILE__, __LINE__);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001218}
1219
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001220PyDoc_STRVAR(PySSL_SSLwrite_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001221"write(s) -> len\n\
1222\n\
1223Writes the string s into the SSL object. Returns the number\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001224of bytes written.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001225
Bill Janssen934b16d2008-06-28 22:19:33 +00001226static PyObject *PySSL_SSLpending(PySSLObject *self)
1227{
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001228 int count = 0;
Bill Janssen934b16d2008-06-28 22:19:33 +00001229
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001230 PySSL_BEGIN_ALLOW_THREADS
1231 count = SSL_pending(self->ssl);
1232 PySSL_END_ALLOW_THREADS
1233 if (count < 0)
1234 return PySSL_SetError(self, count, __FILE__, __LINE__);
1235 else
1236 return PyInt_FromLong(count);
Bill Janssen934b16d2008-06-28 22:19:33 +00001237}
1238
1239PyDoc_STRVAR(PySSL_SSLpending_doc,
1240"pending() -> count\n\
1241\n\
1242Returns the number of already decrypted bytes available for read,\n\
1243pending on the connection.\n");
1244
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001245static PyObject *PySSL_SSLread(PySSLObject *self, PyObject *args)
1246{
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001247 PyObject *buf;
1248 int count = 0;
1249 int len = 1024;
1250 int sockstate;
1251 int err;
1252 int nonblocking;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001253
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001254 if (!PyArg_ParseTuple(args, "|i:read", &len))
1255 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001256
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001257 if (!(buf = PyString_FromStringAndSize((char *) 0, len)))
1258 return NULL;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001259
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001260 /* just in case the blocking state of the socket has been changed */
1261 nonblocking = (self->Socket->sock_timeout >= 0.0);
1262 BIO_set_nbio(SSL_get_rbio(self->ssl), nonblocking);
1263 BIO_set_nbio(SSL_get_wbio(self->ssl), nonblocking);
Bill Janssen934b16d2008-06-28 22:19:33 +00001264
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001265 /* first check if there are bytes ready to be read */
1266 PySSL_BEGIN_ALLOW_THREADS
1267 count = SSL_pending(self->ssl);
1268 PySSL_END_ALLOW_THREADS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001269
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001270 if (!count) {
1271 sockstate = check_socket_and_wait_for_timeout(self->Socket, 0);
1272 if (sockstate == SOCKET_HAS_TIMED_OUT) {
1273 PyErr_SetString(PySSLErrorObject,
1274 "The read operation timed out");
1275 Py_DECREF(buf);
1276 return NULL;
1277 } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
1278 PyErr_SetString(PySSLErrorObject,
Antoine Pitrou96125cf2010-05-12 14:05:34 +00001279 "Underlying socket too large for select().");
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001280 Py_DECREF(buf);
1281 return NULL;
1282 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
1283 if (SSL_get_shutdown(self->ssl) !=
1284 SSL_RECEIVED_SHUTDOWN)
1285 {
1286 Py_DECREF(buf);
1287 PyErr_SetString(PySSLErrorObject,
Antoine Pitrou96125cf2010-05-12 14:05:34 +00001288 "Socket closed without SSL shutdown handshake");
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001289 return NULL;
1290 } else {
1291 /* should contain a zero-length string */
1292 _PyString_Resize(&buf, 0);
1293 return buf;
1294 }
1295 }
1296 }
1297 do {
1298 err = 0;
1299 PySSL_BEGIN_ALLOW_THREADS
1300 count = SSL_read(self->ssl, PyString_AsString(buf), len);
1301 err = SSL_get_error(self->ssl, count);
1302 PySSL_END_ALLOW_THREADS
1303 if(PyErr_CheckSignals()) {
1304 Py_DECREF(buf);
1305 return NULL;
1306 }
1307 if (err == SSL_ERROR_WANT_READ) {
Antoine Pitrou96125cf2010-05-12 14:05:34 +00001308 sockstate = check_socket_and_wait_for_timeout(self->Socket, 0);
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001309 } else if (err == SSL_ERROR_WANT_WRITE) {
Antoine Pitrou96125cf2010-05-12 14:05:34 +00001310 sockstate = check_socket_and_wait_for_timeout(self->Socket, 1);
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001311 } else if ((err == SSL_ERROR_ZERO_RETURN) &&
1312 (SSL_get_shutdown(self->ssl) ==
1313 SSL_RECEIVED_SHUTDOWN))
1314 {
1315 _PyString_Resize(&buf, 0);
1316 return buf;
1317 } else {
1318 sockstate = SOCKET_OPERATION_OK;
1319 }
1320 if (sockstate == SOCKET_HAS_TIMED_OUT) {
1321 PyErr_SetString(PySSLErrorObject,
1322 "The read operation timed out");
1323 Py_DECREF(buf);
1324 return NULL;
1325 } else if (sockstate == SOCKET_IS_NONBLOCKING) {
1326 break;
1327 }
1328 } while (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE);
1329 if (count <= 0) {
1330 Py_DECREF(buf);
1331 return PySSL_SetError(self, count, __FILE__, __LINE__);
1332 }
1333 if (count != len)
1334 _PyString_Resize(&buf, count);
1335 return buf;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001336}
1337
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001338PyDoc_STRVAR(PySSL_SSLread_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001339"read([len]) -> string\n\
1340\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001341Read up to len bytes from the SSL socket.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001342
Bill Janssen934b16d2008-06-28 22:19:33 +00001343static PyObject *PySSL_SSLshutdown(PySSLObject *self)
1344{
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001345 int err, ssl_err, sockstate, nonblocking;
1346 int zeros = 0;
Bill Janssen934b16d2008-06-28 22:19:33 +00001347
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001348 /* Guard against closed socket */
1349 if (self->Socket->sock_fd < 0) {
1350 PyErr_SetString(PySSLErrorObject,
1351 "Underlying socket has been closed.");
1352 return NULL;
1353 }
Bill Janssen934b16d2008-06-28 22:19:33 +00001354
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001355 /* Just in case the blocking state of the socket has been changed */
1356 nonblocking = (self->Socket->sock_timeout >= 0.0);
1357 BIO_set_nbio(SSL_get_rbio(self->ssl), nonblocking);
1358 BIO_set_nbio(SSL_get_wbio(self->ssl), nonblocking);
Antoine Pitrou07072162010-04-23 21:07:58 +00001359
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001360 while (1) {
1361 PySSL_BEGIN_ALLOW_THREADS
1362 /* Disable read-ahead so that unwrap can work correctly.
1363 * Otherwise OpenSSL might read in too much data,
1364 * eating clear text data that happens to be
1365 * transmitted after the SSL shutdown.
1366 * Should be safe to call repeatedly everytime this
1367 * function is used and the shutdown_seen_zero != 0
1368 * condition is met.
1369 */
1370 if (self->shutdown_seen_zero)
1371 SSL_set_read_ahead(self->ssl, 0);
1372 err = SSL_shutdown(self->ssl);
1373 PySSL_END_ALLOW_THREADS
1374 /* If err == 1, a secure shutdown with SSL_shutdown() is complete */
1375 if (err > 0)
1376 break;
1377 if (err == 0) {
1378 /* Don't loop endlessly; instead preserve legacy
1379 behaviour of trying SSL_shutdown() only twice.
1380 This looks necessary for OpenSSL < 0.9.8m */
1381 if (++zeros > 1)
1382 break;
1383 /* Shutdown was sent, now try receiving */
1384 self->shutdown_seen_zero = 1;
1385 continue;
1386 }
Antoine Pitrou07072162010-04-23 21:07:58 +00001387
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001388 /* Possibly retry shutdown until timeout or failure */
1389 ssl_err = SSL_get_error(self->ssl, err);
1390 if (ssl_err == SSL_ERROR_WANT_READ)
1391 sockstate = check_socket_and_wait_for_timeout(self->Socket, 0);
1392 else if (ssl_err == SSL_ERROR_WANT_WRITE)
1393 sockstate = check_socket_and_wait_for_timeout(self->Socket, 1);
1394 else
1395 break;
1396 if (sockstate == SOCKET_HAS_TIMED_OUT) {
1397 if (ssl_err == SSL_ERROR_WANT_READ)
1398 PyErr_SetString(PySSLErrorObject,
1399 "The read operation timed out");
1400 else
1401 PyErr_SetString(PySSLErrorObject,
1402 "The write operation timed out");
1403 return NULL;
1404 }
1405 else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
1406 PyErr_SetString(PySSLErrorObject,
1407 "Underlying socket too large for select().");
1408 return NULL;
1409 }
1410 else if (sockstate != SOCKET_OPERATION_OK)
1411 /* Retain the SSL error code */
1412 break;
1413 }
Bill Janssen934b16d2008-06-28 22:19:33 +00001414
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001415 if (err < 0)
1416 return PySSL_SetError(self, err, __FILE__, __LINE__);
1417 else {
1418 Py_INCREF(self->Socket);
1419 return (PyObject *) (self->Socket);
1420 }
Bill Janssen934b16d2008-06-28 22:19:33 +00001421}
1422
1423PyDoc_STRVAR(PySSL_SSLshutdown_doc,
1424"shutdown(s) -> socket\n\
1425\n\
1426Does the SSL shutdown handshake with the remote end, and returns\n\
1427the underlying socket object.");
1428
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001429static PyMethodDef PySSLMethods[] = {
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001430 {"do_handshake", (PyCFunction)PySSL_SSLdo_handshake, METH_NOARGS},
1431 {"write", (PyCFunction)PySSL_SSLwrite, METH_VARARGS,
1432 PySSL_SSLwrite_doc},
1433 {"read", (PyCFunction)PySSL_SSLread, METH_VARARGS,
1434 PySSL_SSLread_doc},
1435 {"pending", (PyCFunction)PySSL_SSLpending, METH_NOARGS,
1436 PySSL_SSLpending_doc},
1437 {"server", (PyCFunction)PySSL_server, METH_NOARGS},
1438 {"issuer", (PyCFunction)PySSL_issuer, METH_NOARGS},
1439 {"peer_certificate", (PyCFunction)PySSL_peercert, METH_VARARGS,
1440 PySSL_peercert_doc},
1441 {"cipher", (PyCFunction)PySSL_cipher, METH_NOARGS},
1442 {"shutdown", (PyCFunction)PySSL_SSLshutdown, METH_NOARGS,
1443 PySSL_SSLshutdown_doc},
1444 {NULL, NULL}
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001445};
1446
1447static PyObject *PySSL_getattr(PySSLObject *self, char *name)
1448{
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001449 return Py_FindMethod(PySSLMethods, (PyObject *)self, name);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001450}
1451
Jeremy Hylton938ace62002-07-17 16:30:39 +00001452static PyTypeObject PySSL_Type = {
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001453 PyVarObject_HEAD_INIT(NULL, 0)
1454 "ssl.SSLContext", /*tp_name*/
1455 sizeof(PySSLObject), /*tp_basicsize*/
1456 0, /*tp_itemsize*/
1457 /* methods */
1458 (destructor)PySSL_dealloc, /*tp_dealloc*/
1459 0, /*tp_print*/
1460 (getattrfunc)PySSL_getattr, /*tp_getattr*/
1461 0, /*tp_setattr*/
1462 0, /*tp_compare*/
1463 0, /*tp_repr*/
1464 0, /*tp_as_number*/
1465 0, /*tp_as_sequence*/
1466 0, /*tp_as_mapping*/
1467 0, /*tp_hash*/
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001468};
1469
1470#ifdef HAVE_OPENSSL_RAND
1471
1472/* helper routines for seeding the SSL PRNG */
1473static PyObject *
1474PySSL_RAND_add(PyObject *self, PyObject *args)
1475{
1476 char *buf;
1477 int len;
1478 double entropy;
1479
1480 if (!PyArg_ParseTuple(args, "s#d:RAND_add", &buf, &len, &entropy))
Antoine Pitrou96125cf2010-05-12 14:05:34 +00001481 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001482 RAND_add(buf, len, entropy);
1483 Py_INCREF(Py_None);
1484 return Py_None;
1485}
1486
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001487PyDoc_STRVAR(PySSL_RAND_add_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001488"RAND_add(string, entropy)\n\
1489\n\
1490Mix string into the OpenSSL PRNG state. entropy (a float) is a lower\n\
Bill Janssen98d19da2007-09-10 21:51:02 +00001491bound on the entropy contained in string. See RFC 1750.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001492
1493static PyObject *
1494PySSL_RAND_status(PyObject *self)
1495{
1496 return PyInt_FromLong(RAND_status());
1497}
1498
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001499PyDoc_STRVAR(PySSL_RAND_status_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001500"RAND_status() -> 0 or 1\n\
1501\n\
1502Returns 1 if the OpenSSL PRNG has been seeded with enough data and 0 if not.\n\
1503It is necessary to seed the PRNG with RAND_add() on some platforms before\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001504using the ssl() function.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001505
1506static PyObject *
1507PySSL_RAND_egd(PyObject *self, PyObject *arg)
1508{
1509 int bytes;
1510
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001511 if (!PyString_Check(arg))
Antoine Pitrou96125cf2010-05-12 14:05:34 +00001512 return PyErr_Format(PyExc_TypeError,
1513 "RAND_egd() expected string, found %s",
1514 Py_TYPE(arg)->tp_name);
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001515 bytes = RAND_egd(PyString_AS_STRING(arg));
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001516 if (bytes == -1) {
Antoine Pitrou96125cf2010-05-12 14:05:34 +00001517 PyErr_SetString(PySSLErrorObject,
1518 "EGD connection failed or EGD did not return "
1519 "enough data to seed the PRNG");
1520 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001521 }
1522 return PyInt_FromLong(bytes);
1523}
1524
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001525PyDoc_STRVAR(PySSL_RAND_egd_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001526"RAND_egd(path) -> bytes\n\
1527\n\
Bill Janssen98d19da2007-09-10 21:51:02 +00001528Queries the entropy gather daemon (EGD) on the socket named by 'path'.\n\
1529Returns number of bytes read. Raises SSLError if connection to EGD\n\
1530fails or if it does provide enough data to seed PRNG.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001531
1532#endif
1533
1534/* List of functions exported by this module. */
1535
1536static PyMethodDef PySSL_methods[] = {
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001537 {"sslwrap", PySSL_sslwrap,
1538 METH_VARARGS, ssl_doc},
1539 {"_test_decode_cert", PySSL_test_decode_certificate,
1540 METH_VARARGS},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001541#ifdef HAVE_OPENSSL_RAND
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001542 {"RAND_add", PySSL_RAND_add, METH_VARARGS,
1543 PySSL_RAND_add_doc},
1544 {"RAND_egd", PySSL_RAND_egd, METH_O,
1545 PySSL_RAND_egd_doc},
1546 {"RAND_status", (PyCFunction)PySSL_RAND_status, METH_NOARGS,
1547 PySSL_RAND_status_doc},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001548#endif
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001549 {NULL, NULL} /* Sentinel */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001550};
1551
1552
Bill Janssen98d19da2007-09-10 21:51:02 +00001553#ifdef WITH_THREAD
1554
1555/* an implementation of OpenSSL threading operations in terms
1556 of the Python C thread library */
1557
1558static PyThread_type_lock *_ssl_locks = NULL;
1559
1560static unsigned long _ssl_thread_id_function (void) {
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001561 return PyThread_get_thread_ident();
Bill Janssen98d19da2007-09-10 21:51:02 +00001562}
1563
1564static void _ssl_thread_locking_function (int mode, int n, const char *file, int line) {
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001565 /* this function is needed to perform locking on shared data
1566 structures. (Note that OpenSSL uses a number of global data
1567 structures that will be implicitly shared whenever multiple threads
1568 use OpenSSL.) Multi-threaded applications will crash at random if
1569 it is not set.
Bill Janssen98d19da2007-09-10 21:51:02 +00001570
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001571 locking_function() must be able to handle up to CRYPTO_num_locks()
1572 different mutex locks. It sets the n-th lock if mode & CRYPTO_LOCK, and
1573 releases it otherwise.
Bill Janssen98d19da2007-09-10 21:51:02 +00001574
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001575 file and line are the file number of the function setting the
1576 lock. They can be useful for debugging.
1577 */
Bill Janssen98d19da2007-09-10 21:51:02 +00001578
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001579 if ((_ssl_locks == NULL) ||
1580 (n < 0) || ((unsigned)n >= _ssl_locks_count))
1581 return;
Bill Janssen98d19da2007-09-10 21:51:02 +00001582
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001583 if (mode & CRYPTO_LOCK) {
1584 PyThread_acquire_lock(_ssl_locks[n], 1);
1585 } else {
1586 PyThread_release_lock(_ssl_locks[n]);
1587 }
Bill Janssen98d19da2007-09-10 21:51:02 +00001588}
1589
1590static int _setup_ssl_threads(void) {
1591
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001592 unsigned int i;
Bill Janssen98d19da2007-09-10 21:51:02 +00001593
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001594 if (_ssl_locks == NULL) {
1595 _ssl_locks_count = CRYPTO_num_locks();
1596 _ssl_locks = (PyThread_type_lock *)
1597 malloc(sizeof(PyThread_type_lock) * _ssl_locks_count);
1598 if (_ssl_locks == NULL)
1599 return 0;
1600 memset(_ssl_locks, 0, sizeof(PyThread_type_lock) * _ssl_locks_count);
1601 for (i = 0; i < _ssl_locks_count; i++) {
1602 _ssl_locks[i] = PyThread_allocate_lock();
1603 if (_ssl_locks[i] == NULL) {
1604 unsigned int j;
1605 for (j = 0; j < i; j++) {
1606 PyThread_free_lock(_ssl_locks[j]);
1607 }
1608 free(_ssl_locks);
1609 return 0;
1610 }
1611 }
1612 CRYPTO_set_locking_callback(_ssl_thread_locking_function);
1613 CRYPTO_set_id_callback(_ssl_thread_id_function);
1614 }
1615 return 1;
Bill Janssen98d19da2007-09-10 21:51:02 +00001616}
1617
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001618#endif /* def HAVE_THREAD */
Bill Janssen98d19da2007-09-10 21:51:02 +00001619
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001620PyDoc_STRVAR(module_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001621"Implementation module for SSL socket operations. See the socket module\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001622for documentation.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001623
Mark Hammondfe51c6d2002-08-02 02:27:13 +00001624PyMODINIT_FUNC
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001625init_ssl(void)
1626{
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001627 PyObject *m, *d;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001628
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001629 Py_TYPE(&PySSL_Type) = &PyType_Type;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001630
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001631 m = Py_InitModule3("_ssl", PySSL_methods, module_doc);
1632 if (m == NULL)
1633 return;
1634 d = PyModule_GetDict(m);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001635
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001636 /* Load _socket module and its C API */
1637 if (PySocketModule_ImportModuleAndAPI())
1638 return;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001639
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001640 /* Init OpenSSL */
1641 SSL_load_error_strings();
1642 SSL_library_init();
Bill Janssen98d19da2007-09-10 21:51:02 +00001643#ifdef WITH_THREAD
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001644 /* note that this will start threading if not already started */
1645 if (!_setup_ssl_threads()) {
1646 return;
1647 }
Bill Janssen98d19da2007-09-10 21:51:02 +00001648#endif
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001649 OpenSSL_add_all_algorithms();
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001650
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001651 /* Add symbols to module dict */
1652 PySSLErrorObject = PyErr_NewException("ssl.SSLError",
1653 PySocketModule.error,
1654 NULL);
1655 if (PySSLErrorObject == NULL)
1656 return;
1657 if (PyDict_SetItemString(d, "SSLError", PySSLErrorObject) != 0)
1658 return;
1659 if (PyDict_SetItemString(d, "SSLType",
1660 (PyObject *)&PySSL_Type) != 0)
1661 return;
1662 PyModule_AddIntConstant(m, "SSL_ERROR_ZERO_RETURN",
1663 PY_SSL_ERROR_ZERO_RETURN);
1664 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_READ",
1665 PY_SSL_ERROR_WANT_READ);
1666 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_WRITE",
1667 PY_SSL_ERROR_WANT_WRITE);
1668 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_X509_LOOKUP",
1669 PY_SSL_ERROR_WANT_X509_LOOKUP);
1670 PyModule_AddIntConstant(m, "SSL_ERROR_SYSCALL",
1671 PY_SSL_ERROR_SYSCALL);
1672 PyModule_AddIntConstant(m, "SSL_ERROR_SSL",
1673 PY_SSL_ERROR_SSL);
1674 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_CONNECT",
1675 PY_SSL_ERROR_WANT_CONNECT);
1676 /* non ssl.h errorcodes */
1677 PyModule_AddIntConstant(m, "SSL_ERROR_EOF",
1678 PY_SSL_ERROR_EOF);
1679 PyModule_AddIntConstant(m, "SSL_ERROR_INVALID_ERROR_CODE",
1680 PY_SSL_ERROR_INVALID_ERROR_CODE);
1681 /* cert requirements */
1682 PyModule_AddIntConstant(m, "CERT_NONE",
1683 PY_SSL_CERT_NONE);
1684 PyModule_AddIntConstant(m, "CERT_OPTIONAL",
1685 PY_SSL_CERT_OPTIONAL);
1686 PyModule_AddIntConstant(m, "CERT_REQUIRED",
1687 PY_SSL_CERT_REQUIRED);
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001688
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001689 /* protocol versions */
1690 PyModule_AddIntConstant(m, "PROTOCOL_SSLv2",
1691 PY_SSL_VERSION_SSL2);
1692 PyModule_AddIntConstant(m, "PROTOCOL_SSLv3",
1693 PY_SSL_VERSION_SSL3);
1694 PyModule_AddIntConstant(m, "PROTOCOL_SSLv23",
1695 PY_SSL_VERSION_SSL23);
1696 PyModule_AddIntConstant(m, "PROTOCOL_TLSv1",
1697 PY_SSL_VERSION_TLS1);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001698}