blob: 3047d97b3e1bb1e932f83f009b7f50b077c608bb [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{
Antoine Pitrou9c6cd562010-04-09 21:00:36 +00001350 int err, ssl_err, sockstate;
Bill Janssen934b16d2008-06-28 22:19:33 +00001351
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
Antoine Pitrou9c6cd562010-04-09 21:00:36 +00001359 while (1) {
1360 PySSL_BEGIN_ALLOW_THREADS
Bill Janssen934b16d2008-06-28 22:19:33 +00001361 err = SSL_shutdown(self->ssl);
Antoine Pitrou9c6cd562010-04-09 21:00:36 +00001362 if (err == 0) {
1363 /* we need to call it again to finish the shutdown */
1364 err = SSL_shutdown(self->ssl);
1365 }
1366 PySSL_END_ALLOW_THREADS
1367 if (err >= 0)
1368 break;
1369 /* Possibly retry shutdown until timeout or failure */
1370 ssl_err = SSL_get_error(self->ssl, err);
1371 if (ssl_err == SSL_ERROR_WANT_READ)
1372 sockstate = check_socket_and_wait_for_timeout(self->Socket, 0);
1373 else if (ssl_err == SSL_ERROR_WANT_WRITE)
1374 sockstate = check_socket_and_wait_for_timeout(self->Socket, 1);
1375 else
1376 break;
1377 if (sockstate == SOCKET_HAS_TIMED_OUT) {
1378 if (ssl_err == SSL_ERROR_WANT_READ)
1379 PyErr_SetString(PySSLErrorObject,
1380 "The read operation timed out");
1381 else
1382 PyErr_SetString(PySSLErrorObject,
1383 "The write operation timed out");
1384 return NULL;
1385 }
1386 else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
1387 PyErr_SetString(PySSLErrorObject,
1388 "Underlying socket too large for select().");
1389 return NULL;
1390 }
1391 else if (sockstate != SOCKET_OPERATION_OK)
1392 /* Retain the SSL error code */
1393 break;
Bill Janssen934b16d2008-06-28 22:19:33 +00001394 }
Bill Janssen934b16d2008-06-28 22:19:33 +00001395
1396 if (err < 0)
1397 return PySSL_SetError(self, err, __FILE__, __LINE__);
1398 else {
1399 Py_INCREF(self->Socket);
1400 return (PyObject *) (self->Socket);
1401 }
1402}
1403
1404PyDoc_STRVAR(PySSL_SSLshutdown_doc,
1405"shutdown(s) -> socket\n\
1406\n\
1407Does the SSL shutdown handshake with the remote end, and returns\n\
1408the underlying socket object.");
1409
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001410static PyMethodDef PySSLMethods[] = {
Bill Janssen934b16d2008-06-28 22:19:33 +00001411 {"do_handshake", (PyCFunction)PySSL_SSLdo_handshake, METH_NOARGS},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001412 {"write", (PyCFunction)PySSL_SSLwrite, METH_VARARGS,
Bill Janssen98d19da2007-09-10 21:51:02 +00001413 PySSL_SSLwrite_doc},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001414 {"read", (PyCFunction)PySSL_SSLread, METH_VARARGS,
Bill Janssen98d19da2007-09-10 21:51:02 +00001415 PySSL_SSLread_doc},
Bill Janssen934b16d2008-06-28 22:19:33 +00001416 {"pending", (PyCFunction)PySSL_SSLpending, METH_NOARGS,
1417 PySSL_SSLpending_doc},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001418 {"server", (PyCFunction)PySSL_server, METH_NOARGS},
1419 {"issuer", (PyCFunction)PySSL_issuer, METH_NOARGS},
Bill Janssen98d19da2007-09-10 21:51:02 +00001420 {"peer_certificate", (PyCFunction)PySSL_peercert, METH_VARARGS,
1421 PySSL_peercert_doc},
1422 {"cipher", (PyCFunction)PySSL_cipher, METH_NOARGS},
Bill Janssen934b16d2008-06-28 22:19:33 +00001423 {"shutdown", (PyCFunction)PySSL_SSLshutdown, METH_NOARGS,
1424 PySSL_SSLshutdown_doc},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001425 {NULL, NULL}
1426};
1427
1428static PyObject *PySSL_getattr(PySSLObject *self, char *name)
1429{
1430 return Py_FindMethod(PySSLMethods, (PyObject *)self, name);
1431}
1432
Jeremy Hylton938ace62002-07-17 16:30:39 +00001433static PyTypeObject PySSL_Type = {
Martin v. Löwis68192102007-07-21 06:55:02 +00001434 PyVarObject_HEAD_INIT(NULL, 0)
Guido van Rossum780b80d2007-08-27 18:42:23 +00001435 "ssl.SSLContext", /*tp_name*/
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001436 sizeof(PySSLObject), /*tp_basicsize*/
1437 0, /*tp_itemsize*/
1438 /* methods */
1439 (destructor)PySSL_dealloc, /*tp_dealloc*/
1440 0, /*tp_print*/
1441 (getattrfunc)PySSL_getattr, /*tp_getattr*/
1442 0, /*tp_setattr*/
1443 0, /*tp_compare*/
1444 0, /*tp_repr*/
1445 0, /*tp_as_number*/
1446 0, /*tp_as_sequence*/
1447 0, /*tp_as_mapping*/
1448 0, /*tp_hash*/
1449};
1450
1451#ifdef HAVE_OPENSSL_RAND
1452
1453/* helper routines for seeding the SSL PRNG */
1454static PyObject *
1455PySSL_RAND_add(PyObject *self, PyObject *args)
1456{
1457 char *buf;
1458 int len;
1459 double entropy;
1460
1461 if (!PyArg_ParseTuple(args, "s#d:RAND_add", &buf, &len, &entropy))
1462 return NULL;
1463 RAND_add(buf, len, entropy);
1464 Py_INCREF(Py_None);
1465 return Py_None;
1466}
1467
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001468PyDoc_STRVAR(PySSL_RAND_add_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001469"RAND_add(string, entropy)\n\
1470\n\
1471Mix string into the OpenSSL PRNG state. entropy (a float) is a lower\n\
Bill Janssen98d19da2007-09-10 21:51:02 +00001472bound on the entropy contained in string. See RFC 1750.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001473
1474static PyObject *
1475PySSL_RAND_status(PyObject *self)
1476{
1477 return PyInt_FromLong(RAND_status());
1478}
1479
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001480PyDoc_STRVAR(PySSL_RAND_status_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001481"RAND_status() -> 0 or 1\n\
1482\n\
1483Returns 1 if the OpenSSL PRNG has been seeded with enough data and 0 if not.\n\
1484It is necessary to seed the PRNG with RAND_add() on some platforms before\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001485using the ssl() function.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001486
1487static PyObject *
1488PySSL_RAND_egd(PyObject *self, PyObject *arg)
1489{
1490 int bytes;
1491
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001492 if (!PyString_Check(arg))
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001493 return PyErr_Format(PyExc_TypeError,
1494 "RAND_egd() expected string, found %s",
Christian Heimese93237d2007-12-19 02:37:44 +00001495 Py_TYPE(arg)->tp_name);
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001496 bytes = RAND_egd(PyString_AS_STRING(arg));
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001497 if (bytes == -1) {
1498 PyErr_SetString(PySSLErrorObject,
1499 "EGD connection failed or EGD did not return "
1500 "enough data to seed the PRNG");
1501 return NULL;
1502 }
1503 return PyInt_FromLong(bytes);
1504}
1505
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001506PyDoc_STRVAR(PySSL_RAND_egd_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001507"RAND_egd(path) -> bytes\n\
1508\n\
Bill Janssen98d19da2007-09-10 21:51:02 +00001509Queries the entropy gather daemon (EGD) on the socket named by 'path'.\n\
1510Returns number of bytes read. Raises SSLError if connection to EGD\n\
1511fails or if it does provide enough data to seed PRNG.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001512
1513#endif
1514
1515/* List of functions exported by this module. */
1516
1517static PyMethodDef PySSL_methods[] = {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001518 {"sslwrap", PySSL_sslwrap,
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001519 METH_VARARGS, ssl_doc},
Bill Janssen98d19da2007-09-10 21:51:02 +00001520 {"_test_decode_cert", PySSL_test_decode_certificate,
1521 METH_VARARGS},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001522#ifdef HAVE_OPENSSL_RAND
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001523 {"RAND_add", PySSL_RAND_add, METH_VARARGS,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001524 PySSL_RAND_add_doc},
1525 {"RAND_egd", PySSL_RAND_egd, METH_O,
1526 PySSL_RAND_egd_doc},
1527 {"RAND_status", (PyCFunction)PySSL_RAND_status, METH_NOARGS,
1528 PySSL_RAND_status_doc},
1529#endif
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001530 {NULL, NULL} /* Sentinel */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001531};
1532
1533
Bill Janssen98d19da2007-09-10 21:51:02 +00001534#ifdef WITH_THREAD
1535
1536/* an implementation of OpenSSL threading operations in terms
1537 of the Python C thread library */
1538
1539static PyThread_type_lock *_ssl_locks = NULL;
1540
1541static unsigned long _ssl_thread_id_function (void) {
1542 return PyThread_get_thread_ident();
1543}
1544
1545static void _ssl_thread_locking_function (int mode, int n, const char *file, int line) {
1546 /* this function is needed to perform locking on shared data
1547 structures. (Note that OpenSSL uses a number of global data
1548 structures that will be implicitly shared whenever multiple threads
1549 use OpenSSL.) Multi-threaded applications will crash at random if
1550 it is not set.
1551
1552 locking_function() must be able to handle up to CRYPTO_num_locks()
1553 different mutex locks. It sets the n-th lock if mode & CRYPTO_LOCK, and
1554 releases it otherwise.
1555
1556 file and line are the file number of the function setting the
1557 lock. They can be useful for debugging.
1558 */
1559
1560 if ((_ssl_locks == NULL) ||
Neal Norwitz5802bb22008-03-27 05:03:11 +00001561 (n < 0) || ((unsigned)n >= _ssl_locks_count))
Bill Janssen98d19da2007-09-10 21:51:02 +00001562 return;
1563
1564 if (mode & CRYPTO_LOCK) {
1565 PyThread_acquire_lock(_ssl_locks[n], 1);
1566 } else {
1567 PyThread_release_lock(_ssl_locks[n]);
1568 }
1569}
1570
1571static int _setup_ssl_threads(void) {
1572
Neal Norwitz5802bb22008-03-27 05:03:11 +00001573 unsigned int i;
Bill Janssen98d19da2007-09-10 21:51:02 +00001574
1575 if (_ssl_locks == NULL) {
1576 _ssl_locks_count = CRYPTO_num_locks();
1577 _ssl_locks = (PyThread_type_lock *)
1578 malloc(sizeof(PyThread_type_lock) * _ssl_locks_count);
1579 if (_ssl_locks == NULL)
1580 return 0;
1581 memset(_ssl_locks, 0, sizeof(PyThread_type_lock) * _ssl_locks_count);
1582 for (i = 0; i < _ssl_locks_count; i++) {
1583 _ssl_locks[i] = PyThread_allocate_lock();
1584 if (_ssl_locks[i] == NULL) {
Raymond Hettinger354cfc12009-01-26 16:52:22 +00001585 unsigned int j;
Bill Janssen98d19da2007-09-10 21:51:02 +00001586 for (j = 0; j < i; j++) {
1587 PyThread_free_lock(_ssl_locks[j]);
1588 }
1589 free(_ssl_locks);
1590 return 0;
1591 }
1592 }
1593 CRYPTO_set_locking_callback(_ssl_thread_locking_function);
1594 CRYPTO_set_id_callback(_ssl_thread_id_function);
1595 }
1596 return 1;
1597}
1598
1599#endif /* def HAVE_THREAD */
1600
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001601PyDoc_STRVAR(module_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001602"Implementation module for SSL socket operations. See the socket module\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001603for documentation.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001604
Mark Hammondfe51c6d2002-08-02 02:27:13 +00001605PyMODINIT_FUNC
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001606init_ssl(void)
1607{
Antoine Pitrouf9de5342010-04-05 21:35:07 +00001608 PyObject *m, *d, *r;
1609 unsigned long libver;
1610 unsigned int major, minor, fix, patch, status;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001611
Christian Heimese93237d2007-12-19 02:37:44 +00001612 Py_TYPE(&PySSL_Type) = &PyType_Type;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001613
1614 m = Py_InitModule3("_ssl", PySSL_methods, module_doc);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00001615 if (m == NULL)
1616 return;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001617 d = PyModule_GetDict(m);
1618
1619 /* Load _socket module and its C API */
1620 if (PySocketModule_ImportModuleAndAPI())
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001621 return;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001622
1623 /* Init OpenSSL */
1624 SSL_load_error_strings();
Bill Janssen98d19da2007-09-10 21:51:02 +00001625#ifdef WITH_THREAD
1626 /* note that this will start threading if not already started */
1627 if (!_setup_ssl_threads()) {
1628 return;
1629 }
1630#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001631 SSLeay_add_ssl_algorithms();
1632
1633 /* Add symbols to module dict */
Bill Janssen98d19da2007-09-10 21:51:02 +00001634 PySSLErrorObject = PyErr_NewException("ssl.SSLError",
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001635 PySocketModule.error,
1636 NULL);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001637 if (PySSLErrorObject == NULL)
1638 return;
Bill Janssen98d19da2007-09-10 21:51:02 +00001639 if (PyDict_SetItemString(d, "SSLError", PySSLErrorObject) != 0)
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001640 return;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001641 if (PyDict_SetItemString(d, "SSLType",
1642 (PyObject *)&PySSL_Type) != 0)
1643 return;
1644 PyModule_AddIntConstant(m, "SSL_ERROR_ZERO_RETURN",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001645 PY_SSL_ERROR_ZERO_RETURN);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001646 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_READ",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001647 PY_SSL_ERROR_WANT_READ);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001648 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_WRITE",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001649 PY_SSL_ERROR_WANT_WRITE);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001650 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_X509_LOOKUP",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001651 PY_SSL_ERROR_WANT_X509_LOOKUP);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001652 PyModule_AddIntConstant(m, "SSL_ERROR_SYSCALL",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001653 PY_SSL_ERROR_SYSCALL);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001654 PyModule_AddIntConstant(m, "SSL_ERROR_SSL",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001655 PY_SSL_ERROR_SSL);
1656 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_CONNECT",
1657 PY_SSL_ERROR_WANT_CONNECT);
1658 /* non ssl.h errorcodes */
1659 PyModule_AddIntConstant(m, "SSL_ERROR_EOF",
1660 PY_SSL_ERROR_EOF);
1661 PyModule_AddIntConstant(m, "SSL_ERROR_INVALID_ERROR_CODE",
1662 PY_SSL_ERROR_INVALID_ERROR_CODE);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001663 /* cert requirements */
1664 PyModule_AddIntConstant(m, "CERT_NONE",
1665 PY_SSL_CERT_NONE);
1666 PyModule_AddIntConstant(m, "CERT_OPTIONAL",
1667 PY_SSL_CERT_OPTIONAL);
1668 PyModule_AddIntConstant(m, "CERT_REQUIRED",
1669 PY_SSL_CERT_REQUIRED);
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001670
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001671 /* protocol versions */
1672 PyModule_AddIntConstant(m, "PROTOCOL_SSLv2",
1673 PY_SSL_VERSION_SSL2);
1674 PyModule_AddIntConstant(m, "PROTOCOL_SSLv3",
1675 PY_SSL_VERSION_SSL3);
1676 PyModule_AddIntConstant(m, "PROTOCOL_SSLv23",
1677 PY_SSL_VERSION_SSL23);
1678 PyModule_AddIntConstant(m, "PROTOCOL_TLSv1",
1679 PY_SSL_VERSION_TLS1);
Antoine Pitrouf9de5342010-04-05 21:35:07 +00001680
1681 /* OpenSSL version */
1682 /* SSLeay() gives us the version of the library linked against,
1683 which could be different from the headers version.
1684 */
1685 libver = SSLeay();
1686 r = PyLong_FromUnsignedLong(libver);
1687 if (r == NULL)
1688 return;
1689 if (PyModule_AddObject(m, "OPENSSL_VERSION_NUMBER", r))
1690 return;
1691 status = libver & 0xF;
1692 libver >>= 4;
1693 patch = libver & 0xFF;
1694 libver >>= 8;
1695 fix = libver & 0xFF;
1696 libver >>= 8;
1697 minor = libver & 0xFF;
1698 libver >>= 8;
1699 major = libver & 0xFF;
1700 r = Py_BuildValue("IIIII", major, minor, fix, patch, status);
1701 if (r == NULL || PyModule_AddObject(m, "OPENSSL_VERSION_INFO", r))
1702 return;
1703 r = PyString_FromString(SSLeay_version(SSLEAY_VERSION));
1704 if (r == NULL || PyModule_AddObject(m, "OPENSSL_VERSION", r))
1705 return;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001706}