blob: 5bc2e50311ed11901cb81dd915459c2a89401fc9 [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.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004 Re-worked a bit by Bill Janssen to add server-side support and
Bill Janssen6e027db2007-11-15 22:23:56 +00005 certificate decoding. Chris Stawarz contributed some non-blocking
6 patches.
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00007
Thomas Wouters1b7f8912007-09-19 03:06:30 +00008 This module is imported by ssl.py. It should *not* be used
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00009 directly.
10
Thomas Wouters1b7f8912007-09-19 03:06:30 +000011 XXX should partial writes be enabled, SSL_MODE_ENABLE_PARTIAL_WRITE?
Antoine Pitrou5a1c4d12010-04-23 21:11:10 +000012
13 XXX integrate several "shutdown modes" as suggested in
14 http://bugs.python.org/issue8108#msg102867 ?
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000015*/
16
17#include "Python.h"
Thomas Woutersed03b412007-08-28 21:37:11 +000018
Thomas Wouters1b7f8912007-09-19 03:06:30 +000019#ifdef WITH_THREAD
20#include "pythread.h"
21#define PySSL_BEGIN_ALLOW_THREADS { \
Antoine Pitrou30dc1a72010-05-05 16:01:14 +000022 PyThreadState *_save = NULL; \
23 if (_ssl_locks_count>0) {_save = PyEval_SaveThread();}
24#define PySSL_BLOCK_THREADS if (_ssl_locks_count>0){PyEval_RestoreThread(_save)};
25#define PySSL_UNBLOCK_THREADS if (_ssl_locks_count>0){_save = PyEval_SaveThread()};
26#define PySSL_END_ALLOW_THREADS if (_ssl_locks_count>0){PyEval_RestoreThread(_save);} \
27 }
Thomas Wouters1b7f8912007-09-19 03:06:30 +000028
Antoine Pitrou30dc1a72010-05-05 16:01:14 +000029#else /* no WITH_THREAD */
Thomas Wouters1b7f8912007-09-19 03:06:30 +000030
31#define PySSL_BEGIN_ALLOW_THREADS
32#define PySSL_BLOCK_THREADS
33#define PySSL_UNBLOCK_THREADS
34#define PySSL_END_ALLOW_THREADS
35
36#endif
37
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +000038enum py_ssl_error {
Antoine Pitrou30dc1a72010-05-05 16:01:14 +000039 /* these mirror ssl.h */
40 PY_SSL_ERROR_NONE,
41 PY_SSL_ERROR_SSL,
42 PY_SSL_ERROR_WANT_READ,
43 PY_SSL_ERROR_WANT_WRITE,
44 PY_SSL_ERROR_WANT_X509_LOOKUP,
45 PY_SSL_ERROR_SYSCALL, /* look at error stack/return value/errno */
46 PY_SSL_ERROR_ZERO_RETURN,
47 PY_SSL_ERROR_WANT_CONNECT,
48 /* start of non ssl.h errorcodes */
49 PY_SSL_ERROR_EOF, /* special case of SSL_ERROR_SYSCALL */
50 PY_SSL_ERROR_NO_SOCKET, /* socket has been GC'd */
51 PY_SSL_ERROR_INVALID_ERROR_CODE
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +000052};
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000053
Thomas Woutersed03b412007-08-28 21:37:11 +000054enum py_ssl_server_or_client {
Antoine Pitrou30dc1a72010-05-05 16:01:14 +000055 PY_SSL_CLIENT,
56 PY_SSL_SERVER
Thomas Woutersed03b412007-08-28 21:37:11 +000057};
58
59enum py_ssl_cert_requirements {
Antoine Pitrou30dc1a72010-05-05 16:01:14 +000060 PY_SSL_CERT_NONE,
61 PY_SSL_CERT_OPTIONAL,
62 PY_SSL_CERT_REQUIRED
Thomas Woutersed03b412007-08-28 21:37:11 +000063};
64
65enum py_ssl_version {
Antoine Pitrou30dc1a72010-05-05 16:01:14 +000066 PY_SSL_VERSION_SSL2,
67 PY_SSL_VERSION_SSL3,
68 PY_SSL_VERSION_SSL23,
69 PY_SSL_VERSION_TLS1
Thomas Woutersed03b412007-08-28 21:37:11 +000070};
71
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000072/* Include symbols from _socket module */
73#include "socketmodule.h"
74
Benjamin Petersonb173f782009-05-05 22:31:58 +000075static PySocketModule_APIObject PySocketModule;
76
Thomas Woutersed03b412007-08-28 21:37:11 +000077#if defined(HAVE_POLL_H)
Thomas Wouters0e3f5912006-08-11 14:57:12 +000078#include <poll.h>
79#elif defined(HAVE_SYS_POLL_H)
80#include <sys/poll.h>
81#endif
82
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000083/* Include OpenSSL header files */
84#include "openssl/rsa.h"
85#include "openssl/crypto.h"
86#include "openssl/x509.h"
Thomas Wouters1b7f8912007-09-19 03:06:30 +000087#include "openssl/x509v3.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000088#include "openssl/pem.h"
89#include "openssl/ssl.h"
90#include "openssl/err.h"
91#include "openssl/rand.h"
92
93/* SSL error object */
94static PyObject *PySSLErrorObject;
95
Thomas Wouters1b7f8912007-09-19 03:06:30 +000096#ifdef WITH_THREAD
97
98/* serves as a flag to see whether we've initialized the SSL thread support. */
99/* 0 means no, greater than 0 means yes */
100
101static unsigned int _ssl_locks_count = 0;
102
103#endif /* def WITH_THREAD */
104
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000105/* SSL socket object */
106
107#define X509_NAME_MAXLEN 256
108
109/* RAND_* APIs got added to OpenSSL in 0.9.5 */
110#if OPENSSL_VERSION_NUMBER >= 0x0090500fL
111# define HAVE_OPENSSL_RAND 1
112#else
113# undef HAVE_OPENSSL_RAND
114#endif
115
116typedef struct {
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000117 PyObject_HEAD
118 PyObject *Socket; /* weakref to socket on which we're layered */
119 SSL_CTX* ctx;
120 SSL* ssl;
121 X509* peer_cert;
122 int shutdown_seen_zero;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000123
124} PySSLObject;
125
Jeremy Hylton938ace62002-07-17 16:30:39 +0000126static PyTypeObject PySSL_Type;
127static PyObject *PySSL_SSLwrite(PySSLObject *self, PyObject *args);
128static PyObject *PySSL_SSLread(PySSLObject *self, PyObject *args);
Thomas Woutersed03b412007-08-28 21:37:11 +0000129static int check_socket_and_wait_for_timeout(PySocketSockObject *s,
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000130 int writing);
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000131static PyObject *PySSL_peercert(PySSLObject *self, PyObject *args);
132static PyObject *PySSL_cipher(PySSLObject *self);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000133
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000134#define PySSLObject_Check(v) (Py_TYPE(v) == &PySSL_Type)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000135
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +0000136typedef enum {
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000137 SOCKET_IS_NONBLOCKING,
138 SOCKET_IS_BLOCKING,
139 SOCKET_HAS_TIMED_OUT,
140 SOCKET_HAS_BEEN_CLOSED,
141 SOCKET_TOO_LARGE_FOR_SELECT,
142 SOCKET_OPERATION_OK
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +0000143} timeout_state;
144
Thomas Woutersed03b412007-08-28 21:37:11 +0000145/* Wrap error strings with filename and line # */
146#define STRINGIFY1(x) #x
147#define STRINGIFY2(x) STRINGIFY1(x)
148#define ERRSTR1(x,y,z) (x ":" y ": " z)
149#define ERRSTR(x) ERRSTR1("_ssl.c", STRINGIFY2(__LINE__), x)
150
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000151/* XXX It might be helpful to augment the error message generated
152 below with the name of the SSL function that generated the error.
153 I expect it's obvious most of the time.
154*/
155
156static PyObject *
Thomas Woutersed03b412007-08-28 21:37:11 +0000157PySSL_SetError(PySSLObject *obj, int ret, char *filename, int lineno)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000158{
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000159 PyObject *v;
160 char buf[2048];
161 char *errstr;
162 int err;
163 enum py_ssl_error p = PY_SSL_ERROR_NONE;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000164
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000165 assert(ret <= 0);
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +0000166
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000167 if (obj->ssl != NULL) {
168 err = SSL_get_error(obj->ssl, ret);
Thomas Woutersed03b412007-08-28 21:37:11 +0000169
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000170 switch (err) {
171 case SSL_ERROR_ZERO_RETURN:
172 errstr = "TLS/SSL connection has been closed";
173 p = PY_SSL_ERROR_ZERO_RETURN;
174 break;
175 case SSL_ERROR_WANT_READ:
176 errstr = "The operation did not complete (read)";
177 p = PY_SSL_ERROR_WANT_READ;
178 break;
179 case SSL_ERROR_WANT_WRITE:
180 p = PY_SSL_ERROR_WANT_WRITE;
181 errstr = "The operation did not complete (write)";
182 break;
183 case SSL_ERROR_WANT_X509_LOOKUP:
184 p = PY_SSL_ERROR_WANT_X509_LOOKUP;
Antoine Pitroua29b1812010-05-12 14:08:45 +0000185 errstr = "The operation did not complete (X509 lookup)";
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000186 break;
187 case SSL_ERROR_WANT_CONNECT:
188 p = PY_SSL_ERROR_WANT_CONNECT;
189 errstr = "The operation did not complete (connect)";
190 break;
191 case SSL_ERROR_SYSCALL:
192 {
193 unsigned long e = ERR_get_error();
194 if (e == 0) {
195 PySocketSockObject *s
196 = (PySocketSockObject *) PyWeakref_GetObject(obj->Socket);
197 if (ret == 0 || (((PyObject *)s) == Py_None)) {
Antoine Pitroua29b1812010-05-12 14:08:45 +0000198 p = PY_SSL_ERROR_EOF;
199 errstr = "EOF occurred in violation of protocol";
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000200 } else if (ret == -1) {
Antoine Pitroua29b1812010-05-12 14:08:45 +0000201 /* underlying BIO reported an I/O error */
Antoine Pitrou321257d2010-05-16 23:18:00 +0000202 ERR_clear_error();
Antoine Pitroua29b1812010-05-12 14:08:45 +0000203 return s->errorhandler();
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000204 } else { /* possible? */
Antoine Pitroua29b1812010-05-12 14:08:45 +0000205 p = PY_SSL_ERROR_SYSCALL;
206 errstr = "Some I/O error occurred";
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000207 }
208 } else {
209 p = PY_SSL_ERROR_SYSCALL;
210 /* XXX Protected by global interpreter lock */
211 errstr = ERR_error_string(e, NULL);
212 }
213 break;
214 }
215 case SSL_ERROR_SSL:
216 {
217 unsigned long e = ERR_get_error();
218 p = PY_SSL_ERROR_SSL;
219 if (e != 0)
220 /* XXX Protected by global interpreter lock */
221 errstr = ERR_error_string(e, NULL);
222 else { /* possible? */
Antoine Pitroua29b1812010-05-12 14:08:45 +0000223 errstr = "A failure in the SSL library occurred";
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000224 }
225 break;
226 }
227 default:
228 p = PY_SSL_ERROR_INVALID_ERROR_CODE;
229 errstr = "Invalid error code";
230 }
231 } else {
232 errstr = ERR_error_string(ERR_peek_last_error(), NULL);
233 }
234 PyOS_snprintf(buf, sizeof(buf), "_ssl.c:%d: %s", lineno, errstr);
Antoine Pitrou321257d2010-05-16 23:18:00 +0000235 ERR_clear_error();
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000236 v = Py_BuildValue("(is)", p, buf);
237 if (v != NULL) {
238 PyErr_SetObject(PySSLErrorObject, v);
239 Py_DECREF(v);
240 }
241 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000242}
243
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000244static PyObject *
245_setSSLError (char *errstr, int errcode, char *filename, int lineno) {
246
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000247 char buf[2048];
248 PyObject *v;
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000249
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000250 if (errstr == NULL) {
251 errcode = ERR_peek_last_error();
252 errstr = ERR_error_string(errcode, NULL);
253 }
254 PyOS_snprintf(buf, sizeof(buf), "_ssl.c:%d: %s", lineno, errstr);
Antoine Pitrou321257d2010-05-16 23:18:00 +0000255 ERR_clear_error();
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000256 v = Py_BuildValue("(is)", errcode, buf);
257 if (v != NULL) {
258 PyErr_SetObject(PySSLErrorObject, v);
259 Py_DECREF(v);
260 }
261 return NULL;
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000262}
263
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000264static PySSLObject *
Thomas Woutersed03b412007-08-28 21:37:11 +0000265newPySSLObject(PySocketSockObject *Sock, char *key_file, char *cert_file,
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000266 enum py_ssl_server_or_client socket_type,
267 enum py_ssl_cert_requirements certreq,
268 enum py_ssl_version proto_version,
269 char *cacerts_file)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000270{
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000271 PySSLObject *self;
272 char *errstr = NULL;
273 int ret;
274 int verification_mode;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000275
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000276 self = PyObject_New(PySSLObject, &PySSL_Type); /* Create new object */
277 if (self == NULL)
278 return NULL;
279 self->peer_cert = NULL;
280 self->ssl = NULL;
281 self->ctx = NULL;
282 self->Socket = NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000283
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000284 /* Make sure the SSL error state is initialized */
285 (void) ERR_get_state();
286 ERR_clear_error();
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000287
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000288 if ((key_file && !cert_file) || (!key_file && cert_file)) {
289 errstr = ERRSTR("Both the key & certificate files "
290 "must be specified");
291 goto fail;
292 }
Thomas Woutersed03b412007-08-28 21:37:11 +0000293
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000294 if ((socket_type == PY_SSL_SERVER) &&
295 ((key_file == NULL) || (cert_file == NULL))) {
296 errstr = ERRSTR("Both the key & certificate files "
297 "must be specified for server-side operation");
298 goto fail;
299 }
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000300
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000301 PySSL_BEGIN_ALLOW_THREADS
302 if (proto_version == PY_SSL_VERSION_TLS1)
303 self->ctx = SSL_CTX_new(TLSv1_method()); /* Set up context */
304 else if (proto_version == PY_SSL_VERSION_SSL3)
305 self->ctx = SSL_CTX_new(SSLv3_method()); /* Set up context */
306 else if (proto_version == PY_SSL_VERSION_SSL2)
307 self->ctx = SSL_CTX_new(SSLv2_method()); /* Set up context */
308 else if (proto_version == PY_SSL_VERSION_SSL23)
309 self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */
310 PySSL_END_ALLOW_THREADS
Thomas Woutersed03b412007-08-28 21:37:11 +0000311
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000312 if (self->ctx == NULL) {
313 errstr = ERRSTR("Invalid SSL protocol variant specified.");
314 goto fail;
315 }
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000316
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000317 if (certreq != PY_SSL_CERT_NONE) {
318 if (cacerts_file == NULL) {
319 errstr = ERRSTR("No root certificates specified for "
Antoine Pitroua29b1812010-05-12 14:08:45 +0000320 "verification of other-side certificates.");
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000321 goto fail;
322 } else {
323 PySSL_BEGIN_ALLOW_THREADS
324 ret = SSL_CTX_load_verify_locations(self->ctx,
325 cacerts_file,
326 NULL);
327 PySSL_END_ALLOW_THREADS
328 if (ret != 1) {
329 _setSSLError(NULL, 0, __FILE__, __LINE__);
330 goto fail;
331 }
332 }
333 }
334 if (key_file) {
335 PySSL_BEGIN_ALLOW_THREADS
336 ret = SSL_CTX_use_PrivateKey_file(self->ctx, key_file,
337 SSL_FILETYPE_PEM);
338 PySSL_END_ALLOW_THREADS
339 if (ret != 1) {
340 _setSSLError(NULL, ret, __FILE__, __LINE__);
341 goto fail;
342 }
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000343
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000344 PySSL_BEGIN_ALLOW_THREADS
345 ret = SSL_CTX_use_certificate_chain_file(self->ctx,
346 cert_file);
347 PySSL_END_ALLOW_THREADS
348 if (ret != 1) {
349 /*
350 fprintf(stderr, "ret is %d, errcode is %lu, %lu, with file \"%s\"\n",
351 ret, ERR_peek_error(), ERR_peek_last_error(), cert_file);
352 */
353 if (ERR_peek_last_error() != 0) {
354 _setSSLError(NULL, ret, __FILE__, __LINE__);
355 goto fail;
356 }
357 }
358 }
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000359
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000360 /* ssl compatibility */
361 SSL_CTX_set_options(self->ctx, SSL_OP_ALL);
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000362
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000363 verification_mode = SSL_VERIFY_NONE;
364 if (certreq == PY_SSL_CERT_OPTIONAL)
365 verification_mode = SSL_VERIFY_PEER;
366 else if (certreq == PY_SSL_CERT_REQUIRED)
367 verification_mode = (SSL_VERIFY_PEER |
368 SSL_VERIFY_FAIL_IF_NO_PEER_CERT);
369 SSL_CTX_set_verify(self->ctx, verification_mode,
370 NULL); /* set verify lvl */
Thomas Woutersed03b412007-08-28 21:37:11 +0000371
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000372 PySSL_BEGIN_ALLOW_THREADS
373 self->ssl = SSL_new(self->ctx); /* New ssl struct */
374 PySSL_END_ALLOW_THREADS
375 SSL_set_fd(self->ssl, Sock->sock_fd); /* Set the socket for SSL */
Antoine Pitroud59ceb52010-04-09 20:47:00 +0000376#ifdef SSL_MODE_AUTO_RETRY
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000377 SSL_set_mode(self->ssl, SSL_MODE_AUTO_RETRY);
Antoine Pitroud59ceb52010-04-09 20:47:00 +0000378#endif
Guido van Rossum4f707ac2003-01-31 18:13:18 +0000379
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000380 /* If the socket is in non-blocking mode or timeout mode, set the BIO
381 * to non-blocking mode (blocking is the default)
382 */
383 if (Sock->sock_timeout >= 0.0) {
384 /* Set both the read and write BIO's to non-blocking mode */
385 BIO_set_nbio(SSL_get_rbio(self->ssl), 1);
386 BIO_set_nbio(SSL_get_wbio(self->ssl), 1);
387 }
Guido van Rossum4f707ac2003-01-31 18:13:18 +0000388
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000389 PySSL_BEGIN_ALLOW_THREADS
390 if (socket_type == PY_SSL_CLIENT)
391 SSL_set_connect_state(self->ssl);
392 else
393 SSL_set_accept_state(self->ssl);
394 PySSL_END_ALLOW_THREADS
Martin v. Löwis09c35f72002-07-28 09:57:45 +0000395
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000396 self->Socket = PyWeakref_NewRef((PyObject *) Sock, Py_None);
397 return self;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000398 fail:
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000399 if (errstr)
400 PyErr_SetString(PySSLErrorObject, errstr);
401 Py_DECREF(self);
402 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000403}
404
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000405static PyObject *
Thomas Woutersed03b412007-08-28 21:37:11 +0000406PySSL_sslwrap(PyObject *self, PyObject *args)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000407{
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000408 PySocketSockObject *Sock;
409 int server_side = 0;
410 int verification_mode = PY_SSL_CERT_NONE;
411 int protocol = PY_SSL_VERSION_SSL23;
412 char *key_file = NULL;
413 char *cert_file = NULL;
414 char *cacerts_file = NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000415
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000416 if (!PyArg_ParseTuple(args, "O!i|zziiz:sslwrap",
417 PySocketModule.Sock_Type,
418 &Sock,
419 &server_side,
420 &key_file, &cert_file,
421 &verification_mode, &protocol,
422 &cacerts_file))
423 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000424
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000425 /*
426 fprintf(stderr,
427 "server_side is %d, keyfile %p, certfile %p, verify_mode %d, "
428 "protocol %d, certs %p\n",
429 server_side, key_file, cert_file, verification_mode,
430 protocol, cacerts_file);
431 */
Thomas Woutersed03b412007-08-28 21:37:11 +0000432
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000433 return (PyObject *) newPySSLObject(Sock, key_file, cert_file,
434 server_side, verification_mode,
435 protocol, cacerts_file);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000436}
437
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000438PyDoc_STRVAR(ssl_doc,
Thomas Woutersed03b412007-08-28 21:37:11 +0000439"sslwrap(socket, server_side, [keyfile, certfile, certs_mode, protocol,\n"
440" cacertsfile]) -> sslobject");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000441
442/* SSL object methods */
443
Bill Janssen6e027db2007-11-15 22:23:56 +0000444static PyObject *PySSL_SSLdo_handshake(PySSLObject *self)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000445{
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000446 int ret;
447 int err;
448 int sockstate, nonblocking;
449 PySocketSockObject *sock
450 = (PySocketSockObject *) PyWeakref_GetObject(self->Socket);
Antoine Pitrouec146182010-04-24 21:30:20 +0000451
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000452 if (((PyObject*)sock) == Py_None) {
453 _setSSLError("Underlying socket connection gone",
454 PY_SSL_ERROR_NO_SOCKET, __FILE__, __LINE__);
455 return NULL;
456 }
Antoine Pitrouec146182010-04-24 21:30:20 +0000457
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000458 /* just in case the blocking state of the socket has been changed */
459 nonblocking = (sock->sock_timeout >= 0.0);
460 BIO_set_nbio(SSL_get_rbio(self->ssl), nonblocking);
461 BIO_set_nbio(SSL_get_wbio(self->ssl), nonblocking);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000462
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000463 /* Actually negotiate SSL connection */
464 /* XXX If SSL_do_handshake() returns 0, it's also a failure. */
465 sockstate = 0;
466 do {
Bill Janssen6e027db2007-11-15 22:23:56 +0000467 PySSL_BEGIN_ALLOW_THREADS
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000468 ret = SSL_do_handshake(self->ssl);
469 err = SSL_get_error(self->ssl, ret);
470 PySSL_END_ALLOW_THREADS
471 if(PyErr_CheckSignals()) {
472 return NULL;
473 }
474 if (err == SSL_ERROR_WANT_READ) {
475 sockstate = check_socket_and_wait_for_timeout(sock, 0);
476 } else if (err == SSL_ERROR_WANT_WRITE) {
477 sockstate = check_socket_and_wait_for_timeout(sock, 1);
478 } else {
479 sockstate = SOCKET_OPERATION_OK;
480 }
481 if (sockstate == SOCKET_HAS_TIMED_OUT) {
482 PyErr_SetString(PySSLErrorObject,
Antoine Pitroua29b1812010-05-12 14:08:45 +0000483 ERRSTR("The handshake operation timed out"));
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000484 return NULL;
485 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
486 PyErr_SetString(PySSLErrorObject,
Antoine Pitroua29b1812010-05-12 14:08:45 +0000487 ERRSTR("Underlying socket has been closed."));
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000488 return NULL;
489 } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
490 PyErr_SetString(PySSLErrorObject,
Antoine Pitroua29b1812010-05-12 14:08:45 +0000491 ERRSTR("Underlying socket too large for select()."));
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000492 return NULL;
493 } else if (sockstate == SOCKET_IS_NONBLOCKING) {
494 break;
495 }
496 } while (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE);
497 if (ret < 1)
498 return PySSL_SetError(self, ret, __FILE__, __LINE__);
499 self->ssl->debug = 1;
Bill Janssen6e027db2007-11-15 22:23:56 +0000500
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000501 if (self->peer_cert)
502 X509_free (self->peer_cert);
503 PySSL_BEGIN_ALLOW_THREADS
504 self->peer_cert = SSL_get_peer_certificate(self->ssl);
505 PySSL_END_ALLOW_THREADS
506
507 Py_INCREF(Py_None);
508 return Py_None;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000509}
510
Thomas Woutersed03b412007-08-28 21:37:11 +0000511static PyObject *
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000512_create_tuple_for_attribute (ASN1_OBJECT *name, ASN1_STRING *value) {
Thomas Woutersed03b412007-08-28 21:37:11 +0000513
Antoine Pitrou30dc1a72010-05-05 16:01:14 +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;
Thomas Woutersed03b412007-08-28 21:37:11 +0000520
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000521 buflen = OBJ_obj2txt(namebuf, sizeof(namebuf), name, 0);
522 if (buflen < 0) {
523 _setSSLError(NULL, 0, __FILE__, __LINE__);
524 goto fail;
525 }
526 name_obj = PyUnicode_FromStringAndSize(namebuf, buflen);
527 if (name_obj == NULL)
528 goto fail;
Guido van Rossumf06628b2007-11-21 20:01:53 +0000529
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000530 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,
Antoine Pitroua29b1812010-05-12 14:08:45 +0000537 buflen, "strict");
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000538 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;
Thomas Woutersed03b412007-08-28 21:37:11 +0000552
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000553 fail:
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000554 return NULL;
Thomas Woutersed03b412007-08-28 21:37:11 +0000555}
556
557static PyObject *
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000558_create_tuple_for_X509_NAME (X509_NAME *xname)
Thomas Woutersed03b412007-08-28 21:37:11 +0000559{
Antoine Pitrou30dc1a72010-05-05 16:01:14 +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;
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000571
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000572 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;
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000579
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000580 for (index_counter = 0;
581 index_counter < entry_count;
582 index_counter++)
583 {
584 entry = X509_NAME_get_entry(xname, index_counter);
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000585
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000586 /* 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;
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000606
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000607 /* 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,
614 PyBytes_AS_STRING(PyTuple_GET_ITEM(attr, 0)),
615 PyBytes_AS_STRING(PyTuple_GET_ITEM(attr, 1)));
616 */
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 }
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000635
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000636 /* convert list to tuple */
637 rdnt = PyList_AsTuple(dn);
638 Py_DECREF(dn);
639 if (rdnt == NULL)
640 return NULL;
641 return rdnt;
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000642
643 fail1:
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000644 Py_XDECREF(rdn);
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000645
646 fail0:
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000647 Py_XDECREF(dn);
648 return NULL;
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000649}
650
651static PyObject *
652_get_peer_alt_names (X509 *certificate) {
Guido van Rossumf06628b2007-11-21 20:01:53 +0000653
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000654 /* 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. */
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000659
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000660 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;
671 /* Issue #2973: ASN1_item_d2i() API changed in OpenSSL 0.9.6m */
Victor Stinner117ff172010-03-02 22:49:30 +0000672#if OPENSSL_VERSION_NUMBER >= 0x009060dfL
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000673 const unsigned char *p;
Victor Stinner117ff172010-03-02 22:49:30 +0000674#else
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000675 unsigned char *p;
Victor Stinner117ff172010-03-02 22:49:30 +0000676#endif
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000677
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000678 if (certificate == NULL)
679 return peer_alt_names;
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000680
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000681 /* get a memory buffer */
682 biobuf = BIO_new(BIO_s_mem());
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000683
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000684 i = 0;
685 while ((i = X509_get_ext_by_NID(
686 certificate, NID_subject_alt_name, i)) >= 0) {
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000687
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000688 if (peer_alt_names == Py_None) {
689 peer_alt_names = PyList_New(0);
690 if (peer_alt_names == NULL)
691 goto fail;
692 }
Guido van Rossumf06628b2007-11-21 20:01:53 +0000693
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000694 /* now decode the altName */
695 ext = X509_get_ext(certificate, i);
696 if(!(method = X509V3_EXT_get(ext))) {
697 PyErr_SetString
698 (PySSLErrorObject,
699 ERRSTR("No method for internalizing subjectAltName!"));
700 goto fail;
701 }
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000702
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000703 p = ext->value->data;
704 if (method->it)
705 names = (GENERAL_NAMES*)
706 (ASN1_item_d2i(NULL,
707 &p,
708 ext->value->length,
709 ASN1_ITEM_ptr(method->it)));
710 else
711 names = (GENERAL_NAMES*)
712 (method->d2i(NULL,
713 &p,
714 ext->value->length));
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000715
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000716 for(j = 0; j < sk_GENERAL_NAME_num(names); j++) {
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000717
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000718 /* get a rendering of each name in the set of names */
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000719
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000720 name = sk_GENERAL_NAME_value(names, j);
721 if (name->type == GEN_DIRNAME) {
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000722
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000723 /* we special-case DirName as a tuple of
724 tuples of attributes */
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000725
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000726 t = PyTuple_New(2);
727 if (t == NULL) {
728 goto fail;
729 }
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000730
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000731 v = PyUnicode_FromString("DirName");
732 if (v == NULL) {
733 Py_DECREF(t);
734 goto fail;
735 }
736 PyTuple_SET_ITEM(t, 0, v);
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000737
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000738 v = _create_tuple_for_X509_NAME (name->d.dirn);
739 if (v == NULL) {
740 Py_DECREF(t);
741 goto fail;
742 }
743 PyTuple_SET_ITEM(t, 1, v);
Guido van Rossumf06628b2007-11-21 20:01:53 +0000744
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000745 } else {
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000746
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000747 /* for everything else, we use the OpenSSL print form */
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000748
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000749 (void) BIO_reset(biobuf);
750 GENERAL_NAME_print(biobuf, name);
751 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
752 if (len < 0) {
753 _setSSLError(NULL, 0, __FILE__, __LINE__);
754 goto fail;
755 }
756 vptr = strchr(buf, ':');
757 if (vptr == NULL)
758 goto fail;
759 t = PyTuple_New(2);
760 if (t == NULL)
761 goto fail;
762 v = PyUnicode_FromStringAndSize(buf, (vptr - buf));
763 if (v == NULL) {
764 Py_DECREF(t);
765 goto fail;
766 }
767 PyTuple_SET_ITEM(t, 0, v);
768 v = PyUnicode_FromStringAndSize((vptr + 1),
769 (len - (vptr - buf + 1)));
770 if (v == NULL) {
771 Py_DECREF(t);
772 goto fail;
773 }
774 PyTuple_SET_ITEM(t, 1, v);
775 }
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000776
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000777 /* and add that rendering to the list */
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000778
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000779 if (PyList_Append(peer_alt_names, t) < 0) {
780 Py_DECREF(t);
781 goto fail;
782 }
783 Py_DECREF(t);
784 }
785 }
786 BIO_free(biobuf);
787 if (peer_alt_names != Py_None) {
788 v = PyList_AsTuple(peer_alt_names);
789 Py_DECREF(peer_alt_names);
790 return v;
791 } else {
792 return peer_alt_names;
793 }
Guido van Rossumf06628b2007-11-21 20:01:53 +0000794
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000795
796 fail:
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000797 if (biobuf != NULL)
798 BIO_free(biobuf);
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000799
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000800 if (peer_alt_names != Py_None) {
801 Py_XDECREF(peer_alt_names);
802 }
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000803
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000804 return NULL;
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000805}
806
807static PyObject *
808_decode_certificate (X509 *certificate, int verbose) {
809
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000810 PyObject *retval = NULL;
811 BIO *biobuf = NULL;
812 PyObject *peer;
813 PyObject *peer_alt_names = NULL;
814 PyObject *issuer;
815 PyObject *version;
816 PyObject *sn_obj;
817 ASN1_INTEGER *serialNumber;
818 char buf[2048];
819 int len;
820 ASN1_TIME *notBefore, *notAfter;
821 PyObject *pnotBefore, *pnotAfter;
Thomas Woutersed03b412007-08-28 21:37:11 +0000822
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000823 retval = PyDict_New();
824 if (retval == NULL)
825 return NULL;
Thomas Woutersed03b412007-08-28 21:37:11 +0000826
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000827 peer = _create_tuple_for_X509_NAME(
828 X509_get_subject_name(certificate));
829 if (peer == NULL)
830 goto fail0;
831 if (PyDict_SetItemString(retval, (const char *) "subject", peer) < 0) {
832 Py_DECREF(peer);
833 goto fail0;
834 }
835 Py_DECREF(peer);
Thomas Woutersed03b412007-08-28 21:37:11 +0000836
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000837 if (verbose) {
838 issuer = _create_tuple_for_X509_NAME(
839 X509_get_issuer_name(certificate));
840 if (issuer == NULL)
841 goto fail0;
842 if (PyDict_SetItemString(retval, (const char *)"issuer", issuer) < 0) {
843 Py_DECREF(issuer);
844 goto fail0;
845 }
846 Py_DECREF(issuer);
Guido van Rossumf06628b2007-11-21 20:01:53 +0000847
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000848 version = PyLong_FromLong(X509_get_version(certificate) + 1);
849 if (PyDict_SetItemString(retval, "version", version) < 0) {
850 Py_DECREF(version);
851 goto fail0;
852 }
853 Py_DECREF(version);
854 }
Guido van Rossumf06628b2007-11-21 20:01:53 +0000855
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000856 /* get a memory buffer */
857 biobuf = BIO_new(BIO_s_mem());
Guido van Rossumf06628b2007-11-21 20:01:53 +0000858
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000859 if (verbose) {
Thomas Woutersed03b412007-08-28 21:37:11 +0000860
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000861 (void) BIO_reset(biobuf);
862 serialNumber = X509_get_serialNumber(certificate);
863 /* should not exceed 20 octets, 160 bits, so buf is big enough */
864 i2a_ASN1_INTEGER(biobuf, serialNumber);
865 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
866 if (len < 0) {
867 _setSSLError(NULL, 0, __FILE__, __LINE__);
868 goto fail1;
869 }
870 sn_obj = PyUnicode_FromStringAndSize(buf, len);
871 if (sn_obj == NULL)
872 goto fail1;
873 if (PyDict_SetItemString(retval, "serialNumber", sn_obj) < 0) {
874 Py_DECREF(sn_obj);
875 goto fail1;
876 }
877 Py_DECREF(sn_obj);
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000878
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000879 (void) BIO_reset(biobuf);
880 notBefore = X509_get_notBefore(certificate);
881 ASN1_TIME_print(biobuf, notBefore);
882 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
883 if (len < 0) {
884 _setSSLError(NULL, 0, __FILE__, __LINE__);
885 goto fail1;
886 }
887 pnotBefore = PyUnicode_FromStringAndSize(buf, len);
888 if (pnotBefore == NULL)
889 goto fail1;
890 if (PyDict_SetItemString(retval, "notBefore", pnotBefore) < 0) {
891 Py_DECREF(pnotBefore);
892 goto fail1;
893 }
894 Py_DECREF(pnotBefore);
895 }
Thomas Woutersed03b412007-08-28 21:37:11 +0000896
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000897 (void) BIO_reset(biobuf);
898 notAfter = X509_get_notAfter(certificate);
899 ASN1_TIME_print(biobuf, notAfter);
900 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
901 if (len < 0) {
902 _setSSLError(NULL, 0, __FILE__, __LINE__);
903 goto fail1;
904 }
905 pnotAfter = PyUnicode_FromStringAndSize(buf, len);
906 if (pnotAfter == NULL)
907 goto fail1;
908 if (PyDict_SetItemString(retval, "notAfter", pnotAfter) < 0) {
909 Py_DECREF(pnotAfter);
910 goto fail1;
911 }
912 Py_DECREF(pnotAfter);
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000913
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000914 /* Now look for subjectAltName */
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000915
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000916 peer_alt_names = _get_peer_alt_names(certificate);
917 if (peer_alt_names == NULL)
918 goto fail1;
919 else if (peer_alt_names != Py_None) {
920 if (PyDict_SetItemString(retval, "subjectAltName",
921 peer_alt_names) < 0) {
922 Py_DECREF(peer_alt_names);
923 goto fail1;
924 }
925 Py_DECREF(peer_alt_names);
926 }
Guido van Rossumf06628b2007-11-21 20:01:53 +0000927
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000928 BIO_free(biobuf);
929 return retval;
Thomas Woutersed03b412007-08-28 21:37:11 +0000930
931 fail1:
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000932 if (biobuf != NULL)
933 BIO_free(biobuf);
Thomas Woutersed03b412007-08-28 21:37:11 +0000934 fail0:
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000935 Py_XDECREF(retval);
936 return NULL;
Thomas Woutersed03b412007-08-28 21:37:11 +0000937}
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000938
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000939
940static PyObject *
941PySSL_test_decode_certificate (PyObject *mod, PyObject *args) {
942
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000943 PyObject *retval = NULL;
944 char *filename = NULL;
945 X509 *x=NULL;
946 BIO *cert;
947 int verbose = 1;
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000948
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000949 if (!PyArg_ParseTuple(args, "s|i:test_decode_certificate",
950 &filename, &verbose))
951 return NULL;
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000952
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000953 if ((cert=BIO_new(BIO_s_file())) == NULL) {
954 PyErr_SetString(PySSLErrorObject,
955 "Can't malloc memory to read file");
956 goto fail0;
957 }
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000958
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000959 if (BIO_read_filename(cert,filename) <= 0) {
960 PyErr_SetString(PySSLErrorObject,
961 "Can't open file");
962 goto fail0;
963 }
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000964
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000965 x = PEM_read_bio_X509_AUX(cert,NULL, NULL, NULL);
966 if (x == NULL) {
967 PyErr_SetString(PySSLErrorObject,
968 "Error decoding PEM-encoded file");
969 goto fail0;
970 }
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000971
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000972 retval = _decode_certificate(x, verbose);
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000973
974 fail0:
Guido van Rossumf06628b2007-11-21 20:01:53 +0000975
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000976 if (cert != NULL) BIO_free(cert);
977 return retval;
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000978}
979
980
981static PyObject *
982PySSL_peercert(PySSLObject *self, PyObject *args)
983{
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000984 PyObject *retval = NULL;
985 int len;
986 int verification;
987 PyObject *binary_mode = Py_None;
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000988
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000989 if (!PyArg_ParseTuple(args, "|O:peer_certificate", &binary_mode))
990 return NULL;
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000991
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000992 if (!self->peer_cert)
993 Py_RETURN_NONE;
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000994
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000995 if (PyObject_IsTrue(binary_mode)) {
996 /* return cert in DER-encoded format */
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000997
Antoine Pitrou30dc1a72010-05-05 16:01:14 +0000998 unsigned char *bytes_buf = NULL;
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000999
Antoine Pitrou30dc1a72010-05-05 16:01:14 +00001000 bytes_buf = NULL;
1001 len = i2d_X509(self->peer_cert, &bytes_buf);
1002 if (len < 0) {
1003 PySSL_SetError(self, len, __FILE__, __LINE__);
1004 return NULL;
1005 }
1006 /* this is actually an immutable bytes sequence */
1007 retval = PyBytes_FromStringAndSize
1008 ((const char *) bytes_buf, len);
1009 OPENSSL_free(bytes_buf);
1010 return retval;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001011
Antoine Pitrou30dc1a72010-05-05 16:01:14 +00001012 } else {
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001013
Antoine Pitrou30dc1a72010-05-05 16:01:14 +00001014 verification = SSL_CTX_get_verify_mode(self->ctx);
1015 if ((verification & SSL_VERIFY_PEER) == 0)
1016 return PyDict_New();
1017 else
1018 return _decode_certificate (self->peer_cert, 0);
1019 }
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001020}
1021
1022PyDoc_STRVAR(PySSL_peercert_doc,
1023"peer_certificate([der=False]) -> certificate\n\
1024\n\
1025Returns the certificate for the peer. If no certificate was provided,\n\
1026returns None. If a certificate was provided, but not validated, returns\n\
1027an empty dictionary. Otherwise returns a dict containing information\n\
1028about the peer certificate.\n\
1029\n\
1030If the optional argument is True, returns a DER-encoded copy of the\n\
1031peer certificate, or None if no certificate was provided. This will\n\
1032return the certificate even if it wasn't validated.");
1033
1034static PyObject *PySSL_cipher (PySSLObject *self) {
1035
Antoine Pitrou30dc1a72010-05-05 16:01:14 +00001036 PyObject *retval, *v;
1037 SSL_CIPHER *current;
1038 char *cipher_name;
1039 char *cipher_protocol;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001040
Antoine Pitrou30dc1a72010-05-05 16:01:14 +00001041 if (self->ssl == NULL)
1042 return Py_None;
1043 current = SSL_get_current_cipher(self->ssl);
1044 if (current == NULL)
1045 return Py_None;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001046
Antoine Pitrou30dc1a72010-05-05 16:01:14 +00001047 retval = PyTuple_New(3);
1048 if (retval == NULL)
1049 return NULL;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001050
Antoine Pitrou30dc1a72010-05-05 16:01:14 +00001051 cipher_name = (char *) SSL_CIPHER_get_name(current);
1052 if (cipher_name == NULL) {
1053 PyTuple_SET_ITEM(retval, 0, Py_None);
1054 } else {
1055 v = PyUnicode_FromString(cipher_name);
1056 if (v == NULL)
1057 goto fail0;
1058 PyTuple_SET_ITEM(retval, 0, v);
1059 }
1060 cipher_protocol = SSL_CIPHER_get_version(current);
1061 if (cipher_protocol == NULL) {
1062 PyTuple_SET_ITEM(retval, 1, Py_None);
1063 } else {
1064 v = PyUnicode_FromString(cipher_protocol);
1065 if (v == NULL)
1066 goto fail0;
1067 PyTuple_SET_ITEM(retval, 1, v);
1068 }
1069 v = PyLong_FromLong(SSL_CIPHER_get_bits(current, NULL));
1070 if (v == NULL)
1071 goto fail0;
1072 PyTuple_SET_ITEM(retval, 2, v);
1073 return retval;
Guido van Rossumf06628b2007-11-21 20:01:53 +00001074
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001075 fail0:
Antoine Pitrou30dc1a72010-05-05 16:01:14 +00001076 Py_DECREF(retval);
1077 return NULL;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001078}
1079
Guido van Rossume6650f92007-12-06 19:05:55 +00001080static void PySSL_dealloc(PySSLObject *self)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001081{
Antoine Pitrou30dc1a72010-05-05 16:01:14 +00001082 if (self->peer_cert) /* Possible not to have one? */
1083 X509_free (self->peer_cert);
1084 if (self->ssl)
1085 SSL_free(self->ssl);
1086 if (self->ctx)
1087 SSL_CTX_free(self->ctx);
1088 Py_XDECREF(self->Socket);
1089 PyObject_Del(self);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001090}
1091
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001092/* If the socket has a timeout, do a select()/poll() on the socket.
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001093 The argument writing indicates the direction.
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001094 Returns one of the possibilities in the timeout_state enum (above).
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001095 */
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001096
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001097static int
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001098check_socket_and_wait_for_timeout(PySocketSockObject *s, int writing)
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001099{
Antoine Pitrou30dc1a72010-05-05 16:01:14 +00001100 fd_set fds;
1101 struct timeval tv;
1102 int rc;
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001103
Antoine Pitrou30dc1a72010-05-05 16:01:14 +00001104 /* Nothing to do unless we're in timeout mode (not non-blocking) */
1105 if (s->sock_timeout < 0.0)
1106 return SOCKET_IS_BLOCKING;
1107 else if (s->sock_timeout == 0.0)
1108 return SOCKET_IS_NONBLOCKING;
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001109
Antoine Pitrou30dc1a72010-05-05 16:01:14 +00001110 /* Guard against closed socket */
1111 if (s->sock_fd < 0)
1112 return SOCKET_HAS_BEEN_CLOSED;
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001113
Antoine Pitrou30dc1a72010-05-05 16:01:14 +00001114 /* Prefer poll, if available, since you can poll() any fd
1115 * which can't be done with select(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001116#ifdef HAVE_POLL
Antoine Pitrou30dc1a72010-05-05 16:01:14 +00001117 {
1118 struct pollfd pollfd;
1119 int timeout;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001120
Antoine Pitrou30dc1a72010-05-05 16:01:14 +00001121 pollfd.fd = s->sock_fd;
1122 pollfd.events = writing ? POLLOUT : POLLIN;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001123
Antoine Pitrou30dc1a72010-05-05 16:01:14 +00001124 /* s->sock_timeout is in seconds, timeout in ms */
1125 timeout = (int)(s->sock_timeout * 1000 + 0.5);
1126 PySSL_BEGIN_ALLOW_THREADS
1127 rc = poll(&pollfd, 1, timeout);
1128 PySSL_END_ALLOW_THREADS
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001129
Antoine Pitrou30dc1a72010-05-05 16:01:14 +00001130 goto normal_return;
1131 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001132#endif
1133
Antoine Pitrou30dc1a72010-05-05 16:01:14 +00001134 /* Guard against socket too large for select*/
Martin v. Löwisf84d1b92006-02-11 09:27:05 +00001135#ifndef Py_SOCKET_FD_CAN_BE_GE_FD_SETSIZE
Antoine Pitrou30dc1a72010-05-05 16:01:14 +00001136 if (s->sock_fd >= FD_SETSIZE)
1137 return SOCKET_TOO_LARGE_FOR_SELECT;
Martin v. Löwisf84d1b92006-02-11 09:27:05 +00001138#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +00001139
Antoine Pitrou30dc1a72010-05-05 16:01:14 +00001140 /* Construct the arguments to select */
1141 tv.tv_sec = (int)s->sock_timeout;
1142 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
1143 FD_ZERO(&fds);
1144 FD_SET(s->sock_fd, &fds);
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001145
Antoine Pitrou30dc1a72010-05-05 16:01:14 +00001146 /* See if the socket is ready */
1147 PySSL_BEGIN_ALLOW_THREADS
1148 if (writing)
1149 rc = select(s->sock_fd+1, NULL, &fds, NULL, &tv);
1150 else
1151 rc = select(s->sock_fd+1, &fds, NULL, NULL, &tv);
1152 PySSL_END_ALLOW_THREADS
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001153
Bill Janssen6e027db2007-11-15 22:23:56 +00001154#ifdef HAVE_POLL
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001155normal_return:
Bill Janssen6e027db2007-11-15 22:23:56 +00001156#endif
Antoine Pitrou30dc1a72010-05-05 16:01:14 +00001157 /* Return SOCKET_TIMED_OUT on timeout, SOCKET_OPERATION_OK otherwise
1158 (when we are able to write or when there's something to read) */
1159 return rc == 0 ? SOCKET_HAS_TIMED_OUT : SOCKET_OPERATION_OK;
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001160}
1161
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001162static PyObject *PySSL_SSLwrite(PySSLObject *self, PyObject *args)
1163{
Antoine Pitrou30dc1a72010-05-05 16:01:14 +00001164 char *data;
1165 int len;
1166 int count;
1167 int sockstate;
1168 int err;
1169 int nonblocking;
1170 PySocketSockObject *sock
1171 = (PySocketSockObject *) PyWeakref_GetObject(self->Socket);
Bill Janssen54cc54c2007-12-14 22:08:56 +00001172
Antoine Pitrou30dc1a72010-05-05 16:01:14 +00001173 if (((PyObject*)sock) == Py_None) {
1174 _setSSLError("Underlying socket connection gone",
1175 PY_SSL_ERROR_NO_SOCKET, __FILE__, __LINE__);
1176 return NULL;
1177 }
1178
1179 if (!PyArg_ParseTuple(args, "y#:write", &data, &count))
1180 return NULL;
1181
1182 /* just in case the blocking state of the socket has been changed */
1183 nonblocking = (sock->sock_timeout >= 0.0);
1184 BIO_set_nbio(SSL_get_rbio(self->ssl), nonblocking);
1185 BIO_set_nbio(SSL_get_wbio(self->ssl), nonblocking);
1186
1187 sockstate = check_socket_and_wait_for_timeout(sock, 1);
1188 if (sockstate == SOCKET_HAS_TIMED_OUT) {
1189 PyErr_SetString(PySSLErrorObject,
1190 "The write operation timed out");
1191 return NULL;
1192 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
1193 PyErr_SetString(PySSLErrorObject,
1194 "Underlying socket has been closed.");
1195 return NULL;
1196 } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
1197 PyErr_SetString(PySSLErrorObject,
1198 "Underlying socket too large for select().");
1199 return NULL;
1200 }
1201 do {
1202 err = 0;
1203 PySSL_BEGIN_ALLOW_THREADS
1204 len = SSL_write(self->ssl, data, count);
1205 err = SSL_get_error(self->ssl, len);
1206 PySSL_END_ALLOW_THREADS
1207 if(PyErr_CheckSignals()) {
1208 return NULL;
Bill Janssen54cc54c2007-12-14 22:08:56 +00001209 }
Antoine Pitrou30dc1a72010-05-05 16:01:14 +00001210 if (err == SSL_ERROR_WANT_READ) {
Antoine Pitroua29b1812010-05-12 14:08:45 +00001211 sockstate = check_socket_and_wait_for_timeout(sock, 0);
Antoine Pitrou30dc1a72010-05-05 16:01:14 +00001212 } else if (err == SSL_ERROR_WANT_WRITE) {
Antoine Pitroua29b1812010-05-12 14:08:45 +00001213 sockstate = check_socket_and_wait_for_timeout(sock, 1);
Antoine Pitrou30dc1a72010-05-05 16:01:14 +00001214 } else {
1215 sockstate = SOCKET_OPERATION_OK;
1216 }
1217 if (sockstate == SOCKET_HAS_TIMED_OUT) {
1218 PyErr_SetString(PySSLErrorObject,
1219 "The write operation timed out");
1220 return NULL;
1221 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
1222 PyErr_SetString(PySSLErrorObject,
1223 "Underlying socket has been closed.");
1224 return NULL;
1225 } else if (sockstate == SOCKET_IS_NONBLOCKING) {
1226 break;
1227 }
1228 } while (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE);
1229 if (len > 0)
1230 return PyLong_FromLong(len);
1231 else
1232 return PySSL_SetError(self, len, __FILE__, __LINE__);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001233}
1234
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001235PyDoc_STRVAR(PySSL_SSLwrite_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001236"write(s) -> len\n\
1237\n\
1238Writes the string s into the SSL object. Returns the number\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001239of bytes written.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001240
Bill Janssen6e027db2007-11-15 22:23:56 +00001241static PyObject *PySSL_SSLpending(PySSLObject *self)
1242{
Antoine Pitrou30dc1a72010-05-05 16:01:14 +00001243 int count = 0;
Bill Janssen6e027db2007-11-15 22:23:56 +00001244
Antoine Pitrou30dc1a72010-05-05 16:01:14 +00001245 PySSL_BEGIN_ALLOW_THREADS
1246 count = SSL_pending(self->ssl);
1247 PySSL_END_ALLOW_THREADS
1248 if (count < 0)
1249 return PySSL_SetError(self, count, __FILE__, __LINE__);
1250 else
1251 return PyLong_FromLong(count);
Bill Janssen6e027db2007-11-15 22:23:56 +00001252}
1253
1254PyDoc_STRVAR(PySSL_SSLpending_doc,
1255"pending() -> count\n\
1256\n\
1257Returns the number of already decrypted bytes available for read,\n\
1258pending on the connection.\n");
1259
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001260static PyObject *PySSL_SSLread(PySSLObject *self, PyObject *args)
1261{
Antoine Pitrou30dc1a72010-05-05 16:01:14 +00001262 PyObject *dest = NULL;
1263 Py_buffer buf;
1264 int buf_passed = 0;
1265 int count = -1;
1266 char *mem;
1267 /* XXX this should use Py_ssize_t */
1268 int len = 1024;
1269 int sockstate;
1270 int err;
1271 int nonblocking;
1272 PySocketSockObject *sock
1273 = (PySocketSockObject *) PyWeakref_GetObject(self->Socket);
Bill Janssen54cc54c2007-12-14 22:08:56 +00001274
Antoine Pitrou30dc1a72010-05-05 16:01:14 +00001275 if (((PyObject*)sock) == Py_None) {
1276 _setSSLError("Underlying socket connection gone",
1277 PY_SSL_ERROR_NO_SOCKET, __FILE__, __LINE__);
1278 return NULL;
1279 }
1280
1281 if (!PyArg_ParseTuple(args, "|Oi:read", &dest, &count))
1282 return NULL;
1283 if ((dest == NULL) || (dest == Py_None)) {
1284 if (!(dest = PyByteArray_FromStringAndSize((char *) 0, len)))
1285 return NULL;
1286 mem = PyByteArray_AS_STRING(dest);
1287 } else if (PyLong_Check(dest)) {
1288 len = PyLong_AS_LONG(dest);
1289 if (!(dest = PyByteArray_FromStringAndSize((char *) 0, len)))
1290 return NULL;
1291 mem = PyByteArray_AS_STRING(dest);
1292 } else {
1293 if (PyObject_GetBuffer(dest, &buf, PyBUF_CONTIG) < 0)
1294 return NULL;
1295 mem = buf.buf;
1296 len = buf.len;
1297 if ((count > 0) && (count <= len))
1298 len = count;
1299 buf_passed = 1;
1300 }
1301
1302 /* just in case the blocking state of the socket has been changed */
1303 nonblocking = (sock->sock_timeout >= 0.0);
1304 BIO_set_nbio(SSL_get_rbio(self->ssl), nonblocking);
1305 BIO_set_nbio(SSL_get_wbio(self->ssl), nonblocking);
1306
1307 /* first check if there are bytes ready to be read */
1308 PySSL_BEGIN_ALLOW_THREADS
1309 count = SSL_pending(self->ssl);
1310 PySSL_END_ALLOW_THREADS
1311
1312 if (!count) {
1313 sockstate = check_socket_and_wait_for_timeout(sock, 0);
1314 if (sockstate == SOCKET_HAS_TIMED_OUT) {
1315 PyErr_SetString(PySSLErrorObject,
1316 "The read operation timed out");
1317 goto error;
1318 } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
1319 PyErr_SetString(PySSLErrorObject,
Antoine Pitroua29b1812010-05-12 14:08:45 +00001320 "Underlying socket too large for select().");
Antoine Pitrou30dc1a72010-05-05 16:01:14 +00001321 goto error;
1322 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
1323 count = 0;
1324 goto done;
Bill Janssen54cc54c2007-12-14 22:08:56 +00001325 }
Antoine Pitrou30dc1a72010-05-05 16:01:14 +00001326 }
1327 do {
1328 err = 0;
1329 PySSL_BEGIN_ALLOW_THREADS
1330 count = SSL_read(self->ssl, mem, len);
1331 err = SSL_get_error(self->ssl, count);
1332 PySSL_END_ALLOW_THREADS
1333 if (PyErr_CheckSignals())
1334 goto error;
1335 if (err == SSL_ERROR_WANT_READ) {
Antoine Pitroua29b1812010-05-12 14:08:45 +00001336 sockstate = check_socket_and_wait_for_timeout(sock, 0);
Antoine Pitrou30dc1a72010-05-05 16:01:14 +00001337 } else if (err == SSL_ERROR_WANT_WRITE) {
Antoine Pitroua29b1812010-05-12 14:08:45 +00001338 sockstate = check_socket_and_wait_for_timeout(sock, 1);
Antoine Pitrou30dc1a72010-05-05 16:01:14 +00001339 } else if ((err == SSL_ERROR_ZERO_RETURN) &&
1340 (SSL_get_shutdown(self->ssl) ==
1341 SSL_RECEIVED_SHUTDOWN))
1342 {
1343 count = 0;
1344 goto done;
1345 } else {
1346 sockstate = SOCKET_OPERATION_OK;
1347 }
1348 if (sockstate == SOCKET_HAS_TIMED_OUT) {
1349 PyErr_SetString(PySSLErrorObject,
1350 "The read operation timed out");
1351 goto error;
1352 } else if (sockstate == SOCKET_IS_NONBLOCKING) {
1353 break;
1354 }
1355 } while (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE);
1356 if (count <= 0) {
1357 PySSL_SetError(self, count, __FILE__, __LINE__);
1358 goto error;
1359 }
Guido van Rossumf06628b2007-11-21 20:01:53 +00001360 done:
Antoine Pitrou30dc1a72010-05-05 16:01:14 +00001361 if (!buf_passed) {
1362 PyObject *res = PyBytes_FromStringAndSize(mem, count);
1363 Py_DECREF(dest);
1364 return res;
1365 } else {
1366 PyBuffer_Release(&buf);
1367 return PyLong_FromLong(count);
1368 }
Benjamin Peterson56420b42009-02-28 19:06:54 +00001369 error:
Antoine Pitrou30dc1a72010-05-05 16:01:14 +00001370 if (!buf_passed) {
1371 Py_DECREF(dest);
1372 } else {
1373 PyBuffer_Release(&buf);
1374 }
1375 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001376}
1377
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001378PyDoc_STRVAR(PySSL_SSLread_doc,
Bill Janssen6e027db2007-11-15 22:23:56 +00001379"read([len]) -> string\n\
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001380\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001381Read up to len bytes from the SSL socket.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001382
Bill Janssen40a0f662008-08-12 16:56:25 +00001383static PyObject *PySSL_SSLshutdown(PySSLObject *self)
1384{
Antoine Pitrou30dc1a72010-05-05 16:01:14 +00001385 int err, ssl_err, sockstate, nonblocking;
1386 int zeros = 0;
1387 PySocketSockObject *sock
1388 = (PySocketSockObject *) PyWeakref_GetObject(self->Socket);
Bill Janssen40a0f662008-08-12 16:56:25 +00001389
Antoine Pitrou30dc1a72010-05-05 16:01:14 +00001390 /* Guard against closed socket */
1391 if ((((PyObject*)sock) == Py_None) || (sock->sock_fd < 0)) {
1392 _setSSLError("Underlying socket connection gone",
1393 PY_SSL_ERROR_NO_SOCKET, __FILE__, __LINE__);
1394 return NULL;
1395 }
1396
1397 /* Just in case the blocking state of the socket has been changed */
1398 nonblocking = (sock->sock_timeout >= 0.0);
1399 BIO_set_nbio(SSL_get_rbio(self->ssl), nonblocking);
1400 BIO_set_nbio(SSL_get_wbio(self->ssl), nonblocking);
1401
1402 while (1) {
1403 PySSL_BEGIN_ALLOW_THREADS
1404 /* Disable read-ahead so that unwrap can work correctly.
1405 * Otherwise OpenSSL might read in too much data,
1406 * eating clear text data that happens to be
1407 * transmitted after the SSL shutdown.
1408 * Should be safe to call repeatedly everytime this
1409 * function is used and the shutdown_seen_zero != 0
1410 * condition is met.
1411 */
1412 if (self->shutdown_seen_zero)
1413 SSL_set_read_ahead(self->ssl, 0);
1414 err = SSL_shutdown(self->ssl);
1415 PySSL_END_ALLOW_THREADS
1416 /* If err == 1, a secure shutdown with SSL_shutdown() is complete */
1417 if (err > 0)
1418 break;
1419 if (err == 0) {
1420 /* Don't loop endlessly; instead preserve legacy
1421 behaviour of trying SSL_shutdown() only twice.
1422 This looks necessary for OpenSSL < 0.9.8m */
1423 if (++zeros > 1)
1424 break;
1425 /* Shutdown was sent, now try receiving */
1426 self->shutdown_seen_zero = 1;
1427 continue;
Bill Janssen40a0f662008-08-12 16:56:25 +00001428 }
1429
Antoine Pitrou30dc1a72010-05-05 16:01:14 +00001430 /* Possibly retry shutdown until timeout or failure */
1431 ssl_err = SSL_get_error(self->ssl, err);
1432 if (ssl_err == SSL_ERROR_WANT_READ)
1433 sockstate = check_socket_and_wait_for_timeout(sock, 0);
1434 else if (ssl_err == SSL_ERROR_WANT_WRITE)
1435 sockstate = check_socket_and_wait_for_timeout(sock, 1);
1436 else
1437 break;
1438 if (sockstate == SOCKET_HAS_TIMED_OUT) {
1439 if (ssl_err == SSL_ERROR_WANT_READ)
1440 PyErr_SetString(PySSLErrorObject,
1441 "The read operation timed out");
1442 else
1443 PyErr_SetString(PySSLErrorObject,
1444 "The write operation timed out");
1445 return NULL;
1446 }
1447 else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
1448 PyErr_SetString(PySSLErrorObject,
1449 "Underlying socket too large for select().");
1450 return NULL;
1451 }
1452 else if (sockstate != SOCKET_OPERATION_OK)
1453 /* Retain the SSL error code */
1454 break;
1455 }
Antoine Pitrou5a1c4d12010-04-23 21:11:10 +00001456
Antoine Pitrou30dc1a72010-05-05 16:01:14 +00001457 if (err < 0)
1458 return PySSL_SetError(self, err, __FILE__, __LINE__);
1459 else {
1460 Py_INCREF(sock);
1461 return (PyObject *) sock;
1462 }
Bill Janssen40a0f662008-08-12 16:56:25 +00001463}
1464
1465PyDoc_STRVAR(PySSL_SSLshutdown_doc,
1466"shutdown(s) -> socket\n\
1467\n\
1468Does the SSL shutdown handshake with the remote end, and returns\n\
1469the underlying socket object.");
1470
1471
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001472static PyMethodDef PySSLMethods[] = {
Antoine Pitrou30dc1a72010-05-05 16:01:14 +00001473 {"do_handshake", (PyCFunction)PySSL_SSLdo_handshake, METH_NOARGS},
1474 {"write", (PyCFunction)PySSL_SSLwrite, METH_VARARGS,
1475 PySSL_SSLwrite_doc},
1476 {"read", (PyCFunction)PySSL_SSLread, METH_VARARGS,
1477 PySSL_SSLread_doc},
1478 {"pending", (PyCFunction)PySSL_SSLpending, METH_NOARGS,
1479 PySSL_SSLpending_doc},
1480 {"peer_certificate", (PyCFunction)PySSL_peercert, METH_VARARGS,
1481 PySSL_peercert_doc},
1482 {"cipher", (PyCFunction)PySSL_cipher, METH_NOARGS},
1483 {"shutdown", (PyCFunction)PySSL_SSLshutdown, METH_NOARGS,
1484 PySSL_SSLshutdown_doc},
1485 {NULL, NULL}
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001486};
1487
Jeremy Hylton938ace62002-07-17 16:30:39 +00001488static PyTypeObject PySSL_Type = {
Antoine Pitrou30dc1a72010-05-05 16:01:14 +00001489 PyVarObject_HEAD_INIT(NULL, 0)
1490 "ssl.SSLContext", /*tp_name*/
1491 sizeof(PySSLObject), /*tp_basicsize*/
1492 0, /*tp_itemsize*/
1493 /* methods */
1494 (destructor)PySSL_dealloc, /*tp_dealloc*/
1495 0, /*tp_print*/
1496 0, /*tp_getattr*/
1497 0, /*tp_setattr*/
1498 0, /*tp_reserved*/
1499 0, /*tp_repr*/
1500 0, /*tp_as_number*/
1501 0, /*tp_as_sequence*/
1502 0, /*tp_as_mapping*/
1503 0, /*tp_hash*/
1504 0, /*tp_call*/
1505 0, /*tp_str*/
1506 0, /*tp_getattro*/
1507 0, /*tp_setattro*/
1508 0, /*tp_as_buffer*/
1509 Py_TPFLAGS_DEFAULT, /*tp_flags*/
1510 0, /*tp_doc*/
1511 0, /*tp_traverse*/
1512 0, /*tp_clear*/
1513 0, /*tp_richcompare*/
1514 0, /*tp_weaklistoffset*/
1515 0, /*tp_iter*/
1516 0, /*tp_iternext*/
1517 PySSLMethods, /*tp_methods*/
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001518};
1519
1520#ifdef HAVE_OPENSSL_RAND
1521
1522/* helper routines for seeding the SSL PRNG */
1523static PyObject *
1524PySSL_RAND_add(PyObject *self, PyObject *args)
1525{
1526 char *buf;
1527 int len;
1528 double entropy;
1529
1530 if (!PyArg_ParseTuple(args, "s#d:RAND_add", &buf, &len, &entropy))
Antoine Pitroua29b1812010-05-12 14:08:45 +00001531 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001532 RAND_add(buf, len, entropy);
1533 Py_INCREF(Py_None);
1534 return Py_None;
1535}
1536
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001537PyDoc_STRVAR(PySSL_RAND_add_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001538"RAND_add(string, entropy)\n\
1539\n\
1540Mix string into the OpenSSL PRNG state. entropy (a float) is a lower\n\
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001541bound on the entropy contained in string. See RFC 1750.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001542
1543static PyObject *
1544PySSL_RAND_status(PyObject *self)
1545{
Christian Heimes217cfd12007-12-02 14:31:20 +00001546 return PyLong_FromLong(RAND_status());
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001547}
1548
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001549PyDoc_STRVAR(PySSL_RAND_status_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001550"RAND_status() -> 0 or 1\n\
1551\n\
Bill Janssen6e027db2007-11-15 22:23:56 +00001552Returns 1 if the OpenSSL PRNG has been seeded with enough data and 0 if not.\n\
1553It is necessary to seed the PRNG with RAND_add() on some platforms before\n\
1554using the ssl() function.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001555
1556static PyObject *
1557PySSL_RAND_egd(PyObject *self, PyObject *arg)
1558{
1559 int bytes;
1560
Bill Janssen6e027db2007-11-15 22:23:56 +00001561 if (!PyUnicode_Check(arg))
Antoine Pitroua29b1812010-05-12 14:08:45 +00001562 return PyErr_Format(PyExc_TypeError,
1563 "RAND_egd() expected string, found %s",
1564 Py_TYPE(arg)->tp_name);
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00001565 bytes = RAND_egd(_PyUnicode_AsString(arg));
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001566 if (bytes == -1) {
Antoine Pitroua29b1812010-05-12 14:08:45 +00001567 PyErr_SetString(PySSLErrorObject,
1568 "EGD connection failed or EGD did not return "
1569 "enough data to seed the PRNG");
1570 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001571 }
Christian Heimes217cfd12007-12-02 14:31:20 +00001572 return PyLong_FromLong(bytes);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001573}
1574
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001575PyDoc_STRVAR(PySSL_RAND_egd_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001576"RAND_egd(path) -> bytes\n\
1577\n\
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001578Queries the entropy gather daemon (EGD) on the socket named by 'path'.\n\
1579Returns number of bytes read. Raises SSLError if connection to EGD\n\
1580fails or if it does provide enough data to seed PRNG.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001581
1582#endif
1583
Bill Janssen40a0f662008-08-12 16:56:25 +00001584
1585
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001586/* List of functions exported by this module. */
1587
1588static PyMethodDef PySSL_methods[] = {
Antoine Pitrou30dc1a72010-05-05 16:01:14 +00001589 {"sslwrap", PySSL_sslwrap,
1590 METH_VARARGS, ssl_doc},
1591 {"_test_decode_cert", PySSL_test_decode_certificate,
1592 METH_VARARGS},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001593#ifdef HAVE_OPENSSL_RAND
Antoine Pitrou30dc1a72010-05-05 16:01:14 +00001594 {"RAND_add", PySSL_RAND_add, METH_VARARGS,
1595 PySSL_RAND_add_doc},
1596 {"RAND_egd", PySSL_RAND_egd, METH_O,
1597 PySSL_RAND_egd_doc},
1598 {"RAND_status", (PyCFunction)PySSL_RAND_status, METH_NOARGS,
1599 PySSL_RAND_status_doc},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001600#endif
Antoine Pitrou30dc1a72010-05-05 16:01:14 +00001601 {NULL, NULL} /* Sentinel */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001602};
1603
1604
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001605#ifdef WITH_THREAD
1606
1607/* an implementation of OpenSSL threading operations in terms
1608 of the Python C thread library */
1609
1610static PyThread_type_lock *_ssl_locks = NULL;
1611
1612static unsigned long _ssl_thread_id_function (void) {
Antoine Pitrou30dc1a72010-05-05 16:01:14 +00001613 return PyThread_get_thread_ident();
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001614}
1615
Bill Janssen6e027db2007-11-15 22:23:56 +00001616static void _ssl_thread_locking_function
Antoine Pitrou30dc1a72010-05-05 16:01:14 +00001617 (int mode, int n, const char *file, int line) {
1618 /* this function is needed to perform locking on shared data
1619 structures. (Note that OpenSSL uses a number of global data
1620 structures that will be implicitly shared whenever multiple
1621 threads use OpenSSL.) Multi-threaded applications will
1622 crash at random if it is not set.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001623
Antoine Pitrou30dc1a72010-05-05 16:01:14 +00001624 locking_function() must be able to handle up to
1625 CRYPTO_num_locks() different mutex locks. It sets the n-th
1626 lock if mode & CRYPTO_LOCK, and releases it otherwise.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001627
Antoine Pitrou30dc1a72010-05-05 16:01:14 +00001628 file and line are the file number of the function setting the
1629 lock. They can be useful for debugging.
1630 */
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001631
Antoine Pitrou30dc1a72010-05-05 16:01:14 +00001632 if ((_ssl_locks == NULL) ||
1633 (n < 0) || ((unsigned)n >= _ssl_locks_count))
1634 return;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001635
Antoine Pitrou30dc1a72010-05-05 16:01:14 +00001636 if (mode & CRYPTO_LOCK) {
1637 PyThread_acquire_lock(_ssl_locks[n], 1);
1638 } else {
1639 PyThread_release_lock(_ssl_locks[n]);
1640 }
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001641}
1642
1643static int _setup_ssl_threads(void) {
1644
Antoine Pitrou30dc1a72010-05-05 16:01:14 +00001645 unsigned int i;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001646
Antoine Pitrou30dc1a72010-05-05 16:01:14 +00001647 if (_ssl_locks == NULL) {
1648 _ssl_locks_count = CRYPTO_num_locks();
1649 _ssl_locks = (PyThread_type_lock *)
1650 malloc(sizeof(PyThread_type_lock) * _ssl_locks_count);
1651 if (_ssl_locks == NULL)
1652 return 0;
1653 memset(_ssl_locks, 0,
1654 sizeof(PyThread_type_lock) * _ssl_locks_count);
1655 for (i = 0; i < _ssl_locks_count; i++) {
1656 _ssl_locks[i] = PyThread_allocate_lock();
1657 if (_ssl_locks[i] == NULL) {
1658 unsigned int j;
1659 for (j = 0; j < i; j++) {
1660 PyThread_free_lock(_ssl_locks[j]);
1661 }
1662 free(_ssl_locks);
1663 return 0;
1664 }
1665 }
1666 CRYPTO_set_locking_callback(_ssl_thread_locking_function);
1667 CRYPTO_set_id_callback(_ssl_thread_id_function);
1668 }
1669 return 1;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001670}
1671
Antoine Pitrou30dc1a72010-05-05 16:01:14 +00001672#endif /* def HAVE_THREAD */
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001673
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001674PyDoc_STRVAR(module_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001675"Implementation module for SSL socket operations. See the socket module\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001676for documentation.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001677
Martin v. Löwis1a214512008-06-11 05:26:20 +00001678
1679static struct PyModuleDef _sslmodule = {
Antoine Pitrou30dc1a72010-05-05 16:01:14 +00001680 PyModuleDef_HEAD_INIT,
1681 "_ssl",
1682 module_doc,
1683 -1,
1684 PySSL_methods,
1685 NULL,
1686 NULL,
1687 NULL,
1688 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00001689};
1690
Mark Hammondfe51c6d2002-08-02 02:27:13 +00001691PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00001692PyInit__ssl(void)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001693{
Antoine Pitrou30dc1a72010-05-05 16:01:14 +00001694 PyObject *m, *d;
1695 PySocketModule_APIObject *socket_api;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001696
Antoine Pitrou30dc1a72010-05-05 16:01:14 +00001697 if (PyType_Ready(&PySSL_Type) < 0)
1698 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001699
Antoine Pitrou30dc1a72010-05-05 16:01:14 +00001700 m = PyModule_Create(&_sslmodule);
1701 if (m == NULL)
1702 return NULL;
1703 d = PyModule_GetDict(m);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001704
Antoine Pitrou30dc1a72010-05-05 16:01:14 +00001705 /* Load _socket module and its C API */
1706 socket_api = PySocketModule_ImportModuleAndAPI();
1707 if (!socket_api)
1708 return NULL;
1709 PySocketModule = *socket_api;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001710
Antoine Pitrou30dc1a72010-05-05 16:01:14 +00001711 /* Init OpenSSL */
1712 SSL_load_error_strings();
1713 SSL_library_init();
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001714#ifdef WITH_THREAD
Antoine Pitrou30dc1a72010-05-05 16:01:14 +00001715 /* note that this will start threading if not already started */
1716 if (!_setup_ssl_threads()) {
1717 return NULL;
1718 }
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001719#endif
Antoine Pitrou30dc1a72010-05-05 16:01:14 +00001720 OpenSSL_add_all_algorithms();
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001721
Antoine Pitrou30dc1a72010-05-05 16:01:14 +00001722 /* Add symbols to module dict */
1723 PySSLErrorObject = PyErr_NewException("ssl.SSLError",
1724 PySocketModule.error,
1725 NULL);
1726 if (PySSLErrorObject == NULL)
1727 return NULL;
1728 if (PyDict_SetItemString(d, "SSLError", PySSLErrorObject) != 0)
1729 return NULL;
1730 if (PyDict_SetItemString(d, "SSLType",
1731 (PyObject *)&PySSL_Type) != 0)
1732 return NULL;
1733 PyModule_AddIntConstant(m, "SSL_ERROR_ZERO_RETURN",
1734 PY_SSL_ERROR_ZERO_RETURN);
1735 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_READ",
1736 PY_SSL_ERROR_WANT_READ);
1737 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_WRITE",
1738 PY_SSL_ERROR_WANT_WRITE);
1739 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_X509_LOOKUP",
1740 PY_SSL_ERROR_WANT_X509_LOOKUP);
1741 PyModule_AddIntConstant(m, "SSL_ERROR_SYSCALL",
1742 PY_SSL_ERROR_SYSCALL);
1743 PyModule_AddIntConstant(m, "SSL_ERROR_SSL",
1744 PY_SSL_ERROR_SSL);
1745 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_CONNECT",
1746 PY_SSL_ERROR_WANT_CONNECT);
1747 /* non ssl.h errorcodes */
1748 PyModule_AddIntConstant(m, "SSL_ERROR_EOF",
1749 PY_SSL_ERROR_EOF);
1750 PyModule_AddIntConstant(m, "SSL_ERROR_INVALID_ERROR_CODE",
1751 PY_SSL_ERROR_INVALID_ERROR_CODE);
1752 /* cert requirements */
1753 PyModule_AddIntConstant(m, "CERT_NONE",
1754 PY_SSL_CERT_NONE);
1755 PyModule_AddIntConstant(m, "CERT_OPTIONAL",
1756 PY_SSL_CERT_OPTIONAL);
1757 PyModule_AddIntConstant(m, "CERT_REQUIRED",
1758 PY_SSL_CERT_REQUIRED);
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001759
Antoine Pitrou30dc1a72010-05-05 16:01:14 +00001760 /* protocol versions */
1761 PyModule_AddIntConstant(m, "PROTOCOL_SSLv2",
1762 PY_SSL_VERSION_SSL2);
1763 PyModule_AddIntConstant(m, "PROTOCOL_SSLv3",
1764 PY_SSL_VERSION_SSL3);
1765 PyModule_AddIntConstant(m, "PROTOCOL_SSLv23",
1766 PY_SSL_VERSION_SSL23);
1767 PyModule_AddIntConstant(m, "PROTOCOL_TLSv1",
1768 PY_SSL_VERSION_TLS1);
1769 return m;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001770}