blob: dfe2fb06f5d367fdba3f22a47674e39f8d4a5848 [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?
12
Bill Janssen6e027db2007-11-15 22:23:56 +000013 XXX what about SSL_MODE_AUTO_RETRY?
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000014*/
15
16#include "Python.h"
Thomas Woutersed03b412007-08-28 21:37:11 +000017
Thomas Wouters1b7f8912007-09-19 03:06:30 +000018#ifdef WITH_THREAD
19#include "pythread.h"
20#define PySSL_BEGIN_ALLOW_THREADS { \
Bill Janssen6e027db2007-11-15 22:23:56 +000021 PyThreadState *_save = NULL; \
Thomas Wouters1b7f8912007-09-19 03:06:30 +000022 if (_ssl_locks_count>0) {_save = PyEval_SaveThread();}
23#define PySSL_BLOCK_THREADS if (_ssl_locks_count>0){PyEval_RestoreThread(_save)};
24#define PySSL_UNBLOCK_THREADS if (_ssl_locks_count>0){_save = PyEval_SaveThread()};
25#define PySSL_END_ALLOW_THREADS if (_ssl_locks_count>0){PyEval_RestoreThread(_save);} \
26 }
27
28#else /* no WITH_THREAD */
29
30#define PySSL_BEGIN_ALLOW_THREADS
31#define PySSL_BLOCK_THREADS
32#define PySSL_UNBLOCK_THREADS
33#define PySSL_END_ALLOW_THREADS
34
35#endif
36
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +000037enum py_ssl_error {
38 /* these mirror ssl.h */
Thomas Woutersed03b412007-08-28 21:37:11 +000039 PY_SSL_ERROR_NONE,
40 PY_SSL_ERROR_SSL,
41 PY_SSL_ERROR_WANT_READ,
42 PY_SSL_ERROR_WANT_WRITE,
43 PY_SSL_ERROR_WANT_X509_LOOKUP,
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +000044 PY_SSL_ERROR_SYSCALL, /* look at error stack/return value/errno */
Thomas Woutersed03b412007-08-28 21:37:11 +000045 PY_SSL_ERROR_ZERO_RETURN,
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +000046 PY_SSL_ERROR_WANT_CONNECT,
Thomas Woutersed03b412007-08-28 21:37:11 +000047 /* start of non ssl.h errorcodes */
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +000048 PY_SSL_ERROR_EOF, /* special case of SSL_ERROR_SYSCALL */
Bill Janssen54cc54c2007-12-14 22:08:56 +000049 PY_SSL_ERROR_NO_SOCKET, /* socket has been GC'd */
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +000050 PY_SSL_ERROR_INVALID_ERROR_CODE
51};
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000052
Thomas Woutersed03b412007-08-28 21:37:11 +000053enum py_ssl_server_or_client {
54 PY_SSL_CLIENT,
55 PY_SSL_SERVER
56};
57
58enum py_ssl_cert_requirements {
59 PY_SSL_CERT_NONE,
60 PY_SSL_CERT_OPTIONAL,
61 PY_SSL_CERT_REQUIRED
62};
63
64enum py_ssl_version {
65 PY_SSL_VERSION_SSL2,
66 PY_SSL_VERSION_SSL3,
67 PY_SSL_VERSION_SSL23,
68 PY_SSL_VERSION_TLS1,
69};
70
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000071/* Include symbols from _socket module */
72#include "socketmodule.h"
73
Benjamin Petersonb173f782009-05-05 22:31:58 +000074static PySocketModule_APIObject PySocketModule;
75
Thomas Woutersed03b412007-08-28 21:37:11 +000076#if defined(HAVE_POLL_H)
Thomas Wouters0e3f5912006-08-11 14:57:12 +000077#include <poll.h>
78#elif defined(HAVE_SYS_POLL_H)
79#include <sys/poll.h>
80#endif
81
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000082/* Include OpenSSL header files */
83#include "openssl/rsa.h"
84#include "openssl/crypto.h"
85#include "openssl/x509.h"
Thomas Wouters1b7f8912007-09-19 03:06:30 +000086#include "openssl/x509v3.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000087#include "openssl/pem.h"
88#include "openssl/ssl.h"
89#include "openssl/err.h"
90#include "openssl/rand.h"
91
92/* SSL error object */
93static PyObject *PySSLErrorObject;
94
Thomas Wouters1b7f8912007-09-19 03:06:30 +000095#ifdef WITH_THREAD
96
97/* serves as a flag to see whether we've initialized the SSL thread support. */
98/* 0 means no, greater than 0 means yes */
99
100static unsigned int _ssl_locks_count = 0;
101
102#endif /* def WITH_THREAD */
103
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000104/* SSL socket object */
105
106#define X509_NAME_MAXLEN 256
107
108/* RAND_* APIs got added to OpenSSL in 0.9.5 */
109#if OPENSSL_VERSION_NUMBER >= 0x0090500fL
110# define HAVE_OPENSSL_RAND 1
111#else
112# undef HAVE_OPENSSL_RAND
113#endif
114
115typedef struct {
116 PyObject_HEAD
Bill Janssen54cc54c2007-12-14 22:08:56 +0000117 PyObject *Socket; /* weakref to socket on which we're layered */
Thomas Woutersed03b412007-08-28 21:37:11 +0000118 SSL_CTX* ctx;
119 SSL* ssl;
120 X509* peer_cert;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000121
122} PySSLObject;
123
Jeremy Hylton938ace62002-07-17 16:30:39 +0000124static PyTypeObject PySSL_Type;
125static PyObject *PySSL_SSLwrite(PySSLObject *self, PyObject *args);
126static PyObject *PySSL_SSLread(PySSLObject *self, PyObject *args);
Thomas Woutersed03b412007-08-28 21:37:11 +0000127static int check_socket_and_wait_for_timeout(PySocketSockObject *s,
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +0000128 int writing);
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000129static PyObject *PySSL_peercert(PySSLObject *self, PyObject *args);
130static PyObject *PySSL_cipher(PySSLObject *self);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000131
Christian Heimes90aa7642007-12-19 02:45:37 +0000132#define PySSLObject_Check(v) (Py_TYPE(v) == &PySSL_Type)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000133
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +0000134typedef enum {
135 SOCKET_IS_NONBLOCKING,
136 SOCKET_IS_BLOCKING,
137 SOCKET_HAS_TIMED_OUT,
138 SOCKET_HAS_BEEN_CLOSED,
Neal Norwitz389cea82006-02-13 00:35:21 +0000139 SOCKET_TOO_LARGE_FOR_SELECT,
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +0000140 SOCKET_OPERATION_OK
141} timeout_state;
142
Thomas Woutersed03b412007-08-28 21:37:11 +0000143/* Wrap error strings with filename and line # */
144#define STRINGIFY1(x) #x
145#define STRINGIFY2(x) STRINGIFY1(x)
146#define ERRSTR1(x,y,z) (x ":" y ": " z)
147#define ERRSTR(x) ERRSTR1("_ssl.c", STRINGIFY2(__LINE__), x)
148
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000149/* XXX It might be helpful to augment the error message generated
150 below with the name of the SSL function that generated the error.
151 I expect it's obvious most of the time.
152*/
153
154static PyObject *
Thomas Woutersed03b412007-08-28 21:37:11 +0000155PySSL_SetError(PySSLObject *obj, int ret, char *filename, int lineno)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000156{
Thomas Woutersed03b412007-08-28 21:37:11 +0000157 PyObject *v;
158 char buf[2048];
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000159 char *errstr;
160 int err;
Thomas Woutersed03b412007-08-28 21:37:11 +0000161 enum py_ssl_error p = PY_SSL_ERROR_NONE;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000162
163 assert(ret <= 0);
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +0000164
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000165 if (obj->ssl != NULL) {
Thomas Woutersed03b412007-08-28 21:37:11 +0000166 err = SSL_get_error(obj->ssl, ret);
167
168 switch (err) {
169 case SSL_ERROR_ZERO_RETURN:
170 errstr = "TLS/SSL connection has been closed";
171 p = PY_SSL_ERROR_ZERO_RETURN;
172 break;
173 case SSL_ERROR_WANT_READ:
174 errstr = "The operation did not complete (read)";
175 p = PY_SSL_ERROR_WANT_READ;
176 break;
177 case SSL_ERROR_WANT_WRITE:
178 p = PY_SSL_ERROR_WANT_WRITE;
179 errstr = "The operation did not complete (write)";
180 break;
181 case SSL_ERROR_WANT_X509_LOOKUP:
182 p = PY_SSL_ERROR_WANT_X509_LOOKUP;
183 errstr =
184 "The operation did not complete (X509 lookup)";
185 break;
186 case SSL_ERROR_WANT_CONNECT:
187 p = PY_SSL_ERROR_WANT_CONNECT;
188 errstr = "The operation did not complete (connect)";
189 break;
190 case SSL_ERROR_SYSCALL:
191 {
192 unsigned long e = ERR_get_error();
193 if (e == 0) {
Bill Janssen54cc54c2007-12-14 22:08:56 +0000194 PySocketSockObject *s
195 = (PySocketSockObject *) PyWeakref_GetObject(obj->Socket);
196 if (ret == 0 || (((PyObject *)s) == Py_None)) {
Thomas Woutersed03b412007-08-28 21:37:11 +0000197 p = PY_SSL_ERROR_EOF;
198 errstr =
199 "EOF occurred in violation of protocol";
200 } else if (ret == -1) {
201 /* underlying BIO reported an I/O error */
Bill Janssen54cc54c2007-12-14 22:08:56 +0000202 return s->errorhandler();
Thomas Woutersed03b412007-08-28 21:37:11 +0000203 } else { /* possible? */
204 p = PY_SSL_ERROR_SYSCALL;
205 errstr = "Some I/O error occurred";
206 }
207 } else {
Jeremy Hylton4e547302002-07-02 18:25:00 +0000208 p = PY_SSL_ERROR_SYSCALL;
Thomas Woutersed03b412007-08-28 21:37:11 +0000209 /* XXX Protected by global interpreter lock */
210 errstr = ERR_error_string(e, NULL);
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +0000211 }
Thomas Woutersed03b412007-08-28 21:37:11 +0000212 break;
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +0000213 }
Thomas Woutersed03b412007-08-28 21:37:11 +0000214 case SSL_ERROR_SSL:
215 {
216 unsigned long e = ERR_get_error();
217 p = PY_SSL_ERROR_SSL;
218 if (e != 0)
219 /* XXX Protected by global interpreter lock */
220 errstr = ERR_error_string(e, NULL);
221 else { /* possible? */
222 errstr =
223 "A failure in the SSL library occurred";
224 }
225 break;
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +0000226 }
Thomas Woutersed03b412007-08-28 21:37:11 +0000227 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);
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +0000233 }
Thomas Woutersed03b412007-08-28 21:37:11 +0000234 PyOS_snprintf(buf, sizeof(buf), "_ssl.c:%d: %s", lineno, errstr);
235 v = Py_BuildValue("(is)", p, buf);
236 if (v != NULL) {
237 PyErr_SetObject(PySSLErrorObject, v);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000238 Py_DECREF(v);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000239 }
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000240 return NULL;
241}
242
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000243static PyObject *
244_setSSLError (char *errstr, int errcode, char *filename, int lineno) {
245
246 char buf[2048];
247 PyObject *v;
248
249 if (errstr == NULL) {
250 errcode = ERR_peek_last_error();
251 errstr = ERR_error_string(errcode, NULL);
252 }
253 PyOS_snprintf(buf, sizeof(buf), "_ssl.c:%d: %s", lineno, errstr);
254 v = Py_BuildValue("(is)", errcode, buf);
255 if (v != NULL) {
256 PyErr_SetObject(PySSLErrorObject, v);
257 Py_DECREF(v);
258 }
259 return NULL;
260}
261
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000262static PySSLObject *
Thomas Woutersed03b412007-08-28 21:37:11 +0000263newPySSLObject(PySocketSockObject *Sock, char *key_file, char *cert_file,
264 enum py_ssl_server_or_client socket_type,
265 enum py_ssl_cert_requirements certreq,
266 enum py_ssl_version proto_version,
267 char *cacerts_file)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000268{
269 PySSLObject *self;
270 char *errstr = NULL;
271 int ret;
Thomas Woutersed03b412007-08-28 21:37:11 +0000272 int verification_mode;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000273
Guido van Rossume6650f92007-12-06 19:05:55 +0000274 self = PyObject_New(PySSLObject, &PySSL_Type); /* Create new object */
Thomas Wouters477c8d52006-05-27 19:21:47 +0000275 if (self == NULL)
276 return NULL;
Thomas Woutersed03b412007-08-28 21:37:11 +0000277 self->peer_cert = NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000278 self->ssl = NULL;
279 self->ctx = NULL;
280 self->Socket = NULL;
281
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000282 /* Make sure the SSL error state is initialized */
283 (void) ERR_get_state();
284 ERR_clear_error();
285
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000286 if ((key_file && !cert_file) || (!key_file && cert_file)) {
Thomas Woutersed03b412007-08-28 21:37:11 +0000287 errstr = ERRSTR("Both the key & certificate files "
288 "must be specified");
289 goto fail;
290 }
291
292 if ((socket_type == PY_SSL_SERVER) &&
293 ((key_file == NULL) || (cert_file == NULL))) {
294 errstr = ERRSTR("Both the key & certificate files "
295 "must be specified for server-side operation");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000296 goto fail;
297 }
298
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000299 PySSL_BEGIN_ALLOW_THREADS
Thomas Woutersed03b412007-08-28 21:37:11 +0000300 if (proto_version == PY_SSL_VERSION_TLS1)
301 self->ctx = SSL_CTX_new(TLSv1_method()); /* Set up context */
302 else if (proto_version == PY_SSL_VERSION_SSL3)
303 self->ctx = SSL_CTX_new(SSLv3_method()); /* Set up context */
304 else if (proto_version == PY_SSL_VERSION_SSL2)
305 self->ctx = SSL_CTX_new(SSLv2_method()); /* Set up context */
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000306 else if (proto_version == PY_SSL_VERSION_SSL23)
Thomas Woutersed03b412007-08-28 21:37:11 +0000307 self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000308 PySSL_END_ALLOW_THREADS
Thomas Woutersed03b412007-08-28 21:37:11 +0000309
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000310 if (self->ctx == NULL) {
Thomas Woutersed03b412007-08-28 21:37:11 +0000311 errstr = ERRSTR("Invalid SSL protocol variant specified.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000312 goto fail;
313 }
314
Thomas Woutersed03b412007-08-28 21:37:11 +0000315 if (certreq != PY_SSL_CERT_NONE) {
316 if (cacerts_file == NULL) {
317 errstr = ERRSTR("No root certificates specified for "
318 "verification of other-side certificates.");
319 goto fail;
320 } else {
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000321 PySSL_BEGIN_ALLOW_THREADS
Thomas Woutersed03b412007-08-28 21:37:11 +0000322 ret = SSL_CTX_load_verify_locations(self->ctx,
323 cacerts_file,
324 NULL);
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000325 PySSL_END_ALLOW_THREADS
Thomas Woutersed03b412007-08-28 21:37:11 +0000326 if (ret != 1) {
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000327 _setSSLError(NULL, 0, __FILE__, __LINE__);
Thomas Woutersed03b412007-08-28 21:37:11 +0000328 goto fail;
329 }
330 }
331 }
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000332 if (key_file) {
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000333 PySSL_BEGIN_ALLOW_THREADS
Martin v. Löwis09c35f72002-07-28 09:57:45 +0000334 ret = SSL_CTX_use_PrivateKey_file(self->ctx, key_file,
Thomas Woutersed03b412007-08-28 21:37:11 +0000335 SSL_FILETYPE_PEM);
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000336 PySSL_END_ALLOW_THREADS
Thomas Woutersed03b412007-08-28 21:37:11 +0000337 if (ret != 1) {
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000338 _setSSLError(NULL, ret, __FILE__, __LINE__);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000339 goto fail;
340 }
341
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000342 PySSL_BEGIN_ALLOW_THREADS
Martin v. Löwis09c35f72002-07-28 09:57:45 +0000343 ret = SSL_CTX_use_certificate_chain_file(self->ctx,
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000344 cert_file);
345 PySSL_END_ALLOW_THREADS
Thomas Woutersed03b412007-08-28 21:37:11 +0000346 if (ret != 1) {
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000347 /*
348 fprintf(stderr, "ret is %d, errcode is %lu, %lu, with file \"%s\"\n",
349 ret, ERR_peek_error(), ERR_peek_last_error(), cert_file);
350 */
351 if (ERR_peek_last_error() != 0) {
352 _setSSLError(NULL, ret, __FILE__, __LINE__);
353 goto fail;
354 }
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000355 }
356 }
357
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000358 /* ssl compatibility */
359 SSL_CTX_set_options(self->ctx, SSL_OP_ALL);
360
Thomas Woutersed03b412007-08-28 21:37:11 +0000361 verification_mode = SSL_VERIFY_NONE;
362 if (certreq == PY_SSL_CERT_OPTIONAL)
363 verification_mode = SSL_VERIFY_PEER;
364 else if (certreq == PY_SSL_CERT_REQUIRED)
365 verification_mode = (SSL_VERIFY_PEER |
366 SSL_VERIFY_FAIL_IF_NO_PEER_CERT);
367 SSL_CTX_set_verify(self->ctx, verification_mode,
368 NULL); /* set verify lvl */
369
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000370 PySSL_BEGIN_ALLOW_THREADS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000371 self->ssl = SSL_new(self->ctx); /* New ssl struct */
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000372 PySSL_END_ALLOW_THREADS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000373 SSL_set_fd(self->ssl, Sock->sock_fd); /* Set the socket for SSL */
Guido van Rossum4f707ac2003-01-31 18:13:18 +0000374
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000375 /* If the socket is in non-blocking mode or timeout mode, set the BIO
Guido van Rossum4f707ac2003-01-31 18:13:18 +0000376 * to non-blocking mode (blocking is the default)
377 */
378 if (Sock->sock_timeout >= 0.0) {
379 /* Set both the read and write BIO's to non-blocking mode */
380 BIO_set_nbio(SSL_get_rbio(self->ssl), 1);
381 BIO_set_nbio(SSL_get_wbio(self->ssl), 1);
382 }
383
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000384 PySSL_BEGIN_ALLOW_THREADS
Thomas Woutersed03b412007-08-28 21:37:11 +0000385 if (socket_type == PY_SSL_CLIENT)
386 SSL_set_connect_state(self->ssl);
387 else
388 SSL_set_accept_state(self->ssl);
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000389 PySSL_END_ALLOW_THREADS
Martin v. Löwis09c35f72002-07-28 09:57:45 +0000390
Bill Janssen54cc54c2007-12-14 22:08:56 +0000391 self->Socket = PyWeakref_NewRef((PyObject *) Sock, Py_None);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000392 return self;
393 fail:
394 if (errstr)
395 PyErr_SetString(PySSLErrorObject, errstr);
396 Py_DECREF(self);
397 return NULL;
398}
399
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000400static PyObject *
Thomas Woutersed03b412007-08-28 21:37:11 +0000401PySSL_sslwrap(PyObject *self, PyObject *args)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000402{
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000403 PySocketSockObject *Sock;
Thomas Woutersed03b412007-08-28 21:37:11 +0000404 int server_side = 0;
405 int verification_mode = PY_SSL_CERT_NONE;
406 int protocol = PY_SSL_VERSION_SSL23;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000407 char *key_file = NULL;
408 char *cert_file = NULL;
Thomas Woutersed03b412007-08-28 21:37:11 +0000409 char *cacerts_file = NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000410
Thomas Woutersed03b412007-08-28 21:37:11 +0000411 if (!PyArg_ParseTuple(args, "O!i|zziiz:sslwrap",
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000412 PySocketModule.Sock_Type,
Thomas Wouters89f507f2006-12-13 04:49:30 +0000413 &Sock,
Thomas Woutersed03b412007-08-28 21:37:11 +0000414 &server_side,
415 &key_file, &cert_file,
416 &verification_mode, &protocol,
417 &cacerts_file))
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000418 return NULL;
419
Thomas Woutersed03b412007-08-28 21:37:11 +0000420 /*
421 fprintf(stderr,
422 "server_side is %d, keyfile %p, certfile %p, verify_mode %d, "
423 "protocol %d, certs %p\n",
424 server_side, key_file, cert_file, verification_mode,
425 protocol, cacerts_file);
426 */
427
428 return (PyObject *) newPySSLObject(Sock, key_file, cert_file,
429 server_side, verification_mode,
430 protocol, cacerts_file);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000431}
432
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000433PyDoc_STRVAR(ssl_doc,
Thomas Woutersed03b412007-08-28 21:37:11 +0000434"sslwrap(socket, server_side, [keyfile, certfile, certs_mode, protocol,\n"
435" cacertsfile]) -> sslobject");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000436
437/* SSL object methods */
438
Bill Janssen6e027db2007-11-15 22:23:56 +0000439static PyObject *PySSL_SSLdo_handshake(PySSLObject *self)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000440{
Bill Janssen6e027db2007-11-15 22:23:56 +0000441 int ret;
442 int err;
443 int sockstate;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000444
Bill Janssen6e027db2007-11-15 22:23:56 +0000445 /* Actually negotiate SSL connection */
446 /* XXX If SSL_do_handshake() returns 0, it's also a failure. */
447 sockstate = 0;
448 do {
Bill Janssen54cc54c2007-12-14 22:08:56 +0000449 PySocketSockObject *sock
450 = (PySocketSockObject *) PyWeakref_GetObject(self->Socket);
451 if (((PyObject*)sock) == Py_None) {
452 _setSSLError("Underlying socket connection gone",
453 PY_SSL_ERROR_NO_SOCKET, __FILE__, __LINE__);
454 return NULL;
455 }
456
Bill Janssen6e027db2007-11-15 22:23:56 +0000457 PySSL_BEGIN_ALLOW_THREADS
458 ret = SSL_do_handshake(self->ssl);
459 err = SSL_get_error(self->ssl, ret);
460 PySSL_END_ALLOW_THREADS
461 if(PyErr_CheckSignals()) {
462 return NULL;
463 }
464 if (err == SSL_ERROR_WANT_READ) {
Bill Janssen54cc54c2007-12-14 22:08:56 +0000465 sockstate = check_socket_and_wait_for_timeout(sock, 0);
Bill Janssen6e027db2007-11-15 22:23:56 +0000466 } else if (err == SSL_ERROR_WANT_WRITE) {
Bill Janssen54cc54c2007-12-14 22:08:56 +0000467 sockstate = check_socket_and_wait_for_timeout(sock, 1);
Bill Janssen6e027db2007-11-15 22:23:56 +0000468 } else {
469 sockstate = SOCKET_OPERATION_OK;
470 }
471 if (sockstate == SOCKET_HAS_TIMED_OUT) {
472 PyErr_SetString(PySSLErrorObject,
473 ERRSTR("The handshake operation timed out"));
474 return NULL;
475 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
476 PyErr_SetString(PySSLErrorObject,
477 ERRSTR("Underlying socket has been closed."));
478 return NULL;
479 } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
480 PyErr_SetString(PySSLErrorObject,
481 ERRSTR("Underlying socket too large for select()."));
482 return NULL;
483 } else if (sockstate == SOCKET_IS_NONBLOCKING) {
484 break;
485 }
486 } while (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE);
487 if (ret < 1)
488 return PySSL_SetError(self, ret, __FILE__, __LINE__);
489 self->ssl->debug = 1;
490
491 if (self->peer_cert)
492 X509_free (self->peer_cert);
493 PySSL_BEGIN_ALLOW_THREADS
494 self->peer_cert = SSL_get_peer_certificate(self->ssl);
495 PySSL_END_ALLOW_THREADS
496
497 Py_INCREF(Py_None);
498 return Py_None;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000499}
500
Thomas Woutersed03b412007-08-28 21:37:11 +0000501static PyObject *
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000502_create_tuple_for_attribute (ASN1_OBJECT *name, ASN1_STRING *value) {
Thomas Woutersed03b412007-08-28 21:37:11 +0000503
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000504 char namebuf[X509_NAME_MAXLEN];
505 int buflen;
506 PyObject *name_obj;
507 PyObject *value_obj;
508 PyObject *attr;
509 unsigned char *valuebuf = NULL;
Thomas Woutersed03b412007-08-28 21:37:11 +0000510
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000511 buflen = OBJ_obj2txt(namebuf, sizeof(namebuf), name, 0);
512 if (buflen < 0) {
513 _setSSLError(NULL, 0, __FILE__, __LINE__);
514 goto fail;
Thomas Woutersed03b412007-08-28 21:37:11 +0000515 }
Bill Janssen6e027db2007-11-15 22:23:56 +0000516 name_obj = PyUnicode_FromStringAndSize(namebuf, buflen);
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000517 if (name_obj == NULL)
518 goto fail;
Guido van Rossumf06628b2007-11-21 20:01:53 +0000519
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000520 buflen = ASN1_STRING_to_UTF8(&valuebuf, value);
521 if (buflen < 0) {
522 _setSSLError(NULL, 0, __FILE__, __LINE__);
523 Py_DECREF(name_obj);
524 goto fail;
525 }
526 value_obj = PyUnicode_DecodeUTF8((char *) valuebuf,
527 buflen, "strict");
528 OPENSSL_free(valuebuf);
529 if (value_obj == NULL) {
530 Py_DECREF(name_obj);
531 goto fail;
532 }
533 attr = PyTuple_New(2);
534 if (attr == NULL) {
535 Py_DECREF(name_obj);
536 Py_DECREF(value_obj);
537 goto fail;
538 }
539 PyTuple_SET_ITEM(attr, 0, name_obj);
540 PyTuple_SET_ITEM(attr, 1, value_obj);
541 return attr;
Thomas Woutersed03b412007-08-28 21:37:11 +0000542
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000543 fail:
Thomas Woutersed03b412007-08-28 21:37:11 +0000544 return NULL;
545}
546
547static PyObject *
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000548_create_tuple_for_X509_NAME (X509_NAME *xname)
Thomas Woutersed03b412007-08-28 21:37:11 +0000549{
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000550 PyObject *dn = NULL; /* tuple which represents the "distinguished name" */
551 PyObject *rdn = NULL; /* tuple to hold a "relative distinguished name" */
552 PyObject *rdnt;
553 PyObject *attr = NULL; /* tuple to hold an attribute */
554 int entry_count = X509_NAME_entry_count(xname);
555 X509_NAME_ENTRY *entry;
556 ASN1_OBJECT *name;
557 ASN1_STRING *value;
558 int index_counter;
559 int rdn_level = -1;
560 int retcode;
561
562 dn = PyList_New(0);
563 if (dn == NULL)
564 return NULL;
565 /* now create another tuple to hold the top-level RDN */
566 rdn = PyList_New(0);
567 if (rdn == NULL)
568 goto fail0;
569
570 for (index_counter = 0;
571 index_counter < entry_count;
572 index_counter++)
573 {
574 entry = X509_NAME_get_entry(xname, index_counter);
575
576 /* check to see if we've gotten to a new RDN */
577 if (rdn_level >= 0) {
578 if (rdn_level != entry->set) {
579 /* yes, new RDN */
580 /* add old RDN to DN */
581 rdnt = PyList_AsTuple(rdn);
582 Py_DECREF(rdn);
583 if (rdnt == NULL)
584 goto fail0;
585 retcode = PyList_Append(dn, rdnt);
586 Py_DECREF(rdnt);
587 if (retcode < 0)
588 goto fail0;
589 /* create new RDN */
590 rdn = PyList_New(0);
591 if (rdn == NULL)
592 goto fail0;
593 }
594 }
595 rdn_level = entry->set;
596
597 /* now add this attribute to the current RDN */
598 name = X509_NAME_ENTRY_get_object(entry);
599 value = X509_NAME_ENTRY_get_data(entry);
600 attr = _create_tuple_for_attribute(name, value);
601 /*
602 fprintf(stderr, "RDN level %d, attribute %s: %s\n",
603 entry->set,
Christian Heimes72b710a2008-05-26 13:28:38 +0000604 PyBytes_AS_STRING(PyTuple_GET_ITEM(attr, 0)),
605 PyBytes_AS_STRING(PyTuple_GET_ITEM(attr, 1)));
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000606 */
607 if (attr == NULL)
608 goto fail1;
609 retcode = PyList_Append(rdn, attr);
610 Py_DECREF(attr);
611 if (retcode < 0)
612 goto fail1;
613 }
614 /* now, there's typically a dangling RDN */
615 if ((rdn != NULL) && (PyList_Size(rdn) > 0)) {
616 rdnt = PyList_AsTuple(rdn);
617 Py_DECREF(rdn);
618 if (rdnt == NULL)
619 goto fail0;
620 retcode = PyList_Append(dn, rdnt);
621 Py_DECREF(rdnt);
622 if (retcode < 0)
623 goto fail0;
624 }
625
626 /* convert list to tuple */
627 rdnt = PyList_AsTuple(dn);
628 Py_DECREF(dn);
629 if (rdnt == NULL)
630 return NULL;
631 return rdnt;
632
633 fail1:
634 Py_XDECREF(rdn);
635
636 fail0:
637 Py_XDECREF(dn);
638 return NULL;
639}
640
641static PyObject *
642_get_peer_alt_names (X509 *certificate) {
Guido van Rossumf06628b2007-11-21 20:01:53 +0000643
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000644 /* this code follows the procedure outlined in
645 OpenSSL's crypto/x509v3/v3_prn.c:X509v3_EXT_print()
646 function to extract the STACK_OF(GENERAL_NAME),
647 then iterates through the stack to add the
648 names. */
649
650 int i, j;
651 PyObject *peer_alt_names = Py_None;
652 PyObject *v, *t;
653 X509_EXTENSION *ext = NULL;
654 GENERAL_NAMES *names = NULL;
655 GENERAL_NAME *name;
Guido van Rossumf06628b2007-11-21 20:01:53 +0000656 X509V3_EXT_METHOD *method;
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000657 BIO *biobuf = NULL;
658 char buf[2048];
659 char *vptr;
660 int len;
Benjamin Peterson0289b152009-06-28 17:22:03 +0000661 unsigned char *p;
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000662
663 if (certificate == NULL)
664 return peer_alt_names;
665
666 /* get a memory buffer */
667 biobuf = BIO_new(BIO_s_mem());
668
669 i = 0;
670 while ((i = X509_get_ext_by_NID(
671 certificate, NID_subject_alt_name, i)) >= 0) {
672
673 if (peer_alt_names == Py_None) {
674 peer_alt_names = PyList_New(0);
675 if (peer_alt_names == NULL)
676 goto fail;
677 }
Guido van Rossumf06628b2007-11-21 20:01:53 +0000678
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000679 /* now decode the altName */
680 ext = X509_get_ext(certificate, i);
681 if(!(method = X509V3_EXT_get(ext))) {
Bill Janssen6e027db2007-11-15 22:23:56 +0000682 PyErr_SetString
683 (PySSLErrorObject,
684 ERRSTR("No method for internalizing subjectAltName!"));
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000685 goto fail;
686 }
687
688 p = ext->value->data;
Christian Heimes412dc9c2008-01-27 18:55:54 +0000689 if (method->it)
Bill Janssen6e027db2007-11-15 22:23:56 +0000690 names = (GENERAL_NAMES*)
691 (ASN1_item_d2i(NULL,
692 &p,
693 ext->value->length,
694 ASN1_ITEM_ptr(method->it)));
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000695 else
Bill Janssen6e027db2007-11-15 22:23:56 +0000696 names = (GENERAL_NAMES*)
697 (method->d2i(NULL,
698 &p,
699 ext->value->length));
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000700
701 for(j = 0; j < sk_GENERAL_NAME_num(names); j++) {
702
703 /* get a rendering of each name in the set of names */
704
705 name = sk_GENERAL_NAME_value(names, j);
706 if (name->type == GEN_DIRNAME) {
707
Bill Janssen6e027db2007-11-15 22:23:56 +0000708 /* we special-case DirName as a tuple of
709 tuples of attributes */
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000710
711 t = PyTuple_New(2);
712 if (t == NULL) {
713 goto fail;
714 }
715
Bill Janssen6e027db2007-11-15 22:23:56 +0000716 v = PyUnicode_FromString("DirName");
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000717 if (v == NULL) {
718 Py_DECREF(t);
719 goto fail;
720 }
721 PyTuple_SET_ITEM(t, 0, v);
722
723 v = _create_tuple_for_X509_NAME (name->d.dirn);
724 if (v == NULL) {
725 Py_DECREF(t);
726 goto fail;
727 }
728 PyTuple_SET_ITEM(t, 1, v);
Guido van Rossumf06628b2007-11-21 20:01:53 +0000729
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000730 } else {
731
732 /* for everything else, we use the OpenSSL print form */
733
734 (void) BIO_reset(biobuf);
735 GENERAL_NAME_print(biobuf, name);
736 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
737 if (len < 0) {
738 _setSSLError(NULL, 0, __FILE__, __LINE__);
739 goto fail;
740 }
741 vptr = strchr(buf, ':');
742 if (vptr == NULL)
743 goto fail;
744 t = PyTuple_New(2);
745 if (t == NULL)
746 goto fail;
Bill Janssen6e027db2007-11-15 22:23:56 +0000747 v = PyUnicode_FromStringAndSize(buf, (vptr - buf));
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000748 if (v == NULL) {
749 Py_DECREF(t);
750 goto fail;
751 }
752 PyTuple_SET_ITEM(t, 0, v);
Bill Janssen6e027db2007-11-15 22:23:56 +0000753 v = PyUnicode_FromStringAndSize((vptr + 1),
754 (len - (vptr - buf + 1)));
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000755 if (v == NULL) {
756 Py_DECREF(t);
757 goto fail;
758 }
759 PyTuple_SET_ITEM(t, 1, v);
760 }
761
762 /* and add that rendering to the list */
763
764 if (PyList_Append(peer_alt_names, t) < 0) {
765 Py_DECREF(t);
766 goto fail;
767 }
768 Py_DECREF(t);
769 }
770 }
771 BIO_free(biobuf);
772 if (peer_alt_names != Py_None) {
773 v = PyList_AsTuple(peer_alt_names);
774 Py_DECREF(peer_alt_names);
775 return v;
776 } else {
777 return peer_alt_names;
778 }
Guido van Rossumf06628b2007-11-21 20:01:53 +0000779
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000780
781 fail:
782 if (biobuf != NULL)
783 BIO_free(biobuf);
784
785 if (peer_alt_names != Py_None) {
786 Py_XDECREF(peer_alt_names);
787 }
788
789 return NULL;
790}
791
792static PyObject *
793_decode_certificate (X509 *certificate, int verbose) {
794
Thomas Woutersed03b412007-08-28 21:37:11 +0000795 PyObject *retval = NULL;
796 BIO *biobuf = NULL;
797 PyObject *peer;
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000798 PyObject *peer_alt_names = NULL;
Thomas Woutersed03b412007-08-28 21:37:11 +0000799 PyObject *issuer;
800 PyObject *version;
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000801 PyObject *sn_obj;
802 ASN1_INTEGER *serialNumber;
Thomas Woutersed03b412007-08-28 21:37:11 +0000803 char buf[2048];
804 int len;
805 ASN1_TIME *notBefore, *notAfter;
806 PyObject *pnotBefore, *pnotAfter;
Thomas Woutersed03b412007-08-28 21:37:11 +0000807
808 retval = PyDict_New();
809 if (retval == NULL)
810 return NULL;
811
Thomas Wouters89d996e2007-09-08 17:39:28 +0000812 peer = _create_tuple_for_X509_NAME(
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000813 X509_get_subject_name(certificate));
Thomas Woutersed03b412007-08-28 21:37:11 +0000814 if (peer == NULL)
815 goto fail0;
816 if (PyDict_SetItemString(retval, (const char *) "subject", peer) < 0) {
817 Py_DECREF(peer);
818 goto fail0;
819 }
820 Py_DECREF(peer);
821
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000822 if (verbose) {
823 issuer = _create_tuple_for_X509_NAME(
824 X509_get_issuer_name(certificate));
825 if (issuer == NULL)
826 goto fail0;
827 if (PyDict_SetItemString(retval, (const char *)"issuer", issuer) < 0) {
828 Py_DECREF(issuer);
829 goto fail0;
830 }
Thomas Woutersed03b412007-08-28 21:37:11 +0000831 Py_DECREF(issuer);
Guido van Rossumf06628b2007-11-21 20:01:53 +0000832
Christian Heimes217cfd12007-12-02 14:31:20 +0000833 version = PyLong_FromLong(X509_get_version(certificate) + 1);
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000834 if (PyDict_SetItemString(retval, "version", version) < 0) {
835 Py_DECREF(version);
836 goto fail0;
837 }
Thomas Woutersed03b412007-08-28 21:37:11 +0000838 Py_DECREF(version);
Thomas Woutersed03b412007-08-28 21:37:11 +0000839 }
Guido van Rossumf06628b2007-11-21 20:01:53 +0000840
Thomas Woutersed03b412007-08-28 21:37:11 +0000841 /* get a memory buffer */
842 biobuf = BIO_new(BIO_s_mem());
Guido van Rossumf06628b2007-11-21 20:01:53 +0000843
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000844 if (verbose) {
Thomas Woutersed03b412007-08-28 21:37:11 +0000845
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000846 (void) BIO_reset(biobuf);
847 serialNumber = X509_get_serialNumber(certificate);
848 /* should not exceed 20 octets, 160 bits, so buf is big enough */
849 i2a_ASN1_INTEGER(biobuf, serialNumber);
850 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
851 if (len < 0) {
852 _setSSLError(NULL, 0, __FILE__, __LINE__);
853 goto fail1;
854 }
Bill Janssen6e027db2007-11-15 22:23:56 +0000855 sn_obj = PyUnicode_FromStringAndSize(buf, len);
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000856 if (sn_obj == NULL)
857 goto fail1;
858 if (PyDict_SetItemString(retval, "serialNumber", sn_obj) < 0) {
859 Py_DECREF(sn_obj);
860 goto fail1;
861 }
862 Py_DECREF(sn_obj);
863
864 (void) BIO_reset(biobuf);
865 notBefore = X509_get_notBefore(certificate);
866 ASN1_TIME_print(biobuf, notBefore);
867 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
868 if (len < 0) {
869 _setSSLError(NULL, 0, __FILE__, __LINE__);
870 goto fail1;
871 }
Bill Janssen6e027db2007-11-15 22:23:56 +0000872 pnotBefore = PyUnicode_FromStringAndSize(buf, len);
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000873 if (pnotBefore == NULL)
874 goto fail1;
875 if (PyDict_SetItemString(retval, "notBefore", pnotBefore) < 0) {
876 Py_DECREF(pnotBefore);
877 goto fail1;
878 }
Thomas Woutersed03b412007-08-28 21:37:11 +0000879 Py_DECREF(pnotBefore);
Thomas Woutersed03b412007-08-28 21:37:11 +0000880 }
Thomas Woutersed03b412007-08-28 21:37:11 +0000881
882 (void) BIO_reset(biobuf);
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000883 notAfter = X509_get_notAfter(certificate);
Thomas Woutersed03b412007-08-28 21:37:11 +0000884 ASN1_TIME_print(biobuf, notAfter);
885 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000886 if (len < 0) {
887 _setSSLError(NULL, 0, __FILE__, __LINE__);
888 goto fail1;
889 }
Bill Janssen6e027db2007-11-15 22:23:56 +0000890 pnotAfter = PyUnicode_FromStringAndSize(buf, len);
Thomas Woutersed03b412007-08-28 21:37:11 +0000891 if (pnotAfter == NULL)
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000892 goto fail1;
Thomas Woutersed03b412007-08-28 21:37:11 +0000893 if (PyDict_SetItemString(retval, "notAfter", pnotAfter) < 0) {
894 Py_DECREF(pnotAfter);
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000895 goto fail1;
Thomas Woutersed03b412007-08-28 21:37:11 +0000896 }
897 Py_DECREF(pnotAfter);
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000898
899 /* Now look for subjectAltName */
900
901 peer_alt_names = _get_peer_alt_names(certificate);
902 if (peer_alt_names == NULL)
903 goto fail1;
904 else if (peer_alt_names != Py_None) {
905 if (PyDict_SetItemString(retval, "subjectAltName",
906 peer_alt_names) < 0) {
907 Py_DECREF(peer_alt_names);
908 goto fail1;
909 }
910 Py_DECREF(peer_alt_names);
911 }
Guido van Rossumf06628b2007-11-21 20:01:53 +0000912
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000913 BIO_free(biobuf);
Thomas Woutersed03b412007-08-28 21:37:11 +0000914 return retval;
915
916 fail1:
917 if (biobuf != NULL)
918 BIO_free(biobuf);
919 fail0:
920 Py_XDECREF(retval);
921 return NULL;
922}
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000923
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000924
925static PyObject *
926PySSL_test_decode_certificate (PyObject *mod, PyObject *args) {
927
928 PyObject *retval = NULL;
929 char *filename = NULL;
930 X509 *x=NULL;
931 BIO *cert;
932 int verbose = 1;
933
Bill Janssen6e027db2007-11-15 22:23:56 +0000934 if (!PyArg_ParseTuple(args, "s|i:test_decode_certificate",
935 &filename, &verbose))
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000936 return NULL;
937
938 if ((cert=BIO_new(BIO_s_file())) == NULL) {
Bill Janssen6e027db2007-11-15 22:23:56 +0000939 PyErr_SetString(PySSLErrorObject,
940 "Can't malloc memory to read file");
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000941 goto fail0;
942 }
943
944 if (BIO_read_filename(cert,filename) <= 0) {
Bill Janssen6e027db2007-11-15 22:23:56 +0000945 PyErr_SetString(PySSLErrorObject,
946 "Can't open file");
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000947 goto fail0;
948 }
949
950 x = PEM_read_bio_X509_AUX(cert,NULL, NULL, NULL);
951 if (x == NULL) {
Bill Janssen6e027db2007-11-15 22:23:56 +0000952 PyErr_SetString(PySSLErrorObject,
953 "Error decoding PEM-encoded file");
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000954 goto fail0;
955 }
956
957 retval = _decode_certificate(x, verbose);
958
959 fail0:
Guido van Rossumf06628b2007-11-21 20:01:53 +0000960
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000961 if (cert != NULL) BIO_free(cert);
962 return retval;
963}
964
965
966static PyObject *
967PySSL_peercert(PySSLObject *self, PyObject *args)
968{
969 PyObject *retval = NULL;
970 int len;
971 int verification;
972 PyObject *binary_mode = Py_None;
973
974 if (!PyArg_ParseTuple(args, "|O:peer_certificate", &binary_mode))
975 return NULL;
976
977 if (!self->peer_cert)
978 Py_RETURN_NONE;
979
980 if (PyObject_IsTrue(binary_mode)) {
981 /* return cert in DER-encoded format */
982
983 unsigned char *bytes_buf = NULL;
984
985 bytes_buf = NULL;
986 len = i2d_X509(self->peer_cert, &bytes_buf);
987 if (len < 0) {
988 PySSL_SetError(self, len, __FILE__, __LINE__);
989 return NULL;
990 }
Bill Janssen6e027db2007-11-15 22:23:56 +0000991 /* this is actually an immutable bytes sequence */
Christian Heimes72b710a2008-05-26 13:28:38 +0000992 retval = PyBytes_FromStringAndSize
Bill Janssen6e027db2007-11-15 22:23:56 +0000993 ((const char *) bytes_buf, len);
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000994 OPENSSL_free(bytes_buf);
995 return retval;
996
997 } else {
998
999 verification = SSL_CTX_get_verify_mode(self->ctx);
1000 if ((verification & SSL_VERIFY_PEER) == 0)
1001 return PyDict_New();
1002 else
1003 return _decode_certificate (self->peer_cert, 0);
1004 }
1005}
1006
1007PyDoc_STRVAR(PySSL_peercert_doc,
1008"peer_certificate([der=False]) -> certificate\n\
1009\n\
1010Returns the certificate for the peer. If no certificate was provided,\n\
1011returns None. If a certificate was provided, but not validated, returns\n\
1012an empty dictionary. Otherwise returns a dict containing information\n\
1013about the peer certificate.\n\
1014\n\
1015If the optional argument is True, returns a DER-encoded copy of the\n\
1016peer certificate, or None if no certificate was provided. This will\n\
1017return the certificate even if it wasn't validated.");
1018
1019static PyObject *PySSL_cipher (PySSLObject *self) {
1020
1021 PyObject *retval, *v;
1022 SSL_CIPHER *current;
1023 char *cipher_name;
1024 char *cipher_protocol;
1025
1026 if (self->ssl == NULL)
1027 return Py_None;
1028 current = SSL_get_current_cipher(self->ssl);
1029 if (current == NULL)
1030 return Py_None;
1031
1032 retval = PyTuple_New(3);
1033 if (retval == NULL)
1034 return NULL;
1035
1036 cipher_name = (char *) SSL_CIPHER_get_name(current);
1037 if (cipher_name == NULL) {
1038 PyTuple_SET_ITEM(retval, 0, Py_None);
1039 } else {
Bill Janssen6e027db2007-11-15 22:23:56 +00001040 v = PyUnicode_FromString(cipher_name);
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001041 if (v == NULL)
1042 goto fail0;
1043 PyTuple_SET_ITEM(retval, 0, v);
1044 }
1045 cipher_protocol = SSL_CIPHER_get_version(current);
1046 if (cipher_protocol == NULL) {
1047 PyTuple_SET_ITEM(retval, 1, Py_None);
1048 } else {
Bill Janssen6e027db2007-11-15 22:23:56 +00001049 v = PyUnicode_FromString(cipher_protocol);
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001050 if (v == NULL)
1051 goto fail0;
1052 PyTuple_SET_ITEM(retval, 1, v);
1053 }
Christian Heimes217cfd12007-12-02 14:31:20 +00001054 v = PyLong_FromLong(SSL_CIPHER_get_bits(current, NULL));
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001055 if (v == NULL)
1056 goto fail0;
1057 PyTuple_SET_ITEM(retval, 2, v);
1058 return retval;
Guido van Rossumf06628b2007-11-21 20:01:53 +00001059
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001060 fail0:
1061 Py_DECREF(retval);
1062 return NULL;
1063}
1064
Guido van Rossume6650f92007-12-06 19:05:55 +00001065static void PySSL_dealloc(PySSLObject *self)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001066{
Thomas Woutersed03b412007-08-28 21:37:11 +00001067 if (self->peer_cert) /* Possible not to have one? */
Guido van Rossume6650f92007-12-06 19:05:55 +00001068 X509_free (self->peer_cert);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001069 if (self->ssl)
Thomas Woutersed03b412007-08-28 21:37:11 +00001070 SSL_free(self->ssl);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001071 if (self->ctx)
Thomas Woutersed03b412007-08-28 21:37:11 +00001072 SSL_CTX_free(self->ctx);
Guido van Rossume6650f92007-12-06 19:05:55 +00001073 Py_XDECREF(self->Socket);
1074 PyObject_Del(self);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001075}
1076
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001077/* If the socket has a timeout, do a select()/poll() on the socket.
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001078 The argument writing indicates the direction.
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001079 Returns one of the possibilities in the timeout_state enum (above).
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001080 */
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001081
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001082static int
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001083check_socket_and_wait_for_timeout(PySocketSockObject *s, int writing)
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001084{
1085 fd_set fds;
1086 struct timeval tv;
1087 int rc;
1088
1089 /* Nothing to do unless we're in timeout mode (not non-blocking) */
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001090 if (s->sock_timeout < 0.0)
1091 return SOCKET_IS_BLOCKING;
1092 else if (s->sock_timeout == 0.0)
1093 return SOCKET_IS_NONBLOCKING;
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001094
1095 /* Guard against closed socket */
1096 if (s->sock_fd < 0)
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001097 return SOCKET_HAS_BEEN_CLOSED;
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001098
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001099 /* Prefer poll, if available, since you can poll() any fd
1100 * which can't be done with select(). */
1101#ifdef HAVE_POLL
1102 {
1103 struct pollfd pollfd;
1104 int timeout;
1105
1106 pollfd.fd = s->sock_fd;
1107 pollfd.events = writing ? POLLOUT : POLLIN;
1108
1109 /* s->sock_timeout is in seconds, timeout in ms */
1110 timeout = (int)(s->sock_timeout * 1000 + 0.5);
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001111 PySSL_BEGIN_ALLOW_THREADS
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001112 rc = poll(&pollfd, 1, timeout);
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001113 PySSL_END_ALLOW_THREADS
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001114
1115 goto normal_return;
1116 }
1117#endif
1118
Neal Norwitz082b2df2006-02-07 07:04:46 +00001119 /* Guard against socket too large for select*/
Martin v. Löwisf84d1b92006-02-11 09:27:05 +00001120#ifndef Py_SOCKET_FD_CAN_BE_GE_FD_SETSIZE
Neal Norwitz082b2df2006-02-07 07:04:46 +00001121 if (s->sock_fd >= FD_SETSIZE)
Neal Norwitz389cea82006-02-13 00:35:21 +00001122 return SOCKET_TOO_LARGE_FOR_SELECT;
Martin v. Löwisf84d1b92006-02-11 09:27:05 +00001123#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +00001124
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001125 /* Construct the arguments to select */
1126 tv.tv_sec = (int)s->sock_timeout;
1127 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
1128 FD_ZERO(&fds);
1129 FD_SET(s->sock_fd, &fds);
1130
1131 /* See if the socket is ready */
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001132 PySSL_BEGIN_ALLOW_THREADS
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001133 if (writing)
1134 rc = select(s->sock_fd+1, NULL, &fds, NULL, &tv);
1135 else
1136 rc = select(s->sock_fd+1, &fds, NULL, NULL, &tv);
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001137 PySSL_END_ALLOW_THREADS
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001138
Bill Janssen6e027db2007-11-15 22:23:56 +00001139#ifdef HAVE_POLL
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001140normal_return:
Bill Janssen6e027db2007-11-15 22:23:56 +00001141#endif
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001142 /* Return SOCKET_TIMED_OUT on timeout, SOCKET_OPERATION_OK otherwise
1143 (when we are able to write or when there's something to read) */
1144 return rc == 0 ? SOCKET_HAS_TIMED_OUT : SOCKET_OPERATION_OK;
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001145}
1146
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001147static PyObject *PySSL_SSLwrite(PySSLObject *self, PyObject *args)
1148{
Antoine Pitrou7d7aede2009-11-25 18:55:32 +00001149 Py_buffer buf;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001150 int len;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001151 int sockstate;
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001152 int err;
Bill Janssen6e027db2007-11-15 22:23:56 +00001153 int nonblocking;
Bill Janssen54cc54c2007-12-14 22:08:56 +00001154 PySocketSockObject *sock
1155 = (PySocketSockObject *) PyWeakref_GetObject(self->Socket);
1156
1157 if (((PyObject*)sock) == Py_None) {
1158 _setSSLError("Underlying socket connection gone",
1159 PY_SSL_ERROR_NO_SOCKET, __FILE__, __LINE__);
1160 return NULL;
1161 }
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001162
Antoine Pitrou7d7aede2009-11-25 18:55:32 +00001163 if (!PyArg_ParseTuple(args, "y*:write", &buf))
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001164 return NULL;
1165
Bill Janssen6e027db2007-11-15 22:23:56 +00001166 /* just in case the blocking state of the socket has been changed */
Bill Janssen54cc54c2007-12-14 22:08:56 +00001167 nonblocking = (sock->sock_timeout >= 0.0);
Bill Janssen6e027db2007-11-15 22:23:56 +00001168 BIO_set_nbio(SSL_get_rbio(self->ssl), nonblocking);
1169 BIO_set_nbio(SSL_get_wbio(self->ssl), nonblocking);
1170
Bill Janssen54cc54c2007-12-14 22:08:56 +00001171 sockstate = check_socket_and_wait_for_timeout(sock, 1);
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001172 if (sockstate == SOCKET_HAS_TIMED_OUT) {
Thomas Woutersed03b412007-08-28 21:37:11 +00001173 PyErr_SetString(PySSLErrorObject,
1174 "The write operation timed out");
Antoine Pitrou7d7aede2009-11-25 18:55:32 +00001175 goto error;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001176 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
Thomas Woutersed03b412007-08-28 21:37:11 +00001177 PyErr_SetString(PySSLErrorObject,
1178 "Underlying socket has been closed.");
Antoine Pitrou7d7aede2009-11-25 18:55:32 +00001179 goto error;
Neal Norwitz389cea82006-02-13 00:35:21 +00001180 } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
Thomas Woutersed03b412007-08-28 21:37:11 +00001181 PyErr_SetString(PySSLErrorObject,
1182 "Underlying socket too large for select().");
Antoine Pitrou7d7aede2009-11-25 18:55:32 +00001183 goto error;
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001184 }
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001185 do {
1186 err = 0;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001187 PySSL_BEGIN_ALLOW_THREADS
Antoine Pitrou7d7aede2009-11-25 18:55:32 +00001188 len = SSL_write(self->ssl, buf.buf, buf.len);
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001189 err = SSL_get_error(self->ssl, len);
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001190 PySSL_END_ALLOW_THREADS
Antoine Pitrou7d7aede2009-11-25 18:55:32 +00001191 if (PyErr_CheckSignals()) {
1192 goto error;
Martin v. Löwisafec8e32003-06-28 07:40:23 +00001193 }
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001194 if (err == SSL_ERROR_WANT_READ) {
Thomas Woutersed03b412007-08-28 21:37:11 +00001195 sockstate =
Bill Janssen54cc54c2007-12-14 22:08:56 +00001196 check_socket_and_wait_for_timeout(sock, 0);
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001197 } else if (err == SSL_ERROR_WANT_WRITE) {
Thomas Woutersed03b412007-08-28 21:37:11 +00001198 sockstate =
Bill Janssen54cc54c2007-12-14 22:08:56 +00001199 check_socket_and_wait_for_timeout(sock, 1);
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001200 } else {
1201 sockstate = SOCKET_OPERATION_OK;
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001202 }
Thomas Woutersed03b412007-08-28 21:37:11 +00001203 if (sockstate == SOCKET_HAS_TIMED_OUT) {
1204 PyErr_SetString(PySSLErrorObject,
1205 "The write operation timed out");
Antoine Pitrou7d7aede2009-11-25 18:55:32 +00001206 goto error;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001207 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
Thomas Woutersed03b412007-08-28 21:37:11 +00001208 PyErr_SetString(PySSLErrorObject,
1209 "Underlying socket has been closed.");
Antoine Pitrou7d7aede2009-11-25 18:55:32 +00001210 goto error;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001211 } else if (sockstate == SOCKET_IS_NONBLOCKING) {
1212 break;
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001213 }
1214 } while (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE);
Antoine Pitrou7d7aede2009-11-25 18:55:32 +00001215
1216 PyBuffer_Release(&buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001217 if (len > 0)
Christian Heimes217cfd12007-12-02 14:31:20 +00001218 return PyLong_FromLong(len);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001219 else
Thomas Woutersed03b412007-08-28 21:37:11 +00001220 return PySSL_SetError(self, len, __FILE__, __LINE__);
Antoine Pitrou7d7aede2009-11-25 18:55:32 +00001221
1222error:
1223 PyBuffer_Release(&buf);
1224 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001225}
1226
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001227PyDoc_STRVAR(PySSL_SSLwrite_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001228"write(s) -> len\n\
1229\n\
1230Writes the string s into the SSL object. Returns the number\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001231of bytes written.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001232
Bill Janssen6e027db2007-11-15 22:23:56 +00001233static PyObject *PySSL_SSLpending(PySSLObject *self)
1234{
1235 int count = 0;
1236
1237 PySSL_BEGIN_ALLOW_THREADS
1238 count = SSL_pending(self->ssl);
1239 PySSL_END_ALLOW_THREADS
1240 if (count < 0)
1241 return PySSL_SetError(self, count, __FILE__, __LINE__);
1242 else
Christian Heimes217cfd12007-12-02 14:31:20 +00001243 return PyLong_FromLong(count);
Bill Janssen6e027db2007-11-15 22:23:56 +00001244}
1245
1246PyDoc_STRVAR(PySSL_SSLpending_doc,
1247"pending() -> count\n\
1248\n\
1249Returns the number of already decrypted bytes available for read,\n\
1250pending on the connection.\n");
1251
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001252static PyObject *PySSL_SSLread(PySSLObject *self, PyObject *args)
1253{
Benjamin Peterson56420b42009-02-28 19:06:54 +00001254 PyObject *dest = NULL;
1255 Py_buffer buf;
Bill Janssen6e027db2007-11-15 22:23:56 +00001256 int buf_passed = 0;
1257 int count = -1;
Benjamin Peterson56420b42009-02-28 19:06:54 +00001258 char *mem;
1259 /* XXX this should use Py_ssize_t */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001260 int len = 1024;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001261 int sockstate;
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001262 int err;
Bill Janssen6e027db2007-11-15 22:23:56 +00001263 int nonblocking;
Bill Janssen54cc54c2007-12-14 22:08:56 +00001264 PySocketSockObject *sock
1265 = (PySocketSockObject *) PyWeakref_GetObject(self->Socket);
1266
1267 if (((PyObject*)sock) == Py_None) {
1268 _setSSLError("Underlying socket connection gone",
1269 PY_SSL_ERROR_NO_SOCKET, __FILE__, __LINE__);
1270 return NULL;
1271 }
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001272
Benjamin Peterson56420b42009-02-28 19:06:54 +00001273 if (!PyArg_ParseTuple(args, "|Oi:read", &dest, &count))
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001274 return NULL;
Benjamin Peterson56420b42009-02-28 19:06:54 +00001275 if ((dest == NULL) || (dest == Py_None)) {
1276 if (!(dest = PyByteArray_FromStringAndSize((char *) 0, len)))
Bill Janssen6e027db2007-11-15 22:23:56 +00001277 return NULL;
Benjamin Peterson56420b42009-02-28 19:06:54 +00001278 mem = PyByteArray_AS_STRING(dest);
1279 } else if (PyLong_Check(dest)) {
1280 len = PyLong_AS_LONG(dest);
1281 if (!(dest = PyByteArray_FromStringAndSize((char *) 0, len)))
Bill Janssen6e027db2007-11-15 22:23:56 +00001282 return NULL;
Benjamin Peterson56420b42009-02-28 19:06:54 +00001283 mem = PyByteArray_AS_STRING(dest);
Bill Janssen6e027db2007-11-15 22:23:56 +00001284 } else {
Benjamin Peterson56420b42009-02-28 19:06:54 +00001285 if (PyObject_GetBuffer(dest, &buf, PyBUF_CONTIG) < 0)
Bill Janssen6e027db2007-11-15 22:23:56 +00001286 return NULL;
Benjamin Peterson56420b42009-02-28 19:06:54 +00001287 mem = buf.buf;
1288 len = buf.len;
Bill Janssen6e027db2007-11-15 22:23:56 +00001289 if ((count > 0) && (count <= len))
1290 len = count;
1291 buf_passed = 1;
1292 }
1293
1294 /* just in case the blocking state of the socket has been changed */
Bill Janssen54cc54c2007-12-14 22:08:56 +00001295 nonblocking = (sock->sock_timeout >= 0.0);
Bill Janssen6e027db2007-11-15 22:23:56 +00001296 BIO_set_nbio(SSL_get_rbio(self->ssl), nonblocking);
1297 BIO_set_nbio(SSL_get_wbio(self->ssl), nonblocking);
Thomas Woutersed03b412007-08-28 21:37:11 +00001298
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001299 /* first check if there are bytes ready to be read */
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001300 PySSL_BEGIN_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001301 count = SSL_pending(self->ssl);
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001302 PySSL_END_ALLOW_THREADS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001303
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001304 if (!count) {
Bill Janssen54cc54c2007-12-14 22:08:56 +00001305 sockstate = check_socket_and_wait_for_timeout(sock, 0);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001306 if (sockstate == SOCKET_HAS_TIMED_OUT) {
Thomas Woutersed03b412007-08-28 21:37:11 +00001307 PyErr_SetString(PySSLErrorObject,
1308 "The read operation timed out");
Benjamin Peterson56420b42009-02-28 19:06:54 +00001309 goto error;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001310 } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
Thomas Woutersed03b412007-08-28 21:37:11 +00001311 PyErr_SetString(PySSLErrorObject,
1312 "Underlying socket too large for select().");
Benjamin Peterson56420b42009-02-28 19:06:54 +00001313 goto error;
Thomas Woutersed03b412007-08-28 21:37:11 +00001314 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
Guido van Rossumf06628b2007-11-21 20:01:53 +00001315 count = 0;
1316 goto done;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001317 }
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001318 }
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001319 do {
1320 err = 0;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001321 PySSL_BEGIN_ALLOW_THREADS
Benjamin Peterson56420b42009-02-28 19:06:54 +00001322 count = SSL_read(self->ssl, mem, len);
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001323 err = SSL_get_error(self->ssl, count);
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001324 PySSL_END_ALLOW_THREADS
Benjamin Peterson56420b42009-02-28 19:06:54 +00001325 if (PyErr_CheckSignals())
1326 goto error;
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001327 if (err == SSL_ERROR_WANT_READ) {
Thomas Woutersed03b412007-08-28 21:37:11 +00001328 sockstate =
Bill Janssen54cc54c2007-12-14 22:08:56 +00001329 check_socket_and_wait_for_timeout(sock, 0);
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001330 } else if (err == SSL_ERROR_WANT_WRITE) {
Thomas Woutersed03b412007-08-28 21:37:11 +00001331 sockstate =
Bill Janssen54cc54c2007-12-14 22:08:56 +00001332 check_socket_and_wait_for_timeout(sock, 1);
Thomas Woutersed03b412007-08-28 21:37:11 +00001333 } else if ((err == SSL_ERROR_ZERO_RETURN) &&
1334 (SSL_get_shutdown(self->ssl) ==
1335 SSL_RECEIVED_SHUTDOWN))
1336 {
Guido van Rossumf06628b2007-11-21 20:01:53 +00001337 count = 0;
1338 goto done;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001339 } else {
1340 sockstate = SOCKET_OPERATION_OK;
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001341 }
Thomas Woutersed03b412007-08-28 21:37:11 +00001342 if (sockstate == SOCKET_HAS_TIMED_OUT) {
1343 PyErr_SetString(PySSLErrorObject,
1344 "The read operation timed out");
Benjamin Peterson56420b42009-02-28 19:06:54 +00001345 goto error;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001346 } else if (sockstate == SOCKET_IS_NONBLOCKING) {
1347 break;
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001348 }
1349 } while (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE);
Thomas Woutersed03b412007-08-28 21:37:11 +00001350 if (count <= 0) {
Benjamin Peterson56420b42009-02-28 19:06:54 +00001351 PySSL_SetError(self, count, __FILE__, __LINE__);
1352 goto error;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001353 }
Guido van Rossumf06628b2007-11-21 20:01:53 +00001354 done:
Bill Janssen6e027db2007-11-15 22:23:56 +00001355 if (!buf_passed) {
Benjamin Peterson56420b42009-02-28 19:06:54 +00001356 PyObject *res = PyBytes_FromStringAndSize(mem, count);
1357 Py_DECREF(dest);
Guido van Rossumf06628b2007-11-21 20:01:53 +00001358 return res;
Bill Janssen6e027db2007-11-15 22:23:56 +00001359 } else {
Benjamin Peterson56420b42009-02-28 19:06:54 +00001360 PyBuffer_Release(&buf);
Christian Heimes217cfd12007-12-02 14:31:20 +00001361 return PyLong_FromLong(count);
Bill Janssen6e027db2007-11-15 22:23:56 +00001362 }
Benjamin Peterson56420b42009-02-28 19:06:54 +00001363 error:
1364 if (!buf_passed) {
1365 Py_DECREF(dest);
1366 } else {
1367 PyBuffer_Release(&buf);
1368 }
1369 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001370}
1371
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001372PyDoc_STRVAR(PySSL_SSLread_doc,
Bill Janssen6e027db2007-11-15 22:23:56 +00001373"read([len]) -> string\n\
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001374\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001375Read up to len bytes from the SSL socket.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001376
Bill Janssen40a0f662008-08-12 16:56:25 +00001377static PyObject *PySSL_SSLshutdown(PySSLObject *self)
1378{
1379 int err;
1380 PySocketSockObject *sock
1381 = (PySocketSockObject *) PyWeakref_GetObject(self->Socket);
1382
1383 /* Guard against closed socket */
1384 if ((((PyObject*)sock) == Py_None) || (sock->sock_fd < 0)) {
1385 _setSSLError("Underlying socket connection gone",
1386 PY_SSL_ERROR_NO_SOCKET, __FILE__, __LINE__);
1387 return NULL;
1388 }
1389
1390 PySSL_BEGIN_ALLOW_THREADS
1391 err = SSL_shutdown(self->ssl);
1392 if (err == 0) {
1393 /* we need to call it again to finish the shutdown */
1394 err = SSL_shutdown(self->ssl);
1395 }
1396 PySSL_END_ALLOW_THREADS
1397
1398 if (err < 0)
1399 return PySSL_SetError(self, err, __FILE__, __LINE__);
1400 else {
1401 Py_INCREF(sock);
1402 return (PyObject *) sock;
1403 }
1404}
1405
1406PyDoc_STRVAR(PySSL_SSLshutdown_doc,
1407"shutdown(s) -> socket\n\
1408\n\
1409Does the SSL shutdown handshake with the remote end, and returns\n\
1410the underlying socket object.");
1411
1412
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001413static PyMethodDef PySSLMethods[] = {
Bill Janssen6e027db2007-11-15 22:23:56 +00001414 {"do_handshake", (PyCFunction)PySSL_SSLdo_handshake, METH_NOARGS},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001415 {"write", (PyCFunction)PySSL_SSLwrite, METH_VARARGS,
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001416 PySSL_SSLwrite_doc},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001417 {"read", (PyCFunction)PySSL_SSLread, METH_VARARGS,
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001418 PySSL_SSLread_doc},
Bill Janssen6e027db2007-11-15 22:23:56 +00001419 {"pending", (PyCFunction)PySSL_SSLpending, METH_NOARGS,
1420 PySSL_SSLpending_doc},
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001421 {"peer_certificate", (PyCFunction)PySSL_peercert, METH_VARARGS,
1422 PySSL_peercert_doc},
1423 {"cipher", (PyCFunction)PySSL_cipher, METH_NOARGS},
Bill Janssen40a0f662008-08-12 16:56:25 +00001424 {"shutdown", (PyCFunction)PySSL_SSLshutdown, METH_NOARGS,
1425 PySSL_SSLshutdown_doc},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001426 {NULL, NULL}
1427};
1428
Jeremy Hylton938ace62002-07-17 16:30:39 +00001429static PyTypeObject PySSL_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001430 PyVarObject_HEAD_INIT(NULL, 0)
Guido van Rossume6650f92007-12-06 19:05:55 +00001431 "ssl.SSLContext", /*tp_name*/
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001432 sizeof(PySSLObject), /*tp_basicsize*/
1433 0, /*tp_itemsize*/
1434 /* methods */
1435 (destructor)PySSL_dealloc, /*tp_dealloc*/
1436 0, /*tp_print*/
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +00001437 0, /*tp_getattr*/
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001438 0, /*tp_setattr*/
Mark Dickinsone94c6792009-02-02 20:36:42 +00001439 0, /*tp_reserved*/
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001440 0, /*tp_repr*/
1441 0, /*tp_as_number*/
1442 0, /*tp_as_sequence*/
1443 0, /*tp_as_mapping*/
1444 0, /*tp_hash*/
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +00001445 0, /*tp_call*/
1446 0, /*tp_str*/
1447 0, /*tp_getattro*/
1448 0, /*tp_setattro*/
1449 0, /*tp_as_buffer*/
1450 Py_TPFLAGS_DEFAULT, /*tp_flags*/
1451 0, /*tp_doc*/
1452 0, /*tp_traverse*/
1453 0, /*tp_clear*/
1454 0, /*tp_richcompare*/
1455 0, /*tp_weaklistoffset*/
1456 0, /*tp_iter*/
1457 0, /*tp_iternext*/
1458 PySSLMethods, /*tp_methods*/
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001459};
1460
1461#ifdef HAVE_OPENSSL_RAND
1462
1463/* helper routines for seeding the SSL PRNG */
1464static PyObject *
1465PySSL_RAND_add(PyObject *self, PyObject *args)
1466{
1467 char *buf;
1468 int len;
1469 double entropy;
1470
1471 if (!PyArg_ParseTuple(args, "s#d:RAND_add", &buf, &len, &entropy))
1472 return NULL;
1473 RAND_add(buf, len, entropy);
1474 Py_INCREF(Py_None);
1475 return Py_None;
1476}
1477
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001478PyDoc_STRVAR(PySSL_RAND_add_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001479"RAND_add(string, entropy)\n\
1480\n\
1481Mix string into the OpenSSL PRNG state. entropy (a float) is a lower\n\
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001482bound on the entropy contained in string. See RFC 1750.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001483
1484static PyObject *
1485PySSL_RAND_status(PyObject *self)
1486{
Christian Heimes217cfd12007-12-02 14:31:20 +00001487 return PyLong_FromLong(RAND_status());
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001488}
1489
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001490PyDoc_STRVAR(PySSL_RAND_status_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001491"RAND_status() -> 0 or 1\n\
1492\n\
Bill Janssen6e027db2007-11-15 22:23:56 +00001493Returns 1 if the OpenSSL PRNG has been seeded with enough data and 0 if not.\n\
1494It is necessary to seed the PRNG with RAND_add() on some platforms before\n\
1495using the ssl() function.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001496
1497static PyObject *
1498PySSL_RAND_egd(PyObject *self, PyObject *arg)
1499{
1500 int bytes;
1501
Bill Janssen6e027db2007-11-15 22:23:56 +00001502 if (!PyUnicode_Check(arg))
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001503 return PyErr_Format(PyExc_TypeError,
1504 "RAND_egd() expected string, found %s",
Christian Heimes90aa7642007-12-19 02:45:37 +00001505 Py_TYPE(arg)->tp_name);
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00001506 bytes = RAND_egd(_PyUnicode_AsString(arg));
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001507 if (bytes == -1) {
1508 PyErr_SetString(PySSLErrorObject,
1509 "EGD connection failed or EGD did not return "
1510 "enough data to seed the PRNG");
1511 return NULL;
1512 }
Christian Heimes217cfd12007-12-02 14:31:20 +00001513 return PyLong_FromLong(bytes);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001514}
1515
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001516PyDoc_STRVAR(PySSL_RAND_egd_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001517"RAND_egd(path) -> bytes\n\
1518\n\
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001519Queries the entropy gather daemon (EGD) on the socket named by 'path'.\n\
1520Returns number of bytes read. Raises SSLError if connection to EGD\n\
1521fails or if it does provide enough data to seed PRNG.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001522
1523#endif
1524
Bill Janssen40a0f662008-08-12 16:56:25 +00001525
1526
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001527/* List of functions exported by this module. */
1528
1529static PyMethodDef PySSL_methods[] = {
Thomas Woutersed03b412007-08-28 21:37:11 +00001530 {"sslwrap", PySSL_sslwrap,
1531 METH_VARARGS, ssl_doc},
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001532 {"_test_decode_cert", PySSL_test_decode_certificate,
1533 METH_VARARGS},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001534#ifdef HAVE_OPENSSL_RAND
Thomas Woutersed03b412007-08-28 21:37:11 +00001535 {"RAND_add", PySSL_RAND_add, METH_VARARGS,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001536 PySSL_RAND_add_doc},
1537 {"RAND_egd", PySSL_RAND_egd, METH_O,
1538 PySSL_RAND_egd_doc},
1539 {"RAND_status", (PyCFunction)PySSL_RAND_status, METH_NOARGS,
1540 PySSL_RAND_status_doc},
1541#endif
Thomas Woutersed03b412007-08-28 21:37:11 +00001542 {NULL, NULL} /* Sentinel */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001543};
1544
1545
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001546#ifdef WITH_THREAD
1547
1548/* an implementation of OpenSSL threading operations in terms
1549 of the Python C thread library */
1550
1551static PyThread_type_lock *_ssl_locks = NULL;
1552
1553static unsigned long _ssl_thread_id_function (void) {
1554 return PyThread_get_thread_ident();
1555}
1556
Bill Janssen6e027db2007-11-15 22:23:56 +00001557static void _ssl_thread_locking_function
1558 (int mode, int n, const char *file, int line) {
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001559 /* this function is needed to perform locking on shared data
1560 structures. (Note that OpenSSL uses a number of global data
Bill Janssen6e027db2007-11-15 22:23:56 +00001561 structures that will be implicitly shared whenever multiple
1562 threads use OpenSSL.) Multi-threaded applications will
1563 crash at random if it is not set.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001564
Bill Janssen6e027db2007-11-15 22:23:56 +00001565 locking_function() must be able to handle up to
1566 CRYPTO_num_locks() different mutex locks. It sets the n-th
1567 lock if mode & CRYPTO_LOCK, and releases it otherwise.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001568
1569 file and line are the file number of the function setting the
1570 lock. They can be useful for debugging.
1571 */
1572
1573 if ((_ssl_locks == NULL) ||
Christian Heimesba4af492008-03-28 00:55:15 +00001574 (n < 0) || ((unsigned)n >= _ssl_locks_count))
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001575 return;
1576
1577 if (mode & CRYPTO_LOCK) {
1578 PyThread_acquire_lock(_ssl_locks[n], 1);
1579 } else {
1580 PyThread_release_lock(_ssl_locks[n]);
1581 }
1582}
1583
1584static int _setup_ssl_threads(void) {
1585
Christian Heimesba4af492008-03-28 00:55:15 +00001586 unsigned int i;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001587
1588 if (_ssl_locks == NULL) {
1589 _ssl_locks_count = CRYPTO_num_locks();
1590 _ssl_locks = (PyThread_type_lock *)
1591 malloc(sizeof(PyThread_type_lock) * _ssl_locks_count);
1592 if (_ssl_locks == NULL)
1593 return 0;
Bill Janssen6e027db2007-11-15 22:23:56 +00001594 memset(_ssl_locks, 0,
1595 sizeof(PyThread_type_lock) * _ssl_locks_count);
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001596 for (i = 0; i < _ssl_locks_count; i++) {
1597 _ssl_locks[i] = PyThread_allocate_lock();
1598 if (_ssl_locks[i] == NULL) {
Raymond Hettinger26dd7602009-01-26 16:53:29 +00001599 unsigned int j;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001600 for (j = 0; j < i; j++) {
1601 PyThread_free_lock(_ssl_locks[j]);
1602 }
1603 free(_ssl_locks);
1604 return 0;
1605 }
1606 }
1607 CRYPTO_set_locking_callback(_ssl_thread_locking_function);
1608 CRYPTO_set_id_callback(_ssl_thread_id_function);
1609 }
1610 return 1;
1611}
1612
1613#endif /* def HAVE_THREAD */
1614
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001615PyDoc_STRVAR(module_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001616"Implementation module for SSL socket operations. See the socket module\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001617for documentation.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001618
Martin v. Löwis1a214512008-06-11 05:26:20 +00001619
1620static struct PyModuleDef _sslmodule = {
1621 PyModuleDef_HEAD_INIT,
1622 "_ssl",
1623 module_doc,
1624 -1,
1625 PySSL_methods,
1626 NULL,
1627 NULL,
1628 NULL,
1629 NULL
1630};
1631
Mark Hammondfe51c6d2002-08-02 02:27:13 +00001632PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00001633PyInit__ssl(void)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001634{
1635 PyObject *m, *d;
Benjamin Petersonb173f782009-05-05 22:31:58 +00001636 PySocketModule_APIObject *socket_api;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001637
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +00001638 if (PyType_Ready(&PySSL_Type) < 0)
1639 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001640
Martin v. Löwis1a214512008-06-11 05:26:20 +00001641 m = PyModule_Create(&_sslmodule);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00001642 if (m == NULL)
Martin v. Löwis1a214512008-06-11 05:26:20 +00001643 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001644 d = PyModule_GetDict(m);
1645
1646 /* Load _socket module and its C API */
Benjamin Petersonb173f782009-05-05 22:31:58 +00001647 socket_api = PySocketModule_ImportModuleAndAPI();
1648 if (!socket_api)
Martin v. Löwis1a214512008-06-11 05:26:20 +00001649 return NULL;
Benjamin Petersonb173f782009-05-05 22:31:58 +00001650 PySocketModule = *socket_api;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001651
1652 /* Init OpenSSL */
1653 SSL_load_error_strings();
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001654#ifdef WITH_THREAD
1655 /* note that this will start threading if not already started */
1656 if (!_setup_ssl_threads()) {
Martin v. Löwis1a214512008-06-11 05:26:20 +00001657 return NULL;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001658 }
1659#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001660 SSLeay_add_ssl_algorithms();
1661
1662 /* Add symbols to module dict */
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001663 PySSLErrorObject = PyErr_NewException("ssl.SSLError",
Thomas Woutersed03b412007-08-28 21:37:11 +00001664 PySocketModule.error,
1665 NULL);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001666 if (PySSLErrorObject == NULL)
Martin v. Löwis1a214512008-06-11 05:26:20 +00001667 return NULL;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001668 if (PyDict_SetItemString(d, "SSLError", PySSLErrorObject) != 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00001669 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001670 if (PyDict_SetItemString(d, "SSLType",
1671 (PyObject *)&PySSL_Type) != 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00001672 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001673 PyModule_AddIntConstant(m, "SSL_ERROR_ZERO_RETURN",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001674 PY_SSL_ERROR_ZERO_RETURN);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001675 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_READ",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001676 PY_SSL_ERROR_WANT_READ);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001677 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_WRITE",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001678 PY_SSL_ERROR_WANT_WRITE);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001679 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_X509_LOOKUP",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001680 PY_SSL_ERROR_WANT_X509_LOOKUP);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001681 PyModule_AddIntConstant(m, "SSL_ERROR_SYSCALL",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001682 PY_SSL_ERROR_SYSCALL);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001683 PyModule_AddIntConstant(m, "SSL_ERROR_SSL",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001684 PY_SSL_ERROR_SSL);
1685 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_CONNECT",
1686 PY_SSL_ERROR_WANT_CONNECT);
1687 /* non ssl.h errorcodes */
1688 PyModule_AddIntConstant(m, "SSL_ERROR_EOF",
1689 PY_SSL_ERROR_EOF);
1690 PyModule_AddIntConstant(m, "SSL_ERROR_INVALID_ERROR_CODE",
1691 PY_SSL_ERROR_INVALID_ERROR_CODE);
Thomas Woutersed03b412007-08-28 21:37:11 +00001692 /* cert requirements */
1693 PyModule_AddIntConstant(m, "CERT_NONE",
1694 PY_SSL_CERT_NONE);
1695 PyModule_AddIntConstant(m, "CERT_OPTIONAL",
1696 PY_SSL_CERT_OPTIONAL);
1697 PyModule_AddIntConstant(m, "CERT_REQUIRED",
1698 PY_SSL_CERT_REQUIRED);
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001699
Thomas Woutersed03b412007-08-28 21:37:11 +00001700 /* protocol versions */
1701 PyModule_AddIntConstant(m, "PROTOCOL_SSLv2",
1702 PY_SSL_VERSION_SSL2);
1703 PyModule_AddIntConstant(m, "PROTOCOL_SSLv3",
1704 PY_SSL_VERSION_SSL3);
1705 PyModule_AddIntConstant(m, "PROTOCOL_SSLv23",
1706 PY_SSL_VERSION_SSL23);
1707 PyModule_AddIntConstant(m, "PROTOCOL_TLSv1",
1708 PY_SSL_VERSION_TLS1);
Martin v. Löwis1a214512008-06-11 05:26:20 +00001709 return m;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001710}