blob: f5f9ebaeb1b4226b7692f9a6cda333c1904a508d [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?
12
Bill Janssen934b16d2008-06-28 22:19:33 +000013 XXX what about SSL_MODE_AUTO_RETRY?
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000014*/
15
16#include "Python.h"
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +000017
Bill Janssen98d19da2007-09-10 21:51:02 +000018#ifdef WITH_THREAD
19#include "pythread.h"
20#define PySSL_BEGIN_ALLOW_THREADS { \
Neal Norwitze9057ff2008-01-27 17:10:35 +000021 PyThreadState *_save = NULL; \
Bill Janssen98d19da2007-09-10 21:51:02 +000022 if (_ssl_locks_count>0) {_save = PyEval_SaveThread();}
23#define PySSL_BLOCK_THREADS if (_ssl_locks_count>0){PyEval_RestoreThread(_save)};
24#define PySSL_UNBLOCK_THREADS if (_ssl_locks_count>0){_save = PyEval_SaveThread()};
25#define PySSL_END_ALLOW_THREADS if (_ssl_locks_count>0){PyEval_RestoreThread(_save);} \
26 }
27
28#else /* no WITH_THREAD */
29
30#define PySSL_BEGIN_ALLOW_THREADS
31#define PySSL_BLOCK_THREADS
32#define PySSL_UNBLOCK_THREADS
33#define PySSL_END_ALLOW_THREADS
34
35#endif
36
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +000037enum py_ssl_error {
38 /* these mirror ssl.h */
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +000039 PY_SSL_ERROR_NONE,
40 PY_SSL_ERROR_SSL,
41 PY_SSL_ERROR_WANT_READ,
42 PY_SSL_ERROR_WANT_WRITE,
43 PY_SSL_ERROR_WANT_X509_LOOKUP,
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +000044 PY_SSL_ERROR_SYSCALL, /* look at error stack/return value/errno */
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +000045 PY_SSL_ERROR_ZERO_RETURN,
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +000046 PY_SSL_ERROR_WANT_CONNECT,
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +000047 /* start of non ssl.h errorcodes */
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +000048 PY_SSL_ERROR_EOF, /* special case of SSL_ERROR_SYSCALL */
49 PY_SSL_ERROR_INVALID_ERROR_CODE
50};
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000051
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +000052enum py_ssl_server_or_client {
53 PY_SSL_CLIENT,
54 PY_SSL_SERVER
55};
56
57enum py_ssl_cert_requirements {
58 PY_SSL_CERT_NONE,
59 PY_SSL_CERT_OPTIONAL,
60 PY_SSL_CERT_REQUIRED
61};
62
63enum py_ssl_version {
64 PY_SSL_VERSION_SSL2,
65 PY_SSL_VERSION_SSL3,
66 PY_SSL_VERSION_SSL23,
67 PY_SSL_VERSION_TLS1,
68};
69
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000070/* Include symbols from _socket module */
71#include "socketmodule.h"
72
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +000073#if defined(HAVE_POLL_H)
Anthony Baxter93ab5fa2006-07-11 02:04:09 +000074#include <poll.h>
75#elif defined(HAVE_SYS_POLL_H)
76#include <sys/poll.h>
77#endif
78
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000079/* Include OpenSSL header files */
80#include "openssl/rsa.h"
81#include "openssl/crypto.h"
82#include "openssl/x509.h"
Bill Janssen98d19da2007-09-10 21:51:02 +000083#include "openssl/x509v3.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000084#include "openssl/pem.h"
85#include "openssl/ssl.h"
86#include "openssl/err.h"
87#include "openssl/rand.h"
88
89/* SSL error object */
90static PyObject *PySSLErrorObject;
91
Bill Janssen98d19da2007-09-10 21:51:02 +000092#ifdef WITH_THREAD
93
94/* serves as a flag to see whether we've initialized the SSL thread support. */
95/* 0 means no, greater than 0 means yes */
96
97static unsigned int _ssl_locks_count = 0;
98
99#endif /* def WITH_THREAD */
100
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000101/* SSL socket object */
102
103#define X509_NAME_MAXLEN 256
104
105/* RAND_* APIs got added to OpenSSL in 0.9.5 */
106#if OPENSSL_VERSION_NUMBER >= 0x0090500fL
107# define HAVE_OPENSSL_RAND 1
108#else
109# undef HAVE_OPENSSL_RAND
110#endif
111
112typedef struct {
113 PyObject_HEAD
114 PySocketSockObject *Socket; /* Socket on which we're layered */
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000115 SSL_CTX* ctx;
116 SSL* ssl;
117 X509* peer_cert;
118 char server[X509_NAME_MAXLEN];
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000119 char issuer[X509_NAME_MAXLEN];
120
121} PySSLObject;
122
Jeremy Hylton938ace62002-07-17 16:30:39 +0000123static PyTypeObject PySSL_Type;
124static PyObject *PySSL_SSLwrite(PySSLObject *self, PyObject *args);
125static PyObject *PySSL_SSLread(PySSLObject *self, PyObject *args);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000126static int check_socket_and_wait_for_timeout(PySocketSockObject *s,
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +0000127 int writing);
Bill Janssen98d19da2007-09-10 21:51:02 +0000128static PyObject *PySSL_peercert(PySSLObject *self, PyObject *args);
129static PyObject *PySSL_cipher(PySSLObject *self);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000130
Christian Heimese93237d2007-12-19 02:37:44 +0000131#define PySSLObject_Check(v) (Py_TYPE(v) == &PySSL_Type)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000132
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +0000133typedef enum {
134 SOCKET_IS_NONBLOCKING,
135 SOCKET_IS_BLOCKING,
136 SOCKET_HAS_TIMED_OUT,
137 SOCKET_HAS_BEEN_CLOSED,
Neal Norwitz389cea82006-02-13 00:35:21 +0000138 SOCKET_TOO_LARGE_FOR_SELECT,
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +0000139 SOCKET_OPERATION_OK
140} timeout_state;
141
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000142/* Wrap error strings with filename and line # */
143#define STRINGIFY1(x) #x
144#define STRINGIFY2(x) STRINGIFY1(x)
145#define ERRSTR1(x,y,z) (x ":" y ": " z)
146#define ERRSTR(x) ERRSTR1("_ssl.c", STRINGIFY2(__LINE__), x)
147
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000148/* XXX It might be helpful to augment the error message generated
149 below with the name of the SSL function that generated the error.
150 I expect it's obvious most of the time.
151*/
152
153static PyObject *
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000154PySSL_SetError(PySSLObject *obj, int ret, char *filename, int lineno)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000155{
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000156 PyObject *v;
Neal Norwitz049da9e2007-08-25 16:41:36 +0000157 char buf[2048];
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000158 char *errstr;
159 int err;
Guido van Rossum780b80d2007-08-27 18:42:23 +0000160 enum py_ssl_error p = PY_SSL_ERROR_NONE;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000161
162 assert(ret <= 0);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000163
Bill Janssen98d19da2007-09-10 21:51:02 +0000164 if (obj->ssl != NULL) {
Guido van Rossum780b80d2007-08-27 18:42:23 +0000165 err = SSL_get_error(obj->ssl, ret);
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +0000166
Guido van Rossum780b80d2007-08-27 18:42:23 +0000167 switch (err) {
168 case SSL_ERROR_ZERO_RETURN:
169 errstr = "TLS/SSL connection has been closed";
170 p = PY_SSL_ERROR_ZERO_RETURN;
171 break;
172 case SSL_ERROR_WANT_READ:
173 errstr = "The operation did not complete (read)";
174 p = PY_SSL_ERROR_WANT_READ;
175 break;
176 case SSL_ERROR_WANT_WRITE:
177 p = PY_SSL_ERROR_WANT_WRITE;
178 errstr = "The operation did not complete (write)";
179 break;
180 case SSL_ERROR_WANT_X509_LOOKUP:
181 p = PY_SSL_ERROR_WANT_X509_LOOKUP;
182 errstr =
183 "The operation did not complete (X509 lookup)";
184 break;
185 case SSL_ERROR_WANT_CONNECT:
186 p = PY_SSL_ERROR_WANT_CONNECT;
187 errstr = "The operation did not complete (connect)";
188 break;
189 case SSL_ERROR_SYSCALL:
190 {
191 unsigned long e = ERR_get_error();
192 if (e == 0) {
193 if (ret == 0 || !obj->Socket) {
194 p = PY_SSL_ERROR_EOF;
195 errstr =
196 "EOF occurred in violation of protocol";
197 } else if (ret == -1) {
198 /* underlying BIO reported an I/O error */
199 return obj->Socket->errorhandler();
200 } else { /* possible? */
201 p = PY_SSL_ERROR_SYSCALL;
202 errstr = "Some I/O error occurred";
203 }
204 } else {
Jeremy Hylton4e547302002-07-02 18:25:00 +0000205 p = PY_SSL_ERROR_SYSCALL;
Guido van Rossum780b80d2007-08-27 18:42:23 +0000206 /* XXX Protected by global interpreter lock */
207 errstr = ERR_error_string(e, NULL);
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +0000208 }
Guido van Rossum780b80d2007-08-27 18:42:23 +0000209 break;
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +0000210 }
Guido van Rossum780b80d2007-08-27 18:42:23 +0000211 case SSL_ERROR_SSL:
212 {
213 unsigned long e = ERR_get_error();
214 p = PY_SSL_ERROR_SSL;
215 if (e != 0)
216 /* XXX Protected by global interpreter lock */
217 errstr = ERR_error_string(e, NULL);
218 else { /* possible? */
219 errstr =
220 "A failure in the SSL library occurred";
221 }
222 break;
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +0000223 }
Guido van Rossum780b80d2007-08-27 18:42:23 +0000224 default:
225 p = PY_SSL_ERROR_INVALID_ERROR_CODE;
226 errstr = "Invalid error code";
227 }
228 } else {
229 errstr = ERR_error_string(ERR_peek_last_error(), NULL);
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +0000230 }
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000231 PyOS_snprintf(buf, sizeof(buf), "_ssl.c:%d: %s", lineno, errstr);
232 v = Py_BuildValue("(is)", p, buf);
233 if (v != NULL) {
234 PyErr_SetObject(PySSLErrorObject, v);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000235 Py_DECREF(v);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000236 }
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000237 return NULL;
238}
239
Bill Janssen98d19da2007-09-10 21:51:02 +0000240static PyObject *
241_setSSLError (char *errstr, int errcode, char *filename, int lineno) {
242
243 char buf[2048];
244 PyObject *v;
245
246 if (errstr == NULL) {
247 errcode = ERR_peek_last_error();
248 errstr = ERR_error_string(errcode, NULL);
249 }
250 PyOS_snprintf(buf, sizeof(buf), "_ssl.c:%d: %s", lineno, errstr);
251 v = Py_BuildValue("(is)", errcode, buf);
252 if (v != NULL) {
253 PyErr_SetObject(PySSLErrorObject, v);
254 Py_DECREF(v);
255 }
256 return NULL;
257}
258
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000259static PySSLObject *
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000260newPySSLObject(PySocketSockObject *Sock, char *key_file, char *cert_file,
261 enum py_ssl_server_or_client socket_type,
262 enum py_ssl_cert_requirements certreq,
263 enum py_ssl_version proto_version,
264 char *cacerts_file)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000265{
266 PySSLObject *self;
267 char *errstr = NULL;
268 int ret;
Neal Norwitz049da9e2007-08-25 16:41:36 +0000269 int verification_mode;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000270
271 self = PyObject_New(PySSLObject, &PySSL_Type); /* Create new object */
Neal Norwitz38e3b7d2006-05-11 07:51:59 +0000272 if (self == NULL)
Neal Norwitzc6a989a2006-05-10 06:57:58 +0000273 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000274 memset(self->server, '\0', sizeof(char) * X509_NAME_MAXLEN);
275 memset(self->issuer, '\0', sizeof(char) * X509_NAME_MAXLEN);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000276 self->peer_cert = NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000277 self->ssl = NULL;
278 self->ctx = NULL;
279 self->Socket = NULL;
280
Bill Janssen98d19da2007-09-10 21:51:02 +0000281 /* Make sure the SSL error state is initialized */
282 (void) ERR_get_state();
283 ERR_clear_error();
284
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000285 if ((key_file && !cert_file) || (!key_file && cert_file)) {
Guido van Rossum780b80d2007-08-27 18:42:23 +0000286 errstr = ERRSTR("Both the key & certificate files "
287 "must be specified");
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000288 goto fail;
289 }
290
291 if ((socket_type == PY_SSL_SERVER) &&
292 ((key_file == NULL) || (cert_file == NULL))) {
Guido van Rossum780b80d2007-08-27 18:42:23 +0000293 errstr = ERRSTR("Both the key & certificate files "
294 "must be specified for server-side operation");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000295 goto fail;
296 }
297
Bill Janssen98d19da2007-09-10 21:51:02 +0000298 PySSL_BEGIN_ALLOW_THREADS
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000299 if (proto_version == PY_SSL_VERSION_TLS1)
300 self->ctx = SSL_CTX_new(TLSv1_method()); /* Set up context */
301 else if (proto_version == PY_SSL_VERSION_SSL3)
302 self->ctx = SSL_CTX_new(SSLv3_method()); /* Set up context */
303 else if (proto_version == PY_SSL_VERSION_SSL2)
304 self->ctx = SSL_CTX_new(SSLv2_method()); /* Set up context */
Bill Janssen98d19da2007-09-10 21:51:02 +0000305 else if (proto_version == PY_SSL_VERSION_SSL23)
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000306 self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */
Bill Janssen98d19da2007-09-10 21:51:02 +0000307 PySSL_END_ALLOW_THREADS
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000308
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000309 if (self->ctx == NULL) {
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000310 errstr = ERRSTR("Invalid SSL protocol variant specified.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000311 goto fail;
312 }
313
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000314 if (certreq != PY_SSL_CERT_NONE) {
315 if (cacerts_file == NULL) {
Guido van Rossum780b80d2007-08-27 18:42:23 +0000316 errstr = ERRSTR("No root certificates specified for "
317 "verification of other-side certificates.");
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000318 goto fail;
319 } else {
Bill Janssen98d19da2007-09-10 21:51:02 +0000320 PySSL_BEGIN_ALLOW_THREADS
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000321 ret = SSL_CTX_load_verify_locations(self->ctx,
Guido van Rossum780b80d2007-08-27 18:42:23 +0000322 cacerts_file,
323 NULL);
Bill Janssen98d19da2007-09-10 21:51:02 +0000324 PySSL_END_ALLOW_THREADS
Guido van Rossum780b80d2007-08-27 18:42:23 +0000325 if (ret != 1) {
Bill Janssen98d19da2007-09-10 21:51:02 +0000326 _setSSLError(NULL, 0, __FILE__, __LINE__);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000327 goto fail;
328 }
329 }
330 }
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000331 if (key_file) {
Bill Janssen98d19da2007-09-10 21:51:02 +0000332 PySSL_BEGIN_ALLOW_THREADS
Martin v. Löwis09c35f72002-07-28 09:57:45 +0000333 ret = SSL_CTX_use_PrivateKey_file(self->ctx, key_file,
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000334 SSL_FILETYPE_PEM);
Bill Janssen98d19da2007-09-10 21:51:02 +0000335 PySSL_END_ALLOW_THREADS
Guido van Rossum780b80d2007-08-27 18:42:23 +0000336 if (ret != 1) {
Bill Janssen98d19da2007-09-10 21:51:02 +0000337 _setSSLError(NULL, ret, __FILE__, __LINE__);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000338 goto fail;
339 }
340
Bill Janssen98d19da2007-09-10 21:51:02 +0000341 PySSL_BEGIN_ALLOW_THREADS
Martin v. Löwis09c35f72002-07-28 09:57:45 +0000342 ret = SSL_CTX_use_certificate_chain_file(self->ctx,
Bill Janssen98d19da2007-09-10 21:51:02 +0000343 cert_file);
344 PySSL_END_ALLOW_THREADS
Guido van Rossum780b80d2007-08-27 18:42:23 +0000345 if (ret != 1) {
Bill Janssen98d19da2007-09-10 21:51:02 +0000346 /*
347 fprintf(stderr, "ret is %d, errcode is %lu, %lu, with file \"%s\"\n",
348 ret, ERR_peek_error(), ERR_peek_last_error(), cert_file);
349 */
350 if (ERR_peek_last_error() != 0) {
351 _setSSLError(NULL, ret, __FILE__, __LINE__);
352 goto fail;
353 }
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000354 }
355 }
356
Bill Janssen98d19da2007-09-10 21:51:02 +0000357 /* ssl compatibility */
358 SSL_CTX_set_options(self->ctx, SSL_OP_ALL);
359
Neal Norwitz049da9e2007-08-25 16:41:36 +0000360 verification_mode = SSL_VERIFY_NONE;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000361 if (certreq == PY_SSL_CERT_OPTIONAL)
362 verification_mode = SSL_VERIFY_PEER;
363 else if (certreq == PY_SSL_CERT_REQUIRED)
364 verification_mode = (SSL_VERIFY_PEER |
365 SSL_VERIFY_FAIL_IF_NO_PEER_CERT);
366 SSL_CTX_set_verify(self->ctx, verification_mode,
367 NULL); /* set verify lvl */
368
Bill Janssen98d19da2007-09-10 21:51:02 +0000369 PySSL_BEGIN_ALLOW_THREADS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000370 self->ssl = SSL_new(self->ctx); /* New ssl struct */
Bill Janssen98d19da2007-09-10 21:51:02 +0000371 PySSL_END_ALLOW_THREADS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000372 SSL_set_fd(self->ssl, Sock->sock_fd); /* Set the socket for SSL */
Guido van Rossum4f707ac2003-01-31 18:13:18 +0000373
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000374 /* If the socket is in non-blocking mode or timeout mode, set the BIO
Guido van Rossum4f707ac2003-01-31 18:13:18 +0000375 * to non-blocking mode (blocking is the default)
376 */
377 if (Sock->sock_timeout >= 0.0) {
378 /* Set both the read and write BIO's to non-blocking mode */
379 BIO_set_nbio(SSL_get_rbio(self->ssl), 1);
380 BIO_set_nbio(SSL_get_wbio(self->ssl), 1);
381 }
382
Bill Janssen98d19da2007-09-10 21:51:02 +0000383 PySSL_BEGIN_ALLOW_THREADS
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000384 if (socket_type == PY_SSL_CLIENT)
385 SSL_set_connect_state(self->ssl);
386 else
387 SSL_set_accept_state(self->ssl);
Bill Janssen98d19da2007-09-10 21:51:02 +0000388 PySSL_END_ALLOW_THREADS
Martin v. Löwis09c35f72002-07-28 09:57:45 +0000389
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000390 self->Socket = Sock;
391 Py_INCREF(self->Socket);
392 return self;
393 fail:
394 if (errstr)
395 PyErr_SetString(PySSLErrorObject, errstr);
396 Py_DECREF(self);
397 return NULL;
398}
399
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000400static PyObject *
Guido van Rossum780b80d2007-08-27 18:42:23 +0000401PySSL_sslwrap(PyObject *self, PyObject *args)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000402{
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000403 PySocketSockObject *Sock;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000404 int server_side = 0;
405 int verification_mode = PY_SSL_CERT_NONE;
406 int protocol = PY_SSL_VERSION_SSL23;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000407 char *key_file = NULL;
408 char *cert_file = NULL;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000409 char *cacerts_file = NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000410
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000411 if (!PyArg_ParseTuple(args, "O!i|zziiz:sslwrap",
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000412 PySocketModule.Sock_Type,
Martin v. Löwisa811c382006-10-19 11:00:37 +0000413 &Sock,
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000414 &server_side,
415 &key_file, &cert_file,
416 &verification_mode, &protocol,
417 &cacerts_file))
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000418 return NULL;
419
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000420 /*
421 fprintf(stderr,
422 "server_side is %d, keyfile %p, certfile %p, verify_mode %d, "
423 "protocol %d, certs %p\n",
424 server_side, key_file, cert_file, verification_mode,
425 protocol, cacerts_file);
426 */
427
428 return (PyObject *) newPySSLObject(Sock, key_file, cert_file,
429 server_side, verification_mode,
430 protocol, cacerts_file);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000431}
432
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000433PyDoc_STRVAR(ssl_doc,
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000434"sslwrap(socket, server_side, [keyfile, certfile, certs_mode, protocol,\n"
435" cacertsfile]) -> sslobject");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000436
437/* SSL object methods */
438
Bill Janssen934b16d2008-06-28 22:19:33 +0000439static PyObject *PySSL_SSLdo_handshake(PySSLObject *self)
440{
441 int ret;
442 int err;
443 int sockstate;
444
445 /* Actually negotiate SSL connection */
446 /* XXX If SSL_do_handshake() returns 0, it's also a failure. */
447 sockstate = 0;
448 do {
449 PySSL_BEGIN_ALLOW_THREADS
450 ret = SSL_do_handshake(self->ssl);
451 err = SSL_get_error(self->ssl, ret);
452 PySSL_END_ALLOW_THREADS
453 if(PyErr_CheckSignals()) {
454 return NULL;
455 }
456 if (err == SSL_ERROR_WANT_READ) {
457 sockstate = check_socket_and_wait_for_timeout(self->Socket, 0);
458 } else if (err == SSL_ERROR_WANT_WRITE) {
459 sockstate = check_socket_and_wait_for_timeout(self->Socket, 1);
460 } else {
461 sockstate = SOCKET_OPERATION_OK;
462 }
463 if (sockstate == SOCKET_HAS_TIMED_OUT) {
464 PyErr_SetString(PySSLErrorObject,
465 ERRSTR("The handshake operation timed out"));
466 return NULL;
467 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
468 PyErr_SetString(PySSLErrorObject,
469 ERRSTR("Underlying socket has been closed."));
470 return NULL;
471 } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
472 PyErr_SetString(PySSLErrorObject,
473 ERRSTR("Underlying socket too large for select()."));
474 return NULL;
475 } else if (sockstate == SOCKET_IS_NONBLOCKING) {
476 break;
477 }
478 } while (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE);
479 if (ret < 1)
480 return PySSL_SetError(self, ret, __FILE__, __LINE__);
481 self->ssl->debug = 1;
482
483 if (self->peer_cert)
484 X509_free (self->peer_cert);
485 PySSL_BEGIN_ALLOW_THREADS
486 if ((self->peer_cert = SSL_get_peer_certificate(self->ssl))) {
487 X509_NAME_oneline(X509_get_subject_name(self->peer_cert),
488 self->server, X509_NAME_MAXLEN);
489 X509_NAME_oneline(X509_get_issuer_name(self->peer_cert),
490 self->issuer, X509_NAME_MAXLEN);
491 }
492 PySSL_END_ALLOW_THREADS
493
494 Py_INCREF(Py_None);
495 return Py_None;
496}
497
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000498static PyObject *
499PySSL_server(PySSLObject *self)
500{
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000501 return PyString_FromString(self->server);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000502}
503
504static PyObject *
505PySSL_issuer(PySSLObject *self)
506{
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000507 return PyString_FromString(self->issuer);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000508}
509
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000510static PyObject *
Bill Janssen98d19da2007-09-10 21:51:02 +0000511_create_tuple_for_attribute (ASN1_OBJECT *name, ASN1_STRING *value) {
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000512
Bill Janssen98d19da2007-09-10 21:51:02 +0000513 char namebuf[X509_NAME_MAXLEN];
514 int buflen;
515 PyObject *name_obj;
516 PyObject *value_obj;
517 PyObject *attr;
518 unsigned char *valuebuf = NULL;
Guido van Rossum780b80d2007-08-27 18:42:23 +0000519
Bill Janssen98d19da2007-09-10 21:51:02 +0000520 buflen = OBJ_obj2txt(namebuf, sizeof(namebuf), name, 0);
521 if (buflen < 0) {
522 _setSSLError(NULL, 0, __FILE__, __LINE__);
523 goto fail;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000524 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000525 name_obj = PyString_FromStringAndSize(namebuf, buflen);
Bill Janssen98d19da2007-09-10 21:51:02 +0000526 if (name_obj == NULL)
527 goto fail;
528
529 buflen = ASN1_STRING_to_UTF8(&valuebuf, value);
530 if (buflen < 0) {
531 _setSSLError(NULL, 0, __FILE__, __LINE__);
532 Py_DECREF(name_obj);
533 goto fail;
534 }
535 value_obj = PyUnicode_DecodeUTF8((char *) valuebuf,
536 buflen, "strict");
537 OPENSSL_free(valuebuf);
538 if (value_obj == NULL) {
539 Py_DECREF(name_obj);
540 goto fail;
541 }
542 attr = PyTuple_New(2);
543 if (attr == NULL) {
544 Py_DECREF(name_obj);
545 Py_DECREF(value_obj);
546 goto fail;
547 }
548 PyTuple_SET_ITEM(attr, 0, name_obj);
549 PyTuple_SET_ITEM(attr, 1, value_obj);
550 return attr;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000551
Bill Janssen98d19da2007-09-10 21:51:02 +0000552 fail:
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000553 return NULL;
554}
555
556static PyObject *
Bill Janssen98d19da2007-09-10 21:51:02 +0000557_create_tuple_for_X509_NAME (X509_NAME *xname)
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000558{
Bill Janssen98d19da2007-09-10 21:51:02 +0000559 PyObject *dn = NULL; /* tuple which represents the "distinguished name" */
560 PyObject *rdn = NULL; /* tuple to hold a "relative distinguished name" */
561 PyObject *rdnt;
562 PyObject *attr = NULL; /* tuple to hold an attribute */
563 int entry_count = X509_NAME_entry_count(xname);
564 X509_NAME_ENTRY *entry;
565 ASN1_OBJECT *name;
566 ASN1_STRING *value;
567 int index_counter;
568 int rdn_level = -1;
569 int retcode;
570
571 dn = PyList_New(0);
572 if (dn == NULL)
573 return NULL;
574 /* now create another tuple to hold the top-level RDN */
575 rdn = PyList_New(0);
576 if (rdn == NULL)
577 goto fail0;
578
579 for (index_counter = 0;
580 index_counter < entry_count;
581 index_counter++)
582 {
583 entry = X509_NAME_get_entry(xname, index_counter);
584
585 /* check to see if we've gotten to a new RDN */
586 if (rdn_level >= 0) {
587 if (rdn_level != entry->set) {
588 /* yes, new RDN */
589 /* add old RDN to DN */
590 rdnt = PyList_AsTuple(rdn);
591 Py_DECREF(rdn);
592 if (rdnt == NULL)
593 goto fail0;
594 retcode = PyList_Append(dn, rdnt);
595 Py_DECREF(rdnt);
596 if (retcode < 0)
597 goto fail0;
598 /* create new RDN */
599 rdn = PyList_New(0);
600 if (rdn == NULL)
601 goto fail0;
602 }
603 }
604 rdn_level = entry->set;
605
606 /* now add this attribute to the current RDN */
607 name = X509_NAME_ENTRY_get_object(entry);
608 value = X509_NAME_ENTRY_get_data(entry);
609 attr = _create_tuple_for_attribute(name, value);
610 /*
611 fprintf(stderr, "RDN level %d, attribute %s: %s\n",
612 entry->set,
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000613 PyString_AS_STRING(PyTuple_GET_ITEM(attr, 0)),
614 PyString_AS_STRING(PyTuple_GET_ITEM(attr, 1)));
Bill Janssen98d19da2007-09-10 21:51:02 +0000615 */
616 if (attr == NULL)
617 goto fail1;
618 retcode = PyList_Append(rdn, attr);
619 Py_DECREF(attr);
620 if (retcode < 0)
621 goto fail1;
622 }
623 /* now, there's typically a dangling RDN */
624 if ((rdn != NULL) && (PyList_Size(rdn) > 0)) {
625 rdnt = PyList_AsTuple(rdn);
626 Py_DECREF(rdn);
627 if (rdnt == NULL)
628 goto fail0;
629 retcode = PyList_Append(dn, rdnt);
630 Py_DECREF(rdnt);
631 if (retcode < 0)
632 goto fail0;
633 }
634
635 /* convert list to tuple */
636 rdnt = PyList_AsTuple(dn);
637 Py_DECREF(dn);
638 if (rdnt == NULL)
639 return NULL;
640 return rdnt;
641
642 fail1:
643 Py_XDECREF(rdn);
644
645 fail0:
646 Py_XDECREF(dn);
647 return NULL;
648}
649
650static PyObject *
651_get_peer_alt_names (X509 *certificate) {
652
653 /* this code follows the procedure outlined in
654 OpenSSL's crypto/x509v3/v3_prn.c:X509v3_EXT_print()
655 function to extract the STACK_OF(GENERAL_NAME),
656 then iterates through the stack to add the
657 names. */
658
659 int i, j;
660 PyObject *peer_alt_names = Py_None;
661 PyObject *v, *t;
662 X509_EXTENSION *ext = NULL;
663 GENERAL_NAMES *names = NULL;
664 GENERAL_NAME *name;
665 X509V3_EXT_METHOD *method;
666 BIO *biobuf = NULL;
667 char buf[2048];
668 char *vptr;
669 int len;
Victor Stinner3f75cc52010-03-02 22:44:42 +0000670 /* Issue #2973: ASN1_item_d2i() API changed in OpenSSL 0.9.6m */
671#if OPENSSL_VERSION_NUMBER >= 0x009060dfL
672 const unsigned char *p;
673#else
Jeffrey Yasskin7937d932009-05-29 03:44:31 +0000674 unsigned char *p;
Victor Stinner3f75cc52010-03-02 22:44:42 +0000675#endif
Bill Janssen98d19da2007-09-10 21:51:02 +0000676
677 if (certificate == NULL)
678 return peer_alt_names;
679
680 /* get a memory buffer */
681 biobuf = BIO_new(BIO_s_mem());
682
683 i = 0;
684 while ((i = X509_get_ext_by_NID(
685 certificate, NID_subject_alt_name, i)) >= 0) {
686
687 if (peer_alt_names == Py_None) {
688 peer_alt_names = PyList_New(0);
689 if (peer_alt_names == NULL)
690 goto fail;
691 }
692
693 /* now decode the altName */
694 ext = X509_get_ext(certificate, i);
695 if(!(method = X509V3_EXT_get(ext))) {
696 PyErr_SetString(PySSLErrorObject,
697 ERRSTR("No method for internalizing subjectAltName!"));
698 goto fail;
699 }
700
701 p = ext->value->data;
Neal Norwitze9057ff2008-01-27 17:10:35 +0000702 if (method->it)
Bill Janssen98d19da2007-09-10 21:51:02 +0000703 names = (GENERAL_NAMES*) (ASN1_item_d2i(NULL,
704 &p,
705 ext->value->length,
706 ASN1_ITEM_ptr(method->it)));
707 else
708 names = (GENERAL_NAMES*) (method->d2i(NULL,
709 &p,
710 ext->value->length));
711
712 for(j = 0; j < sk_GENERAL_NAME_num(names); j++) {
713
714 /* get a rendering of each name in the set of names */
715
716 name = sk_GENERAL_NAME_value(names, j);
717 if (name->type == GEN_DIRNAME) {
718
719 /* we special-case DirName as a tuple of tuples of attributes */
720
721 t = PyTuple_New(2);
722 if (t == NULL) {
723 goto fail;
724 }
725
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000726 v = PyString_FromString("DirName");
Bill Janssen98d19da2007-09-10 21:51:02 +0000727 if (v == NULL) {
728 Py_DECREF(t);
729 goto fail;
730 }
731 PyTuple_SET_ITEM(t, 0, v);
732
733 v = _create_tuple_for_X509_NAME (name->d.dirn);
734 if (v == NULL) {
735 Py_DECREF(t);
736 goto fail;
737 }
738 PyTuple_SET_ITEM(t, 1, v);
739
740 } else {
741
742 /* for everything else, we use the OpenSSL print form */
743
744 (void) BIO_reset(biobuf);
745 GENERAL_NAME_print(biobuf, name);
746 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
747 if (len < 0) {
748 _setSSLError(NULL, 0, __FILE__, __LINE__);
749 goto fail;
750 }
751 vptr = strchr(buf, ':');
752 if (vptr == NULL)
753 goto fail;
754 t = PyTuple_New(2);
755 if (t == NULL)
756 goto fail;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000757 v = PyString_FromStringAndSize(buf, (vptr - buf));
Bill Janssen98d19da2007-09-10 21:51:02 +0000758 if (v == NULL) {
759 Py_DECREF(t);
760 goto fail;
761 }
762 PyTuple_SET_ITEM(t, 0, v);
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000763 v = PyString_FromStringAndSize((vptr + 1), (len - (vptr - buf + 1)));
Bill Janssen98d19da2007-09-10 21:51:02 +0000764 if (v == NULL) {
765 Py_DECREF(t);
766 goto fail;
767 }
768 PyTuple_SET_ITEM(t, 1, v);
769 }
770
771 /* and add that rendering to the list */
772
773 if (PyList_Append(peer_alt_names, t) < 0) {
774 Py_DECREF(t);
775 goto fail;
776 }
777 Py_DECREF(t);
778 }
779 }
780 BIO_free(biobuf);
781 if (peer_alt_names != Py_None) {
782 v = PyList_AsTuple(peer_alt_names);
783 Py_DECREF(peer_alt_names);
784 return v;
785 } else {
786 return peer_alt_names;
787 }
788
789
790 fail:
791 if (biobuf != NULL)
792 BIO_free(biobuf);
793
794 if (peer_alt_names != Py_None) {
795 Py_XDECREF(peer_alt_names);
796 }
797
798 return NULL;
799}
800
801static PyObject *
802_decode_certificate (X509 *certificate, int verbose) {
803
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000804 PyObject *retval = NULL;
805 BIO *biobuf = NULL;
Neal Norwitz049da9e2007-08-25 16:41:36 +0000806 PyObject *peer;
Bill Janssen98d19da2007-09-10 21:51:02 +0000807 PyObject *peer_alt_names = NULL;
Neal Norwitz049da9e2007-08-25 16:41:36 +0000808 PyObject *issuer;
809 PyObject *version;
Bill Janssen98d19da2007-09-10 21:51:02 +0000810 PyObject *sn_obj;
811 ASN1_INTEGER *serialNumber;
Neal Norwitz049da9e2007-08-25 16:41:36 +0000812 char buf[2048];
813 int len;
814 ASN1_TIME *notBefore, *notAfter;
815 PyObject *pnotBefore, *pnotAfter;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000816
817 retval = PyDict_New();
818 if (retval == NULL)
819 return NULL;
820
Bill Janssenffe576d2007-09-05 00:46:27 +0000821 peer = _create_tuple_for_X509_NAME(
Bill Janssen98d19da2007-09-10 21:51:02 +0000822 X509_get_subject_name(certificate));
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000823 if (peer == NULL)
824 goto fail0;
825 if (PyDict_SetItemString(retval, (const char *) "subject", peer) < 0) {
826 Py_DECREF(peer);
827 goto fail0;
828 }
829 Py_DECREF(peer);
830
Bill Janssen98d19da2007-09-10 21:51:02 +0000831 if (verbose) {
832 issuer = _create_tuple_for_X509_NAME(
833 X509_get_issuer_name(certificate));
834 if (issuer == NULL)
835 goto fail0;
836 if (PyDict_SetItemString(retval, (const char *)"issuer", issuer) < 0) {
837 Py_DECREF(issuer);
838 goto fail0;
839 }
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000840 Py_DECREF(issuer);
Bill Janssen98d19da2007-09-10 21:51:02 +0000841
842 version = PyInt_FromLong(X509_get_version(certificate) + 1);
843 if (PyDict_SetItemString(retval, "version", version) < 0) {
844 Py_DECREF(version);
845 goto fail0;
846 }
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000847 Py_DECREF(version);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000848 }
Bill Janssen98d19da2007-09-10 21:51:02 +0000849
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000850 /* get a memory buffer */
851 biobuf = BIO_new(BIO_s_mem());
Bill Janssen98d19da2007-09-10 21:51:02 +0000852
853 if (verbose) {
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000854
Bill Janssen98d19da2007-09-10 21:51:02 +0000855 (void) BIO_reset(biobuf);
856 serialNumber = X509_get_serialNumber(certificate);
857 /* should not exceed 20 octets, 160 bits, so buf is big enough */
858 i2a_ASN1_INTEGER(biobuf, serialNumber);
859 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
860 if (len < 0) {
861 _setSSLError(NULL, 0, __FILE__, __LINE__);
862 goto fail1;
863 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000864 sn_obj = PyString_FromStringAndSize(buf, len);
Bill Janssen98d19da2007-09-10 21:51:02 +0000865 if (sn_obj == NULL)
866 goto fail1;
867 if (PyDict_SetItemString(retval, "serialNumber", sn_obj) < 0) {
868 Py_DECREF(sn_obj);
869 goto fail1;
870 }
871 Py_DECREF(sn_obj);
872
873 (void) BIO_reset(biobuf);
874 notBefore = X509_get_notBefore(certificate);
875 ASN1_TIME_print(biobuf, notBefore);
876 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
877 if (len < 0) {
878 _setSSLError(NULL, 0, __FILE__, __LINE__);
879 goto fail1;
880 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000881 pnotBefore = PyString_FromStringAndSize(buf, len);
Bill Janssen98d19da2007-09-10 21:51:02 +0000882 if (pnotBefore == NULL)
883 goto fail1;
884 if (PyDict_SetItemString(retval, "notBefore", pnotBefore) < 0) {
885 Py_DECREF(pnotBefore);
886 goto fail1;
887 }
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000888 Py_DECREF(pnotBefore);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000889 }
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000890
Guido van Rossum780b80d2007-08-27 18:42:23 +0000891 (void) BIO_reset(biobuf);
Bill Janssen98d19da2007-09-10 21:51:02 +0000892 notAfter = X509_get_notAfter(certificate);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000893 ASN1_TIME_print(biobuf, notAfter);
894 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
Bill Janssen98d19da2007-09-10 21:51:02 +0000895 if (len < 0) {
896 _setSSLError(NULL, 0, __FILE__, __LINE__);
897 goto fail1;
898 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000899 pnotAfter = PyString_FromStringAndSize(buf, len);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000900 if (pnotAfter == NULL)
Bill Janssen98d19da2007-09-10 21:51:02 +0000901 goto fail1;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000902 if (PyDict_SetItemString(retval, "notAfter", pnotAfter) < 0) {
903 Py_DECREF(pnotAfter);
Bill Janssen98d19da2007-09-10 21:51:02 +0000904 goto fail1;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000905 }
906 Py_DECREF(pnotAfter);
Bill Janssen98d19da2007-09-10 21:51:02 +0000907
908 /* Now look for subjectAltName */
909
910 peer_alt_names = _get_peer_alt_names(certificate);
911 if (peer_alt_names == NULL)
912 goto fail1;
913 else if (peer_alt_names != Py_None) {
914 if (PyDict_SetItemString(retval, "subjectAltName",
915 peer_alt_names) < 0) {
916 Py_DECREF(peer_alt_names);
917 goto fail1;
918 }
919 Py_DECREF(peer_alt_names);
920 }
921
922 BIO_free(biobuf);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000923 return retval;
924
925 fail1:
926 if (biobuf != NULL)
927 BIO_free(biobuf);
928 fail0:
929 Py_XDECREF(retval);
930 return NULL;
931}
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000932
Bill Janssen98d19da2007-09-10 21:51:02 +0000933
934static PyObject *
935PySSL_test_decode_certificate (PyObject *mod, PyObject *args) {
936
937 PyObject *retval = NULL;
938 char *filename = NULL;
939 X509 *x=NULL;
940 BIO *cert;
941 int verbose = 1;
942
943 if (!PyArg_ParseTuple(args, "s|i:test_decode_certificate", &filename, &verbose))
944 return NULL;
945
946 if ((cert=BIO_new(BIO_s_file())) == NULL) {
947 PyErr_SetString(PySSLErrorObject, "Can't malloc memory to read file");
948 goto fail0;
949 }
950
951 if (BIO_read_filename(cert,filename) <= 0) {
952 PyErr_SetString(PySSLErrorObject, "Can't open file");
953 goto fail0;
954 }
955
956 x = PEM_read_bio_X509_AUX(cert,NULL, NULL, NULL);
957 if (x == NULL) {
958 PyErr_SetString(PySSLErrorObject, "Error decoding PEM-encoded file");
959 goto fail0;
960 }
961
962 retval = _decode_certificate(x, verbose);
963
964 fail0:
965
966 if (cert != NULL) BIO_free(cert);
967 return retval;
968}
969
970
971static PyObject *
972PySSL_peercert(PySSLObject *self, PyObject *args)
973{
974 PyObject *retval = NULL;
975 int len;
976 int verification;
977 PyObject *binary_mode = Py_None;
978
979 if (!PyArg_ParseTuple(args, "|O:peer_certificate", &binary_mode))
980 return NULL;
981
982 if (!self->peer_cert)
983 Py_RETURN_NONE;
984
985 if (PyObject_IsTrue(binary_mode)) {
986 /* return cert in DER-encoded format */
987
988 unsigned char *bytes_buf = NULL;
989
990 bytes_buf = NULL;
991 len = i2d_X509(self->peer_cert, &bytes_buf);
992 if (len < 0) {
993 PySSL_SetError(self, len, __FILE__, __LINE__);
994 return NULL;
995 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000996 retval = PyString_FromStringAndSize((const char *) bytes_buf, len);
Bill Janssen98d19da2007-09-10 21:51:02 +0000997 OPENSSL_free(bytes_buf);
998 return retval;
999
1000 } else {
1001
1002 verification = SSL_CTX_get_verify_mode(self->ctx);
1003 if ((verification & SSL_VERIFY_PEER) == 0)
1004 return PyDict_New();
1005 else
1006 return _decode_certificate (self->peer_cert, 0);
1007 }
1008}
1009
1010PyDoc_STRVAR(PySSL_peercert_doc,
1011"peer_certificate([der=False]) -> certificate\n\
1012\n\
1013Returns the certificate for the peer. If no certificate was provided,\n\
1014returns None. If a certificate was provided, but not validated, returns\n\
1015an empty dictionary. Otherwise returns a dict containing information\n\
1016about the peer certificate.\n\
1017\n\
1018If the optional argument is True, returns a DER-encoded copy of the\n\
1019peer certificate, or None if no certificate was provided. This will\n\
1020return the certificate even if it wasn't validated.");
1021
1022static PyObject *PySSL_cipher (PySSLObject *self) {
1023
1024 PyObject *retval, *v;
1025 SSL_CIPHER *current;
1026 char *cipher_name;
1027 char *cipher_protocol;
1028
1029 if (self->ssl == NULL)
1030 return Py_None;
1031 current = SSL_get_current_cipher(self->ssl);
1032 if (current == NULL)
1033 return Py_None;
1034
1035 retval = PyTuple_New(3);
1036 if (retval == NULL)
1037 return NULL;
1038
1039 cipher_name = (char *) SSL_CIPHER_get_name(current);
1040 if (cipher_name == NULL) {
1041 PyTuple_SET_ITEM(retval, 0, Py_None);
1042 } else {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001043 v = PyString_FromString(cipher_name);
Bill Janssen98d19da2007-09-10 21:51:02 +00001044 if (v == NULL)
1045 goto fail0;
1046 PyTuple_SET_ITEM(retval, 0, v);
1047 }
1048 cipher_protocol = SSL_CIPHER_get_version(current);
1049 if (cipher_protocol == NULL) {
1050 PyTuple_SET_ITEM(retval, 1, Py_None);
1051 } else {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001052 v = PyString_FromString(cipher_protocol);
Bill Janssen98d19da2007-09-10 21:51:02 +00001053 if (v == NULL)
1054 goto fail0;
1055 PyTuple_SET_ITEM(retval, 1, v);
1056 }
1057 v = PyInt_FromLong(SSL_CIPHER_get_bits(current, NULL));
1058 if (v == NULL)
1059 goto fail0;
1060 PyTuple_SET_ITEM(retval, 2, v);
1061 return retval;
1062
1063 fail0:
1064 Py_DECREF(retval);
1065 return NULL;
1066}
1067
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001068static void PySSL_dealloc(PySSLObject *self)
1069{
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001070 if (self->peer_cert) /* Possible not to have one? */
1071 X509_free (self->peer_cert);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001072 if (self->ssl)
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001073 SSL_free(self->ssl);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001074 if (self->ctx)
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001075 SSL_CTX_free(self->ctx);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001076 Py_XDECREF(self->Socket);
1077 PyObject_Del(self);
1078}
1079
Anthony Baxter93ab5fa2006-07-11 02:04:09 +00001080/* If the socket has a timeout, do a select()/poll() on the socket.
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001081 The argument writing indicates the direction.
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001082 Returns one of the possibilities in the timeout_state enum (above).
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001083 */
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001084
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001085static int
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001086check_socket_and_wait_for_timeout(PySocketSockObject *s, int writing)
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001087{
1088 fd_set fds;
1089 struct timeval tv;
1090 int rc;
1091
1092 /* Nothing to do unless we're in timeout mode (not non-blocking) */
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001093 if (s->sock_timeout < 0.0)
1094 return SOCKET_IS_BLOCKING;
1095 else if (s->sock_timeout == 0.0)
1096 return SOCKET_IS_NONBLOCKING;
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001097
1098 /* Guard against closed socket */
1099 if (s->sock_fd < 0)
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001100 return SOCKET_HAS_BEEN_CLOSED;
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001101
Anthony Baxter93ab5fa2006-07-11 02:04:09 +00001102 /* Prefer poll, if available, since you can poll() any fd
1103 * which can't be done with select(). */
1104#ifdef HAVE_POLL
1105 {
1106 struct pollfd pollfd;
1107 int timeout;
1108
1109 pollfd.fd = s->sock_fd;
1110 pollfd.events = writing ? POLLOUT : POLLIN;
1111
1112 /* s->sock_timeout is in seconds, timeout in ms */
1113 timeout = (int)(s->sock_timeout * 1000 + 0.5);
Bill Janssen98d19da2007-09-10 21:51:02 +00001114 PySSL_BEGIN_ALLOW_THREADS
Anthony Baxter93ab5fa2006-07-11 02:04:09 +00001115 rc = poll(&pollfd, 1, timeout);
Bill Janssen98d19da2007-09-10 21:51:02 +00001116 PySSL_END_ALLOW_THREADS
Anthony Baxter93ab5fa2006-07-11 02:04:09 +00001117
1118 goto normal_return;
1119 }
1120#endif
1121
Neal Norwitz082b2df2006-02-07 07:04:46 +00001122 /* Guard against socket too large for select*/
Martin v. Löwisf84d1b92006-02-11 09:27:05 +00001123#ifndef Py_SOCKET_FD_CAN_BE_GE_FD_SETSIZE
Neal Norwitz082b2df2006-02-07 07:04:46 +00001124 if (s->sock_fd >= FD_SETSIZE)
Neal Norwitz389cea82006-02-13 00:35:21 +00001125 return SOCKET_TOO_LARGE_FOR_SELECT;
Martin v. Löwisf84d1b92006-02-11 09:27:05 +00001126#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +00001127
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001128 /* Construct the arguments to select */
1129 tv.tv_sec = (int)s->sock_timeout;
1130 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
1131 FD_ZERO(&fds);
1132 FD_SET(s->sock_fd, &fds);
1133
1134 /* See if the socket is ready */
Bill Janssen98d19da2007-09-10 21:51:02 +00001135 PySSL_BEGIN_ALLOW_THREADS
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001136 if (writing)
1137 rc = select(s->sock_fd+1, NULL, &fds, NULL, &tv);
1138 else
1139 rc = select(s->sock_fd+1, &fds, NULL, NULL, &tv);
Bill Janssen98d19da2007-09-10 21:51:02 +00001140 PySSL_END_ALLOW_THREADS
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001141
Bill Janssen934b16d2008-06-28 22:19:33 +00001142#ifdef HAVE_POLL
Anthony Baxter93ab5fa2006-07-11 02:04:09 +00001143normal_return:
Bill Janssen934b16d2008-06-28 22:19:33 +00001144#endif
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001145 /* Return SOCKET_TIMED_OUT on timeout, SOCKET_OPERATION_OK otherwise
1146 (when we are able to write or when there's something to read) */
1147 return rc == 0 ? SOCKET_HAS_TIMED_OUT : SOCKET_OPERATION_OK;
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001148}
1149
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001150static PyObject *PySSL_SSLwrite(PySSLObject *self, PyObject *args)
1151{
Antoine Pitrou5ba84912009-10-19 17:59:07 +00001152 Py_buffer buf;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001153 int len;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001154 int sockstate;
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001155 int err;
Bill Janssen934b16d2008-06-28 22:19:33 +00001156 int nonblocking;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001157
Antoine Pitrou5ba84912009-10-19 17:59:07 +00001158 if (!PyArg_ParseTuple(args, "s*:write", &buf))
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001159 return NULL;
1160
Bill Janssen934b16d2008-06-28 22:19:33 +00001161 /* just in case the blocking state of the socket has been changed */
1162 nonblocking = (self->Socket->sock_timeout >= 0.0);
1163 BIO_set_nbio(SSL_get_rbio(self->ssl), nonblocking);
1164 BIO_set_nbio(SSL_get_wbio(self->ssl), nonblocking);
1165
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001166 sockstate = check_socket_and_wait_for_timeout(self->Socket, 1);
1167 if (sockstate == SOCKET_HAS_TIMED_OUT) {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001168 PyErr_SetString(PySSLErrorObject,
1169 "The write operation timed out");
Antoine Pitrou5ba84912009-10-19 17:59:07 +00001170 goto error;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001171 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001172 PyErr_SetString(PySSLErrorObject,
1173 "Underlying socket has been closed.");
Antoine Pitrou5ba84912009-10-19 17:59:07 +00001174 goto error;
Neal Norwitz389cea82006-02-13 00:35:21 +00001175 } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001176 PyErr_SetString(PySSLErrorObject,
1177 "Underlying socket too large for select().");
Antoine Pitrou5ba84912009-10-19 17:59:07 +00001178 goto error;
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001179 }
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001180 do {
1181 err = 0;
Bill Janssen98d19da2007-09-10 21:51:02 +00001182 PySSL_BEGIN_ALLOW_THREADS
Antoine Pitrou5ba84912009-10-19 17:59:07 +00001183 len = SSL_write(self->ssl, buf.buf, buf.len);
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001184 err = SSL_get_error(self->ssl, len);
Bill Janssen98d19da2007-09-10 21:51:02 +00001185 PySSL_END_ALLOW_THREADS
Antoine Pitrou5ba84912009-10-19 17:59:07 +00001186 if (PyErr_CheckSignals()) {
1187 goto error;
Martin v. Löwisafec8e32003-06-28 07:40:23 +00001188 }
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001189 if (err == SSL_ERROR_WANT_READ) {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001190 sockstate =
1191 check_socket_and_wait_for_timeout(self->Socket, 0);
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001192 } else if (err == SSL_ERROR_WANT_WRITE) {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001193 sockstate =
1194 check_socket_and_wait_for_timeout(self->Socket, 1);
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001195 } else {
1196 sockstate = SOCKET_OPERATION_OK;
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001197 }
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001198 if (sockstate == SOCKET_HAS_TIMED_OUT) {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001199 PyErr_SetString(PySSLErrorObject,
1200 "The write operation timed out");
Antoine Pitrou5ba84912009-10-19 17:59:07 +00001201 goto error;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001202 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001203 PyErr_SetString(PySSLErrorObject,
1204 "Underlying socket has been closed.");
Antoine Pitrou5ba84912009-10-19 17:59:07 +00001205 goto error;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001206 } else if (sockstate == SOCKET_IS_NONBLOCKING) {
1207 break;
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001208 }
1209 } while (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE);
Antoine Pitrou5ba84912009-10-19 17:59:07 +00001210
1211 PyBuffer_Release(&buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001212 if (len > 0)
1213 return PyInt_FromLong(len);
1214 else
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001215 return PySSL_SetError(self, len, __FILE__, __LINE__);
Antoine Pitrou5ba84912009-10-19 17:59:07 +00001216
1217error:
1218 PyBuffer_Release(&buf);
1219 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001220}
1221
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001222PyDoc_STRVAR(PySSL_SSLwrite_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001223"write(s) -> len\n\
1224\n\
1225Writes the string s into the SSL object. Returns the number\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001226of bytes written.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001227
Bill Janssen934b16d2008-06-28 22:19:33 +00001228static PyObject *PySSL_SSLpending(PySSLObject *self)
1229{
1230 int count = 0;
1231
1232 PySSL_BEGIN_ALLOW_THREADS
1233 count = SSL_pending(self->ssl);
1234 PySSL_END_ALLOW_THREADS
1235 if (count < 0)
1236 return PySSL_SetError(self, count, __FILE__, __LINE__);
1237 else
1238 return PyInt_FromLong(count);
1239}
1240
1241PyDoc_STRVAR(PySSL_SSLpending_doc,
1242"pending() -> count\n\
1243\n\
1244Returns the number of already decrypted bytes available for read,\n\
1245pending on the connection.\n");
1246
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001247static PyObject *PySSL_SSLread(PySSLObject *self, PyObject *args)
1248{
1249 PyObject *buf;
1250 int count = 0;
1251 int len = 1024;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001252 int sockstate;
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001253 int err;
Bill Janssen934b16d2008-06-28 22:19:33 +00001254 int nonblocking;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001255
1256 if (!PyArg_ParseTuple(args, "|i:read", &len))
1257 return NULL;
1258
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001259 if (!(buf = PyString_FromStringAndSize((char *) 0, len)))
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001260 return NULL;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001261
Bill Janssen934b16d2008-06-28 22:19:33 +00001262 /* just in case the blocking state of the socket has been changed */
1263 nonblocking = (self->Socket->sock_timeout >= 0.0);
1264 BIO_set_nbio(SSL_get_rbio(self->ssl), nonblocking);
1265 BIO_set_nbio(SSL_get_wbio(self->ssl), nonblocking);
1266
Georg Brandl43f08a82006-03-31 18:01:16 +00001267 /* first check if there are bytes ready to be read */
Bill Janssen98d19da2007-09-10 21:51:02 +00001268 PySSL_BEGIN_ALLOW_THREADS
Georg Brandl43f08a82006-03-31 18:01:16 +00001269 count = SSL_pending(self->ssl);
Bill Janssen98d19da2007-09-10 21:51:02 +00001270 PySSL_END_ALLOW_THREADS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001271
Georg Brandl43f08a82006-03-31 18:01:16 +00001272 if (!count) {
1273 sockstate = check_socket_and_wait_for_timeout(self->Socket, 0);
1274 if (sockstate == SOCKET_HAS_TIMED_OUT) {
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001275 PyErr_SetString(PySSLErrorObject,
1276 "The read operation timed out");
Georg Brandl43f08a82006-03-31 18:01:16 +00001277 Py_DECREF(buf);
1278 return NULL;
1279 } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001280 PyErr_SetString(PySSLErrorObject,
1281 "Underlying socket too large for select().");
1282 Py_DECREF(buf);
Georg Brandl43f08a82006-03-31 18:01:16 +00001283 return NULL;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001284 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
Bill Janssen934b16d2008-06-28 22:19:33 +00001285 if (SSL_get_shutdown(self->ssl) !=
1286 SSL_RECEIVED_SHUTDOWN)
1287 {
1288 Py_DECREF(buf);
1289 PyErr_SetString(PySSLErrorObject,
1290 "Socket closed without SSL shutdown handshake");
1291 return NULL;
1292 } else {
1293 /* should contain a zero-length string */
1294 _PyString_Resize(&buf, 0);
1295 return buf;
1296 }
Georg Brandl43f08a82006-03-31 18:01:16 +00001297 }
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001298 }
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001299 do {
1300 err = 0;
Bill Janssen98d19da2007-09-10 21:51:02 +00001301 PySSL_BEGIN_ALLOW_THREADS
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001302 count = SSL_read(self->ssl, PyString_AsString(buf), len);
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001303 err = SSL_get_error(self->ssl, count);
Bill Janssen98d19da2007-09-10 21:51:02 +00001304 PySSL_END_ALLOW_THREADS
Martin v. Löwisafec8e32003-06-28 07:40:23 +00001305 if(PyErr_CheckSignals()) {
1306 Py_DECREF(buf);
1307 return NULL;
1308 }
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001309 if (err == SSL_ERROR_WANT_READ) {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001310 sockstate =
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001311 check_socket_and_wait_for_timeout(self->Socket, 0);
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001312 } else if (err == SSL_ERROR_WANT_WRITE) {
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001313 sockstate =
1314 check_socket_and_wait_for_timeout(self->Socket, 1);
1315 } else if ((err == SSL_ERROR_ZERO_RETURN) &&
1316 (SSL_get_shutdown(self->ssl) ==
Guido van Rossum780b80d2007-08-27 18:42:23 +00001317 SSL_RECEIVED_SHUTDOWN))
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001318 {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001319 _PyString_Resize(&buf, 0);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001320 return buf;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001321 } else {
1322 sockstate = SOCKET_OPERATION_OK;
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001323 }
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001324 if (sockstate == SOCKET_HAS_TIMED_OUT) {
1325 PyErr_SetString(PySSLErrorObject,
1326 "The read operation timed out");
Martin v. Löwisafec8e32003-06-28 07:40:23 +00001327 Py_DECREF(buf);
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001328 return NULL;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001329 } else if (sockstate == SOCKET_IS_NONBLOCKING) {
1330 break;
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001331 }
1332 } while (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001333 if (count <= 0) {
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001334 Py_DECREF(buf);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001335 return PySSL_SetError(self, count, __FILE__, __LINE__);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001336 }
Tim Peters5de98422002-04-27 18:44:32 +00001337 if (count != len)
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001338 _PyString_Resize(&buf, count);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001339 return buf;
1340}
1341
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001342PyDoc_STRVAR(PySSL_SSLread_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001343"read([len]) -> string\n\
1344\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001345Read up to len bytes from the SSL socket.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001346
Bill Janssen934b16d2008-06-28 22:19:33 +00001347static PyObject *PySSL_SSLshutdown(PySSLObject *self)
1348{
1349 int err;
1350
1351 /* Guard against closed socket */
1352 if (self->Socket->sock_fd < 0) {
1353 PyErr_SetString(PySSLErrorObject,
1354 "Underlying socket has been closed.");
1355 return NULL;
1356 }
1357
1358 PySSL_BEGIN_ALLOW_THREADS
1359 err = SSL_shutdown(self->ssl);
1360 if (err == 0) {
1361 /* we need to call it again to finish the shutdown */
1362 err = SSL_shutdown(self->ssl);
1363 }
1364 PySSL_END_ALLOW_THREADS
1365
1366 if (err < 0)
1367 return PySSL_SetError(self, err, __FILE__, __LINE__);
1368 else {
1369 Py_INCREF(self->Socket);
1370 return (PyObject *) (self->Socket);
1371 }
1372}
1373
1374PyDoc_STRVAR(PySSL_SSLshutdown_doc,
1375"shutdown(s) -> socket\n\
1376\n\
1377Does the SSL shutdown handshake with the remote end, and returns\n\
1378the underlying socket object.");
1379
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001380static PyMethodDef PySSLMethods[] = {
Bill Janssen934b16d2008-06-28 22:19:33 +00001381 {"do_handshake", (PyCFunction)PySSL_SSLdo_handshake, METH_NOARGS},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001382 {"write", (PyCFunction)PySSL_SSLwrite, METH_VARARGS,
Bill Janssen98d19da2007-09-10 21:51:02 +00001383 PySSL_SSLwrite_doc},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001384 {"read", (PyCFunction)PySSL_SSLread, METH_VARARGS,
Bill Janssen98d19da2007-09-10 21:51:02 +00001385 PySSL_SSLread_doc},
Bill Janssen934b16d2008-06-28 22:19:33 +00001386 {"pending", (PyCFunction)PySSL_SSLpending, METH_NOARGS,
1387 PySSL_SSLpending_doc},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001388 {"server", (PyCFunction)PySSL_server, METH_NOARGS},
1389 {"issuer", (PyCFunction)PySSL_issuer, METH_NOARGS},
Bill Janssen98d19da2007-09-10 21:51:02 +00001390 {"peer_certificate", (PyCFunction)PySSL_peercert, METH_VARARGS,
1391 PySSL_peercert_doc},
1392 {"cipher", (PyCFunction)PySSL_cipher, METH_NOARGS},
Bill Janssen934b16d2008-06-28 22:19:33 +00001393 {"shutdown", (PyCFunction)PySSL_SSLshutdown, METH_NOARGS,
1394 PySSL_SSLshutdown_doc},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001395 {NULL, NULL}
1396};
1397
1398static PyObject *PySSL_getattr(PySSLObject *self, char *name)
1399{
1400 return Py_FindMethod(PySSLMethods, (PyObject *)self, name);
1401}
1402
Jeremy Hylton938ace62002-07-17 16:30:39 +00001403static PyTypeObject PySSL_Type = {
Martin v. Löwis68192102007-07-21 06:55:02 +00001404 PyVarObject_HEAD_INIT(NULL, 0)
Guido van Rossum780b80d2007-08-27 18:42:23 +00001405 "ssl.SSLContext", /*tp_name*/
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001406 sizeof(PySSLObject), /*tp_basicsize*/
1407 0, /*tp_itemsize*/
1408 /* methods */
1409 (destructor)PySSL_dealloc, /*tp_dealloc*/
1410 0, /*tp_print*/
1411 (getattrfunc)PySSL_getattr, /*tp_getattr*/
1412 0, /*tp_setattr*/
1413 0, /*tp_compare*/
1414 0, /*tp_repr*/
1415 0, /*tp_as_number*/
1416 0, /*tp_as_sequence*/
1417 0, /*tp_as_mapping*/
1418 0, /*tp_hash*/
1419};
1420
1421#ifdef HAVE_OPENSSL_RAND
1422
1423/* helper routines for seeding the SSL PRNG */
1424static PyObject *
1425PySSL_RAND_add(PyObject *self, PyObject *args)
1426{
1427 char *buf;
1428 int len;
1429 double entropy;
1430
1431 if (!PyArg_ParseTuple(args, "s#d:RAND_add", &buf, &len, &entropy))
1432 return NULL;
1433 RAND_add(buf, len, entropy);
1434 Py_INCREF(Py_None);
1435 return Py_None;
1436}
1437
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001438PyDoc_STRVAR(PySSL_RAND_add_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001439"RAND_add(string, entropy)\n\
1440\n\
1441Mix string into the OpenSSL PRNG state. entropy (a float) is a lower\n\
Bill Janssen98d19da2007-09-10 21:51:02 +00001442bound on the entropy contained in string. See RFC 1750.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001443
1444static PyObject *
1445PySSL_RAND_status(PyObject *self)
1446{
1447 return PyInt_FromLong(RAND_status());
1448}
1449
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001450PyDoc_STRVAR(PySSL_RAND_status_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001451"RAND_status() -> 0 or 1\n\
1452\n\
1453Returns 1 if the OpenSSL PRNG has been seeded with enough data and 0 if not.\n\
1454It is necessary to seed the PRNG with RAND_add() on some platforms before\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001455using the ssl() function.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001456
1457static PyObject *
1458PySSL_RAND_egd(PyObject *self, PyObject *arg)
1459{
1460 int bytes;
1461
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001462 if (!PyString_Check(arg))
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001463 return PyErr_Format(PyExc_TypeError,
1464 "RAND_egd() expected string, found %s",
Christian Heimese93237d2007-12-19 02:37:44 +00001465 Py_TYPE(arg)->tp_name);
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001466 bytes = RAND_egd(PyString_AS_STRING(arg));
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001467 if (bytes == -1) {
1468 PyErr_SetString(PySSLErrorObject,
1469 "EGD connection failed or EGD did not return "
1470 "enough data to seed the PRNG");
1471 return NULL;
1472 }
1473 return PyInt_FromLong(bytes);
1474}
1475
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001476PyDoc_STRVAR(PySSL_RAND_egd_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001477"RAND_egd(path) -> bytes\n\
1478\n\
Bill Janssen98d19da2007-09-10 21:51:02 +00001479Queries the entropy gather daemon (EGD) on the socket named by 'path'.\n\
1480Returns number of bytes read. Raises SSLError if connection to EGD\n\
1481fails or if it does provide enough data to seed PRNG.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001482
1483#endif
1484
1485/* List of functions exported by this module. */
1486
1487static PyMethodDef PySSL_methods[] = {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001488 {"sslwrap", PySSL_sslwrap,
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001489 METH_VARARGS, ssl_doc},
Bill Janssen98d19da2007-09-10 21:51:02 +00001490 {"_test_decode_cert", PySSL_test_decode_certificate,
1491 METH_VARARGS},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001492#ifdef HAVE_OPENSSL_RAND
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001493 {"RAND_add", PySSL_RAND_add, METH_VARARGS,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001494 PySSL_RAND_add_doc},
1495 {"RAND_egd", PySSL_RAND_egd, METH_O,
1496 PySSL_RAND_egd_doc},
1497 {"RAND_status", (PyCFunction)PySSL_RAND_status, METH_NOARGS,
1498 PySSL_RAND_status_doc},
1499#endif
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001500 {NULL, NULL} /* Sentinel */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001501};
1502
1503
Bill Janssen98d19da2007-09-10 21:51:02 +00001504#ifdef WITH_THREAD
1505
1506/* an implementation of OpenSSL threading operations in terms
1507 of the Python C thread library */
1508
1509static PyThread_type_lock *_ssl_locks = NULL;
1510
1511static unsigned long _ssl_thread_id_function (void) {
1512 return PyThread_get_thread_ident();
1513}
1514
1515static void _ssl_thread_locking_function (int mode, int n, const char *file, int line) {
1516 /* this function is needed to perform locking on shared data
1517 structures. (Note that OpenSSL uses a number of global data
1518 structures that will be implicitly shared whenever multiple threads
1519 use OpenSSL.) Multi-threaded applications will crash at random if
1520 it is not set.
1521
1522 locking_function() must be able to handle up to CRYPTO_num_locks()
1523 different mutex locks. It sets the n-th lock if mode & CRYPTO_LOCK, and
1524 releases it otherwise.
1525
1526 file and line are the file number of the function setting the
1527 lock. They can be useful for debugging.
1528 */
1529
1530 if ((_ssl_locks == NULL) ||
Neal Norwitz5802bb22008-03-27 05:03:11 +00001531 (n < 0) || ((unsigned)n >= _ssl_locks_count))
Bill Janssen98d19da2007-09-10 21:51:02 +00001532 return;
1533
1534 if (mode & CRYPTO_LOCK) {
1535 PyThread_acquire_lock(_ssl_locks[n], 1);
1536 } else {
1537 PyThread_release_lock(_ssl_locks[n]);
1538 }
1539}
1540
1541static int _setup_ssl_threads(void) {
1542
Neal Norwitz5802bb22008-03-27 05:03:11 +00001543 unsigned int i;
Bill Janssen98d19da2007-09-10 21:51:02 +00001544
1545 if (_ssl_locks == NULL) {
1546 _ssl_locks_count = CRYPTO_num_locks();
1547 _ssl_locks = (PyThread_type_lock *)
1548 malloc(sizeof(PyThread_type_lock) * _ssl_locks_count);
1549 if (_ssl_locks == NULL)
1550 return 0;
1551 memset(_ssl_locks, 0, sizeof(PyThread_type_lock) * _ssl_locks_count);
1552 for (i = 0; i < _ssl_locks_count; i++) {
1553 _ssl_locks[i] = PyThread_allocate_lock();
1554 if (_ssl_locks[i] == NULL) {
Raymond Hettinger354cfc12009-01-26 16:52:22 +00001555 unsigned int j;
Bill Janssen98d19da2007-09-10 21:51:02 +00001556 for (j = 0; j < i; j++) {
1557 PyThread_free_lock(_ssl_locks[j]);
1558 }
1559 free(_ssl_locks);
1560 return 0;
1561 }
1562 }
1563 CRYPTO_set_locking_callback(_ssl_thread_locking_function);
1564 CRYPTO_set_id_callback(_ssl_thread_id_function);
1565 }
1566 return 1;
1567}
1568
1569#endif /* def HAVE_THREAD */
1570
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001571PyDoc_STRVAR(module_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001572"Implementation module for SSL socket operations. See the socket module\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001573for documentation.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001574
Mark Hammondfe51c6d2002-08-02 02:27:13 +00001575PyMODINIT_FUNC
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001576init_ssl(void)
1577{
1578 PyObject *m, *d;
1579
Christian Heimese93237d2007-12-19 02:37:44 +00001580 Py_TYPE(&PySSL_Type) = &PyType_Type;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001581
1582 m = Py_InitModule3("_ssl", PySSL_methods, module_doc);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00001583 if (m == NULL)
1584 return;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001585 d = PyModule_GetDict(m);
1586
1587 /* Load _socket module and its C API */
1588 if (PySocketModule_ImportModuleAndAPI())
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001589 return;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001590
1591 /* Init OpenSSL */
1592 SSL_load_error_strings();
Bill Janssen98d19da2007-09-10 21:51:02 +00001593#ifdef WITH_THREAD
1594 /* note that this will start threading if not already started */
1595 if (!_setup_ssl_threads()) {
1596 return;
1597 }
1598#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001599 SSLeay_add_ssl_algorithms();
1600
1601 /* Add symbols to module dict */
Bill Janssen98d19da2007-09-10 21:51:02 +00001602 PySSLErrorObject = PyErr_NewException("ssl.SSLError",
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001603 PySocketModule.error,
1604 NULL);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001605 if (PySSLErrorObject == NULL)
1606 return;
Bill Janssen98d19da2007-09-10 21:51:02 +00001607 if (PyDict_SetItemString(d, "SSLError", PySSLErrorObject) != 0)
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001608 return;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001609 if (PyDict_SetItemString(d, "SSLType",
1610 (PyObject *)&PySSL_Type) != 0)
1611 return;
1612 PyModule_AddIntConstant(m, "SSL_ERROR_ZERO_RETURN",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001613 PY_SSL_ERROR_ZERO_RETURN);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001614 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_READ",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001615 PY_SSL_ERROR_WANT_READ);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001616 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_WRITE",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001617 PY_SSL_ERROR_WANT_WRITE);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001618 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_X509_LOOKUP",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001619 PY_SSL_ERROR_WANT_X509_LOOKUP);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001620 PyModule_AddIntConstant(m, "SSL_ERROR_SYSCALL",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001621 PY_SSL_ERROR_SYSCALL);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001622 PyModule_AddIntConstant(m, "SSL_ERROR_SSL",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001623 PY_SSL_ERROR_SSL);
1624 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_CONNECT",
1625 PY_SSL_ERROR_WANT_CONNECT);
1626 /* non ssl.h errorcodes */
1627 PyModule_AddIntConstant(m, "SSL_ERROR_EOF",
1628 PY_SSL_ERROR_EOF);
1629 PyModule_AddIntConstant(m, "SSL_ERROR_INVALID_ERROR_CODE",
1630 PY_SSL_ERROR_INVALID_ERROR_CODE);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001631 /* cert requirements */
1632 PyModule_AddIntConstant(m, "CERT_NONE",
1633 PY_SSL_CERT_NONE);
1634 PyModule_AddIntConstant(m, "CERT_OPTIONAL",
1635 PY_SSL_CERT_OPTIONAL);
1636 PyModule_AddIntConstant(m, "CERT_REQUIRED",
1637 PY_SSL_CERT_REQUIRED);
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001638
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001639 /* protocol versions */
1640 PyModule_AddIntConstant(m, "PROTOCOL_SSLv2",
1641 PY_SSL_VERSION_SSL2);
1642 PyModule_AddIntConstant(m, "PROTOCOL_SSLv3",
1643 PY_SSL_VERSION_SSL3);
1644 PyModule_AddIntConstant(m, "PROTOCOL_SSLv23",
1645 PY_SSL_VERSION_SSL23);
1646 PyModule_AddIntConstant(m, "PROTOCOL_TLSv1",
1647 PY_SSL_VERSION_TLS1);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001648}