blob: eb5e80fb81676c22cc5e5e70b43c16febb6d263e [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 { \
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +000022 PyThreadState *_save = NULL; \
23 if (_ssl_locks_count>0) {_save = PyEval_SaveThread();}
24#define PySSL_BLOCK_THREADS if (_ssl_locks_count>0){PyEval_RestoreThread(_save)};
25#define PySSL_UNBLOCK_THREADS if (_ssl_locks_count>0){_save = PyEval_SaveThread()};
26#define PySSL_END_ALLOW_THREADS if (_ssl_locks_count>0){PyEval_RestoreThread(_save);} \
27 }
Bill Janssen98d19da2007-09-10 21:51:02 +000028
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +000029#else /* no WITH_THREAD */
Bill Janssen98d19da2007-09-10 21:51:02 +000030
31#define PySSL_BEGIN_ALLOW_THREADS
32#define PySSL_BLOCK_THREADS
33#define PySSL_UNBLOCK_THREADS
34#define PySSL_END_ALLOW_THREADS
35
36#endif
37
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +000038enum py_ssl_error {
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +000039 /* these mirror ssl.h */
40 PY_SSL_ERROR_NONE,
41 PY_SSL_ERROR_SSL,
42 PY_SSL_ERROR_WANT_READ,
43 PY_SSL_ERROR_WANT_WRITE,
44 PY_SSL_ERROR_WANT_X509_LOOKUP,
45 PY_SSL_ERROR_SYSCALL, /* look at error stack/return value/errno */
46 PY_SSL_ERROR_ZERO_RETURN,
47 PY_SSL_ERROR_WANT_CONNECT,
48 /* start of non ssl.h errorcodes */
49 PY_SSL_ERROR_EOF, /* special case of SSL_ERROR_SYSCALL */
50 PY_SSL_ERROR_INVALID_ERROR_CODE
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +000051};
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000052
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +000053enum py_ssl_server_or_client {
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +000054 PY_SSL_CLIENT,
55 PY_SSL_SERVER
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +000056};
57
58enum py_ssl_cert_requirements {
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +000059 PY_SSL_CERT_NONE,
60 PY_SSL_CERT_OPTIONAL,
61 PY_SSL_CERT_REQUIRED
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +000062};
63
64enum py_ssl_version {
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +000065 PY_SSL_VERSION_SSL2,
66 PY_SSL_VERSION_SSL3,
67 PY_SSL_VERSION_SSL23,
68 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 {
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000114 PyObject_HEAD
115 PySocketSockObject *Socket; /* Socket on which we're layered */
116 SSL_CTX* ctx;
117 SSL* ssl;
118 X509* peer_cert;
119 char server[X509_NAME_MAXLEN];
120 char issuer[X509_NAME_MAXLEN];
121 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,
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +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
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +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 {
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000136 SOCKET_IS_NONBLOCKING,
137 SOCKET_IS_BLOCKING,
138 SOCKET_HAS_TIMED_OUT,
139 SOCKET_HAS_BEEN_CLOSED,
140 SOCKET_TOO_LARGE_FOR_SELECT,
141 SOCKET_OPERATION_OK
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +0000142} 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{
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000158 PyObject *v;
159 char buf[2048];
160 char *errstr;
161 int err;
162 enum py_ssl_error p = PY_SSL_ERROR_NONE;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000163
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000164 assert(ret <= 0);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000165
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000166 if (obj->ssl != NULL) {
167 err = SSL_get_error(obj->ssl, ret);
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +0000168
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +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;
Antoine Pitrou2e136ab2010-05-12 14:02:34 +0000184 errstr = "The operation did not complete (X509 lookup)";
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000185 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) {
194 if (ret == 0 || !obj->Socket) {
Antoine Pitrou2e136ab2010-05-12 14:02:34 +0000195 p = PY_SSL_ERROR_EOF;
196 errstr = "EOF occurred in violation of protocol";
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000197 } else if (ret == -1) {
Antoine Pitrou2e136ab2010-05-12 14:02:34 +0000198 /* underlying BIO reported an I/O error */
199 return obj->Socket->errorhandler();
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000200 } else { /* possible? */
Antoine Pitrou2e136ab2010-05-12 14:02:34 +0000201 p = PY_SSL_ERROR_SYSCALL;
202 errstr = "Some I/O error occurred";
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000203 }
204 } else {
205 p = PY_SSL_ERROR_SYSCALL;
206 /* XXX Protected by global interpreter lock */
207 errstr = ERR_error_string(e, NULL);
208 }
209 break;
210 }
211 case SSL_ERROR_SSL:
212 {
213 unsigned long e = ERR_get_error();
214 p = PY_SSL_ERROR_SSL;
215 if (e != 0)
216 /* XXX Protected by global interpreter lock */
217 errstr = ERR_error_string(e, NULL);
218 else { /* possible? */
Antoine Pitrou2e136ab2010-05-12 14:02:34 +0000219 errstr = "A failure in the SSL library occurred";
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000220 }
221 break;
222 }
223 default:
224 p = PY_SSL_ERROR_INVALID_ERROR_CODE;
225 errstr = "Invalid error code";
226 }
227 } else {
228 errstr = ERR_error_string(ERR_peek_last_error(), NULL);
229 }
230 PyOS_snprintf(buf, sizeof(buf), "_ssl.c:%d: %s", lineno, errstr);
231 v = Py_BuildValue("(is)", p, buf);
232 if (v != NULL) {
233 PyErr_SetObject(PySSLErrorObject, v);
234 Py_DECREF(v);
235 }
236 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000237}
238
Bill Janssen98d19da2007-09-10 21:51:02 +0000239static PyObject *
240_setSSLError (char *errstr, int errcode, char *filename, int lineno) {
241
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000242 char buf[2048];
243 PyObject *v;
Bill Janssen98d19da2007-09-10 21:51:02 +0000244
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000245 if (errstr == NULL) {
246 errcode = ERR_peek_last_error();
247 errstr = ERR_error_string(errcode, NULL);
248 }
249 PyOS_snprintf(buf, sizeof(buf), "_ssl.c:%d: %s", lineno, errstr);
250 v = Py_BuildValue("(is)", errcode, buf);
251 if (v != NULL) {
252 PyErr_SetObject(PySSLErrorObject, v);
253 Py_DECREF(v);
254 }
255 return NULL;
Bill Janssen98d19da2007-09-10 21:51:02 +0000256}
257
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000258static PySSLObject *
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000259newPySSLObject(PySocketSockObject *Sock, char *key_file, char *cert_file,
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000260 enum py_ssl_server_or_client socket_type,
261 enum py_ssl_cert_requirements certreq,
262 enum py_ssl_version proto_version,
263 char *cacerts_file, char *ciphers)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000264{
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000265 PySSLObject *self;
266 char *errstr = NULL;
267 int ret;
268 int verification_mode;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000269
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000270 self = PyObject_New(PySSLObject, &PySSL_Type); /* Create new object */
271 if (self == NULL)
272 return NULL;
273 memset(self->server, '\0', sizeof(char) * X509_NAME_MAXLEN);
274 memset(self->issuer, '\0', sizeof(char) * X509_NAME_MAXLEN);
275 self->peer_cert = NULL;
276 self->ssl = NULL;
277 self->ctx = NULL;
278 self->Socket = NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000279
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000280 /* Make sure the SSL error state is initialized */
281 (void) ERR_get_state();
282 ERR_clear_error();
Bill Janssen98d19da2007-09-10 21:51:02 +0000283
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000284 if ((key_file && !cert_file) || (!key_file && cert_file)) {
285 errstr = ERRSTR("Both the key & certificate files "
286 "must be specified");
287 goto fail;
288 }
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000289
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000290 if ((socket_type == PY_SSL_SERVER) &&
291 ((key_file == NULL) || (cert_file == NULL))) {
292 errstr = ERRSTR("Both the key & certificate files "
293 "must be specified for server-side operation");
294 goto fail;
295 }
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000296
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000297 PySSL_BEGIN_ALLOW_THREADS
298 if (proto_version == PY_SSL_VERSION_TLS1)
299 self->ctx = SSL_CTX_new(TLSv1_method()); /* Set up context */
300 else if (proto_version == PY_SSL_VERSION_SSL3)
301 self->ctx = SSL_CTX_new(SSLv3_method()); /* Set up context */
302 else if (proto_version == PY_SSL_VERSION_SSL2)
303 self->ctx = SSL_CTX_new(SSLv2_method()); /* Set up context */
304 else if (proto_version == PY_SSL_VERSION_SSL23)
305 self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */
306 PySSL_END_ALLOW_THREADS
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000307
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000308 if (self->ctx == NULL) {
309 errstr = ERRSTR("Invalid SSL protocol variant specified.");
310 goto fail;
311 }
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000312
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000313 if (ciphers != NULL) {
314 ret = SSL_CTX_set_cipher_list(self->ctx, ciphers);
315 if (ret == 0) {
316 errstr = ERRSTR("No cipher can be selected.");
317 goto fail;
318 }
319 }
Antoine Pitrou0a6373c2010-04-17 17:10:38 +0000320
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000321 if (certreq != PY_SSL_CERT_NONE) {
322 if (cacerts_file == NULL) {
323 errstr = ERRSTR("No root certificates specified for "
Antoine Pitrou2e136ab2010-05-12 14:02:34 +0000324 "verification of other-side certificates.");
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000325 goto fail;
326 } else {
327 PySSL_BEGIN_ALLOW_THREADS
328 ret = SSL_CTX_load_verify_locations(self->ctx,
329 cacerts_file,
330 NULL);
331 PySSL_END_ALLOW_THREADS
332 if (ret != 1) {
333 _setSSLError(NULL, 0, __FILE__, __LINE__);
334 goto fail;
335 }
336 }
337 }
338 if (key_file) {
339 PySSL_BEGIN_ALLOW_THREADS
340 ret = SSL_CTX_use_PrivateKey_file(self->ctx, key_file,
341 SSL_FILETYPE_PEM);
342 PySSL_END_ALLOW_THREADS
343 if (ret != 1) {
344 _setSSLError(NULL, ret, __FILE__, __LINE__);
345 goto fail;
346 }
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000347
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000348 PySSL_BEGIN_ALLOW_THREADS
349 ret = SSL_CTX_use_certificate_chain_file(self->ctx,
350 cert_file);
351 PySSL_END_ALLOW_THREADS
352 if (ret != 1) {
353 /*
354 fprintf(stderr, "ret is %d, errcode is %lu, %lu, with file \"%s\"\n",
355 ret, ERR_peek_error(), ERR_peek_last_error(), cert_file);
356 */
357 if (ERR_peek_last_error() != 0) {
358 _setSSLError(NULL, ret, __FILE__, __LINE__);
359 goto fail;
360 }
361 }
362 }
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000363
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000364 /* ssl compatibility */
365 SSL_CTX_set_options(self->ctx, SSL_OP_ALL);
Bill Janssen98d19da2007-09-10 21:51:02 +0000366
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000367 verification_mode = SSL_VERIFY_NONE;
368 if (certreq == PY_SSL_CERT_OPTIONAL)
369 verification_mode = SSL_VERIFY_PEER;
370 else if (certreq == PY_SSL_CERT_REQUIRED)
371 verification_mode = (SSL_VERIFY_PEER |
372 SSL_VERIFY_FAIL_IF_NO_PEER_CERT);
373 SSL_CTX_set_verify(self->ctx, verification_mode,
374 NULL); /* set verify lvl */
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000375
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000376 PySSL_BEGIN_ALLOW_THREADS
377 self->ssl = SSL_new(self->ctx); /* New ssl struct */
378 PySSL_END_ALLOW_THREADS
379 SSL_set_fd(self->ssl, Sock->sock_fd); /* Set the socket for SSL */
Antoine Pitrou92719c52010-04-09 20:38:39 +0000380#ifdef SSL_MODE_AUTO_RETRY
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000381 SSL_set_mode(self->ssl, SSL_MODE_AUTO_RETRY);
Antoine Pitrou92719c52010-04-09 20:38:39 +0000382#endif
Guido van Rossum4f707ac2003-01-31 18:13:18 +0000383
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000384 /* If the socket is in non-blocking mode or timeout mode, set the BIO
385 * to non-blocking mode (blocking is the default)
386 */
387 if (Sock->sock_timeout >= 0.0) {
388 /* Set both the read and write BIO's to non-blocking mode */
389 BIO_set_nbio(SSL_get_rbio(self->ssl), 1);
390 BIO_set_nbio(SSL_get_wbio(self->ssl), 1);
391 }
Guido van Rossum4f707ac2003-01-31 18:13:18 +0000392
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000393 PySSL_BEGIN_ALLOW_THREADS
394 if (socket_type == PY_SSL_CLIENT)
395 SSL_set_connect_state(self->ssl);
396 else
397 SSL_set_accept_state(self->ssl);
398 PySSL_END_ALLOW_THREADS
Martin v. Löwis09c35f72002-07-28 09:57:45 +0000399
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000400 self->Socket = Sock;
401 Py_INCREF(self->Socket);
402 return self;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000403 fail:
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000404 if (errstr)
405 PyErr_SetString(PySSLErrorObject, errstr);
406 Py_DECREF(self);
407 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000408}
409
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000410static PyObject *
Guido van Rossum780b80d2007-08-27 18:42:23 +0000411PySSL_sslwrap(PyObject *self, PyObject *args)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000412{
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000413 PySocketSockObject *Sock;
414 int server_side = 0;
415 int verification_mode = PY_SSL_CERT_NONE;
416 int protocol = PY_SSL_VERSION_SSL23;
417 char *key_file = NULL;
418 char *cert_file = NULL;
419 char *cacerts_file = NULL;
420 char *ciphers = NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000421
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000422 if (!PyArg_ParseTuple(args, "O!i|zziizz:sslwrap",
423 PySocketModule.Sock_Type,
424 &Sock,
425 &server_side,
426 &key_file, &cert_file,
427 &verification_mode, &protocol,
428 &cacerts_file, &ciphers))
429 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000430
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000431 /*
432 fprintf(stderr,
433 "server_side is %d, keyfile %p, certfile %p, verify_mode %d, "
434 "protocol %d, certs %p\n",
435 server_side, key_file, cert_file, verification_mode,
436 protocol, cacerts_file);
437 */
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000438
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000439 return (PyObject *) newPySSLObject(Sock, key_file, cert_file,
440 server_side, verification_mode,
441 protocol, cacerts_file,
442 ciphers);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000443}
444
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000445PyDoc_STRVAR(ssl_doc,
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000446"sslwrap(socket, server_side, [keyfile, certfile, certs_mode, protocol,\n"
Antoine Pitrou0a6373c2010-04-17 17:10:38 +0000447" cacertsfile, ciphers]) -> sslobject");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000448
449/* SSL object methods */
450
Bill Janssen934b16d2008-06-28 22:19:33 +0000451static PyObject *PySSL_SSLdo_handshake(PySSLObject *self)
452{
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000453 int ret;
454 int err;
455 int sockstate, nonblocking;
Antoine Pitrou4d3e3722010-04-24 19:57:01 +0000456
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000457 /* just in case the blocking state of the socket has been changed */
458 nonblocking = (self->Socket->sock_timeout >= 0.0);
459 BIO_set_nbio(SSL_get_rbio(self->ssl), nonblocking);
460 BIO_set_nbio(SSL_get_wbio(self->ssl), nonblocking);
Bill Janssen934b16d2008-06-28 22:19:33 +0000461
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000462 /* Actually negotiate SSL connection */
463 /* XXX If SSL_do_handshake() returns 0, it's also a failure. */
464 do {
465 PySSL_BEGIN_ALLOW_THREADS
466 ret = SSL_do_handshake(self->ssl);
467 err = SSL_get_error(self->ssl, ret);
468 PySSL_END_ALLOW_THREADS
469 if(PyErr_CheckSignals()) {
470 return NULL;
471 }
472 if (err == SSL_ERROR_WANT_READ) {
473 sockstate = check_socket_and_wait_for_timeout(self->Socket, 0);
474 } else if (err == SSL_ERROR_WANT_WRITE) {
475 sockstate = check_socket_and_wait_for_timeout(self->Socket, 1);
476 } else {
477 sockstate = SOCKET_OPERATION_OK;
478 }
479 if (sockstate == SOCKET_HAS_TIMED_OUT) {
480 PyErr_SetString(PySSLErrorObject,
Antoine Pitrou2e136ab2010-05-12 14:02:34 +0000481 ERRSTR("The handshake operation timed out"));
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000482 return NULL;
483 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
484 PyErr_SetString(PySSLErrorObject,
Antoine Pitrou2e136ab2010-05-12 14:02:34 +0000485 ERRSTR("Underlying socket has been closed."));
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000486 return NULL;
487 } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
488 PyErr_SetString(PySSLErrorObject,
Antoine Pitrou2e136ab2010-05-12 14:02:34 +0000489 ERRSTR("Underlying socket too large for select()."));
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000490 return NULL;
491 } else if (sockstate == SOCKET_IS_NONBLOCKING) {
492 break;
493 }
494 } while (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE);
495 if (ret < 1)
496 return PySSL_SetError(self, ret, __FILE__, __LINE__);
497 self->ssl->debug = 1;
Bill Janssen934b16d2008-06-28 22:19:33 +0000498
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000499 if (self->peer_cert)
500 X509_free (self->peer_cert);
501 PySSL_BEGIN_ALLOW_THREADS
502 if ((self->peer_cert = SSL_get_peer_certificate(self->ssl))) {
503 X509_NAME_oneline(X509_get_subject_name(self->peer_cert),
504 self->server, X509_NAME_MAXLEN);
505 X509_NAME_oneline(X509_get_issuer_name(self->peer_cert),
506 self->issuer, X509_NAME_MAXLEN);
507 }
508 PySSL_END_ALLOW_THREADS
Bill Janssen934b16d2008-06-28 22:19:33 +0000509
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000510 Py_INCREF(Py_None);
511 return Py_None;
Bill Janssen934b16d2008-06-28 22:19:33 +0000512}
513
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000514static PyObject *
515PySSL_server(PySSLObject *self)
516{
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000517 return PyString_FromString(self->server);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000518}
519
520static PyObject *
521PySSL_issuer(PySSLObject *self)
522{
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000523 return PyString_FromString(self->issuer);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000524}
525
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000526static PyObject *
Bill Janssen98d19da2007-09-10 21:51:02 +0000527_create_tuple_for_attribute (ASN1_OBJECT *name, ASN1_STRING *value) {
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000528
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000529 char namebuf[X509_NAME_MAXLEN];
530 int buflen;
531 PyObject *name_obj;
532 PyObject *value_obj;
533 PyObject *attr;
534 unsigned char *valuebuf = NULL;
Guido van Rossum780b80d2007-08-27 18:42:23 +0000535
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000536 buflen = OBJ_obj2txt(namebuf, sizeof(namebuf), name, 0);
537 if (buflen < 0) {
538 _setSSLError(NULL, 0, __FILE__, __LINE__);
539 goto fail;
540 }
541 name_obj = PyString_FromStringAndSize(namebuf, buflen);
542 if (name_obj == NULL)
543 goto fail;
544
545 buflen = ASN1_STRING_to_UTF8(&valuebuf, value);
546 if (buflen < 0) {
547 _setSSLError(NULL, 0, __FILE__, __LINE__);
548 Py_DECREF(name_obj);
549 goto fail;
550 }
551 value_obj = PyUnicode_DecodeUTF8((char *) valuebuf,
Antoine Pitrou2e136ab2010-05-12 14:02:34 +0000552 buflen, "strict");
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000553 OPENSSL_free(valuebuf);
554 if (value_obj == NULL) {
555 Py_DECREF(name_obj);
556 goto fail;
557 }
558 attr = PyTuple_New(2);
559 if (attr == NULL) {
560 Py_DECREF(name_obj);
561 Py_DECREF(value_obj);
562 goto fail;
563 }
564 PyTuple_SET_ITEM(attr, 0, name_obj);
565 PyTuple_SET_ITEM(attr, 1, value_obj);
566 return attr;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000567
Bill Janssen98d19da2007-09-10 21:51:02 +0000568 fail:
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000569 return NULL;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000570}
571
572static PyObject *
Bill Janssen98d19da2007-09-10 21:51:02 +0000573_create_tuple_for_X509_NAME (X509_NAME *xname)
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000574{
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000575 PyObject *dn = NULL; /* tuple which represents the "distinguished name" */
576 PyObject *rdn = NULL; /* tuple to hold a "relative distinguished name" */
577 PyObject *rdnt;
578 PyObject *attr = NULL; /* tuple to hold an attribute */
579 int entry_count = X509_NAME_entry_count(xname);
580 X509_NAME_ENTRY *entry;
581 ASN1_OBJECT *name;
582 ASN1_STRING *value;
583 int index_counter;
584 int rdn_level = -1;
585 int retcode;
Bill Janssen98d19da2007-09-10 21:51:02 +0000586
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000587 dn = PyList_New(0);
588 if (dn == NULL)
589 return NULL;
590 /* now create another tuple to hold the top-level RDN */
591 rdn = PyList_New(0);
592 if (rdn == NULL)
593 goto fail0;
Bill Janssen98d19da2007-09-10 21:51:02 +0000594
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000595 for (index_counter = 0;
596 index_counter < entry_count;
597 index_counter++)
598 {
599 entry = X509_NAME_get_entry(xname, index_counter);
Bill Janssen98d19da2007-09-10 21:51:02 +0000600
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000601 /* check to see if we've gotten to a new RDN */
602 if (rdn_level >= 0) {
603 if (rdn_level != entry->set) {
604 /* yes, new RDN */
605 /* add old RDN to DN */
606 rdnt = PyList_AsTuple(rdn);
607 Py_DECREF(rdn);
608 if (rdnt == NULL)
609 goto fail0;
610 retcode = PyList_Append(dn, rdnt);
611 Py_DECREF(rdnt);
612 if (retcode < 0)
613 goto fail0;
614 /* create new RDN */
615 rdn = PyList_New(0);
616 if (rdn == NULL)
617 goto fail0;
618 }
619 }
620 rdn_level = entry->set;
Bill Janssen98d19da2007-09-10 21:51:02 +0000621
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000622 /* now add this attribute to the current RDN */
623 name = X509_NAME_ENTRY_get_object(entry);
624 value = X509_NAME_ENTRY_get_data(entry);
625 attr = _create_tuple_for_attribute(name, value);
626 /*
627 fprintf(stderr, "RDN level %d, attribute %s: %s\n",
628 entry->set,
629 PyString_AS_STRING(PyTuple_GET_ITEM(attr, 0)),
630 PyString_AS_STRING(PyTuple_GET_ITEM(attr, 1)));
631 */
632 if (attr == NULL)
633 goto fail1;
634 retcode = PyList_Append(rdn, attr);
635 Py_DECREF(attr);
636 if (retcode < 0)
637 goto fail1;
638 }
639 /* now, there's typically a dangling RDN */
640 if ((rdn != NULL) && (PyList_Size(rdn) > 0)) {
641 rdnt = PyList_AsTuple(rdn);
642 Py_DECREF(rdn);
643 if (rdnt == NULL)
644 goto fail0;
645 retcode = PyList_Append(dn, rdnt);
646 Py_DECREF(rdnt);
647 if (retcode < 0)
648 goto fail0;
649 }
Bill Janssen98d19da2007-09-10 21:51:02 +0000650
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000651 /* convert list to tuple */
652 rdnt = PyList_AsTuple(dn);
653 Py_DECREF(dn);
654 if (rdnt == NULL)
655 return NULL;
656 return rdnt;
Bill Janssen98d19da2007-09-10 21:51:02 +0000657
658 fail1:
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000659 Py_XDECREF(rdn);
Bill Janssen98d19da2007-09-10 21:51:02 +0000660
661 fail0:
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000662 Py_XDECREF(dn);
663 return NULL;
Bill Janssen98d19da2007-09-10 21:51:02 +0000664}
665
666static PyObject *
667_get_peer_alt_names (X509 *certificate) {
Bill Janssen98d19da2007-09-10 21:51:02 +0000668
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000669 /* this code follows the procedure outlined in
670 OpenSSL's crypto/x509v3/v3_prn.c:X509v3_EXT_print()
671 function to extract the STACK_OF(GENERAL_NAME),
672 then iterates through the stack to add the
673 names. */
674
675 int i, j;
676 PyObject *peer_alt_names = Py_None;
677 PyObject *v, *t;
678 X509_EXTENSION *ext = NULL;
679 GENERAL_NAMES *names = NULL;
680 GENERAL_NAME *name;
681 X509V3_EXT_METHOD *method;
682 BIO *biobuf = NULL;
683 char buf[2048];
684 char *vptr;
685 int len;
686 /* Issue #2973: ASN1_item_d2i() API changed in OpenSSL 0.9.6m */
Victor Stinner3f75cc52010-03-02 22:44:42 +0000687#if OPENSSL_VERSION_NUMBER >= 0x009060dfL
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000688 const unsigned char *p;
Victor Stinner3f75cc52010-03-02 22:44:42 +0000689#else
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000690 unsigned char *p;
Victor Stinner3f75cc52010-03-02 22:44:42 +0000691#endif
Bill Janssen98d19da2007-09-10 21:51:02 +0000692
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000693 if (certificate == NULL)
694 return peer_alt_names;
Bill Janssen98d19da2007-09-10 21:51:02 +0000695
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000696 /* get a memory buffer */
697 biobuf = BIO_new(BIO_s_mem());
Bill Janssen98d19da2007-09-10 21:51:02 +0000698
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000699 i = 0;
700 while ((i = X509_get_ext_by_NID(
701 certificate, NID_subject_alt_name, i)) >= 0) {
Bill Janssen98d19da2007-09-10 21:51:02 +0000702
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000703 if (peer_alt_names == Py_None) {
704 peer_alt_names = PyList_New(0);
705 if (peer_alt_names == NULL)
706 goto fail;
707 }
Bill Janssen98d19da2007-09-10 21:51:02 +0000708
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000709 /* now decode the altName */
710 ext = X509_get_ext(certificate, i);
711 if(!(method = X509V3_EXT_get(ext))) {
712 PyErr_SetString(PySSLErrorObject,
713 ERRSTR("No method for internalizing subjectAltName!"));
714 goto fail;
715 }
Bill Janssen98d19da2007-09-10 21:51:02 +0000716
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000717 p = ext->value->data;
718 if (method->it)
719 names = (GENERAL_NAMES*) (ASN1_item_d2i(NULL,
720 &p,
721 ext->value->length,
722 ASN1_ITEM_ptr(method->it)));
723 else
724 names = (GENERAL_NAMES*) (method->d2i(NULL,
725 &p,
726 ext->value->length));
Bill Janssen98d19da2007-09-10 21:51:02 +0000727
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000728 for(j = 0; j < sk_GENERAL_NAME_num(names); j++) {
Bill Janssen98d19da2007-09-10 21:51:02 +0000729
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000730 /* get a rendering of each name in the set of names */
Bill Janssen98d19da2007-09-10 21:51:02 +0000731
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000732 name = sk_GENERAL_NAME_value(names, j);
733 if (name->type == GEN_DIRNAME) {
Bill Janssen98d19da2007-09-10 21:51:02 +0000734
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000735 /* we special-case DirName as a tuple of tuples of attributes */
Bill Janssen98d19da2007-09-10 21:51:02 +0000736
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000737 t = PyTuple_New(2);
738 if (t == NULL) {
739 goto fail;
740 }
Bill Janssen98d19da2007-09-10 21:51:02 +0000741
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000742 v = PyString_FromString("DirName");
743 if (v == NULL) {
744 Py_DECREF(t);
745 goto fail;
746 }
747 PyTuple_SET_ITEM(t, 0, v);
Bill Janssen98d19da2007-09-10 21:51:02 +0000748
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000749 v = _create_tuple_for_X509_NAME (name->d.dirn);
750 if (v == NULL) {
751 Py_DECREF(t);
752 goto fail;
753 }
754 PyTuple_SET_ITEM(t, 1, v);
Bill Janssen98d19da2007-09-10 21:51:02 +0000755
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000756 } else {
Bill Janssen98d19da2007-09-10 21:51:02 +0000757
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000758 /* for everything else, we use the OpenSSL print form */
Bill Janssen98d19da2007-09-10 21:51:02 +0000759
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000760 (void) BIO_reset(biobuf);
761 GENERAL_NAME_print(biobuf, name);
762 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
763 if (len < 0) {
764 _setSSLError(NULL, 0, __FILE__, __LINE__);
765 goto fail;
766 }
767 vptr = strchr(buf, ':');
768 if (vptr == NULL)
769 goto fail;
770 t = PyTuple_New(2);
771 if (t == NULL)
772 goto fail;
773 v = PyString_FromStringAndSize(buf, (vptr - buf));
774 if (v == NULL) {
775 Py_DECREF(t);
776 goto fail;
777 }
778 PyTuple_SET_ITEM(t, 0, v);
779 v = PyString_FromStringAndSize((vptr + 1), (len - (vptr - buf + 1)));
780 if (v == NULL) {
781 Py_DECREF(t);
782 goto fail;
783 }
784 PyTuple_SET_ITEM(t, 1, v);
785 }
786
787 /* and add that rendering to the list */
788
789 if (PyList_Append(peer_alt_names, t) < 0) {
790 Py_DECREF(t);
791 goto fail;
792 }
793 Py_DECREF(t);
794 }
795 }
796 BIO_free(biobuf);
797 if (peer_alt_names != Py_None) {
798 v = PyList_AsTuple(peer_alt_names);
799 Py_DECREF(peer_alt_names);
800 return v;
801 } else {
802 return peer_alt_names;
803 }
804
Bill Janssen98d19da2007-09-10 21:51:02 +0000805
806 fail:
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000807 if (biobuf != NULL)
808 BIO_free(biobuf);
Bill Janssen98d19da2007-09-10 21:51:02 +0000809
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000810 if (peer_alt_names != Py_None) {
811 Py_XDECREF(peer_alt_names);
812 }
Bill Janssen98d19da2007-09-10 21:51:02 +0000813
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000814 return NULL;
Bill Janssen98d19da2007-09-10 21:51:02 +0000815}
816
817static PyObject *
818_decode_certificate (X509 *certificate, int verbose) {
819
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000820 PyObject *retval = NULL;
821 BIO *biobuf = NULL;
822 PyObject *peer;
823 PyObject *peer_alt_names = NULL;
824 PyObject *issuer;
825 PyObject *version;
826 PyObject *sn_obj;
827 ASN1_INTEGER *serialNumber;
828 char buf[2048];
829 int len;
830 ASN1_TIME *notBefore, *notAfter;
831 PyObject *pnotBefore, *pnotAfter;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000832
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000833 retval = PyDict_New();
834 if (retval == NULL)
835 return NULL;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000836
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000837 peer = _create_tuple_for_X509_NAME(
838 X509_get_subject_name(certificate));
839 if (peer == NULL)
840 goto fail0;
841 if (PyDict_SetItemString(retval, (const char *) "subject", peer) < 0) {
842 Py_DECREF(peer);
843 goto fail0;
844 }
845 Py_DECREF(peer);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000846
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000847 if (verbose) {
848 issuer = _create_tuple_for_X509_NAME(
849 X509_get_issuer_name(certificate));
850 if (issuer == NULL)
851 goto fail0;
852 if (PyDict_SetItemString(retval, (const char *)"issuer", issuer) < 0) {
853 Py_DECREF(issuer);
854 goto fail0;
855 }
856 Py_DECREF(issuer);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000857
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000858 version = PyInt_FromLong(X509_get_version(certificate) + 1);
859 if (PyDict_SetItemString(retval, "version", version) < 0) {
860 Py_DECREF(version);
861 goto fail0;
862 }
863 Py_DECREF(version);
864 }
Bill Janssen98d19da2007-09-10 21:51:02 +0000865
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000866 /* get a memory buffer */
867 biobuf = BIO_new(BIO_s_mem());
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000868
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000869 if (verbose) {
Bill Janssen98d19da2007-09-10 21:51:02 +0000870
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000871 (void) BIO_reset(biobuf);
872 serialNumber = X509_get_serialNumber(certificate);
873 /* should not exceed 20 octets, 160 bits, so buf is big enough */
874 i2a_ASN1_INTEGER(biobuf, serialNumber);
875 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
876 if (len < 0) {
877 _setSSLError(NULL, 0, __FILE__, __LINE__);
878 goto fail1;
879 }
880 sn_obj = PyString_FromStringAndSize(buf, len);
881 if (sn_obj == NULL)
882 goto fail1;
883 if (PyDict_SetItemString(retval, "serialNumber", sn_obj) < 0) {
884 Py_DECREF(sn_obj);
885 goto fail1;
886 }
887 Py_DECREF(sn_obj);
Bill Janssen98d19da2007-09-10 21:51:02 +0000888
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000889 (void) BIO_reset(biobuf);
890 notBefore = X509_get_notBefore(certificate);
891 ASN1_TIME_print(biobuf, notBefore);
892 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
893 if (len < 0) {
894 _setSSLError(NULL, 0, __FILE__, __LINE__);
895 goto fail1;
896 }
897 pnotBefore = PyString_FromStringAndSize(buf, len);
898 if (pnotBefore == NULL)
899 goto fail1;
900 if (PyDict_SetItemString(retval, "notBefore", pnotBefore) < 0) {
901 Py_DECREF(pnotBefore);
902 goto fail1;
903 }
904 Py_DECREF(pnotBefore);
905 }
906
907 (void) BIO_reset(biobuf);
908 notAfter = X509_get_notAfter(certificate);
909 ASN1_TIME_print(biobuf, notAfter);
910 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
911 if (len < 0) {
912 _setSSLError(NULL, 0, __FILE__, __LINE__);
913 goto fail1;
914 }
915 pnotAfter = PyString_FromStringAndSize(buf, len);
916 if (pnotAfter == NULL)
917 goto fail1;
918 if (PyDict_SetItemString(retval, "notAfter", pnotAfter) < 0) {
919 Py_DECREF(pnotAfter);
920 goto fail1;
921 }
922 Py_DECREF(pnotAfter);
923
924 /* Now look for subjectAltName */
925
926 peer_alt_names = _get_peer_alt_names(certificate);
927 if (peer_alt_names == NULL)
928 goto fail1;
929 else if (peer_alt_names != Py_None) {
930 if (PyDict_SetItemString(retval, "subjectAltName",
931 peer_alt_names) < 0) {
932 Py_DECREF(peer_alt_names);
933 goto fail1;
934 }
935 Py_DECREF(peer_alt_names);
936 }
937
938 BIO_free(biobuf);
939 return retval;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000940
941 fail1:
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000942 if (biobuf != NULL)
943 BIO_free(biobuf);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000944 fail0:
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000945 Py_XDECREF(retval);
946 return NULL;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000947}
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000948
Bill Janssen98d19da2007-09-10 21:51:02 +0000949
950static PyObject *
951PySSL_test_decode_certificate (PyObject *mod, PyObject *args) {
952
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000953 PyObject *retval = NULL;
954 char *filename = NULL;
955 X509 *x=NULL;
956 BIO *cert;
957 int verbose = 1;
Bill Janssen98d19da2007-09-10 21:51:02 +0000958
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000959 if (!PyArg_ParseTuple(args, "s|i:test_decode_certificate", &filename, &verbose))
960 return NULL;
Bill Janssen98d19da2007-09-10 21:51:02 +0000961
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000962 if ((cert=BIO_new(BIO_s_file())) == NULL) {
963 PyErr_SetString(PySSLErrorObject, "Can't malloc memory to read file");
964 goto fail0;
965 }
Bill Janssen98d19da2007-09-10 21:51:02 +0000966
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000967 if (BIO_read_filename(cert,filename) <= 0) {
968 PyErr_SetString(PySSLErrorObject, "Can't open file");
969 goto fail0;
970 }
Bill Janssen98d19da2007-09-10 21:51:02 +0000971
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000972 x = PEM_read_bio_X509_AUX(cert,NULL, NULL, NULL);
973 if (x == NULL) {
974 PyErr_SetString(PySSLErrorObject, "Error decoding PEM-encoded file");
975 goto fail0;
976 }
Bill Janssen98d19da2007-09-10 21:51:02 +0000977
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000978 retval = _decode_certificate(x, verbose);
Bill Janssen98d19da2007-09-10 21:51:02 +0000979
980 fail0:
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000981
982 if (cert != NULL) BIO_free(cert);
983 return retval;
Bill Janssen98d19da2007-09-10 21:51:02 +0000984}
985
986
987static PyObject *
988PySSL_peercert(PySSLObject *self, PyObject *args)
989{
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000990 PyObject *retval = NULL;
991 int len;
992 int verification;
993 PyObject *binary_mode = Py_None;
Bill Janssen98d19da2007-09-10 21:51:02 +0000994
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000995 if (!PyArg_ParseTuple(args, "|O:peer_certificate", &binary_mode))
996 return NULL;
Bill Janssen98d19da2007-09-10 21:51:02 +0000997
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000998 if (!self->peer_cert)
999 Py_RETURN_NONE;
Bill Janssen98d19da2007-09-10 21:51:02 +00001000
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001001 if (PyObject_IsTrue(binary_mode)) {
1002 /* return cert in DER-encoded format */
Bill Janssen98d19da2007-09-10 21:51:02 +00001003
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001004 unsigned char *bytes_buf = NULL;
Bill Janssen98d19da2007-09-10 21:51:02 +00001005
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001006 bytes_buf = NULL;
1007 len = i2d_X509(self->peer_cert, &bytes_buf);
1008 if (len < 0) {
1009 PySSL_SetError(self, len, __FILE__, __LINE__);
1010 return NULL;
1011 }
1012 retval = PyString_FromStringAndSize((const char *) bytes_buf, len);
1013 OPENSSL_free(bytes_buf);
1014 return retval;
Bill Janssen98d19da2007-09-10 21:51:02 +00001015
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001016 } else {
Bill Janssen98d19da2007-09-10 21:51:02 +00001017
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001018 verification = SSL_CTX_get_verify_mode(self->ctx);
1019 if ((verification & SSL_VERIFY_PEER) == 0)
1020 return PyDict_New();
1021 else
1022 return _decode_certificate (self->peer_cert, 0);
1023 }
Bill Janssen98d19da2007-09-10 21:51:02 +00001024}
1025
1026PyDoc_STRVAR(PySSL_peercert_doc,
1027"peer_certificate([der=False]) -> certificate\n\
1028\n\
1029Returns the certificate for the peer. If no certificate was provided,\n\
1030returns None. If a certificate was provided, but not validated, returns\n\
1031an empty dictionary. Otherwise returns a dict containing information\n\
1032about the peer certificate.\n\
1033\n\
1034If the optional argument is True, returns a DER-encoded copy of the\n\
1035peer certificate, or None if no certificate was provided. This will\n\
1036return the certificate even if it wasn't validated.");
1037
1038static PyObject *PySSL_cipher (PySSLObject *self) {
1039
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001040 PyObject *retval, *v;
1041 SSL_CIPHER *current;
1042 char *cipher_name;
1043 char *cipher_protocol;
Bill Janssen98d19da2007-09-10 21:51:02 +00001044
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001045 if (self->ssl == NULL)
1046 return Py_None;
1047 current = SSL_get_current_cipher(self->ssl);
1048 if (current == NULL)
1049 return Py_None;
Bill Janssen98d19da2007-09-10 21:51:02 +00001050
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001051 retval = PyTuple_New(3);
1052 if (retval == NULL)
1053 return NULL;
Bill Janssen98d19da2007-09-10 21:51:02 +00001054
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001055 cipher_name = (char *) SSL_CIPHER_get_name(current);
1056 if (cipher_name == NULL) {
1057 PyTuple_SET_ITEM(retval, 0, Py_None);
1058 } else {
1059 v = PyString_FromString(cipher_name);
1060 if (v == NULL)
1061 goto fail0;
1062 PyTuple_SET_ITEM(retval, 0, v);
1063 }
1064 cipher_protocol = SSL_CIPHER_get_version(current);
1065 if (cipher_protocol == NULL) {
1066 PyTuple_SET_ITEM(retval, 1, Py_None);
1067 } else {
1068 v = PyString_FromString(cipher_protocol);
1069 if (v == NULL)
1070 goto fail0;
1071 PyTuple_SET_ITEM(retval, 1, v);
1072 }
1073 v = PyInt_FromLong(SSL_CIPHER_get_bits(current, NULL));
1074 if (v == NULL)
1075 goto fail0;
1076 PyTuple_SET_ITEM(retval, 2, v);
1077 return retval;
1078
Bill Janssen98d19da2007-09-10 21:51:02 +00001079 fail0:
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001080 Py_DECREF(retval);
1081 return NULL;
Bill Janssen98d19da2007-09-10 21:51:02 +00001082}
1083
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001084static void PySSL_dealloc(PySSLObject *self)
1085{
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001086 if (self->peer_cert) /* Possible not to have one? */
1087 X509_free (self->peer_cert);
1088 if (self->ssl)
1089 SSL_free(self->ssl);
1090 if (self->ctx)
1091 SSL_CTX_free(self->ctx);
1092 Py_XDECREF(self->Socket);
1093 PyObject_Del(self);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001094}
1095
Anthony Baxter93ab5fa2006-07-11 02:04:09 +00001096/* If the socket has a timeout, do a select()/poll() on the socket.
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001097 The argument writing indicates the direction.
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001098 Returns one of the possibilities in the timeout_state enum (above).
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001099 */
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001100
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001101static int
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001102check_socket_and_wait_for_timeout(PySocketSockObject *s, int writing)
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001103{
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001104 fd_set fds;
1105 struct timeval tv;
1106 int rc;
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001107
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001108 /* Nothing to do unless we're in timeout mode (not non-blocking) */
1109 if (s->sock_timeout < 0.0)
1110 return SOCKET_IS_BLOCKING;
1111 else if (s->sock_timeout == 0.0)
1112 return SOCKET_IS_NONBLOCKING;
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001113
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001114 /* Guard against closed socket */
1115 if (s->sock_fd < 0)
1116 return SOCKET_HAS_BEEN_CLOSED;
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001117
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001118 /* Prefer poll, if available, since you can poll() any fd
1119 * which can't be done with select(). */
Anthony Baxter93ab5fa2006-07-11 02:04:09 +00001120#ifdef HAVE_POLL
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001121 {
1122 struct pollfd pollfd;
1123 int timeout;
Anthony Baxter93ab5fa2006-07-11 02:04:09 +00001124
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001125 pollfd.fd = s->sock_fd;
1126 pollfd.events = writing ? POLLOUT : POLLIN;
Anthony Baxter93ab5fa2006-07-11 02:04:09 +00001127
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001128 /* s->sock_timeout is in seconds, timeout in ms */
1129 timeout = (int)(s->sock_timeout * 1000 + 0.5);
1130 PySSL_BEGIN_ALLOW_THREADS
1131 rc = poll(&pollfd, 1, timeout);
1132 PySSL_END_ALLOW_THREADS
Anthony Baxter93ab5fa2006-07-11 02:04:09 +00001133
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001134 goto normal_return;
1135 }
Anthony Baxter93ab5fa2006-07-11 02:04:09 +00001136#endif
1137
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001138 /* Guard against socket too large for select*/
Martin v. Löwisf84d1b92006-02-11 09:27:05 +00001139#ifndef Py_SOCKET_FD_CAN_BE_GE_FD_SETSIZE
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001140 if (s->sock_fd >= FD_SETSIZE)
1141 return SOCKET_TOO_LARGE_FOR_SELECT;
Martin v. Löwisf84d1b92006-02-11 09:27:05 +00001142#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +00001143
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001144 /* Construct the arguments to select */
1145 tv.tv_sec = (int)s->sock_timeout;
1146 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
1147 FD_ZERO(&fds);
1148 FD_SET(s->sock_fd, &fds);
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001149
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001150 /* See if the socket is ready */
1151 PySSL_BEGIN_ALLOW_THREADS
1152 if (writing)
1153 rc = select(s->sock_fd+1, NULL, &fds, NULL, &tv);
1154 else
1155 rc = select(s->sock_fd+1, &fds, NULL, NULL, &tv);
1156 PySSL_END_ALLOW_THREADS
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001157
Bill Janssen934b16d2008-06-28 22:19:33 +00001158#ifdef HAVE_POLL
Anthony Baxter93ab5fa2006-07-11 02:04:09 +00001159normal_return:
Bill Janssen934b16d2008-06-28 22:19:33 +00001160#endif
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001161 /* Return SOCKET_TIMED_OUT on timeout, SOCKET_OPERATION_OK otherwise
1162 (when we are able to write or when there's something to read) */
1163 return rc == 0 ? SOCKET_HAS_TIMED_OUT : SOCKET_OPERATION_OK;
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001164}
1165
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001166static PyObject *PySSL_SSLwrite(PySSLObject *self, PyObject *args)
1167{
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001168 Py_buffer buf;
1169 int len;
1170 int sockstate;
1171 int err;
1172 int nonblocking;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001173
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001174 if (!PyArg_ParseTuple(args, "s*:write", &buf))
1175 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001176
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001177 /* just in case the blocking state of the socket has been changed */
1178 nonblocking = (self->Socket->sock_timeout >= 0.0);
1179 BIO_set_nbio(SSL_get_rbio(self->ssl), nonblocking);
1180 BIO_set_nbio(SSL_get_wbio(self->ssl), nonblocking);
Bill Janssen934b16d2008-06-28 22:19:33 +00001181
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001182 sockstate = check_socket_and_wait_for_timeout(self->Socket, 1);
1183 if (sockstate == SOCKET_HAS_TIMED_OUT) {
1184 PyErr_SetString(PySSLErrorObject,
1185 "The write operation timed out");
1186 goto error;
1187 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
1188 PyErr_SetString(PySSLErrorObject,
1189 "Underlying socket has been closed.");
1190 goto error;
1191 } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
1192 PyErr_SetString(PySSLErrorObject,
1193 "Underlying socket too large for select().");
1194 goto error;
1195 }
1196 do {
1197 PySSL_BEGIN_ALLOW_THREADS
1198 len = SSL_write(self->ssl, buf.buf, buf.len);
1199 err = SSL_get_error(self->ssl, len);
1200 PySSL_END_ALLOW_THREADS
1201 if (PyErr_CheckSignals()) {
1202 goto error;
1203 }
1204 if (err == SSL_ERROR_WANT_READ) {
Antoine Pitrou2e136ab2010-05-12 14:02:34 +00001205 sockstate = check_socket_and_wait_for_timeout(self->Socket, 0);
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001206 } else if (err == SSL_ERROR_WANT_WRITE) {
Antoine Pitrou2e136ab2010-05-12 14:02:34 +00001207 sockstate = check_socket_and_wait_for_timeout(self->Socket, 1);
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001208 } else {
1209 sockstate = SOCKET_OPERATION_OK;
1210 }
1211 if (sockstate == SOCKET_HAS_TIMED_OUT) {
1212 PyErr_SetString(PySSLErrorObject,
1213 "The write operation timed out");
1214 goto error;
1215 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
1216 PyErr_SetString(PySSLErrorObject,
1217 "Underlying socket has been closed.");
1218 goto error;
1219 } else if (sockstate == SOCKET_IS_NONBLOCKING) {
1220 break;
1221 }
1222 } while (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE);
Antoine Pitrou5ba84912009-10-19 17:59:07 +00001223
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001224 PyBuffer_Release(&buf);
1225 if (len > 0)
1226 return PyInt_FromLong(len);
1227 else
1228 return PySSL_SetError(self, len, __FILE__, __LINE__);
Antoine Pitrou5ba84912009-10-19 17:59:07 +00001229
1230error:
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001231 PyBuffer_Release(&buf);
1232 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001233}
1234
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001235PyDoc_STRVAR(PySSL_SSLwrite_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001236"write(s) -> len\n\
1237\n\
1238Writes the string s into the SSL object. Returns the number\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001239of bytes written.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001240
Bill Janssen934b16d2008-06-28 22:19:33 +00001241static PyObject *PySSL_SSLpending(PySSLObject *self)
1242{
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001243 int count = 0;
Bill Janssen934b16d2008-06-28 22:19:33 +00001244
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001245 PySSL_BEGIN_ALLOW_THREADS
1246 count = SSL_pending(self->ssl);
1247 PySSL_END_ALLOW_THREADS
1248 if (count < 0)
1249 return PySSL_SetError(self, count, __FILE__, __LINE__);
1250 else
1251 return PyInt_FromLong(count);
Bill Janssen934b16d2008-06-28 22:19:33 +00001252}
1253
1254PyDoc_STRVAR(PySSL_SSLpending_doc,
1255"pending() -> count\n\
1256\n\
1257Returns the number of already decrypted bytes available for read,\n\
1258pending on the connection.\n");
1259
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001260static PyObject *PySSL_SSLread(PySSLObject *self, PyObject *args)
1261{
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001262 PyObject *buf;
1263 int count = 0;
1264 int len = 1024;
1265 int sockstate;
1266 int err;
1267 int nonblocking;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001268
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001269 if (!PyArg_ParseTuple(args, "|i:read", &len))
1270 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001271
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001272 if (!(buf = PyString_FromStringAndSize((char *) 0, len)))
1273 return NULL;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001274
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001275 /* just in case the blocking state of the socket has been changed */
1276 nonblocking = (self->Socket->sock_timeout >= 0.0);
1277 BIO_set_nbio(SSL_get_rbio(self->ssl), nonblocking);
1278 BIO_set_nbio(SSL_get_wbio(self->ssl), nonblocking);
Bill Janssen934b16d2008-06-28 22:19:33 +00001279
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001280 /* first check if there are bytes ready to be read */
1281 PySSL_BEGIN_ALLOW_THREADS
1282 count = SSL_pending(self->ssl);
1283 PySSL_END_ALLOW_THREADS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001284
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001285 if (!count) {
1286 sockstate = check_socket_and_wait_for_timeout(self->Socket, 0);
1287 if (sockstate == SOCKET_HAS_TIMED_OUT) {
1288 PyErr_SetString(PySSLErrorObject,
1289 "The read operation timed out");
1290 Py_DECREF(buf);
1291 return NULL;
1292 } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
1293 PyErr_SetString(PySSLErrorObject,
Antoine Pitrou2e136ab2010-05-12 14:02:34 +00001294 "Underlying socket too large for select().");
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001295 Py_DECREF(buf);
1296 return NULL;
1297 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
1298 if (SSL_get_shutdown(self->ssl) !=
1299 SSL_RECEIVED_SHUTDOWN)
1300 {
1301 Py_DECREF(buf);
1302 PyErr_SetString(PySSLErrorObject,
Antoine Pitrou2e136ab2010-05-12 14:02:34 +00001303 "Socket closed without SSL shutdown handshake");
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001304 return NULL;
1305 } else {
1306 /* should contain a zero-length string */
1307 _PyString_Resize(&buf, 0);
1308 return buf;
1309 }
1310 }
1311 }
1312 do {
1313 PySSL_BEGIN_ALLOW_THREADS
1314 count = SSL_read(self->ssl, PyString_AsString(buf), len);
1315 err = SSL_get_error(self->ssl, count);
1316 PySSL_END_ALLOW_THREADS
1317 if(PyErr_CheckSignals()) {
1318 Py_DECREF(buf);
1319 return NULL;
1320 }
1321 if (err == SSL_ERROR_WANT_READ) {
Antoine Pitrou2e136ab2010-05-12 14:02:34 +00001322 sockstate = check_socket_and_wait_for_timeout(self->Socket, 0);
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001323 } else if (err == SSL_ERROR_WANT_WRITE) {
Antoine Pitrou2e136ab2010-05-12 14:02:34 +00001324 sockstate = check_socket_and_wait_for_timeout(self->Socket, 1);
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001325 } else if ((err == SSL_ERROR_ZERO_RETURN) &&
1326 (SSL_get_shutdown(self->ssl) ==
1327 SSL_RECEIVED_SHUTDOWN))
1328 {
1329 _PyString_Resize(&buf, 0);
1330 return buf;
1331 } else {
1332 sockstate = SOCKET_OPERATION_OK;
1333 }
1334 if (sockstate == SOCKET_HAS_TIMED_OUT) {
1335 PyErr_SetString(PySSLErrorObject,
1336 "The read operation timed out");
1337 Py_DECREF(buf);
1338 return NULL;
1339 } else if (sockstate == SOCKET_IS_NONBLOCKING) {
1340 break;
1341 }
1342 } while (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE);
1343 if (count <= 0) {
1344 Py_DECREF(buf);
1345 return PySSL_SetError(self, count, __FILE__, __LINE__);
1346 }
1347 if (count != len)
1348 _PyString_Resize(&buf, count);
1349 return buf;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001350}
1351
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001352PyDoc_STRVAR(PySSL_SSLread_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001353"read([len]) -> string\n\
1354\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001355Read up to len bytes from the SSL socket.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001356
Bill Janssen934b16d2008-06-28 22:19:33 +00001357static PyObject *PySSL_SSLshutdown(PySSLObject *self)
1358{
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001359 int err, ssl_err, sockstate, nonblocking;
1360 int zeros = 0;
Bill Janssen934b16d2008-06-28 22:19:33 +00001361
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001362 /* Guard against closed socket */
1363 if (self->Socket->sock_fd < 0) {
1364 PyErr_SetString(PySSLErrorObject,
1365 "Underlying socket has been closed.");
1366 return NULL;
1367 }
Bill Janssen934b16d2008-06-28 22:19:33 +00001368
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001369 /* Just in case the blocking state of the socket has been changed */
1370 nonblocking = (self->Socket->sock_timeout >= 0.0);
1371 BIO_set_nbio(SSL_get_rbio(self->ssl), nonblocking);
1372 BIO_set_nbio(SSL_get_wbio(self->ssl), nonblocking);
Antoine Pitroua5c4b552010-04-22 23:33:02 +00001373
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001374 while (1) {
1375 PySSL_BEGIN_ALLOW_THREADS
1376 /* Disable read-ahead so that unwrap can work correctly.
1377 * Otherwise OpenSSL might read in too much data,
1378 * eating clear text data that happens to be
1379 * transmitted after the SSL shutdown.
1380 * Should be safe to call repeatedly everytime this
1381 * function is used and the shutdown_seen_zero != 0
1382 * condition is met.
1383 */
1384 if (self->shutdown_seen_zero)
1385 SSL_set_read_ahead(self->ssl, 0);
1386 err = SSL_shutdown(self->ssl);
1387 PySSL_END_ALLOW_THREADS
1388 /* If err == 1, a secure shutdown with SSL_shutdown() is complete */
1389 if (err > 0)
1390 break;
1391 if (err == 0) {
1392 /* Don't loop endlessly; instead preserve legacy
1393 behaviour of trying SSL_shutdown() only twice.
1394 This looks necessary for OpenSSL < 0.9.8m */
1395 if (++zeros > 1)
1396 break;
1397 /* Shutdown was sent, now try receiving */
1398 self->shutdown_seen_zero = 1;
1399 continue;
1400 }
Antoine Pitroua5c4b552010-04-22 23:33:02 +00001401
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001402 /* Possibly retry shutdown until timeout or failure */
1403 ssl_err = SSL_get_error(self->ssl, err);
1404 if (ssl_err == SSL_ERROR_WANT_READ)
1405 sockstate = check_socket_and_wait_for_timeout(self->Socket, 0);
1406 else if (ssl_err == SSL_ERROR_WANT_WRITE)
1407 sockstate = check_socket_and_wait_for_timeout(self->Socket, 1);
1408 else
1409 break;
1410 if (sockstate == SOCKET_HAS_TIMED_OUT) {
1411 if (ssl_err == SSL_ERROR_WANT_READ)
1412 PyErr_SetString(PySSLErrorObject,
1413 "The read operation timed out");
1414 else
1415 PyErr_SetString(PySSLErrorObject,
1416 "The write operation timed out");
1417 return NULL;
1418 }
1419 else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
1420 PyErr_SetString(PySSLErrorObject,
1421 "Underlying socket too large for select().");
1422 return NULL;
1423 }
1424 else if (sockstate != SOCKET_OPERATION_OK)
1425 /* Retain the SSL error code */
1426 break;
1427 }
Bill Janssen934b16d2008-06-28 22:19:33 +00001428
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001429 if (err < 0)
1430 return PySSL_SetError(self, err, __FILE__, __LINE__);
1431 else {
1432 Py_INCREF(self->Socket);
1433 return (PyObject *) (self->Socket);
1434 }
Bill Janssen934b16d2008-06-28 22:19:33 +00001435}
1436
1437PyDoc_STRVAR(PySSL_SSLshutdown_doc,
1438"shutdown(s) -> socket\n\
1439\n\
1440Does the SSL shutdown handshake with the remote end, and returns\n\
1441the underlying socket object.");
1442
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001443static PyMethodDef PySSLMethods[] = {
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001444 {"do_handshake", (PyCFunction)PySSL_SSLdo_handshake, METH_NOARGS},
1445 {"write", (PyCFunction)PySSL_SSLwrite, METH_VARARGS,
1446 PySSL_SSLwrite_doc},
1447 {"read", (PyCFunction)PySSL_SSLread, METH_VARARGS,
1448 PySSL_SSLread_doc},
1449 {"pending", (PyCFunction)PySSL_SSLpending, METH_NOARGS,
1450 PySSL_SSLpending_doc},
1451 {"server", (PyCFunction)PySSL_server, METH_NOARGS},
1452 {"issuer", (PyCFunction)PySSL_issuer, METH_NOARGS},
1453 {"peer_certificate", (PyCFunction)PySSL_peercert, METH_VARARGS,
1454 PySSL_peercert_doc},
1455 {"cipher", (PyCFunction)PySSL_cipher, METH_NOARGS},
1456 {"shutdown", (PyCFunction)PySSL_SSLshutdown, METH_NOARGS,
1457 PySSL_SSLshutdown_doc},
1458 {NULL, NULL}
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001459};
1460
1461static PyObject *PySSL_getattr(PySSLObject *self, char *name)
1462{
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001463 return Py_FindMethod(PySSLMethods, (PyObject *)self, name);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001464}
1465
Jeremy Hylton938ace62002-07-17 16:30:39 +00001466static PyTypeObject PySSL_Type = {
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001467 PyVarObject_HEAD_INIT(NULL, 0)
1468 "ssl.SSLContext", /*tp_name*/
1469 sizeof(PySSLObject), /*tp_basicsize*/
1470 0, /*tp_itemsize*/
1471 /* methods */
1472 (destructor)PySSL_dealloc, /*tp_dealloc*/
1473 0, /*tp_print*/
1474 (getattrfunc)PySSL_getattr, /*tp_getattr*/
1475 0, /*tp_setattr*/
1476 0, /*tp_compare*/
1477 0, /*tp_repr*/
1478 0, /*tp_as_number*/
1479 0, /*tp_as_sequence*/
1480 0, /*tp_as_mapping*/
1481 0, /*tp_hash*/
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001482};
1483
1484#ifdef HAVE_OPENSSL_RAND
1485
1486/* helper routines for seeding the SSL PRNG */
1487static PyObject *
1488PySSL_RAND_add(PyObject *self, PyObject *args)
1489{
1490 char *buf;
1491 int len;
1492 double entropy;
1493
1494 if (!PyArg_ParseTuple(args, "s#d:RAND_add", &buf, &len, &entropy))
Antoine Pitrou2e136ab2010-05-12 14:02:34 +00001495 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001496 RAND_add(buf, len, entropy);
1497 Py_INCREF(Py_None);
1498 return Py_None;
1499}
1500
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001501PyDoc_STRVAR(PySSL_RAND_add_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001502"RAND_add(string, entropy)\n\
1503\n\
1504Mix string into the OpenSSL PRNG state. entropy (a float) is a lower\n\
Bill Janssen98d19da2007-09-10 21:51:02 +00001505bound on the entropy contained in string. See RFC 1750.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001506
1507static PyObject *
1508PySSL_RAND_status(PyObject *self)
1509{
1510 return PyInt_FromLong(RAND_status());
1511}
1512
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001513PyDoc_STRVAR(PySSL_RAND_status_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001514"RAND_status() -> 0 or 1\n\
1515\n\
1516Returns 1 if the OpenSSL PRNG has been seeded with enough data and 0 if not.\n\
1517It is necessary to seed the PRNG with RAND_add() on some platforms before\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001518using the ssl() function.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001519
1520static PyObject *
1521PySSL_RAND_egd(PyObject *self, PyObject *arg)
1522{
1523 int bytes;
1524
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001525 if (!PyString_Check(arg))
Antoine Pitrou2e136ab2010-05-12 14:02:34 +00001526 return PyErr_Format(PyExc_TypeError,
1527 "RAND_egd() expected string, found %s",
1528 Py_TYPE(arg)->tp_name);
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001529 bytes = RAND_egd(PyString_AS_STRING(arg));
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001530 if (bytes == -1) {
Antoine Pitrou2e136ab2010-05-12 14:02:34 +00001531 PyErr_SetString(PySSLErrorObject,
1532 "EGD connection failed or EGD did not return "
1533 "enough data to seed the PRNG");
1534 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001535 }
1536 return PyInt_FromLong(bytes);
1537}
1538
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001539PyDoc_STRVAR(PySSL_RAND_egd_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001540"RAND_egd(path) -> bytes\n\
1541\n\
Bill Janssen98d19da2007-09-10 21:51:02 +00001542Queries the entropy gather daemon (EGD) on the socket named by 'path'.\n\
1543Returns number of bytes read. Raises SSLError if connection to EGD\n\
1544fails or if it does provide enough data to seed PRNG.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001545
1546#endif
1547
1548/* List of functions exported by this module. */
1549
1550static PyMethodDef PySSL_methods[] = {
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001551 {"sslwrap", PySSL_sslwrap,
1552 METH_VARARGS, ssl_doc},
1553 {"_test_decode_cert", PySSL_test_decode_certificate,
1554 METH_VARARGS},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001555#ifdef HAVE_OPENSSL_RAND
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001556 {"RAND_add", PySSL_RAND_add, METH_VARARGS,
1557 PySSL_RAND_add_doc},
1558 {"RAND_egd", PySSL_RAND_egd, METH_O,
1559 PySSL_RAND_egd_doc},
1560 {"RAND_status", (PyCFunction)PySSL_RAND_status, METH_NOARGS,
1561 PySSL_RAND_status_doc},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001562#endif
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001563 {NULL, NULL} /* Sentinel */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001564};
1565
1566
Bill Janssen98d19da2007-09-10 21:51:02 +00001567#ifdef WITH_THREAD
1568
1569/* an implementation of OpenSSL threading operations in terms
1570 of the Python C thread library */
1571
1572static PyThread_type_lock *_ssl_locks = NULL;
1573
1574static unsigned long _ssl_thread_id_function (void) {
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001575 return PyThread_get_thread_ident();
Bill Janssen98d19da2007-09-10 21:51:02 +00001576}
1577
1578static void _ssl_thread_locking_function (int mode, int n, const char *file, int line) {
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001579 /* this function is needed to perform locking on shared data
1580 structures. (Note that OpenSSL uses a number of global data
1581 structures that will be implicitly shared whenever multiple threads
1582 use OpenSSL.) Multi-threaded applications will crash at random if
1583 it is not set.
Bill Janssen98d19da2007-09-10 21:51:02 +00001584
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001585 locking_function() must be able to handle up to CRYPTO_num_locks()
1586 different mutex locks. It sets the n-th lock if mode & CRYPTO_LOCK, and
1587 releases it otherwise.
Bill Janssen98d19da2007-09-10 21:51:02 +00001588
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001589 file and line are the file number of the function setting the
1590 lock. They can be useful for debugging.
1591 */
Bill Janssen98d19da2007-09-10 21:51:02 +00001592
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001593 if ((_ssl_locks == NULL) ||
1594 (n < 0) || ((unsigned)n >= _ssl_locks_count))
1595 return;
Bill Janssen98d19da2007-09-10 21:51:02 +00001596
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001597 if (mode & CRYPTO_LOCK) {
1598 PyThread_acquire_lock(_ssl_locks[n], 1);
1599 } else {
1600 PyThread_release_lock(_ssl_locks[n]);
1601 }
Bill Janssen98d19da2007-09-10 21:51:02 +00001602}
1603
1604static int _setup_ssl_threads(void) {
1605
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001606 unsigned int i;
Bill Janssen98d19da2007-09-10 21:51:02 +00001607
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001608 if (_ssl_locks == NULL) {
1609 _ssl_locks_count = CRYPTO_num_locks();
1610 _ssl_locks = (PyThread_type_lock *)
1611 malloc(sizeof(PyThread_type_lock) * _ssl_locks_count);
1612 if (_ssl_locks == NULL)
1613 return 0;
1614 memset(_ssl_locks, 0, sizeof(PyThread_type_lock) * _ssl_locks_count);
1615 for (i = 0; i < _ssl_locks_count; i++) {
1616 _ssl_locks[i] = PyThread_allocate_lock();
1617 if (_ssl_locks[i] == NULL) {
1618 unsigned int j;
1619 for (j = 0; j < i; j++) {
1620 PyThread_free_lock(_ssl_locks[j]);
1621 }
1622 free(_ssl_locks);
1623 return 0;
1624 }
1625 }
1626 CRYPTO_set_locking_callback(_ssl_thread_locking_function);
1627 CRYPTO_set_id_callback(_ssl_thread_id_function);
1628 }
1629 return 1;
Bill Janssen98d19da2007-09-10 21:51:02 +00001630}
1631
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001632#endif /* def HAVE_THREAD */
Bill Janssen98d19da2007-09-10 21:51:02 +00001633
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001634PyDoc_STRVAR(module_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001635"Implementation module for SSL socket operations. See the socket module\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001636for documentation.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001637
Mark Hammondfe51c6d2002-08-02 02:27:13 +00001638PyMODINIT_FUNC
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001639init_ssl(void)
1640{
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001641 PyObject *m, *d, *r;
1642 unsigned long libver;
1643 unsigned int major, minor, fix, patch, status;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001644
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001645 Py_TYPE(&PySSL_Type) = &PyType_Type;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001646
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001647 m = Py_InitModule3("_ssl", PySSL_methods, module_doc);
1648 if (m == NULL)
1649 return;
1650 d = PyModule_GetDict(m);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001651
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001652 /* Load _socket module and its C API */
1653 if (PySocketModule_ImportModuleAndAPI())
1654 return;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001655
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001656 /* Init OpenSSL */
1657 SSL_load_error_strings();
1658 SSL_library_init();
Bill Janssen98d19da2007-09-10 21:51:02 +00001659#ifdef WITH_THREAD
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001660 /* note that this will start threading if not already started */
1661 if (!_setup_ssl_threads()) {
1662 return;
1663 }
Bill Janssen98d19da2007-09-10 21:51:02 +00001664#endif
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001665 OpenSSL_add_all_algorithms();
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001666
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001667 /* Add symbols to module dict */
1668 PySSLErrorObject = PyErr_NewException("ssl.SSLError",
1669 PySocketModule.error,
1670 NULL);
1671 if (PySSLErrorObject == NULL)
1672 return;
1673 if (PyDict_SetItemString(d, "SSLError", PySSLErrorObject) != 0)
1674 return;
1675 if (PyDict_SetItemString(d, "SSLType",
1676 (PyObject *)&PySSL_Type) != 0)
1677 return;
1678 PyModule_AddIntConstant(m, "SSL_ERROR_ZERO_RETURN",
1679 PY_SSL_ERROR_ZERO_RETURN);
1680 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_READ",
1681 PY_SSL_ERROR_WANT_READ);
1682 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_WRITE",
1683 PY_SSL_ERROR_WANT_WRITE);
1684 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_X509_LOOKUP",
1685 PY_SSL_ERROR_WANT_X509_LOOKUP);
1686 PyModule_AddIntConstant(m, "SSL_ERROR_SYSCALL",
1687 PY_SSL_ERROR_SYSCALL);
1688 PyModule_AddIntConstant(m, "SSL_ERROR_SSL",
1689 PY_SSL_ERROR_SSL);
1690 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_CONNECT",
1691 PY_SSL_ERROR_WANT_CONNECT);
1692 /* non ssl.h errorcodes */
1693 PyModule_AddIntConstant(m, "SSL_ERROR_EOF",
1694 PY_SSL_ERROR_EOF);
1695 PyModule_AddIntConstant(m, "SSL_ERROR_INVALID_ERROR_CODE",
1696 PY_SSL_ERROR_INVALID_ERROR_CODE);
1697 /* cert requirements */
1698 PyModule_AddIntConstant(m, "CERT_NONE",
1699 PY_SSL_CERT_NONE);
1700 PyModule_AddIntConstant(m, "CERT_OPTIONAL",
1701 PY_SSL_CERT_OPTIONAL);
1702 PyModule_AddIntConstant(m, "CERT_REQUIRED",
1703 PY_SSL_CERT_REQUIRED);
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001704
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001705 /* protocol versions */
1706 PyModule_AddIntConstant(m, "PROTOCOL_SSLv2",
1707 PY_SSL_VERSION_SSL2);
1708 PyModule_AddIntConstant(m, "PROTOCOL_SSLv3",
1709 PY_SSL_VERSION_SSL3);
1710 PyModule_AddIntConstant(m, "PROTOCOL_SSLv23",
1711 PY_SSL_VERSION_SSL23);
1712 PyModule_AddIntConstant(m, "PROTOCOL_TLSv1",
1713 PY_SSL_VERSION_TLS1);
Antoine Pitrouf9de5342010-04-05 21:35:07 +00001714
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001715 /* OpenSSL version */
1716 /* SSLeay() gives us the version of the library linked against,
1717 which could be different from the headers version.
1718 */
1719 libver = SSLeay();
1720 r = PyLong_FromUnsignedLong(libver);
1721 if (r == NULL)
1722 return;
1723 if (PyModule_AddObject(m, "OPENSSL_VERSION_NUMBER", r))
1724 return;
1725 status = libver & 0xF;
1726 libver >>= 4;
1727 patch = libver & 0xFF;
1728 libver >>= 8;
1729 fix = libver & 0xFF;
1730 libver >>= 8;
1731 minor = libver & 0xFF;
1732 libver >>= 8;
1733 major = libver & 0xFF;
1734 r = Py_BuildValue("IIIII", major, minor, fix, patch, status);
1735 if (r == NULL || PyModule_AddObject(m, "OPENSSL_VERSION_INFO", r))
1736 return;
1737 r = PyString_FromString(SSLeay_version(SSLEAY_VERSION));
1738 if (r == NULL || PyModule_AddObject(m, "OPENSSL_VERSION", r))
1739 return;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001740}