blob: 986ec460c6bee6a4a26a6aca689193e8a3e3326c [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?
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000012*/
13
14#include "Python.h"
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +000015
Bill Janssen98d19da2007-09-10 21:51:02 +000016#ifdef WITH_THREAD
17#include "pythread.h"
18#define PySSL_BEGIN_ALLOW_THREADS { \
Neal Norwitze9057ff2008-01-27 17:10:35 +000019 PyThreadState *_save = NULL; \
Bill Janssen98d19da2007-09-10 21:51:02 +000020 if (_ssl_locks_count>0) {_save = PyEval_SaveThread();}
21#define PySSL_BLOCK_THREADS if (_ssl_locks_count>0){PyEval_RestoreThread(_save)};
22#define PySSL_UNBLOCK_THREADS if (_ssl_locks_count>0){_save = PyEval_SaveThread()};
23#define PySSL_END_ALLOW_THREADS if (_ssl_locks_count>0){PyEval_RestoreThread(_save);} \
24 }
25
26#else /* no WITH_THREAD */
27
28#define PySSL_BEGIN_ALLOW_THREADS
29#define PySSL_BLOCK_THREADS
30#define PySSL_UNBLOCK_THREADS
31#define PySSL_END_ALLOW_THREADS
32
33#endif
34
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +000035enum py_ssl_error {
36 /* these mirror ssl.h */
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +000037 PY_SSL_ERROR_NONE,
38 PY_SSL_ERROR_SSL,
39 PY_SSL_ERROR_WANT_READ,
40 PY_SSL_ERROR_WANT_WRITE,
41 PY_SSL_ERROR_WANT_X509_LOOKUP,
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +000042 PY_SSL_ERROR_SYSCALL, /* look at error stack/return value/errno */
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +000043 PY_SSL_ERROR_ZERO_RETURN,
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +000044 PY_SSL_ERROR_WANT_CONNECT,
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +000045 /* start of non ssl.h errorcodes */
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +000046 PY_SSL_ERROR_EOF, /* special case of SSL_ERROR_SYSCALL */
47 PY_SSL_ERROR_INVALID_ERROR_CODE
48};
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000049
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +000050enum py_ssl_server_or_client {
51 PY_SSL_CLIENT,
52 PY_SSL_SERVER
53};
54
55enum py_ssl_cert_requirements {
56 PY_SSL_CERT_NONE,
57 PY_SSL_CERT_OPTIONAL,
58 PY_SSL_CERT_REQUIRED
59};
60
61enum py_ssl_version {
62 PY_SSL_VERSION_SSL2,
63 PY_SSL_VERSION_SSL3,
64 PY_SSL_VERSION_SSL23,
65 PY_SSL_VERSION_TLS1,
66};
67
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000068/* Include symbols from _socket module */
69#include "socketmodule.h"
70
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +000071#if defined(HAVE_POLL_H)
Anthony Baxter93ab5fa2006-07-11 02:04:09 +000072#include <poll.h>
73#elif defined(HAVE_SYS_POLL_H)
74#include <sys/poll.h>
75#endif
76
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000077/* Include OpenSSL header files */
78#include "openssl/rsa.h"
79#include "openssl/crypto.h"
80#include "openssl/x509.h"
Bill Janssen98d19da2007-09-10 21:51:02 +000081#include "openssl/x509v3.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000082#include "openssl/pem.h"
83#include "openssl/ssl.h"
84#include "openssl/err.h"
85#include "openssl/rand.h"
86
87/* SSL error object */
88static PyObject *PySSLErrorObject;
89
Bill Janssen98d19da2007-09-10 21:51:02 +000090#ifdef WITH_THREAD
91
92/* serves as a flag to see whether we've initialized the SSL thread support. */
93/* 0 means no, greater than 0 means yes */
94
95static unsigned int _ssl_locks_count = 0;
96
97#endif /* def WITH_THREAD */
98
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000099/* SSL socket object */
100
101#define X509_NAME_MAXLEN 256
102
103/* RAND_* APIs got added to OpenSSL in 0.9.5 */
104#if OPENSSL_VERSION_NUMBER >= 0x0090500fL
105# define HAVE_OPENSSL_RAND 1
106#else
107# undef HAVE_OPENSSL_RAND
108#endif
109
110typedef struct {
111 PyObject_HEAD
112 PySocketSockObject *Socket; /* Socket on which we're layered */
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000113 SSL_CTX* ctx;
114 SSL* ssl;
115 X509* peer_cert;
116 char server[X509_NAME_MAXLEN];
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000117 char issuer[X509_NAME_MAXLEN];
118
119} PySSLObject;
120
Jeremy Hylton938ace62002-07-17 16:30:39 +0000121static PyTypeObject PySSL_Type;
122static PyObject *PySSL_SSLwrite(PySSLObject *self, PyObject *args);
123static PyObject *PySSL_SSLread(PySSLObject *self, PyObject *args);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000124static int check_socket_and_wait_for_timeout(PySocketSockObject *s,
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +0000125 int writing);
Bill Janssen98d19da2007-09-10 21:51:02 +0000126static PyObject *PySSL_peercert(PySSLObject *self, PyObject *args);
127static PyObject *PySSL_cipher(PySSLObject *self);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000128
Christian Heimese93237d2007-12-19 02:37:44 +0000129#define PySSLObject_Check(v) (Py_TYPE(v) == &PySSL_Type)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000130
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +0000131typedef enum {
132 SOCKET_IS_NONBLOCKING,
133 SOCKET_IS_BLOCKING,
134 SOCKET_HAS_TIMED_OUT,
135 SOCKET_HAS_BEEN_CLOSED,
Neal Norwitz389cea82006-02-13 00:35:21 +0000136 SOCKET_TOO_LARGE_FOR_SELECT,
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +0000137 SOCKET_OPERATION_OK
138} timeout_state;
139
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000140/* Wrap error strings with filename and line # */
141#define STRINGIFY1(x) #x
142#define STRINGIFY2(x) STRINGIFY1(x)
143#define ERRSTR1(x,y,z) (x ":" y ": " z)
144#define ERRSTR(x) ERRSTR1("_ssl.c", STRINGIFY2(__LINE__), x)
145
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000146/* XXX It might be helpful to augment the error message generated
147 below with the name of the SSL function that generated the error.
148 I expect it's obvious most of the time.
149*/
150
151static PyObject *
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000152PySSL_SetError(PySSLObject *obj, int ret, char *filename, int lineno)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000153{
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000154 PyObject *v;
Neal Norwitz049da9e2007-08-25 16:41:36 +0000155 char buf[2048];
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000156 char *errstr;
157 int err;
Guido van Rossum780b80d2007-08-27 18:42:23 +0000158 enum py_ssl_error p = PY_SSL_ERROR_NONE;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000159
160 assert(ret <= 0);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000161
Bill Janssen98d19da2007-09-10 21:51:02 +0000162 if (obj->ssl != NULL) {
Guido van Rossum780b80d2007-08-27 18:42:23 +0000163 err = SSL_get_error(obj->ssl, ret);
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +0000164
Guido van Rossum780b80d2007-08-27 18:42:23 +0000165 switch (err) {
166 case SSL_ERROR_ZERO_RETURN:
167 errstr = "TLS/SSL connection has been closed";
168 p = PY_SSL_ERROR_ZERO_RETURN;
169 break;
170 case SSL_ERROR_WANT_READ:
171 errstr = "The operation did not complete (read)";
172 p = PY_SSL_ERROR_WANT_READ;
173 break;
174 case SSL_ERROR_WANT_WRITE:
175 p = PY_SSL_ERROR_WANT_WRITE;
176 errstr = "The operation did not complete (write)";
177 break;
178 case SSL_ERROR_WANT_X509_LOOKUP:
179 p = PY_SSL_ERROR_WANT_X509_LOOKUP;
180 errstr =
181 "The operation did not complete (X509 lookup)";
182 break;
183 case SSL_ERROR_WANT_CONNECT:
184 p = PY_SSL_ERROR_WANT_CONNECT;
185 errstr = "The operation did not complete (connect)";
186 break;
187 case SSL_ERROR_SYSCALL:
188 {
189 unsigned long e = ERR_get_error();
190 if (e == 0) {
191 if (ret == 0 || !obj->Socket) {
192 p = PY_SSL_ERROR_EOF;
193 errstr =
194 "EOF occurred in violation of protocol";
195 } else if (ret == -1) {
196 /* underlying BIO reported an I/O error */
197 return obj->Socket->errorhandler();
198 } else { /* possible? */
199 p = PY_SSL_ERROR_SYSCALL;
200 errstr = "Some I/O error occurred";
201 }
202 } else {
Jeremy Hylton4e547302002-07-02 18:25:00 +0000203 p = PY_SSL_ERROR_SYSCALL;
Guido van Rossum780b80d2007-08-27 18:42:23 +0000204 /* XXX Protected by global interpreter lock */
205 errstr = ERR_error_string(e, NULL);
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +0000206 }
Guido van Rossum780b80d2007-08-27 18:42:23 +0000207 break;
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +0000208 }
Guido van Rossum780b80d2007-08-27 18:42:23 +0000209 case SSL_ERROR_SSL:
210 {
211 unsigned long e = ERR_get_error();
212 p = PY_SSL_ERROR_SSL;
213 if (e != 0)
214 /* XXX Protected by global interpreter lock */
215 errstr = ERR_error_string(e, NULL);
216 else { /* possible? */
217 errstr =
218 "A failure in the SSL library occurred";
219 }
220 break;
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +0000221 }
Guido van Rossum780b80d2007-08-27 18:42:23 +0000222 default:
223 p = PY_SSL_ERROR_INVALID_ERROR_CODE;
224 errstr = "Invalid error code";
225 }
226 } else {
227 errstr = ERR_error_string(ERR_peek_last_error(), NULL);
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +0000228 }
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000229 PyOS_snprintf(buf, sizeof(buf), "_ssl.c:%d: %s", lineno, errstr);
230 v = Py_BuildValue("(is)", p, buf);
231 if (v != NULL) {
232 PyErr_SetObject(PySSLErrorObject, v);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000233 Py_DECREF(v);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000234 }
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000235 return NULL;
236}
237
Bill Janssen98d19da2007-09-10 21:51:02 +0000238static PyObject *
239_setSSLError (char *errstr, int errcode, char *filename, int lineno) {
240
241 char buf[2048];
242 PyObject *v;
243
244 if (errstr == NULL) {
245 errcode = ERR_peek_last_error();
246 errstr = ERR_error_string(errcode, NULL);
247 }
248 PyOS_snprintf(buf, sizeof(buf), "_ssl.c:%d: %s", lineno, errstr);
249 v = Py_BuildValue("(is)", errcode, buf);
250 if (v != NULL) {
251 PyErr_SetObject(PySSLErrorObject, v);
252 Py_DECREF(v);
253 }
254 return NULL;
255}
256
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000257static PySSLObject *
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000258newPySSLObject(PySocketSockObject *Sock, char *key_file, char *cert_file,
259 enum py_ssl_server_or_client socket_type,
260 enum py_ssl_cert_requirements certreq,
261 enum py_ssl_version proto_version,
262 char *cacerts_file)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000263{
264 PySSLObject *self;
265 char *errstr = NULL;
266 int ret;
Neal Norwitz049da9e2007-08-25 16:41:36 +0000267 int verification_mode;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000268
269 self = PyObject_New(PySSLObject, &PySSL_Type); /* Create new object */
Neal Norwitz38e3b7d2006-05-11 07:51:59 +0000270 if (self == NULL)
Neal Norwitzc6a989a2006-05-10 06:57:58 +0000271 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000272 memset(self->server, '\0', sizeof(char) * X509_NAME_MAXLEN);
273 memset(self->issuer, '\0', sizeof(char) * X509_NAME_MAXLEN);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000274 self->peer_cert = NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000275 self->ssl = NULL;
276 self->ctx = NULL;
277 self->Socket = NULL;
278
Bill Janssen98d19da2007-09-10 21:51:02 +0000279 /* Make sure the SSL error state is initialized */
280 (void) ERR_get_state();
281 ERR_clear_error();
282
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000283 if ((key_file && !cert_file) || (!key_file && cert_file)) {
Guido van Rossum780b80d2007-08-27 18:42:23 +0000284 errstr = ERRSTR("Both the key & certificate files "
285 "must be specified");
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000286 goto fail;
287 }
288
289 if ((socket_type == PY_SSL_SERVER) &&
290 ((key_file == NULL) || (cert_file == NULL))) {
Guido van Rossum780b80d2007-08-27 18:42:23 +0000291 errstr = ERRSTR("Both the key & certificate files "
292 "must be specified for server-side operation");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000293 goto fail;
294 }
295
Bill Janssen98d19da2007-09-10 21:51:02 +0000296 PySSL_BEGIN_ALLOW_THREADS
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000297 if (proto_version == PY_SSL_VERSION_TLS1)
298 self->ctx = SSL_CTX_new(TLSv1_method()); /* Set up context */
299 else if (proto_version == PY_SSL_VERSION_SSL3)
300 self->ctx = SSL_CTX_new(SSLv3_method()); /* Set up context */
301 else if (proto_version == PY_SSL_VERSION_SSL2)
302 self->ctx = SSL_CTX_new(SSLv2_method()); /* Set up context */
Bill Janssen98d19da2007-09-10 21:51:02 +0000303 else if (proto_version == PY_SSL_VERSION_SSL23)
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000304 self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */
Bill Janssen98d19da2007-09-10 21:51:02 +0000305 PySSL_END_ALLOW_THREADS
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000306
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000307 if (self->ctx == NULL) {
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000308 errstr = ERRSTR("Invalid SSL protocol variant specified.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000309 goto fail;
310 }
311
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000312 if (certreq != PY_SSL_CERT_NONE) {
313 if (cacerts_file == NULL) {
Guido van Rossum780b80d2007-08-27 18:42:23 +0000314 errstr = ERRSTR("No root certificates specified for "
315 "verification of other-side certificates.");
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000316 goto fail;
317 } else {
Bill Janssen98d19da2007-09-10 21:51:02 +0000318 PySSL_BEGIN_ALLOW_THREADS
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000319 ret = SSL_CTX_load_verify_locations(self->ctx,
Guido van Rossum780b80d2007-08-27 18:42:23 +0000320 cacerts_file,
321 NULL);
Bill Janssen98d19da2007-09-10 21:51:02 +0000322 PySSL_END_ALLOW_THREADS
Guido van Rossum780b80d2007-08-27 18:42:23 +0000323 if (ret != 1) {
Bill Janssen98d19da2007-09-10 21:51:02 +0000324 _setSSLError(NULL, 0, __FILE__, __LINE__);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000325 goto fail;
326 }
327 }
328 }
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000329 if (key_file) {
Bill Janssen98d19da2007-09-10 21:51:02 +0000330 PySSL_BEGIN_ALLOW_THREADS
Martin v. Löwis09c35f72002-07-28 09:57:45 +0000331 ret = SSL_CTX_use_PrivateKey_file(self->ctx, key_file,
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000332 SSL_FILETYPE_PEM);
Bill Janssen98d19da2007-09-10 21:51:02 +0000333 PySSL_END_ALLOW_THREADS
Guido van Rossum780b80d2007-08-27 18:42:23 +0000334 if (ret != 1) {
Bill Janssen98d19da2007-09-10 21:51:02 +0000335 _setSSLError(NULL, ret, __FILE__, __LINE__);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000336 goto fail;
337 }
338
Bill Janssen98d19da2007-09-10 21:51:02 +0000339 PySSL_BEGIN_ALLOW_THREADS
Martin v. Löwis09c35f72002-07-28 09:57:45 +0000340 ret = SSL_CTX_use_certificate_chain_file(self->ctx,
Bill Janssen98d19da2007-09-10 21:51:02 +0000341 cert_file);
342 PySSL_END_ALLOW_THREADS
Guido van Rossum780b80d2007-08-27 18:42:23 +0000343 if (ret != 1) {
Bill Janssen98d19da2007-09-10 21:51:02 +0000344 /*
345 fprintf(stderr, "ret is %d, errcode is %lu, %lu, with file \"%s\"\n",
346 ret, ERR_peek_error(), ERR_peek_last_error(), cert_file);
347 */
348 if (ERR_peek_last_error() != 0) {
349 _setSSLError(NULL, ret, __FILE__, __LINE__);
350 goto fail;
351 }
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000352 }
353 }
354
Bill Janssen98d19da2007-09-10 21:51:02 +0000355 /* ssl compatibility */
356 SSL_CTX_set_options(self->ctx, SSL_OP_ALL);
357
Neal Norwitz049da9e2007-08-25 16:41:36 +0000358 verification_mode = SSL_VERIFY_NONE;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000359 if (certreq == PY_SSL_CERT_OPTIONAL)
360 verification_mode = SSL_VERIFY_PEER;
361 else if (certreq == PY_SSL_CERT_REQUIRED)
362 verification_mode = (SSL_VERIFY_PEER |
363 SSL_VERIFY_FAIL_IF_NO_PEER_CERT);
364 SSL_CTX_set_verify(self->ctx, verification_mode,
365 NULL); /* set verify lvl */
366
Bill Janssen98d19da2007-09-10 21:51:02 +0000367 PySSL_BEGIN_ALLOW_THREADS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000368 self->ssl = SSL_new(self->ctx); /* New ssl struct */
Bill Janssen98d19da2007-09-10 21:51:02 +0000369 PySSL_END_ALLOW_THREADS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000370 SSL_set_fd(self->ssl, Sock->sock_fd); /* Set the socket for SSL */
Antoine Pitrou92719c52010-04-09 20:38:39 +0000371#ifdef SSL_MODE_AUTO_RETRY
Antoine Pitroueee91cd2010-03-26 19:27:16 +0000372 SSL_set_mode(self->ssl, SSL_MODE_AUTO_RETRY);
Antoine Pitrou92719c52010-04-09 20:38:39 +0000373#endif
Guido van Rossum4f707ac2003-01-31 18:13:18 +0000374
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000375 /* If the socket is in non-blocking mode or timeout mode, set the BIO
Guido van Rossum4f707ac2003-01-31 18:13:18 +0000376 * to non-blocking mode (blocking is the default)
377 */
378 if (Sock->sock_timeout >= 0.0) {
379 /* Set both the read and write BIO's to non-blocking mode */
380 BIO_set_nbio(SSL_get_rbio(self->ssl), 1);
381 BIO_set_nbio(SSL_get_wbio(self->ssl), 1);
382 }
383
Bill Janssen98d19da2007-09-10 21:51:02 +0000384 PySSL_BEGIN_ALLOW_THREADS
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000385 if (socket_type == PY_SSL_CLIENT)
386 SSL_set_connect_state(self->ssl);
387 else
388 SSL_set_accept_state(self->ssl);
Bill Janssen98d19da2007-09-10 21:51:02 +0000389 PySSL_END_ALLOW_THREADS
Martin v. Löwis09c35f72002-07-28 09:57:45 +0000390
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000391 self->Socket = Sock;
392 Py_INCREF(self->Socket);
393 return self;
394 fail:
395 if (errstr)
396 PyErr_SetString(PySSLErrorObject, errstr);
397 Py_DECREF(self);
398 return NULL;
399}
400
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000401static PyObject *
Guido van Rossum780b80d2007-08-27 18:42:23 +0000402PySSL_sslwrap(PyObject *self, PyObject *args)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000403{
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000404 PySocketSockObject *Sock;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000405 int server_side = 0;
406 int verification_mode = PY_SSL_CERT_NONE;
407 int protocol = PY_SSL_VERSION_SSL23;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000408 char *key_file = NULL;
409 char *cert_file = NULL;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000410 char *cacerts_file = NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000411
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000412 if (!PyArg_ParseTuple(args, "O!i|zziiz:sslwrap",
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000413 PySocketModule.Sock_Type,
Martin v. Löwisa811c382006-10-19 11:00:37 +0000414 &Sock,
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000415 &server_side,
416 &key_file, &cert_file,
417 &verification_mode, &protocol,
418 &cacerts_file))
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000419 return NULL;
420
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000421 /*
422 fprintf(stderr,
423 "server_side is %d, keyfile %p, certfile %p, verify_mode %d, "
424 "protocol %d, certs %p\n",
425 server_side, key_file, cert_file, verification_mode,
426 protocol, cacerts_file);
427 */
428
429 return (PyObject *) newPySSLObject(Sock, key_file, cert_file,
430 server_side, verification_mode,
431 protocol, cacerts_file);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000432}
433
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000434PyDoc_STRVAR(ssl_doc,
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000435"sslwrap(socket, server_side, [keyfile, certfile, certs_mode, protocol,\n"
436" cacertsfile]) -> sslobject");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000437
438/* SSL object methods */
439
Bill Janssen934b16d2008-06-28 22:19:33 +0000440static PyObject *PySSL_SSLdo_handshake(PySSLObject *self)
441{
442 int ret;
443 int err;
444 int sockstate;
445
446 /* Actually negotiate SSL connection */
447 /* XXX If SSL_do_handshake() returns 0, it's also a failure. */
448 sockstate = 0;
449 do {
450 PySSL_BEGIN_ALLOW_THREADS
451 ret = SSL_do_handshake(self->ssl);
452 err = SSL_get_error(self->ssl, ret);
453 PySSL_END_ALLOW_THREADS
454 if(PyErr_CheckSignals()) {
455 return NULL;
456 }
457 if (err == SSL_ERROR_WANT_READ) {
458 sockstate = check_socket_and_wait_for_timeout(self->Socket, 0);
459 } else if (err == SSL_ERROR_WANT_WRITE) {
460 sockstate = check_socket_and_wait_for_timeout(self->Socket, 1);
461 } else {
462 sockstate = SOCKET_OPERATION_OK;
463 }
464 if (sockstate == SOCKET_HAS_TIMED_OUT) {
465 PyErr_SetString(PySSLErrorObject,
466 ERRSTR("The handshake operation timed out"));
467 return NULL;
468 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
469 PyErr_SetString(PySSLErrorObject,
470 ERRSTR("Underlying socket has been closed."));
471 return NULL;
472 } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
473 PyErr_SetString(PySSLErrorObject,
474 ERRSTR("Underlying socket too large for select()."));
475 return NULL;
476 } else if (sockstate == SOCKET_IS_NONBLOCKING) {
477 break;
478 }
479 } while (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE);
480 if (ret < 1)
481 return PySSL_SetError(self, ret, __FILE__, __LINE__);
482 self->ssl->debug = 1;
483
484 if (self->peer_cert)
485 X509_free (self->peer_cert);
486 PySSL_BEGIN_ALLOW_THREADS
487 if ((self->peer_cert = SSL_get_peer_certificate(self->ssl))) {
488 X509_NAME_oneline(X509_get_subject_name(self->peer_cert),
489 self->server, X509_NAME_MAXLEN);
490 X509_NAME_oneline(X509_get_issuer_name(self->peer_cert),
491 self->issuer, X509_NAME_MAXLEN);
492 }
493 PySSL_END_ALLOW_THREADS
494
495 Py_INCREF(Py_None);
496 return Py_None;
497}
498
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000499static PyObject *
500PySSL_server(PySSLObject *self)
501{
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000502 return PyString_FromString(self->server);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000503}
504
505static PyObject *
506PySSL_issuer(PySSLObject *self)
507{
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000508 return PyString_FromString(self->issuer);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000509}
510
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000511static PyObject *
Bill Janssen98d19da2007-09-10 21:51:02 +0000512_create_tuple_for_attribute (ASN1_OBJECT *name, ASN1_STRING *value) {
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000513
Bill Janssen98d19da2007-09-10 21:51:02 +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;
Guido van Rossum780b80d2007-08-27 18:42:23 +0000520
Bill Janssen98d19da2007-09-10 21:51:02 +0000521 buflen = OBJ_obj2txt(namebuf, sizeof(namebuf), name, 0);
522 if (buflen < 0) {
523 _setSSLError(NULL, 0, __FILE__, __LINE__);
524 goto fail;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000525 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000526 name_obj = PyString_FromStringAndSize(namebuf, buflen);
Bill Janssen98d19da2007-09-10 21:51:02 +0000527 if (name_obj == NULL)
528 goto fail;
529
530 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;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000552
Bill Janssen98d19da2007-09-10 21:51:02 +0000553 fail:
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000554 return NULL;
555}
556
557static PyObject *
Bill Janssen98d19da2007-09-10 21:51:02 +0000558_create_tuple_for_X509_NAME (X509_NAME *xname)
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000559{
Bill Janssen98d19da2007-09-10 21:51:02 +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,
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000614 PyString_AS_STRING(PyTuple_GET_ITEM(attr, 0)),
615 PyString_AS_STRING(PyTuple_GET_ITEM(attr, 1)));
Bill Janssen98d19da2007-09-10 21:51:02 +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) {
653
654 /* 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;
666 X509V3_EXT_METHOD *method;
667 BIO *biobuf = NULL;
668 char buf[2048];
669 char *vptr;
670 int len;
Victor Stinner3f75cc52010-03-02 22:44:42 +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
Jeffrey Yasskin7937d932009-05-29 03:44:31 +0000675 unsigned char *p;
Victor Stinner3f75cc52010-03-02 22:44:42 +0000676#endif
Bill Janssen98d19da2007-09-10 21:51:02 +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 }
693
694 /* now decode the altName */
695 ext = X509_get_ext(certificate, i);
696 if(!(method = X509V3_EXT_get(ext))) {
697 PyErr_SetString(PySSLErrorObject,
698 ERRSTR("No method for internalizing subjectAltName!"));
699 goto fail;
700 }
701
702 p = ext->value->data;
Neal Norwitze9057ff2008-01-27 17:10:35 +0000703 if (method->it)
Bill Janssen98d19da2007-09-10 21:51:02 +0000704 names = (GENERAL_NAMES*) (ASN1_item_d2i(NULL,
705 &p,
706 ext->value->length,
707 ASN1_ITEM_ptr(method->it)));
708 else
709 names = (GENERAL_NAMES*) (method->d2i(NULL,
710 &p,
711 ext->value->length));
712
713 for(j = 0; j < sk_GENERAL_NAME_num(names); j++) {
714
715 /* get a rendering of each name in the set of names */
716
717 name = sk_GENERAL_NAME_value(names, j);
718 if (name->type == GEN_DIRNAME) {
719
720 /* we special-case DirName as a tuple of tuples of attributes */
721
722 t = PyTuple_New(2);
723 if (t == NULL) {
724 goto fail;
725 }
726
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000727 v = PyString_FromString("DirName");
Bill Janssen98d19da2007-09-10 21:51:02 +0000728 if (v == NULL) {
729 Py_DECREF(t);
730 goto fail;
731 }
732 PyTuple_SET_ITEM(t, 0, v);
733
734 v = _create_tuple_for_X509_NAME (name->d.dirn);
735 if (v == NULL) {
736 Py_DECREF(t);
737 goto fail;
738 }
739 PyTuple_SET_ITEM(t, 1, v);
740
741 } else {
742
743 /* for everything else, we use the OpenSSL print form */
744
745 (void) BIO_reset(biobuf);
746 GENERAL_NAME_print(biobuf, name);
747 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
748 if (len < 0) {
749 _setSSLError(NULL, 0, __FILE__, __LINE__);
750 goto fail;
751 }
752 vptr = strchr(buf, ':');
753 if (vptr == NULL)
754 goto fail;
755 t = PyTuple_New(2);
756 if (t == NULL)
757 goto fail;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000758 v = PyString_FromStringAndSize(buf, (vptr - buf));
Bill Janssen98d19da2007-09-10 21:51:02 +0000759 if (v == NULL) {
760 Py_DECREF(t);
761 goto fail;
762 }
763 PyTuple_SET_ITEM(t, 0, v);
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000764 v = PyString_FromStringAndSize((vptr + 1), (len - (vptr - buf + 1)));
Bill Janssen98d19da2007-09-10 21:51:02 +0000765 if (v == NULL) {
766 Py_DECREF(t);
767 goto fail;
768 }
769 PyTuple_SET_ITEM(t, 1, v);
770 }
771
772 /* and add that rendering to the list */
773
774 if (PyList_Append(peer_alt_names, t) < 0) {
775 Py_DECREF(t);
776 goto fail;
777 }
778 Py_DECREF(t);
779 }
780 }
781 BIO_free(biobuf);
782 if (peer_alt_names != Py_None) {
783 v = PyList_AsTuple(peer_alt_names);
784 Py_DECREF(peer_alt_names);
785 return v;
786 } else {
787 return peer_alt_names;
788 }
789
790
791 fail:
792 if (biobuf != NULL)
793 BIO_free(biobuf);
794
795 if (peer_alt_names != Py_None) {
796 Py_XDECREF(peer_alt_names);
797 }
798
799 return NULL;
800}
801
802static PyObject *
803_decode_certificate (X509 *certificate, int verbose) {
804
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000805 PyObject *retval = NULL;
806 BIO *biobuf = NULL;
Neal Norwitz049da9e2007-08-25 16:41:36 +0000807 PyObject *peer;
Bill Janssen98d19da2007-09-10 21:51:02 +0000808 PyObject *peer_alt_names = NULL;
Neal Norwitz049da9e2007-08-25 16:41:36 +0000809 PyObject *issuer;
810 PyObject *version;
Bill Janssen98d19da2007-09-10 21:51:02 +0000811 PyObject *sn_obj;
812 ASN1_INTEGER *serialNumber;
Neal Norwitz049da9e2007-08-25 16:41:36 +0000813 char buf[2048];
814 int len;
815 ASN1_TIME *notBefore, *notAfter;
816 PyObject *pnotBefore, *pnotAfter;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000817
818 retval = PyDict_New();
819 if (retval == NULL)
820 return NULL;
821
Bill Janssenffe576d2007-09-05 00:46:27 +0000822 peer = _create_tuple_for_X509_NAME(
Bill Janssen98d19da2007-09-10 21:51:02 +0000823 X509_get_subject_name(certificate));
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000824 if (peer == NULL)
825 goto fail0;
826 if (PyDict_SetItemString(retval, (const char *) "subject", peer) < 0) {
827 Py_DECREF(peer);
828 goto fail0;
829 }
830 Py_DECREF(peer);
831
Bill Janssen98d19da2007-09-10 21:51:02 +0000832 if (verbose) {
833 issuer = _create_tuple_for_X509_NAME(
834 X509_get_issuer_name(certificate));
835 if (issuer == NULL)
836 goto fail0;
837 if (PyDict_SetItemString(retval, (const char *)"issuer", issuer) < 0) {
838 Py_DECREF(issuer);
839 goto fail0;
840 }
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000841 Py_DECREF(issuer);
Bill Janssen98d19da2007-09-10 21:51:02 +0000842
843 version = PyInt_FromLong(X509_get_version(certificate) + 1);
844 if (PyDict_SetItemString(retval, "version", version) < 0) {
845 Py_DECREF(version);
846 goto fail0;
847 }
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000848 Py_DECREF(version);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000849 }
Bill Janssen98d19da2007-09-10 21:51:02 +0000850
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000851 /* get a memory buffer */
852 biobuf = BIO_new(BIO_s_mem());
Bill Janssen98d19da2007-09-10 21:51:02 +0000853
854 if (verbose) {
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000855
Bill Janssen98d19da2007-09-10 21:51:02 +0000856 (void) BIO_reset(biobuf);
857 serialNumber = X509_get_serialNumber(certificate);
858 /* should not exceed 20 octets, 160 bits, so buf is big enough */
859 i2a_ASN1_INTEGER(biobuf, serialNumber);
860 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
861 if (len < 0) {
862 _setSSLError(NULL, 0, __FILE__, __LINE__);
863 goto fail1;
864 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000865 sn_obj = PyString_FromStringAndSize(buf, len);
Bill Janssen98d19da2007-09-10 21:51:02 +0000866 if (sn_obj == NULL)
867 goto fail1;
868 if (PyDict_SetItemString(retval, "serialNumber", sn_obj) < 0) {
869 Py_DECREF(sn_obj);
870 goto fail1;
871 }
872 Py_DECREF(sn_obj);
873
874 (void) BIO_reset(biobuf);
875 notBefore = X509_get_notBefore(certificate);
876 ASN1_TIME_print(biobuf, notBefore);
877 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
878 if (len < 0) {
879 _setSSLError(NULL, 0, __FILE__, __LINE__);
880 goto fail1;
881 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000882 pnotBefore = PyString_FromStringAndSize(buf, len);
Bill Janssen98d19da2007-09-10 21:51:02 +0000883 if (pnotBefore == NULL)
884 goto fail1;
885 if (PyDict_SetItemString(retval, "notBefore", pnotBefore) < 0) {
886 Py_DECREF(pnotBefore);
887 goto fail1;
888 }
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000889 Py_DECREF(pnotBefore);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000890 }
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000891
Guido van Rossum780b80d2007-08-27 18:42:23 +0000892 (void) BIO_reset(biobuf);
Bill Janssen98d19da2007-09-10 21:51:02 +0000893 notAfter = X509_get_notAfter(certificate);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000894 ASN1_TIME_print(biobuf, notAfter);
895 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
Bill Janssen98d19da2007-09-10 21:51:02 +0000896 if (len < 0) {
897 _setSSLError(NULL, 0, __FILE__, __LINE__);
898 goto fail1;
899 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000900 pnotAfter = PyString_FromStringAndSize(buf, len);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000901 if (pnotAfter == NULL)
Bill Janssen98d19da2007-09-10 21:51:02 +0000902 goto fail1;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000903 if (PyDict_SetItemString(retval, "notAfter", pnotAfter) < 0) {
904 Py_DECREF(pnotAfter);
Bill Janssen98d19da2007-09-10 21:51:02 +0000905 goto fail1;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000906 }
907 Py_DECREF(pnotAfter);
Bill Janssen98d19da2007-09-10 21:51:02 +0000908
909 /* Now look for subjectAltName */
910
911 peer_alt_names = _get_peer_alt_names(certificate);
912 if (peer_alt_names == NULL)
913 goto fail1;
914 else if (peer_alt_names != Py_None) {
915 if (PyDict_SetItemString(retval, "subjectAltName",
916 peer_alt_names) < 0) {
917 Py_DECREF(peer_alt_names);
918 goto fail1;
919 }
920 Py_DECREF(peer_alt_names);
921 }
922
923 BIO_free(biobuf);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000924 return retval;
925
926 fail1:
927 if (biobuf != NULL)
928 BIO_free(biobuf);
929 fail0:
930 Py_XDECREF(retval);
931 return NULL;
932}
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000933
Bill Janssen98d19da2007-09-10 21:51:02 +0000934
935static PyObject *
936PySSL_test_decode_certificate (PyObject *mod, PyObject *args) {
937
938 PyObject *retval = NULL;
939 char *filename = NULL;
940 X509 *x=NULL;
941 BIO *cert;
942 int verbose = 1;
943
944 if (!PyArg_ParseTuple(args, "s|i:test_decode_certificate", &filename, &verbose))
945 return NULL;
946
947 if ((cert=BIO_new(BIO_s_file())) == NULL) {
948 PyErr_SetString(PySSLErrorObject, "Can't malloc memory to read file");
949 goto fail0;
950 }
951
952 if (BIO_read_filename(cert,filename) <= 0) {
953 PyErr_SetString(PySSLErrorObject, "Can't open file");
954 goto fail0;
955 }
956
957 x = PEM_read_bio_X509_AUX(cert,NULL, NULL, NULL);
958 if (x == NULL) {
959 PyErr_SetString(PySSLErrorObject, "Error decoding PEM-encoded file");
960 goto fail0;
961 }
962
963 retval = _decode_certificate(x, verbose);
964
965 fail0:
966
967 if (cert != NULL) BIO_free(cert);
968 return retval;
969}
970
971
972static PyObject *
973PySSL_peercert(PySSLObject *self, PyObject *args)
974{
975 PyObject *retval = NULL;
976 int len;
977 int verification;
978 PyObject *binary_mode = Py_None;
979
980 if (!PyArg_ParseTuple(args, "|O:peer_certificate", &binary_mode))
981 return NULL;
982
983 if (!self->peer_cert)
984 Py_RETURN_NONE;
985
986 if (PyObject_IsTrue(binary_mode)) {
987 /* return cert in DER-encoded format */
988
989 unsigned char *bytes_buf = NULL;
990
991 bytes_buf = NULL;
992 len = i2d_X509(self->peer_cert, &bytes_buf);
993 if (len < 0) {
994 PySSL_SetError(self, len, __FILE__, __LINE__);
995 return NULL;
996 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000997 retval = PyString_FromStringAndSize((const char *) bytes_buf, len);
Bill Janssen98d19da2007-09-10 21:51:02 +0000998 OPENSSL_free(bytes_buf);
999 return retval;
1000
1001 } else {
1002
1003 verification = SSL_CTX_get_verify_mode(self->ctx);
1004 if ((verification & SSL_VERIFY_PEER) == 0)
1005 return PyDict_New();
1006 else
1007 return _decode_certificate (self->peer_cert, 0);
1008 }
1009}
1010
1011PyDoc_STRVAR(PySSL_peercert_doc,
1012"peer_certificate([der=False]) -> certificate\n\
1013\n\
1014Returns the certificate for the peer. If no certificate was provided,\n\
1015returns None. If a certificate was provided, but not validated, returns\n\
1016an empty dictionary. Otherwise returns a dict containing information\n\
1017about the peer certificate.\n\
1018\n\
1019If the optional argument is True, returns a DER-encoded copy of the\n\
1020peer certificate, or None if no certificate was provided. This will\n\
1021return the certificate even if it wasn't validated.");
1022
1023static PyObject *PySSL_cipher (PySSLObject *self) {
1024
1025 PyObject *retval, *v;
1026 SSL_CIPHER *current;
1027 char *cipher_name;
1028 char *cipher_protocol;
1029
1030 if (self->ssl == NULL)
1031 return Py_None;
1032 current = SSL_get_current_cipher(self->ssl);
1033 if (current == NULL)
1034 return Py_None;
1035
1036 retval = PyTuple_New(3);
1037 if (retval == NULL)
1038 return NULL;
1039
1040 cipher_name = (char *) SSL_CIPHER_get_name(current);
1041 if (cipher_name == NULL) {
1042 PyTuple_SET_ITEM(retval, 0, Py_None);
1043 } else {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001044 v = PyString_FromString(cipher_name);
Bill Janssen98d19da2007-09-10 21:51:02 +00001045 if (v == NULL)
1046 goto fail0;
1047 PyTuple_SET_ITEM(retval, 0, v);
1048 }
1049 cipher_protocol = SSL_CIPHER_get_version(current);
1050 if (cipher_protocol == NULL) {
1051 PyTuple_SET_ITEM(retval, 1, Py_None);
1052 } else {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001053 v = PyString_FromString(cipher_protocol);
Bill Janssen98d19da2007-09-10 21:51:02 +00001054 if (v == NULL)
1055 goto fail0;
1056 PyTuple_SET_ITEM(retval, 1, v);
1057 }
1058 v = PyInt_FromLong(SSL_CIPHER_get_bits(current, NULL));
1059 if (v == NULL)
1060 goto fail0;
1061 PyTuple_SET_ITEM(retval, 2, v);
1062 return retval;
1063
1064 fail0:
1065 Py_DECREF(retval);
1066 return NULL;
1067}
1068
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001069static void PySSL_dealloc(PySSLObject *self)
1070{
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001071 if (self->peer_cert) /* Possible not to have one? */
1072 X509_free (self->peer_cert);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001073 if (self->ssl)
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001074 SSL_free(self->ssl);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001075 if (self->ctx)
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001076 SSL_CTX_free(self->ctx);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001077 Py_XDECREF(self->Socket);
1078 PyObject_Del(self);
1079}
1080
Anthony Baxter93ab5fa2006-07-11 02:04:09 +00001081/* If the socket has a timeout, do a select()/poll() on the socket.
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001082 The argument writing indicates the direction.
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001083 Returns one of the possibilities in the timeout_state enum (above).
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001084 */
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001085
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001086static int
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001087check_socket_and_wait_for_timeout(PySocketSockObject *s, int writing)
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001088{
1089 fd_set fds;
1090 struct timeval tv;
1091 int rc;
1092
1093 /* Nothing to do unless we're in timeout mode (not non-blocking) */
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001094 if (s->sock_timeout < 0.0)
1095 return SOCKET_IS_BLOCKING;
1096 else if (s->sock_timeout == 0.0)
1097 return SOCKET_IS_NONBLOCKING;
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001098
1099 /* Guard against closed socket */
1100 if (s->sock_fd < 0)
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001101 return SOCKET_HAS_BEEN_CLOSED;
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001102
Anthony Baxter93ab5fa2006-07-11 02:04:09 +00001103 /* Prefer poll, if available, since you can poll() any fd
1104 * which can't be done with select(). */
1105#ifdef HAVE_POLL
1106 {
1107 struct pollfd pollfd;
1108 int timeout;
1109
1110 pollfd.fd = s->sock_fd;
1111 pollfd.events = writing ? POLLOUT : POLLIN;
1112
1113 /* s->sock_timeout is in seconds, timeout in ms */
1114 timeout = (int)(s->sock_timeout * 1000 + 0.5);
Bill Janssen98d19da2007-09-10 21:51:02 +00001115 PySSL_BEGIN_ALLOW_THREADS
Anthony Baxter93ab5fa2006-07-11 02:04:09 +00001116 rc = poll(&pollfd, 1, timeout);
Bill Janssen98d19da2007-09-10 21:51:02 +00001117 PySSL_END_ALLOW_THREADS
Anthony Baxter93ab5fa2006-07-11 02:04:09 +00001118
1119 goto normal_return;
1120 }
1121#endif
1122
Neal Norwitz082b2df2006-02-07 07:04:46 +00001123 /* Guard against socket too large for select*/
Martin v. Löwisf84d1b92006-02-11 09:27:05 +00001124#ifndef Py_SOCKET_FD_CAN_BE_GE_FD_SETSIZE
Neal Norwitz082b2df2006-02-07 07:04:46 +00001125 if (s->sock_fd >= FD_SETSIZE)
Neal Norwitz389cea82006-02-13 00:35:21 +00001126 return SOCKET_TOO_LARGE_FOR_SELECT;
Martin v. Löwisf84d1b92006-02-11 09:27:05 +00001127#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +00001128
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001129 /* Construct the arguments to select */
1130 tv.tv_sec = (int)s->sock_timeout;
1131 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
1132 FD_ZERO(&fds);
1133 FD_SET(s->sock_fd, &fds);
1134
1135 /* See if the socket is ready */
Bill Janssen98d19da2007-09-10 21:51:02 +00001136 PySSL_BEGIN_ALLOW_THREADS
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001137 if (writing)
1138 rc = select(s->sock_fd+1, NULL, &fds, NULL, &tv);
1139 else
1140 rc = select(s->sock_fd+1, &fds, NULL, NULL, &tv);
Bill Janssen98d19da2007-09-10 21:51:02 +00001141 PySSL_END_ALLOW_THREADS
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001142
Bill Janssen934b16d2008-06-28 22:19:33 +00001143#ifdef HAVE_POLL
Anthony Baxter93ab5fa2006-07-11 02:04:09 +00001144normal_return:
Bill Janssen934b16d2008-06-28 22:19:33 +00001145#endif
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001146 /* Return SOCKET_TIMED_OUT on timeout, SOCKET_OPERATION_OK otherwise
1147 (when we are able to write or when there's something to read) */
1148 return rc == 0 ? SOCKET_HAS_TIMED_OUT : SOCKET_OPERATION_OK;
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001149}
1150
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001151static PyObject *PySSL_SSLwrite(PySSLObject *self, PyObject *args)
1152{
Antoine Pitrou5ba84912009-10-19 17:59:07 +00001153 Py_buffer buf;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001154 int len;
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
Antoine Pitrou5ba84912009-10-19 17:59:07 +00001159 if (!PyArg_ParseTuple(args, "s*:write", &buf))
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");
Antoine Pitrou5ba84912009-10-19 17:59:07 +00001171 goto error;
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.");
Antoine Pitrou5ba84912009-10-19 17:59:07 +00001175 goto error;
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().");
Antoine Pitrou5ba84912009-10-19 17:59:07 +00001179 goto error;
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
Antoine Pitrou5ba84912009-10-19 17:59:07 +00001184 len = SSL_write(self->ssl, buf.buf, buf.len);
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
Antoine Pitrou5ba84912009-10-19 17:59:07 +00001187 if (PyErr_CheckSignals()) {
1188 goto error;
Martin v. Löwisafec8e32003-06-28 07:40:23 +00001189 }
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");
Antoine Pitrou5ba84912009-10-19 17:59:07 +00001202 goto error;
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.");
Antoine Pitrou5ba84912009-10-19 17:59:07 +00001206 goto error;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001207 } 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);
Antoine Pitrou5ba84912009-10-19 17:59:07 +00001211
1212 PyBuffer_Release(&buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001213 if (len > 0)
1214 return PyInt_FromLong(len);
1215 else
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001216 return PySSL_SetError(self, len, __FILE__, __LINE__);
Antoine Pitrou5ba84912009-10-19 17:59:07 +00001217
1218error:
1219 PyBuffer_Release(&buf);
1220 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001221}
1222
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001223PyDoc_STRVAR(PySSL_SSLwrite_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001224"write(s) -> len\n\
1225\n\
1226Writes the string s into the SSL object. Returns the number\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001227of bytes written.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001228
Bill Janssen934b16d2008-06-28 22:19:33 +00001229static PyObject *PySSL_SSLpending(PySSLObject *self)
1230{
1231 int count = 0;
1232
1233 PySSL_BEGIN_ALLOW_THREADS
1234 count = SSL_pending(self->ssl);
1235 PySSL_END_ALLOW_THREADS
1236 if (count < 0)
1237 return PySSL_SetError(self, count, __FILE__, __LINE__);
1238 else
1239 return PyInt_FromLong(count);
1240}
1241
1242PyDoc_STRVAR(PySSL_SSLpending_doc,
1243"pending() -> count\n\
1244\n\
1245Returns the number of already decrypted bytes available for read,\n\
1246pending on the connection.\n");
1247
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001248static PyObject *PySSL_SSLread(PySSLObject *self, PyObject *args)
1249{
1250 PyObject *buf;
1251 int count = 0;
1252 int len = 1024;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001253 int sockstate;
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001254 int err;
Bill Janssen934b16d2008-06-28 22:19:33 +00001255 int nonblocking;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001256
1257 if (!PyArg_ParseTuple(args, "|i:read", &len))
1258 return NULL;
1259
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001260 if (!(buf = PyString_FromStringAndSize((char *) 0, len)))
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001261 return NULL;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001262
Bill Janssen934b16d2008-06-28 22:19:33 +00001263 /* just in case the blocking state of the socket has been changed */
1264 nonblocking = (self->Socket->sock_timeout >= 0.0);
1265 BIO_set_nbio(SSL_get_rbio(self->ssl), nonblocking);
1266 BIO_set_nbio(SSL_get_wbio(self->ssl), nonblocking);
1267
Georg Brandl43f08a82006-03-31 18:01:16 +00001268 /* first check if there are bytes ready to be read */
Bill Janssen98d19da2007-09-10 21:51:02 +00001269 PySSL_BEGIN_ALLOW_THREADS
Georg Brandl43f08a82006-03-31 18:01:16 +00001270 count = SSL_pending(self->ssl);
Bill Janssen98d19da2007-09-10 21:51:02 +00001271 PySSL_END_ALLOW_THREADS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001272
Georg Brandl43f08a82006-03-31 18:01:16 +00001273 if (!count) {
1274 sockstate = check_socket_and_wait_for_timeout(self->Socket, 0);
1275 if (sockstate == SOCKET_HAS_TIMED_OUT) {
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001276 PyErr_SetString(PySSLErrorObject,
1277 "The read operation timed out");
Georg Brandl43f08a82006-03-31 18:01:16 +00001278 Py_DECREF(buf);
1279 return NULL;
1280 } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001281 PyErr_SetString(PySSLErrorObject,
1282 "Underlying socket too large for select().");
1283 Py_DECREF(buf);
Georg Brandl43f08a82006-03-31 18:01:16 +00001284 return NULL;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001285 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
Bill Janssen934b16d2008-06-28 22:19:33 +00001286 if (SSL_get_shutdown(self->ssl) !=
1287 SSL_RECEIVED_SHUTDOWN)
1288 {
1289 Py_DECREF(buf);
1290 PyErr_SetString(PySSLErrorObject,
1291 "Socket closed without SSL shutdown handshake");
1292 return NULL;
1293 } else {
1294 /* should contain a zero-length string */
1295 _PyString_Resize(&buf, 0);
1296 return buf;
1297 }
Georg Brandl43f08a82006-03-31 18:01:16 +00001298 }
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001299 }
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001300 do {
1301 err = 0;
Bill Janssen98d19da2007-09-10 21:51:02 +00001302 PySSL_BEGIN_ALLOW_THREADS
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001303 count = SSL_read(self->ssl, PyString_AsString(buf), len);
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001304 err = SSL_get_error(self->ssl, count);
Bill Janssen98d19da2007-09-10 21:51:02 +00001305 PySSL_END_ALLOW_THREADS
Martin v. Löwisafec8e32003-06-28 07:40:23 +00001306 if(PyErr_CheckSignals()) {
1307 Py_DECREF(buf);
1308 return NULL;
1309 }
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001310 if (err == SSL_ERROR_WANT_READ) {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001311 sockstate =
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001312 check_socket_and_wait_for_timeout(self->Socket, 0);
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001313 } else if (err == SSL_ERROR_WANT_WRITE) {
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001314 sockstate =
1315 check_socket_and_wait_for_timeout(self->Socket, 1);
1316 } else if ((err == SSL_ERROR_ZERO_RETURN) &&
1317 (SSL_get_shutdown(self->ssl) ==
Guido van Rossum780b80d2007-08-27 18:42:23 +00001318 SSL_RECEIVED_SHUTDOWN))
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001319 {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001320 _PyString_Resize(&buf, 0);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001321 return buf;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001322 } else {
1323 sockstate = SOCKET_OPERATION_OK;
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001324 }
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001325 if (sockstate == SOCKET_HAS_TIMED_OUT) {
1326 PyErr_SetString(PySSLErrorObject,
1327 "The read operation timed out");
Martin v. Löwisafec8e32003-06-28 07:40:23 +00001328 Py_DECREF(buf);
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001329 return NULL;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001330 } else if (sockstate == SOCKET_IS_NONBLOCKING) {
1331 break;
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001332 }
1333 } while (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001334 if (count <= 0) {
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001335 Py_DECREF(buf);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001336 return PySSL_SetError(self, count, __FILE__, __LINE__);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001337 }
Tim Peters5de98422002-04-27 18:44:32 +00001338 if (count != len)
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001339 _PyString_Resize(&buf, count);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001340 return buf;
1341}
1342
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001343PyDoc_STRVAR(PySSL_SSLread_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001344"read([len]) -> string\n\
1345\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001346Read up to len bytes from the SSL socket.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001347
Bill Janssen934b16d2008-06-28 22:19:33 +00001348static PyObject *PySSL_SSLshutdown(PySSLObject *self)
1349{
1350 int err;
1351
1352 /* Guard against closed socket */
1353 if (self->Socket->sock_fd < 0) {
1354 PyErr_SetString(PySSLErrorObject,
1355 "Underlying socket has been closed.");
1356 return NULL;
1357 }
1358
1359 PySSL_BEGIN_ALLOW_THREADS
1360 err = SSL_shutdown(self->ssl);
1361 if (err == 0) {
1362 /* we need to call it again to finish the shutdown */
1363 err = SSL_shutdown(self->ssl);
1364 }
1365 PySSL_END_ALLOW_THREADS
1366
1367 if (err < 0)
1368 return PySSL_SetError(self, err, __FILE__, __LINE__);
1369 else {
1370 Py_INCREF(self->Socket);
1371 return (PyObject *) (self->Socket);
1372 }
1373}
1374
1375PyDoc_STRVAR(PySSL_SSLshutdown_doc,
1376"shutdown(s) -> socket\n\
1377\n\
1378Does the SSL shutdown handshake with the remote end, and returns\n\
1379the underlying socket object.");
1380
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001381static PyMethodDef PySSLMethods[] = {
Bill Janssen934b16d2008-06-28 22:19:33 +00001382 {"do_handshake", (PyCFunction)PySSL_SSLdo_handshake, METH_NOARGS},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001383 {"write", (PyCFunction)PySSL_SSLwrite, METH_VARARGS,
Bill Janssen98d19da2007-09-10 21:51:02 +00001384 PySSL_SSLwrite_doc},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001385 {"read", (PyCFunction)PySSL_SSLread, METH_VARARGS,
Bill Janssen98d19da2007-09-10 21:51:02 +00001386 PySSL_SSLread_doc},
Bill Janssen934b16d2008-06-28 22:19:33 +00001387 {"pending", (PyCFunction)PySSL_SSLpending, METH_NOARGS,
1388 PySSL_SSLpending_doc},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001389 {"server", (PyCFunction)PySSL_server, METH_NOARGS},
1390 {"issuer", (PyCFunction)PySSL_issuer, METH_NOARGS},
Bill Janssen98d19da2007-09-10 21:51:02 +00001391 {"peer_certificate", (PyCFunction)PySSL_peercert, METH_VARARGS,
1392 PySSL_peercert_doc},
1393 {"cipher", (PyCFunction)PySSL_cipher, METH_NOARGS},
Bill Janssen934b16d2008-06-28 22:19:33 +00001394 {"shutdown", (PyCFunction)PySSL_SSLshutdown, METH_NOARGS,
1395 PySSL_SSLshutdown_doc},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001396 {NULL, NULL}
1397};
1398
1399static PyObject *PySSL_getattr(PySSLObject *self, char *name)
1400{
1401 return Py_FindMethod(PySSLMethods, (PyObject *)self, name);
1402}
1403
Jeremy Hylton938ace62002-07-17 16:30:39 +00001404static PyTypeObject PySSL_Type = {
Martin v. Löwis68192102007-07-21 06:55:02 +00001405 PyVarObject_HEAD_INIT(NULL, 0)
Guido van Rossum780b80d2007-08-27 18:42:23 +00001406 "ssl.SSLContext", /*tp_name*/
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001407 sizeof(PySSLObject), /*tp_basicsize*/
1408 0, /*tp_itemsize*/
1409 /* methods */
1410 (destructor)PySSL_dealloc, /*tp_dealloc*/
1411 0, /*tp_print*/
1412 (getattrfunc)PySSL_getattr, /*tp_getattr*/
1413 0, /*tp_setattr*/
1414 0, /*tp_compare*/
1415 0, /*tp_repr*/
1416 0, /*tp_as_number*/
1417 0, /*tp_as_sequence*/
1418 0, /*tp_as_mapping*/
1419 0, /*tp_hash*/
1420};
1421
1422#ifdef HAVE_OPENSSL_RAND
1423
1424/* helper routines for seeding the SSL PRNG */
1425static PyObject *
1426PySSL_RAND_add(PyObject *self, PyObject *args)
1427{
1428 char *buf;
1429 int len;
1430 double entropy;
1431
1432 if (!PyArg_ParseTuple(args, "s#d:RAND_add", &buf, &len, &entropy))
1433 return NULL;
1434 RAND_add(buf, len, entropy);
1435 Py_INCREF(Py_None);
1436 return Py_None;
1437}
1438
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001439PyDoc_STRVAR(PySSL_RAND_add_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001440"RAND_add(string, entropy)\n\
1441\n\
1442Mix string into the OpenSSL PRNG state. entropy (a float) is a lower\n\
Bill Janssen98d19da2007-09-10 21:51:02 +00001443bound on the entropy contained in string. See RFC 1750.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001444
1445static PyObject *
1446PySSL_RAND_status(PyObject *self)
1447{
1448 return PyInt_FromLong(RAND_status());
1449}
1450
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001451PyDoc_STRVAR(PySSL_RAND_status_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001452"RAND_status() -> 0 or 1\n\
1453\n\
1454Returns 1 if the OpenSSL PRNG has been seeded with enough data and 0 if not.\n\
1455It is necessary to seed the PRNG with RAND_add() on some platforms before\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001456using the ssl() function.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001457
1458static PyObject *
1459PySSL_RAND_egd(PyObject *self, PyObject *arg)
1460{
1461 int bytes;
1462
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001463 if (!PyString_Check(arg))
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001464 return PyErr_Format(PyExc_TypeError,
1465 "RAND_egd() expected string, found %s",
Christian Heimese93237d2007-12-19 02:37:44 +00001466 Py_TYPE(arg)->tp_name);
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001467 bytes = RAND_egd(PyString_AS_STRING(arg));
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001468 if (bytes == -1) {
1469 PyErr_SetString(PySSLErrorObject,
1470 "EGD connection failed or EGD did not return "
1471 "enough data to seed the PRNG");
1472 return NULL;
1473 }
1474 return PyInt_FromLong(bytes);
1475}
1476
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001477PyDoc_STRVAR(PySSL_RAND_egd_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001478"RAND_egd(path) -> bytes\n\
1479\n\
Bill Janssen98d19da2007-09-10 21:51:02 +00001480Queries the entropy gather daemon (EGD) on the socket named by 'path'.\n\
1481Returns number of bytes read. Raises SSLError if connection to EGD\n\
1482fails or if it does provide enough data to seed PRNG.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001483
1484#endif
1485
1486/* List of functions exported by this module. */
1487
1488static PyMethodDef PySSL_methods[] = {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001489 {"sslwrap", PySSL_sslwrap,
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001490 METH_VARARGS, ssl_doc},
Bill Janssen98d19da2007-09-10 21:51:02 +00001491 {"_test_decode_cert", PySSL_test_decode_certificate,
1492 METH_VARARGS},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001493#ifdef HAVE_OPENSSL_RAND
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001494 {"RAND_add", PySSL_RAND_add, METH_VARARGS,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001495 PySSL_RAND_add_doc},
1496 {"RAND_egd", PySSL_RAND_egd, METH_O,
1497 PySSL_RAND_egd_doc},
1498 {"RAND_status", (PyCFunction)PySSL_RAND_status, METH_NOARGS,
1499 PySSL_RAND_status_doc},
1500#endif
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001501 {NULL, NULL} /* Sentinel */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001502};
1503
1504
Bill Janssen98d19da2007-09-10 21:51:02 +00001505#ifdef WITH_THREAD
1506
1507/* an implementation of OpenSSL threading operations in terms
1508 of the Python C thread library */
1509
1510static PyThread_type_lock *_ssl_locks = NULL;
1511
1512static unsigned long _ssl_thread_id_function (void) {
1513 return PyThread_get_thread_ident();
1514}
1515
1516static void _ssl_thread_locking_function (int mode, int n, const char *file, int line) {
1517 /* this function is needed to perform locking on shared data
1518 structures. (Note that OpenSSL uses a number of global data
1519 structures that will be implicitly shared whenever multiple threads
1520 use OpenSSL.) Multi-threaded applications will crash at random if
1521 it is not set.
1522
1523 locking_function() must be able to handle up to CRYPTO_num_locks()
1524 different mutex locks. It sets the n-th lock if mode & CRYPTO_LOCK, and
1525 releases it otherwise.
1526
1527 file and line are the file number of the function setting the
1528 lock. They can be useful for debugging.
1529 */
1530
1531 if ((_ssl_locks == NULL) ||
Neal Norwitz5802bb22008-03-27 05:03:11 +00001532 (n < 0) || ((unsigned)n >= _ssl_locks_count))
Bill Janssen98d19da2007-09-10 21:51:02 +00001533 return;
1534
1535 if (mode & CRYPTO_LOCK) {
1536 PyThread_acquire_lock(_ssl_locks[n], 1);
1537 } else {
1538 PyThread_release_lock(_ssl_locks[n]);
1539 }
1540}
1541
1542static int _setup_ssl_threads(void) {
1543
Neal Norwitz5802bb22008-03-27 05:03:11 +00001544 unsigned int i;
Bill Janssen98d19da2007-09-10 21:51:02 +00001545
1546 if (_ssl_locks == NULL) {
1547 _ssl_locks_count = CRYPTO_num_locks();
1548 _ssl_locks = (PyThread_type_lock *)
1549 malloc(sizeof(PyThread_type_lock) * _ssl_locks_count);
1550 if (_ssl_locks == NULL)
1551 return 0;
1552 memset(_ssl_locks, 0, sizeof(PyThread_type_lock) * _ssl_locks_count);
1553 for (i = 0; i < _ssl_locks_count; i++) {
1554 _ssl_locks[i] = PyThread_allocate_lock();
1555 if (_ssl_locks[i] == NULL) {
Raymond Hettinger354cfc12009-01-26 16:52:22 +00001556 unsigned int j;
Bill Janssen98d19da2007-09-10 21:51:02 +00001557 for (j = 0; j < i; j++) {
1558 PyThread_free_lock(_ssl_locks[j]);
1559 }
1560 free(_ssl_locks);
1561 return 0;
1562 }
1563 }
1564 CRYPTO_set_locking_callback(_ssl_thread_locking_function);
1565 CRYPTO_set_id_callback(_ssl_thread_id_function);
1566 }
1567 return 1;
1568}
1569
1570#endif /* def HAVE_THREAD */
1571
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001572PyDoc_STRVAR(module_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001573"Implementation module for SSL socket operations. See the socket module\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001574for documentation.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001575
Mark Hammondfe51c6d2002-08-02 02:27:13 +00001576PyMODINIT_FUNC
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001577init_ssl(void)
1578{
Antoine Pitrouf9de5342010-04-05 21:35:07 +00001579 PyObject *m, *d, *r;
1580 unsigned long libver;
1581 unsigned int major, minor, fix, patch, status;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001582
Christian Heimese93237d2007-12-19 02:37:44 +00001583 Py_TYPE(&PySSL_Type) = &PyType_Type;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001584
1585 m = Py_InitModule3("_ssl", PySSL_methods, module_doc);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00001586 if (m == NULL)
1587 return;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001588 d = PyModule_GetDict(m);
1589
1590 /* Load _socket module and its C API */
1591 if (PySocketModule_ImportModuleAndAPI())
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001592 return;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001593
1594 /* Init OpenSSL */
1595 SSL_load_error_strings();
Bill Janssen98d19da2007-09-10 21:51:02 +00001596#ifdef WITH_THREAD
1597 /* note that this will start threading if not already started */
1598 if (!_setup_ssl_threads()) {
1599 return;
1600 }
1601#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001602 SSLeay_add_ssl_algorithms();
1603
1604 /* Add symbols to module dict */
Bill Janssen98d19da2007-09-10 21:51:02 +00001605 PySSLErrorObject = PyErr_NewException("ssl.SSLError",
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001606 PySocketModule.error,
1607 NULL);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001608 if (PySSLErrorObject == NULL)
1609 return;
Bill Janssen98d19da2007-09-10 21:51:02 +00001610 if (PyDict_SetItemString(d, "SSLError", PySSLErrorObject) != 0)
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001611 return;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001612 if (PyDict_SetItemString(d, "SSLType",
1613 (PyObject *)&PySSL_Type) != 0)
1614 return;
1615 PyModule_AddIntConstant(m, "SSL_ERROR_ZERO_RETURN",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001616 PY_SSL_ERROR_ZERO_RETURN);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001617 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_READ",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001618 PY_SSL_ERROR_WANT_READ);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001619 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_WRITE",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001620 PY_SSL_ERROR_WANT_WRITE);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001621 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_X509_LOOKUP",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001622 PY_SSL_ERROR_WANT_X509_LOOKUP);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001623 PyModule_AddIntConstant(m, "SSL_ERROR_SYSCALL",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001624 PY_SSL_ERROR_SYSCALL);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001625 PyModule_AddIntConstant(m, "SSL_ERROR_SSL",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001626 PY_SSL_ERROR_SSL);
1627 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_CONNECT",
1628 PY_SSL_ERROR_WANT_CONNECT);
1629 /* non ssl.h errorcodes */
1630 PyModule_AddIntConstant(m, "SSL_ERROR_EOF",
1631 PY_SSL_ERROR_EOF);
1632 PyModule_AddIntConstant(m, "SSL_ERROR_INVALID_ERROR_CODE",
1633 PY_SSL_ERROR_INVALID_ERROR_CODE);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001634 /* cert requirements */
1635 PyModule_AddIntConstant(m, "CERT_NONE",
1636 PY_SSL_CERT_NONE);
1637 PyModule_AddIntConstant(m, "CERT_OPTIONAL",
1638 PY_SSL_CERT_OPTIONAL);
1639 PyModule_AddIntConstant(m, "CERT_REQUIRED",
1640 PY_SSL_CERT_REQUIRED);
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001641
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001642 /* protocol versions */
1643 PyModule_AddIntConstant(m, "PROTOCOL_SSLv2",
1644 PY_SSL_VERSION_SSL2);
1645 PyModule_AddIntConstant(m, "PROTOCOL_SSLv3",
1646 PY_SSL_VERSION_SSL3);
1647 PyModule_AddIntConstant(m, "PROTOCOL_SSLv23",
1648 PY_SSL_VERSION_SSL23);
1649 PyModule_AddIntConstant(m, "PROTOCOL_TLSv1",
1650 PY_SSL_VERSION_TLS1);
Antoine Pitrouf9de5342010-04-05 21:35:07 +00001651
1652 /* OpenSSL version */
1653 /* SSLeay() gives us the version of the library linked against,
1654 which could be different from the headers version.
1655 */
1656 libver = SSLeay();
1657 r = PyLong_FromUnsignedLong(libver);
1658 if (r == NULL)
1659 return;
1660 if (PyModule_AddObject(m, "OPENSSL_VERSION_NUMBER", r))
1661 return;
1662 status = libver & 0xF;
1663 libver >>= 4;
1664 patch = libver & 0xFF;
1665 libver >>= 8;
1666 fix = libver & 0xFF;
1667 libver >>= 8;
1668 minor = libver & 0xFF;
1669 libver >>= 8;
1670 major = libver & 0xFF;
1671 r = Py_BuildValue("IIIII", major, minor, fix, patch, status);
1672 if (r == NULL || PyModule_AddObject(m, "OPENSSL_VERSION_INFO", r))
1673 return;
1674 r = PyString_FromString(SSLeay_version(SSLEAY_VERSION));
1675 if (r == NULL || PyModule_AddObject(m, "OPENSSL_VERSION", r))
1676 return;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001677}