blob: 44f9386607bd9ddcdeacc2e646413b39b64f9c4d [file] [log] [blame]
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001/* SSL socket module
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002
3 SSL support based on patches by Brian E Gallew and Laszlo Kovacs.
Bill Janssen98d19da2007-09-10 21:51:02 +00004 Re-worked a bit by Bill Janssen to add server-side support and
Bill Janssen934b16d2008-06-28 22:19:33 +00005 certificate decoding. Chris Stawarz contributed some non-blocking
6 patches.
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00007
Bill Janssen98d19da2007-09-10 21:51:02 +00008 This module is imported by ssl.py. It should *not* be used
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00009 directly.
10
Bill Janssen98d19da2007-09-10 21:51:02 +000011 XXX should partial writes be enabled, SSL_MODE_ENABLE_PARTIAL_WRITE?
Antoine Pitroua5c4b552010-04-22 23:33:02 +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"
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +000018
Bill Janssen98d19da2007-09-10 21:51:02 +000019#ifdef WITH_THREAD
20#include "pythread.h"
21#define PySSL_BEGIN_ALLOW_THREADS { \
Neal Norwitze9057ff2008-01-27 17:10:35 +000022 PyThreadState *_save = NULL; \
Bill Janssen98d19da2007-09-10 21:51:02 +000023 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 }
28
29#else /* no WITH_THREAD */
30
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 {
39 /* these mirror ssl.h */
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +000040 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,
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +000045 PY_SSL_ERROR_SYSCALL, /* look at error stack/return value/errno */
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +000046 PY_SSL_ERROR_ZERO_RETURN,
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +000047 PY_SSL_ERROR_WANT_CONNECT,
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +000048 /* start of non ssl.h errorcodes */
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +000049 PY_SSL_ERROR_EOF, /* special case of SSL_ERROR_SYSCALL */
50 PY_SSL_ERROR_INVALID_ERROR_CODE
51};
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000052
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +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,
Antoine Pitrou1dc6b082010-04-27 19:09:59 +000068 PY_SSL_VERSION_TLS1
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +000069};
70
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000071/* Include symbols from _socket module */
72#include "socketmodule.h"
73
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +000074#if defined(HAVE_POLL_H)
Anthony Baxter93ab5fa2006-07-11 02:04:09 +000075#include <poll.h>
76#elif defined(HAVE_SYS_POLL_H)
77#include <sys/poll.h>
78#endif
79
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000080/* Include OpenSSL header files */
81#include "openssl/rsa.h"
82#include "openssl/crypto.h"
83#include "openssl/x509.h"
Bill Janssen98d19da2007-09-10 21:51:02 +000084#include "openssl/x509v3.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000085#include "openssl/pem.h"
86#include "openssl/ssl.h"
87#include "openssl/err.h"
88#include "openssl/rand.h"
89
90/* SSL error object */
91static PyObject *PySSLErrorObject;
92
Bill Janssen98d19da2007-09-10 21:51:02 +000093#ifdef WITH_THREAD
94
95/* serves as a flag to see whether we've initialized the SSL thread support. */
96/* 0 means no, greater than 0 means yes */
97
98static unsigned int _ssl_locks_count = 0;
99
100#endif /* def WITH_THREAD */
101
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000102/* SSL socket object */
103
104#define X509_NAME_MAXLEN 256
105
106/* RAND_* APIs got added to OpenSSL in 0.9.5 */
107#if OPENSSL_VERSION_NUMBER >= 0x0090500fL
108# define HAVE_OPENSSL_RAND 1
109#else
110# undef HAVE_OPENSSL_RAND
111#endif
112
113typedef struct {
114 PyObject_HEAD
115 PySocketSockObject *Socket; /* Socket on which we're layered */
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000116 SSL_CTX* ctx;
117 SSL* ssl;
118 X509* peer_cert;
119 char server[X509_NAME_MAXLEN];
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000120 char issuer[X509_NAME_MAXLEN];
Antoine Pitroua5c4b552010-04-22 23:33:02 +0000121 int shutdown_seen_zero;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000122
123} PySSLObject;
124
Jeremy Hylton938ace62002-07-17 16:30:39 +0000125static PyTypeObject PySSL_Type;
126static PyObject *PySSL_SSLwrite(PySSLObject *self, PyObject *args);
127static PyObject *PySSL_SSLread(PySSLObject *self, PyObject *args);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000128static int check_socket_and_wait_for_timeout(PySocketSockObject *s,
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +0000129 int writing);
Bill Janssen98d19da2007-09-10 21:51:02 +0000130static PyObject *PySSL_peercert(PySSLObject *self, PyObject *args);
131static PyObject *PySSL_cipher(PySSLObject *self);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000132
Christian Heimese93237d2007-12-19 02:37:44 +0000133#define PySSLObject_Check(v) (Py_TYPE(v) == &PySSL_Type)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000134
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +0000135typedef enum {
136 SOCKET_IS_NONBLOCKING,
137 SOCKET_IS_BLOCKING,
138 SOCKET_HAS_TIMED_OUT,
139 SOCKET_HAS_BEEN_CLOSED,
Neal Norwitz389cea82006-02-13 00:35:21 +0000140 SOCKET_TOO_LARGE_FOR_SELECT,
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +0000141 SOCKET_OPERATION_OK
142} timeout_state;
143
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000144/* Wrap error strings with filename and line # */
145#define STRINGIFY1(x) #x
146#define STRINGIFY2(x) STRINGIFY1(x)
147#define ERRSTR1(x,y,z) (x ":" y ": " z)
148#define ERRSTR(x) ERRSTR1("_ssl.c", STRINGIFY2(__LINE__), x)
149
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000150/* XXX It might be helpful to augment the error message generated
151 below with the name of the SSL function that generated the error.
152 I expect it's obvious most of the time.
153*/
154
155static PyObject *
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000156PySSL_SetError(PySSLObject *obj, int ret, char *filename, int lineno)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000157{
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000158 PyObject *v;
Neal Norwitz049da9e2007-08-25 16:41:36 +0000159 char buf[2048];
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000160 char *errstr;
161 int err;
Guido van Rossum780b80d2007-08-27 18:42:23 +0000162 enum py_ssl_error p = PY_SSL_ERROR_NONE;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000163
164 assert(ret <= 0);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000165
Bill Janssen98d19da2007-09-10 21:51:02 +0000166 if (obj->ssl != NULL) {
Guido van Rossum780b80d2007-08-27 18:42:23 +0000167 err = SSL_get_error(obj->ssl, ret);
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +0000168
Guido van Rossum780b80d2007-08-27 18:42:23 +0000169 switch (err) {
170 case SSL_ERROR_ZERO_RETURN:
171 errstr = "TLS/SSL connection has been closed";
172 p = PY_SSL_ERROR_ZERO_RETURN;
173 break;
174 case SSL_ERROR_WANT_READ:
175 errstr = "The operation did not complete (read)";
176 p = PY_SSL_ERROR_WANT_READ;
177 break;
178 case SSL_ERROR_WANT_WRITE:
179 p = PY_SSL_ERROR_WANT_WRITE;
180 errstr = "The operation did not complete (write)";
181 break;
182 case SSL_ERROR_WANT_X509_LOOKUP:
183 p = PY_SSL_ERROR_WANT_X509_LOOKUP;
184 errstr =
185 "The operation did not complete (X509 lookup)";
186 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 if (ret == 0 || !obj->Socket) {
196 p = PY_SSL_ERROR_EOF;
197 errstr =
198 "EOF occurred in violation of protocol";
199 } else if (ret == -1) {
200 /* underlying BIO reported an I/O error */
201 return obj->Socket->errorhandler();
202 } else { /* possible? */
203 p = PY_SSL_ERROR_SYSCALL;
204 errstr = "Some I/O error occurred";
205 }
206 } else {
Jeremy Hylton4e547302002-07-02 18:25:00 +0000207 p = PY_SSL_ERROR_SYSCALL;
Guido van Rossum780b80d2007-08-27 18:42:23 +0000208 /* XXX Protected by global interpreter lock */
209 errstr = ERR_error_string(e, NULL);
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +0000210 }
Guido van Rossum780b80d2007-08-27 18:42:23 +0000211 break;
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +0000212 }
Guido van Rossum780b80d2007-08-27 18:42:23 +0000213 case SSL_ERROR_SSL:
214 {
215 unsigned long e = ERR_get_error();
216 p = PY_SSL_ERROR_SSL;
217 if (e != 0)
218 /* XXX Protected by global interpreter lock */
219 errstr = ERR_error_string(e, NULL);
220 else { /* possible? */
221 errstr =
222 "A failure in the SSL library occurred";
223 }
224 break;
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +0000225 }
Guido van Rossum780b80d2007-08-27 18:42:23 +0000226 default:
227 p = PY_SSL_ERROR_INVALID_ERROR_CODE;
228 errstr = "Invalid error code";
229 }
230 } else {
231 errstr = ERR_error_string(ERR_peek_last_error(), NULL);
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +0000232 }
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000233 PyOS_snprintf(buf, sizeof(buf), "_ssl.c:%d: %s", lineno, errstr);
234 v = Py_BuildValue("(is)", p, buf);
235 if (v != NULL) {
236 PyErr_SetObject(PySSLErrorObject, v);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000237 Py_DECREF(v);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000238 }
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000239 return NULL;
240}
241
Bill Janssen98d19da2007-09-10 21:51:02 +0000242static PyObject *
243_setSSLError (char *errstr, int errcode, char *filename, int lineno) {
244
245 char buf[2048];
246 PyObject *v;
247
248 if (errstr == NULL) {
249 errcode = ERR_peek_last_error();
250 errstr = ERR_error_string(errcode, NULL);
251 }
252 PyOS_snprintf(buf, sizeof(buf), "_ssl.c:%d: %s", lineno, errstr);
253 v = Py_BuildValue("(is)", errcode, buf);
254 if (v != NULL) {
255 PyErr_SetObject(PySSLErrorObject, v);
256 Py_DECREF(v);
257 }
258 return NULL;
259}
260
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000261static PySSLObject *
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000262newPySSLObject(PySocketSockObject *Sock, char *key_file, char *cert_file,
263 enum py_ssl_server_or_client socket_type,
264 enum py_ssl_cert_requirements certreq,
265 enum py_ssl_version proto_version,
Antoine Pitrou0a6373c2010-04-17 17:10:38 +0000266 char *cacerts_file, char *ciphers)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000267{
268 PySSLObject *self;
269 char *errstr = NULL;
270 int ret;
Neal Norwitz049da9e2007-08-25 16:41:36 +0000271 int verification_mode;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000272
273 self = PyObject_New(PySSLObject, &PySSL_Type); /* Create new object */
Neal Norwitz38e3b7d2006-05-11 07:51:59 +0000274 if (self == NULL)
Neal Norwitzc6a989a2006-05-10 06:57:58 +0000275 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000276 memset(self->server, '\0', sizeof(char) * X509_NAME_MAXLEN);
277 memset(self->issuer, '\0', sizeof(char) * X509_NAME_MAXLEN);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000278 self->peer_cert = NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000279 self->ssl = NULL;
280 self->ctx = NULL;
281 self->Socket = NULL;
282
Bill Janssen98d19da2007-09-10 21:51:02 +0000283 /* Make sure the SSL error state is initialized */
284 (void) ERR_get_state();
285 ERR_clear_error();
286
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000287 if ((key_file && !cert_file) || (!key_file && cert_file)) {
Guido van Rossum780b80d2007-08-27 18:42:23 +0000288 errstr = ERRSTR("Both the key & certificate files "
289 "must be specified");
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000290 goto fail;
291 }
292
293 if ((socket_type == PY_SSL_SERVER) &&
294 ((key_file == NULL) || (cert_file == NULL))) {
Guido van Rossum780b80d2007-08-27 18:42:23 +0000295 errstr = ERRSTR("Both the key & certificate files "
296 "must be specified for server-side operation");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000297 goto fail;
298 }
299
Bill Janssen98d19da2007-09-10 21:51:02 +0000300 PySSL_BEGIN_ALLOW_THREADS
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000301 if (proto_version == PY_SSL_VERSION_TLS1)
302 self->ctx = SSL_CTX_new(TLSv1_method()); /* Set up context */
303 else if (proto_version == PY_SSL_VERSION_SSL3)
304 self->ctx = SSL_CTX_new(SSLv3_method()); /* Set up context */
305 else if (proto_version == PY_SSL_VERSION_SSL2)
306 self->ctx = SSL_CTX_new(SSLv2_method()); /* Set up context */
Bill Janssen98d19da2007-09-10 21:51:02 +0000307 else if (proto_version == PY_SSL_VERSION_SSL23)
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000308 self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */
Bill Janssen98d19da2007-09-10 21:51:02 +0000309 PySSL_END_ALLOW_THREADS
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000310
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000311 if (self->ctx == NULL) {
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000312 errstr = ERRSTR("Invalid SSL protocol variant specified.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000313 goto fail;
314 }
315
Antoine Pitrou0a6373c2010-04-17 17:10:38 +0000316 if (ciphers != NULL) {
317 ret = SSL_CTX_set_cipher_list(self->ctx, ciphers);
318 if (ret == 0) {
319 errstr = ERRSTR("No cipher can be selected.");
320 goto fail;
321 }
322 }
323
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000324 if (certreq != PY_SSL_CERT_NONE) {
325 if (cacerts_file == NULL) {
Guido van Rossum780b80d2007-08-27 18:42:23 +0000326 errstr = ERRSTR("No root certificates specified for "
327 "verification of other-side certificates.");
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000328 goto fail;
329 } else {
Bill Janssen98d19da2007-09-10 21:51:02 +0000330 PySSL_BEGIN_ALLOW_THREADS
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000331 ret = SSL_CTX_load_verify_locations(self->ctx,
Guido van Rossum780b80d2007-08-27 18:42:23 +0000332 cacerts_file,
333 NULL);
Bill Janssen98d19da2007-09-10 21:51:02 +0000334 PySSL_END_ALLOW_THREADS
Guido van Rossum780b80d2007-08-27 18:42:23 +0000335 if (ret != 1) {
Bill Janssen98d19da2007-09-10 21:51:02 +0000336 _setSSLError(NULL, 0, __FILE__, __LINE__);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000337 goto fail;
338 }
339 }
340 }
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000341 if (key_file) {
Bill Janssen98d19da2007-09-10 21:51:02 +0000342 PySSL_BEGIN_ALLOW_THREADS
Martin v. Löwis09c35f72002-07-28 09:57:45 +0000343 ret = SSL_CTX_use_PrivateKey_file(self->ctx, key_file,
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000344 SSL_FILETYPE_PEM);
Bill Janssen98d19da2007-09-10 21:51:02 +0000345 PySSL_END_ALLOW_THREADS
Guido van Rossum780b80d2007-08-27 18:42:23 +0000346 if (ret != 1) {
Bill Janssen98d19da2007-09-10 21:51:02 +0000347 _setSSLError(NULL, ret, __FILE__, __LINE__);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000348 goto fail;
349 }
350
Bill Janssen98d19da2007-09-10 21:51:02 +0000351 PySSL_BEGIN_ALLOW_THREADS
Martin v. Löwis09c35f72002-07-28 09:57:45 +0000352 ret = SSL_CTX_use_certificate_chain_file(self->ctx,
Bill Janssen98d19da2007-09-10 21:51:02 +0000353 cert_file);
354 PySSL_END_ALLOW_THREADS
Guido van Rossum780b80d2007-08-27 18:42:23 +0000355 if (ret != 1) {
Bill Janssen98d19da2007-09-10 21:51:02 +0000356 /*
357 fprintf(stderr, "ret is %d, errcode is %lu, %lu, with file \"%s\"\n",
358 ret, ERR_peek_error(), ERR_peek_last_error(), cert_file);
359 */
360 if (ERR_peek_last_error() != 0) {
361 _setSSLError(NULL, ret, __FILE__, __LINE__);
362 goto fail;
363 }
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000364 }
365 }
366
Bill Janssen98d19da2007-09-10 21:51:02 +0000367 /* ssl compatibility */
368 SSL_CTX_set_options(self->ctx, SSL_OP_ALL);
369
Neal Norwitz049da9e2007-08-25 16:41:36 +0000370 verification_mode = SSL_VERIFY_NONE;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000371 if (certreq == PY_SSL_CERT_OPTIONAL)
372 verification_mode = SSL_VERIFY_PEER;
373 else if (certreq == PY_SSL_CERT_REQUIRED)
374 verification_mode = (SSL_VERIFY_PEER |
375 SSL_VERIFY_FAIL_IF_NO_PEER_CERT);
376 SSL_CTX_set_verify(self->ctx, verification_mode,
377 NULL); /* set verify lvl */
378
Bill Janssen98d19da2007-09-10 21:51:02 +0000379 PySSL_BEGIN_ALLOW_THREADS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000380 self->ssl = SSL_new(self->ctx); /* New ssl struct */
Bill Janssen98d19da2007-09-10 21:51:02 +0000381 PySSL_END_ALLOW_THREADS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000382 SSL_set_fd(self->ssl, Sock->sock_fd); /* Set the socket for SSL */
Antoine Pitrou92719c52010-04-09 20:38:39 +0000383#ifdef SSL_MODE_AUTO_RETRY
Antoine Pitroueee91cd2010-03-26 19:27:16 +0000384 SSL_set_mode(self->ssl, SSL_MODE_AUTO_RETRY);
Antoine Pitrou92719c52010-04-09 20:38:39 +0000385#endif
Guido van Rossum4f707ac2003-01-31 18:13:18 +0000386
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000387 /* If the socket is in non-blocking mode or timeout mode, set the BIO
Guido van Rossum4f707ac2003-01-31 18:13:18 +0000388 * to non-blocking mode (blocking is the default)
389 */
390 if (Sock->sock_timeout >= 0.0) {
391 /* Set both the read and write BIO's to non-blocking mode */
392 BIO_set_nbio(SSL_get_rbio(self->ssl), 1);
393 BIO_set_nbio(SSL_get_wbio(self->ssl), 1);
394 }
395
Bill Janssen98d19da2007-09-10 21:51:02 +0000396 PySSL_BEGIN_ALLOW_THREADS
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000397 if (socket_type == PY_SSL_CLIENT)
398 SSL_set_connect_state(self->ssl);
399 else
400 SSL_set_accept_state(self->ssl);
Bill Janssen98d19da2007-09-10 21:51:02 +0000401 PySSL_END_ALLOW_THREADS
Martin v. Löwis09c35f72002-07-28 09:57:45 +0000402
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000403 self->Socket = Sock;
404 Py_INCREF(self->Socket);
405 return self;
406 fail:
407 if (errstr)
408 PyErr_SetString(PySSLErrorObject, errstr);
409 Py_DECREF(self);
410 return NULL;
411}
412
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000413static PyObject *
Guido van Rossum780b80d2007-08-27 18:42:23 +0000414PySSL_sslwrap(PyObject *self, PyObject *args)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000415{
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000416 PySocketSockObject *Sock;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000417 int server_side = 0;
418 int verification_mode = PY_SSL_CERT_NONE;
419 int protocol = PY_SSL_VERSION_SSL23;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000420 char *key_file = NULL;
421 char *cert_file = NULL;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000422 char *cacerts_file = NULL;
Antoine Pitrou0a6373c2010-04-17 17:10:38 +0000423 char *ciphers = NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000424
Antoine Pitrou0a6373c2010-04-17 17:10:38 +0000425 if (!PyArg_ParseTuple(args, "O!i|zziizz:sslwrap",
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000426 PySocketModule.Sock_Type,
Martin v. Löwisa811c382006-10-19 11:00:37 +0000427 &Sock,
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000428 &server_side,
429 &key_file, &cert_file,
430 &verification_mode, &protocol,
Antoine Pitrou0a6373c2010-04-17 17:10:38 +0000431 &cacerts_file, &ciphers))
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000432 return NULL;
433
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000434 /*
435 fprintf(stderr,
436 "server_side is %d, keyfile %p, certfile %p, verify_mode %d, "
437 "protocol %d, certs %p\n",
438 server_side, key_file, cert_file, verification_mode,
439 protocol, cacerts_file);
440 */
441
442 return (PyObject *) newPySSLObject(Sock, key_file, cert_file,
443 server_side, verification_mode,
Antoine Pitrou0a6373c2010-04-17 17:10:38 +0000444 protocol, cacerts_file,
445 ciphers);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000446}
447
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000448PyDoc_STRVAR(ssl_doc,
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000449"sslwrap(socket, server_side, [keyfile, certfile, certs_mode, protocol,\n"
Antoine Pitrou0a6373c2010-04-17 17:10:38 +0000450" cacertsfile, ciphers]) -> sslobject");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000451
452/* SSL object methods */
453
Bill Janssen934b16d2008-06-28 22:19:33 +0000454static PyObject *PySSL_SSLdo_handshake(PySSLObject *self)
455{
456 int ret;
457 int err;
Antoine Pitrou4d3e3722010-04-24 19:57:01 +0000458 int sockstate, nonblocking;
459
460 /* just in case the blocking state of the socket has been changed */
461 nonblocking = (self->Socket->sock_timeout >= 0.0);
462 BIO_set_nbio(SSL_get_rbio(self->ssl), nonblocking);
463 BIO_set_nbio(SSL_get_wbio(self->ssl), nonblocking);
Bill Janssen934b16d2008-06-28 22:19:33 +0000464
465 /* Actually negotiate SSL connection */
466 /* XXX If SSL_do_handshake() returns 0, it's also a failure. */
Bill Janssen934b16d2008-06-28 22:19:33 +0000467 do {
468 PySSL_BEGIN_ALLOW_THREADS
469 ret = SSL_do_handshake(self->ssl);
470 err = SSL_get_error(self->ssl, ret);
471 PySSL_END_ALLOW_THREADS
472 if(PyErr_CheckSignals()) {
473 return NULL;
474 }
475 if (err == SSL_ERROR_WANT_READ) {
476 sockstate = check_socket_and_wait_for_timeout(self->Socket, 0);
477 } else if (err == SSL_ERROR_WANT_WRITE) {
478 sockstate = check_socket_and_wait_for_timeout(self->Socket, 1);
479 } else {
480 sockstate = SOCKET_OPERATION_OK;
481 }
482 if (sockstate == SOCKET_HAS_TIMED_OUT) {
483 PyErr_SetString(PySSLErrorObject,
484 ERRSTR("The handshake operation timed out"));
485 return NULL;
486 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
487 PyErr_SetString(PySSLErrorObject,
488 ERRSTR("Underlying socket has been closed."));
489 return NULL;
490 } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
491 PyErr_SetString(PySSLErrorObject,
492 ERRSTR("Underlying socket too large for select()."));
493 return NULL;
494 } else if (sockstate == SOCKET_IS_NONBLOCKING) {
495 break;
496 }
497 } while (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE);
498 if (ret < 1)
499 return PySSL_SetError(self, ret, __FILE__, __LINE__);
500 self->ssl->debug = 1;
501
502 if (self->peer_cert)
503 X509_free (self->peer_cert);
504 PySSL_BEGIN_ALLOW_THREADS
505 if ((self->peer_cert = SSL_get_peer_certificate(self->ssl))) {
506 X509_NAME_oneline(X509_get_subject_name(self->peer_cert),
507 self->server, X509_NAME_MAXLEN);
508 X509_NAME_oneline(X509_get_issuer_name(self->peer_cert),
509 self->issuer, X509_NAME_MAXLEN);
510 }
511 PySSL_END_ALLOW_THREADS
512
513 Py_INCREF(Py_None);
514 return Py_None;
515}
516
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000517static PyObject *
518PySSL_server(PySSLObject *self)
519{
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000520 return PyString_FromString(self->server);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000521}
522
523static PyObject *
524PySSL_issuer(PySSLObject *self)
525{
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000526 return PyString_FromString(self->issuer);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000527}
528
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000529static PyObject *
Bill Janssen98d19da2007-09-10 21:51:02 +0000530_create_tuple_for_attribute (ASN1_OBJECT *name, ASN1_STRING *value) {
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000531
Bill Janssen98d19da2007-09-10 21:51:02 +0000532 char namebuf[X509_NAME_MAXLEN];
533 int buflen;
534 PyObject *name_obj;
535 PyObject *value_obj;
536 PyObject *attr;
537 unsigned char *valuebuf = NULL;
Guido van Rossum780b80d2007-08-27 18:42:23 +0000538
Bill Janssen98d19da2007-09-10 21:51:02 +0000539 buflen = OBJ_obj2txt(namebuf, sizeof(namebuf), name, 0);
540 if (buflen < 0) {
541 _setSSLError(NULL, 0, __FILE__, __LINE__);
542 goto fail;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000543 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000544 name_obj = PyString_FromStringAndSize(namebuf, buflen);
Bill Janssen98d19da2007-09-10 21:51:02 +0000545 if (name_obj == NULL)
546 goto fail;
547
548 buflen = ASN1_STRING_to_UTF8(&valuebuf, value);
549 if (buflen < 0) {
550 _setSSLError(NULL, 0, __FILE__, __LINE__);
551 Py_DECREF(name_obj);
552 goto fail;
553 }
554 value_obj = PyUnicode_DecodeUTF8((char *) valuebuf,
555 buflen, "strict");
556 OPENSSL_free(valuebuf);
557 if (value_obj == NULL) {
558 Py_DECREF(name_obj);
559 goto fail;
560 }
561 attr = PyTuple_New(2);
562 if (attr == NULL) {
563 Py_DECREF(name_obj);
564 Py_DECREF(value_obj);
565 goto fail;
566 }
567 PyTuple_SET_ITEM(attr, 0, name_obj);
568 PyTuple_SET_ITEM(attr, 1, value_obj);
569 return attr;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000570
Bill Janssen98d19da2007-09-10 21:51:02 +0000571 fail:
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000572 return NULL;
573}
574
575static PyObject *
Bill Janssen98d19da2007-09-10 21:51:02 +0000576_create_tuple_for_X509_NAME (X509_NAME *xname)
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000577{
Bill Janssen98d19da2007-09-10 21:51:02 +0000578 PyObject *dn = NULL; /* tuple which represents the "distinguished name" */
579 PyObject *rdn = NULL; /* tuple to hold a "relative distinguished name" */
580 PyObject *rdnt;
581 PyObject *attr = NULL; /* tuple to hold an attribute */
582 int entry_count = X509_NAME_entry_count(xname);
583 X509_NAME_ENTRY *entry;
584 ASN1_OBJECT *name;
585 ASN1_STRING *value;
586 int index_counter;
587 int rdn_level = -1;
588 int retcode;
589
590 dn = PyList_New(0);
591 if (dn == NULL)
592 return NULL;
593 /* now create another tuple to hold the top-level RDN */
594 rdn = PyList_New(0);
595 if (rdn == NULL)
596 goto fail0;
597
598 for (index_counter = 0;
599 index_counter < entry_count;
600 index_counter++)
601 {
602 entry = X509_NAME_get_entry(xname, index_counter);
603
604 /* check to see if we've gotten to a new RDN */
605 if (rdn_level >= 0) {
606 if (rdn_level != entry->set) {
607 /* yes, new RDN */
608 /* add old RDN to DN */
609 rdnt = PyList_AsTuple(rdn);
610 Py_DECREF(rdn);
611 if (rdnt == NULL)
612 goto fail0;
613 retcode = PyList_Append(dn, rdnt);
614 Py_DECREF(rdnt);
615 if (retcode < 0)
616 goto fail0;
617 /* create new RDN */
618 rdn = PyList_New(0);
619 if (rdn == NULL)
620 goto fail0;
621 }
622 }
623 rdn_level = entry->set;
624
625 /* now add this attribute to the current RDN */
626 name = X509_NAME_ENTRY_get_object(entry);
627 value = X509_NAME_ENTRY_get_data(entry);
628 attr = _create_tuple_for_attribute(name, value);
629 /*
630 fprintf(stderr, "RDN level %d, attribute %s: %s\n",
631 entry->set,
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000632 PyString_AS_STRING(PyTuple_GET_ITEM(attr, 0)),
633 PyString_AS_STRING(PyTuple_GET_ITEM(attr, 1)));
Bill Janssen98d19da2007-09-10 21:51:02 +0000634 */
635 if (attr == NULL)
636 goto fail1;
637 retcode = PyList_Append(rdn, attr);
638 Py_DECREF(attr);
639 if (retcode < 0)
640 goto fail1;
641 }
642 /* now, there's typically a dangling RDN */
643 if ((rdn != NULL) && (PyList_Size(rdn) > 0)) {
644 rdnt = PyList_AsTuple(rdn);
645 Py_DECREF(rdn);
646 if (rdnt == NULL)
647 goto fail0;
648 retcode = PyList_Append(dn, rdnt);
649 Py_DECREF(rdnt);
650 if (retcode < 0)
651 goto fail0;
652 }
653
654 /* convert list to tuple */
655 rdnt = PyList_AsTuple(dn);
656 Py_DECREF(dn);
657 if (rdnt == NULL)
658 return NULL;
659 return rdnt;
660
661 fail1:
662 Py_XDECREF(rdn);
663
664 fail0:
665 Py_XDECREF(dn);
666 return NULL;
667}
668
669static PyObject *
670_get_peer_alt_names (X509 *certificate) {
671
672 /* this code follows the procedure outlined in
673 OpenSSL's crypto/x509v3/v3_prn.c:X509v3_EXT_print()
674 function to extract the STACK_OF(GENERAL_NAME),
675 then iterates through the stack to add the
676 names. */
677
678 int i, j;
679 PyObject *peer_alt_names = Py_None;
680 PyObject *v, *t;
681 X509_EXTENSION *ext = NULL;
682 GENERAL_NAMES *names = NULL;
683 GENERAL_NAME *name;
684 X509V3_EXT_METHOD *method;
685 BIO *biobuf = NULL;
686 char buf[2048];
687 char *vptr;
688 int len;
Victor Stinner3f75cc52010-03-02 22:44:42 +0000689 /* Issue #2973: ASN1_item_d2i() API changed in OpenSSL 0.9.6m */
690#if OPENSSL_VERSION_NUMBER >= 0x009060dfL
691 const unsigned char *p;
692#else
Jeffrey Yasskin7937d932009-05-29 03:44:31 +0000693 unsigned char *p;
Victor Stinner3f75cc52010-03-02 22:44:42 +0000694#endif
Bill Janssen98d19da2007-09-10 21:51:02 +0000695
696 if (certificate == NULL)
697 return peer_alt_names;
698
699 /* get a memory buffer */
700 biobuf = BIO_new(BIO_s_mem());
701
702 i = 0;
703 while ((i = X509_get_ext_by_NID(
704 certificate, NID_subject_alt_name, i)) >= 0) {
705
706 if (peer_alt_names == Py_None) {
707 peer_alt_names = PyList_New(0);
708 if (peer_alt_names == NULL)
709 goto fail;
710 }
711
712 /* now decode the altName */
713 ext = X509_get_ext(certificate, i);
714 if(!(method = X509V3_EXT_get(ext))) {
715 PyErr_SetString(PySSLErrorObject,
716 ERRSTR("No method for internalizing subjectAltName!"));
717 goto fail;
718 }
719
720 p = ext->value->data;
Neal Norwitze9057ff2008-01-27 17:10:35 +0000721 if (method->it)
Bill Janssen98d19da2007-09-10 21:51:02 +0000722 names = (GENERAL_NAMES*) (ASN1_item_d2i(NULL,
723 &p,
724 ext->value->length,
725 ASN1_ITEM_ptr(method->it)));
726 else
727 names = (GENERAL_NAMES*) (method->d2i(NULL,
728 &p,
729 ext->value->length));
730
731 for(j = 0; j < sk_GENERAL_NAME_num(names); j++) {
732
733 /* get a rendering of each name in the set of names */
734
735 name = sk_GENERAL_NAME_value(names, j);
736 if (name->type == GEN_DIRNAME) {
737
738 /* we special-case DirName as a tuple of tuples of attributes */
739
740 t = PyTuple_New(2);
741 if (t == NULL) {
742 goto fail;
743 }
744
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000745 v = PyString_FromString("DirName");
Bill Janssen98d19da2007-09-10 21:51:02 +0000746 if (v == NULL) {
747 Py_DECREF(t);
748 goto fail;
749 }
750 PyTuple_SET_ITEM(t, 0, v);
751
752 v = _create_tuple_for_X509_NAME (name->d.dirn);
753 if (v == NULL) {
754 Py_DECREF(t);
755 goto fail;
756 }
757 PyTuple_SET_ITEM(t, 1, v);
758
759 } else {
760
761 /* for everything else, we use the OpenSSL print form */
762
763 (void) BIO_reset(biobuf);
764 GENERAL_NAME_print(biobuf, name);
765 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
766 if (len < 0) {
767 _setSSLError(NULL, 0, __FILE__, __LINE__);
768 goto fail;
769 }
770 vptr = strchr(buf, ':');
771 if (vptr == NULL)
772 goto fail;
773 t = PyTuple_New(2);
774 if (t == NULL)
775 goto fail;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000776 v = PyString_FromStringAndSize(buf, (vptr - buf));
Bill Janssen98d19da2007-09-10 21:51:02 +0000777 if (v == NULL) {
778 Py_DECREF(t);
779 goto fail;
780 }
781 PyTuple_SET_ITEM(t, 0, v);
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000782 v = PyString_FromStringAndSize((vptr + 1), (len - (vptr - buf + 1)));
Bill Janssen98d19da2007-09-10 21:51:02 +0000783 if (v == NULL) {
784 Py_DECREF(t);
785 goto fail;
786 }
787 PyTuple_SET_ITEM(t, 1, v);
788 }
789
790 /* and add that rendering to the list */
791
792 if (PyList_Append(peer_alt_names, t) < 0) {
793 Py_DECREF(t);
794 goto fail;
795 }
796 Py_DECREF(t);
797 }
798 }
799 BIO_free(biobuf);
800 if (peer_alt_names != Py_None) {
801 v = PyList_AsTuple(peer_alt_names);
802 Py_DECREF(peer_alt_names);
803 return v;
804 } else {
805 return peer_alt_names;
806 }
807
808
809 fail:
810 if (biobuf != NULL)
811 BIO_free(biobuf);
812
813 if (peer_alt_names != Py_None) {
814 Py_XDECREF(peer_alt_names);
815 }
816
817 return NULL;
818}
819
820static PyObject *
821_decode_certificate (X509 *certificate, int verbose) {
822
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000823 PyObject *retval = NULL;
824 BIO *biobuf = NULL;
Neal Norwitz049da9e2007-08-25 16:41:36 +0000825 PyObject *peer;
Bill Janssen98d19da2007-09-10 21:51:02 +0000826 PyObject *peer_alt_names = NULL;
Neal Norwitz049da9e2007-08-25 16:41:36 +0000827 PyObject *issuer;
828 PyObject *version;
Bill Janssen98d19da2007-09-10 21:51:02 +0000829 PyObject *sn_obj;
830 ASN1_INTEGER *serialNumber;
Neal Norwitz049da9e2007-08-25 16:41:36 +0000831 char buf[2048];
832 int len;
833 ASN1_TIME *notBefore, *notAfter;
834 PyObject *pnotBefore, *pnotAfter;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000835
836 retval = PyDict_New();
837 if (retval == NULL)
838 return NULL;
839
Bill Janssenffe576d2007-09-05 00:46:27 +0000840 peer = _create_tuple_for_X509_NAME(
Bill Janssen98d19da2007-09-10 21:51:02 +0000841 X509_get_subject_name(certificate));
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000842 if (peer == NULL)
843 goto fail0;
844 if (PyDict_SetItemString(retval, (const char *) "subject", peer) < 0) {
845 Py_DECREF(peer);
846 goto fail0;
847 }
848 Py_DECREF(peer);
849
Bill Janssen98d19da2007-09-10 21:51:02 +0000850 if (verbose) {
851 issuer = _create_tuple_for_X509_NAME(
852 X509_get_issuer_name(certificate));
853 if (issuer == NULL)
854 goto fail0;
855 if (PyDict_SetItemString(retval, (const char *)"issuer", issuer) < 0) {
856 Py_DECREF(issuer);
857 goto fail0;
858 }
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000859 Py_DECREF(issuer);
Bill Janssen98d19da2007-09-10 21:51:02 +0000860
861 version = PyInt_FromLong(X509_get_version(certificate) + 1);
862 if (PyDict_SetItemString(retval, "version", version) < 0) {
863 Py_DECREF(version);
864 goto fail0;
865 }
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000866 Py_DECREF(version);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000867 }
Bill Janssen98d19da2007-09-10 21:51:02 +0000868
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000869 /* get a memory buffer */
870 biobuf = BIO_new(BIO_s_mem());
Bill Janssen98d19da2007-09-10 21:51:02 +0000871
872 if (verbose) {
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000873
Bill Janssen98d19da2007-09-10 21:51:02 +0000874 (void) BIO_reset(biobuf);
875 serialNumber = X509_get_serialNumber(certificate);
876 /* should not exceed 20 octets, 160 bits, so buf is big enough */
877 i2a_ASN1_INTEGER(biobuf, serialNumber);
878 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
879 if (len < 0) {
880 _setSSLError(NULL, 0, __FILE__, __LINE__);
881 goto fail1;
882 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000883 sn_obj = PyString_FromStringAndSize(buf, len);
Bill Janssen98d19da2007-09-10 21:51:02 +0000884 if (sn_obj == NULL)
885 goto fail1;
886 if (PyDict_SetItemString(retval, "serialNumber", sn_obj) < 0) {
887 Py_DECREF(sn_obj);
888 goto fail1;
889 }
890 Py_DECREF(sn_obj);
891
892 (void) BIO_reset(biobuf);
893 notBefore = X509_get_notBefore(certificate);
894 ASN1_TIME_print(biobuf, notBefore);
895 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
896 if (len < 0) {
897 _setSSLError(NULL, 0, __FILE__, __LINE__);
898 goto fail1;
899 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000900 pnotBefore = PyString_FromStringAndSize(buf, len);
Bill Janssen98d19da2007-09-10 21:51:02 +0000901 if (pnotBefore == NULL)
902 goto fail1;
903 if (PyDict_SetItemString(retval, "notBefore", pnotBefore) < 0) {
904 Py_DECREF(pnotBefore);
905 goto fail1;
906 }
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000907 Py_DECREF(pnotBefore);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000908 }
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000909
Guido van Rossum780b80d2007-08-27 18:42:23 +0000910 (void) BIO_reset(biobuf);
Bill Janssen98d19da2007-09-10 21:51:02 +0000911 notAfter = X509_get_notAfter(certificate);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000912 ASN1_TIME_print(biobuf, notAfter);
913 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
Bill Janssen98d19da2007-09-10 21:51:02 +0000914 if (len < 0) {
915 _setSSLError(NULL, 0, __FILE__, __LINE__);
916 goto fail1;
917 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000918 pnotAfter = PyString_FromStringAndSize(buf, len);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000919 if (pnotAfter == NULL)
Bill Janssen98d19da2007-09-10 21:51:02 +0000920 goto fail1;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000921 if (PyDict_SetItemString(retval, "notAfter", pnotAfter) < 0) {
922 Py_DECREF(pnotAfter);
Bill Janssen98d19da2007-09-10 21:51:02 +0000923 goto fail1;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000924 }
925 Py_DECREF(pnotAfter);
Bill Janssen98d19da2007-09-10 21:51:02 +0000926
927 /* Now look for subjectAltName */
928
929 peer_alt_names = _get_peer_alt_names(certificate);
930 if (peer_alt_names == NULL)
931 goto fail1;
932 else if (peer_alt_names != Py_None) {
933 if (PyDict_SetItemString(retval, "subjectAltName",
934 peer_alt_names) < 0) {
935 Py_DECREF(peer_alt_names);
936 goto fail1;
937 }
938 Py_DECREF(peer_alt_names);
939 }
940
941 BIO_free(biobuf);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000942 return retval;
943
944 fail1:
945 if (biobuf != NULL)
946 BIO_free(biobuf);
947 fail0:
948 Py_XDECREF(retval);
949 return NULL;
950}
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000951
Bill Janssen98d19da2007-09-10 21:51:02 +0000952
953static PyObject *
954PySSL_test_decode_certificate (PyObject *mod, PyObject *args) {
955
956 PyObject *retval = NULL;
957 char *filename = NULL;
958 X509 *x=NULL;
959 BIO *cert;
960 int verbose = 1;
961
962 if (!PyArg_ParseTuple(args, "s|i:test_decode_certificate", &filename, &verbose))
963 return NULL;
964
965 if ((cert=BIO_new(BIO_s_file())) == NULL) {
966 PyErr_SetString(PySSLErrorObject, "Can't malloc memory to read file");
967 goto fail0;
968 }
969
970 if (BIO_read_filename(cert,filename) <= 0) {
971 PyErr_SetString(PySSLErrorObject, "Can't open file");
972 goto fail0;
973 }
974
975 x = PEM_read_bio_X509_AUX(cert,NULL, NULL, NULL);
976 if (x == NULL) {
977 PyErr_SetString(PySSLErrorObject, "Error decoding PEM-encoded file");
978 goto fail0;
979 }
980
981 retval = _decode_certificate(x, verbose);
982
983 fail0:
984
985 if (cert != NULL) BIO_free(cert);
986 return retval;
987}
988
989
990static PyObject *
991PySSL_peercert(PySSLObject *self, PyObject *args)
992{
993 PyObject *retval = NULL;
994 int len;
995 int verification;
996 PyObject *binary_mode = Py_None;
997
998 if (!PyArg_ParseTuple(args, "|O:peer_certificate", &binary_mode))
999 return NULL;
1000
1001 if (!self->peer_cert)
1002 Py_RETURN_NONE;
1003
1004 if (PyObject_IsTrue(binary_mode)) {
1005 /* return cert in DER-encoded format */
1006
1007 unsigned char *bytes_buf = NULL;
1008
1009 bytes_buf = NULL;
1010 len = i2d_X509(self->peer_cert, &bytes_buf);
1011 if (len < 0) {
1012 PySSL_SetError(self, len, __FILE__, __LINE__);
1013 return NULL;
1014 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001015 retval = PyString_FromStringAndSize((const char *) bytes_buf, len);
Bill Janssen98d19da2007-09-10 21:51:02 +00001016 OPENSSL_free(bytes_buf);
1017 return retval;
1018
1019 } else {
1020
1021 verification = SSL_CTX_get_verify_mode(self->ctx);
1022 if ((verification & SSL_VERIFY_PEER) == 0)
1023 return PyDict_New();
1024 else
1025 return _decode_certificate (self->peer_cert, 0);
1026 }
1027}
1028
1029PyDoc_STRVAR(PySSL_peercert_doc,
1030"peer_certificate([der=False]) -> certificate\n\
1031\n\
1032Returns the certificate for the peer. If no certificate was provided,\n\
1033returns None. If a certificate was provided, but not validated, returns\n\
1034an empty dictionary. Otherwise returns a dict containing information\n\
1035about the peer certificate.\n\
1036\n\
1037If the optional argument is True, returns a DER-encoded copy of the\n\
1038peer certificate, or None if no certificate was provided. This will\n\
1039return the certificate even if it wasn't validated.");
1040
1041static PyObject *PySSL_cipher (PySSLObject *self) {
1042
1043 PyObject *retval, *v;
1044 SSL_CIPHER *current;
1045 char *cipher_name;
1046 char *cipher_protocol;
1047
1048 if (self->ssl == NULL)
1049 return Py_None;
1050 current = SSL_get_current_cipher(self->ssl);
1051 if (current == NULL)
1052 return Py_None;
1053
1054 retval = PyTuple_New(3);
1055 if (retval == NULL)
1056 return NULL;
1057
1058 cipher_name = (char *) SSL_CIPHER_get_name(current);
1059 if (cipher_name == NULL) {
1060 PyTuple_SET_ITEM(retval, 0, Py_None);
1061 } else {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001062 v = PyString_FromString(cipher_name);
Bill Janssen98d19da2007-09-10 21:51:02 +00001063 if (v == NULL)
1064 goto fail0;
1065 PyTuple_SET_ITEM(retval, 0, v);
1066 }
1067 cipher_protocol = SSL_CIPHER_get_version(current);
1068 if (cipher_protocol == NULL) {
1069 PyTuple_SET_ITEM(retval, 1, Py_None);
1070 } else {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001071 v = PyString_FromString(cipher_protocol);
Bill Janssen98d19da2007-09-10 21:51:02 +00001072 if (v == NULL)
1073 goto fail0;
1074 PyTuple_SET_ITEM(retval, 1, v);
1075 }
1076 v = PyInt_FromLong(SSL_CIPHER_get_bits(current, NULL));
1077 if (v == NULL)
1078 goto fail0;
1079 PyTuple_SET_ITEM(retval, 2, v);
1080 return retval;
1081
1082 fail0:
1083 Py_DECREF(retval);
1084 return NULL;
1085}
1086
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001087static void PySSL_dealloc(PySSLObject *self)
1088{
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001089 if (self->peer_cert) /* Possible not to have one? */
1090 X509_free (self->peer_cert);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001091 if (self->ssl)
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001092 SSL_free(self->ssl);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001093 if (self->ctx)
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001094 SSL_CTX_free(self->ctx);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001095 Py_XDECREF(self->Socket);
1096 PyObject_Del(self);
1097}
1098
Anthony Baxter93ab5fa2006-07-11 02:04:09 +00001099/* If the socket has a timeout, do a select()/poll() on the socket.
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001100 The argument writing indicates the direction.
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001101 Returns one of the possibilities in the timeout_state enum (above).
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001102 */
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001103
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001104static int
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001105check_socket_and_wait_for_timeout(PySocketSockObject *s, int writing)
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001106{
1107 fd_set fds;
1108 struct timeval tv;
1109 int rc;
1110
1111 /* Nothing to do unless we're in timeout mode (not non-blocking) */
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001112 if (s->sock_timeout < 0.0)
1113 return SOCKET_IS_BLOCKING;
1114 else if (s->sock_timeout == 0.0)
1115 return SOCKET_IS_NONBLOCKING;
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001116
1117 /* Guard against closed socket */
1118 if (s->sock_fd < 0)
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001119 return SOCKET_HAS_BEEN_CLOSED;
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001120
Anthony Baxter93ab5fa2006-07-11 02:04:09 +00001121 /* Prefer poll, if available, since you can poll() any fd
1122 * which can't be done with select(). */
1123#ifdef HAVE_POLL
1124 {
1125 struct pollfd pollfd;
1126 int timeout;
1127
1128 pollfd.fd = s->sock_fd;
1129 pollfd.events = writing ? POLLOUT : POLLIN;
1130
1131 /* s->sock_timeout is in seconds, timeout in ms */
1132 timeout = (int)(s->sock_timeout * 1000 + 0.5);
Bill Janssen98d19da2007-09-10 21:51:02 +00001133 PySSL_BEGIN_ALLOW_THREADS
Anthony Baxter93ab5fa2006-07-11 02:04:09 +00001134 rc = poll(&pollfd, 1, timeout);
Bill Janssen98d19da2007-09-10 21:51:02 +00001135 PySSL_END_ALLOW_THREADS
Anthony Baxter93ab5fa2006-07-11 02:04:09 +00001136
1137 goto normal_return;
1138 }
1139#endif
1140
Neal Norwitz082b2df2006-02-07 07:04:46 +00001141 /* Guard against socket too large for select*/
Martin v. Löwisf84d1b92006-02-11 09:27:05 +00001142#ifndef Py_SOCKET_FD_CAN_BE_GE_FD_SETSIZE
Neal Norwitz082b2df2006-02-07 07:04:46 +00001143 if (s->sock_fd >= FD_SETSIZE)
Neal Norwitz389cea82006-02-13 00:35:21 +00001144 return SOCKET_TOO_LARGE_FOR_SELECT;
Martin v. Löwisf84d1b92006-02-11 09:27:05 +00001145#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +00001146
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001147 /* Construct the arguments to select */
1148 tv.tv_sec = (int)s->sock_timeout;
1149 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
1150 FD_ZERO(&fds);
1151 FD_SET(s->sock_fd, &fds);
1152
1153 /* See if the socket is ready */
Bill Janssen98d19da2007-09-10 21:51:02 +00001154 PySSL_BEGIN_ALLOW_THREADS
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001155 if (writing)
1156 rc = select(s->sock_fd+1, NULL, &fds, NULL, &tv);
1157 else
1158 rc = select(s->sock_fd+1, &fds, NULL, NULL, &tv);
Bill Janssen98d19da2007-09-10 21:51:02 +00001159 PySSL_END_ALLOW_THREADS
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001160
Bill Janssen934b16d2008-06-28 22:19:33 +00001161#ifdef HAVE_POLL
Anthony Baxter93ab5fa2006-07-11 02:04:09 +00001162normal_return:
Bill Janssen934b16d2008-06-28 22:19:33 +00001163#endif
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001164 /* Return SOCKET_TIMED_OUT on timeout, SOCKET_OPERATION_OK otherwise
1165 (when we are able to write or when there's something to read) */
1166 return rc == 0 ? SOCKET_HAS_TIMED_OUT : SOCKET_OPERATION_OK;
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001167}
1168
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001169static PyObject *PySSL_SSLwrite(PySSLObject *self, PyObject *args)
1170{
Antoine Pitrou5ba84912009-10-19 17:59:07 +00001171 Py_buffer buf;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001172 int len;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001173 int sockstate;
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001174 int err;
Bill Janssen934b16d2008-06-28 22:19:33 +00001175 int nonblocking;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001176
Antoine Pitrou5ba84912009-10-19 17:59:07 +00001177 if (!PyArg_ParseTuple(args, "s*:write", &buf))
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001178 return NULL;
1179
Bill Janssen934b16d2008-06-28 22:19:33 +00001180 /* just in case the blocking state of the socket has been changed */
1181 nonblocking = (self->Socket->sock_timeout >= 0.0);
1182 BIO_set_nbio(SSL_get_rbio(self->ssl), nonblocking);
1183 BIO_set_nbio(SSL_get_wbio(self->ssl), nonblocking);
1184
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001185 sockstate = check_socket_and_wait_for_timeout(self->Socket, 1);
1186 if (sockstate == SOCKET_HAS_TIMED_OUT) {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001187 PyErr_SetString(PySSLErrorObject,
1188 "The write operation timed out");
Antoine Pitrou5ba84912009-10-19 17:59:07 +00001189 goto error;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001190 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001191 PyErr_SetString(PySSLErrorObject,
1192 "Underlying socket has been closed.");
Antoine Pitrou5ba84912009-10-19 17:59:07 +00001193 goto error;
Neal Norwitz389cea82006-02-13 00:35:21 +00001194 } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001195 PyErr_SetString(PySSLErrorObject,
1196 "Underlying socket too large for select().");
Antoine Pitrou5ba84912009-10-19 17:59:07 +00001197 goto error;
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001198 }
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001199 do {
Bill Janssen98d19da2007-09-10 21:51:02 +00001200 PySSL_BEGIN_ALLOW_THREADS
Antoine Pitrou5ba84912009-10-19 17:59:07 +00001201 len = SSL_write(self->ssl, buf.buf, buf.len);
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001202 err = SSL_get_error(self->ssl, len);
Bill Janssen98d19da2007-09-10 21:51:02 +00001203 PySSL_END_ALLOW_THREADS
Antoine Pitrou5ba84912009-10-19 17:59:07 +00001204 if (PyErr_CheckSignals()) {
1205 goto error;
Martin v. Löwisafec8e32003-06-28 07:40:23 +00001206 }
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001207 if (err == SSL_ERROR_WANT_READ) {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001208 sockstate =
1209 check_socket_and_wait_for_timeout(self->Socket, 0);
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001210 } else if (err == SSL_ERROR_WANT_WRITE) {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001211 sockstate =
1212 check_socket_and_wait_for_timeout(self->Socket, 1);
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001213 } else {
1214 sockstate = SOCKET_OPERATION_OK;
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001215 }
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001216 if (sockstate == SOCKET_HAS_TIMED_OUT) {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001217 PyErr_SetString(PySSLErrorObject,
1218 "The write operation timed out");
Antoine Pitrou5ba84912009-10-19 17:59:07 +00001219 goto error;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001220 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001221 PyErr_SetString(PySSLErrorObject,
1222 "Underlying socket has been closed.");
Antoine Pitrou5ba84912009-10-19 17:59:07 +00001223 goto error;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001224 } else if (sockstate == SOCKET_IS_NONBLOCKING) {
1225 break;
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001226 }
1227 } while (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE);
Antoine Pitrou5ba84912009-10-19 17:59:07 +00001228
1229 PyBuffer_Release(&buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001230 if (len > 0)
1231 return PyInt_FromLong(len);
1232 else
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001233 return PySSL_SetError(self, len, __FILE__, __LINE__);
Antoine Pitrou5ba84912009-10-19 17:59:07 +00001234
1235error:
1236 PyBuffer_Release(&buf);
1237 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001238}
1239
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001240PyDoc_STRVAR(PySSL_SSLwrite_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001241"write(s) -> len\n\
1242\n\
1243Writes the string s into the SSL object. Returns the number\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001244of bytes written.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001245
Bill Janssen934b16d2008-06-28 22:19:33 +00001246static PyObject *PySSL_SSLpending(PySSLObject *self)
1247{
1248 int count = 0;
1249
1250 PySSL_BEGIN_ALLOW_THREADS
1251 count = SSL_pending(self->ssl);
1252 PySSL_END_ALLOW_THREADS
1253 if (count < 0)
1254 return PySSL_SetError(self, count, __FILE__, __LINE__);
1255 else
1256 return PyInt_FromLong(count);
1257}
1258
1259PyDoc_STRVAR(PySSL_SSLpending_doc,
1260"pending() -> count\n\
1261\n\
1262Returns the number of already decrypted bytes available for read,\n\
1263pending on the connection.\n");
1264
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001265static PyObject *PySSL_SSLread(PySSLObject *self, PyObject *args)
1266{
1267 PyObject *buf;
1268 int count = 0;
1269 int len = 1024;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001270 int sockstate;
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001271 int err;
Bill Janssen934b16d2008-06-28 22:19:33 +00001272 int nonblocking;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001273
1274 if (!PyArg_ParseTuple(args, "|i:read", &len))
1275 return NULL;
1276
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001277 if (!(buf = PyString_FromStringAndSize((char *) 0, len)))
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001278 return NULL;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001279
Bill Janssen934b16d2008-06-28 22:19:33 +00001280 /* just in case the blocking state of the socket has been changed */
1281 nonblocking = (self->Socket->sock_timeout >= 0.0);
1282 BIO_set_nbio(SSL_get_rbio(self->ssl), nonblocking);
1283 BIO_set_nbio(SSL_get_wbio(self->ssl), nonblocking);
1284
Georg Brandl43f08a82006-03-31 18:01:16 +00001285 /* first check if there are bytes ready to be read */
Bill Janssen98d19da2007-09-10 21:51:02 +00001286 PySSL_BEGIN_ALLOW_THREADS
Georg Brandl43f08a82006-03-31 18:01:16 +00001287 count = SSL_pending(self->ssl);
Bill Janssen98d19da2007-09-10 21:51:02 +00001288 PySSL_END_ALLOW_THREADS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001289
Georg Brandl43f08a82006-03-31 18:01:16 +00001290 if (!count) {
1291 sockstate = check_socket_and_wait_for_timeout(self->Socket, 0);
1292 if (sockstate == SOCKET_HAS_TIMED_OUT) {
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001293 PyErr_SetString(PySSLErrorObject,
1294 "The read operation timed out");
Georg Brandl43f08a82006-03-31 18:01:16 +00001295 Py_DECREF(buf);
1296 return NULL;
1297 } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001298 PyErr_SetString(PySSLErrorObject,
1299 "Underlying socket too large for select().");
1300 Py_DECREF(buf);
Georg Brandl43f08a82006-03-31 18:01:16 +00001301 return NULL;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001302 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
Bill Janssen934b16d2008-06-28 22:19:33 +00001303 if (SSL_get_shutdown(self->ssl) !=
1304 SSL_RECEIVED_SHUTDOWN)
1305 {
1306 Py_DECREF(buf);
1307 PyErr_SetString(PySSLErrorObject,
1308 "Socket closed without SSL shutdown handshake");
1309 return NULL;
1310 } else {
1311 /* should contain a zero-length string */
1312 _PyString_Resize(&buf, 0);
1313 return buf;
1314 }
Georg Brandl43f08a82006-03-31 18:01:16 +00001315 }
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001316 }
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001317 do {
Bill Janssen98d19da2007-09-10 21:51:02 +00001318 PySSL_BEGIN_ALLOW_THREADS
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001319 count = SSL_read(self->ssl, PyString_AsString(buf), len);
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001320 err = SSL_get_error(self->ssl, count);
Bill Janssen98d19da2007-09-10 21:51:02 +00001321 PySSL_END_ALLOW_THREADS
Martin v. Löwisafec8e32003-06-28 07:40:23 +00001322 if(PyErr_CheckSignals()) {
1323 Py_DECREF(buf);
1324 return NULL;
1325 }
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001326 if (err == SSL_ERROR_WANT_READ) {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001327 sockstate =
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001328 check_socket_and_wait_for_timeout(self->Socket, 0);
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001329 } else if (err == SSL_ERROR_WANT_WRITE) {
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001330 sockstate =
1331 check_socket_and_wait_for_timeout(self->Socket, 1);
1332 } else if ((err == SSL_ERROR_ZERO_RETURN) &&
1333 (SSL_get_shutdown(self->ssl) ==
Guido van Rossum780b80d2007-08-27 18:42:23 +00001334 SSL_RECEIVED_SHUTDOWN))
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001335 {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001336 _PyString_Resize(&buf, 0);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001337 return buf;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001338 } else {
1339 sockstate = SOCKET_OPERATION_OK;
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001340 }
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001341 if (sockstate == SOCKET_HAS_TIMED_OUT) {
1342 PyErr_SetString(PySSLErrorObject,
1343 "The read operation timed out");
Martin v. Löwisafec8e32003-06-28 07:40:23 +00001344 Py_DECREF(buf);
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001345 return NULL;
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);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001350 if (count <= 0) {
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001351 Py_DECREF(buf);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001352 return PySSL_SetError(self, count, __FILE__, __LINE__);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001353 }
Tim Peters5de98422002-04-27 18:44:32 +00001354 if (count != len)
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001355 _PyString_Resize(&buf, count);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001356 return buf;
1357}
1358
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001359PyDoc_STRVAR(PySSL_SSLread_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001360"read([len]) -> string\n\
1361\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001362Read up to len bytes from the SSL socket.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001363
Bill Janssen934b16d2008-06-28 22:19:33 +00001364static PyObject *PySSL_SSLshutdown(PySSLObject *self)
1365{
Antoine Pitroua5c4b552010-04-22 23:33:02 +00001366 int err, ssl_err, sockstate, nonblocking;
1367 int zeros = 0;
Bill Janssen934b16d2008-06-28 22:19:33 +00001368
1369 /* Guard against closed socket */
1370 if (self->Socket->sock_fd < 0) {
1371 PyErr_SetString(PySSLErrorObject,
1372 "Underlying socket has been closed.");
1373 return NULL;
1374 }
1375
Antoine Pitroua5c4b552010-04-22 23:33:02 +00001376 /* Just in case the blocking state of the socket has been changed */
1377 nonblocking = (self->Socket->sock_timeout >= 0.0);
1378 BIO_set_nbio(SSL_get_rbio(self->ssl), nonblocking);
1379 BIO_set_nbio(SSL_get_wbio(self->ssl), nonblocking);
1380
1381 while (1) {
1382 PySSL_BEGIN_ALLOW_THREADS
1383 /* Disable read-ahead so that unwrap can work correctly.
1384 * Otherwise OpenSSL might read in too much data,
1385 * eating clear text data that happens to be
1386 * transmitted after the SSL shutdown.
1387 * Should be safe to call repeatedly everytime this
1388 * function is used and the shutdown_seen_zero != 0
1389 * condition is met.
1390 */
1391 if (self->shutdown_seen_zero)
1392 SSL_set_read_ahead(self->ssl, 0);
Bill Janssen934b16d2008-06-28 22:19:33 +00001393 err = SSL_shutdown(self->ssl);
Antoine Pitroua5c4b552010-04-22 23:33:02 +00001394 PySSL_END_ALLOW_THREADS
1395 /* If err == 1, a secure shutdown with SSL_shutdown() is complete */
1396 if (err > 0)
1397 break;
1398 if (err == 0) {
1399 /* Don't loop endlessly; instead preserve legacy
1400 behaviour of trying SSL_shutdown() only twice.
1401 This looks necessary for OpenSSL < 0.9.8m */
1402 if (++zeros > 1)
1403 break;
1404 /* Shutdown was sent, now try receiving */
1405 self->shutdown_seen_zero = 1;
1406 continue;
1407 }
1408
1409 /* Possibly retry shutdown until timeout or failure */
1410 ssl_err = SSL_get_error(self->ssl, err);
1411 if (ssl_err == SSL_ERROR_WANT_READ)
1412 sockstate = check_socket_and_wait_for_timeout(self->Socket, 0);
1413 else if (ssl_err == SSL_ERROR_WANT_WRITE)
1414 sockstate = check_socket_and_wait_for_timeout(self->Socket, 1);
1415 else
1416 break;
1417 if (sockstate == SOCKET_HAS_TIMED_OUT) {
1418 if (ssl_err == SSL_ERROR_WANT_READ)
1419 PyErr_SetString(PySSLErrorObject,
1420 "The read operation timed out");
1421 else
1422 PyErr_SetString(PySSLErrorObject,
1423 "The write operation timed out");
1424 return NULL;
1425 }
1426 else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
1427 PyErr_SetString(PySSLErrorObject,
1428 "Underlying socket too large for select().");
1429 return NULL;
1430 }
1431 else if (sockstate != SOCKET_OPERATION_OK)
1432 /* Retain the SSL error code */
1433 break;
Bill Janssen934b16d2008-06-28 22:19:33 +00001434 }
Bill Janssen934b16d2008-06-28 22:19:33 +00001435
1436 if (err < 0)
1437 return PySSL_SetError(self, err, __FILE__, __LINE__);
1438 else {
1439 Py_INCREF(self->Socket);
1440 return (PyObject *) (self->Socket);
1441 }
1442}
1443
1444PyDoc_STRVAR(PySSL_SSLshutdown_doc,
1445"shutdown(s) -> socket\n\
1446\n\
1447Does the SSL shutdown handshake with the remote end, and returns\n\
1448the underlying socket object.");
1449
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001450static PyMethodDef PySSLMethods[] = {
Bill Janssen934b16d2008-06-28 22:19:33 +00001451 {"do_handshake", (PyCFunction)PySSL_SSLdo_handshake, METH_NOARGS},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001452 {"write", (PyCFunction)PySSL_SSLwrite, METH_VARARGS,
Bill Janssen98d19da2007-09-10 21:51:02 +00001453 PySSL_SSLwrite_doc},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001454 {"read", (PyCFunction)PySSL_SSLread, METH_VARARGS,
Bill Janssen98d19da2007-09-10 21:51:02 +00001455 PySSL_SSLread_doc},
Bill Janssen934b16d2008-06-28 22:19:33 +00001456 {"pending", (PyCFunction)PySSL_SSLpending, METH_NOARGS,
1457 PySSL_SSLpending_doc},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001458 {"server", (PyCFunction)PySSL_server, METH_NOARGS},
1459 {"issuer", (PyCFunction)PySSL_issuer, METH_NOARGS},
Bill Janssen98d19da2007-09-10 21:51:02 +00001460 {"peer_certificate", (PyCFunction)PySSL_peercert, METH_VARARGS,
1461 PySSL_peercert_doc},
1462 {"cipher", (PyCFunction)PySSL_cipher, METH_NOARGS},
Bill Janssen934b16d2008-06-28 22:19:33 +00001463 {"shutdown", (PyCFunction)PySSL_SSLshutdown, METH_NOARGS,
1464 PySSL_SSLshutdown_doc},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001465 {NULL, NULL}
1466};
1467
1468static PyObject *PySSL_getattr(PySSLObject *self, char *name)
1469{
1470 return Py_FindMethod(PySSLMethods, (PyObject *)self, name);
1471}
1472
Jeremy Hylton938ace62002-07-17 16:30:39 +00001473static PyTypeObject PySSL_Type = {
Martin v. Löwis68192102007-07-21 06:55:02 +00001474 PyVarObject_HEAD_INIT(NULL, 0)
Guido van Rossum780b80d2007-08-27 18:42:23 +00001475 "ssl.SSLContext", /*tp_name*/
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001476 sizeof(PySSLObject), /*tp_basicsize*/
1477 0, /*tp_itemsize*/
1478 /* methods */
1479 (destructor)PySSL_dealloc, /*tp_dealloc*/
1480 0, /*tp_print*/
1481 (getattrfunc)PySSL_getattr, /*tp_getattr*/
1482 0, /*tp_setattr*/
1483 0, /*tp_compare*/
1484 0, /*tp_repr*/
1485 0, /*tp_as_number*/
1486 0, /*tp_as_sequence*/
1487 0, /*tp_as_mapping*/
1488 0, /*tp_hash*/
1489};
1490
1491#ifdef HAVE_OPENSSL_RAND
1492
1493/* helper routines for seeding the SSL PRNG */
1494static PyObject *
1495PySSL_RAND_add(PyObject *self, PyObject *args)
1496{
1497 char *buf;
1498 int len;
1499 double entropy;
1500
1501 if (!PyArg_ParseTuple(args, "s#d:RAND_add", &buf, &len, &entropy))
1502 return NULL;
1503 RAND_add(buf, len, entropy);
1504 Py_INCREF(Py_None);
1505 return Py_None;
1506}
1507
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001508PyDoc_STRVAR(PySSL_RAND_add_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001509"RAND_add(string, entropy)\n\
1510\n\
1511Mix string into the OpenSSL PRNG state. entropy (a float) is a lower\n\
Bill Janssen98d19da2007-09-10 21:51:02 +00001512bound on the entropy contained in string. See RFC 1750.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001513
1514static PyObject *
1515PySSL_RAND_status(PyObject *self)
1516{
1517 return PyInt_FromLong(RAND_status());
1518}
1519
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001520PyDoc_STRVAR(PySSL_RAND_status_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001521"RAND_status() -> 0 or 1\n\
1522\n\
1523Returns 1 if the OpenSSL PRNG has been seeded with enough data and 0 if not.\n\
1524It is necessary to seed the PRNG with RAND_add() on some platforms before\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001525using the ssl() function.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001526
1527static PyObject *
1528PySSL_RAND_egd(PyObject *self, PyObject *arg)
1529{
1530 int bytes;
1531
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001532 if (!PyString_Check(arg))
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001533 return PyErr_Format(PyExc_TypeError,
1534 "RAND_egd() expected string, found %s",
Christian Heimese93237d2007-12-19 02:37:44 +00001535 Py_TYPE(arg)->tp_name);
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001536 bytes = RAND_egd(PyString_AS_STRING(arg));
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001537 if (bytes == -1) {
1538 PyErr_SetString(PySSLErrorObject,
1539 "EGD connection failed or EGD did not return "
1540 "enough data to seed the PRNG");
1541 return NULL;
1542 }
1543 return PyInt_FromLong(bytes);
1544}
1545
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001546PyDoc_STRVAR(PySSL_RAND_egd_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001547"RAND_egd(path) -> bytes\n\
1548\n\
Bill Janssen98d19da2007-09-10 21:51:02 +00001549Queries the entropy gather daemon (EGD) on the socket named by 'path'.\n\
1550Returns number of bytes read. Raises SSLError if connection to EGD\n\
1551fails or if it does provide enough data to seed PRNG.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001552
1553#endif
1554
1555/* List of functions exported by this module. */
1556
1557static PyMethodDef PySSL_methods[] = {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001558 {"sslwrap", PySSL_sslwrap,
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001559 METH_VARARGS, ssl_doc},
Bill Janssen98d19da2007-09-10 21:51:02 +00001560 {"_test_decode_cert", PySSL_test_decode_certificate,
1561 METH_VARARGS},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001562#ifdef HAVE_OPENSSL_RAND
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001563 {"RAND_add", PySSL_RAND_add, METH_VARARGS,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001564 PySSL_RAND_add_doc},
1565 {"RAND_egd", PySSL_RAND_egd, METH_O,
1566 PySSL_RAND_egd_doc},
1567 {"RAND_status", (PyCFunction)PySSL_RAND_status, METH_NOARGS,
1568 PySSL_RAND_status_doc},
1569#endif
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001570 {NULL, NULL} /* Sentinel */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001571};
1572
1573
Bill Janssen98d19da2007-09-10 21:51:02 +00001574#ifdef WITH_THREAD
1575
1576/* an implementation of OpenSSL threading operations in terms
1577 of the Python C thread library */
1578
1579static PyThread_type_lock *_ssl_locks = NULL;
1580
1581static unsigned long _ssl_thread_id_function (void) {
1582 return PyThread_get_thread_ident();
1583}
1584
1585static void _ssl_thread_locking_function (int mode, int n, const char *file, int line) {
1586 /* this function is needed to perform locking on shared data
1587 structures. (Note that OpenSSL uses a number of global data
1588 structures that will be implicitly shared whenever multiple threads
1589 use OpenSSL.) Multi-threaded applications will crash at random if
1590 it is not set.
1591
1592 locking_function() must be able to handle up to CRYPTO_num_locks()
1593 different mutex locks. It sets the n-th lock if mode & CRYPTO_LOCK, and
1594 releases it otherwise.
1595
1596 file and line are the file number of the function setting the
1597 lock. They can be useful for debugging.
1598 */
1599
1600 if ((_ssl_locks == NULL) ||
Neal Norwitz5802bb22008-03-27 05:03:11 +00001601 (n < 0) || ((unsigned)n >= _ssl_locks_count))
Bill Janssen98d19da2007-09-10 21:51:02 +00001602 return;
1603
1604 if (mode & CRYPTO_LOCK) {
1605 PyThread_acquire_lock(_ssl_locks[n], 1);
1606 } else {
1607 PyThread_release_lock(_ssl_locks[n]);
1608 }
1609}
1610
1611static int _setup_ssl_threads(void) {
1612
Neal Norwitz5802bb22008-03-27 05:03:11 +00001613 unsigned int i;
Bill Janssen98d19da2007-09-10 21:51:02 +00001614
1615 if (_ssl_locks == NULL) {
1616 _ssl_locks_count = CRYPTO_num_locks();
1617 _ssl_locks = (PyThread_type_lock *)
1618 malloc(sizeof(PyThread_type_lock) * _ssl_locks_count);
1619 if (_ssl_locks == NULL)
1620 return 0;
1621 memset(_ssl_locks, 0, sizeof(PyThread_type_lock) * _ssl_locks_count);
1622 for (i = 0; i < _ssl_locks_count; i++) {
1623 _ssl_locks[i] = PyThread_allocate_lock();
1624 if (_ssl_locks[i] == NULL) {
Raymond Hettinger354cfc12009-01-26 16:52:22 +00001625 unsigned int j;
Bill Janssen98d19da2007-09-10 21:51:02 +00001626 for (j = 0; j < i; j++) {
1627 PyThread_free_lock(_ssl_locks[j]);
1628 }
1629 free(_ssl_locks);
1630 return 0;
1631 }
1632 }
1633 CRYPTO_set_locking_callback(_ssl_thread_locking_function);
1634 CRYPTO_set_id_callback(_ssl_thread_id_function);
1635 }
1636 return 1;
1637}
1638
1639#endif /* def HAVE_THREAD */
1640
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001641PyDoc_STRVAR(module_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001642"Implementation module for SSL socket operations. See the socket module\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001643for documentation.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001644
Mark Hammondfe51c6d2002-08-02 02:27:13 +00001645PyMODINIT_FUNC
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001646init_ssl(void)
1647{
Antoine Pitrouf9de5342010-04-05 21:35:07 +00001648 PyObject *m, *d, *r;
1649 unsigned long libver;
1650 unsigned int major, minor, fix, patch, status;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001651
Christian Heimese93237d2007-12-19 02:37:44 +00001652 Py_TYPE(&PySSL_Type) = &PyType_Type;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001653
1654 m = Py_InitModule3("_ssl", PySSL_methods, module_doc);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00001655 if (m == NULL)
1656 return;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001657 d = PyModule_GetDict(m);
1658
1659 /* Load _socket module and its C API */
1660 if (PySocketModule_ImportModuleAndAPI())
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001661 return;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001662
1663 /* Init OpenSSL */
1664 SSL_load_error_strings();
Antoine Pitrouc715a9e2010-04-21 19:28:03 +00001665 SSL_library_init();
Bill Janssen98d19da2007-09-10 21:51:02 +00001666#ifdef WITH_THREAD
1667 /* note that this will start threading if not already started */
1668 if (!_setup_ssl_threads()) {
1669 return;
1670 }
1671#endif
Antoine Pitrouc715a9e2010-04-21 19:28:03 +00001672 OpenSSL_add_all_algorithms();
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001673
1674 /* Add symbols to module dict */
Bill Janssen98d19da2007-09-10 21:51:02 +00001675 PySSLErrorObject = PyErr_NewException("ssl.SSLError",
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001676 PySocketModule.error,
1677 NULL);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001678 if (PySSLErrorObject == NULL)
1679 return;
Bill Janssen98d19da2007-09-10 21:51:02 +00001680 if (PyDict_SetItemString(d, "SSLError", PySSLErrorObject) != 0)
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001681 return;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001682 if (PyDict_SetItemString(d, "SSLType",
1683 (PyObject *)&PySSL_Type) != 0)
1684 return;
1685 PyModule_AddIntConstant(m, "SSL_ERROR_ZERO_RETURN",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001686 PY_SSL_ERROR_ZERO_RETURN);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001687 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_READ",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001688 PY_SSL_ERROR_WANT_READ);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001689 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_WRITE",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001690 PY_SSL_ERROR_WANT_WRITE);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001691 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_X509_LOOKUP",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001692 PY_SSL_ERROR_WANT_X509_LOOKUP);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001693 PyModule_AddIntConstant(m, "SSL_ERROR_SYSCALL",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001694 PY_SSL_ERROR_SYSCALL);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001695 PyModule_AddIntConstant(m, "SSL_ERROR_SSL",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001696 PY_SSL_ERROR_SSL);
1697 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_CONNECT",
1698 PY_SSL_ERROR_WANT_CONNECT);
1699 /* non ssl.h errorcodes */
1700 PyModule_AddIntConstant(m, "SSL_ERROR_EOF",
1701 PY_SSL_ERROR_EOF);
1702 PyModule_AddIntConstant(m, "SSL_ERROR_INVALID_ERROR_CODE",
1703 PY_SSL_ERROR_INVALID_ERROR_CODE);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001704 /* cert requirements */
1705 PyModule_AddIntConstant(m, "CERT_NONE",
1706 PY_SSL_CERT_NONE);
1707 PyModule_AddIntConstant(m, "CERT_OPTIONAL",
1708 PY_SSL_CERT_OPTIONAL);
1709 PyModule_AddIntConstant(m, "CERT_REQUIRED",
1710 PY_SSL_CERT_REQUIRED);
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001711
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001712 /* protocol versions */
1713 PyModule_AddIntConstant(m, "PROTOCOL_SSLv2",
1714 PY_SSL_VERSION_SSL2);
1715 PyModule_AddIntConstant(m, "PROTOCOL_SSLv3",
1716 PY_SSL_VERSION_SSL3);
1717 PyModule_AddIntConstant(m, "PROTOCOL_SSLv23",
1718 PY_SSL_VERSION_SSL23);
1719 PyModule_AddIntConstant(m, "PROTOCOL_TLSv1",
1720 PY_SSL_VERSION_TLS1);
Antoine Pitrouf9de5342010-04-05 21:35:07 +00001721
1722 /* OpenSSL version */
1723 /* SSLeay() gives us the version of the library linked against,
1724 which could be different from the headers version.
1725 */
1726 libver = SSLeay();
1727 r = PyLong_FromUnsignedLong(libver);
1728 if (r == NULL)
1729 return;
1730 if (PyModule_AddObject(m, "OPENSSL_VERSION_NUMBER", r))
1731 return;
1732 status = libver & 0xF;
1733 libver >>= 4;
1734 patch = libver & 0xFF;
1735 libver >>= 8;
1736 fix = libver & 0xFF;
1737 libver >>= 8;
1738 minor = libver & 0xFF;
1739 libver >>= 8;
1740 major = libver & 0xFF;
1741 r = Py_BuildValue("IIIII", major, minor, fix, patch, status);
1742 if (r == NULL || PyModule_AddObject(m, "OPENSSL_VERSION_INFO", r))
1743 return;
1744 r = PyString_FromString(SSLeay_version(SSLEAY_VERSION));
1745 if (r == NULL || PyModule_AddObject(m, "OPENSSL_VERSION", r))
1746 return;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001747}