blob: e08a2db933744f96cf8355c925de3a290cf375b2 [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 Pitroucfd62002010-03-26 19:33:53 +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;
Christian Heimesa63f2682007-12-14 04:38:13 +0000669 const unsigned char *p;
Bill Janssen98d19da2007-09-10 21:51:02 +0000670
671 if (certificate == NULL)
672 return peer_alt_names;
673
674 /* get a memory buffer */
675 biobuf = BIO_new(BIO_s_mem());
676
677 i = 0;
678 while ((i = X509_get_ext_by_NID(
679 certificate, NID_subject_alt_name, i)) >= 0) {
680
681 if (peer_alt_names == Py_None) {
682 peer_alt_names = PyList_New(0);
683 if (peer_alt_names == NULL)
684 goto fail;
685 }
686
687 /* now decode the altName */
688 ext = X509_get_ext(certificate, i);
689 if(!(method = X509V3_EXT_get(ext))) {
690 PyErr_SetString(PySSLErrorObject,
691 ERRSTR("No method for internalizing subjectAltName!"));
692 goto fail;
693 }
694
695 p = ext->value->data;
Neal Norwitze9057ff2008-01-27 17:10:35 +0000696 if (method->it)
Bill Janssen98d19da2007-09-10 21:51:02 +0000697 names = (GENERAL_NAMES*) (ASN1_item_d2i(NULL,
698 &p,
699 ext->value->length,
700 ASN1_ITEM_ptr(method->it)));
701 else
702 names = (GENERAL_NAMES*) (method->d2i(NULL,
703 &p,
704 ext->value->length));
705
706 for(j = 0; j < sk_GENERAL_NAME_num(names); j++) {
707
708 /* get a rendering of each name in the set of names */
709
710 name = sk_GENERAL_NAME_value(names, j);
711 if (name->type == GEN_DIRNAME) {
712
713 /* we special-case DirName as a tuple of tuples of attributes */
714
715 t = PyTuple_New(2);
716 if (t == NULL) {
717 goto fail;
718 }
719
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000720 v = PyString_FromString("DirName");
Bill Janssen98d19da2007-09-10 21:51:02 +0000721 if (v == NULL) {
722 Py_DECREF(t);
723 goto fail;
724 }
725 PyTuple_SET_ITEM(t, 0, v);
726
727 v = _create_tuple_for_X509_NAME (name->d.dirn);
728 if (v == NULL) {
729 Py_DECREF(t);
730 goto fail;
731 }
732 PyTuple_SET_ITEM(t, 1, v);
733
734 } else {
735
736 /* for everything else, we use the OpenSSL print form */
737
738 (void) BIO_reset(biobuf);
739 GENERAL_NAME_print(biobuf, name);
740 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
741 if (len < 0) {
742 _setSSLError(NULL, 0, __FILE__, __LINE__);
743 goto fail;
744 }
745 vptr = strchr(buf, ':');
746 if (vptr == NULL)
747 goto fail;
748 t = PyTuple_New(2);
749 if (t == NULL)
750 goto fail;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000751 v = PyString_FromStringAndSize(buf, (vptr - buf));
Bill Janssen98d19da2007-09-10 21:51:02 +0000752 if (v == NULL) {
753 Py_DECREF(t);
754 goto fail;
755 }
756 PyTuple_SET_ITEM(t, 0, v);
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000757 v = PyString_FromStringAndSize((vptr + 1), (len - (vptr - buf + 1)));
Bill Janssen98d19da2007-09-10 21:51:02 +0000758 if (v == NULL) {
759 Py_DECREF(t);
760 goto fail;
761 }
762 PyTuple_SET_ITEM(t, 1, v);
763 }
764
765 /* and add that rendering to the list */
766
767 if (PyList_Append(peer_alt_names, t) < 0) {
768 Py_DECREF(t);
769 goto fail;
770 }
771 Py_DECREF(t);
772 }
773 }
774 BIO_free(biobuf);
775 if (peer_alt_names != Py_None) {
776 v = PyList_AsTuple(peer_alt_names);
777 Py_DECREF(peer_alt_names);
778 return v;
779 } else {
780 return peer_alt_names;
781 }
782
783
784 fail:
785 if (biobuf != NULL)
786 BIO_free(biobuf);
787
788 if (peer_alt_names != Py_None) {
789 Py_XDECREF(peer_alt_names);
790 }
791
792 return NULL;
793}
794
795static PyObject *
796_decode_certificate (X509 *certificate, int verbose) {
797
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000798 PyObject *retval = NULL;
799 BIO *biobuf = NULL;
Neal Norwitz049da9e2007-08-25 16:41:36 +0000800 PyObject *peer;
Bill Janssen98d19da2007-09-10 21:51:02 +0000801 PyObject *peer_alt_names = NULL;
Neal Norwitz049da9e2007-08-25 16:41:36 +0000802 PyObject *issuer;
803 PyObject *version;
Bill Janssen98d19da2007-09-10 21:51:02 +0000804 PyObject *sn_obj;
805 ASN1_INTEGER *serialNumber;
Neal Norwitz049da9e2007-08-25 16:41:36 +0000806 char buf[2048];
807 int len;
808 ASN1_TIME *notBefore, *notAfter;
809 PyObject *pnotBefore, *pnotAfter;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000810
811 retval = PyDict_New();
812 if (retval == NULL)
813 return NULL;
814
Bill Janssenffe576d2007-09-05 00:46:27 +0000815 peer = _create_tuple_for_X509_NAME(
Bill Janssen98d19da2007-09-10 21:51:02 +0000816 X509_get_subject_name(certificate));
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000817 if (peer == NULL)
818 goto fail0;
819 if (PyDict_SetItemString(retval, (const char *) "subject", peer) < 0) {
820 Py_DECREF(peer);
821 goto fail0;
822 }
823 Py_DECREF(peer);
824
Bill Janssen98d19da2007-09-10 21:51:02 +0000825 if (verbose) {
826 issuer = _create_tuple_for_X509_NAME(
827 X509_get_issuer_name(certificate));
828 if (issuer == NULL)
829 goto fail0;
830 if (PyDict_SetItemString(retval, (const char *)"issuer", issuer) < 0) {
831 Py_DECREF(issuer);
832 goto fail0;
833 }
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000834 Py_DECREF(issuer);
Bill Janssen98d19da2007-09-10 21:51:02 +0000835
836 version = PyInt_FromLong(X509_get_version(certificate) + 1);
837 if (PyDict_SetItemString(retval, "version", version) < 0) {
838 Py_DECREF(version);
839 goto fail0;
840 }
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000841 Py_DECREF(version);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000842 }
Bill Janssen98d19da2007-09-10 21:51:02 +0000843
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000844 /* get a memory buffer */
845 biobuf = BIO_new(BIO_s_mem());
Bill Janssen98d19da2007-09-10 21:51:02 +0000846
847 if (verbose) {
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000848
Bill Janssen98d19da2007-09-10 21:51:02 +0000849 (void) BIO_reset(biobuf);
850 serialNumber = X509_get_serialNumber(certificate);
851 /* should not exceed 20 octets, 160 bits, so buf is big enough */
852 i2a_ASN1_INTEGER(biobuf, serialNumber);
853 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
854 if (len < 0) {
855 _setSSLError(NULL, 0, __FILE__, __LINE__);
856 goto fail1;
857 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000858 sn_obj = PyString_FromStringAndSize(buf, len);
Bill Janssen98d19da2007-09-10 21:51:02 +0000859 if (sn_obj == NULL)
860 goto fail1;
861 if (PyDict_SetItemString(retval, "serialNumber", sn_obj) < 0) {
862 Py_DECREF(sn_obj);
863 goto fail1;
864 }
865 Py_DECREF(sn_obj);
866
867 (void) BIO_reset(biobuf);
868 notBefore = X509_get_notBefore(certificate);
869 ASN1_TIME_print(biobuf, notBefore);
870 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
871 if (len < 0) {
872 _setSSLError(NULL, 0, __FILE__, __LINE__);
873 goto fail1;
874 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000875 pnotBefore = PyString_FromStringAndSize(buf, len);
Bill Janssen98d19da2007-09-10 21:51:02 +0000876 if (pnotBefore == NULL)
877 goto fail1;
878 if (PyDict_SetItemString(retval, "notBefore", pnotBefore) < 0) {
879 Py_DECREF(pnotBefore);
880 goto fail1;
881 }
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000882 Py_DECREF(pnotBefore);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000883 }
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000884
Guido van Rossum780b80d2007-08-27 18:42:23 +0000885 (void) BIO_reset(biobuf);
Bill Janssen98d19da2007-09-10 21:51:02 +0000886 notAfter = X509_get_notAfter(certificate);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000887 ASN1_TIME_print(biobuf, notAfter);
888 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
Bill Janssen98d19da2007-09-10 21:51:02 +0000889 if (len < 0) {
890 _setSSLError(NULL, 0, __FILE__, __LINE__);
891 goto fail1;
892 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000893 pnotAfter = PyString_FromStringAndSize(buf, len);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000894 if (pnotAfter == NULL)
Bill Janssen98d19da2007-09-10 21:51:02 +0000895 goto fail1;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000896 if (PyDict_SetItemString(retval, "notAfter", pnotAfter) < 0) {
897 Py_DECREF(pnotAfter);
Bill Janssen98d19da2007-09-10 21:51:02 +0000898 goto fail1;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000899 }
900 Py_DECREF(pnotAfter);
Bill Janssen98d19da2007-09-10 21:51:02 +0000901
902 /* Now look for subjectAltName */
903
904 peer_alt_names = _get_peer_alt_names(certificate);
905 if (peer_alt_names == NULL)
906 goto fail1;
907 else if (peer_alt_names != Py_None) {
908 if (PyDict_SetItemString(retval, "subjectAltName",
909 peer_alt_names) < 0) {
910 Py_DECREF(peer_alt_names);
911 goto fail1;
912 }
913 Py_DECREF(peer_alt_names);
914 }
915
916 BIO_free(biobuf);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000917 return retval;
918
919 fail1:
920 if (biobuf != NULL)
921 BIO_free(biobuf);
922 fail0:
923 Py_XDECREF(retval);
924 return NULL;
925}
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000926
Bill Janssen98d19da2007-09-10 21:51:02 +0000927
928static PyObject *
929PySSL_test_decode_certificate (PyObject *mod, PyObject *args) {
930
931 PyObject *retval = NULL;
932 char *filename = NULL;
933 X509 *x=NULL;
934 BIO *cert;
935 int verbose = 1;
936
937 if (!PyArg_ParseTuple(args, "s|i:test_decode_certificate", &filename, &verbose))
938 return NULL;
939
940 if ((cert=BIO_new(BIO_s_file())) == NULL) {
941 PyErr_SetString(PySSLErrorObject, "Can't malloc memory to read file");
942 goto fail0;
943 }
944
945 if (BIO_read_filename(cert,filename) <= 0) {
946 PyErr_SetString(PySSLErrorObject, "Can't open file");
947 goto fail0;
948 }
949
950 x = PEM_read_bio_X509_AUX(cert,NULL, NULL, NULL);
951 if (x == NULL) {
952 PyErr_SetString(PySSLErrorObject, "Error decoding PEM-encoded file");
953 goto fail0;
954 }
955
956 retval = _decode_certificate(x, verbose);
957
958 fail0:
959
960 if (cert != NULL) BIO_free(cert);
961 return retval;
962}
963
964
965static PyObject *
966PySSL_peercert(PySSLObject *self, PyObject *args)
967{
968 PyObject *retval = NULL;
969 int len;
970 int verification;
971 PyObject *binary_mode = Py_None;
972
973 if (!PyArg_ParseTuple(args, "|O:peer_certificate", &binary_mode))
974 return NULL;
975
976 if (!self->peer_cert)
977 Py_RETURN_NONE;
978
979 if (PyObject_IsTrue(binary_mode)) {
980 /* return cert in DER-encoded format */
981
982 unsigned char *bytes_buf = NULL;
983
984 bytes_buf = NULL;
985 len = i2d_X509(self->peer_cert, &bytes_buf);
986 if (len < 0) {
987 PySSL_SetError(self, len, __FILE__, __LINE__);
988 return NULL;
989 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000990 retval = PyString_FromStringAndSize((const char *) bytes_buf, len);
Bill Janssen98d19da2007-09-10 21:51:02 +0000991 OPENSSL_free(bytes_buf);
992 return retval;
993
994 } else {
995
996 verification = SSL_CTX_get_verify_mode(self->ctx);
997 if ((verification & SSL_VERIFY_PEER) == 0)
998 return PyDict_New();
999 else
1000 return _decode_certificate (self->peer_cert, 0);
1001 }
1002}
1003
1004PyDoc_STRVAR(PySSL_peercert_doc,
1005"peer_certificate([der=False]) -> certificate\n\
1006\n\
1007Returns the certificate for the peer. If no certificate was provided,\n\
1008returns None. If a certificate was provided, but not validated, returns\n\
1009an empty dictionary. Otherwise returns a dict containing information\n\
1010about the peer certificate.\n\
1011\n\
1012If the optional argument is True, returns a DER-encoded copy of the\n\
1013peer certificate, or None if no certificate was provided. This will\n\
1014return the certificate even if it wasn't validated.");
1015
1016static PyObject *PySSL_cipher (PySSLObject *self) {
1017
1018 PyObject *retval, *v;
1019 SSL_CIPHER *current;
1020 char *cipher_name;
1021 char *cipher_protocol;
1022
1023 if (self->ssl == NULL)
1024 return Py_None;
1025 current = SSL_get_current_cipher(self->ssl);
1026 if (current == NULL)
1027 return Py_None;
1028
1029 retval = PyTuple_New(3);
1030 if (retval == NULL)
1031 return NULL;
1032
1033 cipher_name = (char *) SSL_CIPHER_get_name(current);
1034 if (cipher_name == NULL) {
1035 PyTuple_SET_ITEM(retval, 0, Py_None);
1036 } else {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001037 v = PyString_FromString(cipher_name);
Bill Janssen98d19da2007-09-10 21:51:02 +00001038 if (v == NULL)
1039 goto fail0;
1040 PyTuple_SET_ITEM(retval, 0, v);
1041 }
1042 cipher_protocol = SSL_CIPHER_get_version(current);
1043 if (cipher_protocol == NULL) {
1044 PyTuple_SET_ITEM(retval, 1, Py_None);
1045 } else {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001046 v = PyString_FromString(cipher_protocol);
Bill Janssen98d19da2007-09-10 21:51:02 +00001047 if (v == NULL)
1048 goto fail0;
1049 PyTuple_SET_ITEM(retval, 1, v);
1050 }
1051 v = PyInt_FromLong(SSL_CIPHER_get_bits(current, NULL));
1052 if (v == NULL)
1053 goto fail0;
1054 PyTuple_SET_ITEM(retval, 2, v);
1055 return retval;
1056
1057 fail0:
1058 Py_DECREF(retval);
1059 return NULL;
1060}
1061
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001062static void PySSL_dealloc(PySSLObject *self)
1063{
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001064 if (self->peer_cert) /* Possible not to have one? */
1065 X509_free (self->peer_cert);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001066 if (self->ssl)
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001067 SSL_free(self->ssl);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001068 if (self->ctx)
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001069 SSL_CTX_free(self->ctx);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001070 Py_XDECREF(self->Socket);
1071 PyObject_Del(self);
1072}
1073
Anthony Baxter93ab5fa2006-07-11 02:04:09 +00001074/* If the socket has a timeout, do a select()/poll() on the socket.
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001075 The argument writing indicates the direction.
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001076 Returns one of the possibilities in the timeout_state enum (above).
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001077 */
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001078
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001079static int
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001080check_socket_and_wait_for_timeout(PySocketSockObject *s, int writing)
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001081{
1082 fd_set fds;
1083 struct timeval tv;
1084 int rc;
1085
1086 /* Nothing to do unless we're in timeout mode (not non-blocking) */
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001087 if (s->sock_timeout < 0.0)
1088 return SOCKET_IS_BLOCKING;
1089 else if (s->sock_timeout == 0.0)
1090 return SOCKET_IS_NONBLOCKING;
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001091
1092 /* Guard against closed socket */
1093 if (s->sock_fd < 0)
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001094 return SOCKET_HAS_BEEN_CLOSED;
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001095
Anthony Baxter93ab5fa2006-07-11 02:04:09 +00001096 /* Prefer poll, if available, since you can poll() any fd
1097 * which can't be done with select(). */
1098#ifdef HAVE_POLL
1099 {
1100 struct pollfd pollfd;
1101 int timeout;
1102
1103 pollfd.fd = s->sock_fd;
1104 pollfd.events = writing ? POLLOUT : POLLIN;
1105
1106 /* s->sock_timeout is in seconds, timeout in ms */
1107 timeout = (int)(s->sock_timeout * 1000 + 0.5);
Bill Janssen98d19da2007-09-10 21:51:02 +00001108 PySSL_BEGIN_ALLOW_THREADS
Anthony Baxter93ab5fa2006-07-11 02:04:09 +00001109 rc = poll(&pollfd, 1, timeout);
Bill Janssen98d19da2007-09-10 21:51:02 +00001110 PySSL_END_ALLOW_THREADS
Anthony Baxter93ab5fa2006-07-11 02:04:09 +00001111
1112 goto normal_return;
1113 }
1114#endif
1115
Neal Norwitz082b2df2006-02-07 07:04:46 +00001116 /* Guard against socket too large for select*/
Martin v. Löwisf84d1b92006-02-11 09:27:05 +00001117#ifndef Py_SOCKET_FD_CAN_BE_GE_FD_SETSIZE
Neal Norwitz082b2df2006-02-07 07:04:46 +00001118 if (s->sock_fd >= FD_SETSIZE)
Neal Norwitz389cea82006-02-13 00:35:21 +00001119 return SOCKET_TOO_LARGE_FOR_SELECT;
Martin v. Löwisf84d1b92006-02-11 09:27:05 +00001120#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +00001121
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001122 /* Construct the arguments to select */
1123 tv.tv_sec = (int)s->sock_timeout;
1124 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
1125 FD_ZERO(&fds);
1126 FD_SET(s->sock_fd, &fds);
1127
1128 /* See if the socket is ready */
Bill Janssen98d19da2007-09-10 21:51:02 +00001129 PySSL_BEGIN_ALLOW_THREADS
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001130 if (writing)
1131 rc = select(s->sock_fd+1, NULL, &fds, NULL, &tv);
1132 else
1133 rc = select(s->sock_fd+1, &fds, NULL, NULL, &tv);
Bill Janssen98d19da2007-09-10 21:51:02 +00001134 PySSL_END_ALLOW_THREADS
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001135
Bill Janssen934b16d2008-06-28 22:19:33 +00001136#ifdef HAVE_POLL
Anthony Baxter93ab5fa2006-07-11 02:04:09 +00001137normal_return:
Bill Janssen934b16d2008-06-28 22:19:33 +00001138#endif
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001139 /* Return SOCKET_TIMED_OUT on timeout, SOCKET_OPERATION_OK otherwise
1140 (when we are able to write or when there's something to read) */
1141 return rc == 0 ? SOCKET_HAS_TIMED_OUT : SOCKET_OPERATION_OK;
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001142}
1143
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001144static PyObject *PySSL_SSLwrite(PySSLObject *self, PyObject *args)
1145{
1146 char *data;
1147 int len;
Martin v. Löwis405a7952003-10-27 14:24:37 +00001148 int count;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001149 int sockstate;
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001150 int err;
Bill Janssen934b16d2008-06-28 22:19:33 +00001151 int nonblocking;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001152
Martin v. Löwis405a7952003-10-27 14:24:37 +00001153 if (!PyArg_ParseTuple(args, "s#:write", &data, &count))
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001154 return NULL;
1155
Bill Janssen934b16d2008-06-28 22:19:33 +00001156 /* just in case the blocking state of the socket has been changed */
1157 nonblocking = (self->Socket->sock_timeout >= 0.0);
1158 BIO_set_nbio(SSL_get_rbio(self->ssl), nonblocking);
1159 BIO_set_nbio(SSL_get_wbio(self->ssl), nonblocking);
1160
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001161 sockstate = check_socket_and_wait_for_timeout(self->Socket, 1);
1162 if (sockstate == SOCKET_HAS_TIMED_OUT) {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001163 PyErr_SetString(PySSLErrorObject,
1164 "The write operation timed out");
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001165 return NULL;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001166 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001167 PyErr_SetString(PySSLErrorObject,
1168 "Underlying socket has been closed.");
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001169 return NULL;
Neal Norwitz389cea82006-02-13 00:35:21 +00001170 } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001171 PyErr_SetString(PySSLErrorObject,
1172 "Underlying socket too large for select().");
Neal Norwitz082b2df2006-02-07 07:04:46 +00001173 return NULL;
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001174 }
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001175 do {
1176 err = 0;
Bill Janssen98d19da2007-09-10 21:51:02 +00001177 PySSL_BEGIN_ALLOW_THREADS
Martin v. Löwis405a7952003-10-27 14:24:37 +00001178 len = SSL_write(self->ssl, data, count);
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001179 err = SSL_get_error(self->ssl, len);
Bill Janssen98d19da2007-09-10 21:51:02 +00001180 PySSL_END_ALLOW_THREADS
Martin v. Löwisafec8e32003-06-28 07:40:23 +00001181 if(PyErr_CheckSignals()) {
1182 return NULL;
1183 }
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001184 if (err == SSL_ERROR_WANT_READ) {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001185 sockstate =
1186 check_socket_and_wait_for_timeout(self->Socket, 0);
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001187 } else if (err == SSL_ERROR_WANT_WRITE) {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001188 sockstate =
1189 check_socket_and_wait_for_timeout(self->Socket, 1);
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001190 } else {
1191 sockstate = SOCKET_OPERATION_OK;
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001192 }
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001193 if (sockstate == SOCKET_HAS_TIMED_OUT) {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001194 PyErr_SetString(PySSLErrorObject,
1195 "The write operation timed out");
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001196 return NULL;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001197 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001198 PyErr_SetString(PySSLErrorObject,
1199 "Underlying socket has been closed.");
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001200 return NULL;
1201 } else if (sockstate == SOCKET_IS_NONBLOCKING) {
1202 break;
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001203 }
1204 } while (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001205 if (len > 0)
1206 return PyInt_FromLong(len);
1207 else
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001208 return PySSL_SetError(self, len, __FILE__, __LINE__);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001209}
1210
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001211PyDoc_STRVAR(PySSL_SSLwrite_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001212"write(s) -> len\n\
1213\n\
1214Writes the string s into the SSL object. Returns the number\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001215of bytes written.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001216
Bill Janssen934b16d2008-06-28 22:19:33 +00001217static PyObject *PySSL_SSLpending(PySSLObject *self)
1218{
1219 int count = 0;
1220
1221 PySSL_BEGIN_ALLOW_THREADS
1222 count = SSL_pending(self->ssl);
1223 PySSL_END_ALLOW_THREADS
1224 if (count < 0)
1225 return PySSL_SetError(self, count, __FILE__, __LINE__);
1226 else
1227 return PyInt_FromLong(count);
1228}
1229
1230PyDoc_STRVAR(PySSL_SSLpending_doc,
1231"pending() -> count\n\
1232\n\
1233Returns the number of already decrypted bytes available for read,\n\
1234pending on the connection.\n");
1235
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001236static PyObject *PySSL_SSLread(PySSLObject *self, PyObject *args)
1237{
1238 PyObject *buf;
1239 int count = 0;
1240 int len = 1024;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001241 int sockstate;
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001242 int err;
Bill Janssen934b16d2008-06-28 22:19:33 +00001243 int nonblocking;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001244
1245 if (!PyArg_ParseTuple(args, "|i:read", &len))
1246 return NULL;
1247
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001248 if (!(buf = PyString_FromStringAndSize((char *) 0, len)))
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001249 return NULL;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001250
Bill Janssen934b16d2008-06-28 22:19:33 +00001251 /* just in case the blocking state of the socket has been changed */
1252 nonblocking = (self->Socket->sock_timeout >= 0.0);
1253 BIO_set_nbio(SSL_get_rbio(self->ssl), nonblocking);
1254 BIO_set_nbio(SSL_get_wbio(self->ssl), nonblocking);
1255
Georg Brandl43f08a82006-03-31 18:01:16 +00001256 /* first check if there are bytes ready to be read */
Bill Janssen98d19da2007-09-10 21:51:02 +00001257 PySSL_BEGIN_ALLOW_THREADS
Georg Brandl43f08a82006-03-31 18:01:16 +00001258 count = SSL_pending(self->ssl);
Bill Janssen98d19da2007-09-10 21:51:02 +00001259 PySSL_END_ALLOW_THREADS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001260
Georg Brandl43f08a82006-03-31 18:01:16 +00001261 if (!count) {
1262 sockstate = check_socket_and_wait_for_timeout(self->Socket, 0);
1263 if (sockstate == SOCKET_HAS_TIMED_OUT) {
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001264 PyErr_SetString(PySSLErrorObject,
1265 "The read operation timed out");
Georg Brandl43f08a82006-03-31 18:01:16 +00001266 Py_DECREF(buf);
1267 return NULL;
1268 } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001269 PyErr_SetString(PySSLErrorObject,
1270 "Underlying socket too large for select().");
1271 Py_DECREF(buf);
Georg Brandl43f08a82006-03-31 18:01:16 +00001272 return NULL;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001273 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
Bill Janssen934b16d2008-06-28 22:19:33 +00001274 if (SSL_get_shutdown(self->ssl) !=
1275 SSL_RECEIVED_SHUTDOWN)
1276 {
1277 Py_DECREF(buf);
1278 PyErr_SetString(PySSLErrorObject,
1279 "Socket closed without SSL shutdown handshake");
1280 return NULL;
1281 } else {
1282 /* should contain a zero-length string */
1283 _PyString_Resize(&buf, 0);
1284 return buf;
1285 }
Georg Brandl43f08a82006-03-31 18:01:16 +00001286 }
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001287 }
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001288 do {
1289 err = 0;
Bill Janssen98d19da2007-09-10 21:51:02 +00001290 PySSL_BEGIN_ALLOW_THREADS
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001291 count = SSL_read(self->ssl, PyString_AsString(buf), len);
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001292 err = SSL_get_error(self->ssl, count);
Bill Janssen98d19da2007-09-10 21:51:02 +00001293 PySSL_END_ALLOW_THREADS
Martin v. Löwisafec8e32003-06-28 07:40:23 +00001294 if(PyErr_CheckSignals()) {
1295 Py_DECREF(buf);
1296 return NULL;
1297 }
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001298 if (err == SSL_ERROR_WANT_READ) {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001299 sockstate =
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001300 check_socket_and_wait_for_timeout(self->Socket, 0);
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001301 } else if (err == SSL_ERROR_WANT_WRITE) {
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001302 sockstate =
1303 check_socket_and_wait_for_timeout(self->Socket, 1);
1304 } else if ((err == SSL_ERROR_ZERO_RETURN) &&
1305 (SSL_get_shutdown(self->ssl) ==
Guido van Rossum780b80d2007-08-27 18:42:23 +00001306 SSL_RECEIVED_SHUTDOWN))
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001307 {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001308 _PyString_Resize(&buf, 0);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001309 return buf;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001310 } else {
1311 sockstate = SOCKET_OPERATION_OK;
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001312 }
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001313 if (sockstate == SOCKET_HAS_TIMED_OUT) {
1314 PyErr_SetString(PySSLErrorObject,
1315 "The read operation timed out");
Martin v. Löwisafec8e32003-06-28 07:40:23 +00001316 Py_DECREF(buf);
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001317 return NULL;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001318 } else if (sockstate == SOCKET_IS_NONBLOCKING) {
1319 break;
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001320 }
1321 } while (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001322 if (count <= 0) {
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001323 Py_DECREF(buf);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001324 return PySSL_SetError(self, count, __FILE__, __LINE__);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001325 }
Tim Peters5de98422002-04-27 18:44:32 +00001326 if (count != len)
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001327 _PyString_Resize(&buf, count);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001328 return buf;
1329}
1330
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001331PyDoc_STRVAR(PySSL_SSLread_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001332"read([len]) -> string\n\
1333\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001334Read up to len bytes from the SSL socket.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001335
Bill Janssen934b16d2008-06-28 22:19:33 +00001336static PyObject *PySSL_SSLshutdown(PySSLObject *self)
1337{
1338 int err;
1339
1340 /* Guard against closed socket */
1341 if (self->Socket->sock_fd < 0) {
1342 PyErr_SetString(PySSLErrorObject,
1343 "Underlying socket has been closed.");
1344 return NULL;
1345 }
1346
1347 PySSL_BEGIN_ALLOW_THREADS
1348 err = SSL_shutdown(self->ssl);
1349 if (err == 0) {
1350 /* we need to call it again to finish the shutdown */
1351 err = SSL_shutdown(self->ssl);
1352 }
1353 PySSL_END_ALLOW_THREADS
1354
1355 if (err < 0)
1356 return PySSL_SetError(self, err, __FILE__, __LINE__);
1357 else {
1358 Py_INCREF(self->Socket);
1359 return (PyObject *) (self->Socket);
1360 }
1361}
1362
1363PyDoc_STRVAR(PySSL_SSLshutdown_doc,
1364"shutdown(s) -> socket\n\
1365\n\
1366Does the SSL shutdown handshake with the remote end, and returns\n\
1367the underlying socket object.");
1368
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001369static PyMethodDef PySSLMethods[] = {
Bill Janssen934b16d2008-06-28 22:19:33 +00001370 {"do_handshake", (PyCFunction)PySSL_SSLdo_handshake, METH_NOARGS},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001371 {"write", (PyCFunction)PySSL_SSLwrite, METH_VARARGS,
Bill Janssen98d19da2007-09-10 21:51:02 +00001372 PySSL_SSLwrite_doc},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001373 {"read", (PyCFunction)PySSL_SSLread, METH_VARARGS,
Bill Janssen98d19da2007-09-10 21:51:02 +00001374 PySSL_SSLread_doc},
Bill Janssen934b16d2008-06-28 22:19:33 +00001375 {"pending", (PyCFunction)PySSL_SSLpending, METH_NOARGS,
1376 PySSL_SSLpending_doc},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001377 {"server", (PyCFunction)PySSL_server, METH_NOARGS},
1378 {"issuer", (PyCFunction)PySSL_issuer, METH_NOARGS},
Bill Janssen98d19da2007-09-10 21:51:02 +00001379 {"peer_certificate", (PyCFunction)PySSL_peercert, METH_VARARGS,
1380 PySSL_peercert_doc},
1381 {"cipher", (PyCFunction)PySSL_cipher, METH_NOARGS},
Bill Janssen934b16d2008-06-28 22:19:33 +00001382 {"shutdown", (PyCFunction)PySSL_SSLshutdown, METH_NOARGS,
1383 PySSL_SSLshutdown_doc},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001384 {NULL, NULL}
1385};
1386
1387static PyObject *PySSL_getattr(PySSLObject *self, char *name)
1388{
1389 return Py_FindMethod(PySSLMethods, (PyObject *)self, name);
1390}
1391
Jeremy Hylton938ace62002-07-17 16:30:39 +00001392static PyTypeObject PySSL_Type = {
Martin v. Löwis68192102007-07-21 06:55:02 +00001393 PyVarObject_HEAD_INIT(NULL, 0)
Guido van Rossum780b80d2007-08-27 18:42:23 +00001394 "ssl.SSLContext", /*tp_name*/
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001395 sizeof(PySSLObject), /*tp_basicsize*/
1396 0, /*tp_itemsize*/
1397 /* methods */
1398 (destructor)PySSL_dealloc, /*tp_dealloc*/
1399 0, /*tp_print*/
1400 (getattrfunc)PySSL_getattr, /*tp_getattr*/
1401 0, /*tp_setattr*/
1402 0, /*tp_compare*/
1403 0, /*tp_repr*/
1404 0, /*tp_as_number*/
1405 0, /*tp_as_sequence*/
1406 0, /*tp_as_mapping*/
1407 0, /*tp_hash*/
1408};
1409
1410#ifdef HAVE_OPENSSL_RAND
1411
1412/* helper routines for seeding the SSL PRNG */
1413static PyObject *
1414PySSL_RAND_add(PyObject *self, PyObject *args)
1415{
1416 char *buf;
1417 int len;
1418 double entropy;
1419
1420 if (!PyArg_ParseTuple(args, "s#d:RAND_add", &buf, &len, &entropy))
1421 return NULL;
1422 RAND_add(buf, len, entropy);
1423 Py_INCREF(Py_None);
1424 return Py_None;
1425}
1426
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001427PyDoc_STRVAR(PySSL_RAND_add_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001428"RAND_add(string, entropy)\n\
1429\n\
1430Mix string into the OpenSSL PRNG state. entropy (a float) is a lower\n\
Bill Janssen98d19da2007-09-10 21:51:02 +00001431bound on the entropy contained in string. See RFC 1750.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001432
1433static PyObject *
1434PySSL_RAND_status(PyObject *self)
1435{
1436 return PyInt_FromLong(RAND_status());
1437}
1438
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001439PyDoc_STRVAR(PySSL_RAND_status_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001440"RAND_status() -> 0 or 1\n\
1441\n\
1442Returns 1 if the OpenSSL PRNG has been seeded with enough data and 0 if not.\n\
1443It is necessary to seed the PRNG with RAND_add() on some platforms before\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001444using the ssl() function.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001445
1446static PyObject *
1447PySSL_RAND_egd(PyObject *self, PyObject *arg)
1448{
1449 int bytes;
1450
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001451 if (!PyString_Check(arg))
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001452 return PyErr_Format(PyExc_TypeError,
1453 "RAND_egd() expected string, found %s",
Christian Heimese93237d2007-12-19 02:37:44 +00001454 Py_TYPE(arg)->tp_name);
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001455 bytes = RAND_egd(PyString_AS_STRING(arg));
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001456 if (bytes == -1) {
1457 PyErr_SetString(PySSLErrorObject,
1458 "EGD connection failed or EGD did not return "
1459 "enough data to seed the PRNG");
1460 return NULL;
1461 }
1462 return PyInt_FromLong(bytes);
1463}
1464
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001465PyDoc_STRVAR(PySSL_RAND_egd_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001466"RAND_egd(path) -> bytes\n\
1467\n\
Bill Janssen98d19da2007-09-10 21:51:02 +00001468Queries the entropy gather daemon (EGD) on the socket named by 'path'.\n\
1469Returns number of bytes read. Raises SSLError if connection to EGD\n\
1470fails or if it does provide enough data to seed PRNG.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001471
1472#endif
1473
1474/* List of functions exported by this module. */
1475
1476static PyMethodDef PySSL_methods[] = {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001477 {"sslwrap", PySSL_sslwrap,
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001478 METH_VARARGS, ssl_doc},
Bill Janssen98d19da2007-09-10 21:51:02 +00001479 {"_test_decode_cert", PySSL_test_decode_certificate,
1480 METH_VARARGS},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001481#ifdef HAVE_OPENSSL_RAND
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001482 {"RAND_add", PySSL_RAND_add, METH_VARARGS,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001483 PySSL_RAND_add_doc},
1484 {"RAND_egd", PySSL_RAND_egd, METH_O,
1485 PySSL_RAND_egd_doc},
1486 {"RAND_status", (PyCFunction)PySSL_RAND_status, METH_NOARGS,
1487 PySSL_RAND_status_doc},
1488#endif
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001489 {NULL, NULL} /* Sentinel */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001490};
1491
1492
Bill Janssen98d19da2007-09-10 21:51:02 +00001493#ifdef WITH_THREAD
1494
1495/* an implementation of OpenSSL threading operations in terms
1496 of the Python C thread library */
1497
1498static PyThread_type_lock *_ssl_locks = NULL;
1499
1500static unsigned long _ssl_thread_id_function (void) {
1501 return PyThread_get_thread_ident();
1502}
1503
1504static void _ssl_thread_locking_function (int mode, int n, const char *file, int line) {
1505 /* this function is needed to perform locking on shared data
1506 structures. (Note that OpenSSL uses a number of global data
1507 structures that will be implicitly shared whenever multiple threads
1508 use OpenSSL.) Multi-threaded applications will crash at random if
1509 it is not set.
1510
1511 locking_function() must be able to handle up to CRYPTO_num_locks()
1512 different mutex locks. It sets the n-th lock if mode & CRYPTO_LOCK, and
1513 releases it otherwise.
1514
1515 file and line are the file number of the function setting the
1516 lock. They can be useful for debugging.
1517 */
1518
1519 if ((_ssl_locks == NULL) ||
Neal Norwitz5802bb22008-03-27 05:03:11 +00001520 (n < 0) || ((unsigned)n >= _ssl_locks_count))
Bill Janssen98d19da2007-09-10 21:51:02 +00001521 return;
1522
1523 if (mode & CRYPTO_LOCK) {
1524 PyThread_acquire_lock(_ssl_locks[n], 1);
1525 } else {
1526 PyThread_release_lock(_ssl_locks[n]);
1527 }
1528}
1529
1530static int _setup_ssl_threads(void) {
1531
Neal Norwitz5802bb22008-03-27 05:03:11 +00001532 unsigned int i;
Bill Janssen98d19da2007-09-10 21:51:02 +00001533
1534 if (_ssl_locks == NULL) {
1535 _ssl_locks_count = CRYPTO_num_locks();
1536 _ssl_locks = (PyThread_type_lock *)
1537 malloc(sizeof(PyThread_type_lock) * _ssl_locks_count);
1538 if (_ssl_locks == NULL)
1539 return 0;
1540 memset(_ssl_locks, 0, sizeof(PyThread_type_lock) * _ssl_locks_count);
1541 for (i = 0; i < _ssl_locks_count; i++) {
1542 _ssl_locks[i] = PyThread_allocate_lock();
1543 if (_ssl_locks[i] == NULL) {
Raymond Hettinger8fb67e02009-01-26 16:55:41 +00001544 unsigned int j;
Bill Janssen98d19da2007-09-10 21:51:02 +00001545 for (j = 0; j < i; j++) {
1546 PyThread_free_lock(_ssl_locks[j]);
1547 }
1548 free(_ssl_locks);
1549 return 0;
1550 }
1551 }
1552 CRYPTO_set_locking_callback(_ssl_thread_locking_function);
1553 CRYPTO_set_id_callback(_ssl_thread_id_function);
1554 }
1555 return 1;
1556}
1557
1558#endif /* def HAVE_THREAD */
1559
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001560PyDoc_STRVAR(module_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001561"Implementation module for SSL socket operations. See the socket module\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001562for documentation.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001563
Mark Hammondfe51c6d2002-08-02 02:27:13 +00001564PyMODINIT_FUNC
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001565init_ssl(void)
1566{
1567 PyObject *m, *d;
1568
Christian Heimese93237d2007-12-19 02:37:44 +00001569 Py_TYPE(&PySSL_Type) = &PyType_Type;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001570
1571 m = Py_InitModule3("_ssl", PySSL_methods, module_doc);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00001572 if (m == NULL)
1573 return;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001574 d = PyModule_GetDict(m);
1575
1576 /* Load _socket module and its C API */
1577 if (PySocketModule_ImportModuleAndAPI())
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001578 return;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001579
1580 /* Init OpenSSL */
1581 SSL_load_error_strings();
Bill Janssen98d19da2007-09-10 21:51:02 +00001582#ifdef WITH_THREAD
1583 /* note that this will start threading if not already started */
1584 if (!_setup_ssl_threads()) {
1585 return;
1586 }
1587#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001588 SSLeay_add_ssl_algorithms();
1589
1590 /* Add symbols to module dict */
Bill Janssen98d19da2007-09-10 21:51:02 +00001591 PySSLErrorObject = PyErr_NewException("ssl.SSLError",
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001592 PySocketModule.error,
1593 NULL);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001594 if (PySSLErrorObject == NULL)
1595 return;
Bill Janssen98d19da2007-09-10 21:51:02 +00001596 if (PyDict_SetItemString(d, "SSLError", PySSLErrorObject) != 0)
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001597 return;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001598 if (PyDict_SetItemString(d, "SSLType",
1599 (PyObject *)&PySSL_Type) != 0)
1600 return;
1601 PyModule_AddIntConstant(m, "SSL_ERROR_ZERO_RETURN",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001602 PY_SSL_ERROR_ZERO_RETURN);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001603 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_READ",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001604 PY_SSL_ERROR_WANT_READ);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001605 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_WRITE",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001606 PY_SSL_ERROR_WANT_WRITE);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001607 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_X509_LOOKUP",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001608 PY_SSL_ERROR_WANT_X509_LOOKUP);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001609 PyModule_AddIntConstant(m, "SSL_ERROR_SYSCALL",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001610 PY_SSL_ERROR_SYSCALL);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001611 PyModule_AddIntConstant(m, "SSL_ERROR_SSL",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001612 PY_SSL_ERROR_SSL);
1613 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_CONNECT",
1614 PY_SSL_ERROR_WANT_CONNECT);
1615 /* non ssl.h errorcodes */
1616 PyModule_AddIntConstant(m, "SSL_ERROR_EOF",
1617 PY_SSL_ERROR_EOF);
1618 PyModule_AddIntConstant(m, "SSL_ERROR_INVALID_ERROR_CODE",
1619 PY_SSL_ERROR_INVALID_ERROR_CODE);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001620 /* cert requirements */
1621 PyModule_AddIntConstant(m, "CERT_NONE",
1622 PY_SSL_CERT_NONE);
1623 PyModule_AddIntConstant(m, "CERT_OPTIONAL",
1624 PY_SSL_CERT_OPTIONAL);
1625 PyModule_AddIntConstant(m, "CERT_REQUIRED",
1626 PY_SSL_CERT_REQUIRED);
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001627
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001628 /* protocol versions */
1629 PyModule_AddIntConstant(m, "PROTOCOL_SSLv2",
1630 PY_SSL_VERSION_SSL2);
1631 PyModule_AddIntConstant(m, "PROTOCOL_SSLv3",
1632 PY_SSL_VERSION_SSL3);
1633 PyModule_AddIntConstant(m, "PROTOCOL_SSLv23",
1634 PY_SSL_VERSION_SSL23);
1635 PyModule_AddIntConstant(m, "PROTOCOL_TLSv1",
1636 PY_SSL_VERSION_TLS1);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001637}