blob: d19bf2d488fcb64e82e266fce3eb9913c3a7b69a [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,
68 PY_SSL_VERSION_TLS1,
69};
70
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000071/* Include symbols from _socket module */
72#include "socketmodule.h"
73
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;
458 int sockstate;
459
460 /* Actually negotiate SSL connection */
461 /* XXX If SSL_do_handshake() returns 0, it's also a failure. */
462 sockstate = 0;
463 do {
464 PySSL_BEGIN_ALLOW_THREADS
465 ret = SSL_do_handshake(self->ssl);
466 err = SSL_get_error(self->ssl, ret);
467 PySSL_END_ALLOW_THREADS
468 if(PyErr_CheckSignals()) {
469 return NULL;
470 }
471 if (err == SSL_ERROR_WANT_READ) {
472 sockstate = check_socket_and_wait_for_timeout(self->Socket, 0);
473 } else if (err == SSL_ERROR_WANT_WRITE) {
474 sockstate = check_socket_and_wait_for_timeout(self->Socket, 1);
475 } else {
476 sockstate = SOCKET_OPERATION_OK;
477 }
478 if (sockstate == SOCKET_HAS_TIMED_OUT) {
479 PyErr_SetString(PySSLErrorObject,
480 ERRSTR("The handshake operation timed out"));
481 return NULL;
482 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
483 PyErr_SetString(PySSLErrorObject,
484 ERRSTR("Underlying socket has been closed."));
485 return NULL;
486 } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
487 PyErr_SetString(PySSLErrorObject,
488 ERRSTR("Underlying socket too large for select()."));
489 return NULL;
490 } else if (sockstate == SOCKET_IS_NONBLOCKING) {
491 break;
492 }
493 } while (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE);
494 if (ret < 1)
495 return PySSL_SetError(self, ret, __FILE__, __LINE__);
496 self->ssl->debug = 1;
497
498 if (self->peer_cert)
499 X509_free (self->peer_cert);
500 PySSL_BEGIN_ALLOW_THREADS
501 if ((self->peer_cert = SSL_get_peer_certificate(self->ssl))) {
502 X509_NAME_oneline(X509_get_subject_name(self->peer_cert),
503 self->server, X509_NAME_MAXLEN);
504 X509_NAME_oneline(X509_get_issuer_name(self->peer_cert),
505 self->issuer, X509_NAME_MAXLEN);
506 }
507 PySSL_END_ALLOW_THREADS
508
509 Py_INCREF(Py_None);
510 return Py_None;
511}
512
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000513static PyObject *
514PySSL_server(PySSLObject *self)
515{
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000516 return PyString_FromString(self->server);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000517}
518
519static PyObject *
520PySSL_issuer(PySSLObject *self)
521{
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000522 return PyString_FromString(self->issuer);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000523}
524
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000525static PyObject *
Bill Janssen98d19da2007-09-10 21:51:02 +0000526_create_tuple_for_attribute (ASN1_OBJECT *name, ASN1_STRING *value) {
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000527
Bill Janssen98d19da2007-09-10 21:51:02 +0000528 char namebuf[X509_NAME_MAXLEN];
529 int buflen;
530 PyObject *name_obj;
531 PyObject *value_obj;
532 PyObject *attr;
533 unsigned char *valuebuf = NULL;
Guido van Rossum780b80d2007-08-27 18:42:23 +0000534
Bill Janssen98d19da2007-09-10 21:51:02 +0000535 buflen = OBJ_obj2txt(namebuf, sizeof(namebuf), name, 0);
536 if (buflen < 0) {
537 _setSSLError(NULL, 0, __FILE__, __LINE__);
538 goto fail;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000539 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000540 name_obj = PyString_FromStringAndSize(namebuf, buflen);
Bill Janssen98d19da2007-09-10 21:51:02 +0000541 if (name_obj == NULL)
542 goto fail;
543
544 buflen = ASN1_STRING_to_UTF8(&valuebuf, value);
545 if (buflen < 0) {
546 _setSSLError(NULL, 0, __FILE__, __LINE__);
547 Py_DECREF(name_obj);
548 goto fail;
549 }
550 value_obj = PyUnicode_DecodeUTF8((char *) valuebuf,
551 buflen, "strict");
552 OPENSSL_free(valuebuf);
553 if (value_obj == NULL) {
554 Py_DECREF(name_obj);
555 goto fail;
556 }
557 attr = PyTuple_New(2);
558 if (attr == NULL) {
559 Py_DECREF(name_obj);
560 Py_DECREF(value_obj);
561 goto fail;
562 }
563 PyTuple_SET_ITEM(attr, 0, name_obj);
564 PyTuple_SET_ITEM(attr, 1, value_obj);
565 return attr;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000566
Bill Janssen98d19da2007-09-10 21:51:02 +0000567 fail:
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000568 return NULL;
569}
570
571static PyObject *
Bill Janssen98d19da2007-09-10 21:51:02 +0000572_create_tuple_for_X509_NAME (X509_NAME *xname)
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000573{
Bill Janssen98d19da2007-09-10 21:51:02 +0000574 PyObject *dn = NULL; /* tuple which represents the "distinguished name" */
575 PyObject *rdn = NULL; /* tuple to hold a "relative distinguished name" */
576 PyObject *rdnt;
577 PyObject *attr = NULL; /* tuple to hold an attribute */
578 int entry_count = X509_NAME_entry_count(xname);
579 X509_NAME_ENTRY *entry;
580 ASN1_OBJECT *name;
581 ASN1_STRING *value;
582 int index_counter;
583 int rdn_level = -1;
584 int retcode;
585
586 dn = PyList_New(0);
587 if (dn == NULL)
588 return NULL;
589 /* now create another tuple to hold the top-level RDN */
590 rdn = PyList_New(0);
591 if (rdn == NULL)
592 goto fail0;
593
594 for (index_counter = 0;
595 index_counter < entry_count;
596 index_counter++)
597 {
598 entry = X509_NAME_get_entry(xname, index_counter);
599
600 /* check to see if we've gotten to a new RDN */
601 if (rdn_level >= 0) {
602 if (rdn_level != entry->set) {
603 /* yes, new RDN */
604 /* add old RDN to DN */
605 rdnt = PyList_AsTuple(rdn);
606 Py_DECREF(rdn);
607 if (rdnt == NULL)
608 goto fail0;
609 retcode = PyList_Append(dn, rdnt);
610 Py_DECREF(rdnt);
611 if (retcode < 0)
612 goto fail0;
613 /* create new RDN */
614 rdn = PyList_New(0);
615 if (rdn == NULL)
616 goto fail0;
617 }
618 }
619 rdn_level = entry->set;
620
621 /* now add this attribute to the current RDN */
622 name = X509_NAME_ENTRY_get_object(entry);
623 value = X509_NAME_ENTRY_get_data(entry);
624 attr = _create_tuple_for_attribute(name, value);
625 /*
626 fprintf(stderr, "RDN level %d, attribute %s: %s\n",
627 entry->set,
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000628 PyString_AS_STRING(PyTuple_GET_ITEM(attr, 0)),
629 PyString_AS_STRING(PyTuple_GET_ITEM(attr, 1)));
Bill Janssen98d19da2007-09-10 21:51:02 +0000630 */
631 if (attr == NULL)
632 goto fail1;
633 retcode = PyList_Append(rdn, attr);
634 Py_DECREF(attr);
635 if (retcode < 0)
636 goto fail1;
637 }
638 /* now, there's typically a dangling RDN */
639 if ((rdn != NULL) && (PyList_Size(rdn) > 0)) {
640 rdnt = PyList_AsTuple(rdn);
641 Py_DECREF(rdn);
642 if (rdnt == NULL)
643 goto fail0;
644 retcode = PyList_Append(dn, rdnt);
645 Py_DECREF(rdnt);
646 if (retcode < 0)
647 goto fail0;
648 }
649
650 /* convert list to tuple */
651 rdnt = PyList_AsTuple(dn);
652 Py_DECREF(dn);
653 if (rdnt == NULL)
654 return NULL;
655 return rdnt;
656
657 fail1:
658 Py_XDECREF(rdn);
659
660 fail0:
661 Py_XDECREF(dn);
662 return NULL;
663}
664
665static PyObject *
666_get_peer_alt_names (X509 *certificate) {
667
668 /* this code follows the procedure outlined in
669 OpenSSL's crypto/x509v3/v3_prn.c:X509v3_EXT_print()
670 function to extract the STACK_OF(GENERAL_NAME),
671 then iterates through the stack to add the
672 names. */
673
674 int i, j;
675 PyObject *peer_alt_names = Py_None;
676 PyObject *v, *t;
677 X509_EXTENSION *ext = NULL;
678 GENERAL_NAMES *names = NULL;
679 GENERAL_NAME *name;
680 X509V3_EXT_METHOD *method;
681 BIO *biobuf = NULL;
682 char buf[2048];
683 char *vptr;
684 int len;
Victor Stinner3f75cc52010-03-02 22:44:42 +0000685 /* Issue #2973: ASN1_item_d2i() API changed in OpenSSL 0.9.6m */
686#if OPENSSL_VERSION_NUMBER >= 0x009060dfL
687 const unsigned char *p;
688#else
Jeffrey Yasskin7937d932009-05-29 03:44:31 +0000689 unsigned char *p;
Victor Stinner3f75cc52010-03-02 22:44:42 +0000690#endif
Bill Janssen98d19da2007-09-10 21:51:02 +0000691
692 if (certificate == NULL)
693 return peer_alt_names;
694
695 /* get a memory buffer */
696 biobuf = BIO_new(BIO_s_mem());
697
698 i = 0;
699 while ((i = X509_get_ext_by_NID(
700 certificate, NID_subject_alt_name, i)) >= 0) {
701
702 if (peer_alt_names == Py_None) {
703 peer_alt_names = PyList_New(0);
704 if (peer_alt_names == NULL)
705 goto fail;
706 }
707
708 /* now decode the altName */
709 ext = X509_get_ext(certificate, i);
710 if(!(method = X509V3_EXT_get(ext))) {
711 PyErr_SetString(PySSLErrorObject,
712 ERRSTR("No method for internalizing subjectAltName!"));
713 goto fail;
714 }
715
716 p = ext->value->data;
Neal Norwitze9057ff2008-01-27 17:10:35 +0000717 if (method->it)
Bill Janssen98d19da2007-09-10 21:51:02 +0000718 names = (GENERAL_NAMES*) (ASN1_item_d2i(NULL,
719 &p,
720 ext->value->length,
721 ASN1_ITEM_ptr(method->it)));
722 else
723 names = (GENERAL_NAMES*) (method->d2i(NULL,
724 &p,
725 ext->value->length));
726
727 for(j = 0; j < sk_GENERAL_NAME_num(names); j++) {
728
729 /* get a rendering of each name in the set of names */
730
731 name = sk_GENERAL_NAME_value(names, j);
732 if (name->type == GEN_DIRNAME) {
733
734 /* we special-case DirName as a tuple of tuples of attributes */
735
736 t = PyTuple_New(2);
737 if (t == NULL) {
738 goto fail;
739 }
740
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000741 v = PyString_FromString("DirName");
Bill Janssen98d19da2007-09-10 21:51:02 +0000742 if (v == NULL) {
743 Py_DECREF(t);
744 goto fail;
745 }
746 PyTuple_SET_ITEM(t, 0, v);
747
748 v = _create_tuple_for_X509_NAME (name->d.dirn);
749 if (v == NULL) {
750 Py_DECREF(t);
751 goto fail;
752 }
753 PyTuple_SET_ITEM(t, 1, v);
754
755 } else {
756
757 /* for everything else, we use the OpenSSL print form */
758
759 (void) BIO_reset(biobuf);
760 GENERAL_NAME_print(biobuf, name);
761 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
762 if (len < 0) {
763 _setSSLError(NULL, 0, __FILE__, __LINE__);
764 goto fail;
765 }
766 vptr = strchr(buf, ':');
767 if (vptr == NULL)
768 goto fail;
769 t = PyTuple_New(2);
770 if (t == NULL)
771 goto fail;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000772 v = PyString_FromStringAndSize(buf, (vptr - buf));
Bill Janssen98d19da2007-09-10 21:51:02 +0000773 if (v == NULL) {
774 Py_DECREF(t);
775 goto fail;
776 }
777 PyTuple_SET_ITEM(t, 0, v);
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000778 v = PyString_FromStringAndSize((vptr + 1), (len - (vptr - buf + 1)));
Bill Janssen98d19da2007-09-10 21:51:02 +0000779 if (v == NULL) {
780 Py_DECREF(t);
781 goto fail;
782 }
783 PyTuple_SET_ITEM(t, 1, v);
784 }
785
786 /* and add that rendering to the list */
787
788 if (PyList_Append(peer_alt_names, t) < 0) {
789 Py_DECREF(t);
790 goto fail;
791 }
792 Py_DECREF(t);
793 }
794 }
795 BIO_free(biobuf);
796 if (peer_alt_names != Py_None) {
797 v = PyList_AsTuple(peer_alt_names);
798 Py_DECREF(peer_alt_names);
799 return v;
800 } else {
801 return peer_alt_names;
802 }
803
804
805 fail:
806 if (biobuf != NULL)
807 BIO_free(biobuf);
808
809 if (peer_alt_names != Py_None) {
810 Py_XDECREF(peer_alt_names);
811 }
812
813 return NULL;
814}
815
816static PyObject *
817_decode_certificate (X509 *certificate, int verbose) {
818
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000819 PyObject *retval = NULL;
820 BIO *biobuf = NULL;
Neal Norwitz049da9e2007-08-25 16:41:36 +0000821 PyObject *peer;
Bill Janssen98d19da2007-09-10 21:51:02 +0000822 PyObject *peer_alt_names = NULL;
Neal Norwitz049da9e2007-08-25 16:41:36 +0000823 PyObject *issuer;
824 PyObject *version;
Bill Janssen98d19da2007-09-10 21:51:02 +0000825 PyObject *sn_obj;
826 ASN1_INTEGER *serialNumber;
Neal Norwitz049da9e2007-08-25 16:41:36 +0000827 char buf[2048];
828 int len;
829 ASN1_TIME *notBefore, *notAfter;
830 PyObject *pnotBefore, *pnotAfter;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000831
832 retval = PyDict_New();
833 if (retval == NULL)
834 return NULL;
835
Bill Janssenffe576d2007-09-05 00:46:27 +0000836 peer = _create_tuple_for_X509_NAME(
Bill Janssen98d19da2007-09-10 21:51:02 +0000837 X509_get_subject_name(certificate));
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000838 if (peer == NULL)
839 goto fail0;
840 if (PyDict_SetItemString(retval, (const char *) "subject", peer) < 0) {
841 Py_DECREF(peer);
842 goto fail0;
843 }
844 Py_DECREF(peer);
845
Bill Janssen98d19da2007-09-10 21:51:02 +0000846 if (verbose) {
847 issuer = _create_tuple_for_X509_NAME(
848 X509_get_issuer_name(certificate));
849 if (issuer == NULL)
850 goto fail0;
851 if (PyDict_SetItemString(retval, (const char *)"issuer", issuer) < 0) {
852 Py_DECREF(issuer);
853 goto fail0;
854 }
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000855 Py_DECREF(issuer);
Bill Janssen98d19da2007-09-10 21:51:02 +0000856
857 version = PyInt_FromLong(X509_get_version(certificate) + 1);
858 if (PyDict_SetItemString(retval, "version", version) < 0) {
859 Py_DECREF(version);
860 goto fail0;
861 }
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000862 Py_DECREF(version);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000863 }
Bill Janssen98d19da2007-09-10 21:51:02 +0000864
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000865 /* get a memory buffer */
866 biobuf = BIO_new(BIO_s_mem());
Bill Janssen98d19da2007-09-10 21:51:02 +0000867
868 if (verbose) {
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000869
Bill Janssen98d19da2007-09-10 21:51:02 +0000870 (void) BIO_reset(biobuf);
871 serialNumber = X509_get_serialNumber(certificate);
872 /* should not exceed 20 octets, 160 bits, so buf is big enough */
873 i2a_ASN1_INTEGER(biobuf, serialNumber);
874 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
875 if (len < 0) {
876 _setSSLError(NULL, 0, __FILE__, __LINE__);
877 goto fail1;
878 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000879 sn_obj = PyString_FromStringAndSize(buf, len);
Bill Janssen98d19da2007-09-10 21:51:02 +0000880 if (sn_obj == NULL)
881 goto fail1;
882 if (PyDict_SetItemString(retval, "serialNumber", sn_obj) < 0) {
883 Py_DECREF(sn_obj);
884 goto fail1;
885 }
886 Py_DECREF(sn_obj);
887
888 (void) BIO_reset(biobuf);
889 notBefore = X509_get_notBefore(certificate);
890 ASN1_TIME_print(biobuf, notBefore);
891 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
892 if (len < 0) {
893 _setSSLError(NULL, 0, __FILE__, __LINE__);
894 goto fail1;
895 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000896 pnotBefore = PyString_FromStringAndSize(buf, len);
Bill Janssen98d19da2007-09-10 21:51:02 +0000897 if (pnotBefore == NULL)
898 goto fail1;
899 if (PyDict_SetItemString(retval, "notBefore", pnotBefore) < 0) {
900 Py_DECREF(pnotBefore);
901 goto fail1;
902 }
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000903 Py_DECREF(pnotBefore);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000904 }
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000905
Guido van Rossum780b80d2007-08-27 18:42:23 +0000906 (void) BIO_reset(biobuf);
Bill Janssen98d19da2007-09-10 21:51:02 +0000907 notAfter = X509_get_notAfter(certificate);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000908 ASN1_TIME_print(biobuf, notAfter);
909 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
Bill Janssen98d19da2007-09-10 21:51:02 +0000910 if (len < 0) {
911 _setSSLError(NULL, 0, __FILE__, __LINE__);
912 goto fail1;
913 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000914 pnotAfter = PyString_FromStringAndSize(buf, len);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000915 if (pnotAfter == NULL)
Bill Janssen98d19da2007-09-10 21:51:02 +0000916 goto fail1;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000917 if (PyDict_SetItemString(retval, "notAfter", pnotAfter) < 0) {
918 Py_DECREF(pnotAfter);
Bill Janssen98d19da2007-09-10 21:51:02 +0000919 goto fail1;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000920 }
921 Py_DECREF(pnotAfter);
Bill Janssen98d19da2007-09-10 21:51:02 +0000922
923 /* Now look for subjectAltName */
924
925 peer_alt_names = _get_peer_alt_names(certificate);
926 if (peer_alt_names == NULL)
927 goto fail1;
928 else if (peer_alt_names != Py_None) {
929 if (PyDict_SetItemString(retval, "subjectAltName",
930 peer_alt_names) < 0) {
931 Py_DECREF(peer_alt_names);
932 goto fail1;
933 }
934 Py_DECREF(peer_alt_names);
935 }
936
937 BIO_free(biobuf);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000938 return retval;
939
940 fail1:
941 if (biobuf != NULL)
942 BIO_free(biobuf);
943 fail0:
944 Py_XDECREF(retval);
945 return NULL;
946}
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000947
Bill Janssen98d19da2007-09-10 21:51:02 +0000948
949static PyObject *
950PySSL_test_decode_certificate (PyObject *mod, PyObject *args) {
951
952 PyObject *retval = NULL;
953 char *filename = NULL;
954 X509 *x=NULL;
955 BIO *cert;
956 int verbose = 1;
957
958 if (!PyArg_ParseTuple(args, "s|i:test_decode_certificate", &filename, &verbose))
959 return NULL;
960
961 if ((cert=BIO_new(BIO_s_file())) == NULL) {
962 PyErr_SetString(PySSLErrorObject, "Can't malloc memory to read file");
963 goto fail0;
964 }
965
966 if (BIO_read_filename(cert,filename) <= 0) {
967 PyErr_SetString(PySSLErrorObject, "Can't open file");
968 goto fail0;
969 }
970
971 x = PEM_read_bio_X509_AUX(cert,NULL, NULL, NULL);
972 if (x == NULL) {
973 PyErr_SetString(PySSLErrorObject, "Error decoding PEM-encoded file");
974 goto fail0;
975 }
976
977 retval = _decode_certificate(x, verbose);
978
979 fail0:
980
981 if (cert != NULL) BIO_free(cert);
982 return retval;
983}
984
985
986static PyObject *
987PySSL_peercert(PySSLObject *self, PyObject *args)
988{
989 PyObject *retval = NULL;
990 int len;
991 int verification;
992 PyObject *binary_mode = Py_None;
993
994 if (!PyArg_ParseTuple(args, "|O:peer_certificate", &binary_mode))
995 return NULL;
996
997 if (!self->peer_cert)
998 Py_RETURN_NONE;
999
1000 if (PyObject_IsTrue(binary_mode)) {
1001 /* return cert in DER-encoded format */
1002
1003 unsigned char *bytes_buf = NULL;
1004
1005 bytes_buf = NULL;
1006 len = i2d_X509(self->peer_cert, &bytes_buf);
1007 if (len < 0) {
1008 PySSL_SetError(self, len, __FILE__, __LINE__);
1009 return NULL;
1010 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001011 retval = PyString_FromStringAndSize((const char *) bytes_buf, len);
Bill Janssen98d19da2007-09-10 21:51:02 +00001012 OPENSSL_free(bytes_buf);
1013 return retval;
1014
1015 } else {
1016
1017 verification = SSL_CTX_get_verify_mode(self->ctx);
1018 if ((verification & SSL_VERIFY_PEER) == 0)
1019 return PyDict_New();
1020 else
1021 return _decode_certificate (self->peer_cert, 0);
1022 }
1023}
1024
1025PyDoc_STRVAR(PySSL_peercert_doc,
1026"peer_certificate([der=False]) -> certificate\n\
1027\n\
1028Returns the certificate for the peer. If no certificate was provided,\n\
1029returns None. If a certificate was provided, but not validated, returns\n\
1030an empty dictionary. Otherwise returns a dict containing information\n\
1031about the peer certificate.\n\
1032\n\
1033If the optional argument is True, returns a DER-encoded copy of the\n\
1034peer certificate, or None if no certificate was provided. This will\n\
1035return the certificate even if it wasn't validated.");
1036
1037static PyObject *PySSL_cipher (PySSLObject *self) {
1038
1039 PyObject *retval, *v;
1040 SSL_CIPHER *current;
1041 char *cipher_name;
1042 char *cipher_protocol;
1043
1044 if (self->ssl == NULL)
1045 return Py_None;
1046 current = SSL_get_current_cipher(self->ssl);
1047 if (current == NULL)
1048 return Py_None;
1049
1050 retval = PyTuple_New(3);
1051 if (retval == NULL)
1052 return NULL;
1053
1054 cipher_name = (char *) SSL_CIPHER_get_name(current);
1055 if (cipher_name == NULL) {
1056 PyTuple_SET_ITEM(retval, 0, Py_None);
1057 } else {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001058 v = PyString_FromString(cipher_name);
Bill Janssen98d19da2007-09-10 21:51:02 +00001059 if (v == NULL)
1060 goto fail0;
1061 PyTuple_SET_ITEM(retval, 0, v);
1062 }
1063 cipher_protocol = SSL_CIPHER_get_version(current);
1064 if (cipher_protocol == NULL) {
1065 PyTuple_SET_ITEM(retval, 1, Py_None);
1066 } else {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001067 v = PyString_FromString(cipher_protocol);
Bill Janssen98d19da2007-09-10 21:51:02 +00001068 if (v == NULL)
1069 goto fail0;
1070 PyTuple_SET_ITEM(retval, 1, v);
1071 }
1072 v = PyInt_FromLong(SSL_CIPHER_get_bits(current, NULL));
1073 if (v == NULL)
1074 goto fail0;
1075 PyTuple_SET_ITEM(retval, 2, v);
1076 return retval;
1077
1078 fail0:
1079 Py_DECREF(retval);
1080 return NULL;
1081}
1082
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001083static void PySSL_dealloc(PySSLObject *self)
1084{
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001085 if (self->peer_cert) /* Possible not to have one? */
1086 X509_free (self->peer_cert);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001087 if (self->ssl)
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001088 SSL_free(self->ssl);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001089 if (self->ctx)
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001090 SSL_CTX_free(self->ctx);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001091 Py_XDECREF(self->Socket);
1092 PyObject_Del(self);
1093}
1094
Anthony Baxter93ab5fa2006-07-11 02:04:09 +00001095/* If the socket has a timeout, do a select()/poll() on the socket.
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001096 The argument writing indicates the direction.
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001097 Returns one of the possibilities in the timeout_state enum (above).
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001098 */
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001099
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001100static int
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001101check_socket_and_wait_for_timeout(PySocketSockObject *s, int writing)
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001102{
1103 fd_set fds;
1104 struct timeval tv;
1105 int rc;
1106
1107 /* Nothing to do unless we're in timeout mode (not non-blocking) */
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001108 if (s->sock_timeout < 0.0)
1109 return SOCKET_IS_BLOCKING;
1110 else if (s->sock_timeout == 0.0)
1111 return SOCKET_IS_NONBLOCKING;
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001112
1113 /* Guard against closed socket */
1114 if (s->sock_fd < 0)
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001115 return SOCKET_HAS_BEEN_CLOSED;
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001116
Anthony Baxter93ab5fa2006-07-11 02:04:09 +00001117 /* Prefer poll, if available, since you can poll() any fd
1118 * which can't be done with select(). */
1119#ifdef HAVE_POLL
1120 {
1121 struct pollfd pollfd;
1122 int timeout;
1123
1124 pollfd.fd = s->sock_fd;
1125 pollfd.events = writing ? POLLOUT : POLLIN;
1126
1127 /* s->sock_timeout is in seconds, timeout in ms */
1128 timeout = (int)(s->sock_timeout * 1000 + 0.5);
Bill Janssen98d19da2007-09-10 21:51:02 +00001129 PySSL_BEGIN_ALLOW_THREADS
Anthony Baxter93ab5fa2006-07-11 02:04:09 +00001130 rc = poll(&pollfd, 1, timeout);
Bill Janssen98d19da2007-09-10 21:51:02 +00001131 PySSL_END_ALLOW_THREADS
Anthony Baxter93ab5fa2006-07-11 02:04:09 +00001132
1133 goto normal_return;
1134 }
1135#endif
1136
Neal Norwitz082b2df2006-02-07 07:04:46 +00001137 /* Guard against socket too large for select*/
Martin v. Löwisf84d1b92006-02-11 09:27:05 +00001138#ifndef Py_SOCKET_FD_CAN_BE_GE_FD_SETSIZE
Neal Norwitz082b2df2006-02-07 07:04:46 +00001139 if (s->sock_fd >= FD_SETSIZE)
Neal Norwitz389cea82006-02-13 00:35:21 +00001140 return SOCKET_TOO_LARGE_FOR_SELECT;
Martin v. Löwisf84d1b92006-02-11 09:27:05 +00001141#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +00001142
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001143 /* Construct the arguments to select */
1144 tv.tv_sec = (int)s->sock_timeout;
1145 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
1146 FD_ZERO(&fds);
1147 FD_SET(s->sock_fd, &fds);
1148
1149 /* See if the socket is ready */
Bill Janssen98d19da2007-09-10 21:51:02 +00001150 PySSL_BEGIN_ALLOW_THREADS
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001151 if (writing)
1152 rc = select(s->sock_fd+1, NULL, &fds, NULL, &tv);
1153 else
1154 rc = select(s->sock_fd+1, &fds, NULL, NULL, &tv);
Bill Janssen98d19da2007-09-10 21:51:02 +00001155 PySSL_END_ALLOW_THREADS
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001156
Bill Janssen934b16d2008-06-28 22:19:33 +00001157#ifdef HAVE_POLL
Anthony Baxter93ab5fa2006-07-11 02:04:09 +00001158normal_return:
Bill Janssen934b16d2008-06-28 22:19:33 +00001159#endif
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001160 /* Return SOCKET_TIMED_OUT on timeout, SOCKET_OPERATION_OK otherwise
1161 (when we are able to write or when there's something to read) */
1162 return rc == 0 ? SOCKET_HAS_TIMED_OUT : SOCKET_OPERATION_OK;
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001163}
1164
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001165static PyObject *PySSL_SSLwrite(PySSLObject *self, PyObject *args)
1166{
Antoine Pitrou5ba84912009-10-19 17:59:07 +00001167 Py_buffer buf;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001168 int len;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001169 int sockstate;
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001170 int err;
Bill Janssen934b16d2008-06-28 22:19:33 +00001171 int nonblocking;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001172
Antoine Pitrou5ba84912009-10-19 17:59:07 +00001173 if (!PyArg_ParseTuple(args, "s*:write", &buf))
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001174 return NULL;
1175
Bill Janssen934b16d2008-06-28 22:19:33 +00001176 /* just in case the blocking state of the socket has been changed */
1177 nonblocking = (self->Socket->sock_timeout >= 0.0);
1178 BIO_set_nbio(SSL_get_rbio(self->ssl), nonblocking);
1179 BIO_set_nbio(SSL_get_wbio(self->ssl), nonblocking);
1180
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001181 sockstate = check_socket_and_wait_for_timeout(self->Socket, 1);
1182 if (sockstate == SOCKET_HAS_TIMED_OUT) {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001183 PyErr_SetString(PySSLErrorObject,
1184 "The write operation timed out");
Antoine Pitrou5ba84912009-10-19 17:59:07 +00001185 goto error;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001186 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001187 PyErr_SetString(PySSLErrorObject,
1188 "Underlying socket has been closed.");
Antoine Pitrou5ba84912009-10-19 17:59:07 +00001189 goto error;
Neal Norwitz389cea82006-02-13 00:35:21 +00001190 } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001191 PyErr_SetString(PySSLErrorObject,
1192 "Underlying socket too large for select().");
Antoine Pitrou5ba84912009-10-19 17:59:07 +00001193 goto error;
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001194 }
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001195 do {
1196 err = 0;
Bill Janssen98d19da2007-09-10 21:51:02 +00001197 PySSL_BEGIN_ALLOW_THREADS
Antoine Pitrou5ba84912009-10-19 17:59:07 +00001198 len = SSL_write(self->ssl, buf.buf, buf.len);
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001199 err = SSL_get_error(self->ssl, len);
Bill Janssen98d19da2007-09-10 21:51:02 +00001200 PySSL_END_ALLOW_THREADS
Antoine Pitrou5ba84912009-10-19 17:59:07 +00001201 if (PyErr_CheckSignals()) {
1202 goto error;
Martin v. Löwisafec8e32003-06-28 07:40:23 +00001203 }
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001204 if (err == SSL_ERROR_WANT_READ) {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001205 sockstate =
1206 check_socket_and_wait_for_timeout(self->Socket, 0);
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001207 } else if (err == SSL_ERROR_WANT_WRITE) {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001208 sockstate =
1209 check_socket_and_wait_for_timeout(self->Socket, 1);
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001210 } else {
1211 sockstate = SOCKET_OPERATION_OK;
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001212 }
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001213 if (sockstate == SOCKET_HAS_TIMED_OUT) {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001214 PyErr_SetString(PySSLErrorObject,
1215 "The write operation timed out");
Antoine Pitrou5ba84912009-10-19 17:59:07 +00001216 goto error;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001217 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001218 PyErr_SetString(PySSLErrorObject,
1219 "Underlying socket has been closed.");
Antoine Pitrou5ba84912009-10-19 17:59:07 +00001220 goto error;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001221 } else if (sockstate == SOCKET_IS_NONBLOCKING) {
1222 break;
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001223 }
1224 } while (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE);
Antoine Pitrou5ba84912009-10-19 17:59:07 +00001225
1226 PyBuffer_Release(&buf);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001227 if (len > 0)
1228 return PyInt_FromLong(len);
1229 else
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001230 return PySSL_SetError(self, len, __FILE__, __LINE__);
Antoine Pitrou5ba84912009-10-19 17:59:07 +00001231
1232error:
1233 PyBuffer_Release(&buf);
1234 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001235}
1236
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001237PyDoc_STRVAR(PySSL_SSLwrite_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001238"write(s) -> len\n\
1239\n\
1240Writes the string s into the SSL object. Returns the number\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001241of bytes written.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001242
Bill Janssen934b16d2008-06-28 22:19:33 +00001243static PyObject *PySSL_SSLpending(PySSLObject *self)
1244{
1245 int count = 0;
1246
1247 PySSL_BEGIN_ALLOW_THREADS
1248 count = SSL_pending(self->ssl);
1249 PySSL_END_ALLOW_THREADS
1250 if (count < 0)
1251 return PySSL_SetError(self, count, __FILE__, __LINE__);
1252 else
1253 return PyInt_FromLong(count);
1254}
1255
1256PyDoc_STRVAR(PySSL_SSLpending_doc,
1257"pending() -> count\n\
1258\n\
1259Returns the number of already decrypted bytes available for read,\n\
1260pending on the connection.\n");
1261
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001262static PyObject *PySSL_SSLread(PySSLObject *self, PyObject *args)
1263{
1264 PyObject *buf;
1265 int count = 0;
1266 int len = 1024;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001267 int sockstate;
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001268 int err;
Bill Janssen934b16d2008-06-28 22:19:33 +00001269 int nonblocking;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001270
1271 if (!PyArg_ParseTuple(args, "|i:read", &len))
1272 return NULL;
1273
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001274 if (!(buf = PyString_FromStringAndSize((char *) 0, len)))
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001275 return NULL;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001276
Bill Janssen934b16d2008-06-28 22:19:33 +00001277 /* just in case the blocking state of the socket has been changed */
1278 nonblocking = (self->Socket->sock_timeout >= 0.0);
1279 BIO_set_nbio(SSL_get_rbio(self->ssl), nonblocking);
1280 BIO_set_nbio(SSL_get_wbio(self->ssl), nonblocking);
1281
Georg Brandl43f08a82006-03-31 18:01:16 +00001282 /* first check if there are bytes ready to be read */
Bill Janssen98d19da2007-09-10 21:51:02 +00001283 PySSL_BEGIN_ALLOW_THREADS
Georg Brandl43f08a82006-03-31 18:01:16 +00001284 count = SSL_pending(self->ssl);
Bill Janssen98d19da2007-09-10 21:51:02 +00001285 PySSL_END_ALLOW_THREADS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001286
Georg Brandl43f08a82006-03-31 18:01:16 +00001287 if (!count) {
1288 sockstate = check_socket_and_wait_for_timeout(self->Socket, 0);
1289 if (sockstate == SOCKET_HAS_TIMED_OUT) {
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001290 PyErr_SetString(PySSLErrorObject,
1291 "The read operation timed out");
Georg Brandl43f08a82006-03-31 18:01:16 +00001292 Py_DECREF(buf);
1293 return NULL;
1294 } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001295 PyErr_SetString(PySSLErrorObject,
1296 "Underlying socket too large for select().");
1297 Py_DECREF(buf);
Georg Brandl43f08a82006-03-31 18:01:16 +00001298 return NULL;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001299 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
Bill Janssen934b16d2008-06-28 22:19:33 +00001300 if (SSL_get_shutdown(self->ssl) !=
1301 SSL_RECEIVED_SHUTDOWN)
1302 {
1303 Py_DECREF(buf);
1304 PyErr_SetString(PySSLErrorObject,
1305 "Socket closed without SSL shutdown handshake");
1306 return NULL;
1307 } else {
1308 /* should contain a zero-length string */
1309 _PyString_Resize(&buf, 0);
1310 return buf;
1311 }
Georg Brandl43f08a82006-03-31 18:01:16 +00001312 }
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001313 }
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001314 do {
1315 err = 0;
Bill Janssen98d19da2007-09-10 21:51:02 +00001316 PySSL_BEGIN_ALLOW_THREADS
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001317 count = SSL_read(self->ssl, PyString_AsString(buf), len);
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001318 err = SSL_get_error(self->ssl, count);
Bill Janssen98d19da2007-09-10 21:51:02 +00001319 PySSL_END_ALLOW_THREADS
Martin v. Löwisafec8e32003-06-28 07:40:23 +00001320 if(PyErr_CheckSignals()) {
1321 Py_DECREF(buf);
1322 return NULL;
1323 }
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001324 if (err == SSL_ERROR_WANT_READ) {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001325 sockstate =
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001326 check_socket_and_wait_for_timeout(self->Socket, 0);
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001327 } else if (err == SSL_ERROR_WANT_WRITE) {
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001328 sockstate =
1329 check_socket_and_wait_for_timeout(self->Socket, 1);
1330 } else if ((err == SSL_ERROR_ZERO_RETURN) &&
1331 (SSL_get_shutdown(self->ssl) ==
Guido van Rossum780b80d2007-08-27 18:42:23 +00001332 SSL_RECEIVED_SHUTDOWN))
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001333 {
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001334 _PyString_Resize(&buf, 0);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001335 return buf;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001336 } else {
1337 sockstate = SOCKET_OPERATION_OK;
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001338 }
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001339 if (sockstate == SOCKET_HAS_TIMED_OUT) {
1340 PyErr_SetString(PySSLErrorObject,
1341 "The read operation timed out");
Martin v. Löwisafec8e32003-06-28 07:40:23 +00001342 Py_DECREF(buf);
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001343 return NULL;
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001344 } else if (sockstate == SOCKET_IS_NONBLOCKING) {
1345 break;
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001346 }
1347 } while (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001348 if (count <= 0) {
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001349 Py_DECREF(buf);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001350 return PySSL_SetError(self, count, __FILE__, __LINE__);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001351 }
Tim Peters5de98422002-04-27 18:44:32 +00001352 if (count != len)
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001353 _PyString_Resize(&buf, count);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001354 return buf;
1355}
1356
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001357PyDoc_STRVAR(PySSL_SSLread_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001358"read([len]) -> string\n\
1359\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001360Read up to len bytes from the SSL socket.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001361
Bill Janssen934b16d2008-06-28 22:19:33 +00001362static PyObject *PySSL_SSLshutdown(PySSLObject *self)
1363{
Antoine Pitroua5c4b552010-04-22 23:33:02 +00001364 int err, ssl_err, sockstate, nonblocking;
1365 int zeros = 0;
Bill Janssen934b16d2008-06-28 22:19:33 +00001366
1367 /* Guard against closed socket */
1368 if (self->Socket->sock_fd < 0) {
1369 PyErr_SetString(PySSLErrorObject,
1370 "Underlying socket has been closed.");
1371 return NULL;
1372 }
1373
Antoine Pitroua5c4b552010-04-22 23:33:02 +00001374 /* Just in case the blocking state of the socket has been changed */
1375 nonblocking = (self->Socket->sock_timeout >= 0.0);
1376 BIO_set_nbio(SSL_get_rbio(self->ssl), nonblocking);
1377 BIO_set_nbio(SSL_get_wbio(self->ssl), nonblocking);
1378
1379 while (1) {
1380 PySSL_BEGIN_ALLOW_THREADS
1381 /* Disable read-ahead so that unwrap can work correctly.
1382 * Otherwise OpenSSL might read in too much data,
1383 * eating clear text data that happens to be
1384 * transmitted after the SSL shutdown.
1385 * Should be safe to call repeatedly everytime this
1386 * function is used and the shutdown_seen_zero != 0
1387 * condition is met.
1388 */
1389 if (self->shutdown_seen_zero)
1390 SSL_set_read_ahead(self->ssl, 0);
Bill Janssen934b16d2008-06-28 22:19:33 +00001391 err = SSL_shutdown(self->ssl);
Antoine Pitroua5c4b552010-04-22 23:33:02 +00001392 PySSL_END_ALLOW_THREADS
1393 /* If err == 1, a secure shutdown with SSL_shutdown() is complete */
1394 if (err > 0)
1395 break;
1396 if (err == 0) {
1397 /* Don't loop endlessly; instead preserve legacy
1398 behaviour of trying SSL_shutdown() only twice.
1399 This looks necessary for OpenSSL < 0.9.8m */
1400 if (++zeros > 1)
1401 break;
1402 /* Shutdown was sent, now try receiving */
1403 self->shutdown_seen_zero = 1;
1404 continue;
1405 }
1406
1407 /* Possibly retry shutdown until timeout or failure */
1408 ssl_err = SSL_get_error(self->ssl, err);
1409 if (ssl_err == SSL_ERROR_WANT_READ)
1410 sockstate = check_socket_and_wait_for_timeout(self->Socket, 0);
1411 else if (ssl_err == SSL_ERROR_WANT_WRITE)
1412 sockstate = check_socket_and_wait_for_timeout(self->Socket, 1);
1413 else
1414 break;
1415 if (sockstate == SOCKET_HAS_TIMED_OUT) {
1416 if (ssl_err == SSL_ERROR_WANT_READ)
1417 PyErr_SetString(PySSLErrorObject,
1418 "The read operation timed out");
1419 else
1420 PyErr_SetString(PySSLErrorObject,
1421 "The write operation timed out");
1422 return NULL;
1423 }
1424 else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
1425 PyErr_SetString(PySSLErrorObject,
1426 "Underlying socket too large for select().");
1427 return NULL;
1428 }
1429 else if (sockstate != SOCKET_OPERATION_OK)
1430 /* Retain the SSL error code */
1431 break;
Bill Janssen934b16d2008-06-28 22:19:33 +00001432 }
Bill Janssen934b16d2008-06-28 22:19:33 +00001433
1434 if (err < 0)
1435 return PySSL_SetError(self, err, __FILE__, __LINE__);
1436 else {
1437 Py_INCREF(self->Socket);
1438 return (PyObject *) (self->Socket);
1439 }
1440}
1441
1442PyDoc_STRVAR(PySSL_SSLshutdown_doc,
1443"shutdown(s) -> socket\n\
1444\n\
1445Does the SSL shutdown handshake with the remote end, and returns\n\
1446the underlying socket object.");
1447
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001448static PyMethodDef PySSLMethods[] = {
Bill Janssen934b16d2008-06-28 22:19:33 +00001449 {"do_handshake", (PyCFunction)PySSL_SSLdo_handshake, METH_NOARGS},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001450 {"write", (PyCFunction)PySSL_SSLwrite, METH_VARARGS,
Bill Janssen98d19da2007-09-10 21:51:02 +00001451 PySSL_SSLwrite_doc},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001452 {"read", (PyCFunction)PySSL_SSLread, METH_VARARGS,
Bill Janssen98d19da2007-09-10 21:51:02 +00001453 PySSL_SSLread_doc},
Bill Janssen934b16d2008-06-28 22:19:33 +00001454 {"pending", (PyCFunction)PySSL_SSLpending, METH_NOARGS,
1455 PySSL_SSLpending_doc},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001456 {"server", (PyCFunction)PySSL_server, METH_NOARGS},
1457 {"issuer", (PyCFunction)PySSL_issuer, METH_NOARGS},
Bill Janssen98d19da2007-09-10 21:51:02 +00001458 {"peer_certificate", (PyCFunction)PySSL_peercert, METH_VARARGS,
1459 PySSL_peercert_doc},
1460 {"cipher", (PyCFunction)PySSL_cipher, METH_NOARGS},
Bill Janssen934b16d2008-06-28 22:19:33 +00001461 {"shutdown", (PyCFunction)PySSL_SSLshutdown, METH_NOARGS,
1462 PySSL_SSLshutdown_doc},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001463 {NULL, NULL}
1464};
1465
1466static PyObject *PySSL_getattr(PySSLObject *self, char *name)
1467{
1468 return Py_FindMethod(PySSLMethods, (PyObject *)self, name);
1469}
1470
Jeremy Hylton938ace62002-07-17 16:30:39 +00001471static PyTypeObject PySSL_Type = {
Martin v. Löwis68192102007-07-21 06:55:02 +00001472 PyVarObject_HEAD_INIT(NULL, 0)
Guido van Rossum780b80d2007-08-27 18:42:23 +00001473 "ssl.SSLContext", /*tp_name*/
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001474 sizeof(PySSLObject), /*tp_basicsize*/
1475 0, /*tp_itemsize*/
1476 /* methods */
1477 (destructor)PySSL_dealloc, /*tp_dealloc*/
1478 0, /*tp_print*/
1479 (getattrfunc)PySSL_getattr, /*tp_getattr*/
1480 0, /*tp_setattr*/
1481 0, /*tp_compare*/
1482 0, /*tp_repr*/
1483 0, /*tp_as_number*/
1484 0, /*tp_as_sequence*/
1485 0, /*tp_as_mapping*/
1486 0, /*tp_hash*/
1487};
1488
1489#ifdef HAVE_OPENSSL_RAND
1490
1491/* helper routines for seeding the SSL PRNG */
1492static PyObject *
1493PySSL_RAND_add(PyObject *self, PyObject *args)
1494{
1495 char *buf;
1496 int len;
1497 double entropy;
1498
1499 if (!PyArg_ParseTuple(args, "s#d:RAND_add", &buf, &len, &entropy))
1500 return NULL;
1501 RAND_add(buf, len, entropy);
1502 Py_INCREF(Py_None);
1503 return Py_None;
1504}
1505
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001506PyDoc_STRVAR(PySSL_RAND_add_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001507"RAND_add(string, entropy)\n\
1508\n\
1509Mix string into the OpenSSL PRNG state. entropy (a float) is a lower\n\
Bill Janssen98d19da2007-09-10 21:51:02 +00001510bound on the entropy contained in string. See RFC 1750.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001511
1512static PyObject *
1513PySSL_RAND_status(PyObject *self)
1514{
1515 return PyInt_FromLong(RAND_status());
1516}
1517
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001518PyDoc_STRVAR(PySSL_RAND_status_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001519"RAND_status() -> 0 or 1\n\
1520\n\
1521Returns 1 if the OpenSSL PRNG has been seeded with enough data and 0 if not.\n\
1522It is necessary to seed the PRNG with RAND_add() on some platforms before\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001523using the ssl() function.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001524
1525static PyObject *
1526PySSL_RAND_egd(PyObject *self, PyObject *arg)
1527{
1528 int bytes;
1529
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001530 if (!PyString_Check(arg))
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001531 return PyErr_Format(PyExc_TypeError,
1532 "RAND_egd() expected string, found %s",
Christian Heimese93237d2007-12-19 02:37:44 +00001533 Py_TYPE(arg)->tp_name);
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001534 bytes = RAND_egd(PyString_AS_STRING(arg));
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001535 if (bytes == -1) {
1536 PyErr_SetString(PySSLErrorObject,
1537 "EGD connection failed or EGD did not return "
1538 "enough data to seed the PRNG");
1539 return NULL;
1540 }
1541 return PyInt_FromLong(bytes);
1542}
1543
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001544PyDoc_STRVAR(PySSL_RAND_egd_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001545"RAND_egd(path) -> bytes\n\
1546\n\
Bill Janssen98d19da2007-09-10 21:51:02 +00001547Queries the entropy gather daemon (EGD) on the socket named by 'path'.\n\
1548Returns number of bytes read. Raises SSLError if connection to EGD\n\
1549fails or if it does provide enough data to seed PRNG.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001550
1551#endif
1552
1553/* List of functions exported by this module. */
1554
1555static PyMethodDef PySSL_methods[] = {
Guido van Rossum780b80d2007-08-27 18:42:23 +00001556 {"sslwrap", PySSL_sslwrap,
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001557 METH_VARARGS, ssl_doc},
Bill Janssen98d19da2007-09-10 21:51:02 +00001558 {"_test_decode_cert", PySSL_test_decode_certificate,
1559 METH_VARARGS},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001560#ifdef HAVE_OPENSSL_RAND
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001561 {"RAND_add", PySSL_RAND_add, METH_VARARGS,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001562 PySSL_RAND_add_doc},
1563 {"RAND_egd", PySSL_RAND_egd, METH_O,
1564 PySSL_RAND_egd_doc},
1565 {"RAND_status", (PyCFunction)PySSL_RAND_status, METH_NOARGS,
1566 PySSL_RAND_status_doc},
1567#endif
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001568 {NULL, NULL} /* Sentinel */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001569};
1570
1571
Bill Janssen98d19da2007-09-10 21:51:02 +00001572#ifdef WITH_THREAD
1573
1574/* an implementation of OpenSSL threading operations in terms
1575 of the Python C thread library */
1576
1577static PyThread_type_lock *_ssl_locks = NULL;
1578
1579static unsigned long _ssl_thread_id_function (void) {
1580 return PyThread_get_thread_ident();
1581}
1582
1583static void _ssl_thread_locking_function (int mode, int n, const char *file, int line) {
1584 /* this function is needed to perform locking on shared data
1585 structures. (Note that OpenSSL uses a number of global data
1586 structures that will be implicitly shared whenever multiple threads
1587 use OpenSSL.) Multi-threaded applications will crash at random if
1588 it is not set.
1589
1590 locking_function() must be able to handle up to CRYPTO_num_locks()
1591 different mutex locks. It sets the n-th lock if mode & CRYPTO_LOCK, and
1592 releases it otherwise.
1593
1594 file and line are the file number of the function setting the
1595 lock. They can be useful for debugging.
1596 */
1597
1598 if ((_ssl_locks == NULL) ||
Neal Norwitz5802bb22008-03-27 05:03:11 +00001599 (n < 0) || ((unsigned)n >= _ssl_locks_count))
Bill Janssen98d19da2007-09-10 21:51:02 +00001600 return;
1601
1602 if (mode & CRYPTO_LOCK) {
1603 PyThread_acquire_lock(_ssl_locks[n], 1);
1604 } else {
1605 PyThread_release_lock(_ssl_locks[n]);
1606 }
1607}
1608
1609static int _setup_ssl_threads(void) {
1610
Neal Norwitz5802bb22008-03-27 05:03:11 +00001611 unsigned int i;
Bill Janssen98d19da2007-09-10 21:51:02 +00001612
1613 if (_ssl_locks == NULL) {
1614 _ssl_locks_count = CRYPTO_num_locks();
1615 _ssl_locks = (PyThread_type_lock *)
1616 malloc(sizeof(PyThread_type_lock) * _ssl_locks_count);
1617 if (_ssl_locks == NULL)
1618 return 0;
1619 memset(_ssl_locks, 0, sizeof(PyThread_type_lock) * _ssl_locks_count);
1620 for (i = 0; i < _ssl_locks_count; i++) {
1621 _ssl_locks[i] = PyThread_allocate_lock();
1622 if (_ssl_locks[i] == NULL) {
Raymond Hettinger354cfc12009-01-26 16:52:22 +00001623 unsigned int j;
Bill Janssen98d19da2007-09-10 21:51:02 +00001624 for (j = 0; j < i; j++) {
1625 PyThread_free_lock(_ssl_locks[j]);
1626 }
1627 free(_ssl_locks);
1628 return 0;
1629 }
1630 }
1631 CRYPTO_set_locking_callback(_ssl_thread_locking_function);
1632 CRYPTO_set_id_callback(_ssl_thread_id_function);
1633 }
1634 return 1;
1635}
1636
1637#endif /* def HAVE_THREAD */
1638
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001639PyDoc_STRVAR(module_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001640"Implementation module for SSL socket operations. See the socket module\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001641for documentation.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001642
Mark Hammondfe51c6d2002-08-02 02:27:13 +00001643PyMODINIT_FUNC
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001644init_ssl(void)
1645{
Antoine Pitrouf9de5342010-04-05 21:35:07 +00001646 PyObject *m, *d, *r;
1647 unsigned long libver;
1648 unsigned int major, minor, fix, patch, status;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001649
Christian Heimese93237d2007-12-19 02:37:44 +00001650 Py_TYPE(&PySSL_Type) = &PyType_Type;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001651
1652 m = Py_InitModule3("_ssl", PySSL_methods, module_doc);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00001653 if (m == NULL)
1654 return;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001655 d = PyModule_GetDict(m);
1656
1657 /* Load _socket module and its C API */
1658 if (PySocketModule_ImportModuleAndAPI())
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001659 return;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001660
1661 /* Init OpenSSL */
1662 SSL_load_error_strings();
Antoine Pitrouc715a9e2010-04-21 19:28:03 +00001663 SSL_library_init();
Bill Janssen98d19da2007-09-10 21:51:02 +00001664#ifdef WITH_THREAD
1665 /* note that this will start threading if not already started */
1666 if (!_setup_ssl_threads()) {
1667 return;
1668 }
1669#endif
Antoine Pitrouc715a9e2010-04-21 19:28:03 +00001670 OpenSSL_add_all_algorithms();
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001671
1672 /* Add symbols to module dict */
Bill Janssen98d19da2007-09-10 21:51:02 +00001673 PySSLErrorObject = PyErr_NewException("ssl.SSLError",
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001674 PySocketModule.error,
1675 NULL);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001676 if (PySSLErrorObject == NULL)
1677 return;
Bill Janssen98d19da2007-09-10 21:51:02 +00001678 if (PyDict_SetItemString(d, "SSLError", PySSLErrorObject) != 0)
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001679 return;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001680 if (PyDict_SetItemString(d, "SSLType",
1681 (PyObject *)&PySSL_Type) != 0)
1682 return;
1683 PyModule_AddIntConstant(m, "SSL_ERROR_ZERO_RETURN",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001684 PY_SSL_ERROR_ZERO_RETURN);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001685 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_READ",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001686 PY_SSL_ERROR_WANT_READ);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001687 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_WRITE",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001688 PY_SSL_ERROR_WANT_WRITE);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001689 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_X509_LOOKUP",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001690 PY_SSL_ERROR_WANT_X509_LOOKUP);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001691 PyModule_AddIntConstant(m, "SSL_ERROR_SYSCALL",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001692 PY_SSL_ERROR_SYSCALL);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001693 PyModule_AddIntConstant(m, "SSL_ERROR_SSL",
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001694 PY_SSL_ERROR_SSL);
1695 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_CONNECT",
1696 PY_SSL_ERROR_WANT_CONNECT);
1697 /* non ssl.h errorcodes */
1698 PyModule_AddIntConstant(m, "SSL_ERROR_EOF",
1699 PY_SSL_ERROR_EOF);
1700 PyModule_AddIntConstant(m, "SSL_ERROR_INVALID_ERROR_CODE",
1701 PY_SSL_ERROR_INVALID_ERROR_CODE);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001702 /* cert requirements */
1703 PyModule_AddIntConstant(m, "CERT_NONE",
1704 PY_SSL_CERT_NONE);
1705 PyModule_AddIntConstant(m, "CERT_OPTIONAL",
1706 PY_SSL_CERT_OPTIONAL);
1707 PyModule_AddIntConstant(m, "CERT_REQUIRED",
1708 PY_SSL_CERT_REQUIRED);
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001709
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001710 /* protocol versions */
1711 PyModule_AddIntConstant(m, "PROTOCOL_SSLv2",
1712 PY_SSL_VERSION_SSL2);
1713 PyModule_AddIntConstant(m, "PROTOCOL_SSLv3",
1714 PY_SSL_VERSION_SSL3);
1715 PyModule_AddIntConstant(m, "PROTOCOL_SSLv23",
1716 PY_SSL_VERSION_SSL23);
1717 PyModule_AddIntConstant(m, "PROTOCOL_TLSv1",
1718 PY_SSL_VERSION_TLS1);
Antoine Pitrouf9de5342010-04-05 21:35:07 +00001719
1720 /* OpenSSL version */
1721 /* SSLeay() gives us the version of the library linked against,
1722 which could be different from the headers version.
1723 */
1724 libver = SSLeay();
1725 r = PyLong_FromUnsignedLong(libver);
1726 if (r == NULL)
1727 return;
1728 if (PyModule_AddObject(m, "OPENSSL_VERSION_NUMBER", r))
1729 return;
1730 status = libver & 0xF;
1731 libver >>= 4;
1732 patch = libver & 0xFF;
1733 libver >>= 8;
1734 fix = libver & 0xFF;
1735 libver >>= 8;
1736 minor = libver & 0xFF;
1737 libver >>= 8;
1738 major = libver & 0xFF;
1739 r = Py_BuildValue("IIIII", major, minor, fix, patch, status);
1740 if (r == NULL || PyModule_AddObject(m, "OPENSSL_VERSION_INFO", r))
1741 return;
1742 r = PyString_FromString(SSLeay_version(SSLEAY_VERSION));
1743 if (r == NULL || PyModule_AddObject(m, "OPENSSL_VERSION", r))
1744 return;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001745}