blob: 52fdf0ffd32ece776524c94c9d11f984e84b7fc9 [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 Pitroueee91cd2010-03-26 19:27:16 +0000371 SSL_set_mode(self->ssl, SSL_MODE_AUTO_RETRY);
Guido van Rossum4f707ac2003-01-31 18:13:18 +0000372
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000373 /* If the socket is in non-blocking mode or timeout mode, set the BIO
Guido van Rossum4f707ac2003-01-31 18:13:18 +0000374 * to non-blocking mode (blocking is the default)
375 */
376 if (Sock->sock_timeout >= 0.0) {
377 /* Set both the read and write BIO's to non-blocking mode */
378 BIO_set_nbio(SSL_get_rbio(self->ssl), 1);
379 BIO_set_nbio(SSL_get_wbio(self->ssl), 1);
380 }
381
Bill Janssen98d19da2007-09-10 21:51:02 +0000382 PySSL_BEGIN_ALLOW_THREADS
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000383 if (socket_type == PY_SSL_CLIENT)
384 SSL_set_connect_state(self->ssl);
385 else
386 SSL_set_accept_state(self->ssl);
Bill Janssen98d19da2007-09-10 21:51:02 +0000387 PySSL_END_ALLOW_THREADS
Martin v. Löwis09c35f72002-07-28 09:57:45 +0000388
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000389 self->Socket = Sock;
390 Py_INCREF(self->Socket);
391 return self;
392 fail:
393 if (errstr)
394 PyErr_SetString(PySSLErrorObject, errstr);
395 Py_DECREF(self);
396 return NULL;
397}
398
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000399static PyObject *
Guido van Rossum780b80d2007-08-27 18:42:23 +0000400PySSL_sslwrap(PyObject *self, PyObject *args)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000401{
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000402 PySocketSockObject *Sock;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000403 int server_side = 0;
404 int verification_mode = PY_SSL_CERT_NONE;
405 int protocol = PY_SSL_VERSION_SSL23;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000406 char *key_file = NULL;
407 char *cert_file = NULL;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000408 char *cacerts_file = NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000409
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000410 if (!PyArg_ParseTuple(args, "O!i|zziiz:sslwrap",
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000411 PySocketModule.Sock_Type,
Martin v. Löwisa811c382006-10-19 11:00:37 +0000412 &Sock,
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000413 &server_side,
414 &key_file, &cert_file,
415 &verification_mode, &protocol,
416 &cacerts_file))
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000417 return NULL;
418
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000419 /*
420 fprintf(stderr,
421 "server_side is %d, keyfile %p, certfile %p, verify_mode %d, "
422 "protocol %d, certs %p\n",
423 server_side, key_file, cert_file, verification_mode,
424 protocol, cacerts_file);
425 */
426
427 return (PyObject *) newPySSLObject(Sock, key_file, cert_file,
428 server_side, verification_mode,
429 protocol, cacerts_file);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000430}
431
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000432PyDoc_STRVAR(ssl_doc,
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000433"sslwrap(socket, server_side, [keyfile, certfile, certs_mode, protocol,\n"
434" cacertsfile]) -> sslobject");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000435
436/* SSL object methods */
437
Bill Janssen934b16d2008-06-28 22:19:33 +0000438static PyObject *PySSL_SSLdo_handshake(PySSLObject *self)
439{
440 int ret;
441 int err;
442 int sockstate;
443
444 /* Actually negotiate SSL connection */
445 /* XXX If SSL_do_handshake() returns 0, it's also a failure. */
446 sockstate = 0;
447 do {
448 PySSL_BEGIN_ALLOW_THREADS
449 ret = SSL_do_handshake(self->ssl);
450 err = SSL_get_error(self->ssl, ret);
451 PySSL_END_ALLOW_THREADS
452 if(PyErr_CheckSignals()) {
453 return NULL;
454 }
455 if (err == SSL_ERROR_WANT_READ) {
456 sockstate = check_socket_and_wait_for_timeout(self->Socket, 0);
457 } else if (err == SSL_ERROR_WANT_WRITE) {
458 sockstate = check_socket_and_wait_for_timeout(self->Socket, 1);
459 } else {
460 sockstate = SOCKET_OPERATION_OK;
461 }
462 if (sockstate == SOCKET_HAS_TIMED_OUT) {
463 PyErr_SetString(PySSLErrorObject,
464 ERRSTR("The handshake operation timed out"));
465 return NULL;
466 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
467 PyErr_SetString(PySSLErrorObject,
468 ERRSTR("Underlying socket has been closed."));
469 return NULL;
470 } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
471 PyErr_SetString(PySSLErrorObject,
472 ERRSTR("Underlying socket too large for select()."));
473 return NULL;
474 } else if (sockstate == SOCKET_IS_NONBLOCKING) {
475 break;
476 }
477 } while (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE);
478 if (ret < 1)
479 return PySSL_SetError(self, ret, __FILE__, __LINE__);
480 self->ssl->debug = 1;
481
482 if (self->peer_cert)
483 X509_free (self->peer_cert);
484 PySSL_BEGIN_ALLOW_THREADS
485 if ((self->peer_cert = SSL_get_peer_certificate(self->ssl))) {
486 X509_NAME_oneline(X509_get_subject_name(self->peer_cert),
487 self->server, X509_NAME_MAXLEN);
488 X509_NAME_oneline(X509_get_issuer_name(self->peer_cert),
489 self->issuer, X509_NAME_MAXLEN);
490 }
491 PySSL_END_ALLOW_THREADS
492
493 Py_INCREF(Py_None);
494 return Py_None;
495}
496
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000497static PyObject *
498PySSL_server(PySSLObject *self)
499{
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000500 return PyString_FromString(self->server);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000501}
502
503static PyObject *
504PySSL_issuer(PySSLObject *self)
505{
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000506 return PyString_FromString(self->issuer);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000507}
508
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000509static PyObject *
Bill Janssen98d19da2007-09-10 21:51:02 +0000510_create_tuple_for_attribute (ASN1_OBJECT *name, ASN1_STRING *value) {
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000511
Bill Janssen98d19da2007-09-10 21:51:02 +0000512 char namebuf[X509_NAME_MAXLEN];
513 int buflen;
514 PyObject *name_obj;
515 PyObject *value_obj;
516 PyObject *attr;
517 unsigned char *valuebuf = NULL;
Guido van Rossum780b80d2007-08-27 18:42:23 +0000518
Bill Janssen98d19da2007-09-10 21:51:02 +0000519 buflen = OBJ_obj2txt(namebuf, sizeof(namebuf), name, 0);
520 if (buflen < 0) {
521 _setSSLError(NULL, 0, __FILE__, __LINE__);
522 goto fail;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000523 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000524 name_obj = PyString_FromStringAndSize(namebuf, buflen);
Bill Janssen98d19da2007-09-10 21:51:02 +0000525 if (name_obj == NULL)
526 goto fail;
527
528 buflen = ASN1_STRING_to_UTF8(&valuebuf, value);
529 if (buflen < 0) {
530 _setSSLError(NULL, 0, __FILE__, __LINE__);
531 Py_DECREF(name_obj);
532 goto fail;
533 }
534 value_obj = PyUnicode_DecodeUTF8((char *) valuebuf,
535 buflen, "strict");
536 OPENSSL_free(valuebuf);
537 if (value_obj == NULL) {
538 Py_DECREF(name_obj);
539 goto fail;
540 }
541 attr = PyTuple_New(2);
542 if (attr == NULL) {
543 Py_DECREF(name_obj);
544 Py_DECREF(value_obj);
545 goto fail;
546 }
547 PyTuple_SET_ITEM(attr, 0, name_obj);
548 PyTuple_SET_ITEM(attr, 1, value_obj);
549 return attr;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000550
Bill Janssen98d19da2007-09-10 21:51:02 +0000551 fail:
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000552 return NULL;
553}
554
555static PyObject *
Bill Janssen98d19da2007-09-10 21:51:02 +0000556_create_tuple_for_X509_NAME (X509_NAME *xname)
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000557{
Bill Janssen98d19da2007-09-10 21:51:02 +0000558 PyObject *dn = NULL; /* tuple which represents the "distinguished name" */
559 PyObject *rdn = NULL; /* tuple to hold a "relative distinguished name" */
560 PyObject *rdnt;
561 PyObject *attr = NULL; /* tuple to hold an attribute */
562 int entry_count = X509_NAME_entry_count(xname);
563 X509_NAME_ENTRY *entry;
564 ASN1_OBJECT *name;
565 ASN1_STRING *value;
566 int index_counter;
567 int rdn_level = -1;
568 int retcode;
569
570 dn = PyList_New(0);
571 if (dn == NULL)
572 return NULL;
573 /* now create another tuple to hold the top-level RDN */
574 rdn = PyList_New(0);
575 if (rdn == NULL)
576 goto fail0;
577
578 for (index_counter = 0;
579 index_counter < entry_count;
580 index_counter++)
581 {
582 entry = X509_NAME_get_entry(xname, index_counter);
583
584 /* check to see if we've gotten to a new RDN */
585 if (rdn_level >= 0) {
586 if (rdn_level != entry->set) {
587 /* yes, new RDN */
588 /* add old RDN to DN */
589 rdnt = PyList_AsTuple(rdn);
590 Py_DECREF(rdn);
591 if (rdnt == NULL)
592 goto fail0;
593 retcode = PyList_Append(dn, rdnt);
594 Py_DECREF(rdnt);
595 if (retcode < 0)
596 goto fail0;
597 /* create new RDN */
598 rdn = PyList_New(0);
599 if (rdn == NULL)
600 goto fail0;
601 }
602 }
603 rdn_level = entry->set;
604
605 /* now add this attribute to the current RDN */
606 name = X509_NAME_ENTRY_get_object(entry);
607 value = X509_NAME_ENTRY_get_data(entry);
608 attr = _create_tuple_for_attribute(name, value);
609 /*
610 fprintf(stderr, "RDN level %d, attribute %s: %s\n",
611 entry->set,
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000612 PyString_AS_STRING(PyTuple_GET_ITEM(attr, 0)),
613 PyString_AS_STRING(PyTuple_GET_ITEM(attr, 1)));
Bill Janssen98d19da2007-09-10 21:51:02 +0000614 */
615 if (attr == NULL)
616 goto fail1;
617 retcode = PyList_Append(rdn, attr);
618 Py_DECREF(attr);
619 if (retcode < 0)
620 goto fail1;
621 }
622 /* now, there's typically a dangling RDN */
623 if ((rdn != NULL) && (PyList_Size(rdn) > 0)) {
624 rdnt = PyList_AsTuple(rdn);
625 Py_DECREF(rdn);
626 if (rdnt == NULL)
627 goto fail0;
628 retcode = PyList_Append(dn, rdnt);
629 Py_DECREF(rdnt);
630 if (retcode < 0)
631 goto fail0;
632 }
633
634 /* convert list to tuple */
635 rdnt = PyList_AsTuple(dn);
636 Py_DECREF(dn);
637 if (rdnt == NULL)
638 return NULL;
639 return rdnt;
640
641 fail1:
642 Py_XDECREF(rdn);
643
644 fail0:
645 Py_XDECREF(dn);
646 return NULL;
647}
648
649static PyObject *
650_get_peer_alt_names (X509 *certificate) {
651
652 /* this code follows the procedure outlined in
653 OpenSSL's crypto/x509v3/v3_prn.c:X509v3_EXT_print()
654 function to extract the STACK_OF(GENERAL_NAME),
655 then iterates through the stack to add the
656 names. */
657
658 int i, j;
659 PyObject *peer_alt_names = Py_None;
660 PyObject *v, *t;
661 X509_EXTENSION *ext = NULL;
662 GENERAL_NAMES *names = NULL;
663 GENERAL_NAME *name;
664 X509V3_EXT_METHOD *method;
665 BIO *biobuf = NULL;
666 char buf[2048];
667 char *vptr;
668 int len;
Victor Stinner3f75cc52010-03-02 22:44:42 +0000669 /* Issue #2973: ASN1_item_d2i() API changed in OpenSSL 0.9.6m */
670#if OPENSSL_VERSION_NUMBER >= 0x009060dfL
671 const unsigned char *p;
672#else
Jeffrey Yasskin7937d932009-05-29 03:44:31 +0000673 unsigned char *p;
Victor Stinner3f75cc52010-03-02 22:44:42 +0000674#endif
Bill Janssen98d19da2007-09-10 21:51:02 +0000675
676 if (certificate == NULL)
677 return peer_alt_names;
678
679 /* get a memory buffer */
680 biobuf = BIO_new(BIO_s_mem());
681
682 i = 0;
683 while ((i = X509_get_ext_by_NID(
684 certificate, NID_subject_alt_name, i)) >= 0) {
685
686 if (peer_alt_names == Py_None) {
687 peer_alt_names = PyList_New(0);
688 if (peer_alt_names == NULL)
689 goto fail;
690 }
691
692 /* now decode the altName */
693 ext = X509_get_ext(certificate, i);
694 if(!(method = X509V3_EXT_get(ext))) {
695 PyErr_SetString(PySSLErrorObject,
696 ERRSTR("No method for internalizing subjectAltName!"));
697 goto fail;
698 }
699
700 p = ext->value->data;
Neal Norwitze9057ff2008-01-27 17:10:35 +0000701 if (method->it)
Bill Janssen98d19da2007-09-10 21:51:02 +0000702 names = (GENERAL_NAMES*) (ASN1_item_d2i(NULL,
703 &p,
704 ext->value->length,
705 ASN1_ITEM_ptr(method->it)));
706 else
707 names = (GENERAL_NAMES*) (method->d2i(NULL,
708 &p,
709 ext->value->length));
710
711 for(j = 0; j < sk_GENERAL_NAME_num(names); j++) {
712
713 /* get a rendering of each name in the set of names */
714
715 name = sk_GENERAL_NAME_value(names, j);
716 if (name->type == GEN_DIRNAME) {
717
718 /* we special-case DirName as a tuple of tuples of attributes */
719
720 t = PyTuple_New(2);
721 if (t == NULL) {
722 goto fail;
723 }
724
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000725 v = PyString_FromString("DirName");
Bill Janssen98d19da2007-09-10 21:51:02 +0000726 if (v == NULL) {
727 Py_DECREF(t);
728 goto fail;
729 }
730 PyTuple_SET_ITEM(t, 0, v);
731
732 v = _create_tuple_for_X509_NAME (name->d.dirn);
733 if (v == NULL) {
734 Py_DECREF(t);
735 goto fail;
736 }
737 PyTuple_SET_ITEM(t, 1, v);
738
739 } else {
740
741 /* for everything else, we use the OpenSSL print form */
742
743 (void) BIO_reset(biobuf);
744 GENERAL_NAME_print(biobuf, name);
745 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
746 if (len < 0) {
747 _setSSLError(NULL, 0, __FILE__, __LINE__);
748 goto fail;
749 }
750 vptr = strchr(buf, ':');
751 if (vptr == NULL)
752 goto fail;
753 t = PyTuple_New(2);
754 if (t == NULL)
755 goto fail;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000756 v = PyString_FromStringAndSize(buf, (vptr - buf));
Bill Janssen98d19da2007-09-10 21:51:02 +0000757 if (v == NULL) {
758 Py_DECREF(t);
759 goto fail;
760 }
761 PyTuple_SET_ITEM(t, 0, v);
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000762 v = PyString_FromStringAndSize((vptr + 1), (len - (vptr - buf + 1)));
Bill Janssen98d19da2007-09-10 21:51:02 +0000763 if (v == NULL) {
764 Py_DECREF(t);
765 goto fail;
766 }
767 PyTuple_SET_ITEM(t, 1, v);
768 }
769
770 /* and add that rendering to the list */
771
772 if (PyList_Append(peer_alt_names, t) < 0) {
773 Py_DECREF(t);
774 goto fail;
775 }
776 Py_DECREF(t);
777 }
778 }
779 BIO_free(biobuf);
780 if (peer_alt_names != Py_None) {
781 v = PyList_AsTuple(peer_alt_names);
782 Py_DECREF(peer_alt_names);
783 return v;
784 } else {
785 return peer_alt_names;
786 }
787
788
789 fail:
790 if (biobuf != NULL)
791 BIO_free(biobuf);
792
793 if (peer_alt_names != Py_None) {
794 Py_XDECREF(peer_alt_names);
795 }
796
797 return NULL;
798}
799
800static PyObject *
801_decode_certificate (X509 *certificate, int verbose) {
802
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000803 PyObject *retval = NULL;
804 BIO *biobuf = NULL;
Neal Norwitz049da9e2007-08-25 16:41:36 +0000805 PyObject *peer;
Bill Janssen98d19da2007-09-10 21:51:02 +0000806 PyObject *peer_alt_names = NULL;
Neal Norwitz049da9e2007-08-25 16:41:36 +0000807 PyObject *issuer;
808 PyObject *version;
Bill Janssen98d19da2007-09-10 21:51:02 +0000809 PyObject *sn_obj;
810 ASN1_INTEGER *serialNumber;
Neal Norwitz049da9e2007-08-25 16:41:36 +0000811 char buf[2048];
812 int len;
813 ASN1_TIME *notBefore, *notAfter;
814 PyObject *pnotBefore, *pnotAfter;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000815
816 retval = PyDict_New();
817 if (retval == NULL)
818 return NULL;
819
Bill Janssenffe576d2007-09-05 00:46:27 +0000820 peer = _create_tuple_for_X509_NAME(
Bill Janssen98d19da2007-09-10 21:51:02 +0000821 X509_get_subject_name(certificate));
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000822 if (peer == NULL)
823 goto fail0;
824 if (PyDict_SetItemString(retval, (const char *) "subject", peer) < 0) {
825 Py_DECREF(peer);
826 goto fail0;
827 }
828 Py_DECREF(peer);
829
Bill Janssen98d19da2007-09-10 21:51:02 +0000830 if (verbose) {
831 issuer = _create_tuple_for_X509_NAME(
832 X509_get_issuer_name(certificate));
833 if (issuer == NULL)
834 goto fail0;
835 if (PyDict_SetItemString(retval, (const char *)"issuer", issuer) < 0) {
836 Py_DECREF(issuer);
837 goto fail0;
838 }
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000839 Py_DECREF(issuer);
Bill Janssen98d19da2007-09-10 21:51:02 +0000840
841 version = PyInt_FromLong(X509_get_version(certificate) + 1);
842 if (PyDict_SetItemString(retval, "version", version) < 0) {
843 Py_DECREF(version);
844 goto fail0;
845 }
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000846 Py_DECREF(version);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000847 }
Bill Janssen98d19da2007-09-10 21:51:02 +0000848
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000849 /* get a memory buffer */
850 biobuf = BIO_new(BIO_s_mem());
Bill Janssen98d19da2007-09-10 21:51:02 +0000851
852 if (verbose) {
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000853
Bill Janssen98d19da2007-09-10 21:51:02 +0000854 (void) BIO_reset(biobuf);
855 serialNumber = X509_get_serialNumber(certificate);
856 /* should not exceed 20 octets, 160 bits, so buf is big enough */
857 i2a_ASN1_INTEGER(biobuf, serialNumber);
858 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
859 if (len < 0) {
860 _setSSLError(NULL, 0, __FILE__, __LINE__);
861 goto fail1;
862 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000863 sn_obj = PyString_FromStringAndSize(buf, len);
Bill Janssen98d19da2007-09-10 21:51:02 +0000864 if (sn_obj == NULL)
865 goto fail1;
866 if (PyDict_SetItemString(retval, "serialNumber", sn_obj) < 0) {
867 Py_DECREF(sn_obj);
868 goto fail1;
869 }
870 Py_DECREF(sn_obj);
871
872 (void) BIO_reset(biobuf);
873 notBefore = X509_get_notBefore(certificate);
874 ASN1_TIME_print(biobuf, notBefore);
875 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
876 if (len < 0) {
877 _setSSLError(NULL, 0, __FILE__, __LINE__);
878 goto fail1;
879 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000880 pnotBefore = PyString_FromStringAndSize(buf, len);
Bill Janssen98d19da2007-09-10 21:51:02 +0000881 if (pnotBefore == NULL)
882 goto fail1;
883 if (PyDict_SetItemString(retval, "notBefore", pnotBefore) < 0) {
884 Py_DECREF(pnotBefore);
885 goto fail1;
886 }
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000887 Py_DECREF(pnotBefore);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000888 }
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000889
Guido van Rossum780b80d2007-08-27 18:42:23 +0000890 (void) BIO_reset(biobuf);
Bill Janssen98d19da2007-09-10 21:51:02 +0000891 notAfter = X509_get_notAfter(certificate);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000892 ASN1_TIME_print(biobuf, notAfter);
893 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
Bill Janssen98d19da2007-09-10 21:51:02 +0000894 if (len < 0) {
895 _setSSLError(NULL, 0, __FILE__, __LINE__);
896 goto fail1;
897 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000898 pnotAfter = PyString_FromStringAndSize(buf, len);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000899 if (pnotAfter == NULL)
Bill Janssen98d19da2007-09-10 21:51:02 +0000900 goto fail1;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000901 if (PyDict_SetItemString(retval, "notAfter", pnotAfter) < 0) {
902 Py_DECREF(pnotAfter);
Bill Janssen98d19da2007-09-10 21:51:02 +0000903 goto fail1;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000904 }
905 Py_DECREF(pnotAfter);
Bill Janssen98d19da2007-09-10 21:51:02 +0000906
907 /* Now look for subjectAltName */
908
909 peer_alt_names = _get_peer_alt_names(certificate);
910 if (peer_alt_names == NULL)
911 goto fail1;
912 else if (peer_alt_names != Py_None) {
913 if (PyDict_SetItemString(retval, "subjectAltName",
914 peer_alt_names) < 0) {
915 Py_DECREF(peer_alt_names);
916 goto fail1;
917 }
918 Py_DECREF(peer_alt_names);
919 }
920
921 BIO_free(biobuf);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000922 return retval;
923
924 fail1:
925 if (biobuf != NULL)
926 BIO_free(biobuf);
927 fail0:
928 Py_XDECREF(retval);
929 return NULL;
930}
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000931
Bill Janssen98d19da2007-09-10 21:51:02 +0000932
933static PyObject *
934PySSL_test_decode_certificate (PyObject *mod, PyObject *args) {
935
936 PyObject *retval = NULL;
937 char *filename = NULL;
938 X509 *x=NULL;
939 BIO *cert;
940 int verbose = 1;
941
942 if (!PyArg_ParseTuple(args, "s|i:test_decode_certificate", &filename, &verbose))
943 return NULL;
944
945 if ((cert=BIO_new(BIO_s_file())) == NULL) {
946 PyErr_SetString(PySSLErrorObject, "Can't malloc memory to read file");
947 goto fail0;
948 }
949
950 if (BIO_read_filename(cert,filename) <= 0) {
951 PyErr_SetString(PySSLErrorObject, "Can't open file");
952 goto fail0;
953 }
954
955 x = PEM_read_bio_X509_AUX(cert,NULL, NULL, NULL);
956 if (x == NULL) {
957 PyErr_SetString(PySSLErrorObject, "Error decoding PEM-encoded file");
958 goto fail0;
959 }
960
961 retval = _decode_certificate(x, verbose);
962
963 fail0:
964
965 if (cert != NULL) BIO_free(cert);
966 return retval;
967}
968
969
970static PyObject *
971PySSL_peercert(PySSLObject *self, PyObject *args)
972{
973 PyObject *retval = NULL;
974 int len;
975 int verification;
976 PyObject *binary_mode = Py_None;
977
978 if (!PyArg_ParseTuple(args, "|O:peer_certificate", &binary_mode))
979 return NULL;
980
981 if (!self->peer_cert)
982 Py_RETURN_NONE;
983
984 if (PyObject_IsTrue(binary_mode)) {
985 /* return cert in DER-encoded format */
986
987 unsigned char *bytes_buf = NULL;
988
989 bytes_buf = NULL;
990 len = i2d_X509(self->peer_cert, &bytes_buf);
991 if (len < 0) {
992 PySSL_SetError(self, len, __FILE__, __LINE__);
993 return NULL;
994 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000995 retval = PyString_FromStringAndSize((const char *) bytes_buf, len);
Bill Janssen98d19da2007-09-10 21:51:02 +0000996 OPENSSL_free(bytes_buf);
997 return retval;
998
999 } else {
1000
1001 verification = SSL_CTX_get_verify_mode(self->ctx);
1002 if ((verification & SSL_VERIFY_PEER) == 0)
1003 return PyDict_New();
1004 else
1005 return _decode_certificate (self->peer_cert, 0);
1006 }
1007}
1008
1009PyDoc_STRVAR(PySSL_peercert_doc,
1010"peer_certificate([der=False]) -> certificate\n\
1011\n\
1012Returns the certificate for the peer. If no certificate was provided,\n\
1013returns None. If a certificate was provided, but not validated, returns\n\
1014an empty dictionary. Otherwise returns a dict containing information\n\
1015about the peer certificate.\n\
1016\n\
1017If the optional argument is True, returns a DER-encoded copy of the\n\
1018peer certificate, or None if no certificate was provided. This will\n\
1019return the certificate even if it wasn't validated.");
1020
1021static PyObject *PySSL_cipher (PySSLObject *self) {
1022
1023 PyObject *retval, *v;
1024 SSL_CIPHER *current;
1025 char *cipher_name;
1026 char *cipher_protocol;
1027
1028 if (self->ssl == NULL)
1029 return Py_None;
1030 current = SSL_get_current_cipher(self->ssl);
1031 if (current == NULL)
1032 return Py_None;
1033
1034 retval = PyTuple_New(3);
1035 if (retval == NULL)
1036 return NULL;
1037
1038 cipher_name = (char *) SSL_CIPHER_get_name(current);
1039 if (cipher_name == NULL) {
1040 PyTuple_SET_ITEM(retval, 0, Py_None);
1041 } else {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001042 v = PyString_FromString(cipher_name);
Bill Janssen98d19da2007-09-10 21:51:02 +00001043 if (v == NULL)
1044 goto fail0;
1045 PyTuple_SET_ITEM(retval, 0, v);
1046 }
1047 cipher_protocol = SSL_CIPHER_get_version(current);
1048 if (cipher_protocol == NULL) {
1049 PyTuple_SET_ITEM(retval, 1, Py_None);
1050 } else {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001051 v = PyString_FromString(cipher_protocol);
Bill Janssen98d19da2007-09-10 21:51:02 +00001052 if (v == NULL)
1053 goto fail0;
1054 PyTuple_SET_ITEM(retval, 1, v);
1055 }
1056 v = PyInt_FromLong(SSL_CIPHER_get_bits(current, NULL));
1057 if (v == NULL)
1058 goto fail0;
1059 PyTuple_SET_ITEM(retval, 2, v);
1060 return retval;
1061
1062 fail0:
1063 Py_DECREF(retval);
1064 return NULL;
1065}
1066
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001067static void PySSL_dealloc(PySSLObject *self)
1068{
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001069 if (self->peer_cert) /* Possible not to have one? */
1070 X509_free (self->peer_cert);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001071 if (self->ssl)
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001072 SSL_free(self->ssl);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001073 if (self->ctx)
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001074 SSL_CTX_free(self->ctx);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001075 Py_XDECREF(self->Socket);
1076 PyObject_Del(self);
1077}
1078
Anthony Baxter93ab5fa2006-07-11 02:04:09 +00001079/* If the socket has a timeout, do a select()/poll() on the socket.
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001080 The argument writing indicates the direction.
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001081 Returns one of the possibilities in the timeout_state enum (above).
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001082 */
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001083
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001084static int
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001085check_socket_and_wait_for_timeout(PySocketSockObject *s, int writing)
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001086{
1087 fd_set fds;
1088 struct timeval tv;
1089 int rc;
1090
1091 /* Nothing to do unless we're in timeout mode (not non-blocking) */
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001092 if (s->sock_timeout < 0.0)
1093 return SOCKET_IS_BLOCKING;
1094 else if (s->sock_timeout == 0.0)
1095 return SOCKET_IS_NONBLOCKING;
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001096
1097 /* Guard against closed socket */
1098 if (s->sock_fd < 0)
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001099 return SOCKET_HAS_BEEN_CLOSED;
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001100
Anthony Baxter93ab5fa2006-07-11 02:04:09 +00001101 /* Prefer poll, if available, since you can poll() any fd
1102 * which can't be done with select(). */
1103#ifdef HAVE_POLL
1104 {
1105 struct pollfd pollfd;
1106 int timeout;
1107
1108 pollfd.fd = s->sock_fd;
1109 pollfd.events = writing ? POLLOUT : POLLIN;
1110
1111 /* s->sock_timeout is in seconds, timeout in ms */
1112 timeout = (int)(s->sock_timeout * 1000 + 0.5);
Bill Janssen98d19da2007-09-10 21:51:02 +00001113 PySSL_BEGIN_ALLOW_THREADS
Anthony Baxter93ab5fa2006-07-11 02:04:09 +00001114 rc = poll(&pollfd, 1, timeout);
Bill Janssen98d19da2007-09-10 21:51:02 +00001115 PySSL_END_ALLOW_THREADS
Anthony Baxter93ab5fa2006-07-11 02:04:09 +00001116
1117 goto normal_return;
1118 }
1119#endif
1120
Neal Norwitz082b2df2006-02-07 07:04:46 +00001121 /* Guard against socket too large for select*/
Martin v. Löwisf84d1b92006-02-11 09:27:05 +00001122#ifndef Py_SOCKET_FD_CAN_BE_GE_FD_SETSIZE
Neal Norwitz082b2df2006-02-07 07:04:46 +00001123 if (s->sock_fd >= FD_SETSIZE)
Neal Norwitz389cea82006-02-13 00:35:21 +00001124 return SOCKET_TOO_LARGE_FOR_SELECT;
Martin v. Löwisf84d1b92006-02-11 09:27:05 +00001125#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +00001126
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001127 /* Construct the arguments to select */
1128 tv.tv_sec = (int)s->sock_timeout;
1129 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
1130 FD_ZERO(&fds);
1131 FD_SET(s->sock_fd, &fds);
1132
1133 /* See if the socket is ready */
Bill Janssen98d19da2007-09-10 21:51:02 +00001134 PySSL_BEGIN_ALLOW_THREADS
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001135 if (writing)
1136 rc = select(s->sock_fd+1, NULL, &fds, NULL, &tv);
1137 else
1138 rc = select(s->sock_fd+1, &fds, NULL, NULL, &tv);
Bill Janssen98d19da2007-09-10 21:51:02 +00001139 PySSL_END_ALLOW_THREADS
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001140
Bill Janssen934b16d2008-06-28 22:19:33 +00001141#ifdef HAVE_POLL
Anthony Baxter93ab5fa2006-07-11 02:04:09 +00001142normal_return:
Bill Janssen934b16d2008-06-28 22:19:33 +00001143#endif
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001144 /* Return SOCKET_TIMED_OUT on timeout, SOCKET_OPERATION_OK otherwise
1145 (when we are able to write or when there's something to read) */
1146 return rc == 0 ? SOCKET_HAS_TIMED_OUT : SOCKET_OPERATION_OK;
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001147}
1148
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001149static PyObject *PySSL_SSLwrite(PySSLObject *self, PyObject *args)
1150{
Antoine Pitrou5ba84912009-10-19 17:59:07 +00001151 Py_buffer buf;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001152 int len;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001153 int sockstate;
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001154 int err;
Bill Janssen934b16d2008-06-28 22:19:33 +00001155 int nonblocking;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001156
Antoine Pitrou5ba84912009-10-19 17:59:07 +00001157 if (!PyArg_ParseTuple(args, "s*:write", &buf))
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001158 return NULL;
1159
Bill Janssen934b16d2008-06-28 22:19:33 +00001160 /* just in case the blocking state of the socket has been changed */
1161 nonblocking = (self->Socket->sock_timeout >= 0.0);
1162 BIO_set_nbio(SSL_get_rbio(self->ssl), nonblocking);
1163 BIO_set_nbio(SSL_get_wbio(self->ssl), nonblocking);
1164
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001165 sockstate = check_socket_and_wait_for_timeout(self->Socket, 1);
1166 if (sockstate == SOCKET_HAS_TIMED_OUT) {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001167 PyErr_SetString(PySSLErrorObject,
1168 "The write operation timed out");
Antoine Pitrou5ba84912009-10-19 17:59:07 +00001169 goto error;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001170 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001171 PyErr_SetString(PySSLErrorObject,
1172 "Underlying socket has been closed.");
Antoine Pitrou5ba84912009-10-19 17:59:07 +00001173 goto error;
Neal Norwitz389cea82006-02-13 00:35:21 +00001174 } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001175 PyErr_SetString(PySSLErrorObject,
1176 "Underlying socket too large for select().");
Antoine Pitrou5ba84912009-10-19 17:59:07 +00001177 goto error;
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001178 }
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001179 do {
1180 err = 0;
Bill Janssen98d19da2007-09-10 21:51:02 +00001181 PySSL_BEGIN_ALLOW_THREADS
Antoine Pitrou5ba84912009-10-19 17:59:07 +00001182 len = SSL_write(self->ssl, buf.buf, buf.len);
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001183 err = SSL_get_error(self->ssl, len);
Bill Janssen98d19da2007-09-10 21:51:02 +00001184 PySSL_END_ALLOW_THREADS
Antoine Pitrou5ba84912009-10-19 17:59:07 +00001185 if (PyErr_CheckSignals()) {
1186 goto error;
Martin v. Löwisafec8e32003-06-28 07:40:23 +00001187 }
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001188 if (err == SSL_ERROR_WANT_READ) {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001189 sockstate =
1190 check_socket_and_wait_for_timeout(self->Socket, 0);
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001191 } else if (err == SSL_ERROR_WANT_WRITE) {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001192 sockstate =
1193 check_socket_and_wait_for_timeout(self->Socket, 1);
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001194 } else {
1195 sockstate = SOCKET_OPERATION_OK;
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001196 }
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001197 if (sockstate == SOCKET_HAS_TIMED_OUT) {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001198 PyErr_SetString(PySSLErrorObject,
1199 "The write operation timed out");
Antoine Pitrou5ba84912009-10-19 17:59:07 +00001200 goto error;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001201 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001202 PyErr_SetString(PySSLErrorObject,
1203 "Underlying socket has been closed.");
Antoine Pitrou5ba84912009-10-19 17:59:07 +00001204 goto error;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001205 } else if (sockstate == SOCKET_IS_NONBLOCKING) {
1206 break;
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001207 }
1208 } while (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE);
Antoine Pitrou5ba84912009-10-19 17:59:07 +00001209
1210 PyBuffer_Release(&buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001211 if (len > 0)
1212 return PyInt_FromLong(len);
1213 else
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001214 return PySSL_SetError(self, len, __FILE__, __LINE__);
Antoine Pitrou5ba84912009-10-19 17:59:07 +00001215
1216error:
1217 PyBuffer_Release(&buf);
1218 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001219}
1220
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001221PyDoc_STRVAR(PySSL_SSLwrite_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001222"write(s) -> len\n\
1223\n\
1224Writes the string s into the SSL object. Returns the number\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001225of bytes written.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001226
Bill Janssen934b16d2008-06-28 22:19:33 +00001227static PyObject *PySSL_SSLpending(PySSLObject *self)
1228{
1229 int count = 0;
1230
1231 PySSL_BEGIN_ALLOW_THREADS
1232 count = SSL_pending(self->ssl);
1233 PySSL_END_ALLOW_THREADS
1234 if (count < 0)
1235 return PySSL_SetError(self, count, __FILE__, __LINE__);
1236 else
1237 return PyInt_FromLong(count);
1238}
1239
1240PyDoc_STRVAR(PySSL_SSLpending_doc,
1241"pending() -> count\n\
1242\n\
1243Returns the number of already decrypted bytes available for read,\n\
1244pending on the connection.\n");
1245
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001246static PyObject *PySSL_SSLread(PySSLObject *self, PyObject *args)
1247{
1248 PyObject *buf;
1249 int count = 0;
1250 int len = 1024;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001251 int sockstate;
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001252 int err;
Bill Janssen934b16d2008-06-28 22:19:33 +00001253 int nonblocking;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001254
1255 if (!PyArg_ParseTuple(args, "|i:read", &len))
1256 return NULL;
1257
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001258 if (!(buf = PyString_FromStringAndSize((char *) 0, len)))
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001259 return NULL;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001260
Bill Janssen934b16d2008-06-28 22:19:33 +00001261 /* just in case the blocking state of the socket has been changed */
1262 nonblocking = (self->Socket->sock_timeout >= 0.0);
1263 BIO_set_nbio(SSL_get_rbio(self->ssl), nonblocking);
1264 BIO_set_nbio(SSL_get_wbio(self->ssl), nonblocking);
1265
Georg Brandl43f08a82006-03-31 18:01:16 +00001266 /* first check if there are bytes ready to be read */
Bill Janssen98d19da2007-09-10 21:51:02 +00001267 PySSL_BEGIN_ALLOW_THREADS
Georg Brandl43f08a82006-03-31 18:01:16 +00001268 count = SSL_pending(self->ssl);
Bill Janssen98d19da2007-09-10 21:51:02 +00001269 PySSL_END_ALLOW_THREADS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001270
Georg Brandl43f08a82006-03-31 18:01:16 +00001271 if (!count) {
1272 sockstate = check_socket_and_wait_for_timeout(self->Socket, 0);
1273 if (sockstate == SOCKET_HAS_TIMED_OUT) {
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001274 PyErr_SetString(PySSLErrorObject,
1275 "The read operation timed out");
Georg Brandl43f08a82006-03-31 18:01:16 +00001276 Py_DECREF(buf);
1277 return NULL;
1278 } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001279 PyErr_SetString(PySSLErrorObject,
1280 "Underlying socket too large for select().");
1281 Py_DECREF(buf);
Georg Brandl43f08a82006-03-31 18:01:16 +00001282 return NULL;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001283 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
Bill Janssen934b16d2008-06-28 22:19:33 +00001284 if (SSL_get_shutdown(self->ssl) !=
1285 SSL_RECEIVED_SHUTDOWN)
1286 {
1287 Py_DECREF(buf);
1288 PyErr_SetString(PySSLErrorObject,
1289 "Socket closed without SSL shutdown handshake");
1290 return NULL;
1291 } else {
1292 /* should contain a zero-length string */
1293 _PyString_Resize(&buf, 0);
1294 return buf;
1295 }
Georg Brandl43f08a82006-03-31 18:01:16 +00001296 }
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001297 }
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001298 do {
1299 err = 0;
Bill Janssen98d19da2007-09-10 21:51:02 +00001300 PySSL_BEGIN_ALLOW_THREADS
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001301 count = SSL_read(self->ssl, PyString_AsString(buf), len);
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001302 err = SSL_get_error(self->ssl, count);
Bill Janssen98d19da2007-09-10 21:51:02 +00001303 PySSL_END_ALLOW_THREADS
Martin v. Löwisafec8e32003-06-28 07:40:23 +00001304 if(PyErr_CheckSignals()) {
1305 Py_DECREF(buf);
1306 return NULL;
1307 }
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001308 if (err == SSL_ERROR_WANT_READ) {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001309 sockstate =
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001310 check_socket_and_wait_for_timeout(self->Socket, 0);
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001311 } else if (err == SSL_ERROR_WANT_WRITE) {
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001312 sockstate =
1313 check_socket_and_wait_for_timeout(self->Socket, 1);
1314 } else if ((err == SSL_ERROR_ZERO_RETURN) &&
1315 (SSL_get_shutdown(self->ssl) ==
Guido van Rossum780b80d2007-08-27 18:42:23 +00001316 SSL_RECEIVED_SHUTDOWN))
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001317 {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001318 _PyString_Resize(&buf, 0);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001319 return buf;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001320 } else {
1321 sockstate = SOCKET_OPERATION_OK;
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001322 }
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001323 if (sockstate == SOCKET_HAS_TIMED_OUT) {
1324 PyErr_SetString(PySSLErrorObject,
1325 "The read operation timed out");
Martin v. Löwisafec8e32003-06-28 07:40:23 +00001326 Py_DECREF(buf);
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001327 return NULL;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001328 } else if (sockstate == SOCKET_IS_NONBLOCKING) {
1329 break;
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001330 }
1331 } while (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001332 if (count <= 0) {
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001333 Py_DECREF(buf);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001334 return PySSL_SetError(self, count, __FILE__, __LINE__);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001335 }
Tim Peters5de98422002-04-27 18:44:32 +00001336 if (count != len)
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001337 _PyString_Resize(&buf, count);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001338 return buf;
1339}
1340
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001341PyDoc_STRVAR(PySSL_SSLread_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001342"read([len]) -> string\n\
1343\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001344Read up to len bytes from the SSL socket.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001345
Bill Janssen934b16d2008-06-28 22:19:33 +00001346static PyObject *PySSL_SSLshutdown(PySSLObject *self)
1347{
1348 int err;
1349
1350 /* Guard against closed socket */
1351 if (self->Socket->sock_fd < 0) {
1352 PyErr_SetString(PySSLErrorObject,
1353 "Underlying socket has been closed.");
1354 return NULL;
1355 }
1356
1357 PySSL_BEGIN_ALLOW_THREADS
1358 err = SSL_shutdown(self->ssl);
1359 if (err == 0) {
1360 /* we need to call it again to finish the shutdown */
1361 err = SSL_shutdown(self->ssl);
1362 }
1363 PySSL_END_ALLOW_THREADS
1364
1365 if (err < 0)
1366 return PySSL_SetError(self, err, __FILE__, __LINE__);
1367 else {
1368 Py_INCREF(self->Socket);
1369 return (PyObject *) (self->Socket);
1370 }
1371}
1372
1373PyDoc_STRVAR(PySSL_SSLshutdown_doc,
1374"shutdown(s) -> socket\n\
1375\n\
1376Does the SSL shutdown handshake with the remote end, and returns\n\
1377the underlying socket object.");
1378
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001379static PyMethodDef PySSLMethods[] = {
Bill Janssen934b16d2008-06-28 22:19:33 +00001380 {"do_handshake", (PyCFunction)PySSL_SSLdo_handshake, METH_NOARGS},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001381 {"write", (PyCFunction)PySSL_SSLwrite, METH_VARARGS,
Bill Janssen98d19da2007-09-10 21:51:02 +00001382 PySSL_SSLwrite_doc},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001383 {"read", (PyCFunction)PySSL_SSLread, METH_VARARGS,
Bill Janssen98d19da2007-09-10 21:51:02 +00001384 PySSL_SSLread_doc},
Bill Janssen934b16d2008-06-28 22:19:33 +00001385 {"pending", (PyCFunction)PySSL_SSLpending, METH_NOARGS,
1386 PySSL_SSLpending_doc},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001387 {"server", (PyCFunction)PySSL_server, METH_NOARGS},
1388 {"issuer", (PyCFunction)PySSL_issuer, METH_NOARGS},
Bill Janssen98d19da2007-09-10 21:51:02 +00001389 {"peer_certificate", (PyCFunction)PySSL_peercert, METH_VARARGS,
1390 PySSL_peercert_doc},
1391 {"cipher", (PyCFunction)PySSL_cipher, METH_NOARGS},
Bill Janssen934b16d2008-06-28 22:19:33 +00001392 {"shutdown", (PyCFunction)PySSL_SSLshutdown, METH_NOARGS,
1393 PySSL_SSLshutdown_doc},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001394 {NULL, NULL}
1395};
1396
1397static PyObject *PySSL_getattr(PySSLObject *self, char *name)
1398{
1399 return Py_FindMethod(PySSLMethods, (PyObject *)self, name);
1400}
1401
Jeremy Hylton938ace62002-07-17 16:30:39 +00001402static PyTypeObject PySSL_Type = {
Martin v. Löwis68192102007-07-21 06:55:02 +00001403 PyVarObject_HEAD_INIT(NULL, 0)
Guido van Rossum780b80d2007-08-27 18:42:23 +00001404 "ssl.SSLContext", /*tp_name*/
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001405 sizeof(PySSLObject), /*tp_basicsize*/
1406 0, /*tp_itemsize*/
1407 /* methods */
1408 (destructor)PySSL_dealloc, /*tp_dealloc*/
1409 0, /*tp_print*/
1410 (getattrfunc)PySSL_getattr, /*tp_getattr*/
1411 0, /*tp_setattr*/
1412 0, /*tp_compare*/
1413 0, /*tp_repr*/
1414 0, /*tp_as_number*/
1415 0, /*tp_as_sequence*/
1416 0, /*tp_as_mapping*/
1417 0, /*tp_hash*/
1418};
1419
1420#ifdef HAVE_OPENSSL_RAND
1421
1422/* helper routines for seeding the SSL PRNG */
1423static PyObject *
1424PySSL_RAND_add(PyObject *self, PyObject *args)
1425{
1426 char *buf;
1427 int len;
1428 double entropy;
1429
1430 if (!PyArg_ParseTuple(args, "s#d:RAND_add", &buf, &len, &entropy))
1431 return NULL;
1432 RAND_add(buf, len, entropy);
1433 Py_INCREF(Py_None);
1434 return Py_None;
1435}
1436
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001437PyDoc_STRVAR(PySSL_RAND_add_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001438"RAND_add(string, entropy)\n\
1439\n\
1440Mix string into the OpenSSL PRNG state. entropy (a float) is a lower\n\
Bill Janssen98d19da2007-09-10 21:51:02 +00001441bound on the entropy contained in string. See RFC 1750.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001442
1443static PyObject *
1444PySSL_RAND_status(PyObject *self)
1445{
1446 return PyInt_FromLong(RAND_status());
1447}
1448
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001449PyDoc_STRVAR(PySSL_RAND_status_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001450"RAND_status() -> 0 or 1\n\
1451\n\
1452Returns 1 if the OpenSSL PRNG has been seeded with enough data and 0 if not.\n\
1453It is necessary to seed the PRNG with RAND_add() on some platforms before\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001454using the ssl() function.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001455
1456static PyObject *
1457PySSL_RAND_egd(PyObject *self, PyObject *arg)
1458{
1459 int bytes;
1460
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001461 if (!PyString_Check(arg))
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001462 return PyErr_Format(PyExc_TypeError,
1463 "RAND_egd() expected string, found %s",
Christian Heimese93237d2007-12-19 02:37:44 +00001464 Py_TYPE(arg)->tp_name);
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001465 bytes = RAND_egd(PyString_AS_STRING(arg));
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001466 if (bytes == -1) {
1467 PyErr_SetString(PySSLErrorObject,
1468 "EGD connection failed or EGD did not return "
1469 "enough data to seed the PRNG");
1470 return NULL;
1471 }
1472 return PyInt_FromLong(bytes);
1473}
1474
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001475PyDoc_STRVAR(PySSL_RAND_egd_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001476"RAND_egd(path) -> bytes\n\
1477\n\
Bill Janssen98d19da2007-09-10 21:51:02 +00001478Queries the entropy gather daemon (EGD) on the socket named by 'path'.\n\
1479Returns number of bytes read. Raises SSLError if connection to EGD\n\
1480fails or if it does provide enough data to seed PRNG.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001481
1482#endif
1483
1484/* List of functions exported by this module. */
1485
1486static PyMethodDef PySSL_methods[] = {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001487 {"sslwrap", PySSL_sslwrap,
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001488 METH_VARARGS, ssl_doc},
Bill Janssen98d19da2007-09-10 21:51:02 +00001489 {"_test_decode_cert", PySSL_test_decode_certificate,
1490 METH_VARARGS},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001491#ifdef HAVE_OPENSSL_RAND
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001492 {"RAND_add", PySSL_RAND_add, METH_VARARGS,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001493 PySSL_RAND_add_doc},
1494 {"RAND_egd", PySSL_RAND_egd, METH_O,
1495 PySSL_RAND_egd_doc},
1496 {"RAND_status", (PyCFunction)PySSL_RAND_status, METH_NOARGS,
1497 PySSL_RAND_status_doc},
1498#endif
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001499 {NULL, NULL} /* Sentinel */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001500};
1501
1502
Bill Janssen98d19da2007-09-10 21:51:02 +00001503#ifdef WITH_THREAD
1504
1505/* an implementation of OpenSSL threading operations in terms
1506 of the Python C thread library */
1507
1508static PyThread_type_lock *_ssl_locks = NULL;
1509
1510static unsigned long _ssl_thread_id_function (void) {
1511 return PyThread_get_thread_ident();
1512}
1513
1514static void _ssl_thread_locking_function (int mode, int n, const char *file, int line) {
1515 /* this function is needed to perform locking on shared data
1516 structures. (Note that OpenSSL uses a number of global data
1517 structures that will be implicitly shared whenever multiple threads
1518 use OpenSSL.) Multi-threaded applications will crash at random if
1519 it is not set.
1520
1521 locking_function() must be able to handle up to CRYPTO_num_locks()
1522 different mutex locks. It sets the n-th lock if mode & CRYPTO_LOCK, and
1523 releases it otherwise.
1524
1525 file and line are the file number of the function setting the
1526 lock. They can be useful for debugging.
1527 */
1528
1529 if ((_ssl_locks == NULL) ||
Neal Norwitz5802bb22008-03-27 05:03:11 +00001530 (n < 0) || ((unsigned)n >= _ssl_locks_count))
Bill Janssen98d19da2007-09-10 21:51:02 +00001531 return;
1532
1533 if (mode & CRYPTO_LOCK) {
1534 PyThread_acquire_lock(_ssl_locks[n], 1);
1535 } else {
1536 PyThread_release_lock(_ssl_locks[n]);
1537 }
1538}
1539
1540static int _setup_ssl_threads(void) {
1541
Neal Norwitz5802bb22008-03-27 05:03:11 +00001542 unsigned int i;
Bill Janssen98d19da2007-09-10 21:51:02 +00001543
1544 if (_ssl_locks == NULL) {
1545 _ssl_locks_count = CRYPTO_num_locks();
1546 _ssl_locks = (PyThread_type_lock *)
1547 malloc(sizeof(PyThread_type_lock) * _ssl_locks_count);
1548 if (_ssl_locks == NULL)
1549 return 0;
1550 memset(_ssl_locks, 0, sizeof(PyThread_type_lock) * _ssl_locks_count);
1551 for (i = 0; i < _ssl_locks_count; i++) {
1552 _ssl_locks[i] = PyThread_allocate_lock();
1553 if (_ssl_locks[i] == NULL) {
Raymond Hettinger354cfc12009-01-26 16:52:22 +00001554 unsigned int j;
Bill Janssen98d19da2007-09-10 21:51:02 +00001555 for (j = 0; j < i; j++) {
1556 PyThread_free_lock(_ssl_locks[j]);
1557 }
1558 free(_ssl_locks);
1559 return 0;
1560 }
1561 }
1562 CRYPTO_set_locking_callback(_ssl_thread_locking_function);
1563 CRYPTO_set_id_callback(_ssl_thread_id_function);
1564 }
1565 return 1;
1566}
1567
1568#endif /* def HAVE_THREAD */
1569
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001570PyDoc_STRVAR(module_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001571"Implementation module for SSL socket operations. See the socket module\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001572for documentation.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001573
Mark Hammondfe51c6d2002-08-02 02:27:13 +00001574PyMODINIT_FUNC
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001575init_ssl(void)
1576{
1577 PyObject *m, *d;
1578
Christian Heimese93237d2007-12-19 02:37:44 +00001579 Py_TYPE(&PySSL_Type) = &PyType_Type;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001580
1581 m = Py_InitModule3("_ssl", PySSL_methods, module_doc);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00001582 if (m == NULL)
1583 return;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001584 d = PyModule_GetDict(m);
1585
1586 /* Load _socket module and its C API */
1587 if (PySocketModule_ImportModuleAndAPI())
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001588 return;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001589
1590 /* Init OpenSSL */
1591 SSL_load_error_strings();
Bill Janssen98d19da2007-09-10 21:51:02 +00001592#ifdef WITH_THREAD
1593 /* note that this will start threading if not already started */
1594 if (!_setup_ssl_threads()) {
1595 return;
1596 }
1597#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001598 SSLeay_add_ssl_algorithms();
1599
1600 /* Add symbols to module dict */
Bill Janssen98d19da2007-09-10 21:51:02 +00001601 PySSLErrorObject = PyErr_NewException("ssl.SSLError",
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001602 PySocketModule.error,
1603 NULL);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001604 if (PySSLErrorObject == NULL)
1605 return;
Bill Janssen98d19da2007-09-10 21:51:02 +00001606 if (PyDict_SetItemString(d, "SSLError", PySSLErrorObject) != 0)
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001607 return;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001608 if (PyDict_SetItemString(d, "SSLType",
1609 (PyObject *)&PySSL_Type) != 0)
1610 return;
1611 PyModule_AddIntConstant(m, "SSL_ERROR_ZERO_RETURN",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001612 PY_SSL_ERROR_ZERO_RETURN);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001613 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_READ",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001614 PY_SSL_ERROR_WANT_READ);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001615 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_WRITE",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001616 PY_SSL_ERROR_WANT_WRITE);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001617 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_X509_LOOKUP",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001618 PY_SSL_ERROR_WANT_X509_LOOKUP);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001619 PyModule_AddIntConstant(m, "SSL_ERROR_SYSCALL",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001620 PY_SSL_ERROR_SYSCALL);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001621 PyModule_AddIntConstant(m, "SSL_ERROR_SSL",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001622 PY_SSL_ERROR_SSL);
1623 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_CONNECT",
1624 PY_SSL_ERROR_WANT_CONNECT);
1625 /* non ssl.h errorcodes */
1626 PyModule_AddIntConstant(m, "SSL_ERROR_EOF",
1627 PY_SSL_ERROR_EOF);
1628 PyModule_AddIntConstant(m, "SSL_ERROR_INVALID_ERROR_CODE",
1629 PY_SSL_ERROR_INVALID_ERROR_CODE);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001630 /* cert requirements */
1631 PyModule_AddIntConstant(m, "CERT_NONE",
1632 PY_SSL_CERT_NONE);
1633 PyModule_AddIntConstant(m, "CERT_OPTIONAL",
1634 PY_SSL_CERT_OPTIONAL);
1635 PyModule_AddIntConstant(m, "CERT_REQUIRED",
1636 PY_SSL_CERT_REQUIRED);
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001637
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001638 /* protocol versions */
1639 PyModule_AddIntConstant(m, "PROTOCOL_SSLv2",
1640 PY_SSL_VERSION_SSL2);
1641 PyModule_AddIntConstant(m, "PROTOCOL_SSLv3",
1642 PY_SSL_VERSION_SSL3);
1643 PyModule_AddIntConstant(m, "PROTOCOL_SSLv23",
1644 PY_SSL_VERSION_SSL23);
1645 PyModule_AddIntConstant(m, "PROTOCOL_TLSv1",
1646 PY_SSL_VERSION_TLS1);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001647}