blob: c21ac5d380a9931899f680f8ea6f7ddde62c4e6c [file] [log] [blame]
Thomas Woutersed03b412007-08-28 21:37:11 +00001/* SSL socket module
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002
3 SSL support based on patches by Brian E Gallew and Laszlo Kovacs.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004 Re-worked a bit by Bill Janssen to add server-side support and
Bill Janssen6e027db2007-11-15 22:23:56 +00005 certificate decoding. Chris Stawarz contributed some non-blocking
6 patches.
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00007
Thomas Wouters1b7f8912007-09-19 03:06:30 +00008 This module is imported by ssl.py. It should *not* be used
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00009 directly.
10
Thomas Wouters1b7f8912007-09-19 03:06:30 +000011 XXX should partial writes be enabled, SSL_MODE_ENABLE_PARTIAL_WRITE?
Antoine Pitrou5a1c4d12010-04-23 21:11:10 +000012
13 XXX integrate several "shutdown modes" as suggested in
14 http://bugs.python.org/issue8108#msg102867 ?
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000015*/
16
17#include "Python.h"
Thomas Woutersed03b412007-08-28 21:37:11 +000018
Thomas Wouters1b7f8912007-09-19 03:06:30 +000019#ifdef WITH_THREAD
20#include "pythread.h"
21#define PySSL_BEGIN_ALLOW_THREADS { \
Bill Janssen6e027db2007-11-15 22:23:56 +000022 PyThreadState *_save = NULL; \
Thomas Wouters1b7f8912007-09-19 03:06:30 +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 */
Thomas Woutersed03b412007-08-28 21:37:11 +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 */
Thomas Woutersed03b412007-08-28 21:37:11 +000046 PY_SSL_ERROR_ZERO_RETURN,
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +000047 PY_SSL_ERROR_WANT_CONNECT,
Thomas Woutersed03b412007-08-28 21:37:11 +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 */
Bill Janssen54cc54c2007-12-14 22:08:56 +000050 PY_SSL_ERROR_NO_SOCKET, /* socket has been GC'd */
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +000051 PY_SSL_ERROR_INVALID_ERROR_CODE
52};
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000053
Thomas Woutersed03b412007-08-28 21:37:11 +000054enum py_ssl_server_or_client {
55 PY_SSL_CLIENT,
56 PY_SSL_SERVER
57};
58
59enum py_ssl_cert_requirements {
60 PY_SSL_CERT_NONE,
61 PY_SSL_CERT_OPTIONAL,
62 PY_SSL_CERT_REQUIRED
63};
64
65enum py_ssl_version {
66 PY_SSL_VERSION_SSL2,
67 PY_SSL_VERSION_SSL3,
68 PY_SSL_VERSION_SSL23,
69 PY_SSL_VERSION_TLS1,
70};
71
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000072/* Include symbols from _socket module */
73#include "socketmodule.h"
74
Benjamin Petersonb173f782009-05-05 22:31:58 +000075static PySocketModule_APIObject PySocketModule;
76
Thomas Woutersed03b412007-08-28 21:37:11 +000077#if defined(HAVE_POLL_H)
Thomas Wouters0e3f5912006-08-11 14:57:12 +000078#include <poll.h>
79#elif defined(HAVE_SYS_POLL_H)
80#include <sys/poll.h>
81#endif
82
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000083/* Include OpenSSL header files */
84#include "openssl/rsa.h"
85#include "openssl/crypto.h"
86#include "openssl/x509.h"
Thomas Wouters1b7f8912007-09-19 03:06:30 +000087#include "openssl/x509v3.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000088#include "openssl/pem.h"
89#include "openssl/ssl.h"
90#include "openssl/err.h"
91#include "openssl/rand.h"
92
93/* SSL error object */
94static PyObject *PySSLErrorObject;
95
Thomas Wouters1b7f8912007-09-19 03:06:30 +000096#ifdef WITH_THREAD
97
98/* serves as a flag to see whether we've initialized the SSL thread support. */
99/* 0 means no, greater than 0 means yes */
100
101static unsigned int _ssl_locks_count = 0;
102
103#endif /* def WITH_THREAD */
104
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000105/* SSL socket object */
106
107#define X509_NAME_MAXLEN 256
108
109/* RAND_* APIs got added to OpenSSL in 0.9.5 */
110#if OPENSSL_VERSION_NUMBER >= 0x0090500fL
111# define HAVE_OPENSSL_RAND 1
112#else
113# undef HAVE_OPENSSL_RAND
114#endif
115
116typedef struct {
117 PyObject_HEAD
Bill Janssen54cc54c2007-12-14 22:08:56 +0000118 PyObject *Socket; /* weakref to socket on which we're layered */
Thomas Woutersed03b412007-08-28 21:37:11 +0000119 SSL_CTX* ctx;
120 SSL* ssl;
121 X509* peer_cert;
Antoine Pitrou5a1c4d12010-04-23 21:11:10 +0000122 int shutdown_seen_zero;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000123
124} PySSLObject;
125
Jeremy Hylton938ace62002-07-17 16:30:39 +0000126static PyTypeObject PySSL_Type;
127static PyObject *PySSL_SSLwrite(PySSLObject *self, PyObject *args);
128static PyObject *PySSL_SSLread(PySSLObject *self, PyObject *args);
Thomas Woutersed03b412007-08-28 21:37:11 +0000129static int check_socket_and_wait_for_timeout(PySocketSockObject *s,
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +0000130 int writing);
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000131static PyObject *PySSL_peercert(PySSLObject *self, PyObject *args);
132static PyObject *PySSL_cipher(PySSLObject *self);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000133
Christian Heimes90aa7642007-12-19 02:45:37 +0000134#define PySSLObject_Check(v) (Py_TYPE(v) == &PySSL_Type)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000135
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +0000136typedef enum {
137 SOCKET_IS_NONBLOCKING,
138 SOCKET_IS_BLOCKING,
139 SOCKET_HAS_TIMED_OUT,
140 SOCKET_HAS_BEEN_CLOSED,
Neal Norwitz389cea82006-02-13 00:35:21 +0000141 SOCKET_TOO_LARGE_FOR_SELECT,
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +0000142 SOCKET_OPERATION_OK
143} timeout_state;
144
Thomas Woutersed03b412007-08-28 21:37:11 +0000145/* Wrap error strings with filename and line # */
146#define STRINGIFY1(x) #x
147#define STRINGIFY2(x) STRINGIFY1(x)
148#define ERRSTR1(x,y,z) (x ":" y ": " z)
149#define ERRSTR(x) ERRSTR1("_ssl.c", STRINGIFY2(__LINE__), x)
150
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000151/* XXX It might be helpful to augment the error message generated
152 below with the name of the SSL function that generated the error.
153 I expect it's obvious most of the time.
154*/
155
156static PyObject *
Thomas Woutersed03b412007-08-28 21:37:11 +0000157PySSL_SetError(PySSLObject *obj, int ret, char *filename, int lineno)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000158{
Thomas Woutersed03b412007-08-28 21:37:11 +0000159 PyObject *v;
160 char buf[2048];
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000161 char *errstr;
162 int err;
Thomas Woutersed03b412007-08-28 21:37:11 +0000163 enum py_ssl_error p = PY_SSL_ERROR_NONE;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000164
165 assert(ret <= 0);
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +0000166
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000167 if (obj->ssl != NULL) {
Thomas Woutersed03b412007-08-28 21:37:11 +0000168 err = SSL_get_error(obj->ssl, ret);
169
170 switch (err) {
171 case SSL_ERROR_ZERO_RETURN:
172 errstr = "TLS/SSL connection has been closed";
173 p = PY_SSL_ERROR_ZERO_RETURN;
174 break;
175 case SSL_ERROR_WANT_READ:
176 errstr = "The operation did not complete (read)";
177 p = PY_SSL_ERROR_WANT_READ;
178 break;
179 case SSL_ERROR_WANT_WRITE:
180 p = PY_SSL_ERROR_WANT_WRITE;
181 errstr = "The operation did not complete (write)";
182 break;
183 case SSL_ERROR_WANT_X509_LOOKUP:
184 p = PY_SSL_ERROR_WANT_X509_LOOKUP;
185 errstr =
186 "The operation did not complete (X509 lookup)";
187 break;
188 case SSL_ERROR_WANT_CONNECT:
189 p = PY_SSL_ERROR_WANT_CONNECT;
190 errstr = "The operation did not complete (connect)";
191 break;
192 case SSL_ERROR_SYSCALL:
193 {
194 unsigned long e = ERR_get_error();
195 if (e == 0) {
Bill Janssen54cc54c2007-12-14 22:08:56 +0000196 PySocketSockObject *s
197 = (PySocketSockObject *) PyWeakref_GetObject(obj->Socket);
198 if (ret == 0 || (((PyObject *)s) == Py_None)) {
Thomas Woutersed03b412007-08-28 21:37:11 +0000199 p = PY_SSL_ERROR_EOF;
200 errstr =
201 "EOF occurred in violation of protocol";
202 } else if (ret == -1) {
203 /* underlying BIO reported an I/O error */
Bill Janssen54cc54c2007-12-14 22:08:56 +0000204 return s->errorhandler();
Thomas Woutersed03b412007-08-28 21:37:11 +0000205 } else { /* possible? */
206 p = PY_SSL_ERROR_SYSCALL;
207 errstr = "Some I/O error occurred";
208 }
209 } else {
Jeremy Hylton4e547302002-07-02 18:25:00 +0000210 p = PY_SSL_ERROR_SYSCALL;
Thomas Woutersed03b412007-08-28 21:37:11 +0000211 /* XXX Protected by global interpreter lock */
212 errstr = ERR_error_string(e, NULL);
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +0000213 }
Thomas Woutersed03b412007-08-28 21:37:11 +0000214 break;
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +0000215 }
Thomas Woutersed03b412007-08-28 21:37:11 +0000216 case SSL_ERROR_SSL:
217 {
218 unsigned long e = ERR_get_error();
219 p = PY_SSL_ERROR_SSL;
220 if (e != 0)
221 /* XXX Protected by global interpreter lock */
222 errstr = ERR_error_string(e, NULL);
223 else { /* possible? */
224 errstr =
225 "A failure in the SSL library occurred";
226 }
227 break;
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +0000228 }
Thomas Woutersed03b412007-08-28 21:37:11 +0000229 default:
230 p = PY_SSL_ERROR_INVALID_ERROR_CODE;
231 errstr = "Invalid error code";
232 }
233 } else {
234 errstr = ERR_error_string(ERR_peek_last_error(), NULL);
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +0000235 }
Thomas Woutersed03b412007-08-28 21:37:11 +0000236 PyOS_snprintf(buf, sizeof(buf), "_ssl.c:%d: %s", lineno, errstr);
237 v = Py_BuildValue("(is)", p, buf);
238 if (v != NULL) {
239 PyErr_SetObject(PySSLErrorObject, v);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000240 Py_DECREF(v);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000241 }
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000242 return NULL;
243}
244
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000245static PyObject *
246_setSSLError (char *errstr, int errcode, char *filename, int lineno) {
247
248 char buf[2048];
249 PyObject *v;
250
251 if (errstr == NULL) {
252 errcode = ERR_peek_last_error();
253 errstr = ERR_error_string(errcode, NULL);
254 }
255 PyOS_snprintf(buf, sizeof(buf), "_ssl.c:%d: %s", lineno, errstr);
256 v = Py_BuildValue("(is)", errcode, buf);
257 if (v != NULL) {
258 PyErr_SetObject(PySSLErrorObject, v);
259 Py_DECREF(v);
260 }
261 return NULL;
262}
263
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000264static PySSLObject *
Thomas Woutersed03b412007-08-28 21:37:11 +0000265newPySSLObject(PySocketSockObject *Sock, char *key_file, char *cert_file,
266 enum py_ssl_server_or_client socket_type,
267 enum py_ssl_cert_requirements certreq,
268 enum py_ssl_version proto_version,
269 char *cacerts_file)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000270{
271 PySSLObject *self;
272 char *errstr = NULL;
273 int ret;
Thomas Woutersed03b412007-08-28 21:37:11 +0000274 int verification_mode;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000275
Guido van Rossume6650f92007-12-06 19:05:55 +0000276 self = PyObject_New(PySSLObject, &PySSL_Type); /* Create new object */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000277 if (self == NULL)
278 return NULL;
Thomas Woutersed03b412007-08-28 21:37:11 +0000279 self->peer_cert = NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000280 self->ssl = NULL;
281 self->ctx = NULL;
282 self->Socket = NULL;
283
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000284 /* Make sure the SSL error state is initialized */
285 (void) ERR_get_state();
286 ERR_clear_error();
287
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000288 if ((key_file && !cert_file) || (!key_file && cert_file)) {
Thomas Woutersed03b412007-08-28 21:37:11 +0000289 errstr = ERRSTR("Both the key & certificate files "
290 "must be specified");
291 goto fail;
292 }
293
294 if ((socket_type == PY_SSL_SERVER) &&
295 ((key_file == NULL) || (cert_file == NULL))) {
296 errstr = ERRSTR("Both the key & certificate files "
297 "must be specified for server-side operation");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000298 goto fail;
299 }
300
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000301 PySSL_BEGIN_ALLOW_THREADS
Thomas Woutersed03b412007-08-28 21:37:11 +0000302 if (proto_version == PY_SSL_VERSION_TLS1)
303 self->ctx = SSL_CTX_new(TLSv1_method()); /* Set up context */
304 else if (proto_version == PY_SSL_VERSION_SSL3)
305 self->ctx = SSL_CTX_new(SSLv3_method()); /* Set up context */
306 else if (proto_version == PY_SSL_VERSION_SSL2)
307 self->ctx = SSL_CTX_new(SSLv2_method()); /* Set up context */
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000308 else if (proto_version == PY_SSL_VERSION_SSL23)
Thomas Woutersed03b412007-08-28 21:37:11 +0000309 self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000310 PySSL_END_ALLOW_THREADS
Thomas Woutersed03b412007-08-28 21:37:11 +0000311
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000312 if (self->ctx == NULL) {
Thomas Woutersed03b412007-08-28 21:37:11 +0000313 errstr = ERRSTR("Invalid SSL protocol variant specified.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000314 goto fail;
315 }
316
Thomas Woutersed03b412007-08-28 21:37:11 +0000317 if (certreq != PY_SSL_CERT_NONE) {
318 if (cacerts_file == NULL) {
319 errstr = ERRSTR("No root certificates specified for "
320 "verification of other-side certificates.");
321 goto fail;
322 } else {
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000323 PySSL_BEGIN_ALLOW_THREADS
Thomas Woutersed03b412007-08-28 21:37:11 +0000324 ret = SSL_CTX_load_verify_locations(self->ctx,
325 cacerts_file,
326 NULL);
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000327 PySSL_END_ALLOW_THREADS
Thomas Woutersed03b412007-08-28 21:37:11 +0000328 if (ret != 1) {
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000329 _setSSLError(NULL, 0, __FILE__, __LINE__);
Thomas Woutersed03b412007-08-28 21:37:11 +0000330 goto fail;
331 }
332 }
333 }
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000334 if (key_file) {
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000335 PySSL_BEGIN_ALLOW_THREADS
Martin v. Löwis09c35f72002-07-28 09:57:45 +0000336 ret = SSL_CTX_use_PrivateKey_file(self->ctx, key_file,
Thomas Woutersed03b412007-08-28 21:37:11 +0000337 SSL_FILETYPE_PEM);
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000338 PySSL_END_ALLOW_THREADS
Thomas Woutersed03b412007-08-28 21:37:11 +0000339 if (ret != 1) {
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000340 _setSSLError(NULL, ret, __FILE__, __LINE__);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000341 goto fail;
342 }
343
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000344 PySSL_BEGIN_ALLOW_THREADS
Martin v. Löwis09c35f72002-07-28 09:57:45 +0000345 ret = SSL_CTX_use_certificate_chain_file(self->ctx,
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000346 cert_file);
347 PySSL_END_ALLOW_THREADS
Thomas Woutersed03b412007-08-28 21:37:11 +0000348 if (ret != 1) {
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000349 /*
350 fprintf(stderr, "ret is %d, errcode is %lu, %lu, with file \"%s\"\n",
351 ret, ERR_peek_error(), ERR_peek_last_error(), cert_file);
352 */
353 if (ERR_peek_last_error() != 0) {
354 _setSSLError(NULL, ret, __FILE__, __LINE__);
355 goto fail;
356 }
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000357 }
358 }
359
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000360 /* ssl compatibility */
361 SSL_CTX_set_options(self->ctx, SSL_OP_ALL);
362
Thomas Woutersed03b412007-08-28 21:37:11 +0000363 verification_mode = SSL_VERIFY_NONE;
364 if (certreq == PY_SSL_CERT_OPTIONAL)
365 verification_mode = SSL_VERIFY_PEER;
366 else if (certreq == PY_SSL_CERT_REQUIRED)
367 verification_mode = (SSL_VERIFY_PEER |
368 SSL_VERIFY_FAIL_IF_NO_PEER_CERT);
369 SSL_CTX_set_verify(self->ctx, verification_mode,
370 NULL); /* set verify lvl */
371
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000372 PySSL_BEGIN_ALLOW_THREADS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000373 self->ssl = SSL_new(self->ctx); /* New ssl struct */
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000374 PySSL_END_ALLOW_THREADS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000375 SSL_set_fd(self->ssl, Sock->sock_fd); /* Set the socket for SSL */
Antoine Pitroud59ceb52010-04-09 20:47:00 +0000376#ifdef SSL_MODE_AUTO_RETRY
Antoine Pitroued6c8932010-03-26 19:38:11 +0000377 SSL_set_mode(self->ssl, SSL_MODE_AUTO_RETRY);
Antoine Pitroud59ceb52010-04-09 20:47:00 +0000378#endif
Guido van Rossum4f707ac2003-01-31 18:13:18 +0000379
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000380 /* If the socket is in non-blocking mode or timeout mode, set the BIO
Guido van Rossum4f707ac2003-01-31 18:13:18 +0000381 * to non-blocking mode (blocking is the default)
382 */
383 if (Sock->sock_timeout >= 0.0) {
384 /* Set both the read and write BIO's to non-blocking mode */
385 BIO_set_nbio(SSL_get_rbio(self->ssl), 1);
386 BIO_set_nbio(SSL_get_wbio(self->ssl), 1);
387 }
388
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000389 PySSL_BEGIN_ALLOW_THREADS
Thomas Woutersed03b412007-08-28 21:37:11 +0000390 if (socket_type == PY_SSL_CLIENT)
391 SSL_set_connect_state(self->ssl);
392 else
393 SSL_set_accept_state(self->ssl);
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000394 PySSL_END_ALLOW_THREADS
Martin v. Löwis09c35f72002-07-28 09:57:45 +0000395
Bill Janssen54cc54c2007-12-14 22:08:56 +0000396 self->Socket = PyWeakref_NewRef((PyObject *) Sock, Py_None);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000397 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 *
Thomas Woutersed03b412007-08-28 21:37:11 +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;
Thomas Woutersed03b412007-08-28 21:37:11 +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;
Thomas Woutersed03b412007-08-28 21:37:11 +0000414 char *cacerts_file = NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000415
Thomas Woutersed03b412007-08-28 21:37:11 +0000416 if (!PyArg_ParseTuple(args, "O!i|zziiz:sslwrap",
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000417 PySocketModule.Sock_Type,
Thomas Wouters89f507f2006-12-13 04:49:30 +0000418 &Sock,
Thomas Woutersed03b412007-08-28 21:37:11 +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
Thomas Woutersed03b412007-08-28 21:37:11 +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,
Thomas Woutersed03b412007-08-28 21:37:11 +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 Janssen6e027db2007-11-15 22:23:56 +0000444static PyObject *PySSL_SSLdo_handshake(PySSLObject *self)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000445{
Bill Janssen6e027db2007-11-15 22:23:56 +0000446 int ret;
447 int err;
Antoine Pitrouec146182010-04-24 21:30:20 +0000448 int sockstate, nonblocking;
449 PySocketSockObject *sock
450 = (PySocketSockObject *) PyWeakref_GetObject(self->Socket);
451
452 if (((PyObject*)sock) == Py_None) {
453 _setSSLError("Underlying socket connection gone",
454 PY_SSL_ERROR_NO_SOCKET, __FILE__, __LINE__);
455 return NULL;
456 }
457
458 /* just in case the blocking state of the socket has been changed */
459 nonblocking = (sock->sock_timeout >= 0.0);
460 BIO_set_nbio(SSL_get_rbio(self->ssl), nonblocking);
461 BIO_set_nbio(SSL_get_wbio(self->ssl), nonblocking);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000462
Bill Janssen6e027db2007-11-15 22:23:56 +0000463 /* Actually negotiate SSL connection */
464 /* XXX If SSL_do_handshake() returns 0, it's also a failure. */
465 sockstate = 0;
466 do {
467 PySSL_BEGIN_ALLOW_THREADS
468 ret = SSL_do_handshake(self->ssl);
469 err = SSL_get_error(self->ssl, ret);
470 PySSL_END_ALLOW_THREADS
471 if(PyErr_CheckSignals()) {
472 return NULL;
473 }
474 if (err == SSL_ERROR_WANT_READ) {
Bill Janssen54cc54c2007-12-14 22:08:56 +0000475 sockstate = check_socket_and_wait_for_timeout(sock, 0);
Bill Janssen6e027db2007-11-15 22:23:56 +0000476 } else if (err == SSL_ERROR_WANT_WRITE) {
Bill Janssen54cc54c2007-12-14 22:08:56 +0000477 sockstate = check_socket_and_wait_for_timeout(sock, 1);
Bill Janssen6e027db2007-11-15 22:23:56 +0000478 } else {
479 sockstate = SOCKET_OPERATION_OK;
480 }
481 if (sockstate == SOCKET_HAS_TIMED_OUT) {
482 PyErr_SetString(PySSLErrorObject,
483 ERRSTR("The handshake operation timed out"));
484 return NULL;
485 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
486 PyErr_SetString(PySSLErrorObject,
487 ERRSTR("Underlying socket has been closed."));
488 return NULL;
489 } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
490 PyErr_SetString(PySSLErrorObject,
491 ERRSTR("Underlying socket too large for select()."));
492 return NULL;
493 } else if (sockstate == SOCKET_IS_NONBLOCKING) {
494 break;
495 }
496 } while (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE);
497 if (ret < 1)
498 return PySSL_SetError(self, ret, __FILE__, __LINE__);
499 self->ssl->debug = 1;
500
501 if (self->peer_cert)
502 X509_free (self->peer_cert);
503 PySSL_BEGIN_ALLOW_THREADS
504 self->peer_cert = SSL_get_peer_certificate(self->ssl);
505 PySSL_END_ALLOW_THREADS
506
507 Py_INCREF(Py_None);
508 return Py_None;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000509}
510
Thomas Woutersed03b412007-08-28 21:37:11 +0000511static PyObject *
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000512_create_tuple_for_attribute (ASN1_OBJECT *name, ASN1_STRING *value) {
Thomas Woutersed03b412007-08-28 21:37:11 +0000513
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000514 char namebuf[X509_NAME_MAXLEN];
515 int buflen;
516 PyObject *name_obj;
517 PyObject *value_obj;
518 PyObject *attr;
519 unsigned char *valuebuf = NULL;
Thomas Woutersed03b412007-08-28 21:37:11 +0000520
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000521 buflen = OBJ_obj2txt(namebuf, sizeof(namebuf), name, 0);
522 if (buflen < 0) {
523 _setSSLError(NULL, 0, __FILE__, __LINE__);
524 goto fail;
Thomas Woutersed03b412007-08-28 21:37:11 +0000525 }
Bill Janssen6e027db2007-11-15 22:23:56 +0000526 name_obj = PyUnicode_FromStringAndSize(namebuf, buflen);
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000527 if (name_obj == NULL)
528 goto fail;
Guido van Rossumf06628b2007-11-21 20:01:53 +0000529
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000530 buflen = ASN1_STRING_to_UTF8(&valuebuf, value);
531 if (buflen < 0) {
532 _setSSLError(NULL, 0, __FILE__, __LINE__);
533 Py_DECREF(name_obj);
534 goto fail;
535 }
536 value_obj = PyUnicode_DecodeUTF8((char *) valuebuf,
537 buflen, "strict");
538 OPENSSL_free(valuebuf);
539 if (value_obj == NULL) {
540 Py_DECREF(name_obj);
541 goto fail;
542 }
543 attr = PyTuple_New(2);
544 if (attr == NULL) {
545 Py_DECREF(name_obj);
546 Py_DECREF(value_obj);
547 goto fail;
548 }
549 PyTuple_SET_ITEM(attr, 0, name_obj);
550 PyTuple_SET_ITEM(attr, 1, value_obj);
551 return attr;
Thomas Woutersed03b412007-08-28 21:37:11 +0000552
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000553 fail:
Thomas Woutersed03b412007-08-28 21:37:11 +0000554 return NULL;
555}
556
557static PyObject *
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000558_create_tuple_for_X509_NAME (X509_NAME *xname)
Thomas Woutersed03b412007-08-28 21:37:11 +0000559{
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000560 PyObject *dn = NULL; /* tuple which represents the "distinguished name" */
561 PyObject *rdn = NULL; /* tuple to hold a "relative distinguished name" */
562 PyObject *rdnt;
563 PyObject *attr = NULL; /* tuple to hold an attribute */
564 int entry_count = X509_NAME_entry_count(xname);
565 X509_NAME_ENTRY *entry;
566 ASN1_OBJECT *name;
567 ASN1_STRING *value;
568 int index_counter;
569 int rdn_level = -1;
570 int retcode;
571
572 dn = PyList_New(0);
573 if (dn == NULL)
574 return NULL;
575 /* now create another tuple to hold the top-level RDN */
576 rdn = PyList_New(0);
577 if (rdn == NULL)
578 goto fail0;
579
580 for (index_counter = 0;
581 index_counter < entry_count;
582 index_counter++)
583 {
584 entry = X509_NAME_get_entry(xname, index_counter);
585
586 /* check to see if we've gotten to a new RDN */
587 if (rdn_level >= 0) {
588 if (rdn_level != entry->set) {
589 /* yes, new RDN */
590 /* add old RDN to DN */
591 rdnt = PyList_AsTuple(rdn);
592 Py_DECREF(rdn);
593 if (rdnt == NULL)
594 goto fail0;
595 retcode = PyList_Append(dn, rdnt);
596 Py_DECREF(rdnt);
597 if (retcode < 0)
598 goto fail0;
599 /* create new RDN */
600 rdn = PyList_New(0);
601 if (rdn == NULL)
602 goto fail0;
603 }
604 }
605 rdn_level = entry->set;
606
607 /* now add this attribute to the current RDN */
608 name = X509_NAME_ENTRY_get_object(entry);
609 value = X509_NAME_ENTRY_get_data(entry);
610 attr = _create_tuple_for_attribute(name, value);
611 /*
612 fprintf(stderr, "RDN level %d, attribute %s: %s\n",
613 entry->set,
Christian Heimes72b710a2008-05-26 13:28:38 +0000614 PyBytes_AS_STRING(PyTuple_GET_ITEM(attr, 0)),
615 PyBytes_AS_STRING(PyTuple_GET_ITEM(attr, 1)));
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000616 */
617 if (attr == NULL)
618 goto fail1;
619 retcode = PyList_Append(rdn, attr);
620 Py_DECREF(attr);
621 if (retcode < 0)
622 goto fail1;
623 }
624 /* now, there's typically a dangling RDN */
625 if ((rdn != NULL) && (PyList_Size(rdn) > 0)) {
626 rdnt = PyList_AsTuple(rdn);
627 Py_DECREF(rdn);
628 if (rdnt == NULL)
629 goto fail0;
630 retcode = PyList_Append(dn, rdnt);
631 Py_DECREF(rdnt);
632 if (retcode < 0)
633 goto fail0;
634 }
635
636 /* convert list to tuple */
637 rdnt = PyList_AsTuple(dn);
638 Py_DECREF(dn);
639 if (rdnt == NULL)
640 return NULL;
641 return rdnt;
642
643 fail1:
644 Py_XDECREF(rdn);
645
646 fail0:
647 Py_XDECREF(dn);
648 return NULL;
649}
650
651static PyObject *
652_get_peer_alt_names (X509 *certificate) {
Guido van Rossumf06628b2007-11-21 20:01:53 +0000653
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000654 /* this code follows the procedure outlined in
655 OpenSSL's crypto/x509v3/v3_prn.c:X509v3_EXT_print()
656 function to extract the STACK_OF(GENERAL_NAME),
657 then iterates through the stack to add the
658 names. */
659
660 int i, j;
661 PyObject *peer_alt_names = Py_None;
662 PyObject *v, *t;
663 X509_EXTENSION *ext = NULL;
664 GENERAL_NAMES *names = NULL;
665 GENERAL_NAME *name;
Guido van Rossumf06628b2007-11-21 20:01:53 +0000666 X509V3_EXT_METHOD *method;
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000667 BIO *biobuf = NULL;
668 char buf[2048];
669 char *vptr;
670 int len;
Victor Stinner117ff172010-03-02 22:49:30 +0000671 /* Issue #2973: ASN1_item_d2i() API changed in OpenSSL 0.9.6m */
672#if OPENSSL_VERSION_NUMBER >= 0x009060dfL
673 const unsigned char *p;
674#else
Benjamin Petersond76c8da2009-06-28 17:35:48 +0000675 unsigned char *p;
Victor Stinner117ff172010-03-02 22:49:30 +0000676#endif
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000677
678 if (certificate == NULL)
679 return peer_alt_names;
680
681 /* get a memory buffer */
682 biobuf = BIO_new(BIO_s_mem());
683
684 i = 0;
685 while ((i = X509_get_ext_by_NID(
686 certificate, NID_subject_alt_name, i)) >= 0) {
687
688 if (peer_alt_names == Py_None) {
689 peer_alt_names = PyList_New(0);
690 if (peer_alt_names == NULL)
691 goto fail;
692 }
Guido van Rossumf06628b2007-11-21 20:01:53 +0000693
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000694 /* now decode the altName */
695 ext = X509_get_ext(certificate, i);
696 if(!(method = X509V3_EXT_get(ext))) {
Bill Janssen6e027db2007-11-15 22:23:56 +0000697 PyErr_SetString
698 (PySSLErrorObject,
699 ERRSTR("No method for internalizing subjectAltName!"));
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000700 goto fail;
701 }
702
703 p = ext->value->data;
Christian Heimes412dc9c2008-01-27 18:55:54 +0000704 if (method->it)
Bill Janssen6e027db2007-11-15 22:23:56 +0000705 names = (GENERAL_NAMES*)
706 (ASN1_item_d2i(NULL,
707 &p,
708 ext->value->length,
709 ASN1_ITEM_ptr(method->it)));
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000710 else
Bill Janssen6e027db2007-11-15 22:23:56 +0000711 names = (GENERAL_NAMES*)
712 (method->d2i(NULL,
713 &p,
714 ext->value->length));
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000715
716 for(j = 0; j < sk_GENERAL_NAME_num(names); j++) {
717
718 /* get a rendering of each name in the set of names */
719
720 name = sk_GENERAL_NAME_value(names, j);
721 if (name->type == GEN_DIRNAME) {
722
Bill Janssen6e027db2007-11-15 22:23:56 +0000723 /* we special-case DirName as a tuple of
724 tuples of attributes */
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000725
726 t = PyTuple_New(2);
727 if (t == NULL) {
728 goto fail;
729 }
730
Bill Janssen6e027db2007-11-15 22:23:56 +0000731 v = PyUnicode_FromString("DirName");
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000732 if (v == NULL) {
733 Py_DECREF(t);
734 goto fail;
735 }
736 PyTuple_SET_ITEM(t, 0, v);
737
738 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);
Guido van Rossumf06628b2007-11-21 20:01:53 +0000744
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000745 } else {
746
747 /* 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;
Bill Janssen6e027db2007-11-15 22:23:56 +0000762 v = PyUnicode_FromStringAndSize(buf, (vptr - buf));
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000763 if (v == NULL) {
764 Py_DECREF(t);
765 goto fail;
766 }
767 PyTuple_SET_ITEM(t, 0, v);
Bill Janssen6e027db2007-11-15 22:23:56 +0000768 v = PyUnicode_FromStringAndSize((vptr + 1),
769 (len - (vptr - buf + 1)));
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000770 if (v == NULL) {
771 Py_DECREF(t);
772 goto fail;
773 }
774 PyTuple_SET_ITEM(t, 1, v);
775 }
776
777 /* and add that rendering to the list */
778
779 if (PyList_Append(peer_alt_names, t) < 0) {
780 Py_DECREF(t);
781 goto fail;
782 }
783 Py_DECREF(t);
784 }
785 }
786 BIO_free(biobuf);
787 if (peer_alt_names != Py_None) {
788 v = PyList_AsTuple(peer_alt_names);
789 Py_DECREF(peer_alt_names);
790 return v;
791 } else {
792 return peer_alt_names;
793 }
Guido van Rossumf06628b2007-11-21 20:01:53 +0000794
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000795
796 fail:
797 if (biobuf != NULL)
798 BIO_free(biobuf);
799
800 if (peer_alt_names != Py_None) {
801 Py_XDECREF(peer_alt_names);
802 }
803
804 return NULL;
805}
806
807static PyObject *
808_decode_certificate (X509 *certificate, int verbose) {
809
Thomas Woutersed03b412007-08-28 21:37:11 +0000810 PyObject *retval = NULL;
811 BIO *biobuf = NULL;
812 PyObject *peer;
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000813 PyObject *peer_alt_names = NULL;
Thomas Woutersed03b412007-08-28 21:37:11 +0000814 PyObject *issuer;
815 PyObject *version;
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000816 PyObject *sn_obj;
817 ASN1_INTEGER *serialNumber;
Thomas Woutersed03b412007-08-28 21:37:11 +0000818 char buf[2048];
819 int len;
820 ASN1_TIME *notBefore, *notAfter;
821 PyObject *pnotBefore, *pnotAfter;
Thomas Woutersed03b412007-08-28 21:37:11 +0000822
823 retval = PyDict_New();
824 if (retval == NULL)
825 return NULL;
826
Thomas Wouters89d996e2007-09-08 17:39:28 +0000827 peer = _create_tuple_for_X509_NAME(
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000828 X509_get_subject_name(certificate));
Thomas Woutersed03b412007-08-28 21:37:11 +0000829 if (peer == NULL)
830 goto fail0;
831 if (PyDict_SetItemString(retval, (const char *) "subject", peer) < 0) {
832 Py_DECREF(peer);
833 goto fail0;
834 }
835 Py_DECREF(peer);
836
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000837 if (verbose) {
838 issuer = _create_tuple_for_X509_NAME(
839 X509_get_issuer_name(certificate));
840 if (issuer == NULL)
841 goto fail0;
842 if (PyDict_SetItemString(retval, (const char *)"issuer", issuer) < 0) {
843 Py_DECREF(issuer);
844 goto fail0;
845 }
Thomas Woutersed03b412007-08-28 21:37:11 +0000846 Py_DECREF(issuer);
Guido van Rossumf06628b2007-11-21 20:01:53 +0000847
Christian Heimes217cfd12007-12-02 14:31:20 +0000848 version = PyLong_FromLong(X509_get_version(certificate) + 1);
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000849 if (PyDict_SetItemString(retval, "version", version) < 0) {
850 Py_DECREF(version);
851 goto fail0;
852 }
Thomas Woutersed03b412007-08-28 21:37:11 +0000853 Py_DECREF(version);
Thomas Woutersed03b412007-08-28 21:37:11 +0000854 }
Guido van Rossumf06628b2007-11-21 20:01:53 +0000855
Thomas Woutersed03b412007-08-28 21:37:11 +0000856 /* get a memory buffer */
857 biobuf = BIO_new(BIO_s_mem());
Guido van Rossumf06628b2007-11-21 20:01:53 +0000858
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000859 if (verbose) {
Thomas Woutersed03b412007-08-28 21:37:11 +0000860
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000861 (void) BIO_reset(biobuf);
862 serialNumber = X509_get_serialNumber(certificate);
863 /* should not exceed 20 octets, 160 bits, so buf is big enough */
864 i2a_ASN1_INTEGER(biobuf, serialNumber);
865 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
866 if (len < 0) {
867 _setSSLError(NULL, 0, __FILE__, __LINE__);
868 goto fail1;
869 }
Bill Janssen6e027db2007-11-15 22:23:56 +0000870 sn_obj = PyUnicode_FromStringAndSize(buf, len);
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000871 if (sn_obj == NULL)
872 goto fail1;
873 if (PyDict_SetItemString(retval, "serialNumber", sn_obj) < 0) {
874 Py_DECREF(sn_obj);
875 goto fail1;
876 }
877 Py_DECREF(sn_obj);
878
879 (void) BIO_reset(biobuf);
880 notBefore = X509_get_notBefore(certificate);
881 ASN1_TIME_print(biobuf, notBefore);
882 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
883 if (len < 0) {
884 _setSSLError(NULL, 0, __FILE__, __LINE__);
885 goto fail1;
886 }
Bill Janssen6e027db2007-11-15 22:23:56 +0000887 pnotBefore = PyUnicode_FromStringAndSize(buf, len);
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000888 if (pnotBefore == NULL)
889 goto fail1;
890 if (PyDict_SetItemString(retval, "notBefore", pnotBefore) < 0) {
891 Py_DECREF(pnotBefore);
892 goto fail1;
893 }
Thomas Woutersed03b412007-08-28 21:37:11 +0000894 Py_DECREF(pnotBefore);
Thomas Woutersed03b412007-08-28 21:37:11 +0000895 }
Thomas Woutersed03b412007-08-28 21:37:11 +0000896
897 (void) BIO_reset(biobuf);
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000898 notAfter = X509_get_notAfter(certificate);
Thomas Woutersed03b412007-08-28 21:37:11 +0000899 ASN1_TIME_print(biobuf, notAfter);
900 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000901 if (len < 0) {
902 _setSSLError(NULL, 0, __FILE__, __LINE__);
903 goto fail1;
904 }
Bill Janssen6e027db2007-11-15 22:23:56 +0000905 pnotAfter = PyUnicode_FromStringAndSize(buf, len);
Thomas Woutersed03b412007-08-28 21:37:11 +0000906 if (pnotAfter == NULL)
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000907 goto fail1;
Thomas Woutersed03b412007-08-28 21:37:11 +0000908 if (PyDict_SetItemString(retval, "notAfter", pnotAfter) < 0) {
909 Py_DECREF(pnotAfter);
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000910 goto fail1;
Thomas Woutersed03b412007-08-28 21:37:11 +0000911 }
912 Py_DECREF(pnotAfter);
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000913
914 /* Now look for subjectAltName */
915
916 peer_alt_names = _get_peer_alt_names(certificate);
917 if (peer_alt_names == NULL)
918 goto fail1;
919 else if (peer_alt_names != Py_None) {
920 if (PyDict_SetItemString(retval, "subjectAltName",
921 peer_alt_names) < 0) {
922 Py_DECREF(peer_alt_names);
923 goto fail1;
924 }
925 Py_DECREF(peer_alt_names);
926 }
Guido van Rossumf06628b2007-11-21 20:01:53 +0000927
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000928 BIO_free(biobuf);
Thomas Woutersed03b412007-08-28 21:37:11 +0000929 return retval;
930
931 fail1:
932 if (biobuf != NULL)
933 BIO_free(biobuf);
934 fail0:
935 Py_XDECREF(retval);
936 return NULL;
937}
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000938
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000939
940static PyObject *
941PySSL_test_decode_certificate (PyObject *mod, PyObject *args) {
942
943 PyObject *retval = NULL;
944 char *filename = NULL;
945 X509 *x=NULL;
946 BIO *cert;
947 int verbose = 1;
948
Bill Janssen6e027db2007-11-15 22:23:56 +0000949 if (!PyArg_ParseTuple(args, "s|i:test_decode_certificate",
950 &filename, &verbose))
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000951 return NULL;
952
953 if ((cert=BIO_new(BIO_s_file())) == NULL) {
Bill Janssen6e027db2007-11-15 22:23:56 +0000954 PyErr_SetString(PySSLErrorObject,
955 "Can't malloc memory to read file");
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000956 goto fail0;
957 }
958
959 if (BIO_read_filename(cert,filename) <= 0) {
Bill Janssen6e027db2007-11-15 22:23:56 +0000960 PyErr_SetString(PySSLErrorObject,
961 "Can't open file");
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000962 goto fail0;
963 }
964
965 x = PEM_read_bio_X509_AUX(cert,NULL, NULL, NULL);
966 if (x == NULL) {
Bill Janssen6e027db2007-11-15 22:23:56 +0000967 PyErr_SetString(PySSLErrorObject,
968 "Error decoding PEM-encoded file");
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000969 goto fail0;
970 }
971
972 retval = _decode_certificate(x, verbose);
973
974 fail0:
Guido van Rossumf06628b2007-11-21 20:01:53 +0000975
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000976 if (cert != NULL) BIO_free(cert);
977 return retval;
978}
979
980
981static PyObject *
982PySSL_peercert(PySSLObject *self, PyObject *args)
983{
984 PyObject *retval = NULL;
985 int len;
986 int verification;
987 PyObject *binary_mode = Py_None;
988
989 if (!PyArg_ParseTuple(args, "|O:peer_certificate", &binary_mode))
990 return NULL;
991
992 if (!self->peer_cert)
993 Py_RETURN_NONE;
994
995 if (PyObject_IsTrue(binary_mode)) {
996 /* return cert in DER-encoded format */
997
998 unsigned char *bytes_buf = NULL;
999
1000 bytes_buf = NULL;
1001 len = i2d_X509(self->peer_cert, &bytes_buf);
1002 if (len < 0) {
1003 PySSL_SetError(self, len, __FILE__, __LINE__);
1004 return NULL;
1005 }
Bill Janssen6e027db2007-11-15 22:23:56 +00001006 /* this is actually an immutable bytes sequence */
Christian Heimes72b710a2008-05-26 13:28:38 +00001007 retval = PyBytes_FromStringAndSize
Bill Janssen6e027db2007-11-15 22:23:56 +00001008 ((const char *) bytes_buf, len);
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001009 OPENSSL_free(bytes_buf);
1010 return retval;
1011
1012 } else {
1013
1014 verification = SSL_CTX_get_verify_mode(self->ctx);
1015 if ((verification & SSL_VERIFY_PEER) == 0)
1016 return PyDict_New();
1017 else
1018 return _decode_certificate (self->peer_cert, 0);
1019 }
1020}
1021
1022PyDoc_STRVAR(PySSL_peercert_doc,
1023"peer_certificate([der=False]) -> certificate\n\
1024\n\
1025Returns the certificate for the peer. If no certificate was provided,\n\
1026returns None. If a certificate was provided, but not validated, returns\n\
1027an empty dictionary. Otherwise returns a dict containing information\n\
1028about the peer certificate.\n\
1029\n\
1030If the optional argument is True, returns a DER-encoded copy of the\n\
1031peer certificate, or None if no certificate was provided. This will\n\
1032return the certificate even if it wasn't validated.");
1033
1034static PyObject *PySSL_cipher (PySSLObject *self) {
1035
1036 PyObject *retval, *v;
1037 SSL_CIPHER *current;
1038 char *cipher_name;
1039 char *cipher_protocol;
1040
1041 if (self->ssl == NULL)
1042 return Py_None;
1043 current = SSL_get_current_cipher(self->ssl);
1044 if (current == NULL)
1045 return Py_None;
1046
1047 retval = PyTuple_New(3);
1048 if (retval == NULL)
1049 return NULL;
1050
1051 cipher_name = (char *) SSL_CIPHER_get_name(current);
1052 if (cipher_name == NULL) {
1053 PyTuple_SET_ITEM(retval, 0, Py_None);
1054 } else {
Bill Janssen6e027db2007-11-15 22:23:56 +00001055 v = PyUnicode_FromString(cipher_name);
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001056 if (v == NULL)
1057 goto fail0;
1058 PyTuple_SET_ITEM(retval, 0, v);
1059 }
1060 cipher_protocol = SSL_CIPHER_get_version(current);
1061 if (cipher_protocol == NULL) {
1062 PyTuple_SET_ITEM(retval, 1, Py_None);
1063 } else {
Bill Janssen6e027db2007-11-15 22:23:56 +00001064 v = PyUnicode_FromString(cipher_protocol);
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001065 if (v == NULL)
1066 goto fail0;
1067 PyTuple_SET_ITEM(retval, 1, v);
1068 }
Christian Heimes217cfd12007-12-02 14:31:20 +00001069 v = PyLong_FromLong(SSL_CIPHER_get_bits(current, NULL));
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001070 if (v == NULL)
1071 goto fail0;
1072 PyTuple_SET_ITEM(retval, 2, v);
1073 return retval;
Guido van Rossumf06628b2007-11-21 20:01:53 +00001074
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001075 fail0:
1076 Py_DECREF(retval);
1077 return NULL;
1078}
1079
Guido van Rossume6650f92007-12-06 19:05:55 +00001080static void PySSL_dealloc(PySSLObject *self)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001081{
Thomas Woutersed03b412007-08-28 21:37:11 +00001082 if (self->peer_cert) /* Possible not to have one? */
Guido van Rossume6650f92007-12-06 19:05:55 +00001083 X509_free (self->peer_cert);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001084 if (self->ssl)
Thomas Woutersed03b412007-08-28 21:37:11 +00001085 SSL_free(self->ssl);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001086 if (self->ctx)
Thomas Woutersed03b412007-08-28 21:37:11 +00001087 SSL_CTX_free(self->ctx);
Guido van Rossume6650f92007-12-06 19:05:55 +00001088 Py_XDECREF(self->Socket);
1089 PyObject_Del(self);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001090}
1091
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001092/* If the socket has a timeout, do a select()/poll() on the socket.
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001093 The argument writing indicates the direction.
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001094 Returns one of the possibilities in the timeout_state enum (above).
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001095 */
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001096
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001097static int
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001098check_socket_and_wait_for_timeout(PySocketSockObject *s, int writing)
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001099{
1100 fd_set fds;
1101 struct timeval tv;
1102 int rc;
1103
1104 /* Nothing to do unless we're in timeout mode (not non-blocking) */
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001105 if (s->sock_timeout < 0.0)
1106 return SOCKET_IS_BLOCKING;
1107 else if (s->sock_timeout == 0.0)
1108 return SOCKET_IS_NONBLOCKING;
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001109
1110 /* Guard against closed socket */
1111 if (s->sock_fd < 0)
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001112 return SOCKET_HAS_BEEN_CLOSED;
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001113
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001114 /* Prefer poll, if available, since you can poll() any fd
1115 * which can't be done with select(). */
1116#ifdef HAVE_POLL
1117 {
1118 struct pollfd pollfd;
1119 int timeout;
1120
1121 pollfd.fd = s->sock_fd;
1122 pollfd.events = writing ? POLLOUT : POLLIN;
1123
1124 /* s->sock_timeout is in seconds, timeout in ms */
1125 timeout = (int)(s->sock_timeout * 1000 + 0.5);
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001126 PySSL_BEGIN_ALLOW_THREADS
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001127 rc = poll(&pollfd, 1, timeout);
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001128 PySSL_END_ALLOW_THREADS
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001129
1130 goto normal_return;
1131 }
1132#endif
1133
Neal Norwitz082b2df2006-02-07 07:04:46 +00001134 /* Guard against socket too large for select*/
Martin v. Löwisf84d1b92006-02-11 09:27:05 +00001135#ifndef Py_SOCKET_FD_CAN_BE_GE_FD_SETSIZE
Neal Norwitz082b2df2006-02-07 07:04:46 +00001136 if (s->sock_fd >= FD_SETSIZE)
Neal Norwitz389cea82006-02-13 00:35:21 +00001137 return SOCKET_TOO_LARGE_FOR_SELECT;
Martin v. Löwisf84d1b92006-02-11 09:27:05 +00001138#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +00001139
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001140 /* Construct the arguments to select */
1141 tv.tv_sec = (int)s->sock_timeout;
1142 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
1143 FD_ZERO(&fds);
1144 FD_SET(s->sock_fd, &fds);
1145
1146 /* See if the socket is ready */
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001147 PySSL_BEGIN_ALLOW_THREADS
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001148 if (writing)
1149 rc = select(s->sock_fd+1, NULL, &fds, NULL, &tv);
1150 else
1151 rc = select(s->sock_fd+1, &fds, NULL, NULL, &tv);
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001152 PySSL_END_ALLOW_THREADS
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001153
Bill Janssen6e027db2007-11-15 22:23:56 +00001154#ifdef HAVE_POLL
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001155normal_return:
Bill Janssen6e027db2007-11-15 22:23:56 +00001156#endif
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001157 /* Return SOCKET_TIMED_OUT on timeout, SOCKET_OPERATION_OK otherwise
1158 (when we are able to write or when there's something to read) */
1159 return rc == 0 ? SOCKET_HAS_TIMED_OUT : SOCKET_OPERATION_OK;
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001160}
1161
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001162static PyObject *PySSL_SSLwrite(PySSLObject *self, PyObject *args)
1163{
1164 char *data;
1165 int len;
Martin v. Löwis405a7952003-10-27 14:24:37 +00001166 int count;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001167 int sockstate;
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001168 int err;
Bill Janssen6e027db2007-11-15 22:23:56 +00001169 int nonblocking;
Bill Janssen54cc54c2007-12-14 22:08:56 +00001170 PySocketSockObject *sock
1171 = (PySocketSockObject *) PyWeakref_GetObject(self->Socket);
1172
1173 if (((PyObject*)sock) == Py_None) {
1174 _setSSLError("Underlying socket connection gone",
1175 PY_SSL_ERROR_NO_SOCKET, __FILE__, __LINE__);
1176 return NULL;
1177 }
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001178
Bill Janssen6e027db2007-11-15 22:23:56 +00001179 if (!PyArg_ParseTuple(args, "y#:write", &data, &count))
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001180 return NULL;
1181
Bill Janssen6e027db2007-11-15 22:23:56 +00001182 /* just in case the blocking state of the socket has been changed */
Bill Janssen54cc54c2007-12-14 22:08:56 +00001183 nonblocking = (sock->sock_timeout >= 0.0);
Bill Janssen6e027db2007-11-15 22:23:56 +00001184 BIO_set_nbio(SSL_get_rbio(self->ssl), nonblocking);
1185 BIO_set_nbio(SSL_get_wbio(self->ssl), nonblocking);
1186
Bill Janssen54cc54c2007-12-14 22:08:56 +00001187 sockstate = check_socket_and_wait_for_timeout(sock, 1);
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001188 if (sockstate == SOCKET_HAS_TIMED_OUT) {
Thomas Woutersed03b412007-08-28 21:37:11 +00001189 PyErr_SetString(PySSLErrorObject,
1190 "The write operation timed out");
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001191 return NULL;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001192 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
Thomas Woutersed03b412007-08-28 21:37:11 +00001193 PyErr_SetString(PySSLErrorObject,
1194 "Underlying socket has been closed.");
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001195 return NULL;
Neal Norwitz389cea82006-02-13 00:35:21 +00001196 } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
Thomas Woutersed03b412007-08-28 21:37:11 +00001197 PyErr_SetString(PySSLErrorObject,
1198 "Underlying socket too large for select().");
Neal Norwitz082b2df2006-02-07 07:04:46 +00001199 return NULL;
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001200 }
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001201 do {
1202 err = 0;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001203 PySSL_BEGIN_ALLOW_THREADS
Martin v. Löwis405a7952003-10-27 14:24:37 +00001204 len = SSL_write(self->ssl, data, count);
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001205 err = SSL_get_error(self->ssl, len);
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001206 PySSL_END_ALLOW_THREADS
Martin v. Löwisafec8e32003-06-28 07:40:23 +00001207 if(PyErr_CheckSignals()) {
1208 return NULL;
1209 }
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001210 if (err == SSL_ERROR_WANT_READ) {
Thomas Woutersed03b412007-08-28 21:37:11 +00001211 sockstate =
Bill Janssen54cc54c2007-12-14 22:08:56 +00001212 check_socket_and_wait_for_timeout(sock, 0);
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001213 } else if (err == SSL_ERROR_WANT_WRITE) {
Thomas Woutersed03b412007-08-28 21:37:11 +00001214 sockstate =
Bill Janssen54cc54c2007-12-14 22:08:56 +00001215 check_socket_and_wait_for_timeout(sock, 1);
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001216 } else {
1217 sockstate = SOCKET_OPERATION_OK;
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001218 }
Thomas Woutersed03b412007-08-28 21:37:11 +00001219 if (sockstate == SOCKET_HAS_TIMED_OUT) {
1220 PyErr_SetString(PySSLErrorObject,
1221 "The write operation timed out");
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001222 return NULL;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001223 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
Thomas Woutersed03b412007-08-28 21:37:11 +00001224 PyErr_SetString(PySSLErrorObject,
1225 "Underlying socket has been closed.");
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001226 return NULL;
1227 } else if (sockstate == SOCKET_IS_NONBLOCKING) {
1228 break;
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001229 }
1230 } while (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001231 if (len > 0)
Christian Heimes217cfd12007-12-02 14:31:20 +00001232 return PyLong_FromLong(len);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001233 else
Thomas Woutersed03b412007-08-28 21:37:11 +00001234 return PySSL_SetError(self, len, __FILE__, __LINE__);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001235}
1236
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001237PyDoc_STRVAR(PySSL_SSLwrite_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001238"write(s) -> len\n\
1239\n\
1240Writes the string s into the SSL object. Returns the number\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001241of bytes written.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001242
Bill Janssen6e027db2007-11-15 22:23:56 +00001243static PyObject *PySSL_SSLpending(PySSLObject *self)
1244{
1245 int count = 0;
1246
1247 PySSL_BEGIN_ALLOW_THREADS
1248 count = SSL_pending(self->ssl);
1249 PySSL_END_ALLOW_THREADS
1250 if (count < 0)
1251 return PySSL_SetError(self, count, __FILE__, __LINE__);
1252 else
Christian Heimes217cfd12007-12-02 14:31:20 +00001253 return PyLong_FromLong(count);
Bill Janssen6e027db2007-11-15 22:23:56 +00001254}
1255
1256PyDoc_STRVAR(PySSL_SSLpending_doc,
1257"pending() -> count\n\
1258\n\
1259Returns the number of already decrypted bytes available for read,\n\
1260pending on the connection.\n");
1261
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001262static PyObject *PySSL_SSLread(PySSLObject *self, PyObject *args)
1263{
Benjamin Peterson56420b42009-02-28 19:06:54 +00001264 PyObject *dest = NULL;
1265 Py_buffer buf;
Bill Janssen6e027db2007-11-15 22:23:56 +00001266 int buf_passed = 0;
1267 int count = -1;
Benjamin Peterson56420b42009-02-28 19:06:54 +00001268 char *mem;
1269 /* XXX this should use Py_ssize_t */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001270 int len = 1024;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001271 int sockstate;
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001272 int err;
Bill Janssen6e027db2007-11-15 22:23:56 +00001273 int nonblocking;
Bill Janssen54cc54c2007-12-14 22:08:56 +00001274 PySocketSockObject *sock
1275 = (PySocketSockObject *) PyWeakref_GetObject(self->Socket);
1276
1277 if (((PyObject*)sock) == Py_None) {
1278 _setSSLError("Underlying socket connection gone",
1279 PY_SSL_ERROR_NO_SOCKET, __FILE__, __LINE__);
1280 return NULL;
1281 }
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001282
Benjamin Peterson56420b42009-02-28 19:06:54 +00001283 if (!PyArg_ParseTuple(args, "|Oi:read", &dest, &count))
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001284 return NULL;
Benjamin Peterson56420b42009-02-28 19:06:54 +00001285 if ((dest == NULL) || (dest == Py_None)) {
1286 if (!(dest = PyByteArray_FromStringAndSize((char *) 0, len)))
Bill Janssen6e027db2007-11-15 22:23:56 +00001287 return NULL;
Benjamin Peterson56420b42009-02-28 19:06:54 +00001288 mem = PyByteArray_AS_STRING(dest);
1289 } else if (PyLong_Check(dest)) {
1290 len = PyLong_AS_LONG(dest);
1291 if (!(dest = PyByteArray_FromStringAndSize((char *) 0, len)))
Bill Janssen6e027db2007-11-15 22:23:56 +00001292 return NULL;
Benjamin Peterson56420b42009-02-28 19:06:54 +00001293 mem = PyByteArray_AS_STRING(dest);
Bill Janssen6e027db2007-11-15 22:23:56 +00001294 } else {
Benjamin Peterson56420b42009-02-28 19:06:54 +00001295 if (PyObject_GetBuffer(dest, &buf, PyBUF_CONTIG) < 0)
Bill Janssen6e027db2007-11-15 22:23:56 +00001296 return NULL;
Benjamin Peterson56420b42009-02-28 19:06:54 +00001297 mem = buf.buf;
1298 len = buf.len;
Bill Janssen6e027db2007-11-15 22:23:56 +00001299 if ((count > 0) && (count <= len))
1300 len = count;
1301 buf_passed = 1;
1302 }
1303
1304 /* just in case the blocking state of the socket has been changed */
Bill Janssen54cc54c2007-12-14 22:08:56 +00001305 nonblocking = (sock->sock_timeout >= 0.0);
Bill Janssen6e027db2007-11-15 22:23:56 +00001306 BIO_set_nbio(SSL_get_rbio(self->ssl), nonblocking);
1307 BIO_set_nbio(SSL_get_wbio(self->ssl), nonblocking);
Thomas Woutersed03b412007-08-28 21:37:11 +00001308
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001309 /* first check if there are bytes ready to be read */
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001310 PySSL_BEGIN_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001311 count = SSL_pending(self->ssl);
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001312 PySSL_END_ALLOW_THREADS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001313
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001314 if (!count) {
Bill Janssen54cc54c2007-12-14 22:08:56 +00001315 sockstate = check_socket_and_wait_for_timeout(sock, 0);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001316 if (sockstate == SOCKET_HAS_TIMED_OUT) {
Thomas Woutersed03b412007-08-28 21:37:11 +00001317 PyErr_SetString(PySSLErrorObject,
1318 "The read operation timed out");
Benjamin Peterson56420b42009-02-28 19:06:54 +00001319 goto error;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001320 } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
Thomas Woutersed03b412007-08-28 21:37:11 +00001321 PyErr_SetString(PySSLErrorObject,
1322 "Underlying socket too large for select().");
Benjamin Peterson56420b42009-02-28 19:06:54 +00001323 goto error;
Thomas Woutersed03b412007-08-28 21:37:11 +00001324 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
Guido van Rossumf06628b2007-11-21 20:01:53 +00001325 count = 0;
1326 goto done;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001327 }
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001328 }
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001329 do {
1330 err = 0;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001331 PySSL_BEGIN_ALLOW_THREADS
Benjamin Peterson56420b42009-02-28 19:06:54 +00001332 count = SSL_read(self->ssl, mem, len);
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001333 err = SSL_get_error(self->ssl, count);
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001334 PySSL_END_ALLOW_THREADS
Benjamin Peterson56420b42009-02-28 19:06:54 +00001335 if (PyErr_CheckSignals())
1336 goto error;
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001337 if (err == SSL_ERROR_WANT_READ) {
Thomas Woutersed03b412007-08-28 21:37:11 +00001338 sockstate =
Bill Janssen54cc54c2007-12-14 22:08:56 +00001339 check_socket_and_wait_for_timeout(sock, 0);
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001340 } else if (err == SSL_ERROR_WANT_WRITE) {
Thomas Woutersed03b412007-08-28 21:37:11 +00001341 sockstate =
Bill Janssen54cc54c2007-12-14 22:08:56 +00001342 check_socket_and_wait_for_timeout(sock, 1);
Thomas Woutersed03b412007-08-28 21:37:11 +00001343 } else if ((err == SSL_ERROR_ZERO_RETURN) &&
1344 (SSL_get_shutdown(self->ssl) ==
1345 SSL_RECEIVED_SHUTDOWN))
1346 {
Guido van Rossumf06628b2007-11-21 20:01:53 +00001347 count = 0;
1348 goto done;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001349 } else {
1350 sockstate = SOCKET_OPERATION_OK;
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001351 }
Thomas Woutersed03b412007-08-28 21:37:11 +00001352 if (sockstate == SOCKET_HAS_TIMED_OUT) {
1353 PyErr_SetString(PySSLErrorObject,
1354 "The read operation timed out");
Benjamin Peterson56420b42009-02-28 19:06:54 +00001355 goto error;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001356 } else if (sockstate == SOCKET_IS_NONBLOCKING) {
1357 break;
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001358 }
1359 } while (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE);
Thomas Woutersed03b412007-08-28 21:37:11 +00001360 if (count <= 0) {
Benjamin Peterson56420b42009-02-28 19:06:54 +00001361 PySSL_SetError(self, count, __FILE__, __LINE__);
1362 goto error;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001363 }
Guido van Rossumf06628b2007-11-21 20:01:53 +00001364 done:
Bill Janssen6e027db2007-11-15 22:23:56 +00001365 if (!buf_passed) {
Benjamin Peterson56420b42009-02-28 19:06:54 +00001366 PyObject *res = PyBytes_FromStringAndSize(mem, count);
1367 Py_DECREF(dest);
Guido van Rossumf06628b2007-11-21 20:01:53 +00001368 return res;
Bill Janssen6e027db2007-11-15 22:23:56 +00001369 } else {
Benjamin Peterson56420b42009-02-28 19:06:54 +00001370 PyBuffer_Release(&buf);
Christian Heimes217cfd12007-12-02 14:31:20 +00001371 return PyLong_FromLong(count);
Bill Janssen6e027db2007-11-15 22:23:56 +00001372 }
Benjamin Peterson56420b42009-02-28 19:06:54 +00001373 error:
1374 if (!buf_passed) {
1375 Py_DECREF(dest);
1376 } else {
1377 PyBuffer_Release(&buf);
1378 }
1379 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001380}
1381
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001382PyDoc_STRVAR(PySSL_SSLread_doc,
Bill Janssen6e027db2007-11-15 22:23:56 +00001383"read([len]) -> string\n\
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001384\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001385Read up to len bytes from the SSL socket.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001386
Bill Janssen40a0f662008-08-12 16:56:25 +00001387static PyObject *PySSL_SSLshutdown(PySSLObject *self)
1388{
Antoine Pitrou5a1c4d12010-04-23 21:11:10 +00001389 int err, ssl_err, sockstate, nonblocking;
1390 int zeros = 0;
Bill Janssen40a0f662008-08-12 16:56:25 +00001391 PySocketSockObject *sock
1392 = (PySocketSockObject *) PyWeakref_GetObject(self->Socket);
1393
1394 /* Guard against closed socket */
1395 if ((((PyObject*)sock) == Py_None) || (sock->sock_fd < 0)) {
1396 _setSSLError("Underlying socket connection gone",
1397 PY_SSL_ERROR_NO_SOCKET, __FILE__, __LINE__);
1398 return NULL;
1399 }
1400
Antoine Pitrou5a1c4d12010-04-23 21:11:10 +00001401 /* Just in case the blocking state of the socket has been changed */
1402 nonblocking = (sock->sock_timeout >= 0.0);
1403 BIO_set_nbio(SSL_get_rbio(self->ssl), nonblocking);
1404 BIO_set_nbio(SSL_get_wbio(self->ssl), nonblocking);
1405
1406 while (1) {
1407 PySSL_BEGIN_ALLOW_THREADS
1408 /* Disable read-ahead so that unwrap can work correctly.
1409 * Otherwise OpenSSL might read in too much data,
1410 * eating clear text data that happens to be
1411 * transmitted after the SSL shutdown.
1412 * Should be safe to call repeatedly everytime this
1413 * function is used and the shutdown_seen_zero != 0
1414 * condition is met.
1415 */
1416 if (self->shutdown_seen_zero)
1417 SSL_set_read_ahead(self->ssl, 0);
Bill Janssen40a0f662008-08-12 16:56:25 +00001418 err = SSL_shutdown(self->ssl);
Antoine Pitrou5a1c4d12010-04-23 21:11:10 +00001419 PySSL_END_ALLOW_THREADS
1420 /* If err == 1, a secure shutdown with SSL_shutdown() is complete */
1421 if (err > 0)
1422 break;
1423 if (err == 0) {
1424 /* Don't loop endlessly; instead preserve legacy
1425 behaviour of trying SSL_shutdown() only twice.
1426 This looks necessary for OpenSSL < 0.9.8m */
1427 if (++zeros > 1)
1428 break;
1429 /* Shutdown was sent, now try receiving */
1430 self->shutdown_seen_zero = 1;
1431 continue;
1432 }
1433
1434 /* Possibly retry shutdown until timeout or failure */
1435 ssl_err = SSL_get_error(self->ssl, err);
1436 if (ssl_err == SSL_ERROR_WANT_READ)
1437 sockstate = check_socket_and_wait_for_timeout(sock, 0);
1438 else if (ssl_err == SSL_ERROR_WANT_WRITE)
1439 sockstate = check_socket_and_wait_for_timeout(sock, 1);
1440 else
1441 break;
1442 if (sockstate == SOCKET_HAS_TIMED_OUT) {
1443 if (ssl_err == SSL_ERROR_WANT_READ)
1444 PyErr_SetString(PySSLErrorObject,
1445 "The read operation timed out");
1446 else
1447 PyErr_SetString(PySSLErrorObject,
1448 "The write operation timed out");
1449 return NULL;
1450 }
1451 else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
1452 PyErr_SetString(PySSLErrorObject,
1453 "Underlying socket too large for select().");
1454 return NULL;
1455 }
1456 else if (sockstate != SOCKET_OPERATION_OK)
1457 /* Retain the SSL error code */
1458 break;
Bill Janssen40a0f662008-08-12 16:56:25 +00001459 }
Bill Janssen40a0f662008-08-12 16:56:25 +00001460
1461 if (err < 0)
1462 return PySSL_SetError(self, err, __FILE__, __LINE__);
1463 else {
1464 Py_INCREF(sock);
1465 return (PyObject *) sock;
1466 }
1467}
1468
1469PyDoc_STRVAR(PySSL_SSLshutdown_doc,
1470"shutdown(s) -> socket\n\
1471\n\
1472Does the SSL shutdown handshake with the remote end, and returns\n\
1473the underlying socket object.");
1474
1475
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001476static PyMethodDef PySSLMethods[] = {
Bill Janssen6e027db2007-11-15 22:23:56 +00001477 {"do_handshake", (PyCFunction)PySSL_SSLdo_handshake, METH_NOARGS},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001478 {"write", (PyCFunction)PySSL_SSLwrite, METH_VARARGS,
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001479 PySSL_SSLwrite_doc},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001480 {"read", (PyCFunction)PySSL_SSLread, METH_VARARGS,
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001481 PySSL_SSLread_doc},
Bill Janssen6e027db2007-11-15 22:23:56 +00001482 {"pending", (PyCFunction)PySSL_SSLpending, METH_NOARGS,
1483 PySSL_SSLpending_doc},
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001484 {"peer_certificate", (PyCFunction)PySSL_peercert, METH_VARARGS,
1485 PySSL_peercert_doc},
1486 {"cipher", (PyCFunction)PySSL_cipher, METH_NOARGS},
Bill Janssen40a0f662008-08-12 16:56:25 +00001487 {"shutdown", (PyCFunction)PySSL_SSLshutdown, METH_NOARGS,
1488 PySSL_SSLshutdown_doc},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001489 {NULL, NULL}
1490};
1491
Jeremy Hylton938ace62002-07-17 16:30:39 +00001492static PyTypeObject PySSL_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001493 PyVarObject_HEAD_INIT(NULL, 0)
Guido van Rossume6650f92007-12-06 19:05:55 +00001494 "ssl.SSLContext", /*tp_name*/
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001495 sizeof(PySSLObject), /*tp_basicsize*/
1496 0, /*tp_itemsize*/
1497 /* methods */
1498 (destructor)PySSL_dealloc, /*tp_dealloc*/
1499 0, /*tp_print*/
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +00001500 0, /*tp_getattr*/
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001501 0, /*tp_setattr*/
Mark Dickinsone94c6792009-02-02 20:36:42 +00001502 0, /*tp_reserved*/
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001503 0, /*tp_repr*/
1504 0, /*tp_as_number*/
1505 0, /*tp_as_sequence*/
1506 0, /*tp_as_mapping*/
1507 0, /*tp_hash*/
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +00001508 0, /*tp_call*/
1509 0, /*tp_str*/
1510 0, /*tp_getattro*/
1511 0, /*tp_setattro*/
1512 0, /*tp_as_buffer*/
1513 Py_TPFLAGS_DEFAULT, /*tp_flags*/
1514 0, /*tp_doc*/
1515 0, /*tp_traverse*/
1516 0, /*tp_clear*/
1517 0, /*tp_richcompare*/
1518 0, /*tp_weaklistoffset*/
1519 0, /*tp_iter*/
1520 0, /*tp_iternext*/
1521 PySSLMethods, /*tp_methods*/
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001522};
1523
1524#ifdef HAVE_OPENSSL_RAND
1525
1526/* helper routines for seeding the SSL PRNG */
1527static PyObject *
1528PySSL_RAND_add(PyObject *self, PyObject *args)
1529{
1530 char *buf;
1531 int len;
1532 double entropy;
1533
1534 if (!PyArg_ParseTuple(args, "s#d:RAND_add", &buf, &len, &entropy))
1535 return NULL;
1536 RAND_add(buf, len, entropy);
1537 Py_INCREF(Py_None);
1538 return Py_None;
1539}
1540
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001541PyDoc_STRVAR(PySSL_RAND_add_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001542"RAND_add(string, entropy)\n\
1543\n\
1544Mix string into the OpenSSL PRNG state. entropy (a float) is a lower\n\
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001545bound on the entropy contained in string. See RFC 1750.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001546
1547static PyObject *
1548PySSL_RAND_status(PyObject *self)
1549{
Christian Heimes217cfd12007-12-02 14:31:20 +00001550 return PyLong_FromLong(RAND_status());
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001551}
1552
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001553PyDoc_STRVAR(PySSL_RAND_status_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001554"RAND_status() -> 0 or 1\n\
1555\n\
Bill Janssen6e027db2007-11-15 22:23:56 +00001556Returns 1 if the OpenSSL PRNG has been seeded with enough data and 0 if not.\n\
1557It is necessary to seed the PRNG with RAND_add() on some platforms before\n\
1558using the ssl() function.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001559
1560static PyObject *
1561PySSL_RAND_egd(PyObject *self, PyObject *arg)
1562{
1563 int bytes;
1564
Bill Janssen6e027db2007-11-15 22:23:56 +00001565 if (!PyUnicode_Check(arg))
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001566 return PyErr_Format(PyExc_TypeError,
1567 "RAND_egd() expected string, found %s",
Christian Heimes90aa7642007-12-19 02:45:37 +00001568 Py_TYPE(arg)->tp_name);
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00001569 bytes = RAND_egd(_PyUnicode_AsString(arg));
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001570 if (bytes == -1) {
1571 PyErr_SetString(PySSLErrorObject,
1572 "EGD connection failed or EGD did not return "
1573 "enough data to seed the PRNG");
1574 return NULL;
1575 }
Christian Heimes217cfd12007-12-02 14:31:20 +00001576 return PyLong_FromLong(bytes);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001577}
1578
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001579PyDoc_STRVAR(PySSL_RAND_egd_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001580"RAND_egd(path) -> bytes\n\
1581\n\
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001582Queries the entropy gather daemon (EGD) on the socket named by 'path'.\n\
1583Returns number of bytes read. Raises SSLError if connection to EGD\n\
1584fails or if it does provide enough data to seed PRNG.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001585
1586#endif
1587
Bill Janssen40a0f662008-08-12 16:56:25 +00001588
1589
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001590/* List of functions exported by this module. */
1591
1592static PyMethodDef PySSL_methods[] = {
Thomas Woutersed03b412007-08-28 21:37:11 +00001593 {"sslwrap", PySSL_sslwrap,
1594 METH_VARARGS, ssl_doc},
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001595 {"_test_decode_cert", PySSL_test_decode_certificate,
1596 METH_VARARGS},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001597#ifdef HAVE_OPENSSL_RAND
Thomas Woutersed03b412007-08-28 21:37:11 +00001598 {"RAND_add", PySSL_RAND_add, METH_VARARGS,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001599 PySSL_RAND_add_doc},
1600 {"RAND_egd", PySSL_RAND_egd, METH_O,
1601 PySSL_RAND_egd_doc},
1602 {"RAND_status", (PyCFunction)PySSL_RAND_status, METH_NOARGS,
1603 PySSL_RAND_status_doc},
1604#endif
Thomas Woutersed03b412007-08-28 21:37:11 +00001605 {NULL, NULL} /* Sentinel */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001606};
1607
1608
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001609#ifdef WITH_THREAD
1610
1611/* an implementation of OpenSSL threading operations in terms
1612 of the Python C thread library */
1613
1614static PyThread_type_lock *_ssl_locks = NULL;
1615
1616static unsigned long _ssl_thread_id_function (void) {
1617 return PyThread_get_thread_ident();
1618}
1619
Bill Janssen6e027db2007-11-15 22:23:56 +00001620static void _ssl_thread_locking_function
1621 (int mode, int n, const char *file, int line) {
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001622 /* this function is needed to perform locking on shared data
1623 structures. (Note that OpenSSL uses a number of global data
Bill Janssen6e027db2007-11-15 22:23:56 +00001624 structures that will be implicitly shared whenever multiple
1625 threads use OpenSSL.) Multi-threaded applications will
1626 crash at random if it is not set.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001627
Bill Janssen6e027db2007-11-15 22:23:56 +00001628 locking_function() must be able to handle up to
1629 CRYPTO_num_locks() different mutex locks. It sets the n-th
1630 lock if mode & CRYPTO_LOCK, and releases it otherwise.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001631
1632 file and line are the file number of the function setting the
1633 lock. They can be useful for debugging.
1634 */
1635
1636 if ((_ssl_locks == NULL) ||
Christian Heimesba4af492008-03-28 00:55:15 +00001637 (n < 0) || ((unsigned)n >= _ssl_locks_count))
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001638 return;
1639
1640 if (mode & CRYPTO_LOCK) {
1641 PyThread_acquire_lock(_ssl_locks[n], 1);
1642 } else {
1643 PyThread_release_lock(_ssl_locks[n]);
1644 }
1645}
1646
1647static int _setup_ssl_threads(void) {
1648
Christian Heimesba4af492008-03-28 00:55:15 +00001649 unsigned int i;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001650
1651 if (_ssl_locks == NULL) {
1652 _ssl_locks_count = CRYPTO_num_locks();
1653 _ssl_locks = (PyThread_type_lock *)
1654 malloc(sizeof(PyThread_type_lock) * _ssl_locks_count);
1655 if (_ssl_locks == NULL)
1656 return 0;
Bill Janssen6e027db2007-11-15 22:23:56 +00001657 memset(_ssl_locks, 0,
1658 sizeof(PyThread_type_lock) * _ssl_locks_count);
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001659 for (i = 0; i < _ssl_locks_count; i++) {
1660 _ssl_locks[i] = PyThread_allocate_lock();
1661 if (_ssl_locks[i] == NULL) {
Raymond Hettinger26dd7602009-01-26 16:53:29 +00001662 unsigned int j;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001663 for (j = 0; j < i; j++) {
1664 PyThread_free_lock(_ssl_locks[j]);
1665 }
1666 free(_ssl_locks);
1667 return 0;
1668 }
1669 }
1670 CRYPTO_set_locking_callback(_ssl_thread_locking_function);
1671 CRYPTO_set_id_callback(_ssl_thread_id_function);
1672 }
1673 return 1;
1674}
1675
1676#endif /* def HAVE_THREAD */
1677
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001678PyDoc_STRVAR(module_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001679"Implementation module for SSL socket operations. See the socket module\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001680for documentation.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001681
Martin v. Löwis1a214512008-06-11 05:26:20 +00001682
1683static struct PyModuleDef _sslmodule = {
1684 PyModuleDef_HEAD_INIT,
1685 "_ssl",
1686 module_doc,
1687 -1,
1688 PySSL_methods,
1689 NULL,
1690 NULL,
1691 NULL,
1692 NULL
1693};
1694
Mark Hammondfe51c6d2002-08-02 02:27:13 +00001695PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00001696PyInit__ssl(void)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001697{
1698 PyObject *m, *d;
Benjamin Petersonb173f782009-05-05 22:31:58 +00001699 PySocketModule_APIObject *socket_api;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001700
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +00001701 if (PyType_Ready(&PySSL_Type) < 0)
1702 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001703
Martin v. Löwis1a214512008-06-11 05:26:20 +00001704 m = PyModule_Create(&_sslmodule);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00001705 if (m == NULL)
Martin v. Löwis1a214512008-06-11 05:26:20 +00001706 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001707 d = PyModule_GetDict(m);
1708
1709 /* Load _socket module and its C API */
Benjamin Petersonb173f782009-05-05 22:31:58 +00001710 socket_api = PySocketModule_ImportModuleAndAPI();
1711 if (!socket_api)
Martin v. Löwis1a214512008-06-11 05:26:20 +00001712 return NULL;
Benjamin Petersonb173f782009-05-05 22:31:58 +00001713 PySocketModule = *socket_api;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001714
1715 /* Init OpenSSL */
1716 SSL_load_error_strings();
Antoine Pitrouda6902c2010-04-21 19:52:52 +00001717 SSL_library_init();
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001718#ifdef WITH_THREAD
1719 /* note that this will start threading if not already started */
1720 if (!_setup_ssl_threads()) {
Martin v. Löwis1a214512008-06-11 05:26:20 +00001721 return NULL;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001722 }
1723#endif
Antoine Pitrouda6902c2010-04-21 19:52:52 +00001724 OpenSSL_add_all_algorithms();
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001725
1726 /* Add symbols to module dict */
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001727 PySSLErrorObject = PyErr_NewException("ssl.SSLError",
Thomas Woutersed03b412007-08-28 21:37:11 +00001728 PySocketModule.error,
1729 NULL);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001730 if (PySSLErrorObject == NULL)
Martin v. Löwis1a214512008-06-11 05:26:20 +00001731 return NULL;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001732 if (PyDict_SetItemString(d, "SSLError", PySSLErrorObject) != 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00001733 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001734 if (PyDict_SetItemString(d, "SSLType",
1735 (PyObject *)&PySSL_Type) != 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00001736 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001737 PyModule_AddIntConstant(m, "SSL_ERROR_ZERO_RETURN",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001738 PY_SSL_ERROR_ZERO_RETURN);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001739 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_READ",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001740 PY_SSL_ERROR_WANT_READ);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001741 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_WRITE",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001742 PY_SSL_ERROR_WANT_WRITE);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001743 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_X509_LOOKUP",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001744 PY_SSL_ERROR_WANT_X509_LOOKUP);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001745 PyModule_AddIntConstant(m, "SSL_ERROR_SYSCALL",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001746 PY_SSL_ERROR_SYSCALL);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001747 PyModule_AddIntConstant(m, "SSL_ERROR_SSL",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001748 PY_SSL_ERROR_SSL);
1749 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_CONNECT",
1750 PY_SSL_ERROR_WANT_CONNECT);
1751 /* non ssl.h errorcodes */
1752 PyModule_AddIntConstant(m, "SSL_ERROR_EOF",
1753 PY_SSL_ERROR_EOF);
1754 PyModule_AddIntConstant(m, "SSL_ERROR_INVALID_ERROR_CODE",
1755 PY_SSL_ERROR_INVALID_ERROR_CODE);
Thomas Woutersed03b412007-08-28 21:37:11 +00001756 /* cert requirements */
1757 PyModule_AddIntConstant(m, "CERT_NONE",
1758 PY_SSL_CERT_NONE);
1759 PyModule_AddIntConstant(m, "CERT_OPTIONAL",
1760 PY_SSL_CERT_OPTIONAL);
1761 PyModule_AddIntConstant(m, "CERT_REQUIRED",
1762 PY_SSL_CERT_REQUIRED);
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001763
Thomas Woutersed03b412007-08-28 21:37:11 +00001764 /* protocol versions */
1765 PyModule_AddIntConstant(m, "PROTOCOL_SSLv2",
1766 PY_SSL_VERSION_SSL2);
1767 PyModule_AddIntConstant(m, "PROTOCOL_SSLv3",
1768 PY_SSL_VERSION_SSL3);
1769 PyModule_AddIntConstant(m, "PROTOCOL_SSLv23",
1770 PY_SSL_VERSION_SSL23);
1771 PyModule_AddIntConstant(m, "PROTOCOL_TLSv1",
1772 PY_SSL_VERSION_TLS1);
Martin v. Löwis1a214512008-06-11 05:26:20 +00001773 return m;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001774}