blob: fd3b33ae5fc6f999c0ec164d9bf5785fb09dc159 [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 Pitrou206685b2010-04-09 20:44:09 +0000371#ifdef SSL_MODE_AUTO_RETRY
Antoine Pitroucfd62002010-03-26 19:33:53 +0000372 SSL_set_mode(self->ssl, SSL_MODE_AUTO_RETRY);
Antoine Pitrou206685b2010-04-09 20:44:09 +0000373#endif
Guido van Rossum4f707ac2003-01-31 18:13:18 +0000374
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000375 /* If the socket is in non-blocking mode or timeout mode, set the BIO
Guido van Rossum4f707ac2003-01-31 18:13:18 +0000376 * to non-blocking mode (blocking is the default)
377 */
378 if (Sock->sock_timeout >= 0.0) {
379 /* Set both the read and write BIO's to non-blocking mode */
380 BIO_set_nbio(SSL_get_rbio(self->ssl), 1);
381 BIO_set_nbio(SSL_get_wbio(self->ssl), 1);
382 }
383
Bill Janssen98d19da2007-09-10 21:51:02 +0000384 PySSL_BEGIN_ALLOW_THREADS
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000385 if (socket_type == PY_SSL_CLIENT)
386 SSL_set_connect_state(self->ssl);
387 else
388 SSL_set_accept_state(self->ssl);
Bill Janssen98d19da2007-09-10 21:51:02 +0000389 PySSL_END_ALLOW_THREADS
Martin v. Löwis09c35f72002-07-28 09:57:45 +0000390
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000391 self->Socket = Sock;
392 Py_INCREF(self->Socket);
393 return self;
394 fail:
395 if (errstr)
396 PyErr_SetString(PySSLErrorObject, errstr);
397 Py_DECREF(self);
398 return NULL;
399}
400
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000401static PyObject *
Guido van Rossum780b80d2007-08-27 18:42:23 +0000402PySSL_sslwrap(PyObject *self, PyObject *args)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000403{
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000404 PySocketSockObject *Sock;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000405 int server_side = 0;
406 int verification_mode = PY_SSL_CERT_NONE;
407 int protocol = PY_SSL_VERSION_SSL23;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000408 char *key_file = NULL;
409 char *cert_file = NULL;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000410 char *cacerts_file = NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000411
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000412 if (!PyArg_ParseTuple(args, "O!i|zziiz:sslwrap",
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000413 PySocketModule.Sock_Type,
Martin v. Löwisa811c382006-10-19 11:00:37 +0000414 &Sock,
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000415 &server_side,
416 &key_file, &cert_file,
417 &verification_mode, &protocol,
418 &cacerts_file))
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000419 return NULL;
420
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000421 /*
422 fprintf(stderr,
423 "server_side is %d, keyfile %p, certfile %p, verify_mode %d, "
424 "protocol %d, certs %p\n",
425 server_side, key_file, cert_file, verification_mode,
426 protocol, cacerts_file);
427 */
428
429 return (PyObject *) newPySSLObject(Sock, key_file, cert_file,
430 server_side, verification_mode,
431 protocol, cacerts_file);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000432}
433
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000434PyDoc_STRVAR(ssl_doc,
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000435"sslwrap(socket, server_side, [keyfile, certfile, certs_mode, protocol,\n"
436" cacertsfile]) -> sslobject");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000437
438/* SSL object methods */
439
Bill Janssen934b16d2008-06-28 22:19:33 +0000440static PyObject *PySSL_SSLdo_handshake(PySSLObject *self)
441{
442 int ret;
443 int err;
444 int sockstate;
445
446 /* Actually negotiate SSL connection */
447 /* XXX If SSL_do_handshake() returns 0, it's also a failure. */
448 sockstate = 0;
449 do {
450 PySSL_BEGIN_ALLOW_THREADS
451 ret = SSL_do_handshake(self->ssl);
452 err = SSL_get_error(self->ssl, ret);
453 PySSL_END_ALLOW_THREADS
454 if(PyErr_CheckSignals()) {
455 return NULL;
456 }
457 if (err == SSL_ERROR_WANT_READ) {
458 sockstate = check_socket_and_wait_for_timeout(self->Socket, 0);
459 } else if (err == SSL_ERROR_WANT_WRITE) {
460 sockstate = check_socket_and_wait_for_timeout(self->Socket, 1);
461 } else {
462 sockstate = SOCKET_OPERATION_OK;
463 }
464 if (sockstate == SOCKET_HAS_TIMED_OUT) {
465 PyErr_SetString(PySSLErrorObject,
466 ERRSTR("The handshake operation timed out"));
467 return NULL;
468 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
469 PyErr_SetString(PySSLErrorObject,
470 ERRSTR("Underlying socket has been closed."));
471 return NULL;
472 } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
473 PyErr_SetString(PySSLErrorObject,
474 ERRSTR("Underlying socket too large for select()."));
475 return NULL;
476 } else if (sockstate == SOCKET_IS_NONBLOCKING) {
477 break;
478 }
479 } while (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE);
480 if (ret < 1)
481 return PySSL_SetError(self, ret, __FILE__, __LINE__);
482 self->ssl->debug = 1;
483
484 if (self->peer_cert)
485 X509_free (self->peer_cert);
486 PySSL_BEGIN_ALLOW_THREADS
487 if ((self->peer_cert = SSL_get_peer_certificate(self->ssl))) {
488 X509_NAME_oneline(X509_get_subject_name(self->peer_cert),
489 self->server, X509_NAME_MAXLEN);
490 X509_NAME_oneline(X509_get_issuer_name(self->peer_cert),
491 self->issuer, X509_NAME_MAXLEN);
492 }
493 PySSL_END_ALLOW_THREADS
494
495 Py_INCREF(Py_None);
496 return Py_None;
497}
498
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000499static PyObject *
500PySSL_server(PySSLObject *self)
501{
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000502 return PyString_FromString(self->server);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000503}
504
505static PyObject *
506PySSL_issuer(PySSLObject *self)
507{
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000508 return PyString_FromString(self->issuer);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000509}
510
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000511static PyObject *
Bill Janssen98d19da2007-09-10 21:51:02 +0000512_create_tuple_for_attribute (ASN1_OBJECT *name, ASN1_STRING *value) {
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000513
Bill Janssen98d19da2007-09-10 21:51:02 +0000514 char namebuf[X509_NAME_MAXLEN];
515 int buflen;
516 PyObject *name_obj;
517 PyObject *value_obj;
518 PyObject *attr;
519 unsigned char *valuebuf = NULL;
Guido van Rossum780b80d2007-08-27 18:42:23 +0000520
Bill Janssen98d19da2007-09-10 21:51:02 +0000521 buflen = OBJ_obj2txt(namebuf, sizeof(namebuf), name, 0);
522 if (buflen < 0) {
523 _setSSLError(NULL, 0, __FILE__, __LINE__);
524 goto fail;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000525 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000526 name_obj = PyString_FromStringAndSize(namebuf, buflen);
Bill Janssen98d19da2007-09-10 21:51:02 +0000527 if (name_obj == NULL)
528 goto fail;
529
530 buflen = ASN1_STRING_to_UTF8(&valuebuf, value);
531 if (buflen < 0) {
532 _setSSLError(NULL, 0, __FILE__, __LINE__);
533 Py_DECREF(name_obj);
534 goto fail;
535 }
536 value_obj = PyUnicode_DecodeUTF8((char *) valuebuf,
537 buflen, "strict");
538 OPENSSL_free(valuebuf);
539 if (value_obj == NULL) {
540 Py_DECREF(name_obj);
541 goto fail;
542 }
543 attr = PyTuple_New(2);
544 if (attr == NULL) {
545 Py_DECREF(name_obj);
546 Py_DECREF(value_obj);
547 goto fail;
548 }
549 PyTuple_SET_ITEM(attr, 0, name_obj);
550 PyTuple_SET_ITEM(attr, 1, value_obj);
551 return attr;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000552
Bill Janssen98d19da2007-09-10 21:51:02 +0000553 fail:
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000554 return NULL;
555}
556
557static PyObject *
Bill Janssen98d19da2007-09-10 21:51:02 +0000558_create_tuple_for_X509_NAME (X509_NAME *xname)
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000559{
Bill Janssen98d19da2007-09-10 21:51:02 +0000560 PyObject *dn = NULL; /* tuple which represents the "distinguished name" */
561 PyObject *rdn = NULL; /* tuple to hold a "relative distinguished name" */
562 PyObject *rdnt;
563 PyObject *attr = NULL; /* tuple to hold an attribute */
564 int entry_count = X509_NAME_entry_count(xname);
565 X509_NAME_ENTRY *entry;
566 ASN1_OBJECT *name;
567 ASN1_STRING *value;
568 int index_counter;
569 int rdn_level = -1;
570 int retcode;
571
572 dn = PyList_New(0);
573 if (dn == NULL)
574 return NULL;
575 /* now create another tuple to hold the top-level RDN */
576 rdn = PyList_New(0);
577 if (rdn == NULL)
578 goto fail0;
579
580 for (index_counter = 0;
581 index_counter < entry_count;
582 index_counter++)
583 {
584 entry = X509_NAME_get_entry(xname, index_counter);
585
586 /* check to see if we've gotten to a new RDN */
587 if (rdn_level >= 0) {
588 if (rdn_level != entry->set) {
589 /* yes, new RDN */
590 /* add old RDN to DN */
591 rdnt = PyList_AsTuple(rdn);
592 Py_DECREF(rdn);
593 if (rdnt == NULL)
594 goto fail0;
595 retcode = PyList_Append(dn, rdnt);
596 Py_DECREF(rdnt);
597 if (retcode < 0)
598 goto fail0;
599 /* create new RDN */
600 rdn = PyList_New(0);
601 if (rdn == NULL)
602 goto fail0;
603 }
604 }
605 rdn_level = entry->set;
606
607 /* now add this attribute to the current RDN */
608 name = X509_NAME_ENTRY_get_object(entry);
609 value = X509_NAME_ENTRY_get_data(entry);
610 attr = _create_tuple_for_attribute(name, value);
611 /*
612 fprintf(stderr, "RDN level %d, attribute %s: %s\n",
613 entry->set,
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000614 PyString_AS_STRING(PyTuple_GET_ITEM(attr, 0)),
615 PyString_AS_STRING(PyTuple_GET_ITEM(attr, 1)));
Bill Janssen98d19da2007-09-10 21:51:02 +0000616 */
617 if (attr == NULL)
618 goto fail1;
619 retcode = PyList_Append(rdn, attr);
620 Py_DECREF(attr);
621 if (retcode < 0)
622 goto fail1;
623 }
624 /* now, there's typically a dangling RDN */
625 if ((rdn != NULL) && (PyList_Size(rdn) > 0)) {
626 rdnt = PyList_AsTuple(rdn);
627 Py_DECREF(rdn);
628 if (rdnt == NULL)
629 goto fail0;
630 retcode = PyList_Append(dn, rdnt);
631 Py_DECREF(rdnt);
632 if (retcode < 0)
633 goto fail0;
634 }
635
636 /* convert list to tuple */
637 rdnt = PyList_AsTuple(dn);
638 Py_DECREF(dn);
639 if (rdnt == NULL)
640 return NULL;
641 return rdnt;
642
643 fail1:
644 Py_XDECREF(rdn);
645
646 fail0:
647 Py_XDECREF(dn);
648 return NULL;
649}
650
651static PyObject *
652_get_peer_alt_names (X509 *certificate) {
653
654 /* this code follows the procedure outlined in
655 OpenSSL's crypto/x509v3/v3_prn.c:X509v3_EXT_print()
656 function to extract the STACK_OF(GENERAL_NAME),
657 then iterates through the stack to add the
658 names. */
659
660 int i, j;
661 PyObject *peer_alt_names = Py_None;
662 PyObject *v, *t;
663 X509_EXTENSION *ext = NULL;
664 GENERAL_NAMES *names = NULL;
665 GENERAL_NAME *name;
666 X509V3_EXT_METHOD *method;
667 BIO *biobuf = NULL;
668 char buf[2048];
669 char *vptr;
670 int len;
Christian Heimesa63f2682007-12-14 04:38:13 +0000671 const unsigned char *p;
Bill Janssen98d19da2007-09-10 21:51:02 +0000672
673 if (certificate == NULL)
674 return peer_alt_names;
675
676 /* get a memory buffer */
677 biobuf = BIO_new(BIO_s_mem());
678
679 i = 0;
680 while ((i = X509_get_ext_by_NID(
681 certificate, NID_subject_alt_name, i)) >= 0) {
682
683 if (peer_alt_names == Py_None) {
684 peer_alt_names = PyList_New(0);
685 if (peer_alt_names == NULL)
686 goto fail;
687 }
688
689 /* now decode the altName */
690 ext = X509_get_ext(certificate, i);
691 if(!(method = X509V3_EXT_get(ext))) {
692 PyErr_SetString(PySSLErrorObject,
693 ERRSTR("No method for internalizing subjectAltName!"));
694 goto fail;
695 }
696
697 p = ext->value->data;
Neal Norwitze9057ff2008-01-27 17:10:35 +0000698 if (method->it)
Bill Janssen98d19da2007-09-10 21:51:02 +0000699 names = (GENERAL_NAMES*) (ASN1_item_d2i(NULL,
700 &p,
701 ext->value->length,
702 ASN1_ITEM_ptr(method->it)));
703 else
704 names = (GENERAL_NAMES*) (method->d2i(NULL,
705 &p,
706 ext->value->length));
707
708 for(j = 0; j < sk_GENERAL_NAME_num(names); j++) {
709
710 /* get a rendering of each name in the set of names */
711
712 name = sk_GENERAL_NAME_value(names, j);
713 if (name->type == GEN_DIRNAME) {
714
715 /* we special-case DirName as a tuple of tuples of attributes */
716
717 t = PyTuple_New(2);
718 if (t == NULL) {
719 goto fail;
720 }
721
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000722 v = PyString_FromString("DirName");
Bill Janssen98d19da2007-09-10 21:51:02 +0000723 if (v == NULL) {
724 Py_DECREF(t);
725 goto fail;
726 }
727 PyTuple_SET_ITEM(t, 0, v);
728
729 v = _create_tuple_for_X509_NAME (name->d.dirn);
730 if (v == NULL) {
731 Py_DECREF(t);
732 goto fail;
733 }
734 PyTuple_SET_ITEM(t, 1, v);
735
736 } else {
737
738 /* for everything else, we use the OpenSSL print form */
739
740 (void) BIO_reset(biobuf);
741 GENERAL_NAME_print(biobuf, name);
742 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
743 if (len < 0) {
744 _setSSLError(NULL, 0, __FILE__, __LINE__);
745 goto fail;
746 }
747 vptr = strchr(buf, ':');
748 if (vptr == NULL)
749 goto fail;
750 t = PyTuple_New(2);
751 if (t == NULL)
752 goto fail;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000753 v = PyString_FromStringAndSize(buf, (vptr - buf));
Bill Janssen98d19da2007-09-10 21:51:02 +0000754 if (v == NULL) {
755 Py_DECREF(t);
756 goto fail;
757 }
758 PyTuple_SET_ITEM(t, 0, v);
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000759 v = PyString_FromStringAndSize((vptr + 1), (len - (vptr - buf + 1)));
Bill Janssen98d19da2007-09-10 21:51:02 +0000760 if (v == NULL) {
761 Py_DECREF(t);
762 goto fail;
763 }
764 PyTuple_SET_ITEM(t, 1, v);
765 }
766
767 /* and add that rendering to the list */
768
769 if (PyList_Append(peer_alt_names, t) < 0) {
770 Py_DECREF(t);
771 goto fail;
772 }
773 Py_DECREF(t);
774 }
775 }
776 BIO_free(biobuf);
777 if (peer_alt_names != Py_None) {
778 v = PyList_AsTuple(peer_alt_names);
779 Py_DECREF(peer_alt_names);
780 return v;
781 } else {
782 return peer_alt_names;
783 }
784
785
786 fail:
787 if (biobuf != NULL)
788 BIO_free(biobuf);
789
790 if (peer_alt_names != Py_None) {
791 Py_XDECREF(peer_alt_names);
792 }
793
794 return NULL;
795}
796
797static PyObject *
798_decode_certificate (X509 *certificate, int verbose) {
799
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000800 PyObject *retval = NULL;
801 BIO *biobuf = NULL;
Neal Norwitz049da9e2007-08-25 16:41:36 +0000802 PyObject *peer;
Bill Janssen98d19da2007-09-10 21:51:02 +0000803 PyObject *peer_alt_names = NULL;
Neal Norwitz049da9e2007-08-25 16:41:36 +0000804 PyObject *issuer;
805 PyObject *version;
Bill Janssen98d19da2007-09-10 21:51:02 +0000806 PyObject *sn_obj;
807 ASN1_INTEGER *serialNumber;
Neal Norwitz049da9e2007-08-25 16:41:36 +0000808 char buf[2048];
809 int len;
810 ASN1_TIME *notBefore, *notAfter;
811 PyObject *pnotBefore, *pnotAfter;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000812
813 retval = PyDict_New();
814 if (retval == NULL)
815 return NULL;
816
Bill Janssenffe576d2007-09-05 00:46:27 +0000817 peer = _create_tuple_for_X509_NAME(
Bill Janssen98d19da2007-09-10 21:51:02 +0000818 X509_get_subject_name(certificate));
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000819 if (peer == NULL)
820 goto fail0;
821 if (PyDict_SetItemString(retval, (const char *) "subject", peer) < 0) {
822 Py_DECREF(peer);
823 goto fail0;
824 }
825 Py_DECREF(peer);
826
Bill Janssen98d19da2007-09-10 21:51:02 +0000827 if (verbose) {
828 issuer = _create_tuple_for_X509_NAME(
829 X509_get_issuer_name(certificate));
830 if (issuer == NULL)
831 goto fail0;
832 if (PyDict_SetItemString(retval, (const char *)"issuer", issuer) < 0) {
833 Py_DECREF(issuer);
834 goto fail0;
835 }
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000836 Py_DECREF(issuer);
Bill Janssen98d19da2007-09-10 21:51:02 +0000837
838 version = PyInt_FromLong(X509_get_version(certificate) + 1);
839 if (PyDict_SetItemString(retval, "version", version) < 0) {
840 Py_DECREF(version);
841 goto fail0;
842 }
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000843 Py_DECREF(version);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000844 }
Bill Janssen98d19da2007-09-10 21:51:02 +0000845
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000846 /* get a memory buffer */
847 biobuf = BIO_new(BIO_s_mem());
Bill Janssen98d19da2007-09-10 21:51:02 +0000848
849 if (verbose) {
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000850
Bill Janssen98d19da2007-09-10 21:51:02 +0000851 (void) BIO_reset(biobuf);
852 serialNumber = X509_get_serialNumber(certificate);
853 /* should not exceed 20 octets, 160 bits, so buf is big enough */
854 i2a_ASN1_INTEGER(biobuf, serialNumber);
855 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
856 if (len < 0) {
857 _setSSLError(NULL, 0, __FILE__, __LINE__);
858 goto fail1;
859 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000860 sn_obj = PyString_FromStringAndSize(buf, len);
Bill Janssen98d19da2007-09-10 21:51:02 +0000861 if (sn_obj == NULL)
862 goto fail1;
863 if (PyDict_SetItemString(retval, "serialNumber", sn_obj) < 0) {
864 Py_DECREF(sn_obj);
865 goto fail1;
866 }
867 Py_DECREF(sn_obj);
868
869 (void) BIO_reset(biobuf);
870 notBefore = X509_get_notBefore(certificate);
871 ASN1_TIME_print(biobuf, notBefore);
872 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
873 if (len < 0) {
874 _setSSLError(NULL, 0, __FILE__, __LINE__);
875 goto fail1;
876 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000877 pnotBefore = PyString_FromStringAndSize(buf, len);
Bill Janssen98d19da2007-09-10 21:51:02 +0000878 if (pnotBefore == NULL)
879 goto fail1;
880 if (PyDict_SetItemString(retval, "notBefore", pnotBefore) < 0) {
881 Py_DECREF(pnotBefore);
882 goto fail1;
883 }
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000884 Py_DECREF(pnotBefore);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000885 }
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000886
Guido van Rossum780b80d2007-08-27 18:42:23 +0000887 (void) BIO_reset(biobuf);
Bill Janssen98d19da2007-09-10 21:51:02 +0000888 notAfter = X509_get_notAfter(certificate);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000889 ASN1_TIME_print(biobuf, notAfter);
890 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
Bill Janssen98d19da2007-09-10 21:51:02 +0000891 if (len < 0) {
892 _setSSLError(NULL, 0, __FILE__, __LINE__);
893 goto fail1;
894 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000895 pnotAfter = PyString_FromStringAndSize(buf, len);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000896 if (pnotAfter == NULL)
Bill Janssen98d19da2007-09-10 21:51:02 +0000897 goto fail1;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000898 if (PyDict_SetItemString(retval, "notAfter", pnotAfter) < 0) {
899 Py_DECREF(pnotAfter);
Bill Janssen98d19da2007-09-10 21:51:02 +0000900 goto fail1;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000901 }
902 Py_DECREF(pnotAfter);
Bill Janssen98d19da2007-09-10 21:51:02 +0000903
904 /* Now look for subjectAltName */
905
906 peer_alt_names = _get_peer_alt_names(certificate);
907 if (peer_alt_names == NULL)
908 goto fail1;
909 else if (peer_alt_names != Py_None) {
910 if (PyDict_SetItemString(retval, "subjectAltName",
911 peer_alt_names) < 0) {
912 Py_DECREF(peer_alt_names);
913 goto fail1;
914 }
915 Py_DECREF(peer_alt_names);
916 }
917
918 BIO_free(biobuf);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000919 return retval;
920
921 fail1:
922 if (biobuf != NULL)
923 BIO_free(biobuf);
924 fail0:
925 Py_XDECREF(retval);
926 return NULL;
927}
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000928
Bill Janssen98d19da2007-09-10 21:51:02 +0000929
930static PyObject *
931PySSL_test_decode_certificate (PyObject *mod, PyObject *args) {
932
933 PyObject *retval = NULL;
934 char *filename = NULL;
935 X509 *x=NULL;
936 BIO *cert;
937 int verbose = 1;
938
939 if (!PyArg_ParseTuple(args, "s|i:test_decode_certificate", &filename, &verbose))
940 return NULL;
941
942 if ((cert=BIO_new(BIO_s_file())) == NULL) {
943 PyErr_SetString(PySSLErrorObject, "Can't malloc memory to read file");
944 goto fail0;
945 }
946
947 if (BIO_read_filename(cert,filename) <= 0) {
948 PyErr_SetString(PySSLErrorObject, "Can't open file");
949 goto fail0;
950 }
951
952 x = PEM_read_bio_X509_AUX(cert,NULL, NULL, NULL);
953 if (x == NULL) {
954 PyErr_SetString(PySSLErrorObject, "Error decoding PEM-encoded file");
955 goto fail0;
956 }
957
958 retval = _decode_certificate(x, verbose);
959
960 fail0:
961
962 if (cert != NULL) BIO_free(cert);
963 return retval;
964}
965
966
967static PyObject *
968PySSL_peercert(PySSLObject *self, PyObject *args)
969{
970 PyObject *retval = NULL;
971 int len;
972 int verification;
973 PyObject *binary_mode = Py_None;
974
975 if (!PyArg_ParseTuple(args, "|O:peer_certificate", &binary_mode))
976 return NULL;
977
978 if (!self->peer_cert)
979 Py_RETURN_NONE;
980
981 if (PyObject_IsTrue(binary_mode)) {
982 /* return cert in DER-encoded format */
983
984 unsigned char *bytes_buf = NULL;
985
986 bytes_buf = NULL;
987 len = i2d_X509(self->peer_cert, &bytes_buf);
988 if (len < 0) {
989 PySSL_SetError(self, len, __FILE__, __LINE__);
990 return NULL;
991 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000992 retval = PyString_FromStringAndSize((const char *) bytes_buf, len);
Bill Janssen98d19da2007-09-10 21:51:02 +0000993 OPENSSL_free(bytes_buf);
994 return retval;
995
996 } else {
997
998 verification = SSL_CTX_get_verify_mode(self->ctx);
999 if ((verification & SSL_VERIFY_PEER) == 0)
1000 return PyDict_New();
1001 else
1002 return _decode_certificate (self->peer_cert, 0);
1003 }
1004}
1005
1006PyDoc_STRVAR(PySSL_peercert_doc,
1007"peer_certificate([der=False]) -> certificate\n\
1008\n\
1009Returns the certificate for the peer. If no certificate was provided,\n\
1010returns None. If a certificate was provided, but not validated, returns\n\
1011an empty dictionary. Otherwise returns a dict containing information\n\
1012about the peer certificate.\n\
1013\n\
1014If the optional argument is True, returns a DER-encoded copy of the\n\
1015peer certificate, or None if no certificate was provided. This will\n\
1016return the certificate even if it wasn't validated.");
1017
1018static PyObject *PySSL_cipher (PySSLObject *self) {
1019
1020 PyObject *retval, *v;
1021 SSL_CIPHER *current;
1022 char *cipher_name;
1023 char *cipher_protocol;
1024
1025 if (self->ssl == NULL)
1026 return Py_None;
1027 current = SSL_get_current_cipher(self->ssl);
1028 if (current == NULL)
1029 return Py_None;
1030
1031 retval = PyTuple_New(3);
1032 if (retval == NULL)
1033 return NULL;
1034
1035 cipher_name = (char *) SSL_CIPHER_get_name(current);
1036 if (cipher_name == NULL) {
1037 PyTuple_SET_ITEM(retval, 0, Py_None);
1038 } else {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001039 v = PyString_FromString(cipher_name);
Bill Janssen98d19da2007-09-10 21:51:02 +00001040 if (v == NULL)
1041 goto fail0;
1042 PyTuple_SET_ITEM(retval, 0, v);
1043 }
1044 cipher_protocol = SSL_CIPHER_get_version(current);
1045 if (cipher_protocol == NULL) {
1046 PyTuple_SET_ITEM(retval, 1, Py_None);
1047 } else {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001048 v = PyString_FromString(cipher_protocol);
Bill Janssen98d19da2007-09-10 21:51:02 +00001049 if (v == NULL)
1050 goto fail0;
1051 PyTuple_SET_ITEM(retval, 1, v);
1052 }
1053 v = PyInt_FromLong(SSL_CIPHER_get_bits(current, NULL));
1054 if (v == NULL)
1055 goto fail0;
1056 PyTuple_SET_ITEM(retval, 2, v);
1057 return retval;
1058
1059 fail0:
1060 Py_DECREF(retval);
1061 return NULL;
1062}
1063
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001064static void PySSL_dealloc(PySSLObject *self)
1065{
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001066 if (self->peer_cert) /* Possible not to have one? */
1067 X509_free (self->peer_cert);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001068 if (self->ssl)
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001069 SSL_free(self->ssl);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001070 if (self->ctx)
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001071 SSL_CTX_free(self->ctx);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001072 Py_XDECREF(self->Socket);
1073 PyObject_Del(self);
1074}
1075
Anthony Baxter93ab5fa2006-07-11 02:04:09 +00001076/* If the socket has a timeout, do a select()/poll() on the socket.
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001077 The argument writing indicates the direction.
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001078 Returns one of the possibilities in the timeout_state enum (above).
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001079 */
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001080
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001081static int
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001082check_socket_and_wait_for_timeout(PySocketSockObject *s, int writing)
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001083{
1084 fd_set fds;
1085 struct timeval tv;
1086 int rc;
1087
1088 /* Nothing to do unless we're in timeout mode (not non-blocking) */
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001089 if (s->sock_timeout < 0.0)
1090 return SOCKET_IS_BLOCKING;
1091 else if (s->sock_timeout == 0.0)
1092 return SOCKET_IS_NONBLOCKING;
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001093
1094 /* Guard against closed socket */
1095 if (s->sock_fd < 0)
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001096 return SOCKET_HAS_BEEN_CLOSED;
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001097
Anthony Baxter93ab5fa2006-07-11 02:04:09 +00001098 /* Prefer poll, if available, since you can poll() any fd
1099 * which can't be done with select(). */
1100#ifdef HAVE_POLL
1101 {
1102 struct pollfd pollfd;
1103 int timeout;
1104
1105 pollfd.fd = s->sock_fd;
1106 pollfd.events = writing ? POLLOUT : POLLIN;
1107
1108 /* s->sock_timeout is in seconds, timeout in ms */
1109 timeout = (int)(s->sock_timeout * 1000 + 0.5);
Bill Janssen98d19da2007-09-10 21:51:02 +00001110 PySSL_BEGIN_ALLOW_THREADS
Anthony Baxter93ab5fa2006-07-11 02:04:09 +00001111 rc = poll(&pollfd, 1, timeout);
Bill Janssen98d19da2007-09-10 21:51:02 +00001112 PySSL_END_ALLOW_THREADS
Anthony Baxter93ab5fa2006-07-11 02:04:09 +00001113
1114 goto normal_return;
1115 }
1116#endif
1117
Neal Norwitz082b2df2006-02-07 07:04:46 +00001118 /* Guard against socket too large for select*/
Martin v. Löwisf84d1b92006-02-11 09:27:05 +00001119#ifndef Py_SOCKET_FD_CAN_BE_GE_FD_SETSIZE
Neal Norwitz082b2df2006-02-07 07:04:46 +00001120 if (s->sock_fd >= FD_SETSIZE)
Neal Norwitz389cea82006-02-13 00:35:21 +00001121 return SOCKET_TOO_LARGE_FOR_SELECT;
Martin v. Löwisf84d1b92006-02-11 09:27:05 +00001122#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +00001123
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001124 /* Construct the arguments to select */
1125 tv.tv_sec = (int)s->sock_timeout;
1126 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
1127 FD_ZERO(&fds);
1128 FD_SET(s->sock_fd, &fds);
1129
1130 /* See if the socket is ready */
Bill Janssen98d19da2007-09-10 21:51:02 +00001131 PySSL_BEGIN_ALLOW_THREADS
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001132 if (writing)
1133 rc = select(s->sock_fd+1, NULL, &fds, NULL, &tv);
1134 else
1135 rc = select(s->sock_fd+1, &fds, NULL, NULL, &tv);
Bill Janssen98d19da2007-09-10 21:51:02 +00001136 PySSL_END_ALLOW_THREADS
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001137
Bill Janssen934b16d2008-06-28 22:19:33 +00001138#ifdef HAVE_POLL
Anthony Baxter93ab5fa2006-07-11 02:04:09 +00001139normal_return:
Bill Janssen934b16d2008-06-28 22:19:33 +00001140#endif
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001141 /* Return SOCKET_TIMED_OUT on timeout, SOCKET_OPERATION_OK otherwise
1142 (when we are able to write or when there's something to read) */
1143 return rc == 0 ? SOCKET_HAS_TIMED_OUT : SOCKET_OPERATION_OK;
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001144}
1145
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001146static PyObject *PySSL_SSLwrite(PySSLObject *self, PyObject *args)
1147{
1148 char *data;
1149 int len;
Martin v. Löwis405a7952003-10-27 14:24:37 +00001150 int count;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001151 int sockstate;
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001152 int err;
Bill Janssen934b16d2008-06-28 22:19:33 +00001153 int nonblocking;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001154
Martin v. Löwis405a7952003-10-27 14:24:37 +00001155 if (!PyArg_ParseTuple(args, "s#:write", &data, &count))
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001156 return NULL;
1157
Bill Janssen934b16d2008-06-28 22:19:33 +00001158 /* just in case the blocking state of the socket has been changed */
1159 nonblocking = (self->Socket->sock_timeout >= 0.0);
1160 BIO_set_nbio(SSL_get_rbio(self->ssl), nonblocking);
1161 BIO_set_nbio(SSL_get_wbio(self->ssl), nonblocking);
1162
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001163 sockstate = check_socket_and_wait_for_timeout(self->Socket, 1);
1164 if (sockstate == SOCKET_HAS_TIMED_OUT) {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001165 PyErr_SetString(PySSLErrorObject,
1166 "The write operation timed out");
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001167 return NULL;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001168 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001169 PyErr_SetString(PySSLErrorObject,
1170 "Underlying socket has been closed.");
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001171 return NULL;
Neal Norwitz389cea82006-02-13 00:35:21 +00001172 } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001173 PyErr_SetString(PySSLErrorObject,
1174 "Underlying socket too large for select().");
Neal Norwitz082b2df2006-02-07 07:04:46 +00001175 return NULL;
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001176 }
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001177 do {
1178 err = 0;
Bill Janssen98d19da2007-09-10 21:51:02 +00001179 PySSL_BEGIN_ALLOW_THREADS
Martin v. Löwis405a7952003-10-27 14:24:37 +00001180 len = SSL_write(self->ssl, data, count);
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001181 err = SSL_get_error(self->ssl, len);
Bill Janssen98d19da2007-09-10 21:51:02 +00001182 PySSL_END_ALLOW_THREADS
Martin v. Löwisafec8e32003-06-28 07:40:23 +00001183 if(PyErr_CheckSignals()) {
1184 return NULL;
1185 }
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001186 if (err == SSL_ERROR_WANT_READ) {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001187 sockstate =
1188 check_socket_and_wait_for_timeout(self->Socket, 0);
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001189 } else if (err == SSL_ERROR_WANT_WRITE) {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001190 sockstate =
1191 check_socket_and_wait_for_timeout(self->Socket, 1);
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001192 } else {
1193 sockstate = SOCKET_OPERATION_OK;
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001194 }
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001195 if (sockstate == SOCKET_HAS_TIMED_OUT) {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001196 PyErr_SetString(PySSLErrorObject,
1197 "The write operation timed out");
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001198 return NULL;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001199 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001200 PyErr_SetString(PySSLErrorObject,
1201 "Underlying socket has been closed.");
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001202 return NULL;
1203 } else if (sockstate == SOCKET_IS_NONBLOCKING) {
1204 break;
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001205 }
1206 } while (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001207 if (len > 0)
1208 return PyInt_FromLong(len);
1209 else
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001210 return PySSL_SetError(self, len, __FILE__, __LINE__);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001211}
1212
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001213PyDoc_STRVAR(PySSL_SSLwrite_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001214"write(s) -> len\n\
1215\n\
1216Writes the string s into the SSL object. Returns the number\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001217of bytes written.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001218
Bill Janssen934b16d2008-06-28 22:19:33 +00001219static PyObject *PySSL_SSLpending(PySSLObject *self)
1220{
1221 int count = 0;
1222
1223 PySSL_BEGIN_ALLOW_THREADS
1224 count = SSL_pending(self->ssl);
1225 PySSL_END_ALLOW_THREADS
1226 if (count < 0)
1227 return PySSL_SetError(self, count, __FILE__, __LINE__);
1228 else
1229 return PyInt_FromLong(count);
1230}
1231
1232PyDoc_STRVAR(PySSL_SSLpending_doc,
1233"pending() -> count\n\
1234\n\
1235Returns the number of already decrypted bytes available for read,\n\
1236pending on the connection.\n");
1237
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001238static PyObject *PySSL_SSLread(PySSLObject *self, PyObject *args)
1239{
1240 PyObject *buf;
1241 int count = 0;
1242 int len = 1024;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001243 int sockstate;
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001244 int err;
Bill Janssen934b16d2008-06-28 22:19:33 +00001245 int nonblocking;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001246
1247 if (!PyArg_ParseTuple(args, "|i:read", &len))
1248 return NULL;
1249
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001250 if (!(buf = PyString_FromStringAndSize((char *) 0, len)))
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001251 return NULL;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001252
Bill Janssen934b16d2008-06-28 22:19:33 +00001253 /* just in case the blocking state of the socket has been changed */
1254 nonblocking = (self->Socket->sock_timeout >= 0.0);
1255 BIO_set_nbio(SSL_get_rbio(self->ssl), nonblocking);
1256 BIO_set_nbio(SSL_get_wbio(self->ssl), nonblocking);
1257
Georg Brandl43f08a82006-03-31 18:01:16 +00001258 /* first check if there are bytes ready to be read */
Bill Janssen98d19da2007-09-10 21:51:02 +00001259 PySSL_BEGIN_ALLOW_THREADS
Georg Brandl43f08a82006-03-31 18:01:16 +00001260 count = SSL_pending(self->ssl);
Bill Janssen98d19da2007-09-10 21:51:02 +00001261 PySSL_END_ALLOW_THREADS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001262
Georg Brandl43f08a82006-03-31 18:01:16 +00001263 if (!count) {
1264 sockstate = check_socket_and_wait_for_timeout(self->Socket, 0);
1265 if (sockstate == SOCKET_HAS_TIMED_OUT) {
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001266 PyErr_SetString(PySSLErrorObject,
1267 "The read operation timed out");
Georg Brandl43f08a82006-03-31 18:01:16 +00001268 Py_DECREF(buf);
1269 return NULL;
1270 } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001271 PyErr_SetString(PySSLErrorObject,
1272 "Underlying socket too large for select().");
1273 Py_DECREF(buf);
Georg Brandl43f08a82006-03-31 18:01:16 +00001274 return NULL;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001275 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
Bill Janssen934b16d2008-06-28 22:19:33 +00001276 if (SSL_get_shutdown(self->ssl) !=
1277 SSL_RECEIVED_SHUTDOWN)
1278 {
1279 Py_DECREF(buf);
1280 PyErr_SetString(PySSLErrorObject,
1281 "Socket closed without SSL shutdown handshake");
1282 return NULL;
1283 } else {
1284 /* should contain a zero-length string */
1285 _PyString_Resize(&buf, 0);
1286 return buf;
1287 }
Georg Brandl43f08a82006-03-31 18:01:16 +00001288 }
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001289 }
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001290 do {
1291 err = 0;
Bill Janssen98d19da2007-09-10 21:51:02 +00001292 PySSL_BEGIN_ALLOW_THREADS
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001293 count = SSL_read(self->ssl, PyString_AsString(buf), len);
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001294 err = SSL_get_error(self->ssl, count);
Bill Janssen98d19da2007-09-10 21:51:02 +00001295 PySSL_END_ALLOW_THREADS
Martin v. Löwisafec8e32003-06-28 07:40:23 +00001296 if(PyErr_CheckSignals()) {
1297 Py_DECREF(buf);
1298 return NULL;
1299 }
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001300 if (err == SSL_ERROR_WANT_READ) {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001301 sockstate =
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001302 check_socket_and_wait_for_timeout(self->Socket, 0);
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001303 } else if (err == SSL_ERROR_WANT_WRITE) {
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001304 sockstate =
1305 check_socket_and_wait_for_timeout(self->Socket, 1);
1306 } else if ((err == SSL_ERROR_ZERO_RETURN) &&
1307 (SSL_get_shutdown(self->ssl) ==
Guido van Rossum780b80d2007-08-27 18:42:23 +00001308 SSL_RECEIVED_SHUTDOWN))
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001309 {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001310 _PyString_Resize(&buf, 0);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001311 return buf;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001312 } else {
1313 sockstate = SOCKET_OPERATION_OK;
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001314 }
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001315 if (sockstate == SOCKET_HAS_TIMED_OUT) {
1316 PyErr_SetString(PySSLErrorObject,
1317 "The read operation timed out");
Martin v. Löwisafec8e32003-06-28 07:40:23 +00001318 Py_DECREF(buf);
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001319 return NULL;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001320 } else if (sockstate == SOCKET_IS_NONBLOCKING) {
1321 break;
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001322 }
1323 } while (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001324 if (count <= 0) {
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001325 Py_DECREF(buf);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001326 return PySSL_SetError(self, count, __FILE__, __LINE__);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001327 }
Tim Peters5de98422002-04-27 18:44:32 +00001328 if (count != len)
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001329 _PyString_Resize(&buf, count);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001330 return buf;
1331}
1332
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001333PyDoc_STRVAR(PySSL_SSLread_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001334"read([len]) -> string\n\
1335\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001336Read up to len bytes from the SSL socket.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001337
Bill Janssen934b16d2008-06-28 22:19:33 +00001338static PyObject *PySSL_SSLshutdown(PySSLObject *self)
1339{
1340 int err;
1341
1342 /* Guard against closed socket */
1343 if (self->Socket->sock_fd < 0) {
1344 PyErr_SetString(PySSLErrorObject,
1345 "Underlying socket has been closed.");
1346 return NULL;
1347 }
1348
1349 PySSL_BEGIN_ALLOW_THREADS
1350 err = SSL_shutdown(self->ssl);
1351 if (err == 0) {
1352 /* we need to call it again to finish the shutdown */
1353 err = SSL_shutdown(self->ssl);
1354 }
1355 PySSL_END_ALLOW_THREADS
1356
1357 if (err < 0)
1358 return PySSL_SetError(self, err, __FILE__, __LINE__);
1359 else {
1360 Py_INCREF(self->Socket);
1361 return (PyObject *) (self->Socket);
1362 }
1363}
1364
1365PyDoc_STRVAR(PySSL_SSLshutdown_doc,
1366"shutdown(s) -> socket\n\
1367\n\
1368Does the SSL shutdown handshake with the remote end, and returns\n\
1369the underlying socket object.");
1370
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001371static PyMethodDef PySSLMethods[] = {
Bill Janssen934b16d2008-06-28 22:19:33 +00001372 {"do_handshake", (PyCFunction)PySSL_SSLdo_handshake, METH_NOARGS},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001373 {"write", (PyCFunction)PySSL_SSLwrite, METH_VARARGS,
Bill Janssen98d19da2007-09-10 21:51:02 +00001374 PySSL_SSLwrite_doc},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001375 {"read", (PyCFunction)PySSL_SSLread, METH_VARARGS,
Bill Janssen98d19da2007-09-10 21:51:02 +00001376 PySSL_SSLread_doc},
Bill Janssen934b16d2008-06-28 22:19:33 +00001377 {"pending", (PyCFunction)PySSL_SSLpending, METH_NOARGS,
1378 PySSL_SSLpending_doc},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001379 {"server", (PyCFunction)PySSL_server, METH_NOARGS},
1380 {"issuer", (PyCFunction)PySSL_issuer, METH_NOARGS},
Bill Janssen98d19da2007-09-10 21:51:02 +00001381 {"peer_certificate", (PyCFunction)PySSL_peercert, METH_VARARGS,
1382 PySSL_peercert_doc},
1383 {"cipher", (PyCFunction)PySSL_cipher, METH_NOARGS},
Bill Janssen934b16d2008-06-28 22:19:33 +00001384 {"shutdown", (PyCFunction)PySSL_SSLshutdown, METH_NOARGS,
1385 PySSL_SSLshutdown_doc},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001386 {NULL, NULL}
1387};
1388
1389static PyObject *PySSL_getattr(PySSLObject *self, char *name)
1390{
1391 return Py_FindMethod(PySSLMethods, (PyObject *)self, name);
1392}
1393
Jeremy Hylton938ace62002-07-17 16:30:39 +00001394static PyTypeObject PySSL_Type = {
Martin v. Löwis68192102007-07-21 06:55:02 +00001395 PyVarObject_HEAD_INIT(NULL, 0)
Guido van Rossum780b80d2007-08-27 18:42:23 +00001396 "ssl.SSLContext", /*tp_name*/
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001397 sizeof(PySSLObject), /*tp_basicsize*/
1398 0, /*tp_itemsize*/
1399 /* methods */
1400 (destructor)PySSL_dealloc, /*tp_dealloc*/
1401 0, /*tp_print*/
1402 (getattrfunc)PySSL_getattr, /*tp_getattr*/
1403 0, /*tp_setattr*/
1404 0, /*tp_compare*/
1405 0, /*tp_repr*/
1406 0, /*tp_as_number*/
1407 0, /*tp_as_sequence*/
1408 0, /*tp_as_mapping*/
1409 0, /*tp_hash*/
1410};
1411
1412#ifdef HAVE_OPENSSL_RAND
1413
1414/* helper routines for seeding the SSL PRNG */
1415static PyObject *
1416PySSL_RAND_add(PyObject *self, PyObject *args)
1417{
1418 char *buf;
1419 int len;
1420 double entropy;
1421
1422 if (!PyArg_ParseTuple(args, "s#d:RAND_add", &buf, &len, &entropy))
1423 return NULL;
1424 RAND_add(buf, len, entropy);
1425 Py_INCREF(Py_None);
1426 return Py_None;
1427}
1428
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001429PyDoc_STRVAR(PySSL_RAND_add_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001430"RAND_add(string, entropy)\n\
1431\n\
1432Mix string into the OpenSSL PRNG state. entropy (a float) is a lower\n\
Bill Janssen98d19da2007-09-10 21:51:02 +00001433bound on the entropy contained in string. See RFC 1750.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001434
1435static PyObject *
1436PySSL_RAND_status(PyObject *self)
1437{
1438 return PyInt_FromLong(RAND_status());
1439}
1440
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001441PyDoc_STRVAR(PySSL_RAND_status_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001442"RAND_status() -> 0 or 1\n\
1443\n\
1444Returns 1 if the OpenSSL PRNG has been seeded with enough data and 0 if not.\n\
1445It is necessary to seed the PRNG with RAND_add() on some platforms before\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001446using the ssl() function.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001447
1448static PyObject *
1449PySSL_RAND_egd(PyObject *self, PyObject *arg)
1450{
1451 int bytes;
1452
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001453 if (!PyString_Check(arg))
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001454 return PyErr_Format(PyExc_TypeError,
1455 "RAND_egd() expected string, found %s",
Christian Heimese93237d2007-12-19 02:37:44 +00001456 Py_TYPE(arg)->tp_name);
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001457 bytes = RAND_egd(PyString_AS_STRING(arg));
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001458 if (bytes == -1) {
1459 PyErr_SetString(PySSLErrorObject,
1460 "EGD connection failed or EGD did not return "
1461 "enough data to seed the PRNG");
1462 return NULL;
1463 }
1464 return PyInt_FromLong(bytes);
1465}
1466
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001467PyDoc_STRVAR(PySSL_RAND_egd_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001468"RAND_egd(path) -> bytes\n\
1469\n\
Bill Janssen98d19da2007-09-10 21:51:02 +00001470Queries the entropy gather daemon (EGD) on the socket named by 'path'.\n\
1471Returns number of bytes read. Raises SSLError if connection to EGD\n\
1472fails or if it does provide enough data to seed PRNG.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001473
1474#endif
1475
1476/* List of functions exported by this module. */
1477
1478static PyMethodDef PySSL_methods[] = {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001479 {"sslwrap", PySSL_sslwrap,
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001480 METH_VARARGS, ssl_doc},
Bill Janssen98d19da2007-09-10 21:51:02 +00001481 {"_test_decode_cert", PySSL_test_decode_certificate,
1482 METH_VARARGS},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001483#ifdef HAVE_OPENSSL_RAND
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001484 {"RAND_add", PySSL_RAND_add, METH_VARARGS,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001485 PySSL_RAND_add_doc},
1486 {"RAND_egd", PySSL_RAND_egd, METH_O,
1487 PySSL_RAND_egd_doc},
1488 {"RAND_status", (PyCFunction)PySSL_RAND_status, METH_NOARGS,
1489 PySSL_RAND_status_doc},
1490#endif
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001491 {NULL, NULL} /* Sentinel */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001492};
1493
1494
Bill Janssen98d19da2007-09-10 21:51:02 +00001495#ifdef WITH_THREAD
1496
1497/* an implementation of OpenSSL threading operations in terms
1498 of the Python C thread library */
1499
1500static PyThread_type_lock *_ssl_locks = NULL;
1501
1502static unsigned long _ssl_thread_id_function (void) {
1503 return PyThread_get_thread_ident();
1504}
1505
1506static void _ssl_thread_locking_function (int mode, int n, const char *file, int line) {
1507 /* this function is needed to perform locking on shared data
1508 structures. (Note that OpenSSL uses a number of global data
1509 structures that will be implicitly shared whenever multiple threads
1510 use OpenSSL.) Multi-threaded applications will crash at random if
1511 it is not set.
1512
1513 locking_function() must be able to handle up to CRYPTO_num_locks()
1514 different mutex locks. It sets the n-th lock if mode & CRYPTO_LOCK, and
1515 releases it otherwise.
1516
1517 file and line are the file number of the function setting the
1518 lock. They can be useful for debugging.
1519 */
1520
1521 if ((_ssl_locks == NULL) ||
Neal Norwitz5802bb22008-03-27 05:03:11 +00001522 (n < 0) || ((unsigned)n >= _ssl_locks_count))
Bill Janssen98d19da2007-09-10 21:51:02 +00001523 return;
1524
1525 if (mode & CRYPTO_LOCK) {
1526 PyThread_acquire_lock(_ssl_locks[n], 1);
1527 } else {
1528 PyThread_release_lock(_ssl_locks[n]);
1529 }
1530}
1531
1532static int _setup_ssl_threads(void) {
1533
Neal Norwitz5802bb22008-03-27 05:03:11 +00001534 unsigned int i;
Bill Janssen98d19da2007-09-10 21:51:02 +00001535
1536 if (_ssl_locks == NULL) {
1537 _ssl_locks_count = CRYPTO_num_locks();
1538 _ssl_locks = (PyThread_type_lock *)
1539 malloc(sizeof(PyThread_type_lock) * _ssl_locks_count);
1540 if (_ssl_locks == NULL)
1541 return 0;
1542 memset(_ssl_locks, 0, sizeof(PyThread_type_lock) * _ssl_locks_count);
1543 for (i = 0; i < _ssl_locks_count; i++) {
1544 _ssl_locks[i] = PyThread_allocate_lock();
1545 if (_ssl_locks[i] == NULL) {
Raymond Hettinger8fb67e02009-01-26 16:55:41 +00001546 unsigned int j;
Bill Janssen98d19da2007-09-10 21:51:02 +00001547 for (j = 0; j < i; j++) {
1548 PyThread_free_lock(_ssl_locks[j]);
1549 }
1550 free(_ssl_locks);
1551 return 0;
1552 }
1553 }
1554 CRYPTO_set_locking_callback(_ssl_thread_locking_function);
1555 CRYPTO_set_id_callback(_ssl_thread_id_function);
1556 }
1557 return 1;
1558}
1559
1560#endif /* def HAVE_THREAD */
1561
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001562PyDoc_STRVAR(module_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001563"Implementation module for SSL socket operations. See the socket module\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001564for documentation.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001565
Mark Hammondfe51c6d2002-08-02 02:27:13 +00001566PyMODINIT_FUNC
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001567init_ssl(void)
1568{
1569 PyObject *m, *d;
1570
Christian Heimese93237d2007-12-19 02:37:44 +00001571 Py_TYPE(&PySSL_Type) = &PyType_Type;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001572
1573 m = Py_InitModule3("_ssl", PySSL_methods, module_doc);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00001574 if (m == NULL)
1575 return;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001576 d = PyModule_GetDict(m);
1577
1578 /* Load _socket module and its C API */
1579 if (PySocketModule_ImportModuleAndAPI())
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001580 return;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001581
1582 /* Init OpenSSL */
1583 SSL_load_error_strings();
Bill Janssen98d19da2007-09-10 21:51:02 +00001584#ifdef WITH_THREAD
1585 /* note that this will start threading if not already started */
1586 if (!_setup_ssl_threads()) {
1587 return;
1588 }
1589#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001590 SSLeay_add_ssl_algorithms();
1591
1592 /* Add symbols to module dict */
Bill Janssen98d19da2007-09-10 21:51:02 +00001593 PySSLErrorObject = PyErr_NewException("ssl.SSLError",
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001594 PySocketModule.error,
1595 NULL);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001596 if (PySSLErrorObject == NULL)
1597 return;
Bill Janssen98d19da2007-09-10 21:51:02 +00001598 if (PyDict_SetItemString(d, "SSLError", PySSLErrorObject) != 0)
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001599 return;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001600 if (PyDict_SetItemString(d, "SSLType",
1601 (PyObject *)&PySSL_Type) != 0)
1602 return;
1603 PyModule_AddIntConstant(m, "SSL_ERROR_ZERO_RETURN",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001604 PY_SSL_ERROR_ZERO_RETURN);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001605 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_READ",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001606 PY_SSL_ERROR_WANT_READ);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001607 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_WRITE",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001608 PY_SSL_ERROR_WANT_WRITE);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001609 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_X509_LOOKUP",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001610 PY_SSL_ERROR_WANT_X509_LOOKUP);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001611 PyModule_AddIntConstant(m, "SSL_ERROR_SYSCALL",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001612 PY_SSL_ERROR_SYSCALL);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001613 PyModule_AddIntConstant(m, "SSL_ERROR_SSL",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001614 PY_SSL_ERROR_SSL);
1615 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_CONNECT",
1616 PY_SSL_ERROR_WANT_CONNECT);
1617 /* non ssl.h errorcodes */
1618 PyModule_AddIntConstant(m, "SSL_ERROR_EOF",
1619 PY_SSL_ERROR_EOF);
1620 PyModule_AddIntConstant(m, "SSL_ERROR_INVALID_ERROR_CODE",
1621 PY_SSL_ERROR_INVALID_ERROR_CODE);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001622 /* cert requirements */
1623 PyModule_AddIntConstant(m, "CERT_NONE",
1624 PY_SSL_CERT_NONE);
1625 PyModule_AddIntConstant(m, "CERT_OPTIONAL",
1626 PY_SSL_CERT_OPTIONAL);
1627 PyModule_AddIntConstant(m, "CERT_REQUIRED",
1628 PY_SSL_CERT_REQUIRED);
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001629
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001630 /* protocol versions */
1631 PyModule_AddIntConstant(m, "PROTOCOL_SSLv2",
1632 PY_SSL_VERSION_SSL2);
1633 PyModule_AddIntConstant(m, "PROTOCOL_SSLv3",
1634 PY_SSL_VERSION_SSL3);
1635 PyModule_AddIntConstant(m, "PROTOCOL_SSLv23",
1636 PY_SSL_VERSION_SSL23);
1637 PyModule_AddIntConstant(m, "PROTOCOL_TLSv1",
1638 PY_SSL_VERSION_TLS1);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001639}