blob: becf6a50b3d0ff2816ec7c45d2dd4e4462203a24 [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 {
Victor Stinnerb1241f92011-05-10 01:52:03 +020065#ifndef OPENSSL_NO_SSL2
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +000066 PY_SSL_VERSION_SSL2,
Victor Stinnerb1241f92011-05-10 01:52:03 +020067#endif
68 PY_SSL_VERSION_SSL3=1,
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +000069 PY_SSL_VERSION_SSL23,
70 PY_SSL_VERSION_TLS1
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +000071};
72
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000073/* Include symbols from _socket module */
74#include "socketmodule.h"
75
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +000076#if defined(HAVE_POLL_H)
Anthony Baxter93ab5fa2006-07-11 02:04:09 +000077#include <poll.h>
78#elif defined(HAVE_SYS_POLL_H)
79#include <sys/poll.h>
80#endif
81
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000082/* Include OpenSSL header files */
83#include "openssl/rsa.h"
84#include "openssl/crypto.h"
85#include "openssl/x509.h"
Bill Janssen98d19da2007-09-10 21:51:02 +000086#include "openssl/x509v3.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000087#include "openssl/pem.h"
88#include "openssl/ssl.h"
89#include "openssl/err.h"
90#include "openssl/rand.h"
91
92/* SSL error object */
93static PyObject *PySSLErrorObject;
94
Bill Janssen98d19da2007-09-10 21:51:02 +000095#ifdef WITH_THREAD
96
97/* serves as a flag to see whether we've initialized the SSL thread support. */
98/* 0 means no, greater than 0 means yes */
99
100static unsigned int _ssl_locks_count = 0;
101
102#endif /* def WITH_THREAD */
103
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000104/* SSL socket object */
105
106#define X509_NAME_MAXLEN 256
107
108/* RAND_* APIs got added to OpenSSL in 0.9.5 */
109#if OPENSSL_VERSION_NUMBER >= 0x0090500fL
110# define HAVE_OPENSSL_RAND 1
111#else
112# undef HAVE_OPENSSL_RAND
113#endif
114
115typedef struct {
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000116 PyObject_HEAD
117 PySocketSockObject *Socket; /* Socket on which we're layered */
118 SSL_CTX* ctx;
119 SSL* ssl;
120 X509* peer_cert;
121 char server[X509_NAME_MAXLEN];
122 char issuer[X509_NAME_MAXLEN];
123 int shutdown_seen_zero;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000124
125} PySSLObject;
126
Jeremy Hylton938ace62002-07-17 16:30:39 +0000127static PyTypeObject PySSL_Type;
128static PyObject *PySSL_SSLwrite(PySSLObject *self, PyObject *args);
129static PyObject *PySSL_SSLread(PySSLObject *self, PyObject *args);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000130static int check_socket_and_wait_for_timeout(PySocketSockObject *s,
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000131 int writing);
Bill Janssen98d19da2007-09-10 21:51:02 +0000132static PyObject *PySSL_peercert(PySSLObject *self, PyObject *args);
133static PyObject *PySSL_cipher(PySSLObject *self);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000134
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000135#define PySSLObject_Check(v) (Py_TYPE(v) == &PySSL_Type)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000136
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +0000137typedef enum {
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000138 SOCKET_IS_NONBLOCKING,
139 SOCKET_IS_BLOCKING,
140 SOCKET_HAS_TIMED_OUT,
141 SOCKET_HAS_BEEN_CLOSED,
142 SOCKET_TOO_LARGE_FOR_SELECT,
143 SOCKET_OPERATION_OK
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +0000144} timeout_state;
145
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000146/* Wrap error strings with filename and line # */
147#define STRINGIFY1(x) #x
148#define STRINGIFY2(x) STRINGIFY1(x)
149#define ERRSTR1(x,y,z) (x ":" y ": " z)
150#define ERRSTR(x) ERRSTR1("_ssl.c", STRINGIFY2(__LINE__), x)
151
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000152/* XXX It might be helpful to augment the error message generated
153 below with the name of the SSL function that generated the error.
154 I expect it's obvious most of the time.
155*/
156
157static PyObject *
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000158PySSL_SetError(PySSLObject *obj, int ret, char *filename, int lineno)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000159{
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000160 PyObject *v;
161 char buf[2048];
162 char *errstr;
163 int err;
164 enum py_ssl_error p = PY_SSL_ERROR_NONE;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000165
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000166 assert(ret <= 0);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000167
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000168 if (obj->ssl != NULL) {
169 err = SSL_get_error(obj->ssl, ret);
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +0000170
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000171 switch (err) {
172 case SSL_ERROR_ZERO_RETURN:
173 errstr = "TLS/SSL connection has been closed";
174 p = PY_SSL_ERROR_ZERO_RETURN;
175 break;
176 case SSL_ERROR_WANT_READ:
177 errstr = "The operation did not complete (read)";
178 p = PY_SSL_ERROR_WANT_READ;
179 break;
180 case SSL_ERROR_WANT_WRITE:
181 p = PY_SSL_ERROR_WANT_WRITE;
182 errstr = "The operation did not complete (write)";
183 break;
184 case SSL_ERROR_WANT_X509_LOOKUP:
185 p = PY_SSL_ERROR_WANT_X509_LOOKUP;
Antoine Pitrou2e136ab2010-05-12 14:02:34 +0000186 errstr = "The operation did not complete (X509 lookup)";
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000187 break;
188 case SSL_ERROR_WANT_CONNECT:
189 p = PY_SSL_ERROR_WANT_CONNECT;
190 errstr = "The operation did not complete (connect)";
191 break;
192 case SSL_ERROR_SYSCALL:
193 {
194 unsigned long e = ERR_get_error();
195 if (e == 0) {
196 if (ret == 0 || !obj->Socket) {
Antoine Pitrou2e136ab2010-05-12 14:02:34 +0000197 p = PY_SSL_ERROR_EOF;
198 errstr = "EOF occurred in violation of protocol";
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000199 } else if (ret == -1) {
Antoine Pitrou2e136ab2010-05-12 14:02:34 +0000200 /* underlying BIO reported an I/O error */
Antoine Pitrou508a2372010-05-16 23:11:46 +0000201 ERR_clear_error();
Antoine Pitrou2e136ab2010-05-12 14:02:34 +0000202 return obj->Socket->errorhandler();
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000203 } else { /* possible? */
Antoine Pitrou2e136ab2010-05-12 14:02:34 +0000204 p = PY_SSL_ERROR_SYSCALL;
205 errstr = "Some I/O error occurred";
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000206 }
207 } else {
208 p = PY_SSL_ERROR_SYSCALL;
209 /* XXX Protected by global interpreter lock */
210 errstr = ERR_error_string(e, NULL);
211 }
212 break;
213 }
214 case SSL_ERROR_SSL:
215 {
216 unsigned long e = ERR_get_error();
217 p = PY_SSL_ERROR_SSL;
218 if (e != 0)
219 /* XXX Protected by global interpreter lock */
220 errstr = ERR_error_string(e, NULL);
221 else { /* possible? */
Antoine Pitrou2e136ab2010-05-12 14:02:34 +0000222 errstr = "A failure in the SSL library occurred";
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000223 }
224 break;
225 }
226 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);
232 }
233 PyOS_snprintf(buf, sizeof(buf), "_ssl.c:%d: %s", lineno, errstr);
Antoine Pitrou508a2372010-05-16 23:11:46 +0000234 ERR_clear_error();
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000235 v = Py_BuildValue("(is)", p, buf);
236 if (v != NULL) {
237 PyErr_SetObject(PySSLErrorObject, v);
238 Py_DECREF(v);
239 }
240 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000241}
242
Bill Janssen98d19da2007-09-10 21:51:02 +0000243static PyObject *
244_setSSLError (char *errstr, int errcode, char *filename, int lineno) {
245
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000246 char buf[2048];
247 PyObject *v;
Bill Janssen98d19da2007-09-10 21:51:02 +0000248
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000249 if (errstr == NULL) {
250 errcode = ERR_peek_last_error();
251 errstr = ERR_error_string(errcode, NULL);
252 }
253 PyOS_snprintf(buf, sizeof(buf), "_ssl.c:%d: %s", lineno, errstr);
Antoine Pitrou508a2372010-05-16 23:11:46 +0000254 ERR_clear_error();
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000255 v = Py_BuildValue("(is)", errcode, buf);
256 if (v != NULL) {
257 PyErr_SetObject(PySSLErrorObject, v);
258 Py_DECREF(v);
259 }
260 return NULL;
Bill Janssen98d19da2007-09-10 21:51:02 +0000261}
262
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000263static PySSLObject *
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000264newPySSLObject(PySocketSockObject *Sock, char *key_file, char *cert_file,
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000265 enum py_ssl_server_or_client socket_type,
266 enum py_ssl_cert_requirements certreq,
267 enum py_ssl_version proto_version,
268 char *cacerts_file, char *ciphers)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000269{
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000270 PySSLObject *self;
271 char *errstr = NULL;
272 int ret;
273 int verification_mode;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000274
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000275 self = PyObject_New(PySSLObject, &PySSL_Type); /* Create new object */
276 if (self == NULL)
277 return NULL;
278 memset(self->server, '\0', sizeof(char) * X509_NAME_MAXLEN);
279 memset(self->issuer, '\0', sizeof(char) * X509_NAME_MAXLEN);
280 self->peer_cert = NULL;
281 self->ssl = NULL;
282 self->ctx = NULL;
283 self->Socket = NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000284
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000285 /* Make sure the SSL error state is initialized */
286 (void) ERR_get_state();
287 ERR_clear_error();
Bill Janssen98d19da2007-09-10 21:51:02 +0000288
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000289 if ((key_file && !cert_file) || (!key_file && cert_file)) {
290 errstr = ERRSTR("Both the key & certificate files "
291 "must be specified");
292 goto fail;
293 }
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000294
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000295 if ((socket_type == PY_SSL_SERVER) &&
296 ((key_file == NULL) || (cert_file == NULL))) {
297 errstr = ERRSTR("Both the key & certificate files "
298 "must be specified for server-side operation");
299 goto fail;
300 }
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000301
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000302 PySSL_BEGIN_ALLOW_THREADS
303 if (proto_version == PY_SSL_VERSION_TLS1)
304 self->ctx = SSL_CTX_new(TLSv1_method()); /* Set up context */
305 else if (proto_version == PY_SSL_VERSION_SSL3)
306 self->ctx = SSL_CTX_new(SSLv3_method()); /* Set up context */
Victor Stinnerb1241f92011-05-10 01:52:03 +0200307#ifndef OPENSSL_NO_SSL2
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000308 else if (proto_version == PY_SSL_VERSION_SSL2)
309 self->ctx = SSL_CTX_new(SSLv2_method()); /* Set up context */
Victor Stinnerb1241f92011-05-10 01:52:03 +0200310#endif
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000311 else if (proto_version == PY_SSL_VERSION_SSL23)
312 self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */
313 PySSL_END_ALLOW_THREADS
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000314
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000315 if (self->ctx == NULL) {
316 errstr = ERRSTR("Invalid SSL protocol variant specified.");
317 goto fail;
318 }
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000319
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000320 if (ciphers != NULL) {
321 ret = SSL_CTX_set_cipher_list(self->ctx, ciphers);
322 if (ret == 0) {
323 errstr = ERRSTR("No cipher can be selected.");
324 goto fail;
325 }
326 }
Antoine Pitrou0a6373c2010-04-17 17:10:38 +0000327
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000328 if (certreq != PY_SSL_CERT_NONE) {
329 if (cacerts_file == NULL) {
330 errstr = ERRSTR("No root certificates specified for "
Antoine Pitrou2e136ab2010-05-12 14:02:34 +0000331 "verification of other-side certificates.");
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000332 goto fail;
333 } else {
334 PySSL_BEGIN_ALLOW_THREADS
335 ret = SSL_CTX_load_verify_locations(self->ctx,
336 cacerts_file,
337 NULL);
338 PySSL_END_ALLOW_THREADS
339 if (ret != 1) {
340 _setSSLError(NULL, 0, __FILE__, __LINE__);
341 goto fail;
342 }
343 }
344 }
345 if (key_file) {
346 PySSL_BEGIN_ALLOW_THREADS
347 ret = SSL_CTX_use_PrivateKey_file(self->ctx, key_file,
348 SSL_FILETYPE_PEM);
349 PySSL_END_ALLOW_THREADS
350 if (ret != 1) {
351 _setSSLError(NULL, ret, __FILE__, __LINE__);
352 goto fail;
353 }
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000354
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000355 PySSL_BEGIN_ALLOW_THREADS
356 ret = SSL_CTX_use_certificate_chain_file(self->ctx,
357 cert_file);
358 PySSL_END_ALLOW_THREADS
359 if (ret != 1) {
360 /*
361 fprintf(stderr, "ret is %d, errcode is %lu, %lu, with file \"%s\"\n",
362 ret, ERR_peek_error(), ERR_peek_last_error(), cert_file);
363 */
364 if (ERR_peek_last_error() != 0) {
365 _setSSLError(NULL, ret, __FILE__, __LINE__);
366 goto fail;
367 }
368 }
369 }
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000370
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000371 /* ssl compatibility */
372 SSL_CTX_set_options(self->ctx, SSL_OP_ALL);
Bill Janssen98d19da2007-09-10 21:51:02 +0000373
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000374 verification_mode = SSL_VERIFY_NONE;
375 if (certreq == PY_SSL_CERT_OPTIONAL)
376 verification_mode = SSL_VERIFY_PEER;
377 else if (certreq == PY_SSL_CERT_REQUIRED)
378 verification_mode = (SSL_VERIFY_PEER |
379 SSL_VERIFY_FAIL_IF_NO_PEER_CERT);
380 SSL_CTX_set_verify(self->ctx, verification_mode,
381 NULL); /* set verify lvl */
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000382
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000383 PySSL_BEGIN_ALLOW_THREADS
384 self->ssl = SSL_new(self->ctx); /* New ssl struct */
385 PySSL_END_ALLOW_THREADS
386 SSL_set_fd(self->ssl, Sock->sock_fd); /* Set the socket for SSL */
Antoine Pitrou92719c52010-04-09 20:38:39 +0000387#ifdef SSL_MODE_AUTO_RETRY
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000388 SSL_set_mode(self->ssl, SSL_MODE_AUTO_RETRY);
Antoine Pitrou92719c52010-04-09 20:38:39 +0000389#endif
Guido van Rossum4f707ac2003-01-31 18:13:18 +0000390
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000391 /* If the socket is in non-blocking mode or timeout mode, set the BIO
392 * to non-blocking mode (blocking is the default)
393 */
394 if (Sock->sock_timeout >= 0.0) {
395 /* Set both the read and write BIO's to non-blocking mode */
396 BIO_set_nbio(SSL_get_rbio(self->ssl), 1);
397 BIO_set_nbio(SSL_get_wbio(self->ssl), 1);
398 }
Guido van Rossum4f707ac2003-01-31 18:13:18 +0000399
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000400 PySSL_BEGIN_ALLOW_THREADS
401 if (socket_type == PY_SSL_CLIENT)
402 SSL_set_connect_state(self->ssl);
403 else
404 SSL_set_accept_state(self->ssl);
405 PySSL_END_ALLOW_THREADS
Martin v. Löwis09c35f72002-07-28 09:57:45 +0000406
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000407 self->Socket = Sock;
408 Py_INCREF(self->Socket);
409 return self;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000410 fail:
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000411 if (errstr)
412 PyErr_SetString(PySSLErrorObject, errstr);
413 Py_DECREF(self);
414 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000415}
416
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000417static PyObject *
Guido van Rossum780b80d2007-08-27 18:42:23 +0000418PySSL_sslwrap(PyObject *self, PyObject *args)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000419{
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000420 PySocketSockObject *Sock;
421 int server_side = 0;
422 int verification_mode = PY_SSL_CERT_NONE;
423 int protocol = PY_SSL_VERSION_SSL23;
424 char *key_file = NULL;
425 char *cert_file = NULL;
426 char *cacerts_file = NULL;
427 char *ciphers = NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000428
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000429 if (!PyArg_ParseTuple(args, "O!i|zziizz:sslwrap",
430 PySocketModule.Sock_Type,
431 &Sock,
432 &server_side,
433 &key_file, &cert_file,
434 &verification_mode, &protocol,
435 &cacerts_file, &ciphers))
436 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000437
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000438 /*
439 fprintf(stderr,
440 "server_side is %d, keyfile %p, certfile %p, verify_mode %d, "
441 "protocol %d, certs %p\n",
442 server_side, key_file, cert_file, verification_mode,
443 protocol, cacerts_file);
444 */
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000445
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000446 return (PyObject *) newPySSLObject(Sock, key_file, cert_file,
447 server_side, verification_mode,
448 protocol, cacerts_file,
449 ciphers);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000450}
451
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000452PyDoc_STRVAR(ssl_doc,
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000453"sslwrap(socket, server_side, [keyfile, certfile, certs_mode, protocol,\n"
Antoine Pitrou0a6373c2010-04-17 17:10:38 +0000454" cacertsfile, ciphers]) -> sslobject");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000455
456/* SSL object methods */
457
Bill Janssen934b16d2008-06-28 22:19:33 +0000458static PyObject *PySSL_SSLdo_handshake(PySSLObject *self)
459{
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000460 int ret;
461 int err;
462 int sockstate, nonblocking;
Antoine Pitrou4d3e3722010-04-24 19:57:01 +0000463
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000464 /* just in case the blocking state of the socket has been changed */
465 nonblocking = (self->Socket->sock_timeout >= 0.0);
466 BIO_set_nbio(SSL_get_rbio(self->ssl), nonblocking);
467 BIO_set_nbio(SSL_get_wbio(self->ssl), nonblocking);
Bill Janssen934b16d2008-06-28 22:19:33 +0000468
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000469 /* Actually negotiate SSL connection */
470 /* XXX If SSL_do_handshake() returns 0, it's also a failure. */
471 do {
472 PySSL_BEGIN_ALLOW_THREADS
473 ret = SSL_do_handshake(self->ssl);
474 err = SSL_get_error(self->ssl, ret);
475 PySSL_END_ALLOW_THREADS
476 if(PyErr_CheckSignals()) {
477 return NULL;
478 }
479 if (err == SSL_ERROR_WANT_READ) {
480 sockstate = check_socket_and_wait_for_timeout(self->Socket, 0);
481 } else if (err == SSL_ERROR_WANT_WRITE) {
482 sockstate = check_socket_and_wait_for_timeout(self->Socket, 1);
483 } else {
484 sockstate = SOCKET_OPERATION_OK;
485 }
486 if (sockstate == SOCKET_HAS_TIMED_OUT) {
487 PyErr_SetString(PySSLErrorObject,
Antoine Pitrou2e136ab2010-05-12 14:02:34 +0000488 ERRSTR("The handshake operation timed out"));
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000489 return NULL;
490 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
491 PyErr_SetString(PySSLErrorObject,
Antoine Pitrou2e136ab2010-05-12 14:02:34 +0000492 ERRSTR("Underlying socket has been closed."));
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000493 return NULL;
494 } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
495 PyErr_SetString(PySSLErrorObject,
Antoine Pitrou2e136ab2010-05-12 14:02:34 +0000496 ERRSTR("Underlying socket too large for select()."));
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000497 return NULL;
498 } else if (sockstate == SOCKET_IS_NONBLOCKING) {
499 break;
500 }
501 } while (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE);
502 if (ret < 1)
503 return PySSL_SetError(self, ret, __FILE__, __LINE__);
Bill Janssen934b16d2008-06-28 22:19:33 +0000504
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000505 if (self->peer_cert)
506 X509_free (self->peer_cert);
507 PySSL_BEGIN_ALLOW_THREADS
508 if ((self->peer_cert = SSL_get_peer_certificate(self->ssl))) {
509 X509_NAME_oneline(X509_get_subject_name(self->peer_cert),
510 self->server, X509_NAME_MAXLEN);
511 X509_NAME_oneline(X509_get_issuer_name(self->peer_cert),
512 self->issuer, X509_NAME_MAXLEN);
513 }
514 PySSL_END_ALLOW_THREADS
Bill Janssen934b16d2008-06-28 22:19:33 +0000515
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000516 Py_INCREF(Py_None);
517 return Py_None;
Bill Janssen934b16d2008-06-28 22:19:33 +0000518}
519
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000520static PyObject *
521PySSL_server(PySSLObject *self)
522{
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000523 return PyString_FromString(self->server);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000524}
525
526static PyObject *
527PySSL_issuer(PySSLObject *self)
528{
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000529 return PyString_FromString(self->issuer);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000530}
531
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000532static PyObject *
Bill Janssen98d19da2007-09-10 21:51:02 +0000533_create_tuple_for_attribute (ASN1_OBJECT *name, ASN1_STRING *value) {
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000534
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000535 char namebuf[X509_NAME_MAXLEN];
536 int buflen;
537 PyObject *name_obj;
538 PyObject *value_obj;
539 PyObject *attr;
540 unsigned char *valuebuf = NULL;
Guido van Rossum780b80d2007-08-27 18:42:23 +0000541
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000542 buflen = OBJ_obj2txt(namebuf, sizeof(namebuf), name, 0);
543 if (buflen < 0) {
544 _setSSLError(NULL, 0, __FILE__, __LINE__);
545 goto fail;
546 }
547 name_obj = PyString_FromStringAndSize(namebuf, buflen);
548 if (name_obj == NULL)
549 goto fail;
550
551 buflen = ASN1_STRING_to_UTF8(&valuebuf, value);
552 if (buflen < 0) {
553 _setSSLError(NULL, 0, __FILE__, __LINE__);
554 Py_DECREF(name_obj);
555 goto fail;
556 }
557 value_obj = PyUnicode_DecodeUTF8((char *) valuebuf,
Antoine Pitrou2e136ab2010-05-12 14:02:34 +0000558 buflen, "strict");
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000559 OPENSSL_free(valuebuf);
560 if (value_obj == NULL) {
561 Py_DECREF(name_obj);
562 goto fail;
563 }
564 attr = PyTuple_New(2);
565 if (attr == NULL) {
566 Py_DECREF(name_obj);
567 Py_DECREF(value_obj);
568 goto fail;
569 }
570 PyTuple_SET_ITEM(attr, 0, name_obj);
571 PyTuple_SET_ITEM(attr, 1, value_obj);
572 return attr;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000573
Bill Janssen98d19da2007-09-10 21:51:02 +0000574 fail:
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000575 return NULL;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000576}
577
578static PyObject *
Bill Janssen98d19da2007-09-10 21:51:02 +0000579_create_tuple_for_X509_NAME (X509_NAME *xname)
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000580{
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000581 PyObject *dn = NULL; /* tuple which represents the "distinguished name" */
582 PyObject *rdn = NULL; /* tuple to hold a "relative distinguished name" */
583 PyObject *rdnt;
584 PyObject *attr = NULL; /* tuple to hold an attribute */
585 int entry_count = X509_NAME_entry_count(xname);
586 X509_NAME_ENTRY *entry;
587 ASN1_OBJECT *name;
588 ASN1_STRING *value;
589 int index_counter;
590 int rdn_level = -1;
591 int retcode;
Bill Janssen98d19da2007-09-10 21:51:02 +0000592
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000593 dn = PyList_New(0);
594 if (dn == NULL)
595 return NULL;
596 /* now create another tuple to hold the top-level RDN */
597 rdn = PyList_New(0);
598 if (rdn == NULL)
599 goto fail0;
Bill Janssen98d19da2007-09-10 21:51:02 +0000600
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000601 for (index_counter = 0;
602 index_counter < entry_count;
603 index_counter++)
604 {
605 entry = X509_NAME_get_entry(xname, index_counter);
Bill Janssen98d19da2007-09-10 21:51:02 +0000606
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000607 /* check to see if we've gotten to a new RDN */
608 if (rdn_level >= 0) {
609 if (rdn_level != entry->set) {
610 /* yes, new RDN */
611 /* add old RDN to DN */
612 rdnt = PyList_AsTuple(rdn);
613 Py_DECREF(rdn);
614 if (rdnt == NULL)
615 goto fail0;
616 retcode = PyList_Append(dn, rdnt);
617 Py_DECREF(rdnt);
618 if (retcode < 0)
619 goto fail0;
620 /* create new RDN */
621 rdn = PyList_New(0);
622 if (rdn == NULL)
623 goto fail0;
624 }
625 }
626 rdn_level = entry->set;
Bill Janssen98d19da2007-09-10 21:51:02 +0000627
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000628 /* now add this attribute to the current RDN */
629 name = X509_NAME_ENTRY_get_object(entry);
630 value = X509_NAME_ENTRY_get_data(entry);
631 attr = _create_tuple_for_attribute(name, value);
632 /*
633 fprintf(stderr, "RDN level %d, attribute %s: %s\n",
634 entry->set,
635 PyString_AS_STRING(PyTuple_GET_ITEM(attr, 0)),
636 PyString_AS_STRING(PyTuple_GET_ITEM(attr, 1)));
637 */
638 if (attr == NULL)
639 goto fail1;
640 retcode = PyList_Append(rdn, attr);
641 Py_DECREF(attr);
642 if (retcode < 0)
643 goto fail1;
644 }
645 /* now, there's typically a dangling RDN */
646 if ((rdn != NULL) && (PyList_Size(rdn) > 0)) {
647 rdnt = PyList_AsTuple(rdn);
648 Py_DECREF(rdn);
649 if (rdnt == NULL)
650 goto fail0;
651 retcode = PyList_Append(dn, rdnt);
652 Py_DECREF(rdnt);
653 if (retcode < 0)
654 goto fail0;
655 }
Bill Janssen98d19da2007-09-10 21:51:02 +0000656
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000657 /* convert list to tuple */
658 rdnt = PyList_AsTuple(dn);
659 Py_DECREF(dn);
660 if (rdnt == NULL)
661 return NULL;
662 return rdnt;
Bill Janssen98d19da2007-09-10 21:51:02 +0000663
664 fail1:
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000665 Py_XDECREF(rdn);
Bill Janssen98d19da2007-09-10 21:51:02 +0000666
667 fail0:
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000668 Py_XDECREF(dn);
669 return NULL;
Bill Janssen98d19da2007-09-10 21:51:02 +0000670}
671
672static PyObject *
673_get_peer_alt_names (X509 *certificate) {
Bill Janssen98d19da2007-09-10 21:51:02 +0000674
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000675 /* this code follows the procedure outlined in
676 OpenSSL's crypto/x509v3/v3_prn.c:X509v3_EXT_print()
677 function to extract the STACK_OF(GENERAL_NAME),
678 then iterates through the stack to add the
679 names. */
680
681 int i, j;
682 PyObject *peer_alt_names = Py_None;
683 PyObject *v, *t;
684 X509_EXTENSION *ext = NULL;
685 GENERAL_NAMES *names = NULL;
686 GENERAL_NAME *name;
Benjamin Peterson8e734032010-10-13 22:10:31 +0000687 const X509V3_EXT_METHOD *method;
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000688 BIO *biobuf = NULL;
689 char buf[2048];
690 char *vptr;
691 int len;
692 /* Issue #2973: ASN1_item_d2i() API changed in OpenSSL 0.9.6m */
Victor Stinner3f75cc52010-03-02 22:44:42 +0000693#if OPENSSL_VERSION_NUMBER >= 0x009060dfL
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000694 const unsigned char *p;
Victor Stinner3f75cc52010-03-02 22:44:42 +0000695#else
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000696 unsigned char *p;
Victor Stinner3f75cc52010-03-02 22:44:42 +0000697#endif
Bill Janssen98d19da2007-09-10 21:51:02 +0000698
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000699 if (certificate == NULL)
700 return peer_alt_names;
Bill Janssen98d19da2007-09-10 21:51:02 +0000701
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000702 /* get a memory buffer */
703 biobuf = BIO_new(BIO_s_mem());
Bill Janssen98d19da2007-09-10 21:51:02 +0000704
Antoine Pitrouf06eb462011-10-01 19:30:58 +0200705 i = -1;
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000706 while ((i = X509_get_ext_by_NID(
707 certificate, NID_subject_alt_name, i)) >= 0) {
Bill Janssen98d19da2007-09-10 21:51:02 +0000708
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000709 if (peer_alt_names == Py_None) {
710 peer_alt_names = PyList_New(0);
711 if (peer_alt_names == NULL)
712 goto fail;
713 }
Bill Janssen98d19da2007-09-10 21:51:02 +0000714
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000715 /* now decode the altName */
716 ext = X509_get_ext(certificate, i);
717 if(!(method = X509V3_EXT_get(ext))) {
718 PyErr_SetString(PySSLErrorObject,
719 ERRSTR("No method for internalizing subjectAltName!"));
720 goto fail;
721 }
Bill Janssen98d19da2007-09-10 21:51:02 +0000722
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000723 p = ext->value->data;
724 if (method->it)
725 names = (GENERAL_NAMES*) (ASN1_item_d2i(NULL,
726 &p,
727 ext->value->length,
728 ASN1_ITEM_ptr(method->it)));
729 else
730 names = (GENERAL_NAMES*) (method->d2i(NULL,
731 &p,
732 ext->value->length));
Bill Janssen98d19da2007-09-10 21:51:02 +0000733
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000734 for(j = 0; j < sk_GENERAL_NAME_num(names); j++) {
Bill Janssen98d19da2007-09-10 21:51:02 +0000735
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000736 /* get a rendering of each name in the set of names */
Bill Janssen98d19da2007-09-10 21:51:02 +0000737
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000738 name = sk_GENERAL_NAME_value(names, j);
739 if (name->type == GEN_DIRNAME) {
Bill Janssen98d19da2007-09-10 21:51:02 +0000740
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000741 /* we special-case DirName as a tuple of tuples of attributes */
Bill Janssen98d19da2007-09-10 21:51:02 +0000742
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000743 t = PyTuple_New(2);
744 if (t == NULL) {
745 goto fail;
746 }
Bill Janssen98d19da2007-09-10 21:51:02 +0000747
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000748 v = PyString_FromString("DirName");
749 if (v == NULL) {
750 Py_DECREF(t);
751 goto fail;
752 }
753 PyTuple_SET_ITEM(t, 0, v);
Bill Janssen98d19da2007-09-10 21:51:02 +0000754
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000755 v = _create_tuple_for_X509_NAME (name->d.dirn);
756 if (v == NULL) {
757 Py_DECREF(t);
758 goto fail;
759 }
760 PyTuple_SET_ITEM(t, 1, v);
Bill Janssen98d19da2007-09-10 21:51:02 +0000761
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000762 } else {
Bill Janssen98d19da2007-09-10 21:51:02 +0000763
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000764 /* for everything else, we use the OpenSSL print form */
Bill Janssen98d19da2007-09-10 21:51:02 +0000765
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000766 (void) BIO_reset(biobuf);
767 GENERAL_NAME_print(biobuf, name);
768 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
769 if (len < 0) {
770 _setSSLError(NULL, 0, __FILE__, __LINE__);
771 goto fail;
772 }
773 vptr = strchr(buf, ':');
774 if (vptr == NULL)
775 goto fail;
776 t = PyTuple_New(2);
777 if (t == NULL)
778 goto fail;
779 v = PyString_FromStringAndSize(buf, (vptr - buf));
780 if (v == NULL) {
781 Py_DECREF(t);
782 goto fail;
783 }
784 PyTuple_SET_ITEM(t, 0, v);
785 v = PyString_FromStringAndSize((vptr + 1), (len - (vptr - buf + 1)));
786 if (v == NULL) {
787 Py_DECREF(t);
788 goto fail;
789 }
790 PyTuple_SET_ITEM(t, 1, v);
791 }
792
793 /* and add that rendering to the list */
794
795 if (PyList_Append(peer_alt_names, t) < 0) {
796 Py_DECREF(t);
797 goto fail;
798 }
799 Py_DECREF(t);
800 }
Antoine Pitrouaa1c9672011-11-23 01:39:19 +0100801 sk_GENERAL_NAME_pop_free(names, GENERAL_NAME_free);
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000802 }
803 BIO_free(biobuf);
804 if (peer_alt_names != Py_None) {
805 v = PyList_AsTuple(peer_alt_names);
806 Py_DECREF(peer_alt_names);
807 return v;
808 } else {
809 return peer_alt_names;
810 }
811
Bill Janssen98d19da2007-09-10 21:51:02 +0000812
813 fail:
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000814 if (biobuf != NULL)
815 BIO_free(biobuf);
Bill Janssen98d19da2007-09-10 21:51:02 +0000816
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000817 if (peer_alt_names != Py_None) {
818 Py_XDECREF(peer_alt_names);
819 }
Bill Janssen98d19da2007-09-10 21:51:02 +0000820
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000821 return NULL;
Bill Janssen98d19da2007-09-10 21:51:02 +0000822}
823
824static PyObject *
825_decode_certificate (X509 *certificate, int verbose) {
826
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000827 PyObject *retval = NULL;
828 BIO *biobuf = NULL;
829 PyObject *peer;
830 PyObject *peer_alt_names = NULL;
831 PyObject *issuer;
832 PyObject *version;
833 PyObject *sn_obj;
834 ASN1_INTEGER *serialNumber;
835 char buf[2048];
836 int len;
837 ASN1_TIME *notBefore, *notAfter;
838 PyObject *pnotBefore, *pnotAfter;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000839
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000840 retval = PyDict_New();
841 if (retval == NULL)
842 return NULL;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000843
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000844 peer = _create_tuple_for_X509_NAME(
845 X509_get_subject_name(certificate));
846 if (peer == NULL)
847 goto fail0;
848 if (PyDict_SetItemString(retval, (const char *) "subject", peer) < 0) {
849 Py_DECREF(peer);
850 goto fail0;
851 }
852 Py_DECREF(peer);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000853
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000854 if (verbose) {
855 issuer = _create_tuple_for_X509_NAME(
856 X509_get_issuer_name(certificate));
857 if (issuer == NULL)
858 goto fail0;
859 if (PyDict_SetItemString(retval, (const char *)"issuer", issuer) < 0) {
860 Py_DECREF(issuer);
861 goto fail0;
862 }
863 Py_DECREF(issuer);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000864
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000865 version = PyInt_FromLong(X509_get_version(certificate) + 1);
866 if (PyDict_SetItemString(retval, "version", version) < 0) {
867 Py_DECREF(version);
868 goto fail0;
869 }
870 Py_DECREF(version);
871 }
Bill Janssen98d19da2007-09-10 21:51:02 +0000872
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000873 /* get a memory buffer */
874 biobuf = BIO_new(BIO_s_mem());
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000875
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000876 if (verbose) {
Bill Janssen98d19da2007-09-10 21:51:02 +0000877
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000878 (void) BIO_reset(biobuf);
879 serialNumber = X509_get_serialNumber(certificate);
880 /* should not exceed 20 octets, 160 bits, so buf is big enough */
881 i2a_ASN1_INTEGER(biobuf, serialNumber);
882 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
883 if (len < 0) {
884 _setSSLError(NULL, 0, __FILE__, __LINE__);
885 goto fail1;
886 }
887 sn_obj = PyString_FromStringAndSize(buf, len);
888 if (sn_obj == NULL)
889 goto fail1;
890 if (PyDict_SetItemString(retval, "serialNumber", sn_obj) < 0) {
891 Py_DECREF(sn_obj);
892 goto fail1;
893 }
894 Py_DECREF(sn_obj);
Bill Janssen98d19da2007-09-10 21:51:02 +0000895
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000896 (void) BIO_reset(biobuf);
897 notBefore = X509_get_notBefore(certificate);
898 ASN1_TIME_print(biobuf, notBefore);
899 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
900 if (len < 0) {
901 _setSSLError(NULL, 0, __FILE__, __LINE__);
902 goto fail1;
903 }
904 pnotBefore = PyString_FromStringAndSize(buf, len);
905 if (pnotBefore == NULL)
906 goto fail1;
907 if (PyDict_SetItemString(retval, "notBefore", pnotBefore) < 0) {
908 Py_DECREF(pnotBefore);
909 goto fail1;
910 }
911 Py_DECREF(pnotBefore);
912 }
913
914 (void) BIO_reset(biobuf);
915 notAfter = X509_get_notAfter(certificate);
916 ASN1_TIME_print(biobuf, notAfter);
917 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
918 if (len < 0) {
919 _setSSLError(NULL, 0, __FILE__, __LINE__);
920 goto fail1;
921 }
922 pnotAfter = PyString_FromStringAndSize(buf, len);
923 if (pnotAfter == NULL)
924 goto fail1;
925 if (PyDict_SetItemString(retval, "notAfter", pnotAfter) < 0) {
926 Py_DECREF(pnotAfter);
927 goto fail1;
928 }
929 Py_DECREF(pnotAfter);
930
931 /* Now look for subjectAltName */
932
933 peer_alt_names = _get_peer_alt_names(certificate);
934 if (peer_alt_names == NULL)
935 goto fail1;
936 else if (peer_alt_names != Py_None) {
937 if (PyDict_SetItemString(retval, "subjectAltName",
938 peer_alt_names) < 0) {
939 Py_DECREF(peer_alt_names);
940 goto fail1;
941 }
942 Py_DECREF(peer_alt_names);
943 }
944
945 BIO_free(biobuf);
946 return retval;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000947
948 fail1:
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000949 if (biobuf != NULL)
950 BIO_free(biobuf);
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000951 fail0:
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000952 Py_XDECREF(retval);
953 return NULL;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +0000954}
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000955
Bill Janssen98d19da2007-09-10 21:51:02 +0000956
957static PyObject *
958PySSL_test_decode_certificate (PyObject *mod, PyObject *args) {
959
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000960 PyObject *retval = NULL;
961 char *filename = NULL;
962 X509 *x=NULL;
963 BIO *cert;
964 int verbose = 1;
Bill Janssen98d19da2007-09-10 21:51:02 +0000965
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000966 if (!PyArg_ParseTuple(args, "s|i:test_decode_certificate", &filename, &verbose))
967 return NULL;
Bill Janssen98d19da2007-09-10 21:51:02 +0000968
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000969 if ((cert=BIO_new(BIO_s_file())) == NULL) {
970 PyErr_SetString(PySSLErrorObject, "Can't malloc memory to read file");
971 goto fail0;
972 }
Bill Janssen98d19da2007-09-10 21:51:02 +0000973
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000974 if (BIO_read_filename(cert,filename) <= 0) {
975 PyErr_SetString(PySSLErrorObject, "Can't open file");
976 goto fail0;
977 }
Bill Janssen98d19da2007-09-10 21:51:02 +0000978
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000979 x = PEM_read_bio_X509_AUX(cert,NULL, NULL, NULL);
980 if (x == NULL) {
981 PyErr_SetString(PySSLErrorObject, "Error decoding PEM-encoded file");
982 goto fail0;
983 }
Bill Janssen98d19da2007-09-10 21:51:02 +0000984
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000985 retval = _decode_certificate(x, verbose);
Mark Dickinson793c71c2010-08-03 18:34:53 +0000986 X509_free(x);
Bill Janssen98d19da2007-09-10 21:51:02 +0000987
988 fail0:
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000989
990 if (cert != NULL) BIO_free(cert);
991 return retval;
Bill Janssen98d19da2007-09-10 21:51:02 +0000992}
993
994
995static PyObject *
996PySSL_peercert(PySSLObject *self, PyObject *args)
997{
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +0000998 PyObject *retval = NULL;
999 int len;
1000 int verification;
1001 PyObject *binary_mode = Py_None;
Bill Janssen98d19da2007-09-10 21:51:02 +00001002
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001003 if (!PyArg_ParseTuple(args, "|O:peer_certificate", &binary_mode))
1004 return NULL;
Bill Janssen98d19da2007-09-10 21:51:02 +00001005
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001006 if (!self->peer_cert)
1007 Py_RETURN_NONE;
Bill Janssen98d19da2007-09-10 21:51:02 +00001008
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001009 if (PyObject_IsTrue(binary_mode)) {
1010 /* return cert in DER-encoded format */
Bill Janssen98d19da2007-09-10 21:51:02 +00001011
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001012 unsigned char *bytes_buf = NULL;
Bill Janssen98d19da2007-09-10 21:51:02 +00001013
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001014 bytes_buf = NULL;
1015 len = i2d_X509(self->peer_cert, &bytes_buf);
1016 if (len < 0) {
1017 PySSL_SetError(self, len, __FILE__, __LINE__);
1018 return NULL;
1019 }
1020 retval = PyString_FromStringAndSize((const char *) bytes_buf, len);
1021 OPENSSL_free(bytes_buf);
1022 return retval;
Bill Janssen98d19da2007-09-10 21:51:02 +00001023
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001024 } else {
Bill Janssen98d19da2007-09-10 21:51:02 +00001025
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001026 verification = SSL_CTX_get_verify_mode(self->ctx);
1027 if ((verification & SSL_VERIFY_PEER) == 0)
1028 return PyDict_New();
1029 else
1030 return _decode_certificate (self->peer_cert, 0);
1031 }
Bill Janssen98d19da2007-09-10 21:51:02 +00001032}
1033
1034PyDoc_STRVAR(PySSL_peercert_doc,
1035"peer_certificate([der=False]) -> certificate\n\
1036\n\
1037Returns the certificate for the peer. If no certificate was provided,\n\
1038returns None. If a certificate was provided, but not validated, returns\n\
1039an empty dictionary. Otherwise returns a dict containing information\n\
1040about the peer certificate.\n\
1041\n\
1042If the optional argument is True, returns a DER-encoded copy of the\n\
1043peer certificate, or None if no certificate was provided. This will\n\
1044return the certificate even if it wasn't validated.");
1045
1046static PyObject *PySSL_cipher (PySSLObject *self) {
1047
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001048 PyObject *retval, *v;
Benjamin Peterson8e734032010-10-13 22:10:31 +00001049 const SSL_CIPHER *current;
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001050 char *cipher_name;
1051 char *cipher_protocol;
Bill Janssen98d19da2007-09-10 21:51:02 +00001052
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001053 if (self->ssl == NULL)
Hirokazu Yamamotoa9b16892010-12-09 12:12:42 +00001054 Py_RETURN_NONE;
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001055 current = SSL_get_current_cipher(self->ssl);
1056 if (current == NULL)
Hirokazu Yamamotoa9b16892010-12-09 12:12:42 +00001057 Py_RETURN_NONE;
Bill Janssen98d19da2007-09-10 21:51:02 +00001058
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001059 retval = PyTuple_New(3);
1060 if (retval == NULL)
1061 return NULL;
Bill Janssen98d19da2007-09-10 21:51:02 +00001062
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001063 cipher_name = (char *) SSL_CIPHER_get_name(current);
1064 if (cipher_name == NULL) {
Hirokazu Yamamotoa9b16892010-12-09 12:12:42 +00001065 Py_INCREF(Py_None);
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001066 PyTuple_SET_ITEM(retval, 0, Py_None);
1067 } else {
1068 v = PyString_FromString(cipher_name);
1069 if (v == NULL)
1070 goto fail0;
1071 PyTuple_SET_ITEM(retval, 0, v);
1072 }
1073 cipher_protocol = SSL_CIPHER_get_version(current);
1074 if (cipher_protocol == NULL) {
Hirokazu Yamamotoa9b16892010-12-09 12:12:42 +00001075 Py_INCREF(Py_None);
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001076 PyTuple_SET_ITEM(retval, 1, Py_None);
1077 } else {
1078 v = PyString_FromString(cipher_protocol);
1079 if (v == NULL)
1080 goto fail0;
1081 PyTuple_SET_ITEM(retval, 1, v);
1082 }
1083 v = PyInt_FromLong(SSL_CIPHER_get_bits(current, NULL));
1084 if (v == NULL)
1085 goto fail0;
1086 PyTuple_SET_ITEM(retval, 2, v);
1087 return retval;
1088
Bill Janssen98d19da2007-09-10 21:51:02 +00001089 fail0:
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001090 Py_DECREF(retval);
1091 return NULL;
Bill Janssen98d19da2007-09-10 21:51:02 +00001092}
1093
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001094static void PySSL_dealloc(PySSLObject *self)
1095{
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001096 if (self->peer_cert) /* Possible not to have one? */
1097 X509_free (self->peer_cert);
1098 if (self->ssl)
1099 SSL_free(self->ssl);
1100 if (self->ctx)
1101 SSL_CTX_free(self->ctx);
1102 Py_XDECREF(self->Socket);
1103 PyObject_Del(self);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001104}
1105
Anthony Baxter93ab5fa2006-07-11 02:04:09 +00001106/* If the socket has a timeout, do a select()/poll() on the socket.
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001107 The argument writing indicates the direction.
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001108 Returns one of the possibilities in the timeout_state enum (above).
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001109 */
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001110
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001111static int
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00001112check_socket_and_wait_for_timeout(PySocketSockObject *s, int writing)
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001113{
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001114 fd_set fds;
1115 struct timeval tv;
1116 int rc;
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001117
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001118 /* Nothing to do unless we're in timeout mode (not non-blocking) */
1119 if (s->sock_timeout < 0.0)
1120 return SOCKET_IS_BLOCKING;
1121 else if (s->sock_timeout == 0.0)
1122 return SOCKET_IS_NONBLOCKING;
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001123
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001124 /* Guard against closed socket */
1125 if (s->sock_fd < 0)
1126 return SOCKET_HAS_BEEN_CLOSED;
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001127
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001128 /* Prefer poll, if available, since you can poll() any fd
1129 * which can't be done with select(). */
Anthony Baxter93ab5fa2006-07-11 02:04:09 +00001130#ifdef HAVE_POLL
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001131 {
1132 struct pollfd pollfd;
1133 int timeout;
Anthony Baxter93ab5fa2006-07-11 02:04:09 +00001134
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001135 pollfd.fd = s->sock_fd;
1136 pollfd.events = writing ? POLLOUT : POLLIN;
Anthony Baxter93ab5fa2006-07-11 02:04:09 +00001137
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001138 /* s->sock_timeout is in seconds, timeout in ms */
1139 timeout = (int)(s->sock_timeout * 1000 + 0.5);
1140 PySSL_BEGIN_ALLOW_THREADS
1141 rc = poll(&pollfd, 1, timeout);
1142 PySSL_END_ALLOW_THREADS
Anthony Baxter93ab5fa2006-07-11 02:04:09 +00001143
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001144 goto normal_return;
1145 }
Anthony Baxter93ab5fa2006-07-11 02:04:09 +00001146#endif
1147
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001148 /* Guard against socket too large for select*/
Charles-François Natalifda7b372011-08-28 16:22:33 +02001149 if (!_PyIsSelectable_fd(s->sock_fd))
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001150 return SOCKET_TOO_LARGE_FOR_SELECT;
Neal Norwitz082b2df2006-02-07 07:04:46 +00001151
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001152 /* Construct the arguments to select */
1153 tv.tv_sec = (int)s->sock_timeout;
1154 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
1155 FD_ZERO(&fds);
1156 FD_SET(s->sock_fd, &fds);
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001157
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001158 /* See if the socket is ready */
1159 PySSL_BEGIN_ALLOW_THREADS
1160 if (writing)
1161 rc = select(s->sock_fd+1, NULL, &fds, NULL, &tv);
1162 else
1163 rc = select(s->sock_fd+1, &fds, NULL, NULL, &tv);
1164 PySSL_END_ALLOW_THREADS
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001165
Bill Janssen934b16d2008-06-28 22:19:33 +00001166#ifdef HAVE_POLL
Anthony Baxter93ab5fa2006-07-11 02:04:09 +00001167normal_return:
Bill Janssen934b16d2008-06-28 22:19:33 +00001168#endif
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001169 /* Return SOCKET_TIMED_OUT on timeout, SOCKET_OPERATION_OK otherwise
1170 (when we are able to write or when there's something to read) */
1171 return rc == 0 ? SOCKET_HAS_TIMED_OUT : SOCKET_OPERATION_OK;
Guido van Rossum99d4abf2003-01-27 22:22:50 +00001172}
1173
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001174static PyObject *PySSL_SSLwrite(PySSLObject *self, PyObject *args)
1175{
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001176 Py_buffer buf;
1177 int len;
1178 int sockstate;
1179 int err;
1180 int nonblocking;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001181
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001182 if (!PyArg_ParseTuple(args, "s*:write", &buf))
1183 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001184
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001185 /* just in case the blocking state of the socket has been changed */
1186 nonblocking = (self->Socket->sock_timeout >= 0.0);
1187 BIO_set_nbio(SSL_get_rbio(self->ssl), nonblocking);
1188 BIO_set_nbio(SSL_get_wbio(self->ssl), nonblocking);
Bill Janssen934b16d2008-06-28 22:19:33 +00001189
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001190 sockstate = check_socket_and_wait_for_timeout(self->Socket, 1);
1191 if (sockstate == SOCKET_HAS_TIMED_OUT) {
1192 PyErr_SetString(PySSLErrorObject,
1193 "The write operation timed out");
1194 goto error;
1195 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
1196 PyErr_SetString(PySSLErrorObject,
1197 "Underlying socket has been closed.");
1198 goto error;
1199 } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
1200 PyErr_SetString(PySSLErrorObject,
1201 "Underlying socket too large for select().");
1202 goto error;
1203 }
1204 do {
1205 PySSL_BEGIN_ALLOW_THREADS
1206 len = SSL_write(self->ssl, buf.buf, buf.len);
1207 err = SSL_get_error(self->ssl, len);
1208 PySSL_END_ALLOW_THREADS
1209 if (PyErr_CheckSignals()) {
1210 goto error;
1211 }
1212 if (err == SSL_ERROR_WANT_READ) {
Antoine Pitrou2e136ab2010-05-12 14:02:34 +00001213 sockstate = check_socket_and_wait_for_timeout(self->Socket, 0);
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001214 } else if (err == SSL_ERROR_WANT_WRITE) {
Antoine Pitrou2e136ab2010-05-12 14:02:34 +00001215 sockstate = check_socket_and_wait_for_timeout(self->Socket, 1);
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001216 } else {
1217 sockstate = SOCKET_OPERATION_OK;
1218 }
1219 if (sockstate == SOCKET_HAS_TIMED_OUT) {
1220 PyErr_SetString(PySSLErrorObject,
1221 "The write operation timed out");
1222 goto error;
1223 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
1224 PyErr_SetString(PySSLErrorObject,
1225 "Underlying socket has been closed.");
1226 goto error;
1227 } else if (sockstate == SOCKET_IS_NONBLOCKING) {
1228 break;
1229 }
1230 } while (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE);
Antoine Pitrou5ba84912009-10-19 17:59:07 +00001231
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001232 PyBuffer_Release(&buf);
1233 if (len > 0)
1234 return PyInt_FromLong(len);
1235 else
1236 return PySSL_SetError(self, len, __FILE__, __LINE__);
Antoine Pitrou5ba84912009-10-19 17:59:07 +00001237
1238error:
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001239 PyBuffer_Release(&buf);
1240 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001241}
1242
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001243PyDoc_STRVAR(PySSL_SSLwrite_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001244"write(s) -> len\n\
1245\n\
1246Writes the string s into the SSL object. Returns the number\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001247of bytes written.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001248
Bill Janssen934b16d2008-06-28 22:19:33 +00001249static PyObject *PySSL_SSLpending(PySSLObject *self)
1250{
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001251 int count = 0;
Bill Janssen934b16d2008-06-28 22:19:33 +00001252
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001253 PySSL_BEGIN_ALLOW_THREADS
1254 count = SSL_pending(self->ssl);
1255 PySSL_END_ALLOW_THREADS
1256 if (count < 0)
1257 return PySSL_SetError(self, count, __FILE__, __LINE__);
1258 else
1259 return PyInt_FromLong(count);
Bill Janssen934b16d2008-06-28 22:19:33 +00001260}
1261
1262PyDoc_STRVAR(PySSL_SSLpending_doc,
1263"pending() -> count\n\
1264\n\
1265Returns the number of already decrypted bytes available for read,\n\
1266pending on the connection.\n");
1267
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001268static PyObject *PySSL_SSLread(PySSLObject *self, PyObject *args)
1269{
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001270 PyObject *buf;
1271 int count = 0;
1272 int len = 1024;
1273 int sockstate;
1274 int err;
1275 int nonblocking;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001276
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001277 if (!PyArg_ParseTuple(args, "|i:read", &len))
1278 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001279
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001280 if (!(buf = PyString_FromStringAndSize((char *) 0, len)))
1281 return NULL;
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +00001282
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001283 /* just in case the blocking state of the socket has been changed */
1284 nonblocking = (self->Socket->sock_timeout >= 0.0);
1285 BIO_set_nbio(SSL_get_rbio(self->ssl), nonblocking);
1286 BIO_set_nbio(SSL_get_wbio(self->ssl), nonblocking);
Bill Janssen934b16d2008-06-28 22:19:33 +00001287
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001288 /* first check if there are bytes ready to be read */
1289 PySSL_BEGIN_ALLOW_THREADS
1290 count = SSL_pending(self->ssl);
1291 PySSL_END_ALLOW_THREADS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001292
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001293 if (!count) {
1294 sockstate = check_socket_and_wait_for_timeout(self->Socket, 0);
1295 if (sockstate == SOCKET_HAS_TIMED_OUT) {
1296 PyErr_SetString(PySSLErrorObject,
1297 "The read operation timed out");
1298 Py_DECREF(buf);
1299 return NULL;
1300 } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
1301 PyErr_SetString(PySSLErrorObject,
Antoine Pitrou2e136ab2010-05-12 14:02:34 +00001302 "Underlying socket too large for select().");
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001303 Py_DECREF(buf);
1304 return NULL;
1305 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
1306 if (SSL_get_shutdown(self->ssl) !=
1307 SSL_RECEIVED_SHUTDOWN)
1308 {
1309 Py_DECREF(buf);
1310 PyErr_SetString(PySSLErrorObject,
Antoine Pitrou2e136ab2010-05-12 14:02:34 +00001311 "Socket closed without SSL shutdown handshake");
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001312 return NULL;
1313 } else {
1314 /* should contain a zero-length string */
1315 _PyString_Resize(&buf, 0);
1316 return buf;
1317 }
1318 }
1319 }
1320 do {
1321 PySSL_BEGIN_ALLOW_THREADS
1322 count = SSL_read(self->ssl, PyString_AsString(buf), len);
1323 err = SSL_get_error(self->ssl, count);
1324 PySSL_END_ALLOW_THREADS
1325 if(PyErr_CheckSignals()) {
1326 Py_DECREF(buf);
1327 return NULL;
1328 }
1329 if (err == SSL_ERROR_WANT_READ) {
Antoine Pitrou2e136ab2010-05-12 14:02:34 +00001330 sockstate = check_socket_and_wait_for_timeout(self->Socket, 0);
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001331 } else if (err == SSL_ERROR_WANT_WRITE) {
Antoine Pitrou2e136ab2010-05-12 14:02:34 +00001332 sockstate = check_socket_and_wait_for_timeout(self->Socket, 1);
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001333 } else if ((err == SSL_ERROR_ZERO_RETURN) &&
1334 (SSL_get_shutdown(self->ssl) ==
1335 SSL_RECEIVED_SHUTDOWN))
1336 {
1337 _PyString_Resize(&buf, 0);
1338 return buf;
1339 } else {
1340 sockstate = SOCKET_OPERATION_OK;
1341 }
1342 if (sockstate == SOCKET_HAS_TIMED_OUT) {
1343 PyErr_SetString(PySSLErrorObject,
1344 "The read operation timed out");
1345 Py_DECREF(buf);
1346 return NULL;
1347 } else if (sockstate == SOCKET_IS_NONBLOCKING) {
1348 break;
1349 }
1350 } while (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE);
1351 if (count <= 0) {
1352 Py_DECREF(buf);
1353 return PySSL_SetError(self, count, __FILE__, __LINE__);
1354 }
1355 if (count != len)
1356 _PyString_Resize(&buf, count);
1357 return buf;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001358}
1359
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001360PyDoc_STRVAR(PySSL_SSLread_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001361"read([len]) -> string\n\
1362\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001363Read up to len bytes from the SSL socket.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001364
Bill Janssen934b16d2008-06-28 22:19:33 +00001365static PyObject *PySSL_SSLshutdown(PySSLObject *self)
1366{
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001367 int err, ssl_err, sockstate, nonblocking;
1368 int zeros = 0;
Bill Janssen934b16d2008-06-28 22:19:33 +00001369
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001370 /* Guard against closed socket */
1371 if (self->Socket->sock_fd < 0) {
1372 PyErr_SetString(PySSLErrorObject,
1373 "Underlying socket has been closed.");
1374 return NULL;
1375 }
Bill Janssen934b16d2008-06-28 22:19:33 +00001376
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001377 /* Just in case the blocking state of the socket has been changed */
1378 nonblocking = (self->Socket->sock_timeout >= 0.0);
1379 BIO_set_nbio(SSL_get_rbio(self->ssl), nonblocking);
1380 BIO_set_nbio(SSL_get_wbio(self->ssl), nonblocking);
Antoine Pitroua5c4b552010-04-22 23:33:02 +00001381
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001382 while (1) {
1383 PySSL_BEGIN_ALLOW_THREADS
1384 /* Disable read-ahead so that unwrap can work correctly.
1385 * Otherwise OpenSSL might read in too much data,
1386 * eating clear text data that happens to be
1387 * transmitted after the SSL shutdown.
1388 * Should be safe to call repeatedly everytime this
1389 * function is used and the shutdown_seen_zero != 0
1390 * condition is met.
1391 */
1392 if (self->shutdown_seen_zero)
1393 SSL_set_read_ahead(self->ssl, 0);
1394 err = SSL_shutdown(self->ssl);
1395 PySSL_END_ALLOW_THREADS
1396 /* If err == 1, a secure shutdown with SSL_shutdown() is complete */
1397 if (err > 0)
1398 break;
1399 if (err == 0) {
1400 /* Don't loop endlessly; instead preserve legacy
1401 behaviour of trying SSL_shutdown() only twice.
1402 This looks necessary for OpenSSL < 0.9.8m */
1403 if (++zeros > 1)
1404 break;
1405 /* Shutdown was sent, now try receiving */
1406 self->shutdown_seen_zero = 1;
1407 continue;
1408 }
Antoine Pitroua5c4b552010-04-22 23:33:02 +00001409
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001410 /* Possibly retry shutdown until timeout or failure */
1411 ssl_err = SSL_get_error(self->ssl, err);
1412 if (ssl_err == SSL_ERROR_WANT_READ)
1413 sockstate = check_socket_and_wait_for_timeout(self->Socket, 0);
1414 else if (ssl_err == SSL_ERROR_WANT_WRITE)
1415 sockstate = check_socket_and_wait_for_timeout(self->Socket, 1);
1416 else
1417 break;
1418 if (sockstate == SOCKET_HAS_TIMED_OUT) {
1419 if (ssl_err == SSL_ERROR_WANT_READ)
1420 PyErr_SetString(PySSLErrorObject,
1421 "The read operation timed out");
1422 else
1423 PyErr_SetString(PySSLErrorObject,
1424 "The write operation timed out");
1425 return NULL;
1426 }
1427 else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
1428 PyErr_SetString(PySSLErrorObject,
1429 "Underlying socket too large for select().");
1430 return NULL;
1431 }
1432 else if (sockstate != SOCKET_OPERATION_OK)
1433 /* Retain the SSL error code */
1434 break;
1435 }
Bill Janssen934b16d2008-06-28 22:19:33 +00001436
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001437 if (err < 0)
1438 return PySSL_SetError(self, err, __FILE__, __LINE__);
1439 else {
1440 Py_INCREF(self->Socket);
1441 return (PyObject *) (self->Socket);
1442 }
Bill Janssen934b16d2008-06-28 22:19:33 +00001443}
1444
1445PyDoc_STRVAR(PySSL_SSLshutdown_doc,
1446"shutdown(s) -> socket\n\
1447\n\
1448Does the SSL shutdown handshake with the remote end, and returns\n\
1449the underlying socket object.");
1450
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001451static PyMethodDef PySSLMethods[] = {
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001452 {"do_handshake", (PyCFunction)PySSL_SSLdo_handshake, METH_NOARGS},
1453 {"write", (PyCFunction)PySSL_SSLwrite, METH_VARARGS,
1454 PySSL_SSLwrite_doc},
1455 {"read", (PyCFunction)PySSL_SSLread, METH_VARARGS,
1456 PySSL_SSLread_doc},
1457 {"pending", (PyCFunction)PySSL_SSLpending, METH_NOARGS,
1458 PySSL_SSLpending_doc},
1459 {"server", (PyCFunction)PySSL_server, METH_NOARGS},
1460 {"issuer", (PyCFunction)PySSL_issuer, METH_NOARGS},
1461 {"peer_certificate", (PyCFunction)PySSL_peercert, METH_VARARGS,
1462 PySSL_peercert_doc},
1463 {"cipher", (PyCFunction)PySSL_cipher, METH_NOARGS},
1464 {"shutdown", (PyCFunction)PySSL_SSLshutdown, METH_NOARGS,
1465 PySSL_SSLshutdown_doc},
1466 {NULL, NULL}
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001467};
1468
1469static PyObject *PySSL_getattr(PySSLObject *self, char *name)
1470{
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001471 return Py_FindMethod(PySSLMethods, (PyObject *)self, name);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001472}
1473
Jeremy Hylton938ace62002-07-17 16:30:39 +00001474static PyTypeObject PySSL_Type = {
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001475 PyVarObject_HEAD_INIT(NULL, 0)
1476 "ssl.SSLContext", /*tp_name*/
1477 sizeof(PySSLObject), /*tp_basicsize*/
1478 0, /*tp_itemsize*/
1479 /* methods */
1480 (destructor)PySSL_dealloc, /*tp_dealloc*/
1481 0, /*tp_print*/
1482 (getattrfunc)PySSL_getattr, /*tp_getattr*/
1483 0, /*tp_setattr*/
1484 0, /*tp_compare*/
1485 0, /*tp_repr*/
1486 0, /*tp_as_number*/
1487 0, /*tp_as_sequence*/
1488 0, /*tp_as_mapping*/
1489 0, /*tp_hash*/
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001490};
1491
1492#ifdef HAVE_OPENSSL_RAND
1493
1494/* helper routines for seeding the SSL PRNG */
1495static PyObject *
1496PySSL_RAND_add(PyObject *self, PyObject *args)
1497{
1498 char *buf;
1499 int len;
1500 double entropy;
1501
1502 if (!PyArg_ParseTuple(args, "s#d:RAND_add", &buf, &len, &entropy))
Antoine Pitrou2e136ab2010-05-12 14:02:34 +00001503 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001504 RAND_add(buf, len, entropy);
1505 Py_INCREF(Py_None);
1506 return Py_None;
1507}
1508
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001509PyDoc_STRVAR(PySSL_RAND_add_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001510"RAND_add(string, entropy)\n\
1511\n\
1512Mix string into the OpenSSL PRNG state. entropy (a float) is a lower\n\
Bill Janssen98d19da2007-09-10 21:51:02 +00001513bound on the entropy contained in string. See RFC 1750.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001514
1515static PyObject *
1516PySSL_RAND_status(PyObject *self)
1517{
1518 return PyInt_FromLong(RAND_status());
1519}
1520
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001521PyDoc_STRVAR(PySSL_RAND_status_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001522"RAND_status() -> 0 or 1\n\
1523\n\
1524Returns 1 if the OpenSSL PRNG has been seeded with enough data and 0 if not.\n\
1525It is necessary to seed the PRNG with RAND_add() on some platforms before\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001526using the ssl() function.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001527
1528static PyObject *
1529PySSL_RAND_egd(PyObject *self, PyObject *arg)
1530{
1531 int bytes;
1532
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001533 if (!PyString_Check(arg))
Antoine Pitrou2e136ab2010-05-12 14:02:34 +00001534 return PyErr_Format(PyExc_TypeError,
1535 "RAND_egd() expected string, found %s",
1536 Py_TYPE(arg)->tp_name);
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001537 bytes = RAND_egd(PyString_AS_STRING(arg));
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001538 if (bytes == -1) {
Antoine Pitrou2e136ab2010-05-12 14:02:34 +00001539 PyErr_SetString(PySSLErrorObject,
1540 "EGD connection failed or EGD did not return "
1541 "enough data to seed the PRNG");
1542 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001543 }
1544 return PyInt_FromLong(bytes);
1545}
1546
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001547PyDoc_STRVAR(PySSL_RAND_egd_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001548"RAND_egd(path) -> bytes\n\
1549\n\
Bill Janssen98d19da2007-09-10 21:51:02 +00001550Queries the entropy gather daemon (EGD) on the socket named by 'path'.\n\
1551Returns number of bytes read. Raises SSLError if connection to EGD\n\
1552fails or if it does provide enough data to seed PRNG.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001553
1554#endif
1555
1556/* List of functions exported by this module. */
1557
1558static PyMethodDef PySSL_methods[] = {
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001559 {"sslwrap", PySSL_sslwrap,
1560 METH_VARARGS, ssl_doc},
1561 {"_test_decode_cert", PySSL_test_decode_certificate,
1562 METH_VARARGS},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001563#ifdef HAVE_OPENSSL_RAND
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001564 {"RAND_add", PySSL_RAND_add, METH_VARARGS,
1565 PySSL_RAND_add_doc},
1566 {"RAND_egd", PySSL_RAND_egd, METH_O,
1567 PySSL_RAND_egd_doc},
1568 {"RAND_status", (PyCFunction)PySSL_RAND_status, METH_NOARGS,
1569 PySSL_RAND_status_doc},
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001570#endif
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001571 {NULL, NULL} /* Sentinel */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001572};
1573
1574
Bill Janssen98d19da2007-09-10 21:51:02 +00001575#ifdef WITH_THREAD
1576
1577/* an implementation of OpenSSL threading operations in terms
1578 of the Python C thread library */
1579
1580static PyThread_type_lock *_ssl_locks = NULL;
1581
1582static unsigned long _ssl_thread_id_function (void) {
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001583 return PyThread_get_thread_ident();
Bill Janssen98d19da2007-09-10 21:51:02 +00001584}
1585
1586static void _ssl_thread_locking_function (int mode, int n, const char *file, int line) {
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001587 /* this function is needed to perform locking on shared data
1588 structures. (Note that OpenSSL uses a number of global data
1589 structures that will be implicitly shared whenever multiple threads
1590 use OpenSSL.) Multi-threaded applications will crash at random if
1591 it is not set.
Bill Janssen98d19da2007-09-10 21:51:02 +00001592
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001593 locking_function() must be able to handle up to CRYPTO_num_locks()
1594 different mutex locks. It sets the n-th lock if mode & CRYPTO_LOCK, and
1595 releases it otherwise.
Bill Janssen98d19da2007-09-10 21:51:02 +00001596
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001597 file and line are the file number of the function setting the
1598 lock. They can be useful for debugging.
1599 */
Bill Janssen98d19da2007-09-10 21:51:02 +00001600
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001601 if ((_ssl_locks == NULL) ||
1602 (n < 0) || ((unsigned)n >= _ssl_locks_count))
1603 return;
Bill Janssen98d19da2007-09-10 21:51:02 +00001604
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001605 if (mode & CRYPTO_LOCK) {
1606 PyThread_acquire_lock(_ssl_locks[n], 1);
1607 } else {
1608 PyThread_release_lock(_ssl_locks[n]);
1609 }
Bill Janssen98d19da2007-09-10 21:51:02 +00001610}
1611
1612static int _setup_ssl_threads(void) {
1613
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001614 unsigned int i;
Bill Janssen98d19da2007-09-10 21:51:02 +00001615
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001616 if (_ssl_locks == NULL) {
1617 _ssl_locks_count = CRYPTO_num_locks();
1618 _ssl_locks = (PyThread_type_lock *)
1619 malloc(sizeof(PyThread_type_lock) * _ssl_locks_count);
1620 if (_ssl_locks == NULL)
1621 return 0;
1622 memset(_ssl_locks, 0, sizeof(PyThread_type_lock) * _ssl_locks_count);
1623 for (i = 0; i < _ssl_locks_count; i++) {
1624 _ssl_locks[i] = PyThread_allocate_lock();
1625 if (_ssl_locks[i] == NULL) {
1626 unsigned int j;
1627 for (j = 0; j < i; j++) {
1628 PyThread_free_lock(_ssl_locks[j]);
1629 }
1630 free(_ssl_locks);
1631 return 0;
1632 }
1633 }
1634 CRYPTO_set_locking_callback(_ssl_thread_locking_function);
1635 CRYPTO_set_id_callback(_ssl_thread_id_function);
1636 }
1637 return 1;
Bill Janssen98d19da2007-09-10 21:51:02 +00001638}
1639
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001640#endif /* def HAVE_THREAD */
Bill Janssen98d19da2007-09-10 21:51:02 +00001641
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001642PyDoc_STRVAR(module_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001643"Implementation module for SSL socket operations. See the socket module\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001644for documentation.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001645
Mark Hammondfe51c6d2002-08-02 02:27:13 +00001646PyMODINIT_FUNC
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001647init_ssl(void)
1648{
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001649 PyObject *m, *d, *r;
1650 unsigned long libver;
1651 unsigned int major, minor, fix, patch, status;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001652
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001653 Py_TYPE(&PySSL_Type) = &PyType_Type;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001654
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001655 m = Py_InitModule3("_ssl", PySSL_methods, module_doc);
1656 if (m == NULL)
1657 return;
1658 d = PyModule_GetDict(m);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001659
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001660 /* Load _socket module and its C API */
1661 if (PySocketModule_ImportModuleAndAPI())
1662 return;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001663
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001664 /* Init OpenSSL */
1665 SSL_load_error_strings();
1666 SSL_library_init();
Bill Janssen98d19da2007-09-10 21:51:02 +00001667#ifdef WITH_THREAD
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001668 /* note that this will start threading if not already started */
1669 if (!_setup_ssl_threads()) {
1670 return;
1671 }
Bill Janssen98d19da2007-09-10 21:51:02 +00001672#endif
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001673 OpenSSL_add_all_algorithms();
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001674
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001675 /* Add symbols to module dict */
1676 PySSLErrorObject = PyErr_NewException("ssl.SSLError",
1677 PySocketModule.error,
1678 NULL);
1679 if (PySSLErrorObject == NULL)
1680 return;
1681 if (PyDict_SetItemString(d, "SSLError", PySSLErrorObject) != 0)
1682 return;
1683 if (PyDict_SetItemString(d, "SSLType",
1684 (PyObject *)&PySSL_Type) != 0)
1685 return;
1686 PyModule_AddIntConstant(m, "SSL_ERROR_ZERO_RETURN",
1687 PY_SSL_ERROR_ZERO_RETURN);
1688 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_READ",
1689 PY_SSL_ERROR_WANT_READ);
1690 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_WRITE",
1691 PY_SSL_ERROR_WANT_WRITE);
1692 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_X509_LOOKUP",
1693 PY_SSL_ERROR_WANT_X509_LOOKUP);
1694 PyModule_AddIntConstant(m, "SSL_ERROR_SYSCALL",
1695 PY_SSL_ERROR_SYSCALL);
1696 PyModule_AddIntConstant(m, "SSL_ERROR_SSL",
1697 PY_SSL_ERROR_SSL);
1698 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_CONNECT",
1699 PY_SSL_ERROR_WANT_CONNECT);
1700 /* non ssl.h errorcodes */
1701 PyModule_AddIntConstant(m, "SSL_ERROR_EOF",
1702 PY_SSL_ERROR_EOF);
1703 PyModule_AddIntConstant(m, "SSL_ERROR_INVALID_ERROR_CODE",
1704 PY_SSL_ERROR_INVALID_ERROR_CODE);
1705 /* cert requirements */
1706 PyModule_AddIntConstant(m, "CERT_NONE",
1707 PY_SSL_CERT_NONE);
1708 PyModule_AddIntConstant(m, "CERT_OPTIONAL",
1709 PY_SSL_CERT_OPTIONAL);
1710 PyModule_AddIntConstant(m, "CERT_REQUIRED",
1711 PY_SSL_CERT_REQUIRED);
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00001712
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001713 /* protocol versions */
Victor Stinnerb1241f92011-05-10 01:52:03 +02001714#ifndef OPENSSL_NO_SSL2
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001715 PyModule_AddIntConstant(m, "PROTOCOL_SSLv2",
1716 PY_SSL_VERSION_SSL2);
Victor Stinnerb1241f92011-05-10 01:52:03 +02001717#endif
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001718 PyModule_AddIntConstant(m, "PROTOCOL_SSLv3",
1719 PY_SSL_VERSION_SSL3);
1720 PyModule_AddIntConstant(m, "PROTOCOL_SSLv23",
1721 PY_SSL_VERSION_SSL23);
1722 PyModule_AddIntConstant(m, "PROTOCOL_TLSv1",
1723 PY_SSL_VERSION_TLS1);
Antoine Pitrouf9de5342010-04-05 21:35:07 +00001724
Antoine Pitroua4c2a5c2010-05-05 15:53:45 +00001725 /* OpenSSL version */
1726 /* SSLeay() gives us the version of the library linked against,
1727 which could be different from the headers version.
1728 */
1729 libver = SSLeay();
1730 r = PyLong_FromUnsignedLong(libver);
1731 if (r == NULL)
1732 return;
1733 if (PyModule_AddObject(m, "OPENSSL_VERSION_NUMBER", r))
1734 return;
1735 status = libver & 0xF;
1736 libver >>= 4;
1737 patch = libver & 0xFF;
1738 libver >>= 8;
1739 fix = libver & 0xFF;
1740 libver >>= 8;
1741 minor = libver & 0xFF;
1742 libver >>= 8;
1743 major = libver & 0xFF;
1744 r = Py_BuildValue("IIIII", major, minor, fix, patch, status);
1745 if (r == NULL || PyModule_AddObject(m, "OPENSSL_VERSION_INFO", r))
1746 return;
1747 r = PyString_FromString(SSLeay_version(SSLEAY_VERSION));
1748 if (r == NULL || PyModule_AddObject(m, "OPENSSL_VERSION", r))
1749 return;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001750}