blob: a31030a7f0cd960069da2721db3761b9dcaaa188 [file] [log] [blame]
Thomas Woutersed03b412007-08-28 21:37:11 +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.
4
5 This module is imported by socket.py. It should *not* be used
6 directly.
7
8*/
9
10#include "Python.h"
Thomas Woutersed03b412007-08-28 21:37:11 +000011
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +000012enum py_ssl_error {
13 /* these mirror ssl.h */
Thomas Woutersed03b412007-08-28 21:37:11 +000014 PY_SSL_ERROR_NONE,
15 PY_SSL_ERROR_SSL,
16 PY_SSL_ERROR_WANT_READ,
17 PY_SSL_ERROR_WANT_WRITE,
18 PY_SSL_ERROR_WANT_X509_LOOKUP,
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +000019 PY_SSL_ERROR_SYSCALL, /* look at error stack/return value/errno */
Thomas Woutersed03b412007-08-28 21:37:11 +000020 PY_SSL_ERROR_ZERO_RETURN,
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +000021 PY_SSL_ERROR_WANT_CONNECT,
Thomas Woutersed03b412007-08-28 21:37:11 +000022 /* start of non ssl.h errorcodes */
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +000023 PY_SSL_ERROR_EOF, /* special case of SSL_ERROR_SYSCALL */
24 PY_SSL_ERROR_INVALID_ERROR_CODE
25};
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000026
Thomas Woutersed03b412007-08-28 21:37:11 +000027enum py_ssl_server_or_client {
28 PY_SSL_CLIENT,
29 PY_SSL_SERVER
30};
31
32enum py_ssl_cert_requirements {
33 PY_SSL_CERT_NONE,
34 PY_SSL_CERT_OPTIONAL,
35 PY_SSL_CERT_REQUIRED
36};
37
38enum py_ssl_version {
39 PY_SSL_VERSION_SSL2,
40 PY_SSL_VERSION_SSL3,
41 PY_SSL_VERSION_SSL23,
42 PY_SSL_VERSION_TLS1,
43};
44
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000045/* Include symbols from _socket module */
46#include "socketmodule.h"
47
Thomas Woutersed03b412007-08-28 21:37:11 +000048#if defined(HAVE_POLL_H)
Thomas Wouters0e3f5912006-08-11 14:57:12 +000049#include <poll.h>
50#elif defined(HAVE_SYS_POLL_H)
51#include <sys/poll.h>
52#endif
53
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000054/* Include OpenSSL header files */
55#include "openssl/rsa.h"
56#include "openssl/crypto.h"
57#include "openssl/x509.h"
58#include "openssl/pem.h"
59#include "openssl/ssl.h"
60#include "openssl/err.h"
61#include "openssl/rand.h"
62
63/* SSL error object */
64static PyObject *PySSLErrorObject;
65
66/* SSL socket object */
67
68#define X509_NAME_MAXLEN 256
69
70/* RAND_* APIs got added to OpenSSL in 0.9.5 */
71#if OPENSSL_VERSION_NUMBER >= 0x0090500fL
72# define HAVE_OPENSSL_RAND 1
73#else
74# undef HAVE_OPENSSL_RAND
75#endif
76
77typedef struct {
78 PyObject_HEAD
79 PySocketSockObject *Socket; /* Socket on which we're layered */
Thomas Woutersed03b412007-08-28 21:37:11 +000080 SSL_CTX* ctx;
81 SSL* ssl;
82 X509* peer_cert;
83 char server[X509_NAME_MAXLEN];
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000084 char issuer[X509_NAME_MAXLEN];
85
86} PySSLObject;
87
Jeremy Hylton938ace62002-07-17 16:30:39 +000088static PyTypeObject PySSL_Type;
89static PyObject *PySSL_SSLwrite(PySSLObject *self, PyObject *args);
90static PyObject *PySSL_SSLread(PySSLObject *self, PyObject *args);
Thomas Woutersed03b412007-08-28 21:37:11 +000091static int check_socket_and_wait_for_timeout(PySocketSockObject *s,
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +000092 int writing);
Thomas Woutersed03b412007-08-28 21:37:11 +000093static PyObject *PySSL_peercert(PySSLObject *self);
94
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000095
Martin v. Löwis9f2e3462007-07-21 17:22:18 +000096#define PySSLObject_Check(v) (Py_Type(v) == &PySSL_Type)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000097
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +000098typedef enum {
99 SOCKET_IS_NONBLOCKING,
100 SOCKET_IS_BLOCKING,
101 SOCKET_HAS_TIMED_OUT,
102 SOCKET_HAS_BEEN_CLOSED,
Neal Norwitz389cea82006-02-13 00:35:21 +0000103 SOCKET_TOO_LARGE_FOR_SELECT,
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +0000104 SOCKET_OPERATION_OK
105} timeout_state;
106
Thomas Woutersed03b412007-08-28 21:37:11 +0000107/* Wrap error strings with filename and line # */
108#define STRINGIFY1(x) #x
109#define STRINGIFY2(x) STRINGIFY1(x)
110#define ERRSTR1(x,y,z) (x ":" y ": " z)
111#define ERRSTR(x) ERRSTR1("_ssl.c", STRINGIFY2(__LINE__), x)
112
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000113/* XXX It might be helpful to augment the error message generated
114 below with the name of the SSL function that generated the error.
115 I expect it's obvious most of the time.
116*/
117
118static PyObject *
Thomas Woutersed03b412007-08-28 21:37:11 +0000119PySSL_SetError(PySSLObject *obj, int ret, char *filename, int lineno)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000120{
Thomas Woutersed03b412007-08-28 21:37:11 +0000121 PyObject *v;
122 char buf[2048];
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000123 char *errstr;
124 int err;
Thomas Woutersed03b412007-08-28 21:37:11 +0000125 enum py_ssl_error p = PY_SSL_ERROR_NONE;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000126
127 assert(ret <= 0);
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +0000128
Thomas Woutersed03b412007-08-28 21:37:11 +0000129 if ((obj != NULL) && (obj->ssl != NULL)) {
130 err = SSL_get_error(obj->ssl, ret);
131
132 switch (err) {
133 case SSL_ERROR_ZERO_RETURN:
134 errstr = "TLS/SSL connection has been closed";
135 p = PY_SSL_ERROR_ZERO_RETURN;
136 break;
137 case SSL_ERROR_WANT_READ:
138 errstr = "The operation did not complete (read)";
139 p = PY_SSL_ERROR_WANT_READ;
140 break;
141 case SSL_ERROR_WANT_WRITE:
142 p = PY_SSL_ERROR_WANT_WRITE;
143 errstr = "The operation did not complete (write)";
144 break;
145 case SSL_ERROR_WANT_X509_LOOKUP:
146 p = PY_SSL_ERROR_WANT_X509_LOOKUP;
147 errstr =
148 "The operation did not complete (X509 lookup)";
149 break;
150 case SSL_ERROR_WANT_CONNECT:
151 p = PY_SSL_ERROR_WANT_CONNECT;
152 errstr = "The operation did not complete (connect)";
153 break;
154 case SSL_ERROR_SYSCALL:
155 {
156 unsigned long e = ERR_get_error();
157 if (e == 0) {
158 if (ret == 0 || !obj->Socket) {
159 p = PY_SSL_ERROR_EOF;
160 errstr =
161 "EOF occurred in violation of protocol";
162 } else if (ret == -1) {
163 /* underlying BIO reported an I/O error */
164 return obj->Socket->errorhandler();
165 } else { /* possible? */
166 p = PY_SSL_ERROR_SYSCALL;
167 errstr = "Some I/O error occurred";
168 }
169 } else {
Jeremy Hylton4e547302002-07-02 18:25:00 +0000170 p = PY_SSL_ERROR_SYSCALL;
Thomas Woutersed03b412007-08-28 21:37:11 +0000171 /* XXX Protected by global interpreter lock */
172 errstr = ERR_error_string(e, NULL);
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +0000173 }
Thomas Woutersed03b412007-08-28 21:37:11 +0000174 break;
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +0000175 }
Thomas Woutersed03b412007-08-28 21:37:11 +0000176 case SSL_ERROR_SSL:
177 {
178 unsigned long e = ERR_get_error();
179 p = PY_SSL_ERROR_SSL;
180 if (e != 0)
181 /* XXX Protected by global interpreter lock */
182 errstr = ERR_error_string(e, NULL);
183 else { /* possible? */
184 errstr =
185 "A failure in the SSL library occurred";
186 }
187 break;
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +0000188 }
Thomas Woutersed03b412007-08-28 21:37:11 +0000189 default:
190 p = PY_SSL_ERROR_INVALID_ERROR_CODE;
191 errstr = "Invalid error code";
192 }
193 } else {
194 errstr = ERR_error_string(ERR_peek_last_error(), NULL);
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +0000195 }
Thomas Woutersed03b412007-08-28 21:37:11 +0000196 PyOS_snprintf(buf, sizeof(buf), "_ssl.c:%d: %s", lineno, errstr);
197 v = Py_BuildValue("(is)", p, buf);
198 if (v != NULL) {
199 PyErr_SetObject(PySSLErrorObject, v);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000200 Py_DECREF(v);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000201 }
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000202 return NULL;
203}
204
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000205static PySSLObject *
Thomas Woutersed03b412007-08-28 21:37:11 +0000206newPySSLObject(PySocketSockObject *Sock, char *key_file, char *cert_file,
207 enum py_ssl_server_or_client socket_type,
208 enum py_ssl_cert_requirements certreq,
209 enum py_ssl_version proto_version,
210 char *cacerts_file)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000211{
212 PySSLObject *self;
213 char *errstr = NULL;
214 int ret;
Guido van Rossum4f707ac2003-01-31 18:13:18 +0000215 int err;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +0000216 int sockstate;
Thomas Woutersed03b412007-08-28 21:37:11 +0000217 int verification_mode;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000218
219 self = PyObject_New(PySSLObject, &PySSL_Type); /* Create new object */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000220 if (self == NULL)
221 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000222 memset(self->server, '\0', sizeof(char) * X509_NAME_MAXLEN);
223 memset(self->issuer, '\0', sizeof(char) * X509_NAME_MAXLEN);
Thomas Woutersed03b412007-08-28 21:37:11 +0000224 self->peer_cert = NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000225 self->ssl = NULL;
226 self->ctx = NULL;
227 self->Socket = NULL;
228
229 if ((key_file && !cert_file) || (!key_file && cert_file)) {
Thomas Woutersed03b412007-08-28 21:37:11 +0000230 errstr = ERRSTR("Both the key & certificate files "
231 "must be specified");
232 goto fail;
233 }
234
235 if ((socket_type == PY_SSL_SERVER) &&
236 ((key_file == NULL) || (cert_file == NULL))) {
237 errstr = ERRSTR("Both the key & certificate files "
238 "must be specified for server-side operation");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000239 goto fail;
240 }
241
Martin v. Löwis09c35f72002-07-28 09:57:45 +0000242 Py_BEGIN_ALLOW_THREADS
Thomas Woutersed03b412007-08-28 21:37:11 +0000243 if (proto_version == PY_SSL_VERSION_TLS1)
244 self->ctx = SSL_CTX_new(TLSv1_method()); /* Set up context */
245 else if (proto_version == PY_SSL_VERSION_SSL3)
246 self->ctx = SSL_CTX_new(SSLv3_method()); /* Set up context */
247 else if (proto_version == PY_SSL_VERSION_SSL2)
248 self->ctx = SSL_CTX_new(SSLv2_method()); /* Set up context */
249 else
250 self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */
Martin v. Löwis09c35f72002-07-28 09:57:45 +0000251 Py_END_ALLOW_THREADS
Thomas Woutersed03b412007-08-28 21:37:11 +0000252
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000253 if (self->ctx == NULL) {
Thomas Woutersed03b412007-08-28 21:37:11 +0000254 errstr = ERRSTR("Invalid SSL protocol variant specified.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000255 goto fail;
256 }
257
Thomas Woutersed03b412007-08-28 21:37:11 +0000258 if (certreq != PY_SSL_CERT_NONE) {
259 if (cacerts_file == NULL) {
260 errstr = ERRSTR("No root certificates specified for "
261 "verification of other-side certificates.");
262 goto fail;
263 } else {
264 Py_BEGIN_ALLOW_THREADS
265 ret = SSL_CTX_load_verify_locations(self->ctx,
266 cacerts_file,
267 NULL);
268 Py_END_ALLOW_THREADS
269 if (ret != 1) {
270 PySSL_SetError(NULL, 0, __FILE__, __LINE__);
271 goto fail;
272 }
273 }
274 }
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000275 if (key_file) {
Martin v. Löwis09c35f72002-07-28 09:57:45 +0000276 Py_BEGIN_ALLOW_THREADS
277 ret = SSL_CTX_use_PrivateKey_file(self->ctx, key_file,
Thomas Woutersed03b412007-08-28 21:37:11 +0000278 SSL_FILETYPE_PEM);
Martin v. Löwis09c35f72002-07-28 09:57:45 +0000279 Py_END_ALLOW_THREADS
Thomas Woutersed03b412007-08-28 21:37:11 +0000280 if (ret != 1) {
281 PySSL_SetError(NULL, 0, __FILE__, __LINE__);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000282 goto fail;
283 }
284
Martin v. Löwis09c35f72002-07-28 09:57:45 +0000285 Py_BEGIN_ALLOW_THREADS
286 ret = SSL_CTX_use_certificate_chain_file(self->ctx,
287 cert_file);
288 Py_END_ALLOW_THREADS
Thomas Woutersed03b412007-08-28 21:37:11 +0000289 if (ret != 1) {
290 PySSL_SetError(NULL, 0, __FILE__, __LINE__);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000291 goto fail;
292 }
Thomas Woutersed03b412007-08-28 21:37:11 +0000293 /* ssl compatibility */
294 SSL_CTX_set_options(self->ctx, SSL_OP_ALL);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000295 }
296
Thomas Woutersed03b412007-08-28 21:37:11 +0000297 verification_mode = SSL_VERIFY_NONE;
298 if (certreq == PY_SSL_CERT_OPTIONAL)
299 verification_mode = SSL_VERIFY_PEER;
300 else if (certreq == PY_SSL_CERT_REQUIRED)
301 verification_mode = (SSL_VERIFY_PEER |
302 SSL_VERIFY_FAIL_IF_NO_PEER_CERT);
303 SSL_CTX_set_verify(self->ctx, verification_mode,
304 NULL); /* set verify lvl */
305
Martin v. Löwis09c35f72002-07-28 09:57:45 +0000306 Py_BEGIN_ALLOW_THREADS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000307 self->ssl = SSL_new(self->ctx); /* New ssl struct */
Martin v. Löwis09c35f72002-07-28 09:57:45 +0000308 Py_END_ALLOW_THREADS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000309 SSL_set_fd(self->ssl, Sock->sock_fd); /* Set the socket for SSL */
Guido van Rossum4f707ac2003-01-31 18:13:18 +0000310
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000311 /* If the socket is in non-blocking mode or timeout mode, set the BIO
Guido van Rossum4f707ac2003-01-31 18:13:18 +0000312 * to non-blocking mode (blocking is the default)
313 */
314 if (Sock->sock_timeout >= 0.0) {
315 /* Set both the read and write BIO's to non-blocking mode */
316 BIO_set_nbio(SSL_get_rbio(self->ssl), 1);
317 BIO_set_nbio(SSL_get_wbio(self->ssl), 1);
318 }
319
Martin v. Löwis09c35f72002-07-28 09:57:45 +0000320 Py_BEGIN_ALLOW_THREADS
Thomas Woutersed03b412007-08-28 21:37:11 +0000321 if (socket_type == PY_SSL_CLIENT)
322 SSL_set_connect_state(self->ssl);
323 else
324 SSL_set_accept_state(self->ssl);
Guido van Rossum4f707ac2003-01-31 18:13:18 +0000325 Py_END_ALLOW_THREADS
Martin v. Löwis09c35f72002-07-28 09:57:45 +0000326
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000327 /* Actually negotiate SSL connection */
328 /* XXX If SSL_connect() returns 0, it's also a failure. */
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +0000329 sockstate = 0;
Guido van Rossum4f707ac2003-01-31 18:13:18 +0000330 do {
331 Py_BEGIN_ALLOW_THREADS
Thomas Woutersed03b412007-08-28 21:37:11 +0000332 if (socket_type == PY_SSL_CLIENT)
333 ret = SSL_connect(self->ssl);
334 else
335 ret = SSL_accept(self->ssl);
Guido van Rossum4f707ac2003-01-31 18:13:18 +0000336 err = SSL_get_error(self->ssl, ret);
337 Py_END_ALLOW_THREADS
Martin v. Löwisafec8e32003-06-28 07:40:23 +0000338 if(PyErr_CheckSignals()) {
Thomas Woutersed03b412007-08-28 21:37:11 +0000339 goto fail;
Martin v. Löwisafec8e32003-06-28 07:40:23 +0000340 }
Guido van Rossum4f707ac2003-01-31 18:13:18 +0000341 if (err == SSL_ERROR_WANT_READ) {
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +0000342 sockstate = check_socket_and_wait_for_timeout(Sock, 0);
Guido van Rossum4f707ac2003-01-31 18:13:18 +0000343 } else if (err == SSL_ERROR_WANT_WRITE) {
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +0000344 sockstate = check_socket_and_wait_for_timeout(Sock, 1);
345 } else {
346 sockstate = SOCKET_OPERATION_OK;
Guido van Rossum4f707ac2003-01-31 18:13:18 +0000347 }
Thomas Woutersed03b412007-08-28 21:37:11 +0000348 if (sockstate == SOCKET_HAS_TIMED_OUT) {
349 PyErr_SetString(PySSLErrorObject,
350 ERRSTR("The connect operation timed out"));
Martin v. Löwisafec8e32003-06-28 07:40:23 +0000351 goto fail;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +0000352 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
Thomas Woutersed03b412007-08-28 21:37:11 +0000353 PyErr_SetString(PySSLErrorObject,
354 ERRSTR("Underlying socket has been closed."));
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +0000355 goto fail;
Neal Norwitz389cea82006-02-13 00:35:21 +0000356 } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
Thomas Woutersed03b412007-08-28 21:37:11 +0000357 PyErr_SetString(PySSLErrorObject,
358 ERRSTR("Underlying socket too large for select()."));
Neal Norwitz082b2df2006-02-07 07:04:46 +0000359 goto fail;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +0000360 } else if (sockstate == SOCKET_IS_NONBLOCKING) {
361 break;
Guido van Rossum4f707ac2003-01-31 18:13:18 +0000362 }
363 } while (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE);
Thomas Woutersed03b412007-08-28 21:37:11 +0000364 if (ret < 1) {
365 PySSL_SetError(self, ret, __FILE__, __LINE__);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000366 goto fail;
367 }
368 self->ssl->debug = 1;
369
Martin v. Löwis09c35f72002-07-28 09:57:45 +0000370 Py_BEGIN_ALLOW_THREADS
Thomas Woutersed03b412007-08-28 21:37:11 +0000371 if ((self->peer_cert = SSL_get_peer_certificate(self->ssl))) {
372 X509_NAME_oneline(X509_get_subject_name(self->peer_cert),
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000373 self->server, X509_NAME_MAXLEN);
Thomas Woutersed03b412007-08-28 21:37:11 +0000374 X509_NAME_oneline(X509_get_issuer_name(self->peer_cert),
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000375 self->issuer, X509_NAME_MAXLEN);
376 }
Martin v. Löwis09c35f72002-07-28 09:57:45 +0000377 Py_END_ALLOW_THREADS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000378 self->Socket = Sock;
379 Py_INCREF(self->Socket);
380 return self;
381 fail:
382 if (errstr)
383 PyErr_SetString(PySSLErrorObject, errstr);
384 Py_DECREF(self);
385 return NULL;
386}
387
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000388static PyObject *
Thomas Woutersed03b412007-08-28 21:37:11 +0000389PySSL_sslwrap(PyObject *self, PyObject *args)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000390{
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000391 PySocketSockObject *Sock;
Thomas Woutersed03b412007-08-28 21:37:11 +0000392 int server_side = 0;
393 int verification_mode = PY_SSL_CERT_NONE;
394 int protocol = PY_SSL_VERSION_SSL23;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000395 char *key_file = NULL;
396 char *cert_file = NULL;
Thomas Woutersed03b412007-08-28 21:37:11 +0000397 char *cacerts_file = NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000398
Thomas Woutersed03b412007-08-28 21:37:11 +0000399 if (!PyArg_ParseTuple(args, "O!i|zziiz:sslwrap",
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000400 PySocketModule.Sock_Type,
Thomas Wouters89f507f2006-12-13 04:49:30 +0000401 &Sock,
Thomas Woutersed03b412007-08-28 21:37:11 +0000402 &server_side,
403 &key_file, &cert_file,
404 &verification_mode, &protocol,
405 &cacerts_file))
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000406 return NULL;
407
Thomas Woutersed03b412007-08-28 21:37:11 +0000408 /*
409 fprintf(stderr,
410 "server_side is %d, keyfile %p, certfile %p, verify_mode %d, "
411 "protocol %d, certs %p\n",
412 server_side, key_file, cert_file, verification_mode,
413 protocol, cacerts_file);
414 */
415
416 return (PyObject *) newPySSLObject(Sock, key_file, cert_file,
417 server_side, verification_mode,
418 protocol, cacerts_file);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000419}
420
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000421PyDoc_STRVAR(ssl_doc,
Thomas Woutersed03b412007-08-28 21:37:11 +0000422"sslwrap(socket, server_side, [keyfile, certfile, certs_mode, protocol,\n"
423" cacertsfile]) -> sslobject");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000424
425/* SSL object methods */
426
427static PyObject *
428PySSL_server(PySSLObject *self)
429{
Neal Norwitzae2c8762007-08-25 17:03:03 +0000430 return PyUnicode_FromString(self->server);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000431}
432
433static PyObject *
434PySSL_issuer(PySSLObject *self)
435{
Neal Norwitzae2c8762007-08-25 17:03:03 +0000436 return PyUnicode_FromString(self->issuer);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000437}
438
Thomas Woutersed03b412007-08-28 21:37:11 +0000439static PyObject *
440_create_dict_for_X509_NAME (X509_NAME *xname)
441{
442 PyObject *pd = PyDict_New();
443 int index_counter;
444
445 if (pd == NULL)
446 return NULL;
447
448 for (index_counter = 0;
449 index_counter < X509_NAME_entry_count(xname);
450 index_counter++)
451 {
452 char namebuf[X509_NAME_MAXLEN];
453 int buflen;
454 PyObject *name_obj;
455 ASN1_STRING *value;
456 PyObject *value_obj;
457 unsigned char *valuebuf = NULL;
458
459 X509_NAME_ENTRY *entry = X509_NAME_get_entry(xname,
460 index_counter);
461
462 ASN1_OBJECT *name = X509_NAME_ENTRY_get_object(entry);
463 buflen = OBJ_obj2txt(namebuf, sizeof(namebuf), name, 0);
464 if (buflen < 0)
465 goto fail0;
466 name_obj = PyString_FromStringAndSize(namebuf, buflen);
467 if (name_obj == NULL)
468 goto fail0;
469
470 value = X509_NAME_ENTRY_get_data(entry);
471 buflen = ASN1_STRING_to_UTF8(&valuebuf, value);
472 if (buflen < 0) {
473 Py_DECREF(name_obj);
474 goto fail0;
475 }
476 value_obj = PyUnicode_DecodeUTF8((char *) valuebuf,
477 buflen, "strict");
478 OPENSSL_free(valuebuf);
479 if (value_obj == NULL) {
480 Py_DECREF(name_obj);
481 goto fail0;
482 }
483 if (PyDict_SetItem(pd, name_obj, value_obj) < 0) {
484 Py_DECREF(name_obj);
485 Py_DECREF(value_obj);
486 goto fail0;
487 }
488 Py_DECREF(name_obj);
489 Py_DECREF(value_obj);
490 }
491 return pd;
492
493 fail0:
494 Py_XDECREF(pd);
495 return NULL;
496}
497
498static PyObject *
499PySSL_peercert(PySSLObject *self)
500{
501 PyObject *retval = NULL;
502 BIO *biobuf = NULL;
503 PyObject *peer;
504 PyObject *issuer;
505 PyObject *version;
506 char buf[2048];
507 int len;
508 ASN1_TIME *notBefore, *notAfter;
509 PyObject *pnotBefore, *pnotAfter;
510 int verification;
511
512 if (!self->peer_cert)
513 Py_RETURN_NONE;
514
515 retval = PyDict_New();
516 if (retval == NULL)
517 return NULL;
518
519 verification = SSL_CTX_get_verify_mode(self->ctx);
520 if ((verification & SSL_VERIFY_PEER) == 0)
521 return retval;
522
523 peer = _create_dict_for_X509_NAME(
524 X509_get_subject_name(self->peer_cert));
525 if (peer == NULL)
526 goto fail0;
527 if (PyDict_SetItemString(retval, (const char *) "subject", peer) < 0) {
528 Py_DECREF(peer);
529 goto fail0;
530 }
531 Py_DECREF(peer);
532
533 issuer = _create_dict_for_X509_NAME(
534 X509_get_issuer_name(self->peer_cert));
535 if (issuer == NULL)
536 goto fail0;
537 if (PyDict_SetItemString(retval, (const char *)"issuer", issuer) < 0) {
538 Py_DECREF(issuer);
539 goto fail0;
540 }
541 Py_DECREF(issuer);
542
543 version = PyInt_FromLong(X509_get_version(self->peer_cert));
544 if (PyDict_SetItemString(retval, "version", version) < 0) {
545 Py_DECREF(version);
546 goto fail0;
547 }
548 Py_DECREF(version);
549
550 /* get a memory buffer */
551 biobuf = BIO_new(BIO_s_mem());
552
553 notBefore = X509_get_notBefore(self->peer_cert);
554 ASN1_TIME_print(biobuf, notBefore);
555 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
556 pnotBefore = PyString_FromStringAndSize(buf, len);
557 if (pnotBefore == NULL)
558 goto fail1;
559 if (PyDict_SetItemString(retval, "notBefore", pnotBefore) < 0) {
560 Py_DECREF(pnotBefore);
561 goto fail1;
562 }
563 Py_DECREF(pnotBefore);
564
565 (void) BIO_reset(biobuf);
566 notAfter = X509_get_notAfter(self->peer_cert);
567 ASN1_TIME_print(biobuf, notAfter);
568 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
569 BIO_free(biobuf);
570 pnotAfter = PyString_FromStringAndSize(buf, len);
571 if (pnotAfter == NULL)
572 goto fail0;
573 if (PyDict_SetItemString(retval, "notAfter", pnotAfter) < 0) {
574 Py_DECREF(pnotAfter);
575 goto fail0;
576 }
577 Py_DECREF(pnotAfter);
578 return retval;
579
580 fail1:
581 if (biobuf != NULL)
582 BIO_free(biobuf);
583 fail0:
584 Py_XDECREF(retval);
585 return NULL;
586}
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000587
588static void PySSL_dealloc(PySSLObject *self)
589{
Thomas Woutersed03b412007-08-28 21:37:11 +0000590 if (self->peer_cert) /* Possible not to have one? */
591 X509_free (self->peer_cert);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000592 if (self->ssl)
Thomas Woutersed03b412007-08-28 21:37:11 +0000593 SSL_free(self->ssl);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000594 if (self->ctx)
Thomas Woutersed03b412007-08-28 21:37:11 +0000595 SSL_CTX_free(self->ctx);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000596 Py_XDECREF(self->Socket);
597 PyObject_Del(self);
598}
599
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000600/* If the socket has a timeout, do a select()/poll() on the socket.
Guido van Rossum99d4abf2003-01-27 22:22:50 +0000601 The argument writing indicates the direction.
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +0000602 Returns one of the possibilities in the timeout_state enum (above).
Guido van Rossum99d4abf2003-01-27 22:22:50 +0000603 */
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +0000604
Guido van Rossum99d4abf2003-01-27 22:22:50 +0000605static int
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +0000606check_socket_and_wait_for_timeout(PySocketSockObject *s, int writing)
Guido van Rossum99d4abf2003-01-27 22:22:50 +0000607{
608 fd_set fds;
609 struct timeval tv;
610 int rc;
611
612 /* Nothing to do unless we're in timeout mode (not non-blocking) */
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +0000613 if (s->sock_timeout < 0.0)
614 return SOCKET_IS_BLOCKING;
615 else if (s->sock_timeout == 0.0)
616 return SOCKET_IS_NONBLOCKING;
Guido van Rossum99d4abf2003-01-27 22:22:50 +0000617
618 /* Guard against closed socket */
619 if (s->sock_fd < 0)
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +0000620 return SOCKET_HAS_BEEN_CLOSED;
Guido van Rossum99d4abf2003-01-27 22:22:50 +0000621
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000622 /* Prefer poll, if available, since you can poll() any fd
623 * which can't be done with select(). */
624#ifdef HAVE_POLL
625 {
626 struct pollfd pollfd;
627 int timeout;
628
629 pollfd.fd = s->sock_fd;
630 pollfd.events = writing ? POLLOUT : POLLIN;
631
632 /* s->sock_timeout is in seconds, timeout in ms */
633 timeout = (int)(s->sock_timeout * 1000 + 0.5);
634 Py_BEGIN_ALLOW_THREADS
635 rc = poll(&pollfd, 1, timeout);
636 Py_END_ALLOW_THREADS
637
638 goto normal_return;
639 }
640#endif
641
Neal Norwitz082b2df2006-02-07 07:04:46 +0000642 /* Guard against socket too large for select*/
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000643#ifndef Py_SOCKET_FD_CAN_BE_GE_FD_SETSIZE
Neal Norwitz082b2df2006-02-07 07:04:46 +0000644 if (s->sock_fd >= FD_SETSIZE)
Neal Norwitz389cea82006-02-13 00:35:21 +0000645 return SOCKET_TOO_LARGE_FOR_SELECT;
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000646#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000647
Guido van Rossum99d4abf2003-01-27 22:22:50 +0000648 /* Construct the arguments to select */
649 tv.tv_sec = (int)s->sock_timeout;
650 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
651 FD_ZERO(&fds);
652 FD_SET(s->sock_fd, &fds);
653
654 /* See if the socket is ready */
Guido van Rossum4f707ac2003-01-31 18:13:18 +0000655 Py_BEGIN_ALLOW_THREADS
Guido van Rossum99d4abf2003-01-27 22:22:50 +0000656 if (writing)
657 rc = select(s->sock_fd+1, NULL, &fds, NULL, &tv);
658 else
659 rc = select(s->sock_fd+1, &fds, NULL, NULL, &tv);
Guido van Rossum4f707ac2003-01-31 18:13:18 +0000660 Py_END_ALLOW_THREADS
Guido van Rossum99d4abf2003-01-27 22:22:50 +0000661
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000662normal_return:
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +0000663 /* Return SOCKET_TIMED_OUT on timeout, SOCKET_OPERATION_OK otherwise
664 (when we are able to write or when there's something to read) */
665 return rc == 0 ? SOCKET_HAS_TIMED_OUT : SOCKET_OPERATION_OK;
Guido van Rossum99d4abf2003-01-27 22:22:50 +0000666}
667
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000668static PyObject *PySSL_SSLwrite(PySSLObject *self, PyObject *args)
669{
670 char *data;
671 int len;
Martin v. Löwis405a7952003-10-27 14:24:37 +0000672 int count;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +0000673 int sockstate;
Guido van Rossum4f707ac2003-01-31 18:13:18 +0000674 int err;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000675
Martin v. Löwis405a7952003-10-27 14:24:37 +0000676 if (!PyArg_ParseTuple(args, "s#:write", &data, &count))
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000677 return NULL;
678
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +0000679 sockstate = check_socket_and_wait_for_timeout(self->Socket, 1);
680 if (sockstate == SOCKET_HAS_TIMED_OUT) {
Thomas Woutersed03b412007-08-28 21:37:11 +0000681 PyErr_SetString(PySSLErrorObject,
682 "The write operation timed out");
Guido van Rossum99d4abf2003-01-27 22:22:50 +0000683 return NULL;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +0000684 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
Thomas Woutersed03b412007-08-28 21:37:11 +0000685 PyErr_SetString(PySSLErrorObject,
686 "Underlying socket has been closed.");
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +0000687 return NULL;
Neal Norwitz389cea82006-02-13 00:35:21 +0000688 } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
Thomas Woutersed03b412007-08-28 21:37:11 +0000689 PyErr_SetString(PySSLErrorObject,
690 "Underlying socket too large for select().");
Neal Norwitz082b2df2006-02-07 07:04:46 +0000691 return NULL;
Guido van Rossum99d4abf2003-01-27 22:22:50 +0000692 }
Guido van Rossum4f707ac2003-01-31 18:13:18 +0000693 do {
694 err = 0;
695 Py_BEGIN_ALLOW_THREADS
Martin v. Löwis405a7952003-10-27 14:24:37 +0000696 len = SSL_write(self->ssl, data, count);
Guido van Rossum4f707ac2003-01-31 18:13:18 +0000697 err = SSL_get_error(self->ssl, len);
698 Py_END_ALLOW_THREADS
Martin v. Löwisafec8e32003-06-28 07:40:23 +0000699 if(PyErr_CheckSignals()) {
700 return NULL;
701 }
Guido van Rossum4f707ac2003-01-31 18:13:18 +0000702 if (err == SSL_ERROR_WANT_READ) {
Thomas Woutersed03b412007-08-28 21:37:11 +0000703 sockstate =
704 check_socket_and_wait_for_timeout(self->Socket, 0);
Guido van Rossum4f707ac2003-01-31 18:13:18 +0000705 } else if (err == SSL_ERROR_WANT_WRITE) {
Thomas Woutersed03b412007-08-28 21:37:11 +0000706 sockstate =
707 check_socket_and_wait_for_timeout(self->Socket, 1);
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +0000708 } else {
709 sockstate = SOCKET_OPERATION_OK;
Guido van Rossum4f707ac2003-01-31 18:13:18 +0000710 }
Thomas Woutersed03b412007-08-28 21:37:11 +0000711 if (sockstate == SOCKET_HAS_TIMED_OUT) {
712 PyErr_SetString(PySSLErrorObject,
713 "The write operation timed out");
Guido van Rossum4f707ac2003-01-31 18:13:18 +0000714 return NULL;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +0000715 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
Thomas Woutersed03b412007-08-28 21:37:11 +0000716 PyErr_SetString(PySSLErrorObject,
717 "Underlying socket has been closed.");
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +0000718 return NULL;
719 } else if (sockstate == SOCKET_IS_NONBLOCKING) {
720 break;
Guido van Rossum4f707ac2003-01-31 18:13:18 +0000721 }
722 } while (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000723 if (len > 0)
724 return PyInt_FromLong(len);
725 else
Thomas Woutersed03b412007-08-28 21:37:11 +0000726 return PySSL_SetError(self, len, __FILE__, __LINE__);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000727}
728
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000729PyDoc_STRVAR(PySSL_SSLwrite_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000730"write(s) -> len\n\
731\n\
732Writes the string s into the SSL object. Returns the number\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000733of bytes written.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000734
735static PyObject *PySSL_SSLread(PySSLObject *self, PyObject *args)
736{
737 PyObject *buf;
738 int count = 0;
739 int len = 1024;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +0000740 int sockstate;
Guido van Rossum4f707ac2003-01-31 18:13:18 +0000741 int err;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000742
743 if (!PyArg_ParseTuple(args, "|i:read", &len))
744 return NULL;
745
Jeremy Hylton62520832007-08-04 02:58:42 +0000746 if (!(buf = PyBytes_FromStringAndSize((char *) 0, len)))
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000747 return NULL;
Thomas Woutersed03b412007-08-28 21:37:11 +0000748
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000749 /* first check if there are bytes ready to be read */
750 Py_BEGIN_ALLOW_THREADS
751 count = SSL_pending(self->ssl);
752 Py_END_ALLOW_THREADS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000753
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000754 if (!count) {
755 sockstate = check_socket_and_wait_for_timeout(self->Socket, 0);
756 if (sockstate == SOCKET_HAS_TIMED_OUT) {
Thomas Woutersed03b412007-08-28 21:37:11 +0000757 PyErr_SetString(PySSLErrorObject,
758 "The read operation timed out");
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000759 Py_DECREF(buf);
760 return NULL;
761 } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
Thomas Woutersed03b412007-08-28 21:37:11 +0000762 PyErr_SetString(PySSLErrorObject,
763 "Underlying socket too large for select().");
764 Py_DECREF(buf);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000765 return NULL;
Thomas Woutersed03b412007-08-28 21:37:11 +0000766 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
767 if (SSL_get_shutdown(self->ssl) !=
768 SSL_RECEIVED_SHUTDOWN)
769 {
770 Py_DECREF(buf);
771 PyErr_SetString(PySSLErrorObject,
772 "Socket closed without SSL shutdown handshake");
773 return NULL;
774 } else {
775 /* should contain a zero-length string */
776 _PyString_Resize(&buf, 0);
777 return buf;
778 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000779 }
Guido van Rossum99d4abf2003-01-27 22:22:50 +0000780 }
Guido van Rossum4f707ac2003-01-31 18:13:18 +0000781 do {
782 err = 0;
783 Py_BEGIN_ALLOW_THREADS
Jeremy Hylton62520832007-08-04 02:58:42 +0000784 count = SSL_read(self->ssl, PyBytes_AS_STRING(buf), len);
Guido van Rossum4f707ac2003-01-31 18:13:18 +0000785 err = SSL_get_error(self->ssl, count);
786 Py_END_ALLOW_THREADS
Martin v. Löwisafec8e32003-06-28 07:40:23 +0000787 if(PyErr_CheckSignals()) {
788 Py_DECREF(buf);
789 return NULL;
790 }
Guido van Rossum4f707ac2003-01-31 18:13:18 +0000791 if (err == SSL_ERROR_WANT_READ) {
Thomas Woutersed03b412007-08-28 21:37:11 +0000792 sockstate =
793 check_socket_and_wait_for_timeout(self->Socket, 0);
Guido van Rossum4f707ac2003-01-31 18:13:18 +0000794 } else if (err == SSL_ERROR_WANT_WRITE) {
Thomas Woutersed03b412007-08-28 21:37:11 +0000795 sockstate =
796 check_socket_and_wait_for_timeout(self->Socket, 1);
797 } else if ((err == SSL_ERROR_ZERO_RETURN) &&
798 (SSL_get_shutdown(self->ssl) ==
799 SSL_RECEIVED_SHUTDOWN))
800 {
801 _PyString_Resize(&buf, 0);
802 return buf;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +0000803 } else {
804 sockstate = SOCKET_OPERATION_OK;
Guido van Rossum4f707ac2003-01-31 18:13:18 +0000805 }
Thomas Woutersed03b412007-08-28 21:37:11 +0000806 if (sockstate == SOCKET_HAS_TIMED_OUT) {
807 PyErr_SetString(PySSLErrorObject,
808 "The read operation timed out");
Martin v. Löwisafec8e32003-06-28 07:40:23 +0000809 Py_DECREF(buf);
Guido van Rossum4f707ac2003-01-31 18:13:18 +0000810 return NULL;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +0000811 } else if (sockstate == SOCKET_IS_NONBLOCKING) {
812 break;
Guido van Rossum4f707ac2003-01-31 18:13:18 +0000813 }
814 } while (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE);
Thomas Woutersed03b412007-08-28 21:37:11 +0000815 if (count <= 0) {
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000816 Py_DECREF(buf);
Thomas Woutersed03b412007-08-28 21:37:11 +0000817 return PySSL_SetError(self, count, __FILE__, __LINE__);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000818 }
Tim Peters5de98422002-04-27 18:44:32 +0000819 if (count != len)
Jeremy Hylton62520832007-08-04 02:58:42 +0000820 if (PyBytes_Resize(buf, count) < 0) {
821 Py_DECREF(buf);
822 return NULL;
823 }
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000824 return buf;
825}
826
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000827PyDoc_STRVAR(PySSL_SSLread_doc,
Jeremy Hylton62520832007-08-04 02:58:42 +0000828"read([len]) -> bytes\n\
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000829\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000830Read up to len bytes from the SSL socket.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000831
Thomas Woutersed03b412007-08-28 21:37:11 +0000832static PyObject *PySSL_SSLshutdown(PySSLObject *self, PyObject *args)
833{
834 int err;
835
836 /* Guard against closed socket */
837 if (self->Socket->sock_fd < 0) {
838 PyErr_SetString(PySSLErrorObject,
839 "Underlying socket has been closed.");
840 return NULL;
841 }
842
843 Py_BEGIN_ALLOW_THREADS
844 err = SSL_shutdown(self->ssl);
845 if (err == 0) {
846 /* we need to call it again to finish the shutdown */
847 err = SSL_shutdown(self->ssl);
848 }
849 Py_END_ALLOW_THREADS
850
851 if (err < 0)
852 return PySSL_SetError(self, err, __FILE__, __LINE__);
853 else {
854 Py_INCREF(self->Socket);
855 return (PyObject *) (self->Socket);
856 }
857}
858
859PyDoc_STRVAR(PySSL_SSLshutdown_doc,
860"shutdown(s) -> socket\n\
861\n\
862Does the SSL shutdown handshake with the remote end, and returns\n\
863the underlying socket object.");
864
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000865static PyMethodDef PySSLMethods[] = {
866 {"write", (PyCFunction)PySSL_SSLwrite, METH_VARARGS,
Thomas Woutersed03b412007-08-28 21:37:11 +0000867 PySSL_SSLwrite_doc},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000868 {"read", (PyCFunction)PySSL_SSLread, METH_VARARGS,
Thomas Woutersed03b412007-08-28 21:37:11 +0000869 PySSL_SSLread_doc},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000870 {"server", (PyCFunction)PySSL_server, METH_NOARGS},
871 {"issuer", (PyCFunction)PySSL_issuer, METH_NOARGS},
Thomas Woutersed03b412007-08-28 21:37:11 +0000872 {"peer_certificate", (PyCFunction)PySSL_peercert, METH_NOARGS},
873 {"shutdown", (PyCFunction)PySSL_SSLshutdown, METH_NOARGS,
874 PySSL_SSLshutdown_doc},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000875 {NULL, NULL}
876};
877
878static PyObject *PySSL_getattr(PySSLObject *self, char *name)
879{
880 return Py_FindMethod(PySSLMethods, (PyObject *)self, name);
881}
882
Jeremy Hylton938ace62002-07-17 16:30:39 +0000883static PyTypeObject PySSL_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000884 PyVarObject_HEAD_INIT(NULL, 0)
Thomas Woutersed03b412007-08-28 21:37:11 +0000885 "ssl.SSLContext", /*tp_name*/
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000886 sizeof(PySSLObject), /*tp_basicsize*/
887 0, /*tp_itemsize*/
888 /* methods */
889 (destructor)PySSL_dealloc, /*tp_dealloc*/
890 0, /*tp_print*/
891 (getattrfunc)PySSL_getattr, /*tp_getattr*/
892 0, /*tp_setattr*/
893 0, /*tp_compare*/
894 0, /*tp_repr*/
895 0, /*tp_as_number*/
896 0, /*tp_as_sequence*/
897 0, /*tp_as_mapping*/
898 0, /*tp_hash*/
899};
900
901#ifdef HAVE_OPENSSL_RAND
902
903/* helper routines for seeding the SSL PRNG */
904static PyObject *
905PySSL_RAND_add(PyObject *self, PyObject *args)
906{
907 char *buf;
908 int len;
909 double entropy;
910
911 if (!PyArg_ParseTuple(args, "s#d:RAND_add", &buf, &len, &entropy))
912 return NULL;
913 RAND_add(buf, len, entropy);
914 Py_INCREF(Py_None);
915 return Py_None;
916}
917
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000918PyDoc_STRVAR(PySSL_RAND_add_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000919"RAND_add(string, entropy)\n\
920\n\
921Mix string into the OpenSSL PRNG state. entropy (a float) is a lower\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000922bound on the entropy contained in string.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000923
924static PyObject *
925PySSL_RAND_status(PyObject *self)
926{
Neal Norwitz1ccfa902007-08-26 02:26:31 +0000927 return PyBool_FromLong(RAND_status());
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000928}
929
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000930PyDoc_STRVAR(PySSL_RAND_status_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000931"RAND_status() -> 0 or 1\n\
932\n\
Neal Norwitz1ccfa902007-08-26 02:26:31 +0000933Returns True if the OpenSSL PRNG has been seeded with enough data and\n\
934False if not. It is necessary to seed the PRNG with RAND_add()\n\
935on some platforms before using the ssl() function.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000936
937static PyObject *
938PySSL_RAND_egd(PyObject *self, PyObject *arg)
939{
940 int bytes;
941
942 if (!PyString_Check(arg))
943 return PyErr_Format(PyExc_TypeError,
944 "RAND_egd() expected string, found %s",
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000945 Py_Type(arg)->tp_name);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000946 bytes = RAND_egd(PyString_AS_STRING(arg));
947 if (bytes == -1) {
948 PyErr_SetString(PySSLErrorObject,
949 "EGD connection failed or EGD did not return "
950 "enough data to seed the PRNG");
951 return NULL;
952 }
953 return PyInt_FromLong(bytes);
954}
955
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000956PyDoc_STRVAR(PySSL_RAND_egd_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000957"RAND_egd(path) -> bytes\n\
958\n\
959Queries the entropy gather daemon (EGD) on socket path. Returns number\n\
Thomas Woutersed03b412007-08-28 21:37:11 +0000960of bytes read. Raises ssl.sslerror if connection to EGD fails or\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000961if it does provide enough data to seed PRNG.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000962
963#endif
964
965/* List of functions exported by this module. */
966
967static PyMethodDef PySSL_methods[] = {
Thomas Woutersed03b412007-08-28 21:37:11 +0000968 {"sslwrap", PySSL_sslwrap,
969 METH_VARARGS, ssl_doc},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000970#ifdef HAVE_OPENSSL_RAND
Thomas Woutersed03b412007-08-28 21:37:11 +0000971 {"RAND_add", PySSL_RAND_add, METH_VARARGS,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000972 PySSL_RAND_add_doc},
973 {"RAND_egd", PySSL_RAND_egd, METH_O,
974 PySSL_RAND_egd_doc},
975 {"RAND_status", (PyCFunction)PySSL_RAND_status, METH_NOARGS,
976 PySSL_RAND_status_doc},
977#endif
Thomas Woutersed03b412007-08-28 21:37:11 +0000978 {NULL, NULL} /* Sentinel */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000979};
980
981
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000982PyDoc_STRVAR(module_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000983"Implementation module for SSL socket operations. See the socket module\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000984for documentation.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000985
Mark Hammondfe51c6d2002-08-02 02:27:13 +0000986PyMODINIT_FUNC
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000987init_ssl(void)
988{
989 PyObject *m, *d;
990
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000991 Py_Type(&PySSL_Type) = &PyType_Type;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000992
993 m = Py_InitModule3("_ssl", PySSL_methods, module_doc);
Neal Norwitz1ac754f2006-01-19 06:09:39 +0000994 if (m == NULL)
995 return;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000996 d = PyModule_GetDict(m);
997
998 /* Load _socket module and its C API */
999 if (PySocketModule_ImportModuleAndAPI())
Thomas Woutersed03b412007-08-28 21:37:11 +00001000 return;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001001
1002 /* Init OpenSSL */
1003 SSL_load_error_strings();
1004 SSLeay_add_ssl_algorithms();
1005
1006 /* Add symbols to module dict */
Thomas Woutersed03b412007-08-28 21:37:11 +00001007 PySSLErrorObject = PyErr_NewException("ssl.sslerror",
1008 PySocketModule.error,
1009 NULL);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001010 if (PySSLErrorObject == NULL)
1011 return;
Thomas Woutersed03b412007-08-28 21:37:11 +00001012 if (PyDict_SetItemString(d, "sslerror", PySSLErrorObject) != 0)
1013 return;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001014 if (PyDict_SetItemString(d, "SSLType",
1015 (PyObject *)&PySSL_Type) != 0)
1016 return;
1017 PyModule_AddIntConstant(m, "SSL_ERROR_ZERO_RETURN",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001018 PY_SSL_ERROR_ZERO_RETURN);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001019 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_READ",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001020 PY_SSL_ERROR_WANT_READ);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001021 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_WRITE",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001022 PY_SSL_ERROR_WANT_WRITE);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001023 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_X509_LOOKUP",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001024 PY_SSL_ERROR_WANT_X509_LOOKUP);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001025 PyModule_AddIntConstant(m, "SSL_ERROR_SYSCALL",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001026 PY_SSL_ERROR_SYSCALL);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001027 PyModule_AddIntConstant(m, "SSL_ERROR_SSL",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001028 PY_SSL_ERROR_SSL);
1029 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_CONNECT",
1030 PY_SSL_ERROR_WANT_CONNECT);
1031 /* non ssl.h errorcodes */
1032 PyModule_AddIntConstant(m, "SSL_ERROR_EOF",
1033 PY_SSL_ERROR_EOF);
1034 PyModule_AddIntConstant(m, "SSL_ERROR_INVALID_ERROR_CODE",
1035 PY_SSL_ERROR_INVALID_ERROR_CODE);
Thomas Woutersed03b412007-08-28 21:37:11 +00001036 /* cert requirements */
1037 PyModule_AddIntConstant(m, "CERT_NONE",
1038 PY_SSL_CERT_NONE);
1039 PyModule_AddIntConstant(m, "CERT_OPTIONAL",
1040 PY_SSL_CERT_OPTIONAL);
1041 PyModule_AddIntConstant(m, "CERT_REQUIRED",
1042 PY_SSL_CERT_REQUIRED);
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001043
Thomas Woutersed03b412007-08-28 21:37:11 +00001044 /* protocol versions */
1045 PyModule_AddIntConstant(m, "PROTOCOL_SSLv2",
1046 PY_SSL_VERSION_SSL2);
1047 PyModule_AddIntConstant(m, "PROTOCOL_SSLv3",
1048 PY_SSL_VERSION_SSL3);
1049 PyModule_AddIntConstant(m, "PROTOCOL_SSLv23",
1050 PY_SSL_VERSION_SSL23);
1051 PyModule_AddIntConstant(m, "PROTOCOL_TLSv1",
1052 PY_SSL_VERSION_TLS1);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001053}