blob: c02703dab89d515e1a172de0681371f5257df0db [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__);
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,
Antoine Pitrou96125cf2010-05-12 14:05:34 +0000546 buflen, "strict");
Antoine Pitrou7fd622a2010-05-05 15:59:19 +0000547 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) {
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}