blob: 4702ecbfe1d806c9916c9ad6910170284af1c480 [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,
Antoine Pitrou0a6373c2010-04-17 17:10:38 +0000262 char *cacerts_file, char *ciphers)
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
Antoine Pitrou0a6373c2010-04-17 17:10:38 +0000312 if (ciphers != NULL) {
313 ret = SSL_CTX_set_cipher_list(self->ctx, ciphers);
314 if (ret == 0) {
315 errstr = ERRSTR("No cipher can be selected.");
316 goto fail;
317 }
318 }
319
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000320 if (certreq != PY_SSL_CERT_NONE) {
321 if (cacerts_file == NULL) {
Guido van Rossum780b80d2007-08-27 18:42:23 +0000322 errstr = ERRSTR("No root certificates specified for "
323 "verification of other-side certificates.");
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000324 goto fail;
325 } else {
Bill Janssen98d19da2007-09-10 21:51:02 +0000326 PySSL_BEGIN_ALLOW_THREADS
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000327 ret = SSL_CTX_load_verify_locations(self->ctx,
Guido van Rossum780b80d2007-08-27 18:42:23 +0000328 cacerts_file,
329 NULL);
Bill Janssen98d19da2007-09-10 21:51:02 +0000330 PySSL_END_ALLOW_THREADS
Guido van Rossum780b80d2007-08-27 18:42:23 +0000331 if (ret != 1) {
Bill Janssen98d19da2007-09-10 21:51:02 +0000332 _setSSLError(NULL, 0, __FILE__, __LINE__);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000333 goto fail;
334 }
335 }
336 }
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000337 if (key_file) {
Bill Janssen98d19da2007-09-10 21:51:02 +0000338 PySSL_BEGIN_ALLOW_THREADS
Martin v. Löwis09c35f72002-07-28 09:57:45 +0000339 ret = SSL_CTX_use_PrivateKey_file(self->ctx, key_file,
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000340 SSL_FILETYPE_PEM);
Bill Janssen98d19da2007-09-10 21:51:02 +0000341 PySSL_END_ALLOW_THREADS
Guido van Rossum780b80d2007-08-27 18:42:23 +0000342 if (ret != 1) {
Bill Janssen98d19da2007-09-10 21:51:02 +0000343 _setSSLError(NULL, ret, __FILE__, __LINE__);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000344 goto fail;
345 }
346
Bill Janssen98d19da2007-09-10 21:51:02 +0000347 PySSL_BEGIN_ALLOW_THREADS
Martin v. Löwis09c35f72002-07-28 09:57:45 +0000348 ret = SSL_CTX_use_certificate_chain_file(self->ctx,
Bill Janssen98d19da2007-09-10 21:51:02 +0000349 cert_file);
350 PySSL_END_ALLOW_THREADS
Guido van Rossum780b80d2007-08-27 18:42:23 +0000351 if (ret != 1) {
Bill Janssen98d19da2007-09-10 21:51:02 +0000352 /*
353 fprintf(stderr, "ret is %d, errcode is %lu, %lu, with file \"%s\"\n",
354 ret, ERR_peek_error(), ERR_peek_last_error(), cert_file);
355 */
356 if (ERR_peek_last_error() != 0) {
357 _setSSLError(NULL, ret, __FILE__, __LINE__);
358 goto fail;
359 }
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000360 }
361 }
362
Bill Janssen98d19da2007-09-10 21:51:02 +0000363 /* ssl compatibility */
364 SSL_CTX_set_options(self->ctx, SSL_OP_ALL);
365
Neal Norwitz049da9e2007-08-25 16:41:36 +0000366 verification_mode = SSL_VERIFY_NONE;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000367 if (certreq == PY_SSL_CERT_OPTIONAL)
368 verification_mode = SSL_VERIFY_PEER;
369 else if (certreq == PY_SSL_CERT_REQUIRED)
370 verification_mode = (SSL_VERIFY_PEER |
371 SSL_VERIFY_FAIL_IF_NO_PEER_CERT);
372 SSL_CTX_set_verify(self->ctx, verification_mode,
373 NULL); /* set verify lvl */
374
Bill Janssen98d19da2007-09-10 21:51:02 +0000375 PySSL_BEGIN_ALLOW_THREADS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000376 self->ssl = SSL_new(self->ctx); /* New ssl struct */
Bill Janssen98d19da2007-09-10 21:51:02 +0000377 PySSL_END_ALLOW_THREADS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000378 SSL_set_fd(self->ssl, Sock->sock_fd); /* Set the socket for SSL */
Antoine Pitrou92719c52010-04-09 20:38:39 +0000379#ifdef SSL_MODE_AUTO_RETRY
Antoine Pitroueee91cd2010-03-26 19:27:16 +0000380 SSL_set_mode(self->ssl, SSL_MODE_AUTO_RETRY);
Antoine Pitrou92719c52010-04-09 20:38:39 +0000381#endif
Guido van Rossum4f707ac2003-01-31 18:13:18 +0000382
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000383 /* If the socket is in non-blocking mode or timeout mode, set the BIO
Guido van Rossum4f707ac2003-01-31 18:13:18 +0000384 * to non-blocking mode (blocking is the default)
385 */
386 if (Sock->sock_timeout >= 0.0) {
387 /* Set both the read and write BIO's to non-blocking mode */
388 BIO_set_nbio(SSL_get_rbio(self->ssl), 1);
389 BIO_set_nbio(SSL_get_wbio(self->ssl), 1);
390 }
391
Bill Janssen98d19da2007-09-10 21:51:02 +0000392 PySSL_BEGIN_ALLOW_THREADS
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000393 if (socket_type == PY_SSL_CLIENT)
394 SSL_set_connect_state(self->ssl);
395 else
396 SSL_set_accept_state(self->ssl);
Bill Janssen98d19da2007-09-10 21:51:02 +0000397 PySSL_END_ALLOW_THREADS
Martin v. Löwis09c35f72002-07-28 09:57:45 +0000398
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000399 self->Socket = Sock;
400 Py_INCREF(self->Socket);
401 return self;
402 fail:
403 if (errstr)
404 PyErr_SetString(PySSLErrorObject, errstr);
405 Py_DECREF(self);
406 return NULL;
407}
408
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000409static PyObject *
Guido van Rossum780b80d2007-08-27 18:42:23 +0000410PySSL_sslwrap(PyObject *self, PyObject *args)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000411{
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000412 PySocketSockObject *Sock;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000413 int server_side = 0;
414 int verification_mode = PY_SSL_CERT_NONE;
415 int protocol = PY_SSL_VERSION_SSL23;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000416 char *key_file = NULL;
417 char *cert_file = NULL;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000418 char *cacerts_file = NULL;
Antoine Pitrou0a6373c2010-04-17 17:10:38 +0000419 char *ciphers = NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000420
Antoine Pitrou0a6373c2010-04-17 17:10:38 +0000421 if (!PyArg_ParseTuple(args, "O!i|zziizz:sslwrap",
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000422 PySocketModule.Sock_Type,
Martin v. Löwisa811c382006-10-19 11:00:37 +0000423 &Sock,
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000424 &server_side,
425 &key_file, &cert_file,
426 &verification_mode, &protocol,
Antoine Pitrou0a6373c2010-04-17 17:10:38 +0000427 &cacerts_file, &ciphers))
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000428 return NULL;
429
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000430 /*
431 fprintf(stderr,
432 "server_side is %d, keyfile %p, certfile %p, verify_mode %d, "
433 "protocol %d, certs %p\n",
434 server_side, key_file, cert_file, verification_mode,
435 protocol, cacerts_file);
436 */
437
438 return (PyObject *) newPySSLObject(Sock, key_file, cert_file,
439 server_side, verification_mode,
Antoine Pitrou0a6373c2010-04-17 17:10:38 +0000440 protocol, cacerts_file,
441 ciphers);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000442}
443
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000444PyDoc_STRVAR(ssl_doc,
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000445"sslwrap(socket, server_side, [keyfile, certfile, certs_mode, protocol,\n"
Antoine Pitrou0a6373c2010-04-17 17:10:38 +0000446" cacertsfile, ciphers]) -> sslobject");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000447
448/* SSL object methods */
449
Bill Janssen934b16d2008-06-28 22:19:33 +0000450static PyObject *PySSL_SSLdo_handshake(PySSLObject *self)
451{
452 int ret;
453 int err;
454 int sockstate;
455
456 /* Actually negotiate SSL connection */
457 /* XXX If SSL_do_handshake() returns 0, it's also a failure. */
458 sockstate = 0;
459 do {
460 PySSL_BEGIN_ALLOW_THREADS
461 ret = SSL_do_handshake(self->ssl);
462 err = SSL_get_error(self->ssl, ret);
463 PySSL_END_ALLOW_THREADS
464 if(PyErr_CheckSignals()) {
465 return NULL;
466 }
467 if (err == SSL_ERROR_WANT_READ) {
468 sockstate = check_socket_and_wait_for_timeout(self->Socket, 0);
469 } else if (err == SSL_ERROR_WANT_WRITE) {
470 sockstate = check_socket_and_wait_for_timeout(self->Socket, 1);
471 } else {
472 sockstate = SOCKET_OPERATION_OK;
473 }
474 if (sockstate == SOCKET_HAS_TIMED_OUT) {
475 PyErr_SetString(PySSLErrorObject,
476 ERRSTR("The handshake operation timed out"));
477 return NULL;
478 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
479 PyErr_SetString(PySSLErrorObject,
480 ERRSTR("Underlying socket has been closed."));
481 return NULL;
482 } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
483 PyErr_SetString(PySSLErrorObject,
484 ERRSTR("Underlying socket too large for select()."));
485 return NULL;
486 } else if (sockstate == SOCKET_IS_NONBLOCKING) {
487 break;
488 }
489 } while (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE);
490 if (ret < 1)
491 return PySSL_SetError(self, ret, __FILE__, __LINE__);
492 self->ssl->debug = 1;
493
494 if (self->peer_cert)
495 X509_free (self->peer_cert);
496 PySSL_BEGIN_ALLOW_THREADS
497 if ((self->peer_cert = SSL_get_peer_certificate(self->ssl))) {
498 X509_NAME_oneline(X509_get_subject_name(self->peer_cert),
499 self->server, X509_NAME_MAXLEN);
500 X509_NAME_oneline(X509_get_issuer_name(self->peer_cert),
501 self->issuer, X509_NAME_MAXLEN);
502 }
503 PySSL_END_ALLOW_THREADS
504
505 Py_INCREF(Py_None);
506 return Py_None;
507}
508
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000509static PyObject *
510PySSL_server(PySSLObject *self)
511{
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000512 return PyString_FromString(self->server);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000513}
514
515static PyObject *
516PySSL_issuer(PySSLObject *self)
517{
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000518 return PyString_FromString(self->issuer);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000519}
520
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000521static PyObject *
Bill Janssen98d19da2007-09-10 21:51:02 +0000522_create_tuple_for_attribute (ASN1_OBJECT *name, ASN1_STRING *value) {
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000523
Bill Janssen98d19da2007-09-10 21:51:02 +0000524 char namebuf[X509_NAME_MAXLEN];
525 int buflen;
526 PyObject *name_obj;
527 PyObject *value_obj;
528 PyObject *attr;
529 unsigned char *valuebuf = NULL;
Guido van Rossum780b80d2007-08-27 18:42:23 +0000530
Bill Janssen98d19da2007-09-10 21:51:02 +0000531 buflen = OBJ_obj2txt(namebuf, sizeof(namebuf), name, 0);
532 if (buflen < 0) {
533 _setSSLError(NULL, 0, __FILE__, __LINE__);
534 goto fail;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000535 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000536 name_obj = PyString_FromStringAndSize(namebuf, buflen);
Bill Janssen98d19da2007-09-10 21:51:02 +0000537 if (name_obj == NULL)
538 goto fail;
539
540 buflen = ASN1_STRING_to_UTF8(&valuebuf, value);
541 if (buflen < 0) {
542 _setSSLError(NULL, 0, __FILE__, __LINE__);
543 Py_DECREF(name_obj);
544 goto fail;
545 }
546 value_obj = PyUnicode_DecodeUTF8((char *) valuebuf,
547 buflen, "strict");
548 OPENSSL_free(valuebuf);
549 if (value_obj == NULL) {
550 Py_DECREF(name_obj);
551 goto fail;
552 }
553 attr = PyTuple_New(2);
554 if (attr == NULL) {
555 Py_DECREF(name_obj);
556 Py_DECREF(value_obj);
557 goto fail;
558 }
559 PyTuple_SET_ITEM(attr, 0, name_obj);
560 PyTuple_SET_ITEM(attr, 1, value_obj);
561 return attr;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000562
Bill Janssen98d19da2007-09-10 21:51:02 +0000563 fail:
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000564 return NULL;
565}
566
567static PyObject *
Bill Janssen98d19da2007-09-10 21:51:02 +0000568_create_tuple_for_X509_NAME (X509_NAME *xname)
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000569{
Bill Janssen98d19da2007-09-10 21:51:02 +0000570 PyObject *dn = NULL; /* tuple which represents the "distinguished name" */
571 PyObject *rdn = NULL; /* tuple to hold a "relative distinguished name" */
572 PyObject *rdnt;
573 PyObject *attr = NULL; /* tuple to hold an attribute */
574 int entry_count = X509_NAME_entry_count(xname);
575 X509_NAME_ENTRY *entry;
576 ASN1_OBJECT *name;
577 ASN1_STRING *value;
578 int index_counter;
579 int rdn_level = -1;
580 int retcode;
581
582 dn = PyList_New(0);
583 if (dn == NULL)
584 return NULL;
585 /* now create another tuple to hold the top-level RDN */
586 rdn = PyList_New(0);
587 if (rdn == NULL)
588 goto fail0;
589
590 for (index_counter = 0;
591 index_counter < entry_count;
592 index_counter++)
593 {
594 entry = X509_NAME_get_entry(xname, index_counter);
595
596 /* check to see if we've gotten to a new RDN */
597 if (rdn_level >= 0) {
598 if (rdn_level != entry->set) {
599 /* yes, new RDN */
600 /* add old RDN to DN */
601 rdnt = PyList_AsTuple(rdn);
602 Py_DECREF(rdn);
603 if (rdnt == NULL)
604 goto fail0;
605 retcode = PyList_Append(dn, rdnt);
606 Py_DECREF(rdnt);
607 if (retcode < 0)
608 goto fail0;
609 /* create new RDN */
610 rdn = PyList_New(0);
611 if (rdn == NULL)
612 goto fail0;
613 }
614 }
615 rdn_level = entry->set;
616
617 /* now add this attribute to the current RDN */
618 name = X509_NAME_ENTRY_get_object(entry);
619 value = X509_NAME_ENTRY_get_data(entry);
620 attr = _create_tuple_for_attribute(name, value);
621 /*
622 fprintf(stderr, "RDN level %d, attribute %s: %s\n",
623 entry->set,
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000624 PyString_AS_STRING(PyTuple_GET_ITEM(attr, 0)),
625 PyString_AS_STRING(PyTuple_GET_ITEM(attr, 1)));
Bill Janssen98d19da2007-09-10 21:51:02 +0000626 */
627 if (attr == NULL)
628 goto fail1;
629 retcode = PyList_Append(rdn, attr);
630 Py_DECREF(attr);
631 if (retcode < 0)
632 goto fail1;
633 }
634 /* now, there's typically a dangling RDN */
635 if ((rdn != NULL) && (PyList_Size(rdn) > 0)) {
636 rdnt = PyList_AsTuple(rdn);
637 Py_DECREF(rdn);
638 if (rdnt == NULL)
639 goto fail0;
640 retcode = PyList_Append(dn, rdnt);
641 Py_DECREF(rdnt);
642 if (retcode < 0)
643 goto fail0;
644 }
645
646 /* convert list to tuple */
647 rdnt = PyList_AsTuple(dn);
648 Py_DECREF(dn);
649 if (rdnt == NULL)
650 return NULL;
651 return rdnt;
652
653 fail1:
654 Py_XDECREF(rdn);
655
656 fail0:
657 Py_XDECREF(dn);
658 return NULL;
659}
660
661static PyObject *
662_get_peer_alt_names (X509 *certificate) {
663
664 /* this code follows the procedure outlined in
665 OpenSSL's crypto/x509v3/v3_prn.c:X509v3_EXT_print()
666 function to extract the STACK_OF(GENERAL_NAME),
667 then iterates through the stack to add the
668 names. */
669
670 int i, j;
671 PyObject *peer_alt_names = Py_None;
672 PyObject *v, *t;
673 X509_EXTENSION *ext = NULL;
674 GENERAL_NAMES *names = NULL;
675 GENERAL_NAME *name;
676 X509V3_EXT_METHOD *method;
677 BIO *biobuf = NULL;
678 char buf[2048];
679 char *vptr;
680 int len;
Victor Stinner3f75cc52010-03-02 22:44:42 +0000681 /* Issue #2973: ASN1_item_d2i() API changed in OpenSSL 0.9.6m */
682#if OPENSSL_VERSION_NUMBER >= 0x009060dfL
683 const unsigned char *p;
684#else
Jeffrey Yasskin7937d932009-05-29 03:44:31 +0000685 unsigned char *p;
Victor Stinner3f75cc52010-03-02 22:44:42 +0000686#endif
Bill Janssen98d19da2007-09-10 21:51:02 +0000687
688 if (certificate == NULL)
689 return peer_alt_names;
690
691 /* get a memory buffer */
692 biobuf = BIO_new(BIO_s_mem());
693
694 i = 0;
695 while ((i = X509_get_ext_by_NID(
696 certificate, NID_subject_alt_name, i)) >= 0) {
697
698 if (peer_alt_names == Py_None) {
699 peer_alt_names = PyList_New(0);
700 if (peer_alt_names == NULL)
701 goto fail;
702 }
703
704 /* now decode the altName */
705 ext = X509_get_ext(certificate, i);
706 if(!(method = X509V3_EXT_get(ext))) {
707 PyErr_SetString(PySSLErrorObject,
708 ERRSTR("No method for internalizing subjectAltName!"));
709 goto fail;
710 }
711
712 p = ext->value->data;
Neal Norwitze9057ff2008-01-27 17:10:35 +0000713 if (method->it)
Bill Janssen98d19da2007-09-10 21:51:02 +0000714 names = (GENERAL_NAMES*) (ASN1_item_d2i(NULL,
715 &p,
716 ext->value->length,
717 ASN1_ITEM_ptr(method->it)));
718 else
719 names = (GENERAL_NAMES*) (method->d2i(NULL,
720 &p,
721 ext->value->length));
722
723 for(j = 0; j < sk_GENERAL_NAME_num(names); j++) {
724
725 /* get a rendering of each name in the set of names */
726
727 name = sk_GENERAL_NAME_value(names, j);
728 if (name->type == GEN_DIRNAME) {
729
730 /* we special-case DirName as a tuple of tuples of attributes */
731
732 t = PyTuple_New(2);
733 if (t == NULL) {
734 goto fail;
735 }
736
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000737 v = PyString_FromString("DirName");
Bill Janssen98d19da2007-09-10 21:51:02 +0000738 if (v == NULL) {
739 Py_DECREF(t);
740 goto fail;
741 }
742 PyTuple_SET_ITEM(t, 0, v);
743
744 v = _create_tuple_for_X509_NAME (name->d.dirn);
745 if (v == NULL) {
746 Py_DECREF(t);
747 goto fail;
748 }
749 PyTuple_SET_ITEM(t, 1, v);
750
751 } else {
752
753 /* for everything else, we use the OpenSSL print form */
754
755 (void) BIO_reset(biobuf);
756 GENERAL_NAME_print(biobuf, name);
757 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
758 if (len < 0) {
759 _setSSLError(NULL, 0, __FILE__, __LINE__);
760 goto fail;
761 }
762 vptr = strchr(buf, ':');
763 if (vptr == NULL)
764 goto fail;
765 t = PyTuple_New(2);
766 if (t == NULL)
767 goto fail;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000768 v = PyString_FromStringAndSize(buf, (vptr - buf));
Bill Janssen98d19da2007-09-10 21:51:02 +0000769 if (v == NULL) {
770 Py_DECREF(t);
771 goto fail;
772 }
773 PyTuple_SET_ITEM(t, 0, v);
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000774 v = PyString_FromStringAndSize((vptr + 1), (len - (vptr - buf + 1)));
Bill Janssen98d19da2007-09-10 21:51:02 +0000775 if (v == NULL) {
776 Py_DECREF(t);
777 goto fail;
778 }
779 PyTuple_SET_ITEM(t, 1, v);
780 }
781
782 /* and add that rendering to the list */
783
784 if (PyList_Append(peer_alt_names, t) < 0) {
785 Py_DECREF(t);
786 goto fail;
787 }
788 Py_DECREF(t);
789 }
790 }
791 BIO_free(biobuf);
792 if (peer_alt_names != Py_None) {
793 v = PyList_AsTuple(peer_alt_names);
794 Py_DECREF(peer_alt_names);
795 return v;
796 } else {
797 return peer_alt_names;
798 }
799
800
801 fail:
802 if (biobuf != NULL)
803 BIO_free(biobuf);
804
805 if (peer_alt_names != Py_None) {
806 Py_XDECREF(peer_alt_names);
807 }
808
809 return NULL;
810}
811
812static PyObject *
813_decode_certificate (X509 *certificate, int verbose) {
814
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000815 PyObject *retval = NULL;
816 BIO *biobuf = NULL;
Neal Norwitz049da9e2007-08-25 16:41:36 +0000817 PyObject *peer;
Bill Janssen98d19da2007-09-10 21:51:02 +0000818 PyObject *peer_alt_names = NULL;
Neal Norwitz049da9e2007-08-25 16:41:36 +0000819 PyObject *issuer;
820 PyObject *version;
Bill Janssen98d19da2007-09-10 21:51:02 +0000821 PyObject *sn_obj;
822 ASN1_INTEGER *serialNumber;
Neal Norwitz049da9e2007-08-25 16:41:36 +0000823 char buf[2048];
824 int len;
825 ASN1_TIME *notBefore, *notAfter;
826 PyObject *pnotBefore, *pnotAfter;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000827
828 retval = PyDict_New();
829 if (retval == NULL)
830 return NULL;
831
Bill Janssenffe576d2007-09-05 00:46:27 +0000832 peer = _create_tuple_for_X509_NAME(
Bill Janssen98d19da2007-09-10 21:51:02 +0000833 X509_get_subject_name(certificate));
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000834 if (peer == NULL)
835 goto fail0;
836 if (PyDict_SetItemString(retval, (const char *) "subject", peer) < 0) {
837 Py_DECREF(peer);
838 goto fail0;
839 }
840 Py_DECREF(peer);
841
Bill Janssen98d19da2007-09-10 21:51:02 +0000842 if (verbose) {
843 issuer = _create_tuple_for_X509_NAME(
844 X509_get_issuer_name(certificate));
845 if (issuer == NULL)
846 goto fail0;
847 if (PyDict_SetItemString(retval, (const char *)"issuer", issuer) < 0) {
848 Py_DECREF(issuer);
849 goto fail0;
850 }
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000851 Py_DECREF(issuer);
Bill Janssen98d19da2007-09-10 21:51:02 +0000852
853 version = PyInt_FromLong(X509_get_version(certificate) + 1);
854 if (PyDict_SetItemString(retval, "version", version) < 0) {
855 Py_DECREF(version);
856 goto fail0;
857 }
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000858 Py_DECREF(version);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000859 }
Bill Janssen98d19da2007-09-10 21:51:02 +0000860
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000861 /* get a memory buffer */
862 biobuf = BIO_new(BIO_s_mem());
Bill Janssen98d19da2007-09-10 21:51:02 +0000863
864 if (verbose) {
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000865
Bill Janssen98d19da2007-09-10 21:51:02 +0000866 (void) BIO_reset(biobuf);
867 serialNumber = X509_get_serialNumber(certificate);
868 /* should not exceed 20 octets, 160 bits, so buf is big enough */
869 i2a_ASN1_INTEGER(biobuf, serialNumber);
870 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
871 if (len < 0) {
872 _setSSLError(NULL, 0, __FILE__, __LINE__);
873 goto fail1;
874 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000875 sn_obj = PyString_FromStringAndSize(buf, len);
Bill Janssen98d19da2007-09-10 21:51:02 +0000876 if (sn_obj == NULL)
877 goto fail1;
878 if (PyDict_SetItemString(retval, "serialNumber", sn_obj) < 0) {
879 Py_DECREF(sn_obj);
880 goto fail1;
881 }
882 Py_DECREF(sn_obj);
883
884 (void) BIO_reset(biobuf);
885 notBefore = X509_get_notBefore(certificate);
886 ASN1_TIME_print(biobuf, notBefore);
887 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
888 if (len < 0) {
889 _setSSLError(NULL, 0, __FILE__, __LINE__);
890 goto fail1;
891 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000892 pnotBefore = PyString_FromStringAndSize(buf, len);
Bill Janssen98d19da2007-09-10 21:51:02 +0000893 if (pnotBefore == NULL)
894 goto fail1;
895 if (PyDict_SetItemString(retval, "notBefore", pnotBefore) < 0) {
896 Py_DECREF(pnotBefore);
897 goto fail1;
898 }
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000899 Py_DECREF(pnotBefore);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000900 }
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000901
Guido van Rossum780b80d2007-08-27 18:42:23 +0000902 (void) BIO_reset(biobuf);
Bill Janssen98d19da2007-09-10 21:51:02 +0000903 notAfter = X509_get_notAfter(certificate);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000904 ASN1_TIME_print(biobuf, notAfter);
905 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
Bill Janssen98d19da2007-09-10 21:51:02 +0000906 if (len < 0) {
907 _setSSLError(NULL, 0, __FILE__, __LINE__);
908 goto fail1;
909 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000910 pnotAfter = PyString_FromStringAndSize(buf, len);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000911 if (pnotAfter == NULL)
Bill Janssen98d19da2007-09-10 21:51:02 +0000912 goto fail1;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000913 if (PyDict_SetItemString(retval, "notAfter", pnotAfter) < 0) {
914 Py_DECREF(pnotAfter);
Bill Janssen98d19da2007-09-10 21:51:02 +0000915 goto fail1;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000916 }
917 Py_DECREF(pnotAfter);
Bill Janssen98d19da2007-09-10 21:51:02 +0000918
919 /* Now look for subjectAltName */
920
921 peer_alt_names = _get_peer_alt_names(certificate);
922 if (peer_alt_names == NULL)
923 goto fail1;
924 else if (peer_alt_names != Py_None) {
925 if (PyDict_SetItemString(retval, "subjectAltName",
926 peer_alt_names) < 0) {
927 Py_DECREF(peer_alt_names);
928 goto fail1;
929 }
930 Py_DECREF(peer_alt_names);
931 }
932
933 BIO_free(biobuf);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000934 return retval;
935
936 fail1:
937 if (biobuf != NULL)
938 BIO_free(biobuf);
939 fail0:
940 Py_XDECREF(retval);
941 return NULL;
942}
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000943
Bill Janssen98d19da2007-09-10 21:51:02 +0000944
945static PyObject *
946PySSL_test_decode_certificate (PyObject *mod, PyObject *args) {
947
948 PyObject *retval = NULL;
949 char *filename = NULL;
950 X509 *x=NULL;
951 BIO *cert;
952 int verbose = 1;
953
954 if (!PyArg_ParseTuple(args, "s|i:test_decode_certificate", &filename, &verbose))
955 return NULL;
956
957 if ((cert=BIO_new(BIO_s_file())) == NULL) {
958 PyErr_SetString(PySSLErrorObject, "Can't malloc memory to read file");
959 goto fail0;
960 }
961
962 if (BIO_read_filename(cert,filename) <= 0) {
963 PyErr_SetString(PySSLErrorObject, "Can't open file");
964 goto fail0;
965 }
966
967 x = PEM_read_bio_X509_AUX(cert,NULL, NULL, NULL);
968 if (x == NULL) {
969 PyErr_SetString(PySSLErrorObject, "Error decoding PEM-encoded file");
970 goto fail0;
971 }
972
973 retval = _decode_certificate(x, verbose);
974
975 fail0:
976
977 if (cert != NULL) BIO_free(cert);
978 return retval;
979}
980
981
982static PyObject *
983PySSL_peercert(PySSLObject *self, PyObject *args)
984{
985 PyObject *retval = NULL;
986 int len;
987 int verification;
988 PyObject *binary_mode = Py_None;
989
990 if (!PyArg_ParseTuple(args, "|O:peer_certificate", &binary_mode))
991 return NULL;
992
993 if (!self->peer_cert)
994 Py_RETURN_NONE;
995
996 if (PyObject_IsTrue(binary_mode)) {
997 /* return cert in DER-encoded format */
998
999 unsigned char *bytes_buf = NULL;
1000
1001 bytes_buf = NULL;
1002 len = i2d_X509(self->peer_cert, &bytes_buf);
1003 if (len < 0) {
1004 PySSL_SetError(self, len, __FILE__, __LINE__);
1005 return NULL;
1006 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001007 retval = PyString_FromStringAndSize((const char *) bytes_buf, len);
Bill Janssen98d19da2007-09-10 21:51:02 +00001008 OPENSSL_free(bytes_buf);
1009 return retval;
1010
1011 } else {
1012
1013 verification = SSL_CTX_get_verify_mode(self->ctx);
1014 if ((verification & SSL_VERIFY_PEER) == 0)
1015 return PyDict_New();
1016 else
1017 return _decode_certificate (self->peer_cert, 0);
1018 }
1019}
1020
1021PyDoc_STRVAR(PySSL_peercert_doc,
1022"peer_certificate([der=False]) -> certificate\n\
1023\n\
1024Returns the certificate for the peer. If no certificate was provided,\n\
1025returns None. If a certificate was provided, but not validated, returns\n\
1026an empty dictionary. Otherwise returns a dict containing information\n\
1027about the peer certificate.\n\
1028\n\
1029If the optional argument is True, returns a DER-encoded copy of the\n\
1030peer certificate, or None if no certificate was provided. This will\n\
1031return the certificate even if it wasn't validated.");
1032
1033static PyObject *PySSL_cipher (PySSLObject *self) {
1034
1035 PyObject *retval, *v;
1036 SSL_CIPHER *current;
1037 char *cipher_name;
1038 char *cipher_protocol;
1039
1040 if (self->ssl == NULL)
1041 return Py_None;
1042 current = SSL_get_current_cipher(self->ssl);
1043 if (current == NULL)
1044 return Py_None;
1045
1046 retval = PyTuple_New(3);
1047 if (retval == NULL)
1048 return NULL;
1049
1050 cipher_name = (char *) SSL_CIPHER_get_name(current);
1051 if (cipher_name == NULL) {
1052 PyTuple_SET_ITEM(retval, 0, Py_None);
1053 } else {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001054 v = PyString_FromString(cipher_name);
Bill Janssen98d19da2007-09-10 21:51:02 +00001055 if (v == NULL)
1056 goto fail0;
1057 PyTuple_SET_ITEM(retval, 0, v);
1058 }
1059 cipher_protocol = SSL_CIPHER_get_version(current);
1060 if (cipher_protocol == NULL) {
1061 PyTuple_SET_ITEM(retval, 1, Py_None);
1062 } else {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001063 v = PyString_FromString(cipher_protocol);
Bill Janssen98d19da2007-09-10 21:51:02 +00001064 if (v == NULL)
1065 goto fail0;
1066 PyTuple_SET_ITEM(retval, 1, v);
1067 }
1068 v = PyInt_FromLong(SSL_CIPHER_get_bits(current, NULL));
1069 if (v == NULL)
1070 goto fail0;
1071 PyTuple_SET_ITEM(retval, 2, v);
1072 return retval;
1073
1074 fail0:
1075 Py_DECREF(retval);
1076 return NULL;
1077}
1078
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001079static void PySSL_dealloc(PySSLObject *self)
1080{
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001081 if (self->peer_cert) /* Possible not to have one? */
1082 X509_free (self->peer_cert);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001083 if (self->ssl)
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001084 SSL_free(self->ssl);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001085 if (self->ctx)
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001086 SSL_CTX_free(self->ctx);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001087 Py_XDECREF(self->Socket);
1088 PyObject_Del(self);
1089}
1090
Anthony Baxter93ab5fa2006-07-11 02:04:09 +00001091/* If the socket has a timeout, do a select()/poll() on the socket.
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001092 The argument writing indicates the direction.
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001093 Returns one of the possibilities in the timeout_state enum (above).
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001094 */
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001095
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001096static int
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001097check_socket_and_wait_for_timeout(PySocketSockObject *s, int writing)
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001098{
1099 fd_set fds;
1100 struct timeval tv;
1101 int rc;
1102
1103 /* Nothing to do unless we're in timeout mode (not non-blocking) */
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001104 if (s->sock_timeout < 0.0)
1105 return SOCKET_IS_BLOCKING;
1106 else if (s->sock_timeout == 0.0)
1107 return SOCKET_IS_NONBLOCKING;
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001108
1109 /* Guard against closed socket */
1110 if (s->sock_fd < 0)
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001111 return SOCKET_HAS_BEEN_CLOSED;
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001112
Anthony Baxter93ab5fa2006-07-11 02:04:09 +00001113 /* Prefer poll, if available, since you can poll() any fd
1114 * which can't be done with select(). */
1115#ifdef HAVE_POLL
1116 {
1117 struct pollfd pollfd;
1118 int timeout;
1119
1120 pollfd.fd = s->sock_fd;
1121 pollfd.events = writing ? POLLOUT : POLLIN;
1122
1123 /* s->sock_timeout is in seconds, timeout in ms */
1124 timeout = (int)(s->sock_timeout * 1000 + 0.5);
Bill Janssen98d19da2007-09-10 21:51:02 +00001125 PySSL_BEGIN_ALLOW_THREADS
Anthony Baxter93ab5fa2006-07-11 02:04:09 +00001126 rc = poll(&pollfd, 1, timeout);
Bill Janssen98d19da2007-09-10 21:51:02 +00001127 PySSL_END_ALLOW_THREADS
Anthony Baxter93ab5fa2006-07-11 02:04:09 +00001128
1129 goto normal_return;
1130 }
1131#endif
1132
Neal Norwitz082b2df2006-02-07 07:04:46 +00001133 /* Guard against socket too large for select*/
Martin v. Löwisf84d1b92006-02-11 09:27:05 +00001134#ifndef Py_SOCKET_FD_CAN_BE_GE_FD_SETSIZE
Neal Norwitz082b2df2006-02-07 07:04:46 +00001135 if (s->sock_fd >= FD_SETSIZE)
Neal Norwitz389cea82006-02-13 00:35:21 +00001136 return SOCKET_TOO_LARGE_FOR_SELECT;
Martin v. Löwisf84d1b92006-02-11 09:27:05 +00001137#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +00001138
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001139 /* Construct the arguments to select */
1140 tv.tv_sec = (int)s->sock_timeout;
1141 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
1142 FD_ZERO(&fds);
1143 FD_SET(s->sock_fd, &fds);
1144
1145 /* See if the socket is ready */
Bill Janssen98d19da2007-09-10 21:51:02 +00001146 PySSL_BEGIN_ALLOW_THREADS
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001147 if (writing)
1148 rc = select(s->sock_fd+1, NULL, &fds, NULL, &tv);
1149 else
1150 rc = select(s->sock_fd+1, &fds, NULL, NULL, &tv);
Bill Janssen98d19da2007-09-10 21:51:02 +00001151 PySSL_END_ALLOW_THREADS
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001152
Bill Janssen934b16d2008-06-28 22:19:33 +00001153#ifdef HAVE_POLL
Anthony Baxter93ab5fa2006-07-11 02:04:09 +00001154normal_return:
Bill Janssen934b16d2008-06-28 22:19:33 +00001155#endif
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001156 /* Return SOCKET_TIMED_OUT on timeout, SOCKET_OPERATION_OK otherwise
1157 (when we are able to write or when there's something to read) */
1158 return rc == 0 ? SOCKET_HAS_TIMED_OUT : SOCKET_OPERATION_OK;
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001159}
1160
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001161static PyObject *PySSL_SSLwrite(PySSLObject *self, PyObject *args)
1162{
Antoine Pitrou5ba84912009-10-19 17:59:07 +00001163 Py_buffer buf;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001164 int len;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001165 int sockstate;
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001166 int err;
Bill Janssen934b16d2008-06-28 22:19:33 +00001167 int nonblocking;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001168
Antoine Pitrou5ba84912009-10-19 17:59:07 +00001169 if (!PyArg_ParseTuple(args, "s*:write", &buf))
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001170 return NULL;
1171
Bill Janssen934b16d2008-06-28 22:19:33 +00001172 /* just in case the blocking state of the socket has been changed */
1173 nonblocking = (self->Socket->sock_timeout >= 0.0);
1174 BIO_set_nbio(SSL_get_rbio(self->ssl), nonblocking);
1175 BIO_set_nbio(SSL_get_wbio(self->ssl), nonblocking);
1176
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001177 sockstate = check_socket_and_wait_for_timeout(self->Socket, 1);
1178 if (sockstate == SOCKET_HAS_TIMED_OUT) {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001179 PyErr_SetString(PySSLErrorObject,
1180 "The write operation timed out");
Antoine Pitrou5ba84912009-10-19 17:59:07 +00001181 goto error;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001182 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001183 PyErr_SetString(PySSLErrorObject,
1184 "Underlying socket has been closed.");
Antoine Pitrou5ba84912009-10-19 17:59:07 +00001185 goto error;
Neal Norwitz389cea82006-02-13 00:35:21 +00001186 } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001187 PyErr_SetString(PySSLErrorObject,
1188 "Underlying socket too large for select().");
Antoine Pitrou5ba84912009-10-19 17:59:07 +00001189 goto error;
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001190 }
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001191 do {
1192 err = 0;
Bill Janssen98d19da2007-09-10 21:51:02 +00001193 PySSL_BEGIN_ALLOW_THREADS
Antoine Pitrou5ba84912009-10-19 17:59:07 +00001194 len = SSL_write(self->ssl, buf.buf, buf.len);
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001195 err = SSL_get_error(self->ssl, len);
Bill Janssen98d19da2007-09-10 21:51:02 +00001196 PySSL_END_ALLOW_THREADS
Antoine Pitrou5ba84912009-10-19 17:59:07 +00001197 if (PyErr_CheckSignals()) {
1198 goto error;
Martin v. Löwisafec8e32003-06-28 07:40:23 +00001199 }
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001200 if (err == SSL_ERROR_WANT_READ) {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001201 sockstate =
1202 check_socket_and_wait_for_timeout(self->Socket, 0);
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001203 } else if (err == SSL_ERROR_WANT_WRITE) {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001204 sockstate =
1205 check_socket_and_wait_for_timeout(self->Socket, 1);
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001206 } else {
1207 sockstate = SOCKET_OPERATION_OK;
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001208 }
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001209 if (sockstate == SOCKET_HAS_TIMED_OUT) {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001210 PyErr_SetString(PySSLErrorObject,
1211 "The write operation timed out");
Antoine Pitrou5ba84912009-10-19 17:59:07 +00001212 goto error;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001213 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001214 PyErr_SetString(PySSLErrorObject,
1215 "Underlying socket has been closed.");
Antoine Pitrou5ba84912009-10-19 17:59:07 +00001216 goto error;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001217 } else if (sockstate == SOCKET_IS_NONBLOCKING) {
1218 break;
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001219 }
1220 } while (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE);
Antoine Pitrou5ba84912009-10-19 17:59:07 +00001221
1222 PyBuffer_Release(&buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001223 if (len > 0)
1224 return PyInt_FromLong(len);
1225 else
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001226 return PySSL_SetError(self, len, __FILE__, __LINE__);
Antoine Pitrou5ba84912009-10-19 17:59:07 +00001227
1228error:
1229 PyBuffer_Release(&buf);
1230 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001231}
1232
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001233PyDoc_STRVAR(PySSL_SSLwrite_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001234"write(s) -> len\n\
1235\n\
1236Writes the string s into the SSL object. Returns the number\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001237of bytes written.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001238
Bill Janssen934b16d2008-06-28 22:19:33 +00001239static PyObject *PySSL_SSLpending(PySSLObject *self)
1240{
1241 int count = 0;
1242
1243 PySSL_BEGIN_ALLOW_THREADS
1244 count = SSL_pending(self->ssl);
1245 PySSL_END_ALLOW_THREADS
1246 if (count < 0)
1247 return PySSL_SetError(self, count, __FILE__, __LINE__);
1248 else
1249 return PyInt_FromLong(count);
1250}
1251
1252PyDoc_STRVAR(PySSL_SSLpending_doc,
1253"pending() -> count\n\
1254\n\
1255Returns the number of already decrypted bytes available for read,\n\
1256pending on the connection.\n");
1257
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001258static PyObject *PySSL_SSLread(PySSLObject *self, PyObject *args)
1259{
1260 PyObject *buf;
1261 int count = 0;
1262 int len = 1024;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001263 int sockstate;
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001264 int err;
Bill Janssen934b16d2008-06-28 22:19:33 +00001265 int nonblocking;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001266
1267 if (!PyArg_ParseTuple(args, "|i:read", &len))
1268 return NULL;
1269
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001270 if (!(buf = PyString_FromStringAndSize((char *) 0, len)))
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001271 return NULL;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001272
Bill Janssen934b16d2008-06-28 22:19:33 +00001273 /* just in case the blocking state of the socket has been changed */
1274 nonblocking = (self->Socket->sock_timeout >= 0.0);
1275 BIO_set_nbio(SSL_get_rbio(self->ssl), nonblocking);
1276 BIO_set_nbio(SSL_get_wbio(self->ssl), nonblocking);
1277
Georg Brandl43f08a82006-03-31 18:01:16 +00001278 /* first check if there are bytes ready to be read */
Bill Janssen98d19da2007-09-10 21:51:02 +00001279 PySSL_BEGIN_ALLOW_THREADS
Georg Brandl43f08a82006-03-31 18:01:16 +00001280 count = SSL_pending(self->ssl);
Bill Janssen98d19da2007-09-10 21:51:02 +00001281 PySSL_END_ALLOW_THREADS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001282
Georg Brandl43f08a82006-03-31 18:01:16 +00001283 if (!count) {
1284 sockstate = check_socket_and_wait_for_timeout(self->Socket, 0);
1285 if (sockstate == SOCKET_HAS_TIMED_OUT) {
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001286 PyErr_SetString(PySSLErrorObject,
1287 "The read operation timed out");
Georg Brandl43f08a82006-03-31 18:01:16 +00001288 Py_DECREF(buf);
1289 return NULL;
1290 } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001291 PyErr_SetString(PySSLErrorObject,
1292 "Underlying socket too large for select().");
1293 Py_DECREF(buf);
Georg Brandl43f08a82006-03-31 18:01:16 +00001294 return NULL;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001295 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
Bill Janssen934b16d2008-06-28 22:19:33 +00001296 if (SSL_get_shutdown(self->ssl) !=
1297 SSL_RECEIVED_SHUTDOWN)
1298 {
1299 Py_DECREF(buf);
1300 PyErr_SetString(PySSLErrorObject,
1301 "Socket closed without SSL shutdown handshake");
1302 return NULL;
1303 } else {
1304 /* should contain a zero-length string */
1305 _PyString_Resize(&buf, 0);
1306 return buf;
1307 }
Georg Brandl43f08a82006-03-31 18:01:16 +00001308 }
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001309 }
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001310 do {
1311 err = 0;
Bill Janssen98d19da2007-09-10 21:51:02 +00001312 PySSL_BEGIN_ALLOW_THREADS
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001313 count = SSL_read(self->ssl, PyString_AsString(buf), len);
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001314 err = SSL_get_error(self->ssl, count);
Bill Janssen98d19da2007-09-10 21:51:02 +00001315 PySSL_END_ALLOW_THREADS
Martin v. Löwisafec8e32003-06-28 07:40:23 +00001316 if(PyErr_CheckSignals()) {
1317 Py_DECREF(buf);
1318 return NULL;
1319 }
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001320 if (err == SSL_ERROR_WANT_READ) {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001321 sockstate =
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001322 check_socket_and_wait_for_timeout(self->Socket, 0);
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001323 } else if (err == SSL_ERROR_WANT_WRITE) {
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001324 sockstate =
1325 check_socket_and_wait_for_timeout(self->Socket, 1);
1326 } else if ((err == SSL_ERROR_ZERO_RETURN) &&
1327 (SSL_get_shutdown(self->ssl) ==
Guido van Rossum780b80d2007-08-27 18:42:23 +00001328 SSL_RECEIVED_SHUTDOWN))
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001329 {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001330 _PyString_Resize(&buf, 0);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001331 return buf;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001332 } else {
1333 sockstate = SOCKET_OPERATION_OK;
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001334 }
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001335 if (sockstate == SOCKET_HAS_TIMED_OUT) {
1336 PyErr_SetString(PySSLErrorObject,
1337 "The read operation timed out");
Martin v. Löwisafec8e32003-06-28 07:40:23 +00001338 Py_DECREF(buf);
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001339 return NULL;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001340 } else if (sockstate == SOCKET_IS_NONBLOCKING) {
1341 break;
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001342 }
1343 } while (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001344 if (count <= 0) {
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001345 Py_DECREF(buf);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001346 return PySSL_SetError(self, count, __FILE__, __LINE__);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001347 }
Tim Peters5de98422002-04-27 18:44:32 +00001348 if (count != len)
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001349 _PyString_Resize(&buf, count);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001350 return buf;
1351}
1352
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001353PyDoc_STRVAR(PySSL_SSLread_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001354"read([len]) -> string\n\
1355\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001356Read up to len bytes from the SSL socket.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001357
Bill Janssen934b16d2008-06-28 22:19:33 +00001358static PyObject *PySSL_SSLshutdown(PySSLObject *self)
1359{
Antoine Pitrou343314a2010-04-09 22:41:31 +00001360 int err;
Bill Janssen934b16d2008-06-28 22:19:33 +00001361
1362 /* Guard against closed socket */
1363 if (self->Socket->sock_fd < 0) {
1364 PyErr_SetString(PySSLErrorObject,
1365 "Underlying socket has been closed.");
1366 return NULL;
1367 }
1368
Antoine Pitrou343314a2010-04-09 22:41:31 +00001369 PySSL_BEGIN_ALLOW_THREADS
1370 err = SSL_shutdown(self->ssl);
1371 if (err == 0) {
1372 /* we need to call it again to finish the shutdown */
Bill Janssen934b16d2008-06-28 22:19:33 +00001373 err = SSL_shutdown(self->ssl);
1374 }
Antoine Pitrou343314a2010-04-09 22:41:31 +00001375 PySSL_END_ALLOW_THREADS
Bill Janssen934b16d2008-06-28 22:19:33 +00001376
1377 if (err < 0)
1378 return PySSL_SetError(self, err, __FILE__, __LINE__);
1379 else {
1380 Py_INCREF(self->Socket);
1381 return (PyObject *) (self->Socket);
1382 }
1383}
1384
1385PyDoc_STRVAR(PySSL_SSLshutdown_doc,
1386"shutdown(s) -> socket\n\
1387\n\
1388Does the SSL shutdown handshake with the remote end, and returns\n\
1389the underlying socket object.");
1390
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001391static PyMethodDef PySSLMethods[] = {
Bill Janssen934b16d2008-06-28 22:19:33 +00001392 {"do_handshake", (PyCFunction)PySSL_SSLdo_handshake, METH_NOARGS},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001393 {"write", (PyCFunction)PySSL_SSLwrite, METH_VARARGS,
Bill Janssen98d19da2007-09-10 21:51:02 +00001394 PySSL_SSLwrite_doc},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001395 {"read", (PyCFunction)PySSL_SSLread, METH_VARARGS,
Bill Janssen98d19da2007-09-10 21:51:02 +00001396 PySSL_SSLread_doc},
Bill Janssen934b16d2008-06-28 22:19:33 +00001397 {"pending", (PyCFunction)PySSL_SSLpending, METH_NOARGS,
1398 PySSL_SSLpending_doc},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001399 {"server", (PyCFunction)PySSL_server, METH_NOARGS},
1400 {"issuer", (PyCFunction)PySSL_issuer, METH_NOARGS},
Bill Janssen98d19da2007-09-10 21:51:02 +00001401 {"peer_certificate", (PyCFunction)PySSL_peercert, METH_VARARGS,
1402 PySSL_peercert_doc},
1403 {"cipher", (PyCFunction)PySSL_cipher, METH_NOARGS},
Bill Janssen934b16d2008-06-28 22:19:33 +00001404 {"shutdown", (PyCFunction)PySSL_SSLshutdown, METH_NOARGS,
1405 PySSL_SSLshutdown_doc},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001406 {NULL, NULL}
1407};
1408
1409static PyObject *PySSL_getattr(PySSLObject *self, char *name)
1410{
1411 return Py_FindMethod(PySSLMethods, (PyObject *)self, name);
1412}
1413
Jeremy Hylton938ace62002-07-17 16:30:39 +00001414static PyTypeObject PySSL_Type = {
Martin v. Löwis68192102007-07-21 06:55:02 +00001415 PyVarObject_HEAD_INIT(NULL, 0)
Guido van Rossum780b80d2007-08-27 18:42:23 +00001416 "ssl.SSLContext", /*tp_name*/
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001417 sizeof(PySSLObject), /*tp_basicsize*/
1418 0, /*tp_itemsize*/
1419 /* methods */
1420 (destructor)PySSL_dealloc, /*tp_dealloc*/
1421 0, /*tp_print*/
1422 (getattrfunc)PySSL_getattr, /*tp_getattr*/
1423 0, /*tp_setattr*/
1424 0, /*tp_compare*/
1425 0, /*tp_repr*/
1426 0, /*tp_as_number*/
1427 0, /*tp_as_sequence*/
1428 0, /*tp_as_mapping*/
1429 0, /*tp_hash*/
1430};
1431
1432#ifdef HAVE_OPENSSL_RAND
1433
1434/* helper routines for seeding the SSL PRNG */
1435static PyObject *
1436PySSL_RAND_add(PyObject *self, PyObject *args)
1437{
1438 char *buf;
1439 int len;
1440 double entropy;
1441
1442 if (!PyArg_ParseTuple(args, "s#d:RAND_add", &buf, &len, &entropy))
1443 return NULL;
1444 RAND_add(buf, len, entropy);
1445 Py_INCREF(Py_None);
1446 return Py_None;
1447}
1448
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001449PyDoc_STRVAR(PySSL_RAND_add_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001450"RAND_add(string, entropy)\n\
1451\n\
1452Mix string into the OpenSSL PRNG state. entropy (a float) is a lower\n\
Bill Janssen98d19da2007-09-10 21:51:02 +00001453bound on the entropy contained in string. See RFC 1750.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001454
1455static PyObject *
1456PySSL_RAND_status(PyObject *self)
1457{
1458 return PyInt_FromLong(RAND_status());
1459}
1460
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001461PyDoc_STRVAR(PySSL_RAND_status_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001462"RAND_status() -> 0 or 1\n\
1463\n\
1464Returns 1 if the OpenSSL PRNG has been seeded with enough data and 0 if not.\n\
1465It is necessary to seed the PRNG with RAND_add() on some platforms before\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001466using the ssl() function.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001467
1468static PyObject *
1469PySSL_RAND_egd(PyObject *self, PyObject *arg)
1470{
1471 int bytes;
1472
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001473 if (!PyString_Check(arg))
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001474 return PyErr_Format(PyExc_TypeError,
1475 "RAND_egd() expected string, found %s",
Christian Heimese93237d2007-12-19 02:37:44 +00001476 Py_TYPE(arg)->tp_name);
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001477 bytes = RAND_egd(PyString_AS_STRING(arg));
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001478 if (bytes == -1) {
1479 PyErr_SetString(PySSLErrorObject,
1480 "EGD connection failed or EGD did not return "
1481 "enough data to seed the PRNG");
1482 return NULL;
1483 }
1484 return PyInt_FromLong(bytes);
1485}
1486
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001487PyDoc_STRVAR(PySSL_RAND_egd_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001488"RAND_egd(path) -> bytes\n\
1489\n\
Bill Janssen98d19da2007-09-10 21:51:02 +00001490Queries the entropy gather daemon (EGD) on the socket named by 'path'.\n\
1491Returns number of bytes read. Raises SSLError if connection to EGD\n\
1492fails or if it does provide enough data to seed PRNG.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001493
1494#endif
1495
1496/* List of functions exported by this module. */
1497
1498static PyMethodDef PySSL_methods[] = {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001499 {"sslwrap", PySSL_sslwrap,
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001500 METH_VARARGS, ssl_doc},
Bill Janssen98d19da2007-09-10 21:51:02 +00001501 {"_test_decode_cert", PySSL_test_decode_certificate,
1502 METH_VARARGS},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001503#ifdef HAVE_OPENSSL_RAND
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001504 {"RAND_add", PySSL_RAND_add, METH_VARARGS,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001505 PySSL_RAND_add_doc},
1506 {"RAND_egd", PySSL_RAND_egd, METH_O,
1507 PySSL_RAND_egd_doc},
1508 {"RAND_status", (PyCFunction)PySSL_RAND_status, METH_NOARGS,
1509 PySSL_RAND_status_doc},
1510#endif
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001511 {NULL, NULL} /* Sentinel */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001512};
1513
1514
Bill Janssen98d19da2007-09-10 21:51:02 +00001515#ifdef WITH_THREAD
1516
1517/* an implementation of OpenSSL threading operations in terms
1518 of the Python C thread library */
1519
1520static PyThread_type_lock *_ssl_locks = NULL;
1521
1522static unsigned long _ssl_thread_id_function (void) {
1523 return PyThread_get_thread_ident();
1524}
1525
1526static void _ssl_thread_locking_function (int mode, int n, const char *file, int line) {
1527 /* this function is needed to perform locking on shared data
1528 structures. (Note that OpenSSL uses a number of global data
1529 structures that will be implicitly shared whenever multiple threads
1530 use OpenSSL.) Multi-threaded applications will crash at random if
1531 it is not set.
1532
1533 locking_function() must be able to handle up to CRYPTO_num_locks()
1534 different mutex locks. It sets the n-th lock if mode & CRYPTO_LOCK, and
1535 releases it otherwise.
1536
1537 file and line are the file number of the function setting the
1538 lock. They can be useful for debugging.
1539 */
1540
1541 if ((_ssl_locks == NULL) ||
Neal Norwitz5802bb22008-03-27 05:03:11 +00001542 (n < 0) || ((unsigned)n >= _ssl_locks_count))
Bill Janssen98d19da2007-09-10 21:51:02 +00001543 return;
1544
1545 if (mode & CRYPTO_LOCK) {
1546 PyThread_acquire_lock(_ssl_locks[n], 1);
1547 } else {
1548 PyThread_release_lock(_ssl_locks[n]);
1549 }
1550}
1551
1552static int _setup_ssl_threads(void) {
1553
Neal Norwitz5802bb22008-03-27 05:03:11 +00001554 unsigned int i;
Bill Janssen98d19da2007-09-10 21:51:02 +00001555
1556 if (_ssl_locks == NULL) {
1557 _ssl_locks_count = CRYPTO_num_locks();
1558 _ssl_locks = (PyThread_type_lock *)
1559 malloc(sizeof(PyThread_type_lock) * _ssl_locks_count);
1560 if (_ssl_locks == NULL)
1561 return 0;
1562 memset(_ssl_locks, 0, sizeof(PyThread_type_lock) * _ssl_locks_count);
1563 for (i = 0; i < _ssl_locks_count; i++) {
1564 _ssl_locks[i] = PyThread_allocate_lock();
1565 if (_ssl_locks[i] == NULL) {
Raymond Hettinger354cfc12009-01-26 16:52:22 +00001566 unsigned int j;
Bill Janssen98d19da2007-09-10 21:51:02 +00001567 for (j = 0; j < i; j++) {
1568 PyThread_free_lock(_ssl_locks[j]);
1569 }
1570 free(_ssl_locks);
1571 return 0;
1572 }
1573 }
1574 CRYPTO_set_locking_callback(_ssl_thread_locking_function);
1575 CRYPTO_set_id_callback(_ssl_thread_id_function);
1576 }
1577 return 1;
1578}
1579
1580#endif /* def HAVE_THREAD */
1581
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001582PyDoc_STRVAR(module_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001583"Implementation module for SSL socket operations. See the socket module\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001584for documentation.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001585
Mark Hammondfe51c6d2002-08-02 02:27:13 +00001586PyMODINIT_FUNC
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001587init_ssl(void)
1588{
Antoine Pitrouf9de5342010-04-05 21:35:07 +00001589 PyObject *m, *d, *r;
1590 unsigned long libver;
1591 unsigned int major, minor, fix, patch, status;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001592
Christian Heimese93237d2007-12-19 02:37:44 +00001593 Py_TYPE(&PySSL_Type) = &PyType_Type;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001594
1595 m = Py_InitModule3("_ssl", PySSL_methods, module_doc);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00001596 if (m == NULL)
1597 return;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001598 d = PyModule_GetDict(m);
1599
1600 /* Load _socket module and its C API */
1601 if (PySocketModule_ImportModuleAndAPI())
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001602 return;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001603
1604 /* Init OpenSSL */
1605 SSL_load_error_strings();
Antoine Pitrouc715a9e2010-04-21 19:28:03 +00001606 SSL_library_init();
Bill Janssen98d19da2007-09-10 21:51:02 +00001607#ifdef WITH_THREAD
1608 /* note that this will start threading if not already started */
1609 if (!_setup_ssl_threads()) {
1610 return;
1611 }
1612#endif
Antoine Pitrouc715a9e2010-04-21 19:28:03 +00001613 OpenSSL_add_all_algorithms();
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001614
1615 /* Add symbols to module dict */
Bill Janssen98d19da2007-09-10 21:51:02 +00001616 PySSLErrorObject = PyErr_NewException("ssl.SSLError",
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001617 PySocketModule.error,
1618 NULL);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001619 if (PySSLErrorObject == NULL)
1620 return;
Bill Janssen98d19da2007-09-10 21:51:02 +00001621 if (PyDict_SetItemString(d, "SSLError", PySSLErrorObject) != 0)
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001622 return;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001623 if (PyDict_SetItemString(d, "SSLType",
1624 (PyObject *)&PySSL_Type) != 0)
1625 return;
1626 PyModule_AddIntConstant(m, "SSL_ERROR_ZERO_RETURN",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001627 PY_SSL_ERROR_ZERO_RETURN);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001628 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_READ",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001629 PY_SSL_ERROR_WANT_READ);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001630 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_WRITE",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001631 PY_SSL_ERROR_WANT_WRITE);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001632 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_X509_LOOKUP",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001633 PY_SSL_ERROR_WANT_X509_LOOKUP);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001634 PyModule_AddIntConstant(m, "SSL_ERROR_SYSCALL",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001635 PY_SSL_ERROR_SYSCALL);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001636 PyModule_AddIntConstant(m, "SSL_ERROR_SSL",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001637 PY_SSL_ERROR_SSL);
1638 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_CONNECT",
1639 PY_SSL_ERROR_WANT_CONNECT);
1640 /* non ssl.h errorcodes */
1641 PyModule_AddIntConstant(m, "SSL_ERROR_EOF",
1642 PY_SSL_ERROR_EOF);
1643 PyModule_AddIntConstant(m, "SSL_ERROR_INVALID_ERROR_CODE",
1644 PY_SSL_ERROR_INVALID_ERROR_CODE);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001645 /* cert requirements */
1646 PyModule_AddIntConstant(m, "CERT_NONE",
1647 PY_SSL_CERT_NONE);
1648 PyModule_AddIntConstant(m, "CERT_OPTIONAL",
1649 PY_SSL_CERT_OPTIONAL);
1650 PyModule_AddIntConstant(m, "CERT_REQUIRED",
1651 PY_SSL_CERT_REQUIRED);
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001652
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001653 /* protocol versions */
1654 PyModule_AddIntConstant(m, "PROTOCOL_SSLv2",
1655 PY_SSL_VERSION_SSL2);
1656 PyModule_AddIntConstant(m, "PROTOCOL_SSLv3",
1657 PY_SSL_VERSION_SSL3);
1658 PyModule_AddIntConstant(m, "PROTOCOL_SSLv23",
1659 PY_SSL_VERSION_SSL23);
1660 PyModule_AddIntConstant(m, "PROTOCOL_TLSv1",
1661 PY_SSL_VERSION_TLS1);
Antoine Pitrouf9de5342010-04-05 21:35:07 +00001662
1663 /* OpenSSL version */
1664 /* SSLeay() gives us the version of the library linked against,
1665 which could be different from the headers version.
1666 */
1667 libver = SSLeay();
1668 r = PyLong_FromUnsignedLong(libver);
1669 if (r == NULL)
1670 return;
1671 if (PyModule_AddObject(m, "OPENSSL_VERSION_NUMBER", r))
1672 return;
1673 status = libver & 0xF;
1674 libver >>= 4;
1675 patch = libver & 0xFF;
1676 libver >>= 8;
1677 fix = libver & 0xFF;
1678 libver >>= 8;
1679 minor = libver & 0xFF;
1680 libver >>= 8;
1681 major = libver & 0xFF;
1682 r = Py_BuildValue("IIIII", major, minor, fix, patch, status);
1683 if (r == NULL || PyModule_AddObject(m, "OPENSSL_VERSION_INFO", r))
1684 return;
1685 r = PyString_FromString(SSLeay_version(SSLEAY_VERSION));
1686 if (r == NULL || PyModule_AddObject(m, "OPENSSL_VERSION", r))
1687 return;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001688}