blob: 4925fe70d3a2dd9dc6565aedf398179252bf54f9 [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 { \
Neal Norwitze9057ff2008-01-27 17:10:35 +000022 PyThreadState *_save = NULL; \
Bill Janssen98d19da2007-09-10 21:51:02 +000023 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 }
28
29#else /* no WITH_THREAD */
30
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 {
39 /* these mirror ssl.h */
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +000040 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,
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +000045 PY_SSL_ERROR_SYSCALL, /* look at error stack/return value/errno */
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +000046 PY_SSL_ERROR_ZERO_RETURN,
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +000047 PY_SSL_ERROR_WANT_CONNECT,
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +000048 /* start of non ssl.h errorcodes */
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +000049 PY_SSL_ERROR_EOF, /* special case of SSL_ERROR_SYSCALL */
50 PY_SSL_ERROR_INVALID_ERROR_CODE
51};
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000052
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +000053enum py_ssl_server_or_client {
54 PY_SSL_CLIENT,
55 PY_SSL_SERVER
56};
57
58enum py_ssl_cert_requirements {
59 PY_SSL_CERT_NONE,
60 PY_SSL_CERT_OPTIONAL,
61 PY_SSL_CERT_REQUIRED
62};
63
64enum py_ssl_version {
65 PY_SSL_VERSION_SSL2,
66 PY_SSL_VERSION_SSL3,
67 PY_SSL_VERSION_SSL23,
68 PY_SSL_VERSION_TLS1,
69};
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 {
114 PyObject_HEAD
115 PySocketSockObject *Socket; /* Socket on which we're layered */
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000116 SSL_CTX* ctx;
117 SSL* ssl;
118 X509* peer_cert;
119 char server[X509_NAME_MAXLEN];
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000120 char issuer[X509_NAME_MAXLEN];
Antoine Pitrou07072162010-04-23 21:07:58 +0000121 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,
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +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
Christian Heimese93237d2007-12-19 02:37:44 +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 {
136 SOCKET_IS_NONBLOCKING,
137 SOCKET_IS_BLOCKING,
138 SOCKET_HAS_TIMED_OUT,
139 SOCKET_HAS_BEEN_CLOSED,
Neal Norwitz389cea82006-02-13 00:35:21 +0000140 SOCKET_TOO_LARGE_FOR_SELECT,
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +0000141 SOCKET_OPERATION_OK
142} 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{
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000158 PyObject *v;
Neal Norwitz049da9e2007-08-25 16:41:36 +0000159 char buf[2048];
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000160 char *errstr;
161 int err;
Guido van Rossum780b80d2007-08-27 18:42:23 +0000162 enum py_ssl_error p = PY_SSL_ERROR_NONE;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000163
164 assert(ret <= 0);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000165
Bill Janssen98d19da2007-09-10 21:51:02 +0000166 if (obj->ssl != NULL) {
Guido van Rossum780b80d2007-08-27 18:42:23 +0000167 err = SSL_get_error(obj->ssl, ret);
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +0000168
Guido van Rossum780b80d2007-08-27 18:42:23 +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 {
Jeremy Hylton4e547302002-07-02 18:25:00 +0000207 p = PY_SSL_ERROR_SYSCALL;
Guido van Rossum780b80d2007-08-27 18:42:23 +0000208 /* XXX Protected by global interpreter lock */
209 errstr = ERR_error_string(e, NULL);
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +0000210 }
Guido van Rossum780b80d2007-08-27 18:42:23 +0000211 break;
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +0000212 }
Guido van Rossum780b80d2007-08-27 18:42:23 +0000213 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;
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +0000225 }
Guido van Rossum780b80d2007-08-27 18:42:23 +0000226 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);
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +0000232 }
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000233 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);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000237 Py_DECREF(v);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000238 }
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000239 return NULL;
240}
241
Bill Janssen98d19da2007-09-10 21:51:02 +0000242static PyObject *
243_setSSLError (char *errstr, int errcode, char *filename, int lineno) {
244
245 char buf[2048];
246 PyObject *v;
247
248 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;
259}
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,
263 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{
268 PySSLObject *self;
269 char *errstr = NULL;
270 int ret;
Neal Norwitz049da9e2007-08-25 16:41:36 +0000271 int verification_mode;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000272
273 self = PyObject_New(PySSLObject, &PySSL_Type); /* Create new object */
Neal Norwitz38e3b7d2006-05-11 07:51:59 +0000274 if (self == NULL)
Neal Norwitzc6a989a2006-05-10 06:57:58 +0000275 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000276 memset(self->server, '\0', sizeof(char) * X509_NAME_MAXLEN);
277 memset(self->issuer, '\0', sizeof(char) * X509_NAME_MAXLEN);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000278 self->peer_cert = NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000279 self->ssl = NULL;
280 self->ctx = NULL;
281 self->Socket = NULL;
282
Bill Janssen98d19da2007-09-10 21:51:02 +0000283 /* Make sure the SSL error state is initialized */
284 (void) ERR_get_state();
285 ERR_clear_error();
286
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000287 if ((key_file && !cert_file) || (!key_file && cert_file)) {
Guido van Rossum780b80d2007-08-27 18:42:23 +0000288 errstr = ERRSTR("Both the key & certificate files "
289 "must be specified");
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000290 goto fail;
291 }
292
293 if ((socket_type == PY_SSL_SERVER) &&
294 ((key_file == NULL) || (cert_file == NULL))) {
Guido van Rossum780b80d2007-08-27 18:42:23 +0000295 errstr = ERRSTR("Both the key & certificate files "
296 "must be specified for server-side operation");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000297 goto fail;
298 }
299
Bill Janssen98d19da2007-09-10 21:51:02 +0000300 PySSL_BEGIN_ALLOW_THREADS
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000301 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 */
Bill Janssen98d19da2007-09-10 21:51:02 +0000307 else if (proto_version == PY_SSL_VERSION_SSL23)
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000308 self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */
Bill Janssen98d19da2007-09-10 21:51:02 +0000309 PySSL_END_ALLOW_THREADS
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000310
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000311 if (self->ctx == NULL) {
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000312 errstr = ERRSTR("Invalid SSL protocol variant specified.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000313 goto fail;
314 }
315
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000316 if (certreq != PY_SSL_CERT_NONE) {
317 if (cacerts_file == NULL) {
Guido van Rossum780b80d2007-08-27 18:42:23 +0000318 errstr = ERRSTR("No root certificates specified for "
319 "verification of other-side certificates.");
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000320 goto fail;
321 } else {
Bill Janssen98d19da2007-09-10 21:51:02 +0000322 PySSL_BEGIN_ALLOW_THREADS
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000323 ret = SSL_CTX_load_verify_locations(self->ctx,
Guido van Rossum780b80d2007-08-27 18:42:23 +0000324 cacerts_file,
325 NULL);
Bill Janssen98d19da2007-09-10 21:51:02 +0000326 PySSL_END_ALLOW_THREADS
Guido van Rossum780b80d2007-08-27 18:42:23 +0000327 if (ret != 1) {
Bill Janssen98d19da2007-09-10 21:51:02 +0000328 _setSSLError(NULL, 0, __FILE__, __LINE__);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000329 goto fail;
330 }
331 }
332 }
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000333 if (key_file) {
Bill Janssen98d19da2007-09-10 21:51:02 +0000334 PySSL_BEGIN_ALLOW_THREADS
Martin v. Löwis09c35f72002-07-28 09:57:45 +0000335 ret = SSL_CTX_use_PrivateKey_file(self->ctx, key_file,
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000336 SSL_FILETYPE_PEM);
Bill Janssen98d19da2007-09-10 21:51:02 +0000337 PySSL_END_ALLOW_THREADS
Guido van Rossum780b80d2007-08-27 18:42:23 +0000338 if (ret != 1) {
Bill Janssen98d19da2007-09-10 21:51:02 +0000339 _setSSLError(NULL, ret, __FILE__, __LINE__);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000340 goto fail;
341 }
342
Bill Janssen98d19da2007-09-10 21:51:02 +0000343 PySSL_BEGIN_ALLOW_THREADS
Martin v. Löwis09c35f72002-07-28 09:57:45 +0000344 ret = SSL_CTX_use_certificate_chain_file(self->ctx,
Bill Janssen98d19da2007-09-10 21:51:02 +0000345 cert_file);
346 PySSL_END_ALLOW_THREADS
Guido van Rossum780b80d2007-08-27 18:42:23 +0000347 if (ret != 1) {
Bill Janssen98d19da2007-09-10 21:51:02 +0000348 /*
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 }
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000356 }
357 }
358
Bill Janssen98d19da2007-09-10 21:51:02 +0000359 /* ssl compatibility */
360 SSL_CTX_set_options(self->ctx, SSL_OP_ALL);
361
Neal Norwitz049da9e2007-08-25 16:41:36 +0000362 verification_mode = SSL_VERIFY_NONE;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000363 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 */
370
Bill Janssen98d19da2007-09-10 21:51:02 +0000371 PySSL_BEGIN_ALLOW_THREADS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000372 self->ssl = SSL_new(self->ctx); /* New ssl struct */
Bill Janssen98d19da2007-09-10 21:51:02 +0000373 PySSL_END_ALLOW_THREADS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000374 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 Pitroucfd62002010-03-26 19:33:53 +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
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000379 /* If the socket is in non-blocking mode or timeout mode, set the BIO
Guido van Rossum4f707ac2003-01-31 18:13:18 +0000380 * 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 }
387
Bill Janssen98d19da2007-09-10 21:51:02 +0000388 PySSL_BEGIN_ALLOW_THREADS
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000389 if (socket_type == PY_SSL_CLIENT)
390 SSL_set_connect_state(self->ssl);
391 else
392 SSL_set_accept_state(self->ssl);
Bill Janssen98d19da2007-09-10 21:51:02 +0000393 PySSL_END_ALLOW_THREADS
Martin v. Löwis09c35f72002-07-28 09:57:45 +0000394
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000395 self->Socket = Sock;
396 Py_INCREF(self->Socket);
397 return self;
398 fail:
399 if (errstr)
400 PyErr_SetString(PySSLErrorObject, errstr);
401 Py_DECREF(self);
402 return NULL;
403}
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{
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000408 PySocketSockObject *Sock;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000409 int server_side = 0;
410 int verification_mode = PY_SSL_CERT_NONE;
411 int protocol = PY_SSL_VERSION_SSL23;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000412 char *key_file = NULL;
413 char *cert_file = NULL;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000414 char *cacerts_file = NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000415
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000416 if (!PyArg_ParseTuple(args, "O!i|zziiz:sslwrap",
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000417 PySocketModule.Sock_Type,
Martin v. Löwisa811c382006-10-19 11:00:37 +0000418 &Sock,
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000419 &server_side,
420 &key_file, &cert_file,
421 &verification_mode, &protocol,
422 &cacerts_file))
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000423 return NULL;
424
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +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 */
432
433 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{
446 int ret;
447 int err;
448 int sockstate;
449
450 /* Actually negotiate SSL connection */
451 /* XXX If SSL_do_handshake() returns 0, it's also a failure. */
452 sockstate = 0;
453 do {
454 PySSL_BEGIN_ALLOW_THREADS
455 ret = SSL_do_handshake(self->ssl);
456 err = SSL_get_error(self->ssl, ret);
457 PySSL_END_ALLOW_THREADS
458 if(PyErr_CheckSignals()) {
459 return NULL;
460 }
461 if (err == SSL_ERROR_WANT_READ) {
462 sockstate = check_socket_and_wait_for_timeout(self->Socket, 0);
463 } else if (err == SSL_ERROR_WANT_WRITE) {
464 sockstate = check_socket_and_wait_for_timeout(self->Socket, 1);
465 } else {
466 sockstate = SOCKET_OPERATION_OK;
467 }
468 if (sockstate == SOCKET_HAS_TIMED_OUT) {
469 PyErr_SetString(PySSLErrorObject,
470 ERRSTR("The handshake operation timed out"));
471 return NULL;
472 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
473 PyErr_SetString(PySSLErrorObject,
474 ERRSTR("Underlying socket has been closed."));
475 return NULL;
476 } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
477 PyErr_SetString(PySSLErrorObject,
478 ERRSTR("Underlying socket too large for select()."));
479 return NULL;
480 } else if (sockstate == SOCKET_IS_NONBLOCKING) {
481 break;
482 }
483 } while (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE);
484 if (ret < 1)
485 return PySSL_SetError(self, ret, __FILE__, __LINE__);
486 self->ssl->debug = 1;
487
488 if (self->peer_cert)
489 X509_free (self->peer_cert);
490 PySSL_BEGIN_ALLOW_THREADS
491 if ((self->peer_cert = SSL_get_peer_certificate(self->ssl))) {
492 X509_NAME_oneline(X509_get_subject_name(self->peer_cert),
493 self->server, X509_NAME_MAXLEN);
494 X509_NAME_oneline(X509_get_issuer_name(self->peer_cert),
495 self->issuer, X509_NAME_MAXLEN);
496 }
497 PySSL_END_ALLOW_THREADS
498
499 Py_INCREF(Py_None);
500 return Py_None;
501}
502
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000503static PyObject *
504PySSL_server(PySSLObject *self)
505{
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000506 return PyString_FromString(self->server);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000507}
508
509static PyObject *
510PySSL_issuer(PySSLObject *self)
511{
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000512 return PyString_FromString(self->issuer);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000513}
514
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000515static PyObject *
Bill Janssen98d19da2007-09-10 21:51:02 +0000516_create_tuple_for_attribute (ASN1_OBJECT *name, ASN1_STRING *value) {
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000517
Bill Janssen98d19da2007-09-10 21:51:02 +0000518 char namebuf[X509_NAME_MAXLEN];
519 int buflen;
520 PyObject *name_obj;
521 PyObject *value_obj;
522 PyObject *attr;
523 unsigned char *valuebuf = NULL;
Guido van Rossum780b80d2007-08-27 18:42:23 +0000524
Bill Janssen98d19da2007-09-10 21:51:02 +0000525 buflen = OBJ_obj2txt(namebuf, sizeof(namebuf), name, 0);
526 if (buflen < 0) {
527 _setSSLError(NULL, 0, __FILE__, __LINE__);
528 goto fail;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000529 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000530 name_obj = PyString_FromStringAndSize(namebuf, buflen);
Bill Janssen98d19da2007-09-10 21:51:02 +0000531 if (name_obj == NULL)
532 goto fail;
533
534 buflen = ASN1_STRING_to_UTF8(&valuebuf, value);
535 if (buflen < 0) {
536 _setSSLError(NULL, 0, __FILE__, __LINE__);
537 Py_DECREF(name_obj);
538 goto fail;
539 }
540 value_obj = PyUnicode_DecodeUTF8((char *) valuebuf,
541 buflen, "strict");
542 OPENSSL_free(valuebuf);
543 if (value_obj == NULL) {
544 Py_DECREF(name_obj);
545 goto fail;
546 }
547 attr = PyTuple_New(2);
548 if (attr == NULL) {
549 Py_DECREF(name_obj);
550 Py_DECREF(value_obj);
551 goto fail;
552 }
553 PyTuple_SET_ITEM(attr, 0, name_obj);
554 PyTuple_SET_ITEM(attr, 1, value_obj);
555 return attr;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000556
Bill Janssen98d19da2007-09-10 21:51:02 +0000557 fail:
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000558 return NULL;
559}
560
561static PyObject *
Bill Janssen98d19da2007-09-10 21:51:02 +0000562_create_tuple_for_X509_NAME (X509_NAME *xname)
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000563{
Bill Janssen98d19da2007-09-10 21:51:02 +0000564 PyObject *dn = NULL; /* tuple which represents the "distinguished name" */
565 PyObject *rdn = NULL; /* tuple to hold a "relative distinguished name" */
566 PyObject *rdnt;
567 PyObject *attr = NULL; /* tuple to hold an attribute */
568 int entry_count = X509_NAME_entry_count(xname);
569 X509_NAME_ENTRY *entry;
570 ASN1_OBJECT *name;
571 ASN1_STRING *value;
572 int index_counter;
573 int rdn_level = -1;
574 int retcode;
575
576 dn = PyList_New(0);
577 if (dn == NULL)
578 return NULL;
579 /* now create another tuple to hold the top-level RDN */
580 rdn = PyList_New(0);
581 if (rdn == NULL)
582 goto fail0;
583
584 for (index_counter = 0;
585 index_counter < entry_count;
586 index_counter++)
587 {
588 entry = X509_NAME_get_entry(xname, index_counter);
589
590 /* check to see if we've gotten to a new RDN */
591 if (rdn_level >= 0) {
592 if (rdn_level != entry->set) {
593 /* yes, new RDN */
594 /* add old RDN to DN */
595 rdnt = PyList_AsTuple(rdn);
596 Py_DECREF(rdn);
597 if (rdnt == NULL)
598 goto fail0;
599 retcode = PyList_Append(dn, rdnt);
600 Py_DECREF(rdnt);
601 if (retcode < 0)
602 goto fail0;
603 /* create new RDN */
604 rdn = PyList_New(0);
605 if (rdn == NULL)
606 goto fail0;
607 }
608 }
609 rdn_level = entry->set;
610
611 /* now add this attribute to the current RDN */
612 name = X509_NAME_ENTRY_get_object(entry);
613 value = X509_NAME_ENTRY_get_data(entry);
614 attr = _create_tuple_for_attribute(name, value);
615 /*
616 fprintf(stderr, "RDN level %d, attribute %s: %s\n",
617 entry->set,
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000618 PyString_AS_STRING(PyTuple_GET_ITEM(attr, 0)),
619 PyString_AS_STRING(PyTuple_GET_ITEM(attr, 1)));
Bill Janssen98d19da2007-09-10 21:51:02 +0000620 */
621 if (attr == NULL)
622 goto fail1;
623 retcode = PyList_Append(rdn, attr);
624 Py_DECREF(attr);
625 if (retcode < 0)
626 goto fail1;
627 }
628 /* now, there's typically a dangling RDN */
629 if ((rdn != NULL) && (PyList_Size(rdn) > 0)) {
630 rdnt = PyList_AsTuple(rdn);
631 Py_DECREF(rdn);
632 if (rdnt == NULL)
633 goto fail0;
634 retcode = PyList_Append(dn, rdnt);
635 Py_DECREF(rdnt);
636 if (retcode < 0)
637 goto fail0;
638 }
639
640 /* convert list to tuple */
641 rdnt = PyList_AsTuple(dn);
642 Py_DECREF(dn);
643 if (rdnt == NULL)
644 return NULL;
645 return rdnt;
646
647 fail1:
648 Py_XDECREF(rdn);
649
650 fail0:
651 Py_XDECREF(dn);
652 return NULL;
653}
654
655static PyObject *
656_get_peer_alt_names (X509 *certificate) {
657
658 /* this code follows the procedure outlined in
659 OpenSSL's crypto/x509v3/v3_prn.c:X509v3_EXT_print()
660 function to extract the STACK_OF(GENERAL_NAME),
661 then iterates through the stack to add the
662 names. */
663
664 int i, j;
665 PyObject *peer_alt_names = Py_None;
666 PyObject *v, *t;
667 X509_EXTENSION *ext = NULL;
668 GENERAL_NAMES *names = NULL;
669 GENERAL_NAME *name;
670 X509V3_EXT_METHOD *method;
671 BIO *biobuf = NULL;
672 char buf[2048];
673 char *vptr;
674 int len;
Christian Heimesa63f2682007-12-14 04:38:13 +0000675 const unsigned char *p;
Bill Janssen98d19da2007-09-10 21:51:02 +0000676
677 if (certificate == NULL)
678 return peer_alt_names;
679
680 /* get a memory buffer */
681 biobuf = BIO_new(BIO_s_mem());
682
683 i = 0;
684 while ((i = X509_get_ext_by_NID(
685 certificate, NID_subject_alt_name, i)) >= 0) {
686
687 if (peer_alt_names == Py_None) {
688 peer_alt_names = PyList_New(0);
689 if (peer_alt_names == NULL)
690 goto fail;
691 }
692
693 /* now decode the altName */
694 ext = X509_get_ext(certificate, i);
695 if(!(method = X509V3_EXT_get(ext))) {
696 PyErr_SetString(PySSLErrorObject,
697 ERRSTR("No method for internalizing subjectAltName!"));
698 goto fail;
699 }
700
701 p = ext->value->data;
Neal Norwitze9057ff2008-01-27 17:10:35 +0000702 if (method->it)
Bill Janssen98d19da2007-09-10 21:51:02 +0000703 names = (GENERAL_NAMES*) (ASN1_item_d2i(NULL,
704 &p,
705 ext->value->length,
706 ASN1_ITEM_ptr(method->it)));
707 else
708 names = (GENERAL_NAMES*) (method->d2i(NULL,
709 &p,
710 ext->value->length));
711
712 for(j = 0; j < sk_GENERAL_NAME_num(names); j++) {
713
714 /* get a rendering of each name in the set of names */
715
716 name = sk_GENERAL_NAME_value(names, j);
717 if (name->type == GEN_DIRNAME) {
718
719 /* we special-case DirName as a tuple of tuples of attributes */
720
721 t = PyTuple_New(2);
722 if (t == NULL) {
723 goto fail;
724 }
725
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000726 v = PyString_FromString("DirName");
Bill Janssen98d19da2007-09-10 21:51:02 +0000727 if (v == NULL) {
728 Py_DECREF(t);
729 goto fail;
730 }
731 PyTuple_SET_ITEM(t, 0, v);
732
733 v = _create_tuple_for_X509_NAME (name->d.dirn);
734 if (v == NULL) {
735 Py_DECREF(t);
736 goto fail;
737 }
738 PyTuple_SET_ITEM(t, 1, v);
739
740 } else {
741
742 /* for everything else, we use the OpenSSL print form */
743
744 (void) BIO_reset(biobuf);
745 GENERAL_NAME_print(biobuf, name);
746 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
747 if (len < 0) {
748 _setSSLError(NULL, 0, __FILE__, __LINE__);
749 goto fail;
750 }
751 vptr = strchr(buf, ':');
752 if (vptr == NULL)
753 goto fail;
754 t = PyTuple_New(2);
755 if (t == NULL)
756 goto fail;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000757 v = PyString_FromStringAndSize(buf, (vptr - buf));
Bill Janssen98d19da2007-09-10 21:51:02 +0000758 if (v == NULL) {
759 Py_DECREF(t);
760 goto fail;
761 }
762 PyTuple_SET_ITEM(t, 0, v);
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000763 v = PyString_FromStringAndSize((vptr + 1), (len - (vptr - buf + 1)));
Bill Janssen98d19da2007-09-10 21:51:02 +0000764 if (v == NULL) {
765 Py_DECREF(t);
766 goto fail;
767 }
768 PyTuple_SET_ITEM(t, 1, v);
769 }
770
771 /* and add that rendering to the list */
772
773 if (PyList_Append(peer_alt_names, t) < 0) {
774 Py_DECREF(t);
775 goto fail;
776 }
777 Py_DECREF(t);
778 }
779 }
780 BIO_free(biobuf);
781 if (peer_alt_names != Py_None) {
782 v = PyList_AsTuple(peer_alt_names);
783 Py_DECREF(peer_alt_names);
784 return v;
785 } else {
786 return peer_alt_names;
787 }
788
789
790 fail:
791 if (biobuf != NULL)
792 BIO_free(biobuf);
793
794 if (peer_alt_names != Py_None) {
795 Py_XDECREF(peer_alt_names);
796 }
797
798 return NULL;
799}
800
801static PyObject *
802_decode_certificate (X509 *certificate, int verbose) {
803
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000804 PyObject *retval = NULL;
805 BIO *biobuf = NULL;
Neal Norwitz049da9e2007-08-25 16:41:36 +0000806 PyObject *peer;
Bill Janssen98d19da2007-09-10 21:51:02 +0000807 PyObject *peer_alt_names = NULL;
Neal Norwitz049da9e2007-08-25 16:41:36 +0000808 PyObject *issuer;
809 PyObject *version;
Bill Janssen98d19da2007-09-10 21:51:02 +0000810 PyObject *sn_obj;
811 ASN1_INTEGER *serialNumber;
Neal Norwitz049da9e2007-08-25 16:41:36 +0000812 char buf[2048];
813 int len;
814 ASN1_TIME *notBefore, *notAfter;
815 PyObject *pnotBefore, *pnotAfter;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000816
817 retval = PyDict_New();
818 if (retval == NULL)
819 return NULL;
820
Bill Janssenffe576d2007-09-05 00:46:27 +0000821 peer = _create_tuple_for_X509_NAME(
Bill Janssen98d19da2007-09-10 21:51:02 +0000822 X509_get_subject_name(certificate));
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000823 if (peer == NULL)
824 goto fail0;
825 if (PyDict_SetItemString(retval, (const char *) "subject", peer) < 0) {
826 Py_DECREF(peer);
827 goto fail0;
828 }
829 Py_DECREF(peer);
830
Bill Janssen98d19da2007-09-10 21:51:02 +0000831 if (verbose) {
832 issuer = _create_tuple_for_X509_NAME(
833 X509_get_issuer_name(certificate));
834 if (issuer == NULL)
835 goto fail0;
836 if (PyDict_SetItemString(retval, (const char *)"issuer", issuer) < 0) {
837 Py_DECREF(issuer);
838 goto fail0;
839 }
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000840 Py_DECREF(issuer);
Bill Janssen98d19da2007-09-10 21:51:02 +0000841
842 version = PyInt_FromLong(X509_get_version(certificate) + 1);
843 if (PyDict_SetItemString(retval, "version", version) < 0) {
844 Py_DECREF(version);
845 goto fail0;
846 }
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000847 Py_DECREF(version);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000848 }
Bill Janssen98d19da2007-09-10 21:51:02 +0000849
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000850 /* get a memory buffer */
851 biobuf = BIO_new(BIO_s_mem());
Bill Janssen98d19da2007-09-10 21:51:02 +0000852
853 if (verbose) {
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000854
Bill Janssen98d19da2007-09-10 21:51:02 +0000855 (void) BIO_reset(biobuf);
856 serialNumber = X509_get_serialNumber(certificate);
857 /* should not exceed 20 octets, 160 bits, so buf is big enough */
858 i2a_ASN1_INTEGER(biobuf, serialNumber);
859 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
860 if (len < 0) {
861 _setSSLError(NULL, 0, __FILE__, __LINE__);
862 goto fail1;
863 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000864 sn_obj = PyString_FromStringAndSize(buf, len);
Bill Janssen98d19da2007-09-10 21:51:02 +0000865 if (sn_obj == NULL)
866 goto fail1;
867 if (PyDict_SetItemString(retval, "serialNumber", sn_obj) < 0) {
868 Py_DECREF(sn_obj);
869 goto fail1;
870 }
871 Py_DECREF(sn_obj);
872
873 (void) BIO_reset(biobuf);
874 notBefore = X509_get_notBefore(certificate);
875 ASN1_TIME_print(biobuf, notBefore);
876 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
877 if (len < 0) {
878 _setSSLError(NULL, 0, __FILE__, __LINE__);
879 goto fail1;
880 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000881 pnotBefore = PyString_FromStringAndSize(buf, len);
Bill Janssen98d19da2007-09-10 21:51:02 +0000882 if (pnotBefore == NULL)
883 goto fail1;
884 if (PyDict_SetItemString(retval, "notBefore", pnotBefore) < 0) {
885 Py_DECREF(pnotBefore);
886 goto fail1;
887 }
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000888 Py_DECREF(pnotBefore);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000889 }
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000890
Guido van Rossum780b80d2007-08-27 18:42:23 +0000891 (void) BIO_reset(biobuf);
Bill Janssen98d19da2007-09-10 21:51:02 +0000892 notAfter = X509_get_notAfter(certificate);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000893 ASN1_TIME_print(biobuf, notAfter);
894 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
Bill Janssen98d19da2007-09-10 21:51:02 +0000895 if (len < 0) {
896 _setSSLError(NULL, 0, __FILE__, __LINE__);
897 goto fail1;
898 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000899 pnotAfter = PyString_FromStringAndSize(buf, len);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000900 if (pnotAfter == NULL)
Bill Janssen98d19da2007-09-10 21:51:02 +0000901 goto fail1;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000902 if (PyDict_SetItemString(retval, "notAfter", pnotAfter) < 0) {
903 Py_DECREF(pnotAfter);
Bill Janssen98d19da2007-09-10 21:51:02 +0000904 goto fail1;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000905 }
906 Py_DECREF(pnotAfter);
Bill Janssen98d19da2007-09-10 21:51:02 +0000907
908 /* Now look for subjectAltName */
909
910 peer_alt_names = _get_peer_alt_names(certificate);
911 if (peer_alt_names == NULL)
912 goto fail1;
913 else if (peer_alt_names != Py_None) {
914 if (PyDict_SetItemString(retval, "subjectAltName",
915 peer_alt_names) < 0) {
916 Py_DECREF(peer_alt_names);
917 goto fail1;
918 }
919 Py_DECREF(peer_alt_names);
920 }
921
922 BIO_free(biobuf);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000923 return retval;
924
925 fail1:
926 if (biobuf != NULL)
927 BIO_free(biobuf);
928 fail0:
929 Py_XDECREF(retval);
930 return NULL;
931}
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000932
Bill Janssen98d19da2007-09-10 21:51:02 +0000933
934static PyObject *
935PySSL_test_decode_certificate (PyObject *mod, PyObject *args) {
936
937 PyObject *retval = NULL;
938 char *filename = NULL;
939 X509 *x=NULL;
940 BIO *cert;
941 int verbose = 1;
942
943 if (!PyArg_ParseTuple(args, "s|i:test_decode_certificate", &filename, &verbose))
944 return NULL;
945
946 if ((cert=BIO_new(BIO_s_file())) == NULL) {
947 PyErr_SetString(PySSLErrorObject, "Can't malloc memory to read file");
948 goto fail0;
949 }
950
951 if (BIO_read_filename(cert,filename) <= 0) {
952 PyErr_SetString(PySSLErrorObject, "Can't open file");
953 goto fail0;
954 }
955
956 x = PEM_read_bio_X509_AUX(cert,NULL, NULL, NULL);
957 if (x == NULL) {
958 PyErr_SetString(PySSLErrorObject, "Error decoding PEM-encoded file");
959 goto fail0;
960 }
961
962 retval = _decode_certificate(x, verbose);
963
964 fail0:
965
966 if (cert != NULL) BIO_free(cert);
967 return retval;
968}
969
970
971static PyObject *
972PySSL_peercert(PySSLObject *self, PyObject *args)
973{
974 PyObject *retval = NULL;
975 int len;
976 int verification;
977 PyObject *binary_mode = Py_None;
978
979 if (!PyArg_ParseTuple(args, "|O:peer_certificate", &binary_mode))
980 return NULL;
981
982 if (!self->peer_cert)
983 Py_RETURN_NONE;
984
985 if (PyObject_IsTrue(binary_mode)) {
986 /* return cert in DER-encoded format */
987
988 unsigned char *bytes_buf = NULL;
989
990 bytes_buf = NULL;
991 len = i2d_X509(self->peer_cert, &bytes_buf);
992 if (len < 0) {
993 PySSL_SetError(self, len, __FILE__, __LINE__);
994 return NULL;
995 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000996 retval = PyString_FromStringAndSize((const char *) bytes_buf, len);
Bill Janssen98d19da2007-09-10 21:51:02 +0000997 OPENSSL_free(bytes_buf);
998 return retval;
999
1000 } else {
1001
1002 verification = SSL_CTX_get_verify_mode(self->ctx);
1003 if ((verification & SSL_VERIFY_PEER) == 0)
1004 return PyDict_New();
1005 else
1006 return _decode_certificate (self->peer_cert, 0);
1007 }
1008}
1009
1010PyDoc_STRVAR(PySSL_peercert_doc,
1011"peer_certificate([der=False]) -> certificate\n\
1012\n\
1013Returns the certificate for the peer. If no certificate was provided,\n\
1014returns None. If a certificate was provided, but not validated, returns\n\
1015an empty dictionary. Otherwise returns a dict containing information\n\
1016about the peer certificate.\n\
1017\n\
1018If the optional argument is True, returns a DER-encoded copy of the\n\
1019peer certificate, or None if no certificate was provided. This will\n\
1020return the certificate even if it wasn't validated.");
1021
1022static PyObject *PySSL_cipher (PySSLObject *self) {
1023
1024 PyObject *retval, *v;
1025 SSL_CIPHER *current;
1026 char *cipher_name;
1027 char *cipher_protocol;
1028
1029 if (self->ssl == NULL)
1030 return Py_None;
1031 current = SSL_get_current_cipher(self->ssl);
1032 if (current == NULL)
1033 return Py_None;
1034
1035 retval = PyTuple_New(3);
1036 if (retval == NULL)
1037 return NULL;
1038
1039 cipher_name = (char *) SSL_CIPHER_get_name(current);
1040 if (cipher_name == NULL) {
1041 PyTuple_SET_ITEM(retval, 0, Py_None);
1042 } else {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001043 v = PyString_FromString(cipher_name);
Bill Janssen98d19da2007-09-10 21:51:02 +00001044 if (v == NULL)
1045 goto fail0;
1046 PyTuple_SET_ITEM(retval, 0, v);
1047 }
1048 cipher_protocol = SSL_CIPHER_get_version(current);
1049 if (cipher_protocol == NULL) {
1050 PyTuple_SET_ITEM(retval, 1, Py_None);
1051 } else {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001052 v = PyString_FromString(cipher_protocol);
Bill Janssen98d19da2007-09-10 21:51:02 +00001053 if (v == NULL)
1054 goto fail0;
1055 PyTuple_SET_ITEM(retval, 1, v);
1056 }
1057 v = PyInt_FromLong(SSL_CIPHER_get_bits(current, NULL));
1058 if (v == NULL)
1059 goto fail0;
1060 PyTuple_SET_ITEM(retval, 2, v);
1061 return retval;
1062
1063 fail0:
1064 Py_DECREF(retval);
1065 return NULL;
1066}
1067
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001068static void PySSL_dealloc(PySSLObject *self)
1069{
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001070 if (self->peer_cert) /* Possible not to have one? */
1071 X509_free (self->peer_cert);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001072 if (self->ssl)
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001073 SSL_free(self->ssl);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001074 if (self->ctx)
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001075 SSL_CTX_free(self->ctx);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001076 Py_XDECREF(self->Socket);
1077 PyObject_Del(self);
1078}
1079
Anthony Baxter93ab5fa2006-07-11 02:04:09 +00001080/* If the socket has a timeout, do a select()/poll() on the socket.
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001081 The argument writing indicates the direction.
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001082 Returns one of the possibilities in the timeout_state enum (above).
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001083 */
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001084
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001085static int
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001086check_socket_and_wait_for_timeout(PySocketSockObject *s, int writing)
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001087{
1088 fd_set fds;
1089 struct timeval tv;
1090 int rc;
1091
1092 /* Nothing to do unless we're in timeout mode (not non-blocking) */
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001093 if (s->sock_timeout < 0.0)
1094 return SOCKET_IS_BLOCKING;
1095 else if (s->sock_timeout == 0.0)
1096 return SOCKET_IS_NONBLOCKING;
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001097
1098 /* Guard against closed socket */
1099 if (s->sock_fd < 0)
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001100 return SOCKET_HAS_BEEN_CLOSED;
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001101
Anthony Baxter93ab5fa2006-07-11 02:04:09 +00001102 /* Prefer poll, if available, since you can poll() any fd
1103 * which can't be done with select(). */
1104#ifdef HAVE_POLL
1105 {
1106 struct pollfd pollfd;
1107 int timeout;
1108
1109 pollfd.fd = s->sock_fd;
1110 pollfd.events = writing ? POLLOUT : POLLIN;
1111
1112 /* s->sock_timeout is in seconds, timeout in ms */
1113 timeout = (int)(s->sock_timeout * 1000 + 0.5);
Bill Janssen98d19da2007-09-10 21:51:02 +00001114 PySSL_BEGIN_ALLOW_THREADS
Anthony Baxter93ab5fa2006-07-11 02:04:09 +00001115 rc = poll(&pollfd, 1, timeout);
Bill Janssen98d19da2007-09-10 21:51:02 +00001116 PySSL_END_ALLOW_THREADS
Anthony Baxter93ab5fa2006-07-11 02:04:09 +00001117
1118 goto normal_return;
1119 }
1120#endif
1121
Neal Norwitz082b2df2006-02-07 07:04:46 +00001122 /* Guard against socket too large for select*/
Martin v. Löwisf84d1b92006-02-11 09:27:05 +00001123#ifndef Py_SOCKET_FD_CAN_BE_GE_FD_SETSIZE
Neal Norwitz082b2df2006-02-07 07:04:46 +00001124 if (s->sock_fd >= FD_SETSIZE)
Neal Norwitz389cea82006-02-13 00:35:21 +00001125 return SOCKET_TOO_LARGE_FOR_SELECT;
Martin v. Löwisf84d1b92006-02-11 09:27:05 +00001126#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +00001127
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001128 /* Construct the arguments to select */
1129 tv.tv_sec = (int)s->sock_timeout;
1130 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
1131 FD_ZERO(&fds);
1132 FD_SET(s->sock_fd, &fds);
1133
1134 /* See if the socket is ready */
Bill Janssen98d19da2007-09-10 21:51:02 +00001135 PySSL_BEGIN_ALLOW_THREADS
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001136 if (writing)
1137 rc = select(s->sock_fd+1, NULL, &fds, NULL, &tv);
1138 else
1139 rc = select(s->sock_fd+1, &fds, NULL, NULL, &tv);
Bill Janssen98d19da2007-09-10 21:51:02 +00001140 PySSL_END_ALLOW_THREADS
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001141
Bill Janssen934b16d2008-06-28 22:19:33 +00001142#ifdef HAVE_POLL
Anthony Baxter93ab5fa2006-07-11 02:04:09 +00001143normal_return:
Bill Janssen934b16d2008-06-28 22:19:33 +00001144#endif
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001145 /* Return SOCKET_TIMED_OUT on timeout, SOCKET_OPERATION_OK otherwise
1146 (when we are able to write or when there's something to read) */
1147 return rc == 0 ? SOCKET_HAS_TIMED_OUT : SOCKET_OPERATION_OK;
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001148}
1149
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001150static PyObject *PySSL_SSLwrite(PySSLObject *self, PyObject *args)
1151{
1152 char *data;
1153 int len;
Martin v. Löwis405a7952003-10-27 14:24:37 +00001154 int count;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001155 int sockstate;
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001156 int err;
Bill Janssen934b16d2008-06-28 22:19:33 +00001157 int nonblocking;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001158
Martin v. Löwis405a7952003-10-27 14:24:37 +00001159 if (!PyArg_ParseTuple(args, "s#:write", &data, &count))
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001160 return NULL;
1161
Bill Janssen934b16d2008-06-28 22:19:33 +00001162 /* just in case the blocking state of the socket has been changed */
1163 nonblocking = (self->Socket->sock_timeout >= 0.0);
1164 BIO_set_nbio(SSL_get_rbio(self->ssl), nonblocking);
1165 BIO_set_nbio(SSL_get_wbio(self->ssl), nonblocking);
1166
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001167 sockstate = check_socket_and_wait_for_timeout(self->Socket, 1);
1168 if (sockstate == SOCKET_HAS_TIMED_OUT) {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001169 PyErr_SetString(PySSLErrorObject,
1170 "The write operation timed out");
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001171 return NULL;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001172 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001173 PyErr_SetString(PySSLErrorObject,
1174 "Underlying socket has been closed.");
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001175 return NULL;
Neal Norwitz389cea82006-02-13 00:35:21 +00001176 } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001177 PyErr_SetString(PySSLErrorObject,
1178 "Underlying socket too large for select().");
Neal Norwitz082b2df2006-02-07 07:04:46 +00001179 return NULL;
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001180 }
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001181 do {
1182 err = 0;
Bill Janssen98d19da2007-09-10 21:51:02 +00001183 PySSL_BEGIN_ALLOW_THREADS
Martin v. Löwis405a7952003-10-27 14:24:37 +00001184 len = SSL_write(self->ssl, data, count);
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001185 err = SSL_get_error(self->ssl, len);
Bill Janssen98d19da2007-09-10 21:51:02 +00001186 PySSL_END_ALLOW_THREADS
Martin v. Löwisafec8e32003-06-28 07:40:23 +00001187 if(PyErr_CheckSignals()) {
1188 return NULL;
1189 }
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001190 if (err == SSL_ERROR_WANT_READ) {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001191 sockstate =
1192 check_socket_and_wait_for_timeout(self->Socket, 0);
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001193 } else if (err == SSL_ERROR_WANT_WRITE) {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001194 sockstate =
1195 check_socket_and_wait_for_timeout(self->Socket, 1);
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001196 } else {
1197 sockstate = SOCKET_OPERATION_OK;
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001198 }
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001199 if (sockstate == SOCKET_HAS_TIMED_OUT) {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001200 PyErr_SetString(PySSLErrorObject,
1201 "The write operation timed out");
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001202 return NULL;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001203 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001204 PyErr_SetString(PySSLErrorObject,
1205 "Underlying socket has been closed.");
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001206 return NULL;
1207 } else if (sockstate == SOCKET_IS_NONBLOCKING) {
1208 break;
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001209 }
1210 } while (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001211 if (len > 0)
1212 return PyInt_FromLong(len);
1213 else
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001214 return PySSL_SetError(self, len, __FILE__, __LINE__);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001215}
1216
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001217PyDoc_STRVAR(PySSL_SSLwrite_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001218"write(s) -> len\n\
1219\n\
1220Writes the string s into the SSL object. Returns the number\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001221of bytes written.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001222
Bill Janssen934b16d2008-06-28 22:19:33 +00001223static PyObject *PySSL_SSLpending(PySSLObject *self)
1224{
1225 int count = 0;
1226
1227 PySSL_BEGIN_ALLOW_THREADS
1228 count = SSL_pending(self->ssl);
1229 PySSL_END_ALLOW_THREADS
1230 if (count < 0)
1231 return PySSL_SetError(self, count, __FILE__, __LINE__);
1232 else
1233 return PyInt_FromLong(count);
1234}
1235
1236PyDoc_STRVAR(PySSL_SSLpending_doc,
1237"pending() -> count\n\
1238\n\
1239Returns the number of already decrypted bytes available for read,\n\
1240pending on the connection.\n");
1241
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001242static PyObject *PySSL_SSLread(PySSLObject *self, PyObject *args)
1243{
1244 PyObject *buf;
1245 int count = 0;
1246 int len = 1024;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001247 int sockstate;
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001248 int err;
Bill Janssen934b16d2008-06-28 22:19:33 +00001249 int nonblocking;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001250
1251 if (!PyArg_ParseTuple(args, "|i:read", &len))
1252 return NULL;
1253
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001254 if (!(buf = PyString_FromStringAndSize((char *) 0, len)))
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001255 return NULL;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001256
Bill Janssen934b16d2008-06-28 22:19:33 +00001257 /* just in case the blocking state of the socket has been changed */
1258 nonblocking = (self->Socket->sock_timeout >= 0.0);
1259 BIO_set_nbio(SSL_get_rbio(self->ssl), nonblocking);
1260 BIO_set_nbio(SSL_get_wbio(self->ssl), nonblocking);
1261
Georg Brandl43f08a82006-03-31 18:01:16 +00001262 /* first check if there are bytes ready to be read */
Bill Janssen98d19da2007-09-10 21:51:02 +00001263 PySSL_BEGIN_ALLOW_THREADS
Georg Brandl43f08a82006-03-31 18:01:16 +00001264 count = SSL_pending(self->ssl);
Bill Janssen98d19da2007-09-10 21:51:02 +00001265 PySSL_END_ALLOW_THREADS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001266
Georg Brandl43f08a82006-03-31 18:01:16 +00001267 if (!count) {
1268 sockstate = check_socket_and_wait_for_timeout(self->Socket, 0);
1269 if (sockstate == SOCKET_HAS_TIMED_OUT) {
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001270 PyErr_SetString(PySSLErrorObject,
1271 "The read operation timed out");
Georg Brandl43f08a82006-03-31 18:01:16 +00001272 Py_DECREF(buf);
1273 return NULL;
1274 } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001275 PyErr_SetString(PySSLErrorObject,
1276 "Underlying socket too large for select().");
1277 Py_DECREF(buf);
Georg Brandl43f08a82006-03-31 18:01:16 +00001278 return NULL;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001279 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
Bill Janssen934b16d2008-06-28 22:19:33 +00001280 if (SSL_get_shutdown(self->ssl) !=
1281 SSL_RECEIVED_SHUTDOWN)
1282 {
1283 Py_DECREF(buf);
1284 PyErr_SetString(PySSLErrorObject,
1285 "Socket closed without SSL shutdown handshake");
1286 return NULL;
1287 } else {
1288 /* should contain a zero-length string */
1289 _PyString_Resize(&buf, 0);
1290 return buf;
1291 }
Georg Brandl43f08a82006-03-31 18:01:16 +00001292 }
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001293 }
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001294 do {
1295 err = 0;
Bill Janssen98d19da2007-09-10 21:51:02 +00001296 PySSL_BEGIN_ALLOW_THREADS
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001297 count = SSL_read(self->ssl, PyString_AsString(buf), len);
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001298 err = SSL_get_error(self->ssl, count);
Bill Janssen98d19da2007-09-10 21:51:02 +00001299 PySSL_END_ALLOW_THREADS
Martin v. Löwisafec8e32003-06-28 07:40:23 +00001300 if(PyErr_CheckSignals()) {
1301 Py_DECREF(buf);
1302 return NULL;
1303 }
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001304 if (err == SSL_ERROR_WANT_READ) {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001305 sockstate =
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001306 check_socket_and_wait_for_timeout(self->Socket, 0);
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001307 } else if (err == SSL_ERROR_WANT_WRITE) {
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001308 sockstate =
1309 check_socket_and_wait_for_timeout(self->Socket, 1);
1310 } else if ((err == SSL_ERROR_ZERO_RETURN) &&
1311 (SSL_get_shutdown(self->ssl) ==
Guido van Rossum780b80d2007-08-27 18:42:23 +00001312 SSL_RECEIVED_SHUTDOWN))
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001313 {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001314 _PyString_Resize(&buf, 0);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001315 return buf;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001316 } else {
1317 sockstate = SOCKET_OPERATION_OK;
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001318 }
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001319 if (sockstate == SOCKET_HAS_TIMED_OUT) {
1320 PyErr_SetString(PySSLErrorObject,
1321 "The read operation timed out");
Martin v. Löwisafec8e32003-06-28 07:40:23 +00001322 Py_DECREF(buf);
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001323 return NULL;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001324 } else if (sockstate == SOCKET_IS_NONBLOCKING) {
1325 break;
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001326 }
1327 } while (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001328 if (count <= 0) {
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001329 Py_DECREF(buf);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001330 return PySSL_SetError(self, count, __FILE__, __LINE__);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001331 }
Tim Peters5de98422002-04-27 18:44:32 +00001332 if (count != len)
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001333 _PyString_Resize(&buf, count);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001334 return buf;
1335}
1336
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001337PyDoc_STRVAR(PySSL_SSLread_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001338"read([len]) -> string\n\
1339\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001340Read up to len bytes from the SSL socket.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001341
Bill Janssen934b16d2008-06-28 22:19:33 +00001342static PyObject *PySSL_SSLshutdown(PySSLObject *self)
1343{
Antoine Pitrou07072162010-04-23 21:07:58 +00001344 int err, ssl_err, sockstate, nonblocking;
1345 int zeros = 0;
Bill Janssen934b16d2008-06-28 22:19:33 +00001346
1347 /* Guard against closed socket */
1348 if (self->Socket->sock_fd < 0) {
1349 PyErr_SetString(PySSLErrorObject,
1350 "Underlying socket has been closed.");
1351 return NULL;
1352 }
1353
Antoine Pitrou07072162010-04-23 21:07:58 +00001354 /* Just in case the blocking state of the socket has been changed */
1355 nonblocking = (self->Socket->sock_timeout >= 0.0);
1356 BIO_set_nbio(SSL_get_rbio(self->ssl), nonblocking);
1357 BIO_set_nbio(SSL_get_wbio(self->ssl), nonblocking);
1358
1359 while (1) {
1360 PySSL_BEGIN_ALLOW_THREADS
1361 /* Disable read-ahead so that unwrap can work correctly.
1362 * Otherwise OpenSSL might read in too much data,
1363 * eating clear text data that happens to be
1364 * transmitted after the SSL shutdown.
1365 * Should be safe to call repeatedly everytime this
1366 * function is used and the shutdown_seen_zero != 0
1367 * condition is met.
1368 */
1369 if (self->shutdown_seen_zero)
1370 SSL_set_read_ahead(self->ssl, 0);
Bill Janssen934b16d2008-06-28 22:19:33 +00001371 err = SSL_shutdown(self->ssl);
Antoine Pitrou07072162010-04-23 21:07:58 +00001372 PySSL_END_ALLOW_THREADS
1373 /* If err == 1, a secure shutdown with SSL_shutdown() is complete */
1374 if (err > 0)
1375 break;
1376 if (err == 0) {
1377 /* Don't loop endlessly; instead preserve legacy
1378 behaviour of trying SSL_shutdown() only twice.
1379 This looks necessary for OpenSSL < 0.9.8m */
1380 if (++zeros > 1)
1381 break;
1382 /* Shutdown was sent, now try receiving */
1383 self->shutdown_seen_zero = 1;
1384 continue;
1385 }
1386
1387 /* Possibly retry shutdown until timeout or failure */
1388 ssl_err = SSL_get_error(self->ssl, err);
1389 if (ssl_err == SSL_ERROR_WANT_READ)
1390 sockstate = check_socket_and_wait_for_timeout(self->Socket, 0);
1391 else if (ssl_err == SSL_ERROR_WANT_WRITE)
1392 sockstate = check_socket_and_wait_for_timeout(self->Socket, 1);
1393 else
1394 break;
1395 if (sockstate == SOCKET_HAS_TIMED_OUT) {
1396 if (ssl_err == SSL_ERROR_WANT_READ)
1397 PyErr_SetString(PySSLErrorObject,
1398 "The read operation timed out");
1399 else
1400 PyErr_SetString(PySSLErrorObject,
1401 "The write operation timed out");
1402 return NULL;
1403 }
1404 else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
1405 PyErr_SetString(PySSLErrorObject,
1406 "Underlying socket too large for select().");
1407 return NULL;
1408 }
1409 else if (sockstate != SOCKET_OPERATION_OK)
1410 /* Retain the SSL error code */
1411 break;
Bill Janssen934b16d2008-06-28 22:19:33 +00001412 }
Bill Janssen934b16d2008-06-28 22:19:33 +00001413
1414 if (err < 0)
1415 return PySSL_SetError(self, err, __FILE__, __LINE__);
1416 else {
1417 Py_INCREF(self->Socket);
1418 return (PyObject *) (self->Socket);
1419 }
1420}
1421
1422PyDoc_STRVAR(PySSL_SSLshutdown_doc,
1423"shutdown(s) -> socket\n\
1424\n\
1425Does the SSL shutdown handshake with the remote end, and returns\n\
1426the underlying socket object.");
1427
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001428static PyMethodDef PySSLMethods[] = {
Bill Janssen934b16d2008-06-28 22:19:33 +00001429 {"do_handshake", (PyCFunction)PySSL_SSLdo_handshake, METH_NOARGS},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001430 {"write", (PyCFunction)PySSL_SSLwrite, METH_VARARGS,
Bill Janssen98d19da2007-09-10 21:51:02 +00001431 PySSL_SSLwrite_doc},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001432 {"read", (PyCFunction)PySSL_SSLread, METH_VARARGS,
Bill Janssen98d19da2007-09-10 21:51:02 +00001433 PySSL_SSLread_doc},
Bill Janssen934b16d2008-06-28 22:19:33 +00001434 {"pending", (PyCFunction)PySSL_SSLpending, METH_NOARGS,
1435 PySSL_SSLpending_doc},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001436 {"server", (PyCFunction)PySSL_server, METH_NOARGS},
1437 {"issuer", (PyCFunction)PySSL_issuer, METH_NOARGS},
Bill Janssen98d19da2007-09-10 21:51:02 +00001438 {"peer_certificate", (PyCFunction)PySSL_peercert, METH_VARARGS,
1439 PySSL_peercert_doc},
1440 {"cipher", (PyCFunction)PySSL_cipher, METH_NOARGS},
Bill Janssen934b16d2008-06-28 22:19:33 +00001441 {"shutdown", (PyCFunction)PySSL_SSLshutdown, METH_NOARGS,
1442 PySSL_SSLshutdown_doc},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001443 {NULL, NULL}
1444};
1445
1446static PyObject *PySSL_getattr(PySSLObject *self, char *name)
1447{
1448 return Py_FindMethod(PySSLMethods, (PyObject *)self, name);
1449}
1450
Jeremy Hylton938ace62002-07-17 16:30:39 +00001451static PyTypeObject PySSL_Type = {
Martin v. Löwis68192102007-07-21 06:55:02 +00001452 PyVarObject_HEAD_INIT(NULL, 0)
Guido van Rossum780b80d2007-08-27 18:42:23 +00001453 "ssl.SSLContext", /*tp_name*/
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001454 sizeof(PySSLObject), /*tp_basicsize*/
1455 0, /*tp_itemsize*/
1456 /* methods */
1457 (destructor)PySSL_dealloc, /*tp_dealloc*/
1458 0, /*tp_print*/
1459 (getattrfunc)PySSL_getattr, /*tp_getattr*/
1460 0, /*tp_setattr*/
1461 0, /*tp_compare*/
1462 0, /*tp_repr*/
1463 0, /*tp_as_number*/
1464 0, /*tp_as_sequence*/
1465 0, /*tp_as_mapping*/
1466 0, /*tp_hash*/
1467};
1468
1469#ifdef HAVE_OPENSSL_RAND
1470
1471/* helper routines for seeding the SSL PRNG */
1472static PyObject *
1473PySSL_RAND_add(PyObject *self, PyObject *args)
1474{
1475 char *buf;
1476 int len;
1477 double entropy;
1478
1479 if (!PyArg_ParseTuple(args, "s#d:RAND_add", &buf, &len, &entropy))
1480 return NULL;
1481 RAND_add(buf, len, entropy);
1482 Py_INCREF(Py_None);
1483 return Py_None;
1484}
1485
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001486PyDoc_STRVAR(PySSL_RAND_add_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001487"RAND_add(string, entropy)\n\
1488\n\
1489Mix string into the OpenSSL PRNG state. entropy (a float) is a lower\n\
Bill Janssen98d19da2007-09-10 21:51:02 +00001490bound on the entropy contained in string. See RFC 1750.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001491
1492static PyObject *
1493PySSL_RAND_status(PyObject *self)
1494{
1495 return PyInt_FromLong(RAND_status());
1496}
1497
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001498PyDoc_STRVAR(PySSL_RAND_status_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001499"RAND_status() -> 0 or 1\n\
1500\n\
1501Returns 1 if the OpenSSL PRNG has been seeded with enough data and 0 if not.\n\
1502It is necessary to seed the PRNG with RAND_add() on some platforms before\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001503using the ssl() function.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001504
1505static PyObject *
1506PySSL_RAND_egd(PyObject *self, PyObject *arg)
1507{
1508 int bytes;
1509
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001510 if (!PyString_Check(arg))
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001511 return PyErr_Format(PyExc_TypeError,
1512 "RAND_egd() expected string, found %s",
Christian Heimese93237d2007-12-19 02:37:44 +00001513 Py_TYPE(arg)->tp_name);
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001514 bytes = RAND_egd(PyString_AS_STRING(arg));
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001515 if (bytes == -1) {
1516 PyErr_SetString(PySSLErrorObject,
1517 "EGD connection failed or EGD did not return "
1518 "enough data to seed the PRNG");
1519 return NULL;
1520 }
1521 return PyInt_FromLong(bytes);
1522}
1523
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001524PyDoc_STRVAR(PySSL_RAND_egd_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001525"RAND_egd(path) -> bytes\n\
1526\n\
Bill Janssen98d19da2007-09-10 21:51:02 +00001527Queries the entropy gather daemon (EGD) on the socket named by 'path'.\n\
1528Returns number of bytes read. Raises SSLError if connection to EGD\n\
1529fails or if it does provide enough data to seed PRNG.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001530
1531#endif
1532
1533/* List of functions exported by this module. */
1534
1535static PyMethodDef PySSL_methods[] = {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001536 {"sslwrap", PySSL_sslwrap,
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001537 METH_VARARGS, ssl_doc},
Bill Janssen98d19da2007-09-10 21:51:02 +00001538 {"_test_decode_cert", PySSL_test_decode_certificate,
1539 METH_VARARGS},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001540#ifdef HAVE_OPENSSL_RAND
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001541 {"RAND_add", PySSL_RAND_add, METH_VARARGS,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001542 PySSL_RAND_add_doc},
1543 {"RAND_egd", PySSL_RAND_egd, METH_O,
1544 PySSL_RAND_egd_doc},
1545 {"RAND_status", (PyCFunction)PySSL_RAND_status, METH_NOARGS,
1546 PySSL_RAND_status_doc},
1547#endif
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001548 {NULL, NULL} /* Sentinel */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001549};
1550
1551
Bill Janssen98d19da2007-09-10 21:51:02 +00001552#ifdef WITH_THREAD
1553
1554/* an implementation of OpenSSL threading operations in terms
1555 of the Python C thread library */
1556
1557static PyThread_type_lock *_ssl_locks = NULL;
1558
1559static unsigned long _ssl_thread_id_function (void) {
1560 return PyThread_get_thread_ident();
1561}
1562
1563static void _ssl_thread_locking_function (int mode, int n, const char *file, int line) {
1564 /* this function is needed to perform locking on shared data
1565 structures. (Note that OpenSSL uses a number of global data
1566 structures that will be implicitly shared whenever multiple threads
1567 use OpenSSL.) Multi-threaded applications will crash at random if
1568 it is not set.
1569
1570 locking_function() must be able to handle up to CRYPTO_num_locks()
1571 different mutex locks. It sets the n-th lock if mode & CRYPTO_LOCK, and
1572 releases it otherwise.
1573
1574 file and line are the file number of the function setting the
1575 lock. They can be useful for debugging.
1576 */
1577
1578 if ((_ssl_locks == NULL) ||
Neal Norwitz5802bb22008-03-27 05:03:11 +00001579 (n < 0) || ((unsigned)n >= _ssl_locks_count))
Bill Janssen98d19da2007-09-10 21:51:02 +00001580 return;
1581
1582 if (mode & CRYPTO_LOCK) {
1583 PyThread_acquire_lock(_ssl_locks[n], 1);
1584 } else {
1585 PyThread_release_lock(_ssl_locks[n]);
1586 }
1587}
1588
1589static int _setup_ssl_threads(void) {
1590
Neal Norwitz5802bb22008-03-27 05:03:11 +00001591 unsigned int i;
Bill Janssen98d19da2007-09-10 21:51:02 +00001592
1593 if (_ssl_locks == NULL) {
1594 _ssl_locks_count = CRYPTO_num_locks();
1595 _ssl_locks = (PyThread_type_lock *)
1596 malloc(sizeof(PyThread_type_lock) * _ssl_locks_count);
1597 if (_ssl_locks == NULL)
1598 return 0;
1599 memset(_ssl_locks, 0, sizeof(PyThread_type_lock) * _ssl_locks_count);
1600 for (i = 0; i < _ssl_locks_count; i++) {
1601 _ssl_locks[i] = PyThread_allocate_lock();
1602 if (_ssl_locks[i] == NULL) {
Raymond Hettinger8fb67e02009-01-26 16:55:41 +00001603 unsigned int j;
Bill Janssen98d19da2007-09-10 21:51:02 +00001604 for (j = 0; j < i; j++) {
1605 PyThread_free_lock(_ssl_locks[j]);
1606 }
1607 free(_ssl_locks);
1608 return 0;
1609 }
1610 }
1611 CRYPTO_set_locking_callback(_ssl_thread_locking_function);
1612 CRYPTO_set_id_callback(_ssl_thread_id_function);
1613 }
1614 return 1;
1615}
1616
1617#endif /* def HAVE_THREAD */
1618
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001619PyDoc_STRVAR(module_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001620"Implementation module for SSL socket operations. See the socket module\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001621for documentation.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001622
Mark Hammondfe51c6d2002-08-02 02:27:13 +00001623PyMODINIT_FUNC
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001624init_ssl(void)
1625{
1626 PyObject *m, *d;
1627
Christian Heimese93237d2007-12-19 02:37:44 +00001628 Py_TYPE(&PySSL_Type) = &PyType_Type;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001629
1630 m = Py_InitModule3("_ssl", PySSL_methods, module_doc);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00001631 if (m == NULL)
1632 return;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001633 d = PyModule_GetDict(m);
1634
1635 /* Load _socket module and its C API */
1636 if (PySocketModule_ImportModuleAndAPI())
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001637 return;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001638
1639 /* Init OpenSSL */
1640 SSL_load_error_strings();
Antoine Pitrou878602a2010-04-21 19:41:28 +00001641 SSL_library_init();
Bill Janssen98d19da2007-09-10 21:51:02 +00001642#ifdef WITH_THREAD
1643 /* note that this will start threading if not already started */
1644 if (!_setup_ssl_threads()) {
1645 return;
1646 }
1647#endif
Antoine Pitrou878602a2010-04-21 19:41:28 +00001648 OpenSSL_add_all_algorithms();
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001649
1650 /* Add symbols to module dict */
Bill Janssen98d19da2007-09-10 21:51:02 +00001651 PySSLErrorObject = PyErr_NewException("ssl.SSLError",
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001652 PySocketModule.error,
1653 NULL);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001654 if (PySSLErrorObject == NULL)
1655 return;
Bill Janssen98d19da2007-09-10 21:51:02 +00001656 if (PyDict_SetItemString(d, "SSLError", PySSLErrorObject) != 0)
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001657 return;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001658 if (PyDict_SetItemString(d, "SSLType",
1659 (PyObject *)&PySSL_Type) != 0)
1660 return;
1661 PyModule_AddIntConstant(m, "SSL_ERROR_ZERO_RETURN",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001662 PY_SSL_ERROR_ZERO_RETURN);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001663 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_READ",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001664 PY_SSL_ERROR_WANT_READ);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001665 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_WRITE",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001666 PY_SSL_ERROR_WANT_WRITE);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001667 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_X509_LOOKUP",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001668 PY_SSL_ERROR_WANT_X509_LOOKUP);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001669 PyModule_AddIntConstant(m, "SSL_ERROR_SYSCALL",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001670 PY_SSL_ERROR_SYSCALL);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001671 PyModule_AddIntConstant(m, "SSL_ERROR_SSL",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001672 PY_SSL_ERROR_SSL);
1673 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_CONNECT",
1674 PY_SSL_ERROR_WANT_CONNECT);
1675 /* non ssl.h errorcodes */
1676 PyModule_AddIntConstant(m, "SSL_ERROR_EOF",
1677 PY_SSL_ERROR_EOF);
1678 PyModule_AddIntConstant(m, "SSL_ERROR_INVALID_ERROR_CODE",
1679 PY_SSL_ERROR_INVALID_ERROR_CODE);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001680 /* cert requirements */
1681 PyModule_AddIntConstant(m, "CERT_NONE",
1682 PY_SSL_CERT_NONE);
1683 PyModule_AddIntConstant(m, "CERT_OPTIONAL",
1684 PY_SSL_CERT_OPTIONAL);
1685 PyModule_AddIntConstant(m, "CERT_REQUIRED",
1686 PY_SSL_CERT_REQUIRED);
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001687
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001688 /* protocol versions */
1689 PyModule_AddIntConstant(m, "PROTOCOL_SSLv2",
1690 PY_SSL_VERSION_SSL2);
1691 PyModule_AddIntConstant(m, "PROTOCOL_SSLv3",
1692 PY_SSL_VERSION_SSL3);
1693 PyModule_AddIntConstant(m, "PROTOCOL_SSLv23",
1694 PY_SSL_VERSION_SSL23);
1695 PyModule_AddIntConstant(m, "PROTOCOL_TLSv1",
1696 PY_SSL_VERSION_TLS1);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001697}