blob: 220f4cb855ad089473a75ecf0bc7616d1f52d540 [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;
184 errstr =
185 "The operation did not complete (X509 lookup)";
186 break;
187 case SSL_ERROR_WANT_CONNECT:
188 p = PY_SSL_ERROR_WANT_CONNECT;
189 errstr = "The operation did not complete (connect)";
190 break;
191 case SSL_ERROR_SYSCALL:
192 {
193 unsigned long e = ERR_get_error();
194 if (e == 0) {
195 if (ret == 0 || !obj->Socket) {
196 p = PY_SSL_ERROR_EOF;
197 errstr =
198 "EOF occurred in violation of protocol";
199 } else if (ret == -1) {
200 /* underlying BIO reported an I/O error */
201 return obj->Socket->errorhandler();
202 } else { /* possible? */
203 p = PY_SSL_ERROR_SYSCALL;
204 errstr = "Some I/O error occurred";
205 }
206 } else {
207 p = PY_SSL_ERROR_SYSCALL;
208 /* XXX Protected by global interpreter lock */
209 errstr = ERR_error_string(e, NULL);
210 }
211 break;
212 }
213 case SSL_ERROR_SSL:
214 {
215 unsigned long e = ERR_get_error();
216 p = PY_SSL_ERROR_SSL;
217 if (e != 0)
218 /* XXX Protected by global interpreter lock */
219 errstr = ERR_error_string(e, NULL);
220 else { /* possible? */
221 errstr =
222 "A failure in the SSL library occurred";
223 }
224 break;
225 }
226 default:
227 p = PY_SSL_ERROR_INVALID_ERROR_CODE;
228 errstr = "Invalid error code";
229 }
230 } else {
231 errstr = ERR_error_string(ERR_peek_last_error(), NULL);
232 }
233 PyOS_snprintf(buf, sizeof(buf), "_ssl.c:%d: %s", lineno, errstr);
234 v = Py_BuildValue("(is)", p, buf);
235 if (v != NULL) {
236 PyErr_SetObject(PySSLErrorObject, v);
237 Py_DECREF(v);
238 }
239 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000240}
241
Bill Janssen98d19da2007-09-10 21:51:02 +0000242static PyObject *
243_setSSLError (char *errstr, int errcode, char *filename, int lineno) {
244
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000245 char buf[2048];
246 PyObject *v;
Bill Janssen98d19da2007-09-10 21:51:02 +0000247
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000248 if (errstr == NULL) {
249 errcode = ERR_peek_last_error();
250 errstr = ERR_error_string(errcode, NULL);
251 }
252 PyOS_snprintf(buf, sizeof(buf), "_ssl.c:%d: %s", lineno, errstr);
253 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 "
319 "verification of other-side certificates.");
320 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,
475 ERRSTR("The handshake operation timed out"));
476 return NULL;
477 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
478 PyErr_SetString(PySSLErrorObject,
479 ERRSTR("Underlying socket has been closed."));
480 return NULL;
481 } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
482 PyErr_SetString(PySSLErrorObject,
483 ERRSTR("Underlying socket too large for select()."));
484 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__);
491 self->ssl->debug = 1;
Bill Janssen934b16d2008-06-28 22:19:33 +0000492
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000493 if (self->peer_cert)
494 X509_free (self->peer_cert);
495 PySSL_BEGIN_ALLOW_THREADS
496 if ((self->peer_cert = SSL_get_peer_certificate(self->ssl))) {
497 X509_NAME_oneline(X509_get_subject_name(self->peer_cert),
498 self->server, X509_NAME_MAXLEN);
499 X509_NAME_oneline(X509_get_issuer_name(self->peer_cert),
500 self->issuer, X509_NAME_MAXLEN);
501 }
502 PySSL_END_ALLOW_THREADS
Bill Janssen934b16d2008-06-28 22:19:33 +0000503
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000504 Py_INCREF(Py_None);
505 return Py_None;
Bill Janssen934b16d2008-06-28 22:19:33 +0000506}
507
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000508static PyObject *
509PySSL_server(PySSLObject *self)
510{
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000511 return PyString_FromString(self->server);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000512}
513
514static PyObject *
515PySSL_issuer(PySSLObject *self)
516{
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000517 return PyString_FromString(self->issuer);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000518}
519
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000520static PyObject *
Bill Janssen98d19da2007-09-10 21:51:02 +0000521_create_tuple_for_attribute (ASN1_OBJECT *name, ASN1_STRING *value) {
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000522
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000523 char namebuf[X509_NAME_MAXLEN];
524 int buflen;
525 PyObject *name_obj;
526 PyObject *value_obj;
527 PyObject *attr;
528 unsigned char *valuebuf = NULL;
Guido van Rossum780b80d2007-08-27 18:42:23 +0000529
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000530 buflen = OBJ_obj2txt(namebuf, sizeof(namebuf), name, 0);
531 if (buflen < 0) {
532 _setSSLError(NULL, 0, __FILE__, __LINE__);
533 goto fail;
534 }
535 name_obj = PyString_FromStringAndSize(namebuf, buflen);
536 if (name_obj == NULL)
537 goto fail;
538
539 buflen = ASN1_STRING_to_UTF8(&valuebuf, value);
540 if (buflen < 0) {
541 _setSSLError(NULL, 0, __FILE__, __LINE__);
542 Py_DECREF(name_obj);
543 goto fail;
544 }
545 value_obj = PyUnicode_DecodeUTF8((char *) valuebuf,
546 buflen, "strict");
547 OPENSSL_free(valuebuf);
548 if (value_obj == NULL) {
549 Py_DECREF(name_obj);
550 goto fail;
551 }
552 attr = PyTuple_New(2);
553 if (attr == NULL) {
554 Py_DECREF(name_obj);
555 Py_DECREF(value_obj);
556 goto fail;
557 }
558 PyTuple_SET_ITEM(attr, 0, name_obj);
559 PyTuple_SET_ITEM(attr, 1, value_obj);
560 return attr;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000561
Bill Janssen98d19da2007-09-10 21:51:02 +0000562 fail:
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000563 return NULL;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000564}
565
566static PyObject *
Bill Janssen98d19da2007-09-10 21:51:02 +0000567_create_tuple_for_X509_NAME (X509_NAME *xname)
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000568{
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000569 PyObject *dn = NULL; /* tuple which represents the "distinguished name" */
570 PyObject *rdn = NULL; /* tuple to hold a "relative distinguished name" */
571 PyObject *rdnt;
572 PyObject *attr = NULL; /* tuple to hold an attribute */
573 int entry_count = X509_NAME_entry_count(xname);
574 X509_NAME_ENTRY *entry;
575 ASN1_OBJECT *name;
576 ASN1_STRING *value;
577 int index_counter;
578 int rdn_level = -1;
579 int retcode;
Bill Janssen98d19da2007-09-10 21:51:02 +0000580
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000581 dn = PyList_New(0);
582 if (dn == NULL)
583 return NULL;
584 /* now create another tuple to hold the top-level RDN */
585 rdn = PyList_New(0);
586 if (rdn == NULL)
587 goto fail0;
Bill Janssen98d19da2007-09-10 21:51:02 +0000588
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000589 for (index_counter = 0;
590 index_counter < entry_count;
591 index_counter++)
592 {
593 entry = X509_NAME_get_entry(xname, index_counter);
Bill Janssen98d19da2007-09-10 21:51:02 +0000594
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000595 /* check to see if we've gotten to a new RDN */
596 if (rdn_level >= 0) {
597 if (rdn_level != entry->set) {
598 /* yes, new RDN */
599 /* add old RDN to DN */
600 rdnt = PyList_AsTuple(rdn);
601 Py_DECREF(rdn);
602 if (rdnt == NULL)
603 goto fail0;
604 retcode = PyList_Append(dn, rdnt);
605 Py_DECREF(rdnt);
606 if (retcode < 0)
607 goto fail0;
608 /* create new RDN */
609 rdn = PyList_New(0);
610 if (rdn == NULL)
611 goto fail0;
612 }
613 }
614 rdn_level = entry->set;
Bill Janssen98d19da2007-09-10 21:51:02 +0000615
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000616 /* now add this attribute to the current RDN */
617 name = X509_NAME_ENTRY_get_object(entry);
618 value = X509_NAME_ENTRY_get_data(entry);
619 attr = _create_tuple_for_attribute(name, value);
620 /*
621 fprintf(stderr, "RDN level %d, attribute %s: %s\n",
622 entry->set,
623 PyString_AS_STRING(PyTuple_GET_ITEM(attr, 0)),
624 PyString_AS_STRING(PyTuple_GET_ITEM(attr, 1)));
625 */
626 if (attr == NULL)
627 goto fail1;
628 retcode = PyList_Append(rdn, attr);
629 Py_DECREF(attr);
630 if (retcode < 0)
631 goto fail1;
632 }
633 /* now, there's typically a dangling RDN */
634 if ((rdn != NULL) && (PyList_Size(rdn) > 0)) {
635 rdnt = PyList_AsTuple(rdn);
636 Py_DECREF(rdn);
637 if (rdnt == NULL)
638 goto fail0;
639 retcode = PyList_Append(dn, rdnt);
640 Py_DECREF(rdnt);
641 if (retcode < 0)
642 goto fail0;
643 }
Bill Janssen98d19da2007-09-10 21:51:02 +0000644
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000645 /* convert list to tuple */
646 rdnt = PyList_AsTuple(dn);
647 Py_DECREF(dn);
648 if (rdnt == NULL)
649 return NULL;
650 return rdnt;
Bill Janssen98d19da2007-09-10 21:51:02 +0000651
652 fail1:
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000653 Py_XDECREF(rdn);
Bill Janssen98d19da2007-09-10 21:51:02 +0000654
655 fail0:
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000656 Py_XDECREF(dn);
657 return NULL;
Bill Janssen98d19da2007-09-10 21:51:02 +0000658}
659
660static PyObject *
661_get_peer_alt_names (X509 *certificate) {
Bill Janssen98d19da2007-09-10 21:51:02 +0000662
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000663 /* this code follows the procedure outlined in
664 OpenSSL's crypto/x509v3/v3_prn.c:X509v3_EXT_print()
665 function to extract the STACK_OF(GENERAL_NAME),
666 then iterates through the stack to add the
667 names. */
Bill Janssen98d19da2007-09-10 21:51:02 +0000668
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000669 int i, j;
670 PyObject *peer_alt_names = Py_None;
671 PyObject *v, *t;
672 X509_EXTENSION *ext = NULL;
673 GENERAL_NAMES *names = NULL;
674 GENERAL_NAME *name;
675 X509V3_EXT_METHOD *method;
676 BIO *biobuf = NULL;
677 char buf[2048];
678 char *vptr;
679 int len;
680 const unsigned char *p;
Bill Janssen98d19da2007-09-10 21:51:02 +0000681
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000682 if (certificate == NULL)
683 return peer_alt_names;
Bill Janssen98d19da2007-09-10 21:51:02 +0000684
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000685 /* get a memory buffer */
686 biobuf = BIO_new(BIO_s_mem());
Bill Janssen98d19da2007-09-10 21:51:02 +0000687
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000688 i = 0;
689 while ((i = X509_get_ext_by_NID(
690 certificate, NID_subject_alt_name, i)) >= 0) {
Bill Janssen98d19da2007-09-10 21:51:02 +0000691
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000692 if (peer_alt_names == Py_None) {
693 peer_alt_names = PyList_New(0);
694 if (peer_alt_names == NULL)
695 goto fail;
696 }
Bill Janssen98d19da2007-09-10 21:51:02 +0000697
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000698 /* now decode the altName */
699 ext = X509_get_ext(certificate, i);
700 if(!(method = X509V3_EXT_get(ext))) {
701 PyErr_SetString(PySSLErrorObject,
702 ERRSTR("No method for internalizing subjectAltName!"));
703 goto fail;
704 }
Bill Janssen98d19da2007-09-10 21:51:02 +0000705
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000706 p = ext->value->data;
707 if (method->it)
708 names = (GENERAL_NAMES*) (ASN1_item_d2i(NULL,
709 &p,
710 ext->value->length,
711 ASN1_ITEM_ptr(method->it)));
712 else
713 names = (GENERAL_NAMES*) (method->d2i(NULL,
714 &p,
715 ext->value->length));
Bill Janssen98d19da2007-09-10 21:51:02 +0000716
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000717 for(j = 0; j < sk_GENERAL_NAME_num(names); j++) {
Bill Janssen98d19da2007-09-10 21:51:02 +0000718
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000719 /* get a rendering of each name in the set of names */
Bill Janssen98d19da2007-09-10 21:51:02 +0000720
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000721 name = sk_GENERAL_NAME_value(names, j);
722 if (name->type == GEN_DIRNAME) {
Bill Janssen98d19da2007-09-10 21:51:02 +0000723
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000724 /* we special-case DirName as a tuple of tuples of attributes */
Bill Janssen98d19da2007-09-10 21:51:02 +0000725
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000726 t = PyTuple_New(2);
727 if (t == NULL) {
728 goto fail;
729 }
Bill Janssen98d19da2007-09-10 21:51:02 +0000730
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000731 v = PyString_FromString("DirName");
732 if (v == NULL) {
733 Py_DECREF(t);
734 goto fail;
735 }
736 PyTuple_SET_ITEM(t, 0, v);
Bill Janssen98d19da2007-09-10 21:51:02 +0000737
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000738 v = _create_tuple_for_X509_NAME (name->d.dirn);
739 if (v == NULL) {
740 Py_DECREF(t);
741 goto fail;
742 }
743 PyTuple_SET_ITEM(t, 1, v);
Bill Janssen98d19da2007-09-10 21:51:02 +0000744
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000745 } else {
Bill Janssen98d19da2007-09-10 21:51:02 +0000746
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000747 /* for everything else, we use the OpenSSL print form */
748
749 (void) BIO_reset(biobuf);
750 GENERAL_NAME_print(biobuf, name);
751 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
752 if (len < 0) {
753 _setSSLError(NULL, 0, __FILE__, __LINE__);
754 goto fail;
755 }
756 vptr = strchr(buf, ':');
757 if (vptr == NULL)
758 goto fail;
759 t = PyTuple_New(2);
760 if (t == NULL)
761 goto fail;
762 v = PyString_FromStringAndSize(buf, (vptr - buf));
763 if (v == NULL) {
764 Py_DECREF(t);
765 goto fail;
766 }
767 PyTuple_SET_ITEM(t, 0, v);
768 v = PyString_FromStringAndSize((vptr + 1), (len - (vptr - buf + 1)));
769 if (v == NULL) {
770 Py_DECREF(t);
771 goto fail;
772 }
773 PyTuple_SET_ITEM(t, 1, v);
774 }
775
776 /* and add that rendering to the list */
777
778 if (PyList_Append(peer_alt_names, t) < 0) {
779 Py_DECREF(t);
780 goto fail;
781 }
782 Py_DECREF(t);
783 }
784 }
785 BIO_free(biobuf);
786 if (peer_alt_names != Py_None) {
787 v = PyList_AsTuple(peer_alt_names);
788 Py_DECREF(peer_alt_names);
789 return v;
790 } else {
791 return peer_alt_names;
792 }
793
Bill Janssen98d19da2007-09-10 21:51:02 +0000794
795 fail:
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000796 if (biobuf != NULL)
797 BIO_free(biobuf);
Bill Janssen98d19da2007-09-10 21:51:02 +0000798
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000799 if (peer_alt_names != Py_None) {
800 Py_XDECREF(peer_alt_names);
801 }
Bill Janssen98d19da2007-09-10 21:51:02 +0000802
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000803 return NULL;
Bill Janssen98d19da2007-09-10 21:51:02 +0000804}
805
806static PyObject *
807_decode_certificate (X509 *certificate, int verbose) {
808
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000809 PyObject *retval = NULL;
810 BIO *biobuf = NULL;
811 PyObject *peer;
812 PyObject *peer_alt_names = NULL;
813 PyObject *issuer;
814 PyObject *version;
815 PyObject *sn_obj;
816 ASN1_INTEGER *serialNumber;
817 char buf[2048];
818 int len;
819 ASN1_TIME *notBefore, *notAfter;
820 PyObject *pnotBefore, *pnotAfter;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000821
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000822 retval = PyDict_New();
823 if (retval == NULL)
824 return NULL;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000825
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000826 peer = _create_tuple_for_X509_NAME(
827 X509_get_subject_name(certificate));
828 if (peer == NULL)
829 goto fail0;
830 if (PyDict_SetItemString(retval, (const char *) "subject", peer) < 0) {
831 Py_DECREF(peer);
832 goto fail0;
833 }
834 Py_DECREF(peer);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000835
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000836 if (verbose) {
837 issuer = _create_tuple_for_X509_NAME(
838 X509_get_issuer_name(certificate));
839 if (issuer == NULL)
840 goto fail0;
841 if (PyDict_SetItemString(retval, (const char *)"issuer", issuer) < 0) {
842 Py_DECREF(issuer);
843 goto fail0;
844 }
845 Py_DECREF(issuer);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000846
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000847 version = PyInt_FromLong(X509_get_version(certificate) + 1);
848 if (PyDict_SetItemString(retval, "version", version) < 0) {
849 Py_DECREF(version);
850 goto fail0;
851 }
852 Py_DECREF(version);
853 }
Bill Janssen98d19da2007-09-10 21:51:02 +0000854
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000855 /* get a memory buffer */
856 biobuf = BIO_new(BIO_s_mem());
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000857
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000858 if (verbose) {
Bill Janssen98d19da2007-09-10 21:51:02 +0000859
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000860 (void) BIO_reset(biobuf);
861 serialNumber = X509_get_serialNumber(certificate);
862 /* should not exceed 20 octets, 160 bits, so buf is big enough */
863 i2a_ASN1_INTEGER(biobuf, serialNumber);
864 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
865 if (len < 0) {
866 _setSSLError(NULL, 0, __FILE__, __LINE__);
867 goto fail1;
868 }
869 sn_obj = PyString_FromStringAndSize(buf, len);
870 if (sn_obj == NULL)
871 goto fail1;
872 if (PyDict_SetItemString(retval, "serialNumber", sn_obj) < 0) {
873 Py_DECREF(sn_obj);
874 goto fail1;
875 }
876 Py_DECREF(sn_obj);
Bill Janssen98d19da2007-09-10 21:51:02 +0000877
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000878 (void) BIO_reset(biobuf);
879 notBefore = X509_get_notBefore(certificate);
880 ASN1_TIME_print(biobuf, notBefore);
881 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
882 if (len < 0) {
883 _setSSLError(NULL, 0, __FILE__, __LINE__);
884 goto fail1;
885 }
886 pnotBefore = PyString_FromStringAndSize(buf, len);
887 if (pnotBefore == NULL)
888 goto fail1;
889 if (PyDict_SetItemString(retval, "notBefore", pnotBefore) < 0) {
890 Py_DECREF(pnotBefore);
891 goto fail1;
892 }
893 Py_DECREF(pnotBefore);
894 }
895
896 (void) BIO_reset(biobuf);
897 notAfter = X509_get_notAfter(certificate);
898 ASN1_TIME_print(biobuf, notAfter);
899 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
900 if (len < 0) {
901 _setSSLError(NULL, 0, __FILE__, __LINE__);
902 goto fail1;
903 }
904 pnotAfter = PyString_FromStringAndSize(buf, len);
905 if (pnotAfter == NULL)
906 goto fail1;
907 if (PyDict_SetItemString(retval, "notAfter", pnotAfter) < 0) {
908 Py_DECREF(pnotAfter);
909 goto fail1;
910 }
911 Py_DECREF(pnotAfter);
912
913 /* Now look for subjectAltName */
914
915 peer_alt_names = _get_peer_alt_names(certificate);
916 if (peer_alt_names == NULL)
917 goto fail1;
918 else if (peer_alt_names != Py_None) {
919 if (PyDict_SetItemString(retval, "subjectAltName",
920 peer_alt_names) < 0) {
921 Py_DECREF(peer_alt_names);
922 goto fail1;
923 }
924 Py_DECREF(peer_alt_names);
925 }
926
927 BIO_free(biobuf);
928 return retval;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000929
930 fail1:
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000931 if (biobuf != NULL)
932 BIO_free(biobuf);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000933 fail0:
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000934 Py_XDECREF(retval);
935 return NULL;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000936}
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000937
Bill Janssen98d19da2007-09-10 21:51:02 +0000938
939static PyObject *
940PySSL_test_decode_certificate (PyObject *mod, PyObject *args) {
941
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000942 PyObject *retval = NULL;
943 char *filename = NULL;
944 X509 *x=NULL;
945 BIO *cert;
946 int verbose = 1;
Bill Janssen98d19da2007-09-10 21:51:02 +0000947
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000948 if (!PyArg_ParseTuple(args, "s|i:test_decode_certificate", &filename, &verbose))
949 return NULL;
Bill Janssen98d19da2007-09-10 21:51:02 +0000950
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000951 if ((cert=BIO_new(BIO_s_file())) == NULL) {
952 PyErr_SetString(PySSLErrorObject, "Can't malloc memory to read file");
953 goto fail0;
954 }
Bill Janssen98d19da2007-09-10 21:51:02 +0000955
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000956 if (BIO_read_filename(cert,filename) <= 0) {
957 PyErr_SetString(PySSLErrorObject, "Can't open file");
958 goto fail0;
959 }
Bill Janssen98d19da2007-09-10 21:51:02 +0000960
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000961 x = PEM_read_bio_X509_AUX(cert,NULL, NULL, NULL);
962 if (x == NULL) {
963 PyErr_SetString(PySSLErrorObject, "Error decoding PEM-encoded file");
964 goto fail0;
965 }
Bill Janssen98d19da2007-09-10 21:51:02 +0000966
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000967 retval = _decode_certificate(x, verbose);
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) {
1196 sockstate =
1197 check_socket_and_wait_for_timeout(self->Socket, 0);
1198 } else if (err == SSL_ERROR_WANT_WRITE) {
1199 sockstate =
1200 check_socket_and_wait_for_timeout(self->Socket, 1);
1201 } else {
1202 sockstate = SOCKET_OPERATION_OK;
1203 }
1204 if (sockstate == SOCKET_HAS_TIMED_OUT) {
1205 PyErr_SetString(PySSLErrorObject,
1206 "The write operation timed out");
1207 return NULL;
1208 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
1209 PyErr_SetString(PySSLErrorObject,
1210 "Underlying socket has been closed.");
1211 return NULL;
1212 } else if (sockstate == SOCKET_IS_NONBLOCKING) {
1213 break;
1214 }
1215 } while (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE);
1216 if (len > 0)
1217 return PyInt_FromLong(len);
1218 else
1219 return PySSL_SetError(self, len, __FILE__, __LINE__);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001220}
1221
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001222PyDoc_STRVAR(PySSL_SSLwrite_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001223"write(s) -> len\n\
1224\n\
1225Writes the string s into the SSL object. Returns the number\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001226of bytes written.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001227
Bill Janssen934b16d2008-06-28 22:19:33 +00001228static PyObject *PySSL_SSLpending(PySSLObject *self)
1229{
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001230 int count = 0;
Bill Janssen934b16d2008-06-28 22:19:33 +00001231
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001232 PySSL_BEGIN_ALLOW_THREADS
1233 count = SSL_pending(self->ssl);
1234 PySSL_END_ALLOW_THREADS
1235 if (count < 0)
1236 return PySSL_SetError(self, count, __FILE__, __LINE__);
1237 else
1238 return PyInt_FromLong(count);
Bill Janssen934b16d2008-06-28 22:19:33 +00001239}
1240
1241PyDoc_STRVAR(PySSL_SSLpending_doc,
1242"pending() -> count\n\
1243\n\
1244Returns the number of already decrypted bytes available for read,\n\
1245pending on the connection.\n");
1246
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001247static PyObject *PySSL_SSLread(PySSLObject *self, PyObject *args)
1248{
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001249 PyObject *buf;
1250 int count = 0;
1251 int len = 1024;
1252 int sockstate;
1253 int err;
1254 int nonblocking;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001255
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001256 if (!PyArg_ParseTuple(args, "|i:read", &len))
1257 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001258
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001259 if (!(buf = PyString_FromStringAndSize((char *) 0, len)))
1260 return NULL;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001261
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001262 /* just in case the blocking state of the socket has been changed */
1263 nonblocking = (self->Socket->sock_timeout >= 0.0);
1264 BIO_set_nbio(SSL_get_rbio(self->ssl), nonblocking);
1265 BIO_set_nbio(SSL_get_wbio(self->ssl), nonblocking);
Bill Janssen934b16d2008-06-28 22:19:33 +00001266
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001267 /* first check if there are bytes ready to be read */
1268 PySSL_BEGIN_ALLOW_THREADS
1269 count = SSL_pending(self->ssl);
1270 PySSL_END_ALLOW_THREADS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001271
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001272 if (!count) {
1273 sockstate = check_socket_and_wait_for_timeout(self->Socket, 0);
1274 if (sockstate == SOCKET_HAS_TIMED_OUT) {
1275 PyErr_SetString(PySSLErrorObject,
1276 "The read operation timed out");
1277 Py_DECREF(buf);
1278 return NULL;
1279 } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
1280 PyErr_SetString(PySSLErrorObject,
1281 "Underlying socket too large for select().");
1282 Py_DECREF(buf);
1283 return NULL;
1284 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
1285 if (SSL_get_shutdown(self->ssl) !=
1286 SSL_RECEIVED_SHUTDOWN)
1287 {
1288 Py_DECREF(buf);
1289 PyErr_SetString(PySSLErrorObject,
1290 "Socket closed without SSL shutdown handshake");
1291 return NULL;
1292 } else {
1293 /* should contain a zero-length string */
1294 _PyString_Resize(&buf, 0);
1295 return buf;
1296 }
1297 }
1298 }
1299 do {
1300 err = 0;
1301 PySSL_BEGIN_ALLOW_THREADS
1302 count = SSL_read(self->ssl, PyString_AsString(buf), len);
1303 err = SSL_get_error(self->ssl, count);
1304 PySSL_END_ALLOW_THREADS
1305 if(PyErr_CheckSignals()) {
1306 Py_DECREF(buf);
1307 return NULL;
1308 }
1309 if (err == SSL_ERROR_WANT_READ) {
1310 sockstate =
1311 check_socket_and_wait_for_timeout(self->Socket, 0);
1312 } else if (err == SSL_ERROR_WANT_WRITE) {
1313 sockstate =
1314 check_socket_and_wait_for_timeout(self->Socket, 1);
1315 } else if ((err == SSL_ERROR_ZERO_RETURN) &&
1316 (SSL_get_shutdown(self->ssl) ==
1317 SSL_RECEIVED_SHUTDOWN))
1318 {
1319 _PyString_Resize(&buf, 0);
1320 return buf;
1321 } else {
1322 sockstate = SOCKET_OPERATION_OK;
1323 }
1324 if (sockstate == SOCKET_HAS_TIMED_OUT) {
1325 PyErr_SetString(PySSLErrorObject,
1326 "The read operation timed out");
1327 Py_DECREF(buf);
1328 return NULL;
1329 } else if (sockstate == SOCKET_IS_NONBLOCKING) {
1330 break;
1331 }
1332 } while (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE);
1333 if (count <= 0) {
1334 Py_DECREF(buf);
1335 return PySSL_SetError(self, count, __FILE__, __LINE__);
1336 }
1337 if (count != len)
1338 _PyString_Resize(&buf, count);
1339 return buf;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001340}
1341
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001342PyDoc_STRVAR(PySSL_SSLread_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001343"read([len]) -> string\n\
1344\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001345Read up to len bytes from the SSL socket.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001346
Bill Janssen934b16d2008-06-28 22:19:33 +00001347static PyObject *PySSL_SSLshutdown(PySSLObject *self)
1348{
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001349 int err, ssl_err, sockstate, nonblocking;
1350 int zeros = 0;
Bill Janssen934b16d2008-06-28 22:19:33 +00001351
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001352 /* Guard against closed socket */
1353 if (self->Socket->sock_fd < 0) {
1354 PyErr_SetString(PySSLErrorObject,
1355 "Underlying socket has been closed.");
1356 return NULL;
1357 }
Bill Janssen934b16d2008-06-28 22:19:33 +00001358
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001359 /* Just in case the blocking state of the socket has been changed */
1360 nonblocking = (self->Socket->sock_timeout >= 0.0);
1361 BIO_set_nbio(SSL_get_rbio(self->ssl), nonblocking);
1362 BIO_set_nbio(SSL_get_wbio(self->ssl), nonblocking);
Antoine Pitrou07072162010-04-23 21:07:58 +00001363
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001364 while (1) {
1365 PySSL_BEGIN_ALLOW_THREADS
1366 /* Disable read-ahead so that unwrap can work correctly.
1367 * Otherwise OpenSSL might read in too much data,
1368 * eating clear text data that happens to be
1369 * transmitted after the SSL shutdown.
1370 * Should be safe to call repeatedly everytime this
1371 * function is used and the shutdown_seen_zero != 0
1372 * condition is met.
1373 */
1374 if (self->shutdown_seen_zero)
1375 SSL_set_read_ahead(self->ssl, 0);
1376 err = SSL_shutdown(self->ssl);
1377 PySSL_END_ALLOW_THREADS
1378 /* If err == 1, a secure shutdown with SSL_shutdown() is complete */
1379 if (err > 0)
1380 break;
1381 if (err == 0) {
1382 /* Don't loop endlessly; instead preserve legacy
1383 behaviour of trying SSL_shutdown() only twice.
1384 This looks necessary for OpenSSL < 0.9.8m */
1385 if (++zeros > 1)
1386 break;
1387 /* Shutdown was sent, now try receiving */
1388 self->shutdown_seen_zero = 1;
1389 continue;
1390 }
Antoine Pitrou07072162010-04-23 21:07:58 +00001391
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001392 /* Possibly retry shutdown until timeout or failure */
1393 ssl_err = SSL_get_error(self->ssl, err);
1394 if (ssl_err == SSL_ERROR_WANT_READ)
1395 sockstate = check_socket_and_wait_for_timeout(self->Socket, 0);
1396 else if (ssl_err == SSL_ERROR_WANT_WRITE)
1397 sockstate = check_socket_and_wait_for_timeout(self->Socket, 1);
1398 else
1399 break;
1400 if (sockstate == SOCKET_HAS_TIMED_OUT) {
1401 if (ssl_err == SSL_ERROR_WANT_READ)
1402 PyErr_SetString(PySSLErrorObject,
1403 "The read operation timed out");
1404 else
1405 PyErr_SetString(PySSLErrorObject,
1406 "The write operation timed out");
1407 return NULL;
1408 }
1409 else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
1410 PyErr_SetString(PySSLErrorObject,
1411 "Underlying socket too large for select().");
1412 return NULL;
1413 }
1414 else if (sockstate != SOCKET_OPERATION_OK)
1415 /* Retain the SSL error code */
1416 break;
1417 }
Bill Janssen934b16d2008-06-28 22:19:33 +00001418
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001419 if (err < 0)
1420 return PySSL_SetError(self, err, __FILE__, __LINE__);
1421 else {
1422 Py_INCREF(self->Socket);
1423 return (PyObject *) (self->Socket);
1424 }
Bill Janssen934b16d2008-06-28 22:19:33 +00001425}
1426
1427PyDoc_STRVAR(PySSL_SSLshutdown_doc,
1428"shutdown(s) -> socket\n\
1429\n\
1430Does the SSL shutdown handshake with the remote end, and returns\n\
1431the underlying socket object.");
1432
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001433static PyMethodDef PySSLMethods[] = {
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001434 {"do_handshake", (PyCFunction)PySSL_SSLdo_handshake, METH_NOARGS},
1435 {"write", (PyCFunction)PySSL_SSLwrite, METH_VARARGS,
1436 PySSL_SSLwrite_doc},
1437 {"read", (PyCFunction)PySSL_SSLread, METH_VARARGS,
1438 PySSL_SSLread_doc},
1439 {"pending", (PyCFunction)PySSL_SSLpending, METH_NOARGS,
1440 PySSL_SSLpending_doc},
1441 {"server", (PyCFunction)PySSL_server, METH_NOARGS},
1442 {"issuer", (PyCFunction)PySSL_issuer, METH_NOARGS},
1443 {"peer_certificate", (PyCFunction)PySSL_peercert, METH_VARARGS,
1444 PySSL_peercert_doc},
1445 {"cipher", (PyCFunction)PySSL_cipher, METH_NOARGS},
1446 {"shutdown", (PyCFunction)PySSL_SSLshutdown, METH_NOARGS,
1447 PySSL_SSLshutdown_doc},
1448 {NULL, NULL}
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001449};
1450
1451static PyObject *PySSL_getattr(PySSLObject *self, char *name)
1452{
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001453 return Py_FindMethod(PySSLMethods, (PyObject *)self, name);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001454}
1455
Jeremy Hylton938ace62002-07-17 16:30:39 +00001456static PyTypeObject PySSL_Type = {
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001457 PyVarObject_HEAD_INIT(NULL, 0)
1458 "ssl.SSLContext", /*tp_name*/
1459 sizeof(PySSLObject), /*tp_basicsize*/
1460 0, /*tp_itemsize*/
1461 /* methods */
1462 (destructor)PySSL_dealloc, /*tp_dealloc*/
1463 0, /*tp_print*/
1464 (getattrfunc)PySSL_getattr, /*tp_getattr*/
1465 0, /*tp_setattr*/
1466 0, /*tp_compare*/
1467 0, /*tp_repr*/
1468 0, /*tp_as_number*/
1469 0, /*tp_as_sequence*/
1470 0, /*tp_as_mapping*/
1471 0, /*tp_hash*/
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001472};
1473
1474#ifdef HAVE_OPENSSL_RAND
1475
1476/* helper routines for seeding the SSL PRNG */
1477static PyObject *
1478PySSL_RAND_add(PyObject *self, PyObject *args)
1479{
1480 char *buf;
1481 int len;
1482 double entropy;
1483
1484 if (!PyArg_ParseTuple(args, "s#d:RAND_add", &buf, &len, &entropy))
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001485 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001486 RAND_add(buf, len, entropy);
1487 Py_INCREF(Py_None);
1488 return Py_None;
1489}
1490
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001491PyDoc_STRVAR(PySSL_RAND_add_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001492"RAND_add(string, entropy)\n\
1493\n\
1494Mix string into the OpenSSL PRNG state. entropy (a float) is a lower\n\
Bill Janssen98d19da2007-09-10 21:51:02 +00001495bound on the entropy contained in string. See RFC 1750.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001496
1497static PyObject *
1498PySSL_RAND_status(PyObject *self)
1499{
1500 return PyInt_FromLong(RAND_status());
1501}
1502
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001503PyDoc_STRVAR(PySSL_RAND_status_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001504"RAND_status() -> 0 or 1\n\
1505\n\
1506Returns 1 if the OpenSSL PRNG has been seeded with enough data and 0 if not.\n\
1507It is necessary to seed the PRNG with RAND_add() on some platforms before\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001508using the ssl() function.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001509
1510static PyObject *
1511PySSL_RAND_egd(PyObject *self, PyObject *arg)
1512{
1513 int bytes;
1514
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001515 if (!PyString_Check(arg))
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001516 return PyErr_Format(PyExc_TypeError,
1517 "RAND_egd() expected string, found %s",
1518 Py_TYPE(arg)->tp_name);
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001519 bytes = RAND_egd(PyString_AS_STRING(arg));
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001520 if (bytes == -1) {
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001521 PyErr_SetString(PySSLErrorObject,
1522 "EGD connection failed or EGD did not return "
1523 "enough data to seed the PRNG");
1524 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001525 }
1526 return PyInt_FromLong(bytes);
1527}
1528
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001529PyDoc_STRVAR(PySSL_RAND_egd_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001530"RAND_egd(path) -> bytes\n\
1531\n\
Bill Janssen98d19da2007-09-10 21:51:02 +00001532Queries the entropy gather daemon (EGD) on the socket named by 'path'.\n\
1533Returns number of bytes read. Raises SSLError if connection to EGD\n\
1534fails or if it does provide enough data to seed PRNG.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001535
1536#endif
1537
1538/* List of functions exported by this module. */
1539
1540static PyMethodDef PySSL_methods[] = {
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001541 {"sslwrap", PySSL_sslwrap,
1542 METH_VARARGS, ssl_doc},
1543 {"_test_decode_cert", PySSL_test_decode_certificate,
1544 METH_VARARGS},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001545#ifdef HAVE_OPENSSL_RAND
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001546 {"RAND_add", PySSL_RAND_add, METH_VARARGS,
1547 PySSL_RAND_add_doc},
1548 {"RAND_egd", PySSL_RAND_egd, METH_O,
1549 PySSL_RAND_egd_doc},
1550 {"RAND_status", (PyCFunction)PySSL_RAND_status, METH_NOARGS,
1551 PySSL_RAND_status_doc},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001552#endif
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001553 {NULL, NULL} /* Sentinel */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001554};
1555
1556
Bill Janssen98d19da2007-09-10 21:51:02 +00001557#ifdef WITH_THREAD
1558
1559/* an implementation of OpenSSL threading operations in terms
1560 of the Python C thread library */
1561
1562static PyThread_type_lock *_ssl_locks = NULL;
1563
1564static unsigned long _ssl_thread_id_function (void) {
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001565 return PyThread_get_thread_ident();
Bill Janssen98d19da2007-09-10 21:51:02 +00001566}
1567
1568static void _ssl_thread_locking_function (int mode, int n, const char *file, int line) {
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001569 /* this function is needed to perform locking on shared data
1570 structures. (Note that OpenSSL uses a number of global data
1571 structures that will be implicitly shared whenever multiple threads
1572 use OpenSSL.) Multi-threaded applications will crash at random if
1573 it is not set.
Bill Janssen98d19da2007-09-10 21:51:02 +00001574
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001575 locking_function() must be able to handle up to CRYPTO_num_locks()
1576 different mutex locks. It sets the n-th lock if mode & CRYPTO_LOCK, and
1577 releases it otherwise.
Bill Janssen98d19da2007-09-10 21:51:02 +00001578
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001579 file and line are the file number of the function setting the
1580 lock. They can be useful for debugging.
1581 */
Bill Janssen98d19da2007-09-10 21:51:02 +00001582
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001583 if ((_ssl_locks == NULL) ||
1584 (n < 0) || ((unsigned)n >= _ssl_locks_count))
1585 return;
Bill Janssen98d19da2007-09-10 21:51:02 +00001586
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001587 if (mode & CRYPTO_LOCK) {
1588 PyThread_acquire_lock(_ssl_locks[n], 1);
1589 } else {
1590 PyThread_release_lock(_ssl_locks[n]);
1591 }
Bill Janssen98d19da2007-09-10 21:51:02 +00001592}
1593
1594static int _setup_ssl_threads(void) {
1595
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001596 unsigned int i;
Bill Janssen98d19da2007-09-10 21:51:02 +00001597
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001598 if (_ssl_locks == NULL) {
1599 _ssl_locks_count = CRYPTO_num_locks();
1600 _ssl_locks = (PyThread_type_lock *)
1601 malloc(sizeof(PyThread_type_lock) * _ssl_locks_count);
1602 if (_ssl_locks == NULL)
1603 return 0;
1604 memset(_ssl_locks, 0, sizeof(PyThread_type_lock) * _ssl_locks_count);
1605 for (i = 0; i < _ssl_locks_count; i++) {
1606 _ssl_locks[i] = PyThread_allocate_lock();
1607 if (_ssl_locks[i] == NULL) {
1608 unsigned int j;
1609 for (j = 0; j < i; j++) {
1610 PyThread_free_lock(_ssl_locks[j]);
1611 }
1612 free(_ssl_locks);
1613 return 0;
1614 }
1615 }
1616 CRYPTO_set_locking_callback(_ssl_thread_locking_function);
1617 CRYPTO_set_id_callback(_ssl_thread_id_function);
1618 }
1619 return 1;
Bill Janssen98d19da2007-09-10 21:51:02 +00001620}
1621
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001622#endif /* def HAVE_THREAD */
Bill Janssen98d19da2007-09-10 21:51:02 +00001623
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001624PyDoc_STRVAR(module_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001625"Implementation module for SSL socket operations. See the socket module\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001626for documentation.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001627
Mark Hammondfe51c6d2002-08-02 02:27:13 +00001628PyMODINIT_FUNC
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001629init_ssl(void)
1630{
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001631 PyObject *m, *d;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001632
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001633 Py_TYPE(&PySSL_Type) = &PyType_Type;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001634
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001635 m = Py_InitModule3("_ssl", PySSL_methods, module_doc);
1636 if (m == NULL)
1637 return;
1638 d = PyModule_GetDict(m);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001639
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001640 /* Load _socket module and its C API */
1641 if (PySocketModule_ImportModuleAndAPI())
1642 return;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001643
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001644 /* Init OpenSSL */
1645 SSL_load_error_strings();
1646 SSL_library_init();
Bill Janssen98d19da2007-09-10 21:51:02 +00001647#ifdef WITH_THREAD
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001648 /* note that this will start threading if not already started */
1649 if (!_setup_ssl_threads()) {
1650 return;
1651 }
Bill Janssen98d19da2007-09-10 21:51:02 +00001652#endif
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001653 OpenSSL_add_all_algorithms();
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001654
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001655 /* Add symbols to module dict */
1656 PySSLErrorObject = PyErr_NewException("ssl.SSLError",
1657 PySocketModule.error,
1658 NULL);
1659 if (PySSLErrorObject == NULL)
1660 return;
1661 if (PyDict_SetItemString(d, "SSLError", PySSLErrorObject) != 0)
1662 return;
1663 if (PyDict_SetItemString(d, "SSLType",
1664 (PyObject *)&PySSL_Type) != 0)
1665 return;
1666 PyModule_AddIntConstant(m, "SSL_ERROR_ZERO_RETURN",
1667 PY_SSL_ERROR_ZERO_RETURN);
1668 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_READ",
1669 PY_SSL_ERROR_WANT_READ);
1670 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_WRITE",
1671 PY_SSL_ERROR_WANT_WRITE);
1672 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_X509_LOOKUP",
1673 PY_SSL_ERROR_WANT_X509_LOOKUP);
1674 PyModule_AddIntConstant(m, "SSL_ERROR_SYSCALL",
1675 PY_SSL_ERROR_SYSCALL);
1676 PyModule_AddIntConstant(m, "SSL_ERROR_SSL",
1677 PY_SSL_ERROR_SSL);
1678 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_CONNECT",
1679 PY_SSL_ERROR_WANT_CONNECT);
1680 /* non ssl.h errorcodes */
1681 PyModule_AddIntConstant(m, "SSL_ERROR_EOF",
1682 PY_SSL_ERROR_EOF);
1683 PyModule_AddIntConstant(m, "SSL_ERROR_INVALID_ERROR_CODE",
1684 PY_SSL_ERROR_INVALID_ERROR_CODE);
1685 /* cert requirements */
1686 PyModule_AddIntConstant(m, "CERT_NONE",
1687 PY_SSL_CERT_NONE);
1688 PyModule_AddIntConstant(m, "CERT_OPTIONAL",
1689 PY_SSL_CERT_OPTIONAL);
1690 PyModule_AddIntConstant(m, "CERT_REQUIRED",
1691 PY_SSL_CERT_REQUIRED);
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001692
Antoine Pitrou7fd622a2010-05-05 15:59:19 +00001693 /* protocol versions */
1694 PyModule_AddIntConstant(m, "PROTOCOL_SSLv2",
1695 PY_SSL_VERSION_SSL2);
1696 PyModule_AddIntConstant(m, "PROTOCOL_SSLv3",
1697 PY_SSL_VERSION_SSL3);
1698 PyModule_AddIntConstant(m, "PROTOCOL_SSLv23",
1699 PY_SSL_VERSION_SSL23);
1700 PyModule_AddIntConstant(m, "PROTOCOL_TLSv1",
1701 PY_SSL_VERSION_TLS1);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001702}