blob: 93498f475609d069205c56b1ee3b341a97dc5d25 [file] [log] [blame]
Thomas Woutersed03b412007-08-28 21:37:11 +00001/* SSL socket module
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002
3 SSL support based on patches by Brian E Gallew and Laszlo Kovacs.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00004 Re-worked a bit by Bill Janssen to add server-side support and
Bill Janssen6e027db2007-11-15 22:23:56 +00005 certificate decoding. Chris Stawarz contributed some non-blocking
6 patches.
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00007
Thomas Wouters1b7f8912007-09-19 03:06:30 +00008 This module is imported by ssl.py. It should *not* be used
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00009 directly.
10
Thomas Wouters1b7f8912007-09-19 03:06:30 +000011 XXX should partial writes be enabled, SSL_MODE_ENABLE_PARTIAL_WRITE?
Antoine Pitrou2c4f98b2010-04-23 00:16:21 +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
Victor Stinner2e57b4e2014-07-01 16:37:17 +020017#define PY_SSIZE_T_CLEAN
18
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000019#include "Python.h"
Thomas Woutersed03b412007-08-28 21:37:11 +000020
Thomas Wouters1b7f8912007-09-19 03:06:30 +000021#include "pythread.h"
Christian Heimesf77b4b22013-08-21 13:26:05 +020022
Steve Dower68d663c2017-07-17 11:15:48 +020023/* Redefined below for Windows debug builds after important #includes */
24#define _PySSL_FIX_ERRNO
Christian Heimesf77b4b22013-08-21 13:26:05 +020025
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +020026#define PySSL_BEGIN_ALLOW_THREADS_S(save) \
27 do { if (_ssl_locks_count>0) { (save) = PyEval_SaveThread(); } } while (0)
28#define PySSL_END_ALLOW_THREADS_S(save) \
Steve Dower68d663c2017-07-17 11:15:48 +020029 do { if (_ssl_locks_count>0) { PyEval_RestoreThread(save); } _PySSL_FIX_ERRNO; } while (0)
Thomas Wouters1b7f8912007-09-19 03:06:30 +000030#define PySSL_BEGIN_ALLOW_THREADS { \
Antoine Pitroucbb82eb2010-05-05 15:57:33 +000031 PyThreadState *_save = NULL; \
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +020032 PySSL_BEGIN_ALLOW_THREADS_S(_save);
33#define PySSL_BLOCK_THREADS PySSL_END_ALLOW_THREADS_S(_save);
34#define PySSL_UNBLOCK_THREADS PySSL_BEGIN_ALLOW_THREADS_S(_save);
35#define PySSL_END_ALLOW_THREADS PySSL_END_ALLOW_THREADS_S(_save); }
Thomas Wouters1b7f8912007-09-19 03:06:30 +000036
Antoine Pitrou2463e5f2013-03-28 22:24:43 +010037/* Include symbols from _socket module */
38#include "socketmodule.h"
39
40static PySocketModule_APIObject PySocketModule;
41
42#if defined(HAVE_POLL_H)
43#include <poll.h>
44#elif defined(HAVE_SYS_POLL_H)
45#include <sys/poll.h>
46#endif
47
Christian Heimes598894f2016-09-05 23:19:05 +020048/* Don't warn about deprecated functions */
49#ifdef __GNUC__
50#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
51#endif
52#ifdef __clang__
53#pragma clang diagnostic ignored "-Wdeprecated-declarations"
54#endif
55
Antoine Pitrou2463e5f2013-03-28 22:24:43 +010056/* Include OpenSSL header files */
57#include "openssl/rsa.h"
58#include "openssl/crypto.h"
59#include "openssl/x509.h"
60#include "openssl/x509v3.h"
61#include "openssl/pem.h"
62#include "openssl/ssl.h"
63#include "openssl/err.h"
64#include "openssl/rand.h"
Antoine Pitroub1fdf472014-10-05 20:41:53 +020065#include "openssl/bio.h"
Alexandru Ardeleanb3a271f2018-09-17 14:53:31 +030066#include "openssl/dh.h"
Antoine Pitrou2463e5f2013-03-28 22:24:43 +010067
Christian Heimesff5be6e2018-01-20 13:19:21 +010068#ifndef HAVE_X509_VERIFY_PARAM_SET1_HOST
Christian Heimes61d478c2018-01-27 15:51:38 +010069# ifdef LIBRESSL_VERSION_NUMBER
70# error "LibreSSL is missing X509_VERIFY_PARAM_set1_host(), see https://github.com/libressl-portable/portable/issues/381"
71# elif OPENSSL_VERSION_NUMBER > 0x1000200fL
Christian Heimesff5be6e2018-01-20 13:19:21 +010072# define HAVE_X509_VERIFY_PARAM_SET1_HOST
Christian Heimes61d478c2018-01-27 15:51:38 +010073# else
74# error "libssl is too old and does not support X509_VERIFY_PARAM_set1_host()"
Christian Heimesff5be6e2018-01-20 13:19:21 +010075# endif
76#endif
77
Antoine Pitrou2463e5f2013-03-28 22:24:43 +010078/* SSL error object */
79static PyObject *PySSLErrorObject;
Christian Heimesb3ad0e52017-09-08 12:00:19 -070080static PyObject *PySSLCertVerificationErrorObject;
Antoine Pitrou2463e5f2013-03-28 22:24:43 +010081static PyObject *PySSLZeroReturnErrorObject;
82static PyObject *PySSLWantReadErrorObject;
83static PyObject *PySSLWantWriteErrorObject;
84static PyObject *PySSLSyscallErrorObject;
85static PyObject *PySSLEOFErrorObject;
86
87/* Error mappings */
88static PyObject *err_codes_to_names;
89static PyObject *err_names_to_codes;
90static PyObject *lib_codes_to_names;
91
92struct py_ssl_error_code {
93 const char *mnemonic;
94 int library, reason;
95};
96struct py_ssl_library_code {
97 const char *library;
98 int code;
99};
100
Steve Dower68d663c2017-07-17 11:15:48 +0200101#if defined(MS_WINDOWS) && defined(Py_DEBUG)
102/* Debug builds on Windows rely on getting errno directly from OpenSSL.
103 * However, because it uses a different CRT, we need to transfer the
104 * value of errno from OpenSSL into our debug CRT.
105 *
106 * Don't be fooled - this is horribly ugly code. The only reasonable
107 * alternative is to do both debug and release builds of OpenSSL, which
108 * requires much uglier code to transform their automatically generated
109 * makefile. This is the lesser of all the evils.
110 */
111
112static void _PySSLFixErrno(void) {
113 HMODULE ucrtbase = GetModuleHandleW(L"ucrtbase.dll");
114 if (!ucrtbase) {
115 /* If ucrtbase.dll is not loaded but the SSL DLLs are, we likely
116 * have a catastrophic failure, but this function is not the
117 * place to raise it. */
118 return;
119 }
120
121 typedef int *(__stdcall *errno_func)(void);
122 errno_func ssl_errno = (errno_func)GetProcAddress(ucrtbase, "_errno");
123 if (ssl_errno) {
124 errno = *ssl_errno();
125 *ssl_errno() = 0;
126 } else {
127 errno = ENOTRECOVERABLE;
128 }
129}
130
131#undef _PySSL_FIX_ERRNO
132#define _PySSL_FIX_ERRNO _PySSLFixErrno()
133#endif
134
Antoine Pitrou2463e5f2013-03-28 22:24:43 +0100135/* Include generated data (error codes) */
136#include "_ssl_data.h"
137
Christian Heimes598894f2016-09-05 23:19:05 +0200138#if (OPENSSL_VERSION_NUMBER >= 0x10100000L) && !defined(LIBRESSL_VERSION_NUMBER)
139# define OPENSSL_VERSION_1_1 1
Christian Heimes4ca07392018-03-24 15:41:37 +0100140# define PY_OPENSSL_1_1_API 1
141#endif
142
143/* LibreSSL 2.7.0 provides necessary OpenSSL 1.1.0 APIs */
144#if defined(LIBRESSL_VERSION_NUMBER) && LIBRESSL_VERSION_NUMBER >= 0x2070000fL
145# define PY_OPENSSL_1_1_API 1
Christian Heimes598894f2016-09-05 23:19:05 +0200146#endif
147
Antoine Pitrou2463e5f2013-03-28 22:24:43 +0100148/* Openssl comes with TLSv1.1 and TLSv1.2 between 1.0.0h and 1.0.1
149 http://www.openssl.org/news/changelog.html
150 */
151#if OPENSSL_VERSION_NUMBER >= 0x10001000L
152# define HAVE_TLSv1_2 1
153#else
154# define HAVE_TLSv1_2 0
155#endif
156
Christian Heimes470fba12013-11-28 15:12:15 +0100157/* SNI support (client- and server-side) appeared in OpenSSL 1.0.0 and 0.9.8f
Antoine Pitrou912fbff2013-03-30 16:29:32 +0100158 * This includes the SSL_set_SSL_CTX() function.
159 */
160#ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME
161# define HAVE_SNI 1
162#else
163# define HAVE_SNI 0
164#endif
165
Benjamin Petersond3308222015-09-27 00:09:02 -0700166#ifdef TLSEXT_TYPE_application_layer_protocol_negotiation
Christian Heimes29eab552018-02-25 12:31:33 +0100167# define HAVE_ALPN 1
168#else
169# define HAVE_ALPN 0
Benjamin Petersoncca27322015-01-23 16:35:37 -0500170#endif
171
Christian Heimes6cdb7952018-02-24 22:12:40 +0100172/* We cannot rely on OPENSSL_NO_NEXTPROTONEG because LibreSSL 2.6.1 dropped
173 * NPN support but did not set OPENSSL_NO_NEXTPROTONEG for compatibility
174 * reasons. The check for TLSEXT_TYPE_next_proto_neg works with
175 * OpenSSL 1.0.1+ and LibreSSL.
Christian Heimes29eab552018-02-25 12:31:33 +0100176 * OpenSSL 1.1.1-pre1 dropped NPN but still has TLSEXT_TYPE_next_proto_neg.
Christian Heimes6cdb7952018-02-24 22:12:40 +0100177 */
178#ifdef OPENSSL_NO_NEXTPROTONEG
Christian Heimes29eab552018-02-25 12:31:33 +0100179# define HAVE_NPN 0
180#elif (OPENSSL_VERSION_NUMBER >= 0x10101000L) && !defined(LIBRESSL_VERSION_NUMBER)
181# define HAVE_NPN 0
Christian Heimes6cdb7952018-02-24 22:12:40 +0100182#elif defined(TLSEXT_TYPE_next_proto_neg)
Christian Heimes29eab552018-02-25 12:31:33 +0100183# define HAVE_NPN 1
Christian Heimes6cdb7952018-02-24 22:12:40 +0100184#else
Christian Heimes29eab552018-02-25 12:31:33 +0100185# define HAVE_NPN 0
186#endif
Christian Heimes6cdb7952018-02-24 22:12:40 +0100187
Victor Stinner524714e2016-07-22 17:43:59 +0200188#ifndef INVALID_SOCKET /* MS defines this */
189#define INVALID_SOCKET (-1)
190#endif
191
Christian Heimes4ca07392018-03-24 15:41:37 +0100192/* OpenSSL 1.0.2 and LibreSSL needs extra code for locking */
193#ifndef OPENSSL_VERSION_1_1
194#define HAVE_OPENSSL_CRYPTO_LOCK
195#endif
196
197#if defined(OPENSSL_VERSION_1_1) && !defined(OPENSSL_NO_SSL2)
Christian Heimes598894f2016-09-05 23:19:05 +0200198#define OPENSSL_NO_SSL2
199#endif
Christian Heimes4ca07392018-03-24 15:41:37 +0100200
201#ifndef PY_OPENSSL_1_1_API
202/* OpenSSL 1.1 API shims for OpenSSL < 1.1.0 and LibreSSL < 2.7.0 */
Christian Heimes598894f2016-09-05 23:19:05 +0200203
204#define TLS_method SSLv23_method
Christian Heimes5fe668c2016-09-12 00:01:11 +0200205#define TLS_client_method SSLv23_client_method
206#define TLS_server_method SSLv23_server_method
Christian Heimes598894f2016-09-05 23:19:05 +0200207
208static int X509_NAME_ENTRY_set(const X509_NAME_ENTRY *ne)
209{
210 return ne->set;
211}
212
213#ifndef OPENSSL_NO_COMP
Christian Heimesa5d07652016-09-24 10:48:05 +0200214/* LCOV_EXCL_START */
Christian Heimes598894f2016-09-05 23:19:05 +0200215static int COMP_get_type(const COMP_METHOD *meth)
216{
217 return meth->type;
218}
Christian Heimes1a63b9f2016-09-24 12:07:21 +0200219/* LCOV_EXCL_STOP */
Christian Heimes598894f2016-09-05 23:19:05 +0200220#endif
221
222static pem_password_cb *SSL_CTX_get_default_passwd_cb(SSL_CTX *ctx)
223{
224 return ctx->default_passwd_callback;
225}
226
227static void *SSL_CTX_get_default_passwd_cb_userdata(SSL_CTX *ctx)
228{
229 return ctx->default_passwd_callback_userdata;
230}
231
232static int X509_OBJECT_get_type(X509_OBJECT *x)
233{
234 return x->type;
235}
236
237static X509 *X509_OBJECT_get0_X509(X509_OBJECT *x)
238{
239 return x->data.x509;
240}
241
242static int BIO_up_ref(BIO *b)
243{
244 CRYPTO_add(&b->references, 1, CRYPTO_LOCK_BIO);
245 return 1;
246}
247
248static STACK_OF(X509_OBJECT) *X509_STORE_get0_objects(X509_STORE *store) {
249 return store->objs;
250}
251
Christian Heimes99a65702016-09-10 23:44:53 +0200252static int
253SSL_SESSION_has_ticket(const SSL_SESSION *s)
254{
255 return (s->tlsext_ticklen > 0) ? 1 : 0;
256}
257
258static unsigned long
259SSL_SESSION_get_ticket_lifetime_hint(const SSL_SESSION *s)
260{
261 return s->tlsext_tick_lifetime_hint;
262}
263
Christian Heimes4ca07392018-03-24 15:41:37 +0100264#endif /* OpenSSL < 1.1.0 or LibreSSL < 2.7.0 */
Christian Heimes598894f2016-09-05 23:19:05 +0200265
Christian Heimes892d66e2018-01-29 14:10:18 +0100266/* Default cipher suites */
267#ifndef PY_SSL_DEFAULT_CIPHERS
268#define PY_SSL_DEFAULT_CIPHERS 1
269#endif
270
271#if PY_SSL_DEFAULT_CIPHERS == 0
272 #ifndef PY_SSL_DEFAULT_CIPHER_STRING
273 #error "Py_SSL_DEFAULT_CIPHERS 0 needs Py_SSL_DEFAULT_CIPHER_STRING"
274 #endif
275#elif PY_SSL_DEFAULT_CIPHERS == 1
Stéphane Wirtel07fbbfd2018-10-05 16:17:18 +0200276/* Python custom selection of sensible cipher suites
Christian Heimes892d66e2018-01-29 14:10:18 +0100277 * DEFAULT: OpenSSL's default cipher list. Since 1.0.2 the list is in sensible order.
278 * !aNULL:!eNULL: really no NULL ciphers
279 * !MD5:!3DES:!DES:!RC4:!IDEA:!SEED: no weak or broken algorithms on old OpenSSL versions.
280 * !aDSS: no authentication with discrete logarithm DSA algorithm
281 * !SRP:!PSK: no secure remote password or pre-shared key authentication
282 */
283 #define PY_SSL_DEFAULT_CIPHER_STRING "DEFAULT:!aNULL:!eNULL:!MD5:!3DES:!DES:!RC4:!IDEA:!SEED:!aDSS:!SRP:!PSK"
284#elif PY_SSL_DEFAULT_CIPHERS == 2
285/* Ignored in SSLContext constructor, only used to as _ssl.DEFAULT_CIPHER_STRING */
286 #define PY_SSL_DEFAULT_CIPHER_STRING SSL_DEFAULT_CIPHER_LIST
287#else
288 #error "Unsupported PY_SSL_DEFAULT_CIPHERS"
289#endif
290
Christian Heimes598894f2016-09-05 23:19:05 +0200291
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +0000292enum py_ssl_error {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000293 /* these mirror ssl.h */
294 PY_SSL_ERROR_NONE,
295 PY_SSL_ERROR_SSL,
296 PY_SSL_ERROR_WANT_READ,
297 PY_SSL_ERROR_WANT_WRITE,
298 PY_SSL_ERROR_WANT_X509_LOOKUP,
299 PY_SSL_ERROR_SYSCALL, /* look at error stack/return value/errno */
300 PY_SSL_ERROR_ZERO_RETURN,
301 PY_SSL_ERROR_WANT_CONNECT,
302 /* start of non ssl.h errorcodes */
303 PY_SSL_ERROR_EOF, /* special case of SSL_ERROR_SYSCALL */
304 PY_SSL_ERROR_NO_SOCKET, /* socket has been GC'd */
305 PY_SSL_ERROR_INVALID_ERROR_CODE
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +0000306};
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000307
Thomas Woutersed03b412007-08-28 21:37:11 +0000308enum py_ssl_server_or_client {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000309 PY_SSL_CLIENT,
310 PY_SSL_SERVER
Thomas Woutersed03b412007-08-28 21:37:11 +0000311};
312
313enum py_ssl_cert_requirements {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000314 PY_SSL_CERT_NONE,
315 PY_SSL_CERT_OPTIONAL,
316 PY_SSL_CERT_REQUIRED
Thomas Woutersed03b412007-08-28 21:37:11 +0000317};
318
319enum py_ssl_version {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000320 PY_SSL_VERSION_SSL2,
Victor Stinner3de49192011-05-09 00:42:58 +0200321 PY_SSL_VERSION_SSL3=1,
Christian Heimes5fe668c2016-09-12 00:01:11 +0200322 PY_SSL_VERSION_TLS, /* SSLv23 */
Antoine Pitrou2463e5f2013-03-28 22:24:43 +0100323#if HAVE_TLSv1_2
324 PY_SSL_VERSION_TLS1,
325 PY_SSL_VERSION_TLS1_1,
Christian Heimes5fe668c2016-09-12 00:01:11 +0200326 PY_SSL_VERSION_TLS1_2,
Antoine Pitrou2463e5f2013-03-28 22:24:43 +0100327#else
Christian Heimes5fe668c2016-09-12 00:01:11 +0200328 PY_SSL_VERSION_TLS1,
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000329#endif
Christian Heimes5fe668c2016-09-12 00:01:11 +0200330 PY_SSL_VERSION_TLS_CLIENT=0x10,
331 PY_SSL_VERSION_TLS_SERVER,
Antoine Pitrou2463e5f2013-03-28 22:24:43 +0100332};
Antoine Pitrou3b36fb12012-06-22 21:11:52 +0200333
Christian Heimes698dde12018-02-27 11:54:43 +0100334enum py_proto_version {
335 PY_PROTO_MINIMUM_SUPPORTED = -2,
336 PY_PROTO_SSLv3 = SSL3_VERSION,
337 PY_PROTO_TLSv1 = TLS1_VERSION,
338 PY_PROTO_TLSv1_1 = TLS1_1_VERSION,
339 PY_PROTO_TLSv1_2 = TLS1_2_VERSION,
340#ifdef TLS1_3_VERSION
341 PY_PROTO_TLSv1_3 = TLS1_3_VERSION,
342#else
343 PY_PROTO_TLSv1_3 = 0x304,
344#endif
345 PY_PROTO_MAXIMUM_SUPPORTED = -1,
346
347/* OpenSSL has no dedicated API to set the minimum version to the maximum
348 * available version, and the other way around. We have to figure out the
349 * minimum and maximum available version on our own and hope for the best.
350 */
351#if defined(SSL3_VERSION) && !defined(OPENSSL_NO_SSL3)
352 PY_PROTO_MINIMUM_AVAILABLE = PY_PROTO_SSLv3,
353#elif defined(TLS1_VERSION) && !defined(OPENSSL_NO_TLS1)
354 PY_PROTO_MINIMUM_AVAILABLE = PY_PROTO_TLSv1,
355#elif defined(TLS1_1_VERSION) && !defined(OPENSSL_NO_TLS1_1)
356 PY_PROTO_MINIMUM_AVAILABLE = PY_PROTO_TLSv1_1,
357#elif defined(TLS1_2_VERSION) && !defined(OPENSSL_NO_TLS1_2)
358 PY_PROTO_MINIMUM_AVAILABLE = PY_PROTO_TLSv1_2,
359#elif defined(TLS1_3_VERSION) && !defined(OPENSSL_NO_TLS1_3)
360 PY_PROTO_MINIMUM_AVAILABLE = PY_PROTO_TLSv1_3,
361#else
362 #error "PY_PROTO_MINIMUM_AVAILABLE not found"
363#endif
364
365#if defined(TLS1_3_VERSION) && !defined(OPENSSL_NO_TLS1_3)
366 PY_PROTO_MAXIMUM_AVAILABLE = PY_PROTO_TLSv1_3,
367#elif defined(TLS1_2_VERSION) && !defined(OPENSSL_NO_TLS1_2)
368 PY_PROTO_MAXIMUM_AVAILABLE = PY_PROTO_TLSv1_2,
369#elif defined(TLS1_1_VERSION) && !defined(OPENSSL_NO_TLS1_1)
370 PY_PROTO_MAXIMUM_AVAILABLE = PY_PROTO_TLSv1_1,
371#elif defined(TLS1_VERSION) && !defined(OPENSSL_NO_TLS1)
372 PY_PROTO_MAXIMUM_AVAILABLE = PY_PROTO_TLSv1,
373#elif defined(SSL3_VERSION) && !defined(OPENSSL_NO_SSL3)
374 PY_PROTO_MAXIMUM_AVAILABLE = PY_PROTO_SSLv3,
375#else
376 #error "PY_PROTO_MAXIMUM_AVAILABLE not found"
377#endif
378};
379
380
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000381/* serves as a flag to see whether we've initialized the SSL thread support. */
382/* 0 means no, greater than 0 means yes */
383
384static unsigned int _ssl_locks_count = 0;
385
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000386/* SSL socket object */
387
388#define X509_NAME_MAXLEN 256
389
Gregory P. Smithbd4dacb2010-10-13 03:53:21 +0000390/* SSL_CTX_clear_options() and SSL_clear_options() were first added in
391 * OpenSSL 0.9.8m but do not appear in some 0.9.9-dev versions such the
392 * 0.9.9 from "May 2008" that NetBSD 5.0 uses. */
393#if OPENSSL_VERSION_NUMBER >= 0x009080dfL && OPENSSL_VERSION_NUMBER != 0x00909000L
Antoine Pitroub5218772010-05-21 09:56:06 +0000394# define HAVE_SSL_CTX_CLEAR_OPTIONS
395#else
396# undef HAVE_SSL_CTX_CLEAR_OPTIONS
397#endif
398
Antoine Pitroud6494802011-07-21 01:11:30 +0200399/* In case of 'tls-unique' it will be 12 bytes for TLS, 36 bytes for
400 * older SSL, but let's be safe */
401#define PySSL_CB_MAXLEN 128
402
Antoine Pitroua9bf2ac2012-02-17 18:47:54 +0100403
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000404typedef struct {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000405 PyObject_HEAD
Antoine Pitrou152efa22010-05-16 18:19:27 +0000406 SSL_CTX *ctx;
Christian Heimes29eab552018-02-25 12:31:33 +0100407#if HAVE_NPN
Benjamin Petersoncca27322015-01-23 16:35:37 -0500408 unsigned char *npn_protocols;
Antoine Pitroud5d17eb2012-03-22 00:23:03 +0100409 int npn_protocols_len;
410#endif
Christian Heimes29eab552018-02-25 12:31:33 +0100411#if HAVE_ALPN
Benjamin Petersoncca27322015-01-23 16:35:37 -0500412 unsigned char *alpn_protocols;
Segev Finer5cff6372017-07-27 01:19:17 +0300413 unsigned int alpn_protocols_len;
Benjamin Petersoncca27322015-01-23 16:35:37 -0500414#endif
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +0100415#ifndef OPENSSL_NO_TLSEXT
Christian Heimes11a14932018-02-24 02:35:08 +0100416 PyObject *set_sni_cb;
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +0100417#endif
Christian Heimes1aa9a752013-12-02 02:41:19 +0100418 int check_hostname;
Christian Heimes61d478c2018-01-27 15:51:38 +0100419 /* OpenSSL has no API to get hostflags from X509_VERIFY_PARAM* struct.
420 * We have to maintain our own copy. OpenSSL's hostflags default to 0.
421 */
422 unsigned int hostflags;
Christian Heimes11a14932018-02-24 02:35:08 +0100423 int protocol;
Christian Heimes9fb051f2018-09-23 08:32:31 +0200424#ifdef TLS1_3_VERSION
425 int post_handshake_auth;
426#endif
Antoine Pitrou152efa22010-05-16 18:19:27 +0000427} PySSLContext;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000428
Antoine Pitrou152efa22010-05-16 18:19:27 +0000429typedef struct {
Steve Dowerc6fd1c12018-09-17 11:34:47 -0700430 int ssl; /* last seen error from SSL */
431 int c; /* last seen error from libc */
432#ifdef MS_WINDOWS
433 int ws; /* last seen error from winsock */
434#endif
435} _PySSLError;
436
437typedef struct {
Antoine Pitrou152efa22010-05-16 18:19:27 +0000438 PyObject_HEAD
439 PyObject *Socket; /* weakref to socket on which we're layered */
440 SSL *ssl;
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +0100441 PySSLContext *ctx; /* weakref to SSL context */
Antoine Pitrou20b85552013-09-29 19:50:53 +0200442 char shutdown_seen_zero;
Antoine Pitroud6494802011-07-21 01:11:30 +0200443 enum py_ssl_server_or_client socket_type;
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200444 PyObject *owner; /* Python level "owner" passed to servername callback */
445 PyObject *server_hostname;
Steve Dowerc6fd1c12018-09-17 11:34:47 -0700446 _PySSLError err; /* last seen error from various sources */
Antoine Pitrou152efa22010-05-16 18:19:27 +0000447} PySSLSocket;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000448
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200449typedef struct {
450 PyObject_HEAD
451 BIO *bio;
452 int eof_written;
453} PySSLMemoryBIO;
454
Christian Heimes99a65702016-09-10 23:44:53 +0200455typedef struct {
456 PyObject_HEAD
457 SSL_SESSION *session;
458 PySSLContext *ctx;
459} PySSLSession;
460
Antoine Pitrou152efa22010-05-16 18:19:27 +0000461static PyTypeObject PySSLContext_Type;
462static PyTypeObject PySSLSocket_Type;
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200463static PyTypeObject PySSLMemoryBIO_Type;
Christian Heimes99a65702016-09-10 23:44:53 +0200464static PyTypeObject PySSLSession_Type;
Antoine Pitrou152efa22010-05-16 18:19:27 +0000465
Steve Dowerc6fd1c12018-09-17 11:34:47 -0700466static inline _PySSLError _PySSL_errno(int failed, const SSL *ssl, int retcode)
467{
468 _PySSLError err = { 0 };
469 if (failed) {
Steve Dowere6eb48c2017-09-08 15:16:15 -0700470#ifdef MS_WINDOWS
Steve Dowerc6fd1c12018-09-17 11:34:47 -0700471 err.ws = WSAGetLastError();
472 _PySSL_FIX_ERRNO;
Steve Dowere6eb48c2017-09-08 15:16:15 -0700473#endif
Steve Dowerc6fd1c12018-09-17 11:34:47 -0700474 err.c = errno;
475 err.ssl = SSL_get_error(ssl, retcode);
476 }
477 return err;
478}
Steve Dowere6eb48c2017-09-08 15:16:15 -0700479
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +0300480/*[clinic input]
481module _ssl
482class _ssl._SSLContext "PySSLContext *" "&PySSLContext_Type"
483class _ssl._SSLSocket "PySSLSocket *" "&PySSLSocket_Type"
484class _ssl.MemoryBIO "PySSLMemoryBIO *" "&PySSLMemoryBIO_Type"
Christian Heimes99a65702016-09-10 23:44:53 +0200485class _ssl.SSLSession "PySSLSession *" "&PySSLSession_Type"
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +0300486[clinic start generated code]*/
Christian Heimes99a65702016-09-10 23:44:53 +0200487/*[clinic end generated code: output=da39a3ee5e6b4b0d input=bdc67fafeeaa8109]*/
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +0300488
489#include "clinic/_ssl.c.h"
490
Victor Stinner14690702015-04-06 22:46:13 +0200491static int PySSL_select(PySocketSockObject *s, int writing, _PyTime_t timeout);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000492
Christian Heimes141c5e82018-02-24 21:10:57 +0100493static int PySSL_set_owner(PySSLSocket *, PyObject *, void *);
494static int PySSL_set_session(PySSLSocket *, PyObject *, void *);
Antoine Pitrou152efa22010-05-16 18:19:27 +0000495#define PySSLSocket_Check(v) (Py_TYPE(v) == &PySSLSocket_Type)
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200496#define PySSLMemoryBIO_Check(v) (Py_TYPE(v) == &PySSLMemoryBIO_Type)
Christian Heimes99a65702016-09-10 23:44:53 +0200497#define PySSLSession_Check(v) (Py_TYPE(v) == &PySSLSession_Type)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000498
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +0000499typedef enum {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000500 SOCKET_IS_NONBLOCKING,
501 SOCKET_IS_BLOCKING,
502 SOCKET_HAS_TIMED_OUT,
503 SOCKET_HAS_BEEN_CLOSED,
504 SOCKET_TOO_LARGE_FOR_SELECT,
505 SOCKET_OPERATION_OK
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +0000506} timeout_state;
507
Thomas Woutersed03b412007-08-28 21:37:11 +0000508/* Wrap error strings with filename and line # */
Thomas Woutersed03b412007-08-28 21:37:11 +0000509#define ERRSTR1(x,y,z) (x ":" y ": " z)
Victor Stinner45e8e2f2014-05-14 17:24:35 +0200510#define ERRSTR(x) ERRSTR1("_ssl.c", Py_STRINGIFY(__LINE__), x)
Thomas Woutersed03b412007-08-28 21:37:11 +0000511
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200512/* Get the socket from a PySSLSocket, if it has one */
513#define GET_SOCKET(obj) ((obj)->Socket ? \
514 (PySocketSockObject *) PyWeakref_GetObject((obj)->Socket) : NULL)
Antoine Pitrou3b36fb12012-06-22 21:11:52 +0200515
Victor Stinner14690702015-04-06 22:46:13 +0200516/* If sock is NULL, use a timeout of 0 second */
517#define GET_SOCKET_TIMEOUT(sock) \
518 ((sock != NULL) ? (sock)->sock_timeout : 0)
519
Antoine Pitrou3b36fb12012-06-22 21:11:52 +0200520/*
521 * SSL errors.
522 */
523
524PyDoc_STRVAR(SSLError_doc,
525"An error occurred in the SSL implementation.");
526
Christian Heimesb3ad0e52017-09-08 12:00:19 -0700527PyDoc_STRVAR(SSLCertVerificationError_doc,
528"A certificate could not be verified.");
529
Antoine Pitrou3b36fb12012-06-22 21:11:52 +0200530PyDoc_STRVAR(SSLZeroReturnError_doc,
531"SSL/TLS session closed cleanly.");
532
533PyDoc_STRVAR(SSLWantReadError_doc,
534"Non-blocking SSL socket needs to read more data\n"
535"before the requested operation can be completed.");
536
537PyDoc_STRVAR(SSLWantWriteError_doc,
538"Non-blocking SSL socket needs to write more data\n"
539"before the requested operation can be completed.");
540
541PyDoc_STRVAR(SSLSyscallError_doc,
542"System error when attempting SSL operation.");
543
544PyDoc_STRVAR(SSLEOFError_doc,
545"SSL/TLS connection terminated abruptly.");
546
547static PyObject *
548SSLError_str(PyOSErrorObject *self)
549{
550 if (self->strerror != NULL && PyUnicode_Check(self->strerror)) {
551 Py_INCREF(self->strerror);
552 return self->strerror;
553 }
554 else
555 return PyObject_Str(self->args);
556}
557
558static PyType_Slot sslerror_type_slots[] = {
559 {Py_tp_base, NULL}, /* Filled out in module init as it's not a constant */
560 {Py_tp_doc, SSLError_doc},
561 {Py_tp_str, SSLError_str},
562 {0, 0},
563};
564
565static PyType_Spec sslerror_type_spec = {
566 "ssl.SSLError",
567 sizeof(PyOSErrorObject),
568 0,
569 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
570 sslerror_type_slots
571};
572
573static void
Christian Heimesb3ad0e52017-09-08 12:00:19 -0700574fill_and_set_sslerror(PySSLSocket *sslsock, PyObject *type, int ssl_errno,
575 const char *errstr, int lineno, unsigned long errcode)
Antoine Pitrou3b36fb12012-06-22 21:11:52 +0200576{
577 PyObject *err_value = NULL, *reason_obj = NULL, *lib_obj = NULL;
Christian Heimesb3ad0e52017-09-08 12:00:19 -0700578 PyObject *verify_obj = NULL, *verify_code_obj = NULL;
Antoine Pitrou3b36fb12012-06-22 21:11:52 +0200579 PyObject *init_value, *msg, *key;
580 _Py_IDENTIFIER(reason);
581 _Py_IDENTIFIER(library);
Christian Heimesb3ad0e52017-09-08 12:00:19 -0700582 _Py_IDENTIFIER(verify_message);
583 _Py_IDENTIFIER(verify_code);
Antoine Pitrou3b36fb12012-06-22 21:11:52 +0200584
585 if (errcode != 0) {
586 int lib, reason;
587
588 lib = ERR_GET_LIB(errcode);
589 reason = ERR_GET_REASON(errcode);
590 key = Py_BuildValue("ii", lib, reason);
591 if (key == NULL)
592 goto fail;
593 reason_obj = PyDict_GetItem(err_codes_to_names, key);
594 Py_DECREF(key);
595 if (reason_obj == NULL) {
596 /* XXX if reason < 100, it might reflect a library number (!!) */
597 PyErr_Clear();
598 }
599 key = PyLong_FromLong(lib);
600 if (key == NULL)
601 goto fail;
602 lib_obj = PyDict_GetItem(lib_codes_to_names, key);
603 Py_DECREF(key);
604 if (lib_obj == NULL) {
605 PyErr_Clear();
606 }
607 if (errstr == NULL)
608 errstr = ERR_reason_error_string(errcode);
609 }
610 if (errstr == NULL)
611 errstr = "unknown error";
612
Christian Heimesb3ad0e52017-09-08 12:00:19 -0700613 /* verify code for cert validation error */
614 if ((sslsock != NULL) && (type == PySSLCertVerificationErrorObject)) {
615 const char *verify_str = NULL;
616 long verify_code;
617
618 verify_code = SSL_get_verify_result(sslsock->ssl);
619 verify_code_obj = PyLong_FromLong(verify_code);
620 if (verify_code_obj == NULL) {
621 goto fail;
622 }
623
624 switch (verify_code) {
Christian Heimes09153602017-09-08 14:47:58 -0700625#ifdef X509_V_ERR_HOSTNAME_MISMATCH
626 /* OpenSSL >= 1.0.2, LibreSSL >= 2.5.3 */
Christian Heimesb3ad0e52017-09-08 12:00:19 -0700627 case X509_V_ERR_HOSTNAME_MISMATCH:
628 verify_obj = PyUnicode_FromFormat(
629 "Hostname mismatch, certificate is not valid for '%S'.",
630 sslsock->server_hostname
631 );
632 break;
Christian Heimes09153602017-09-08 14:47:58 -0700633#endif
634#ifdef X509_V_ERR_IP_ADDRESS_MISMATCH
Christian Heimesb3ad0e52017-09-08 12:00:19 -0700635 case X509_V_ERR_IP_ADDRESS_MISMATCH:
636 verify_obj = PyUnicode_FromFormat(
637 "IP address mismatch, certificate is not valid for '%S'.",
638 sslsock->server_hostname
639 );
640 break;
Christian Heimes09153602017-09-08 14:47:58 -0700641#endif
Christian Heimesb3ad0e52017-09-08 12:00:19 -0700642 default:
643 verify_str = X509_verify_cert_error_string(verify_code);
644 if (verify_str != NULL) {
645 verify_obj = PyUnicode_FromString(verify_str);
646 } else {
647 verify_obj = Py_None;
648 Py_INCREF(verify_obj);
649 }
650 break;
651 }
652 if (verify_obj == NULL) {
653 goto fail;
654 }
655 }
656
657 if (verify_obj && reason_obj && lib_obj)
658 msg = PyUnicode_FromFormat("[%S: %S] %s: %S (_ssl.c:%d)",
659 lib_obj, reason_obj, errstr, verify_obj,
660 lineno);
661 else if (reason_obj && lib_obj)
Antoine Pitrou3b36fb12012-06-22 21:11:52 +0200662 msg = PyUnicode_FromFormat("[%S: %S] %s (_ssl.c:%d)",
663 lib_obj, reason_obj, errstr, lineno);
664 else if (lib_obj)
665 msg = PyUnicode_FromFormat("[%S] %s (_ssl.c:%d)",
666 lib_obj, errstr, lineno);
667 else
668 msg = PyUnicode_FromFormat("%s (_ssl.c:%d)", errstr, lineno);
Antoine Pitrou3b36fb12012-06-22 21:11:52 +0200669 if (msg == NULL)
670 goto fail;
Victor Stinnerba9be472013-10-31 15:00:24 +0100671
Antoine Pitrou3b36fb12012-06-22 21:11:52 +0200672 init_value = Py_BuildValue("iN", ssl_errno, msg);
Victor Stinnerba9be472013-10-31 15:00:24 +0100673 if (init_value == NULL)
674 goto fail;
675
Antoine Pitrou3b36fb12012-06-22 21:11:52 +0200676 err_value = PyObject_CallObject(type, init_value);
677 Py_DECREF(init_value);
678 if (err_value == NULL)
679 goto fail;
Victor Stinnerba9be472013-10-31 15:00:24 +0100680
Antoine Pitrou3b36fb12012-06-22 21:11:52 +0200681 if (reason_obj == NULL)
682 reason_obj = Py_None;
683 if (_PyObject_SetAttrId(err_value, &PyId_reason, reason_obj))
684 goto fail;
Christian Heimesb3ad0e52017-09-08 12:00:19 -0700685
Antoine Pitrou3b36fb12012-06-22 21:11:52 +0200686 if (lib_obj == NULL)
687 lib_obj = Py_None;
688 if (_PyObject_SetAttrId(err_value, &PyId_library, lib_obj))
689 goto fail;
Christian Heimesb3ad0e52017-09-08 12:00:19 -0700690
691 if ((sslsock != NULL) && (type == PySSLCertVerificationErrorObject)) {
692 /* Only set verify code / message for SSLCertVerificationError */
693 if (_PyObject_SetAttrId(err_value, &PyId_verify_code,
694 verify_code_obj))
695 goto fail;
696 if (_PyObject_SetAttrId(err_value, &PyId_verify_message, verify_obj))
697 goto fail;
698 }
699
Antoine Pitrou3b36fb12012-06-22 21:11:52 +0200700 PyErr_SetObject(type, err_value);
701fail:
702 Py_XDECREF(err_value);
Christian Heimesb3ad0e52017-09-08 12:00:19 -0700703 Py_XDECREF(verify_code_obj);
704 Py_XDECREF(verify_obj);
Antoine Pitrou3b36fb12012-06-22 21:11:52 +0200705}
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000706
707static PyObject *
Christian Heimesb3ad0e52017-09-08 12:00:19 -0700708PySSL_SetError(PySSLSocket *sslsock, int ret, const char *filename, int lineno)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000709{
Antoine Pitrou41032a62011-10-27 23:56:55 +0200710 PyObject *type = PySSLErrorObject;
Antoine Pitrou3b36fb12012-06-22 21:11:52 +0200711 char *errstr = NULL;
Steve Dowerc6fd1c12018-09-17 11:34:47 -0700712 _PySSLError err;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000713 enum py_ssl_error p = PY_SSL_ERROR_NONE;
Antoine Pitrou3b36fb12012-06-22 21:11:52 +0200714 unsigned long e = 0;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000715
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000716 assert(ret <= 0);
Antoine Pitrou3b36fb12012-06-22 21:11:52 +0200717 e = ERR_peek_last_error();
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +0000718
Christian Heimesb3ad0e52017-09-08 12:00:19 -0700719 if (sslsock->ssl != NULL) {
Steve Dowerc6fd1c12018-09-17 11:34:47 -0700720 err = sslsock->err;
Thomas Woutersed03b412007-08-28 21:37:11 +0000721
Steve Dowerc6fd1c12018-09-17 11:34:47 -0700722 switch (err.ssl) {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000723 case SSL_ERROR_ZERO_RETURN:
Antoine Pitrou41032a62011-10-27 23:56:55 +0200724 errstr = "TLS/SSL connection has been closed (EOF)";
725 type = PySSLZeroReturnErrorObject;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000726 p = PY_SSL_ERROR_ZERO_RETURN;
727 break;
728 case SSL_ERROR_WANT_READ:
729 errstr = "The operation did not complete (read)";
Antoine Pitrou41032a62011-10-27 23:56:55 +0200730 type = PySSLWantReadErrorObject;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000731 p = PY_SSL_ERROR_WANT_READ;
732 break;
733 case SSL_ERROR_WANT_WRITE:
734 p = PY_SSL_ERROR_WANT_WRITE;
Antoine Pitrou41032a62011-10-27 23:56:55 +0200735 type = PySSLWantWriteErrorObject;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000736 errstr = "The operation did not complete (write)";
737 break;
738 case SSL_ERROR_WANT_X509_LOOKUP:
739 p = PY_SSL_ERROR_WANT_X509_LOOKUP;
Antoine Pitrou525807b2010-05-12 14:05:24 +0000740 errstr = "The operation did not complete (X509 lookup)";
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000741 break;
742 case SSL_ERROR_WANT_CONNECT:
743 p = PY_SSL_ERROR_WANT_CONNECT;
744 errstr = "The operation did not complete (connect)";
745 break;
746 case SSL_ERROR_SYSCALL:
747 {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000748 if (e == 0) {
Christian Heimesb3ad0e52017-09-08 12:00:19 -0700749 PySocketSockObject *s = GET_SOCKET(sslsock);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000750 if (ret == 0 || (((PyObject *)s) == Py_None)) {
Antoine Pitrou525807b2010-05-12 14:05:24 +0000751 p = PY_SSL_ERROR_EOF;
Antoine Pitrou41032a62011-10-27 23:56:55 +0200752 type = PySSLEOFErrorObject;
Antoine Pitrou525807b2010-05-12 14:05:24 +0000753 errstr = "EOF occurred in violation of protocol";
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200754 } else if (s && ret == -1) {
Antoine Pitrou525807b2010-05-12 14:05:24 +0000755 /* underlying BIO reported an I/O error */
Antoine Pitrou9d74b422010-05-16 23:14:22 +0000756 ERR_clear_error();
Steve Dowere6eb48c2017-09-08 15:16:15 -0700757#ifdef MS_WINDOWS
Steve Dowerc6fd1c12018-09-17 11:34:47 -0700758 if (err.ws) {
759 return PyErr_SetFromWindowsErr(err.ws);
760 }
Steve Dowere6eb48c2017-09-08 15:16:15 -0700761#endif
Steve Dowerc6fd1c12018-09-17 11:34:47 -0700762 if (err.c) {
763 errno = err.c;
Steve Dowere6eb48c2017-09-08 15:16:15 -0700764 return PyErr_SetFromErrno(PyExc_OSError);
765 }
766 Py_INCREF(s);
Antoine Pitrou3b36fb12012-06-22 21:11:52 +0200767 s->errorhandler();
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +0000768 Py_DECREF(s);
Antoine Pitrou3b36fb12012-06-22 21:11:52 +0200769 return NULL;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000770 } else { /* possible? */
Antoine Pitrou525807b2010-05-12 14:05:24 +0000771 p = PY_SSL_ERROR_SYSCALL;
Antoine Pitrou41032a62011-10-27 23:56:55 +0200772 type = PySSLSyscallErrorObject;
Antoine Pitrou525807b2010-05-12 14:05:24 +0000773 errstr = "Some I/O error occurred";
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000774 }
775 } else {
776 p = PY_SSL_ERROR_SYSCALL;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000777 }
778 break;
779 }
780 case SSL_ERROR_SSL:
781 {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000782 p = PY_SSL_ERROR_SSL;
Christian Heimesb3ad0e52017-09-08 12:00:19 -0700783 if (e == 0) {
Antoine Pitrou3b36fb12012-06-22 21:11:52 +0200784 /* possible? */
Antoine Pitrou525807b2010-05-12 14:05:24 +0000785 errstr = "A failure in the SSL library occurred";
Christian Heimesb3ad0e52017-09-08 12:00:19 -0700786 }
787 if (ERR_GET_LIB(e) == ERR_LIB_SSL &&
788 ERR_GET_REASON(e) == SSL_R_CERTIFICATE_VERIFY_FAILED) {
789 type = PySSLCertVerificationErrorObject;
790 }
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000791 break;
792 }
793 default:
794 p = PY_SSL_ERROR_INVALID_ERROR_CODE;
795 errstr = "Invalid error code";
796 }
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000797 }
Christian Heimesb3ad0e52017-09-08 12:00:19 -0700798 fill_and_set_sslerror(sslsock, type, p, errstr, lineno, e);
Antoine Pitrou9d74b422010-05-16 23:14:22 +0000799 ERR_clear_error();
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000800 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000801}
802
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000803static PyObject *
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200804_setSSLError (const char *errstr, int errcode, const char *filename, int lineno) {
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000805
Antoine Pitrou3b36fb12012-06-22 21:11:52 +0200806 if (errstr == NULL)
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000807 errcode = ERR_peek_last_error();
Antoine Pitrou3b36fb12012-06-22 21:11:52 +0200808 else
809 errcode = 0;
Christian Heimesb3ad0e52017-09-08 12:00:19 -0700810 fill_and_set_sslerror(NULL, PySSLErrorObject, errcode, errstr, lineno, errcode);
Antoine Pitrou9d74b422010-05-16 23:14:22 +0000811 ERR_clear_error();
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000812 return NULL;
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000813}
814
Christian Heimes61d478c2018-01-27 15:51:38 +0100815/*
816 * SSL objects
817 */
818
819static int
820_ssl_configure_hostname(PySSLSocket *self, const char* server_hostname)
821{
822 int retval = -1;
823 ASN1_OCTET_STRING *ip;
824 PyObject *hostname;
825 size_t len;
826
827 assert(server_hostname);
828
829 /* Disable OpenSSL's special mode with leading dot in hostname:
830 * When name starts with a dot (e.g ".example.com"), it will be
831 * matched by a certificate valid for any sub-domain of name.
832 */
833 len = strlen(server_hostname);
834 if (len == 0 || *server_hostname == '.') {
835 PyErr_SetString(
836 PyExc_ValueError,
837 "server_hostname cannot be an empty string or start with a "
838 "leading dot.");
839 return retval;
840 }
841
842 /* inet_pton is not available on all platforms. */
843 ip = a2i_IPADDRESS(server_hostname);
844 if (ip == NULL) {
845 ERR_clear_error();
846 }
847
Christian Heimes11a14932018-02-24 02:35:08 +0100848 hostname = PyUnicode_Decode(server_hostname, len, "ascii", "strict");
Christian Heimes61d478c2018-01-27 15:51:38 +0100849 if (hostname == NULL) {
850 goto error;
851 }
852 self->server_hostname = hostname;
853
854 /* Only send SNI extension for non-IP hostnames */
855 if (ip == NULL) {
856 if (!SSL_set_tlsext_host_name(self->ssl, server_hostname)) {
857 _setSSLError(NULL, 0, __FILE__, __LINE__);
858 }
859 }
860 if (self->ctx->check_hostname) {
861 X509_VERIFY_PARAM *param = SSL_get0_param(self->ssl);
862 if (ip == NULL) {
Christian Heimesd02ac252018-03-25 12:36:13 +0200863 if (!X509_VERIFY_PARAM_set1_host(param, server_hostname,
864 strlen(server_hostname))) {
Christian Heimes61d478c2018-01-27 15:51:38 +0100865 _setSSLError(NULL, 0, __FILE__, __LINE__);
866 goto error;
867 }
868 } else {
869 if (!X509_VERIFY_PARAM_set1_ip(param, ASN1_STRING_data(ip),
870 ASN1_STRING_length(ip))) {
871 _setSSLError(NULL, 0, __FILE__, __LINE__);
872 goto error;
873 }
874 }
875 }
876 retval = 0;
877 error:
878 if (ip != NULL) {
879 ASN1_OCTET_STRING_free(ip);
880 }
881 return retval;
882}
883
Antoine Pitrou152efa22010-05-16 18:19:27 +0000884static PySSLSocket *
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +0100885newPySSLSocket(PySSLContext *sslctx, PySocketSockObject *sock,
Antoine Pitroud5323212010-10-22 18:19:07 +0000886 enum py_ssl_server_or_client socket_type,
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200887 char *server_hostname,
Christian Heimes141c5e82018-02-24 21:10:57 +0100888 PyObject *owner, PyObject *session,
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200889 PySSLMemoryBIO *inbio, PySSLMemoryBIO *outbio)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000890{
Antoine Pitrou152efa22010-05-16 18:19:27 +0000891 PySSLSocket *self;
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +0100892 SSL_CTX *ctx = sslctx->ctx;
Steve Dowerc6fd1c12018-09-17 11:34:47 -0700893 _PySSLError err = { 0 };
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000894
Antoine Pitrou152efa22010-05-16 18:19:27 +0000895 self = PyObject_New(PySSLSocket, &PySSLSocket_Type);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000896 if (self == NULL)
897 return NULL;
Antoine Pitrou152efa22010-05-16 18:19:27 +0000898
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000899 self->ssl = NULL;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000900 self->Socket = NULL;
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +0100901 self->ctx = sslctx;
Nathaniel J. Smith65ece7c2017-06-07 23:30:43 -0700902 Py_INCREF(sslctx);
Antoine Pitrou860aee72013-09-29 19:52:45 +0200903 self->shutdown_seen_zero = 0;
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200904 self->owner = NULL;
Benjamin Peterson81b9ecd2016-08-15 21:55:37 -0700905 self->server_hostname = NULL;
Steve Dowerc6fd1c12018-09-17 11:34:47 -0700906 self->err = err;
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200907
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000908 /* Make sure the SSL error state is initialized */
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000909 ERR_clear_error();
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000910
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000911 PySSL_BEGIN_ALLOW_THREADS
Antoine Pitrou152efa22010-05-16 18:19:27 +0000912 self->ssl = SSL_new(ctx);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000913 PySSL_END_ALLOW_THREADS
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200914 SSL_set_app_data(self->ssl, self);
915 if (sock) {
916 SSL_set_fd(self->ssl, Py_SAFE_DOWNCAST(sock->sock_fd, SOCKET_T, int));
917 } else {
918 /* BIOs are reference counted and SSL_set_bio borrows our reference.
919 * To prevent a double free in memory_bio_dealloc() we need to take an
920 * extra reference here. */
Christian Heimes598894f2016-09-05 23:19:05 +0200921 BIO_up_ref(inbio->bio);
922 BIO_up_ref(outbio->bio);
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200923 SSL_set_bio(self->ssl, inbio->bio, outbio->bio);
924 }
Alex Gaynorf0422422018-05-14 11:51:45 -0400925 SSL_set_mode(self->ssl,
926 SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER | SSL_MODE_AUTO_RETRY);
Guido van Rossum4f707ac2003-01-31 18:13:18 +0000927
Christian Heimes61d478c2018-01-27 15:51:38 +0100928 if (server_hostname != NULL) {
929 if (_ssl_configure_hostname(self, server_hostname) < 0) {
930 Py_DECREF(self);
931 return NULL;
932 }
933 }
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000934 /* If the socket is in non-blocking mode or timeout mode, set the BIO
935 * to non-blocking mode (blocking is the default)
936 */
Victor Stinnere2452312015-03-28 03:00:46 +0100937 if (sock && sock->sock_timeout >= 0) {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000938 BIO_set_nbio(SSL_get_rbio(self->ssl), 1);
939 BIO_set_nbio(SSL_get_wbio(self->ssl), 1);
940 }
Guido van Rossum4f707ac2003-01-31 18:13:18 +0000941
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000942 PySSL_BEGIN_ALLOW_THREADS
943 if (socket_type == PY_SSL_CLIENT)
944 SSL_set_connect_state(self->ssl);
945 else
946 SSL_set_accept_state(self->ssl);
947 PySSL_END_ALLOW_THREADS
Martin v. Löwis09c35f72002-07-28 09:57:45 +0000948
Antoine Pitroud6494802011-07-21 01:11:30 +0200949 self->socket_type = socket_type;
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200950 if (sock != NULL) {
951 self->Socket = PyWeakref_NewRef((PyObject *) sock, NULL);
952 if (self->Socket == NULL) {
953 Py_DECREF(self);
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200954 return NULL;
955 }
Victor Stinnera9eb38f2013-10-31 16:35:38 +0100956 }
Christian Heimes141c5e82018-02-24 21:10:57 +0100957 if (owner && owner != Py_None) {
958 if (PySSL_set_owner(self, owner, NULL) == -1) {
959 Py_DECREF(self);
960 return NULL;
961 }
962 }
963 if (session && session != Py_None) {
964 if (PySSL_set_session(self, session, NULL) == -1) {
965 Py_DECREF(self);
966 return NULL;
967 }
968 }
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000969 return self;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000970}
971
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000972/* SSL object methods */
973
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +0300974/*[clinic input]
975_ssl._SSLSocket.do_handshake
976[clinic start generated code]*/
977
978static PyObject *
979_ssl__SSLSocket_do_handshake_impl(PySSLSocket *self)
980/*[clinic end generated code: output=6c0898a8936548f6 input=d2d737de3df018c8]*/
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000981{
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000982 int ret;
Steve Dowerc6fd1c12018-09-17 11:34:47 -0700983 _PySSLError err;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000984 int sockstate, nonblocking;
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200985 PySocketSockObject *sock = GET_SOCKET(self);
Victor Stinner14690702015-04-06 22:46:13 +0200986 _PyTime_t timeout, deadline = 0;
987 int has_timeout;
Antoine Pitroud3f8ab82010-04-24 21:26:44 +0000988
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200989 if (sock) {
990 if (((PyObject*)sock) == Py_None) {
991 _setSSLError("Underlying socket connection gone",
992 PY_SSL_ERROR_NO_SOCKET, __FILE__, __LINE__);
993 return NULL;
994 }
995 Py_INCREF(sock);
996
997 /* just in case the blocking state of the socket has been changed */
Victor Stinnere2452312015-03-28 03:00:46 +0100998 nonblocking = (sock->sock_timeout >= 0);
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200999 BIO_set_nbio(SSL_get_rbio(self->ssl), nonblocking);
1000 BIO_set_nbio(SSL_get_wbio(self->ssl), nonblocking);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001001 }
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001002
Victor Stinner14690702015-04-06 22:46:13 +02001003 timeout = GET_SOCKET_TIMEOUT(sock);
1004 has_timeout = (timeout > 0);
1005 if (has_timeout)
1006 deadline = _PyTime_GetMonotonicClock() + timeout;
1007
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001008 /* Actually negotiate SSL connection */
1009 /* XXX If SSL_do_handshake() returns 0, it's also a failure. */
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001010 do {
Bill Janssen6e027db2007-11-15 22:23:56 +00001011 PySSL_BEGIN_ALLOW_THREADS
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001012 ret = SSL_do_handshake(self->ssl);
Steve Dowerc6fd1c12018-09-17 11:34:47 -07001013 err = _PySSL_errno(ret < 1, self->ssl, ret);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001014 PySSL_END_ALLOW_THREADS
Steve Dowerc6fd1c12018-09-17 11:34:47 -07001015 self->err = err;
Victor Stinner4e3cfa42015-04-02 21:28:28 +02001016
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +00001017 if (PyErr_CheckSignals())
1018 goto error;
Victor Stinner4e3cfa42015-04-02 21:28:28 +02001019
Victor Stinner14690702015-04-06 22:46:13 +02001020 if (has_timeout)
1021 timeout = deadline - _PyTime_GetMonotonicClock();
1022
Steve Dowerc6fd1c12018-09-17 11:34:47 -07001023 if (err.ssl == SSL_ERROR_WANT_READ) {
Victor Stinner14690702015-04-06 22:46:13 +02001024 sockstate = PySSL_select(sock, 0, timeout);
Steve Dowerc6fd1c12018-09-17 11:34:47 -07001025 } else if (err.ssl == SSL_ERROR_WANT_WRITE) {
Victor Stinner14690702015-04-06 22:46:13 +02001026 sockstate = PySSL_select(sock, 1, timeout);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001027 } else {
1028 sockstate = SOCKET_OPERATION_OK;
1029 }
Victor Stinner4e3cfa42015-04-02 21:28:28 +02001030
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001031 if (sockstate == SOCKET_HAS_TIMED_OUT) {
Antoine Pitrouc4df7842010-12-03 19:59:41 +00001032 PyErr_SetString(PySocketModule.timeout_error,
Antoine Pitrou525807b2010-05-12 14:05:24 +00001033 ERRSTR("The handshake operation timed out"));
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +00001034 goto error;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001035 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
1036 PyErr_SetString(PySSLErrorObject,
Antoine Pitrou525807b2010-05-12 14:05:24 +00001037 ERRSTR("Underlying socket has been closed."));
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +00001038 goto error;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001039 } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
1040 PyErr_SetString(PySSLErrorObject,
Antoine Pitrou525807b2010-05-12 14:05:24 +00001041 ERRSTR("Underlying socket too large for select()."));
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +00001042 goto error;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001043 } else if (sockstate == SOCKET_IS_NONBLOCKING) {
1044 break;
1045 }
Steve Dowerc6fd1c12018-09-17 11:34:47 -07001046 } while (err.ssl == SSL_ERROR_WANT_READ ||
1047 err.ssl == SSL_ERROR_WANT_WRITE);
Antoine Pitroub1fdf472014-10-05 20:41:53 +02001048 Py_XDECREF(sock);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001049 if (ret < 1)
1050 return PySSL_SetError(self, ret, __FILE__, __LINE__);
Bill Janssen6e027db2007-11-15 22:23:56 +00001051
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001052 Py_RETURN_NONE;
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +00001053
1054error:
Antoine Pitroub1fdf472014-10-05 20:41:53 +02001055 Py_XDECREF(sock);
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +00001056 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001057}
1058
Thomas Woutersed03b412007-08-28 21:37:11 +00001059static PyObject *
Serhiy Storchakae503ca52017-09-05 01:28:53 +03001060_asn1obj2py(const ASN1_OBJECT *name, int no_name)
1061{
1062 char buf[X509_NAME_MAXLEN];
1063 char *namebuf = buf;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001064 int buflen;
Serhiy Storchakae503ca52017-09-05 01:28:53 +03001065 PyObject *name_obj = NULL;
Thomas Woutersed03b412007-08-28 21:37:11 +00001066
Serhiy Storchakae503ca52017-09-05 01:28:53 +03001067 buflen = OBJ_obj2txt(namebuf, X509_NAME_MAXLEN, name, no_name);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001068 if (buflen < 0) {
1069 _setSSLError(NULL, 0, __FILE__, __LINE__);
Serhiy Storchakae503ca52017-09-05 01:28:53 +03001070 return NULL;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001071 }
Serhiy Storchakae503ca52017-09-05 01:28:53 +03001072 /* initial buffer is too small for oid + terminating null byte */
1073 if (buflen > X509_NAME_MAXLEN - 1) {
1074 /* make OBJ_obj2txt() calculate the required buflen */
1075 buflen = OBJ_obj2txt(NULL, 0, name, no_name);
1076 /* allocate len + 1 for terminating NULL byte */
1077 namebuf = PyMem_Malloc(buflen + 1);
1078 if (namebuf == NULL) {
1079 PyErr_NoMemory();
1080 return NULL;
1081 }
1082 buflen = OBJ_obj2txt(namebuf, buflen + 1, name, no_name);
1083 if (buflen < 0) {
1084 _setSSLError(NULL, 0, __FILE__, __LINE__);
1085 goto done;
1086 }
1087 }
1088 if (!buflen && no_name) {
1089 Py_INCREF(Py_None);
1090 name_obj = Py_None;
1091 }
1092 else {
1093 name_obj = PyUnicode_FromStringAndSize(namebuf, buflen);
1094 }
1095
1096 done:
1097 if (buf != namebuf) {
1098 PyMem_Free(namebuf);
1099 }
1100 return name_obj;
1101}
1102
1103static PyObject *
1104_create_tuple_for_attribute(ASN1_OBJECT *name, ASN1_STRING *value)
1105{
1106 Py_ssize_t buflen;
1107 unsigned char *valuebuf = NULL;
1108 PyObject *attr;
Guido van Rossumf06628b2007-11-21 20:01:53 +00001109
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001110 buflen = ASN1_STRING_to_UTF8(&valuebuf, value);
1111 if (buflen < 0) {
1112 _setSSLError(NULL, 0, __FILE__, __LINE__);
Serhiy Storchakae503ca52017-09-05 01:28:53 +03001113 return NULL;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001114 }
Serhiy Storchakae503ca52017-09-05 01:28:53 +03001115 attr = Py_BuildValue("Ns#", _asn1obj2py(name, 0), valuebuf, buflen);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001116 OPENSSL_free(valuebuf);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001117 return attr;
Thomas Woutersed03b412007-08-28 21:37:11 +00001118}
1119
1120static PyObject *
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001121_create_tuple_for_X509_NAME (X509_NAME *xname)
Thomas Woutersed03b412007-08-28 21:37:11 +00001122{
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001123 PyObject *dn = NULL; /* tuple which represents the "distinguished name" */
1124 PyObject *rdn = NULL; /* tuple to hold a "relative distinguished name" */
1125 PyObject *rdnt;
1126 PyObject *attr = NULL; /* tuple to hold an attribute */
1127 int entry_count = X509_NAME_entry_count(xname);
1128 X509_NAME_ENTRY *entry;
1129 ASN1_OBJECT *name;
1130 ASN1_STRING *value;
1131 int index_counter;
1132 int rdn_level = -1;
1133 int retcode;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001134
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001135 dn = PyList_New(0);
1136 if (dn == NULL)
1137 return NULL;
1138 /* now create another tuple to hold the top-level RDN */
1139 rdn = PyList_New(0);
1140 if (rdn == NULL)
1141 goto fail0;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001142
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001143 for (index_counter = 0;
1144 index_counter < entry_count;
1145 index_counter++)
1146 {
1147 entry = X509_NAME_get_entry(xname, index_counter);
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001148
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001149 /* check to see if we've gotten to a new RDN */
1150 if (rdn_level >= 0) {
Christian Heimes598894f2016-09-05 23:19:05 +02001151 if (rdn_level != X509_NAME_ENTRY_set(entry)) {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001152 /* yes, new RDN */
1153 /* add old RDN to DN */
1154 rdnt = PyList_AsTuple(rdn);
1155 Py_DECREF(rdn);
1156 if (rdnt == NULL)
1157 goto fail0;
1158 retcode = PyList_Append(dn, rdnt);
1159 Py_DECREF(rdnt);
1160 if (retcode < 0)
1161 goto fail0;
1162 /* create new RDN */
1163 rdn = PyList_New(0);
1164 if (rdn == NULL)
1165 goto fail0;
1166 }
1167 }
Christian Heimes598894f2016-09-05 23:19:05 +02001168 rdn_level = X509_NAME_ENTRY_set(entry);
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001169
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001170 /* now add this attribute to the current RDN */
1171 name = X509_NAME_ENTRY_get_object(entry);
1172 value = X509_NAME_ENTRY_get_data(entry);
1173 attr = _create_tuple_for_attribute(name, value);
1174 /*
1175 fprintf(stderr, "RDN level %d, attribute %s: %s\n",
1176 entry->set,
1177 PyBytes_AS_STRING(PyTuple_GET_ITEM(attr, 0)),
1178 PyBytes_AS_STRING(PyTuple_GET_ITEM(attr, 1)));
1179 */
1180 if (attr == NULL)
1181 goto fail1;
1182 retcode = PyList_Append(rdn, attr);
1183 Py_DECREF(attr);
1184 if (retcode < 0)
1185 goto fail1;
1186 }
1187 /* now, there's typically a dangling RDN */
Antoine Pitrou2f5a1632012-02-15 22:25:27 +01001188 if (rdn != NULL) {
1189 if (PyList_GET_SIZE(rdn) > 0) {
1190 rdnt = PyList_AsTuple(rdn);
1191 Py_DECREF(rdn);
1192 if (rdnt == NULL)
1193 goto fail0;
1194 retcode = PyList_Append(dn, rdnt);
1195 Py_DECREF(rdnt);
1196 if (retcode < 0)
1197 goto fail0;
1198 }
1199 else {
1200 Py_DECREF(rdn);
1201 }
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001202 }
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001203
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001204 /* convert list to tuple */
1205 rdnt = PyList_AsTuple(dn);
1206 Py_DECREF(dn);
1207 if (rdnt == NULL)
1208 return NULL;
1209 return rdnt;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001210
1211 fail1:
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001212 Py_XDECREF(rdn);
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001213
1214 fail0:
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001215 Py_XDECREF(dn);
1216 return NULL;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001217}
1218
1219static PyObject *
1220_get_peer_alt_names (X509 *certificate) {
Guido van Rossumf06628b2007-11-21 20:01:53 +00001221
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001222 /* this code follows the procedure outlined in
1223 OpenSSL's crypto/x509v3/v3_prn.c:X509v3_EXT_print()
1224 function to extract the STACK_OF(GENERAL_NAME),
1225 then iterates through the stack to add the
1226 names. */
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001227
Alex Gaynorb87c0df2017-06-06 07:53:11 -04001228 int j;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001229 PyObject *peer_alt_names = Py_None;
Christian Heimes60bf2fc2013-09-05 16:04:35 +02001230 PyObject *v = NULL, *t;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001231 GENERAL_NAMES *names = NULL;
1232 GENERAL_NAME *name;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001233 BIO *biobuf = NULL;
1234 char buf[2048];
1235 char *vptr;
1236 int len;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001237
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001238 if (certificate == NULL)
1239 return peer_alt_names;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001240
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001241 /* get a memory buffer */
1242 biobuf = BIO_new(BIO_s_mem());
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001243
Alex Gaynorb87c0df2017-06-06 07:53:11 -04001244 names = (GENERAL_NAMES *)X509_get_ext_d2i(
1245 certificate, NID_subject_alt_name, NULL, NULL);
1246 if (names != NULL) {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001247 if (peer_alt_names == Py_None) {
1248 peer_alt_names = PyList_New(0);
1249 if (peer_alt_names == NULL)
1250 goto fail;
1251 }
Guido van Rossumf06628b2007-11-21 20:01:53 +00001252
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001253 for(j = 0; j < sk_GENERAL_NAME_num(names); j++) {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001254 /* get a rendering of each name in the set of names */
Christian Heimes824f7f32013-08-17 00:54:47 +02001255 int gntype;
1256 ASN1_STRING *as = NULL;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001257
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001258 name = sk_GENERAL_NAME_value(names, j);
Christian Heimes474afdd2013-08-17 17:18:56 +02001259 gntype = name->type;
Christian Heimes824f7f32013-08-17 00:54:47 +02001260 switch (gntype) {
1261 case GEN_DIRNAME:
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001262 /* we special-case DirName as a tuple of
1263 tuples of attributes */
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001264
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001265 t = PyTuple_New(2);
1266 if (t == NULL) {
1267 goto fail;
1268 }
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001269
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001270 v = PyUnicode_FromString("DirName");
1271 if (v == NULL) {
1272 Py_DECREF(t);
1273 goto fail;
1274 }
1275 PyTuple_SET_ITEM(t, 0, v);
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001276
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001277 v = _create_tuple_for_X509_NAME (name->d.dirn);
1278 if (v == NULL) {
1279 Py_DECREF(t);
1280 goto fail;
1281 }
1282 PyTuple_SET_ITEM(t, 1, v);
Christian Heimes824f7f32013-08-17 00:54:47 +02001283 break;
Guido van Rossumf06628b2007-11-21 20:01:53 +00001284
Christian Heimes824f7f32013-08-17 00:54:47 +02001285 case GEN_EMAIL:
1286 case GEN_DNS:
1287 case GEN_URI:
1288 /* GENERAL_NAME_print() doesn't handle NULL bytes in ASN1_string
1289 correctly, CVE-2013-4238 */
1290 t = PyTuple_New(2);
1291 if (t == NULL)
1292 goto fail;
1293 switch (gntype) {
1294 case GEN_EMAIL:
1295 v = PyUnicode_FromString("email");
1296 as = name->d.rfc822Name;
1297 break;
1298 case GEN_DNS:
1299 v = PyUnicode_FromString("DNS");
1300 as = name->d.dNSName;
1301 break;
1302 case GEN_URI:
1303 v = PyUnicode_FromString("URI");
1304 as = name->d.uniformResourceIdentifier;
1305 break;
1306 }
1307 if (v == NULL) {
1308 Py_DECREF(t);
1309 goto fail;
1310 }
1311 PyTuple_SET_ITEM(t, 0, v);
1312 v = PyUnicode_FromStringAndSize((char *)ASN1_STRING_data(as),
1313 ASN1_STRING_length(as));
1314 if (v == NULL) {
1315 Py_DECREF(t);
1316 goto fail;
1317 }
1318 PyTuple_SET_ITEM(t, 1, v);
1319 break;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001320
Christian Heimes1c03abd2016-09-06 23:25:35 +02001321 case GEN_RID:
1322 t = PyTuple_New(2);
1323 if (t == NULL)
1324 goto fail;
1325
1326 v = PyUnicode_FromString("Registered ID");
1327 if (v == NULL) {
1328 Py_DECREF(t);
1329 goto fail;
1330 }
1331 PyTuple_SET_ITEM(t, 0, v);
1332
1333 len = i2t_ASN1_OBJECT(buf, sizeof(buf)-1, name->d.rid);
1334 if (len < 0) {
1335 Py_DECREF(t);
1336 _setSSLError(NULL, 0, __FILE__, __LINE__);
1337 goto fail;
1338 } else if (len >= (int)sizeof(buf)) {
1339 v = PyUnicode_FromString("<INVALID>");
1340 } else {
1341 v = PyUnicode_FromStringAndSize(buf, len);
1342 }
1343 if (v == NULL) {
1344 Py_DECREF(t);
1345 goto fail;
1346 }
1347 PyTuple_SET_ITEM(t, 1, v);
1348 break;
1349
Christian Heimes824f7f32013-08-17 00:54:47 +02001350 default:
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001351 /* for everything else, we use the OpenSSL print form */
Christian Heimes824f7f32013-08-17 00:54:47 +02001352 switch (gntype) {
1353 /* check for new general name type */
1354 case GEN_OTHERNAME:
1355 case GEN_X400:
1356 case GEN_EDIPARTY:
1357 case GEN_IPADD:
1358 case GEN_RID:
1359 break;
1360 default:
1361 if (PyErr_WarnFormat(PyExc_RuntimeWarning, 1,
1362 "Unknown general name type %d",
1363 gntype) == -1) {
1364 goto fail;
1365 }
1366 break;
1367 }
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001368 (void) BIO_reset(biobuf);
1369 GENERAL_NAME_print(biobuf, name);
1370 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
1371 if (len < 0) {
1372 _setSSLError(NULL, 0, __FILE__, __LINE__);
1373 goto fail;
1374 }
1375 vptr = strchr(buf, ':');
Christian Heimes1c03abd2016-09-06 23:25:35 +02001376 if (vptr == NULL) {
1377 PyErr_Format(PyExc_ValueError,
1378 "Invalid value %.200s",
1379 buf);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001380 goto fail;
Christian Heimes1c03abd2016-09-06 23:25:35 +02001381 }
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001382 t = PyTuple_New(2);
1383 if (t == NULL)
1384 goto fail;
1385 v = PyUnicode_FromStringAndSize(buf, (vptr - buf));
1386 if (v == NULL) {
1387 Py_DECREF(t);
1388 goto fail;
1389 }
1390 PyTuple_SET_ITEM(t, 0, v);
1391 v = PyUnicode_FromStringAndSize((vptr + 1),
1392 (len - (vptr - buf + 1)));
1393 if (v == NULL) {
1394 Py_DECREF(t);
1395 goto fail;
1396 }
1397 PyTuple_SET_ITEM(t, 1, v);
Christian Heimes824f7f32013-08-17 00:54:47 +02001398 break;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001399 }
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001400
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001401 /* and add that rendering to the list */
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001402
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001403 if (PyList_Append(peer_alt_names, t) < 0) {
1404 Py_DECREF(t);
1405 goto fail;
1406 }
1407 Py_DECREF(t);
1408 }
Antoine Pitrou116d6b92011-11-23 01:39:19 +01001409 sk_GENERAL_NAME_pop_free(names, GENERAL_NAME_free);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001410 }
1411 BIO_free(biobuf);
1412 if (peer_alt_names != Py_None) {
1413 v = PyList_AsTuple(peer_alt_names);
1414 Py_DECREF(peer_alt_names);
1415 return v;
1416 } else {
1417 return peer_alt_names;
1418 }
Guido van Rossumf06628b2007-11-21 20:01:53 +00001419
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001420
1421 fail:
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001422 if (biobuf != NULL)
1423 BIO_free(biobuf);
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001424
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001425 if (peer_alt_names != Py_None) {
1426 Py_XDECREF(peer_alt_names);
1427 }
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001428
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001429 return NULL;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001430}
1431
1432static PyObject *
Christian Heimesbd3a7f92013-11-21 03:40:15 +01001433_get_aia_uri(X509 *certificate, int nid) {
1434 PyObject *lst = NULL, *ostr = NULL;
1435 int i, result;
1436 AUTHORITY_INFO_ACCESS *info;
1437
1438 info = X509_get_ext_d2i(certificate, NID_info_access, NULL, NULL);
Benjamin Petersonf0c90382015-11-14 15:12:18 -08001439 if (info == NULL)
1440 return Py_None;
1441 if (sk_ACCESS_DESCRIPTION_num(info) == 0) {
1442 AUTHORITY_INFO_ACCESS_free(info);
Christian Heimesbd3a7f92013-11-21 03:40:15 +01001443 return Py_None;
1444 }
1445
1446 if ((lst = PyList_New(0)) == NULL) {
1447 goto fail;
1448 }
1449
1450 for (i = 0; i < sk_ACCESS_DESCRIPTION_num(info); i++) {
1451 ACCESS_DESCRIPTION *ad = sk_ACCESS_DESCRIPTION_value(info, i);
1452 ASN1_IA5STRING *uri;
1453
1454 if ((OBJ_obj2nid(ad->method) != nid) ||
1455 (ad->location->type != GEN_URI)) {
1456 continue;
1457 }
1458 uri = ad->location->d.uniformResourceIdentifier;
1459 ostr = PyUnicode_FromStringAndSize((char *)uri->data,
1460 uri->length);
1461 if (ostr == NULL) {
1462 goto fail;
1463 }
1464 result = PyList_Append(lst, ostr);
1465 Py_DECREF(ostr);
1466 if (result < 0) {
1467 goto fail;
1468 }
1469 }
1470 AUTHORITY_INFO_ACCESS_free(info);
1471
1472 /* convert to tuple or None */
1473 if (PyList_Size(lst) == 0) {
1474 Py_DECREF(lst);
1475 return Py_None;
1476 } else {
1477 PyObject *tup;
1478 tup = PyList_AsTuple(lst);
1479 Py_DECREF(lst);
1480 return tup;
1481 }
1482
1483 fail:
1484 AUTHORITY_INFO_ACCESS_free(info);
Christian Heimes18fc7be2013-11-21 23:57:49 +01001485 Py_XDECREF(lst);
Christian Heimesbd3a7f92013-11-21 03:40:15 +01001486 return NULL;
1487}
1488
1489static PyObject *
1490_get_crl_dp(X509 *certificate) {
1491 STACK_OF(DIST_POINT) *dps;
Benjamin Petersoneda06c82015-11-11 22:07:38 -08001492 int i, j;
1493 PyObject *lst, *res = NULL;
Christian Heimesbd3a7f92013-11-21 03:40:15 +01001494
Christian Heimes598894f2016-09-05 23:19:05 +02001495 dps = X509_get_ext_d2i(certificate, NID_crl_distribution_points, NULL, NULL);
Christian Heimes949ec142013-11-21 16:26:51 +01001496
Benjamin Petersoneda06c82015-11-11 22:07:38 -08001497 if (dps == NULL)
Christian Heimesbd3a7f92013-11-21 03:40:15 +01001498 return Py_None;
Christian Heimesbd3a7f92013-11-21 03:40:15 +01001499
Benjamin Petersoneda06c82015-11-11 22:07:38 -08001500 lst = PyList_New(0);
1501 if (lst == NULL)
1502 goto done;
Christian Heimesbd3a7f92013-11-21 03:40:15 +01001503
1504 for (i=0; i < sk_DIST_POINT_num(dps); i++) {
1505 DIST_POINT *dp;
1506 STACK_OF(GENERAL_NAME) *gns;
1507
1508 dp = sk_DIST_POINT_value(dps, i);
1509 gns = dp->distpoint->name.fullname;
1510
1511 for (j=0; j < sk_GENERAL_NAME_num(gns); j++) {
1512 GENERAL_NAME *gn;
1513 ASN1_IA5STRING *uri;
1514 PyObject *ouri;
Benjamin Petersoneda06c82015-11-11 22:07:38 -08001515 int err;
Christian Heimesbd3a7f92013-11-21 03:40:15 +01001516
1517 gn = sk_GENERAL_NAME_value(gns, j);
1518 if (gn->type != GEN_URI) {
1519 continue;
1520 }
1521 uri = gn->d.uniformResourceIdentifier;
1522 ouri = PyUnicode_FromStringAndSize((char *)uri->data,
1523 uri->length);
Benjamin Petersoneda06c82015-11-11 22:07:38 -08001524 if (ouri == NULL)
1525 goto done;
1526
1527 err = PyList_Append(lst, ouri);
Christian Heimesbd3a7f92013-11-21 03:40:15 +01001528 Py_DECREF(ouri);
Benjamin Petersoneda06c82015-11-11 22:07:38 -08001529 if (err < 0)
1530 goto done;
Christian Heimesbd3a7f92013-11-21 03:40:15 +01001531 }
1532 }
Benjamin Petersoneda06c82015-11-11 22:07:38 -08001533
1534 /* Convert to tuple. */
1535 res = (PyList_GET_SIZE(lst) > 0) ? PyList_AsTuple(lst) : Py_None;
1536
1537 done:
1538 Py_XDECREF(lst);
Olivier Vielpeau2849cc32017-04-14 21:06:07 -04001539 CRL_DIST_POINTS_free(dps);
Benjamin Petersoneda06c82015-11-11 22:07:38 -08001540 return res;
Christian Heimesbd3a7f92013-11-21 03:40:15 +01001541}
1542
1543static PyObject *
Antoine Pitroufb046912010-11-09 20:21:19 +00001544_decode_certificate(X509 *certificate) {
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001545
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001546 PyObject *retval = NULL;
1547 BIO *biobuf = NULL;
1548 PyObject *peer;
1549 PyObject *peer_alt_names = NULL;
1550 PyObject *issuer;
1551 PyObject *version;
1552 PyObject *sn_obj;
Christian Heimesbd3a7f92013-11-21 03:40:15 +01001553 PyObject *obj;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001554 ASN1_INTEGER *serialNumber;
1555 char buf[2048];
Christian Heimesbd3a7f92013-11-21 03:40:15 +01001556 int len, result;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001557 ASN1_TIME *notBefore, *notAfter;
1558 PyObject *pnotBefore, *pnotAfter;
Thomas Woutersed03b412007-08-28 21:37:11 +00001559
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001560 retval = PyDict_New();
1561 if (retval == NULL)
1562 return NULL;
Thomas Woutersed03b412007-08-28 21:37:11 +00001563
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001564 peer = _create_tuple_for_X509_NAME(
1565 X509_get_subject_name(certificate));
1566 if (peer == NULL)
1567 goto fail0;
1568 if (PyDict_SetItemString(retval, (const char *) "subject", peer) < 0) {
1569 Py_DECREF(peer);
1570 goto fail0;
1571 }
1572 Py_DECREF(peer);
Thomas Woutersed03b412007-08-28 21:37:11 +00001573
Antoine Pitroufb046912010-11-09 20:21:19 +00001574 issuer = _create_tuple_for_X509_NAME(
1575 X509_get_issuer_name(certificate));
1576 if (issuer == NULL)
1577 goto fail0;
1578 if (PyDict_SetItemString(retval, (const char *)"issuer", issuer) < 0) {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001579 Py_DECREF(issuer);
Antoine Pitroufb046912010-11-09 20:21:19 +00001580 goto fail0;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001581 }
Antoine Pitroufb046912010-11-09 20:21:19 +00001582 Py_DECREF(issuer);
1583
1584 version = PyLong_FromLong(X509_get_version(certificate) + 1);
Christian Heimes5962bef2013-07-26 15:51:18 +02001585 if (version == NULL)
1586 goto fail0;
Antoine Pitroufb046912010-11-09 20:21:19 +00001587 if (PyDict_SetItemString(retval, "version", version) < 0) {
1588 Py_DECREF(version);
1589 goto fail0;
1590 }
1591 Py_DECREF(version);
Guido van Rossumf06628b2007-11-21 20:01:53 +00001592
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001593 /* get a memory buffer */
1594 biobuf = BIO_new(BIO_s_mem());
Guido van Rossumf06628b2007-11-21 20:01:53 +00001595
Antoine Pitroufb046912010-11-09 20:21:19 +00001596 (void) BIO_reset(biobuf);
1597 serialNumber = X509_get_serialNumber(certificate);
1598 /* should not exceed 20 octets, 160 bits, so buf is big enough */
1599 i2a_ASN1_INTEGER(biobuf, serialNumber);
1600 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
1601 if (len < 0) {
1602 _setSSLError(NULL, 0, __FILE__, __LINE__);
1603 goto fail1;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001604 }
Antoine Pitroufb046912010-11-09 20:21:19 +00001605 sn_obj = PyUnicode_FromStringAndSize(buf, len);
1606 if (sn_obj == NULL)
1607 goto fail1;
1608 if (PyDict_SetItemString(retval, "serialNumber", sn_obj) < 0) {
1609 Py_DECREF(sn_obj);
1610 goto fail1;
1611 }
1612 Py_DECREF(sn_obj);
1613
1614 (void) BIO_reset(biobuf);
1615 notBefore = X509_get_notBefore(certificate);
1616 ASN1_TIME_print(biobuf, notBefore);
1617 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
1618 if (len < 0) {
1619 _setSSLError(NULL, 0, __FILE__, __LINE__);
1620 goto fail1;
1621 }
1622 pnotBefore = PyUnicode_FromStringAndSize(buf, len);
1623 if (pnotBefore == NULL)
1624 goto fail1;
1625 if (PyDict_SetItemString(retval, "notBefore", pnotBefore) < 0) {
1626 Py_DECREF(pnotBefore);
1627 goto fail1;
1628 }
1629 Py_DECREF(pnotBefore);
Thomas Woutersed03b412007-08-28 21:37:11 +00001630
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001631 (void) BIO_reset(biobuf);
1632 notAfter = X509_get_notAfter(certificate);
1633 ASN1_TIME_print(biobuf, notAfter);
1634 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
1635 if (len < 0) {
1636 _setSSLError(NULL, 0, __FILE__, __LINE__);
1637 goto fail1;
1638 }
1639 pnotAfter = PyUnicode_FromStringAndSize(buf, len);
1640 if (pnotAfter == NULL)
1641 goto fail1;
1642 if (PyDict_SetItemString(retval, "notAfter", pnotAfter) < 0) {
1643 Py_DECREF(pnotAfter);
1644 goto fail1;
1645 }
1646 Py_DECREF(pnotAfter);
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001647
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001648 /* Now look for subjectAltName */
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001649
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001650 peer_alt_names = _get_peer_alt_names(certificate);
1651 if (peer_alt_names == NULL)
1652 goto fail1;
1653 else if (peer_alt_names != Py_None) {
1654 if (PyDict_SetItemString(retval, "subjectAltName",
1655 peer_alt_names) < 0) {
1656 Py_DECREF(peer_alt_names);
1657 goto fail1;
1658 }
1659 Py_DECREF(peer_alt_names);
1660 }
Guido van Rossumf06628b2007-11-21 20:01:53 +00001661
Christian Heimesbd3a7f92013-11-21 03:40:15 +01001662 /* Authority Information Access: OCSP URIs */
1663 obj = _get_aia_uri(certificate, NID_ad_OCSP);
1664 if (obj == NULL) {
1665 goto fail1;
1666 } else if (obj != Py_None) {
1667 result = PyDict_SetItemString(retval, "OCSP", obj);
1668 Py_DECREF(obj);
1669 if (result < 0) {
1670 goto fail1;
1671 }
1672 }
1673
1674 obj = _get_aia_uri(certificate, NID_ad_ca_issuers);
1675 if (obj == NULL) {
1676 goto fail1;
1677 } else if (obj != Py_None) {
1678 result = PyDict_SetItemString(retval, "caIssuers", obj);
1679 Py_DECREF(obj);
1680 if (result < 0) {
1681 goto fail1;
1682 }
1683 }
1684
1685 /* CDP (CRL distribution points) */
1686 obj = _get_crl_dp(certificate);
1687 if (obj == NULL) {
1688 goto fail1;
1689 } else if (obj != Py_None) {
1690 result = PyDict_SetItemString(retval, "crlDistributionPoints", obj);
1691 Py_DECREF(obj);
1692 if (result < 0) {
1693 goto fail1;
1694 }
1695 }
1696
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001697 BIO_free(biobuf);
1698 return retval;
Thomas Woutersed03b412007-08-28 21:37:11 +00001699
1700 fail1:
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001701 if (biobuf != NULL)
1702 BIO_free(biobuf);
Thomas Woutersed03b412007-08-28 21:37:11 +00001703 fail0:
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001704 Py_XDECREF(retval);
1705 return NULL;
Thomas Woutersed03b412007-08-28 21:37:11 +00001706}
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001707
Christian Heimes9a5395a2013-06-17 15:44:12 +02001708static PyObject *
1709_certificate_to_der(X509 *certificate)
1710{
1711 unsigned char *bytes_buf = NULL;
1712 int len;
1713 PyObject *retval;
1714
1715 bytes_buf = NULL;
1716 len = i2d_X509(certificate, &bytes_buf);
1717 if (len < 0) {
1718 _setSSLError(NULL, 0, __FILE__, __LINE__);
1719 return NULL;
1720 }
1721 /* this is actually an immutable bytes sequence */
1722 retval = PyBytes_FromStringAndSize((const char *) bytes_buf, len);
1723 OPENSSL_free(bytes_buf);
1724 return retval;
1725}
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001726
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03001727/*[clinic input]
1728_ssl._test_decode_cert
1729 path: object(converter="PyUnicode_FSConverter")
1730 /
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001731
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03001732[clinic start generated code]*/
1733
1734static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001735_ssl__test_decode_cert_impl(PyObject *module, PyObject *path)
1736/*[clinic end generated code: output=96becb9abb23c091 input=cdeaaf02d4346628]*/
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03001737{
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001738 PyObject *retval = NULL;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001739 X509 *x=NULL;
1740 BIO *cert;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001741
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001742 if ((cert=BIO_new(BIO_s_file())) == NULL) {
1743 PyErr_SetString(PySSLErrorObject,
1744 "Can't malloc memory to read file");
1745 goto fail0;
1746 }
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001747
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03001748 if (BIO_read_filename(cert, PyBytes_AsString(path)) <= 0) {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001749 PyErr_SetString(PySSLErrorObject,
1750 "Can't open file");
1751 goto fail0;
1752 }
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001753
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001754 x = PEM_read_bio_X509_AUX(cert,NULL, NULL, NULL);
1755 if (x == NULL) {
1756 PyErr_SetString(PySSLErrorObject,
1757 "Error decoding PEM-encoded file");
1758 goto fail0;
1759 }
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001760
Antoine Pitroufb046912010-11-09 20:21:19 +00001761 retval = _decode_certificate(x);
Mark Dickinsonee55df52010-08-03 18:31:54 +00001762 X509_free(x);
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001763
1764 fail0:
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03001765 Py_DECREF(path);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001766 if (cert != NULL) BIO_free(cert);
1767 return retval;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001768}
1769
1770
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03001771/*[clinic input]
Christian Heimes141c5e82018-02-24 21:10:57 +01001772_ssl._SSLSocket.getpeercert
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03001773 der as binary_mode: bool = False
1774 /
1775
1776Returns the certificate for the peer.
1777
1778If no certificate was provided, returns None. If a certificate was
1779provided, but not validated, returns an empty dictionary. Otherwise
1780returns a dict containing information about the peer certificate.
1781
1782If the optional argument is True, returns a DER-encoded copy of the
1783peer certificate, or None if no certificate was provided. This will
1784return the certificate even if it wasn't validated.
1785[clinic start generated code]*/
1786
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001787static PyObject *
Christian Heimes141c5e82018-02-24 21:10:57 +01001788_ssl__SSLSocket_getpeercert_impl(PySSLSocket *self, int binary_mode)
1789/*[clinic end generated code: output=1f0ab66dfb693c88 input=c0fbe802e57629b7]*/
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001790{
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001791 int verification;
Christian Heimes66dc33b2017-05-23 16:02:02 -07001792 X509 *peer_cert;
1793 PyObject *result;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001794
Christian Heimes66dc33b2017-05-23 16:02:02 -07001795 if (!SSL_is_init_finished(self->ssl)) {
Antoine Pitrou20b85552013-09-29 19:50:53 +02001796 PyErr_SetString(PyExc_ValueError,
1797 "handshake not done yet");
1798 return NULL;
1799 }
Christian Heimes66dc33b2017-05-23 16:02:02 -07001800 peer_cert = SSL_get_peer_certificate(self->ssl);
1801 if (peer_cert == NULL)
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001802 Py_RETURN_NONE;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001803
Antoine Pitrou721738f2012-08-15 23:20:39 +02001804 if (binary_mode) {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001805 /* return cert in DER-encoded format */
Christian Heimes66dc33b2017-05-23 16:02:02 -07001806 result = _certificate_to_der(peer_cert);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001807 } else {
Antoine Pitrou152efa22010-05-16 18:19:27 +00001808 verification = SSL_CTX_get_verify_mode(SSL_get_SSL_CTX(self->ssl));
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001809 if ((verification & SSL_VERIFY_PEER) == 0)
Christian Heimes66dc33b2017-05-23 16:02:02 -07001810 result = PyDict_New();
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001811 else
Christian Heimes66dc33b2017-05-23 16:02:02 -07001812 result = _decode_certificate(peer_cert);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001813 }
Christian Heimes66dc33b2017-05-23 16:02:02 -07001814 X509_free(peer_cert);
1815 return result;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001816}
1817
Benjamin Peterson4cb17812015-01-07 11:14:26 -06001818static PyObject *
1819cipher_to_tuple(const SSL_CIPHER *cipher)
1820{
1821 const char *cipher_name, *cipher_protocol;
1822 PyObject *v, *retval = PyTuple_New(3);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001823 if (retval == NULL)
1824 return NULL;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001825
Benjamin Peterson4cb17812015-01-07 11:14:26 -06001826 cipher_name = SSL_CIPHER_get_name(cipher);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001827 if (cipher_name == NULL) {
Hirokazu Yamamoto524f1032010-12-09 10:49:00 +00001828 Py_INCREF(Py_None);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001829 PyTuple_SET_ITEM(retval, 0, Py_None);
1830 } else {
1831 v = PyUnicode_FromString(cipher_name);
1832 if (v == NULL)
Benjamin Peterson4cb17812015-01-07 11:14:26 -06001833 goto fail;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001834 PyTuple_SET_ITEM(retval, 0, v);
1835 }
Benjamin Peterson4cb17812015-01-07 11:14:26 -06001836
1837 cipher_protocol = SSL_CIPHER_get_version(cipher);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001838 if (cipher_protocol == NULL) {
Hirokazu Yamamoto524f1032010-12-09 10:49:00 +00001839 Py_INCREF(Py_None);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001840 PyTuple_SET_ITEM(retval, 1, Py_None);
1841 } else {
1842 v = PyUnicode_FromString(cipher_protocol);
1843 if (v == NULL)
Benjamin Peterson4cb17812015-01-07 11:14:26 -06001844 goto fail;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001845 PyTuple_SET_ITEM(retval, 1, v);
1846 }
Benjamin Peterson4cb17812015-01-07 11:14:26 -06001847
1848 v = PyLong_FromLong(SSL_CIPHER_get_bits(cipher, NULL));
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001849 if (v == NULL)
Benjamin Peterson4cb17812015-01-07 11:14:26 -06001850 goto fail;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001851 PyTuple_SET_ITEM(retval, 2, v);
Benjamin Peterson4cb17812015-01-07 11:14:26 -06001852
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001853 return retval;
Guido van Rossumf06628b2007-11-21 20:01:53 +00001854
Benjamin Peterson4cb17812015-01-07 11:14:26 -06001855 fail:
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001856 Py_DECREF(retval);
1857 return NULL;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001858}
1859
Christian Heimes25bfcd52016-09-06 00:04:45 +02001860#if OPENSSL_VERSION_NUMBER >= 0x10002000UL
1861static PyObject *
1862cipher_to_dict(const SSL_CIPHER *cipher)
1863{
1864 const char *cipher_name, *cipher_protocol;
1865
1866 unsigned long cipher_id;
1867 int alg_bits, strength_bits, len;
1868 char buf[512] = {0};
1869#if OPENSSL_VERSION_1_1
1870 int aead, nid;
1871 const char *skcipher = NULL, *digest = NULL, *kx = NULL, *auth = NULL;
1872#endif
Christian Heimes25bfcd52016-09-06 00:04:45 +02001873
1874 /* can be NULL */
1875 cipher_name = SSL_CIPHER_get_name(cipher);
1876 cipher_protocol = SSL_CIPHER_get_version(cipher);
1877 cipher_id = SSL_CIPHER_get_id(cipher);
1878 SSL_CIPHER_description(cipher, buf, sizeof(buf) - 1);
Segev Finer5cff6372017-07-27 01:19:17 +03001879 /* Downcast to avoid a warning. Safe since buf is always 512 bytes */
1880 len = (int)strlen(buf);
Christian Heimes25bfcd52016-09-06 00:04:45 +02001881 if (len > 1 && buf[len-1] == '\n')
1882 buf[len-1] = '\0';
1883 strength_bits = SSL_CIPHER_get_bits(cipher, &alg_bits);
1884
1885#if OPENSSL_VERSION_1_1
1886 aead = SSL_CIPHER_is_aead(cipher);
1887 nid = SSL_CIPHER_get_cipher_nid(cipher);
1888 skcipher = nid != NID_undef ? OBJ_nid2ln(nid) : NULL;
1889 nid = SSL_CIPHER_get_digest_nid(cipher);
1890 digest = nid != NID_undef ? OBJ_nid2ln(nid) : NULL;
1891 nid = SSL_CIPHER_get_kx_nid(cipher);
1892 kx = nid != NID_undef ? OBJ_nid2ln(nid) : NULL;
1893 nid = SSL_CIPHER_get_auth_nid(cipher);
1894 auth = nid != NID_undef ? OBJ_nid2ln(nid) : NULL;
1895#endif
1896
Victor Stinner410b9882016-09-12 12:00:23 +02001897 return Py_BuildValue(
Christian Heimes25bfcd52016-09-06 00:04:45 +02001898 "{sksssssssisi"
1899#if OPENSSL_VERSION_1_1
1900 "sOssssssss"
1901#endif
1902 "}",
1903 "id", cipher_id,
1904 "name", cipher_name,
1905 "protocol", cipher_protocol,
1906 "description", buf,
1907 "strength_bits", strength_bits,
1908 "alg_bits", alg_bits
1909#if OPENSSL_VERSION_1_1
1910 ,"aead", aead ? Py_True : Py_False,
1911 "symmetric", skcipher,
1912 "digest", digest,
1913 "kea", kx,
1914 "auth", auth
1915#endif
1916 );
Christian Heimes25bfcd52016-09-06 00:04:45 +02001917}
1918#endif
1919
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03001920/*[clinic input]
1921_ssl._SSLSocket.shared_ciphers
1922[clinic start generated code]*/
1923
1924static PyObject *
1925_ssl__SSLSocket_shared_ciphers_impl(PySSLSocket *self)
1926/*[clinic end generated code: output=3d174ead2e42c4fd input=0bfe149da8fe6306]*/
Benjamin Peterson4cb17812015-01-07 11:14:26 -06001927{
1928 STACK_OF(SSL_CIPHER) *ciphers;
1929 int i;
1930 PyObject *res;
1931
Christian Heimes598894f2016-09-05 23:19:05 +02001932 ciphers = SSL_get_ciphers(self->ssl);
1933 if (!ciphers)
Benjamin Peterson4cb17812015-01-07 11:14:26 -06001934 Py_RETURN_NONE;
Benjamin Peterson4cb17812015-01-07 11:14:26 -06001935 res = PyList_New(sk_SSL_CIPHER_num(ciphers));
1936 if (!res)
1937 return NULL;
1938 for (i = 0; i < sk_SSL_CIPHER_num(ciphers); i++) {
1939 PyObject *tup = cipher_to_tuple(sk_SSL_CIPHER_value(ciphers, i));
1940 if (!tup) {
1941 Py_DECREF(res);
1942 return NULL;
1943 }
1944 PyList_SET_ITEM(res, i, tup);
1945 }
1946 return res;
1947}
1948
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03001949/*[clinic input]
1950_ssl._SSLSocket.cipher
1951[clinic start generated code]*/
1952
1953static PyObject *
1954_ssl__SSLSocket_cipher_impl(PySSLSocket *self)
1955/*[clinic end generated code: output=376417c16d0e5815 input=548fb0e27243796d]*/
Benjamin Peterson4cb17812015-01-07 11:14:26 -06001956{
1957 const SSL_CIPHER *current;
1958
1959 if (self->ssl == NULL)
1960 Py_RETURN_NONE;
1961 current = SSL_get_current_cipher(self->ssl);
1962 if (current == NULL)
1963 Py_RETURN_NONE;
1964 return cipher_to_tuple(current);
1965}
1966
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03001967/*[clinic input]
1968_ssl._SSLSocket.version
1969[clinic start generated code]*/
1970
1971static PyObject *
1972_ssl__SSLSocket_version_impl(PySSLSocket *self)
1973/*[clinic end generated code: output=178aed33193b2cdb input=900186a503436fd6]*/
Antoine Pitrou47e40422014-09-04 21:00:10 +02001974{
1975 const char *version;
1976
1977 if (self->ssl == NULL)
1978 Py_RETURN_NONE;
Christian Heimes68771112017-09-05 21:55:40 -07001979 if (!SSL_is_init_finished(self->ssl)) {
1980 /* handshake not finished */
1981 Py_RETURN_NONE;
1982 }
Antoine Pitrou47e40422014-09-04 21:00:10 +02001983 version = SSL_get_version(self->ssl);
1984 if (!strcmp(version, "unknown"))
1985 Py_RETURN_NONE;
1986 return PyUnicode_FromString(version);
1987}
1988
Christian Heimes29eab552018-02-25 12:31:33 +01001989#if HAVE_NPN
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03001990/*[clinic input]
1991_ssl._SSLSocket.selected_npn_protocol
1992[clinic start generated code]*/
1993
1994static PyObject *
1995_ssl__SSLSocket_selected_npn_protocol_impl(PySSLSocket *self)
1996/*[clinic end generated code: output=b91d494cd207ecf6 input=c28fde139204b826]*/
1997{
Antoine Pitroud5d17eb2012-03-22 00:23:03 +01001998 const unsigned char *out;
1999 unsigned int outlen;
2000
Victor Stinner4569cd52013-06-23 14:58:43 +02002001 SSL_get0_next_proto_negotiated(self->ssl,
Antoine Pitroud5d17eb2012-03-22 00:23:03 +01002002 &out, &outlen);
2003
2004 if (out == NULL)
2005 Py_RETURN_NONE;
Benjamin Petersoncca27322015-01-23 16:35:37 -05002006 return PyUnicode_FromStringAndSize((char *)out, outlen);
2007}
2008#endif
2009
Christian Heimes29eab552018-02-25 12:31:33 +01002010#if HAVE_ALPN
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002011/*[clinic input]
2012_ssl._SSLSocket.selected_alpn_protocol
2013[clinic start generated code]*/
2014
2015static PyObject *
2016_ssl__SSLSocket_selected_alpn_protocol_impl(PySSLSocket *self)
2017/*[clinic end generated code: output=ec33688b303d250f input=442de30e35bc2913]*/
2018{
Benjamin Petersoncca27322015-01-23 16:35:37 -05002019 const unsigned char *out;
2020 unsigned int outlen;
2021
2022 SSL_get0_alpn_selected(self->ssl, &out, &outlen);
2023
2024 if (out == NULL)
2025 Py_RETURN_NONE;
2026 return PyUnicode_FromStringAndSize((char *)out, outlen);
Antoine Pitroud5d17eb2012-03-22 00:23:03 +01002027}
2028#endif
2029
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002030/*[clinic input]
2031_ssl._SSLSocket.compression
2032[clinic start generated code]*/
2033
2034static PyObject *
2035_ssl__SSLSocket_compression_impl(PySSLSocket *self)
2036/*[clinic end generated code: output=bd16cb1bb4646ae7 input=5d059d0a2bbc32c8]*/
2037{
Antoine Pitrou8abdb8a2011-12-20 10:13:40 +01002038#ifdef OPENSSL_NO_COMP
2039 Py_RETURN_NONE;
2040#else
2041 const COMP_METHOD *comp_method;
2042 const char *short_name;
2043
2044 if (self->ssl == NULL)
2045 Py_RETURN_NONE;
2046 comp_method = SSL_get_current_compression(self->ssl);
Christian Heimes598894f2016-09-05 23:19:05 +02002047 if (comp_method == NULL || COMP_get_type(comp_method) == NID_undef)
Antoine Pitrou8abdb8a2011-12-20 10:13:40 +01002048 Py_RETURN_NONE;
Christian Heimes281e5f82016-09-06 01:10:39 +02002049 short_name = OBJ_nid2sn(COMP_get_type(comp_method));
Antoine Pitrou8abdb8a2011-12-20 10:13:40 +01002050 if (short_name == NULL)
2051 Py_RETURN_NONE;
2052 return PyUnicode_DecodeFSDefault(short_name);
2053#endif
2054}
2055
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01002056static PySSLContext *PySSL_get_context(PySSLSocket *self, void *closure) {
2057 Py_INCREF(self->ctx);
2058 return self->ctx;
2059}
2060
2061static int PySSL_set_context(PySSLSocket *self, PyObject *value,
2062 void *closure) {
2063
2064 if (PyObject_TypeCheck(value, &PySSLContext_Type)) {
Antoine Pitrou912fbff2013-03-30 16:29:32 +01002065#if !HAVE_SNI
2066 PyErr_SetString(PyExc_NotImplementedError, "setting a socket's "
2067 "context is not supported by your OpenSSL library");
Antoine Pitrou41f8c4f2013-03-30 16:36:54 +01002068 return -1;
Antoine Pitrou912fbff2013-03-30 16:29:32 +01002069#else
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01002070 Py_INCREF(value);
Serhiy Storchaka57a01d32016-04-10 18:05:40 +03002071 Py_SETREF(self->ctx, (PySSLContext *)value);
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01002072 SSL_set_SSL_CTX(self->ssl, self->ctx->ctx);
Antoine Pitrou912fbff2013-03-30 16:29:32 +01002073#endif
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01002074 } else {
Ned Deily4531ec72018-06-11 20:26:28 -04002075 PyErr_SetString(PyExc_TypeError, "The value must be a SSLContext");
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01002076 return -1;
2077 }
2078
2079 return 0;
2080}
2081
2082PyDoc_STRVAR(PySSL_set_context_doc,
2083"_setter_context(ctx)\n\
2084\
2085This changes the context associated with the SSLSocket. This is typically\n\
Christian Heimes11a14932018-02-24 02:35:08 +01002086used from within a callback function set by the sni_callback\n\
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01002087on the SSLContext to change the certificate information associated with the\n\
2088SSLSocket before the cryptographic exchange handshake messages\n");
2089
2090
Antoine Pitroub1fdf472014-10-05 20:41:53 +02002091static PyObject *
2092PySSL_get_server_side(PySSLSocket *self, void *c)
2093{
2094 return PyBool_FromLong(self->socket_type == PY_SSL_SERVER);
2095}
2096
2097PyDoc_STRVAR(PySSL_get_server_side_doc,
2098"Whether this is a server-side socket.");
2099
2100static PyObject *
2101PySSL_get_server_hostname(PySSLSocket *self, void *c)
2102{
2103 if (self->server_hostname == NULL)
2104 Py_RETURN_NONE;
2105 Py_INCREF(self->server_hostname);
2106 return self->server_hostname;
2107}
2108
2109PyDoc_STRVAR(PySSL_get_server_hostname_doc,
2110"The currently set server hostname (for SNI).");
2111
2112static PyObject *
2113PySSL_get_owner(PySSLSocket *self, void *c)
2114{
2115 PyObject *owner;
2116
2117 if (self->owner == NULL)
2118 Py_RETURN_NONE;
2119
2120 owner = PyWeakref_GetObject(self->owner);
2121 Py_INCREF(owner);
2122 return owner;
2123}
2124
2125static int
2126PySSL_set_owner(PySSLSocket *self, PyObject *value, void *c)
2127{
Serhiy Storchaka48842712016-04-06 09:45:48 +03002128 Py_XSETREF(self->owner, PyWeakref_NewRef(value, NULL));
Antoine Pitroub1fdf472014-10-05 20:41:53 +02002129 if (self->owner == NULL)
2130 return -1;
2131 return 0;
2132}
2133
2134PyDoc_STRVAR(PySSL_get_owner_doc,
2135"The Python-level owner of this object.\
2136Passed as \"self\" in servername callback.");
2137
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01002138
Antoine Pitrou152efa22010-05-16 18:19:27 +00002139static void PySSL_dealloc(PySSLSocket *self)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002140{
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002141 if (self->ssl)
2142 SSL_free(self->ssl);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002143 Py_XDECREF(self->Socket);
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01002144 Py_XDECREF(self->ctx);
Antoine Pitroub1fdf472014-10-05 20:41:53 +02002145 Py_XDECREF(self->server_hostname);
2146 Py_XDECREF(self->owner);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002147 PyObject_Del(self);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002148}
2149
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002150/* If the socket has a timeout, do a select()/poll() on the socket.
Guido van Rossum99d4abf2003-01-27 22:22:50 +00002151 The argument writing indicates the direction.
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00002152 Returns one of the possibilities in the timeout_state enum (above).
Guido van Rossum99d4abf2003-01-27 22:22:50 +00002153 */
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00002154
Guido van Rossum99d4abf2003-01-27 22:22:50 +00002155static int
Victor Stinner14690702015-04-06 22:46:13 +02002156PySSL_select(PySocketSockObject *s, int writing, _PyTime_t timeout)
Guido van Rossum99d4abf2003-01-27 22:22:50 +00002157{
Victor Stinner4e3cfa42015-04-02 21:28:28 +02002158 int rc;
2159#ifdef HAVE_POLL
2160 struct pollfd pollfd;
2161 _PyTime_t ms;
2162#else
2163 int nfds;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002164 fd_set fds;
2165 struct timeval tv;
Victor Stinner4e3cfa42015-04-02 21:28:28 +02002166#endif
Guido van Rossum99d4abf2003-01-27 22:22:50 +00002167
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002168 /* Nothing to do unless we're in timeout mode (not non-blocking) */
Victor Stinner14690702015-04-06 22:46:13 +02002169 if ((s == NULL) || (timeout == 0))
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002170 return SOCKET_IS_NONBLOCKING;
Victor Stinner14690702015-04-06 22:46:13 +02002171 else if (timeout < 0) {
2172 if (s->sock_timeout > 0)
2173 return SOCKET_HAS_TIMED_OUT;
2174 else
2175 return SOCKET_IS_BLOCKING;
2176 }
Guido van Rossum99d4abf2003-01-27 22:22:50 +00002177
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002178 /* Guard against closed socket */
Victor Stinner524714e2016-07-22 17:43:59 +02002179 if (s->sock_fd == INVALID_SOCKET)
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002180 return SOCKET_HAS_BEEN_CLOSED;
Guido van Rossum99d4abf2003-01-27 22:22:50 +00002181
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002182 /* Prefer poll, if available, since you can poll() any fd
2183 * which can't be done with select(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002184#ifdef HAVE_POLL
Victor Stinner4e3cfa42015-04-02 21:28:28 +02002185 pollfd.fd = s->sock_fd;
2186 pollfd.events = writing ? POLLOUT : POLLIN;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002187
Victor Stinner14690702015-04-06 22:46:13 +02002188 /* timeout is in seconds, poll() uses milliseconds */
2189 ms = (int)_PyTime_AsMilliseconds(timeout, _PyTime_ROUND_CEILING);
Victor Stinner4e3cfa42015-04-02 21:28:28 +02002190 assert(ms <= INT_MAX);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002191
Victor Stinner4e3cfa42015-04-02 21:28:28 +02002192 PySSL_BEGIN_ALLOW_THREADS
2193 rc = poll(&pollfd, 1, (int)ms);
2194 PySSL_END_ALLOW_THREADS
2195#else
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002196 /* Guard against socket too large for select*/
Charles-François Nataliaa26b272011-08-28 17:51:43 +02002197 if (!_PyIsSelectable_fd(s->sock_fd))
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002198 return SOCKET_TOO_LARGE_FOR_SELECT;
Neal Norwitz082b2df2006-02-07 07:04:46 +00002199
Victor Stinner14690702015-04-06 22:46:13 +02002200 _PyTime_AsTimeval_noraise(timeout, &tv, _PyTime_ROUND_CEILING);
Victor Stinnere2452312015-03-28 03:00:46 +01002201
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002202 FD_ZERO(&fds);
2203 FD_SET(s->sock_fd, &fds);
Guido van Rossum99d4abf2003-01-27 22:22:50 +00002204
Victor Stinner4e3cfa42015-04-02 21:28:28 +02002205 /* Wait until the socket becomes ready */
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002206 PySSL_BEGIN_ALLOW_THREADS
Victor Stinner4e3cfa42015-04-02 21:28:28 +02002207 nfds = Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002208 if (writing)
Victor Stinner4e3cfa42015-04-02 21:28:28 +02002209 rc = select(nfds, NULL, &fds, NULL, &tv);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002210 else
Victor Stinner4e3cfa42015-04-02 21:28:28 +02002211 rc = select(nfds, &fds, NULL, NULL, &tv);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002212 PySSL_END_ALLOW_THREADS
Bill Janssen6e027db2007-11-15 22:23:56 +00002213#endif
Victor Stinner4e3cfa42015-04-02 21:28:28 +02002214
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002215 /* Return SOCKET_TIMED_OUT on timeout, SOCKET_OPERATION_OK otherwise
2216 (when we are able to write or when there's something to read) */
2217 return rc == 0 ? SOCKET_HAS_TIMED_OUT : SOCKET_OPERATION_OK;
Guido van Rossum99d4abf2003-01-27 22:22:50 +00002218}
2219
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002220/*[clinic input]
2221_ssl._SSLSocket.write
2222 b: Py_buffer
2223 /
2224
2225Writes the bytes-like object b into the SSL object.
2226
2227Returns the number of bytes written.
2228[clinic start generated code]*/
2229
2230static PyObject *
2231_ssl__SSLSocket_write_impl(PySSLSocket *self, Py_buffer *b)
2232/*[clinic end generated code: output=aa7a6be5527358d8 input=77262d994fe5100a]*/
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002233{
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002234 int len;
2235 int sockstate;
Steve Dowerc6fd1c12018-09-17 11:34:47 -07002236 _PySSLError err;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002237 int nonblocking;
Antoine Pitroub1fdf472014-10-05 20:41:53 +02002238 PySocketSockObject *sock = GET_SOCKET(self);
Victor Stinner14690702015-04-06 22:46:13 +02002239 _PyTime_t timeout, deadline = 0;
2240 int has_timeout;
Bill Janssen54cc54c2007-12-14 22:08:56 +00002241
Antoine Pitroub1fdf472014-10-05 20:41:53 +02002242 if (sock != NULL) {
2243 if (((PyObject*)sock) == Py_None) {
2244 _setSSLError("Underlying socket connection gone",
2245 PY_SSL_ERROR_NO_SOCKET, __FILE__, __LINE__);
2246 return NULL;
2247 }
2248 Py_INCREF(sock);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002249 }
2250
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002251 if (b->len > INT_MAX) {
Victor Stinner6efa9652013-06-25 00:42:31 +02002252 PyErr_Format(PyExc_OverflowError,
2253 "string longer than %d bytes", INT_MAX);
2254 goto error;
2255 }
2256
Antoine Pitroub1fdf472014-10-05 20:41:53 +02002257 if (sock != NULL) {
2258 /* just in case the blocking state of the socket has been changed */
Victor Stinnere2452312015-03-28 03:00:46 +01002259 nonblocking = (sock->sock_timeout >= 0);
Antoine Pitroub1fdf472014-10-05 20:41:53 +02002260 BIO_set_nbio(SSL_get_rbio(self->ssl), nonblocking);
2261 BIO_set_nbio(SSL_get_wbio(self->ssl), nonblocking);
2262 }
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002263
Victor Stinner14690702015-04-06 22:46:13 +02002264 timeout = GET_SOCKET_TIMEOUT(sock);
2265 has_timeout = (timeout > 0);
2266 if (has_timeout)
2267 deadline = _PyTime_GetMonotonicClock() + timeout;
2268
2269 sockstate = PySSL_select(sock, 1, timeout);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002270 if (sockstate == SOCKET_HAS_TIMED_OUT) {
Antoine Pitrouc4df7842010-12-03 19:59:41 +00002271 PyErr_SetString(PySocketModule.timeout_error,
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002272 "The write operation timed out");
2273 goto error;
2274 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
2275 PyErr_SetString(PySSLErrorObject,
2276 "Underlying socket has been closed.");
2277 goto error;
2278 } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
2279 PyErr_SetString(PySSLErrorObject,
2280 "Underlying socket too large for select().");
2281 goto error;
2282 }
Victor Stinner4e3cfa42015-04-02 21:28:28 +02002283
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002284 do {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002285 PySSL_BEGIN_ALLOW_THREADS
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002286 len = SSL_write(self->ssl, b->buf, (int)b->len);
Steve Dowerc6fd1c12018-09-17 11:34:47 -07002287 err = _PySSL_errno(len <= 0, self->ssl, len);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002288 PySSL_END_ALLOW_THREADS
Steve Dowerc6fd1c12018-09-17 11:34:47 -07002289 self->err = err;
Victor Stinner4e3cfa42015-04-02 21:28:28 +02002290
2291 if (PyErr_CheckSignals())
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002292 goto error;
Victor Stinner4e3cfa42015-04-02 21:28:28 +02002293
Victor Stinner14690702015-04-06 22:46:13 +02002294 if (has_timeout)
2295 timeout = deadline - _PyTime_GetMonotonicClock();
2296
Steve Dowerc6fd1c12018-09-17 11:34:47 -07002297 if (err.ssl == SSL_ERROR_WANT_READ) {
Victor Stinner14690702015-04-06 22:46:13 +02002298 sockstate = PySSL_select(sock, 0, timeout);
Steve Dowerc6fd1c12018-09-17 11:34:47 -07002299 } else if (err.ssl == SSL_ERROR_WANT_WRITE) {
Victor Stinner14690702015-04-06 22:46:13 +02002300 sockstate = PySSL_select(sock, 1, timeout);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002301 } else {
2302 sockstate = SOCKET_OPERATION_OK;
2303 }
Victor Stinner4e3cfa42015-04-02 21:28:28 +02002304
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002305 if (sockstate == SOCKET_HAS_TIMED_OUT) {
Antoine Pitrouc4df7842010-12-03 19:59:41 +00002306 PyErr_SetString(PySocketModule.timeout_error,
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002307 "The write operation timed out");
2308 goto error;
2309 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
2310 PyErr_SetString(PySSLErrorObject,
2311 "Underlying socket has been closed.");
2312 goto error;
2313 } else if (sockstate == SOCKET_IS_NONBLOCKING) {
2314 break;
2315 }
Steve Dowerc6fd1c12018-09-17 11:34:47 -07002316 } while (err.ssl == SSL_ERROR_WANT_READ ||
2317 err.ssl == SSL_ERROR_WANT_WRITE);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002318
Antoine Pitroub1fdf472014-10-05 20:41:53 +02002319 Py_XDECREF(sock);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002320 if (len > 0)
2321 return PyLong_FromLong(len);
2322 else
2323 return PySSL_SetError(self, len, __FILE__, __LINE__);
Antoine Pitrou7d7aede2009-11-25 18:55:32 +00002324
2325error:
Antoine Pitroub1fdf472014-10-05 20:41:53 +02002326 Py_XDECREF(sock);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002327 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002328}
2329
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002330/*[clinic input]
2331_ssl._SSLSocket.pending
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002332
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002333Returns the number of already decrypted bytes available for read, pending on the connection.
2334[clinic start generated code]*/
2335
2336static PyObject *
2337_ssl__SSLSocket_pending_impl(PySSLSocket *self)
2338/*[clinic end generated code: output=983d9fecdc308a83 input=2b77487d6dfd597f]*/
Bill Janssen6e027db2007-11-15 22:23:56 +00002339{
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002340 int count = 0;
Steve Dowerc6fd1c12018-09-17 11:34:47 -07002341 _PySSLError err;
Bill Janssen6e027db2007-11-15 22:23:56 +00002342
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002343 PySSL_BEGIN_ALLOW_THREADS
2344 count = SSL_pending(self->ssl);
Steve Dowerc6fd1c12018-09-17 11:34:47 -07002345 err = _PySSL_errno(count < 0, self->ssl, count);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002346 PySSL_END_ALLOW_THREADS
Steve Dowerc6fd1c12018-09-17 11:34:47 -07002347 self->err = err;
2348
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002349 if (count < 0)
2350 return PySSL_SetError(self, count, __FILE__, __LINE__);
2351 else
2352 return PyLong_FromLong(count);
Bill Janssen6e027db2007-11-15 22:23:56 +00002353}
2354
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002355/*[clinic input]
2356_ssl._SSLSocket.read
2357 size as len: int
2358 [
Larry Hastingsdbfdc382015-05-04 06:59:46 -07002359 buffer: Py_buffer(accept={rwbuffer})
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002360 ]
2361 /
Bill Janssen6e027db2007-11-15 22:23:56 +00002362
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002363Read up to size bytes from the SSL socket.
2364[clinic start generated code]*/
2365
2366static PyObject *
2367_ssl__SSLSocket_read_impl(PySSLSocket *self, int len, int group_right_1,
2368 Py_buffer *buffer)
Larry Hastingsdbfdc382015-05-04 06:59:46 -07002369/*[clinic end generated code: output=00097776cec2a0af input=ff157eb918d0905b]*/
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002370{
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002371 PyObject *dest = NULL;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002372 char *mem;
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002373 int count;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002374 int sockstate;
Steve Dowerc6fd1c12018-09-17 11:34:47 -07002375 _PySSLError err;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002376 int nonblocking;
Antoine Pitroub1fdf472014-10-05 20:41:53 +02002377 PySocketSockObject *sock = GET_SOCKET(self);
Victor Stinner14690702015-04-06 22:46:13 +02002378 _PyTime_t timeout, deadline = 0;
2379 int has_timeout;
Bill Janssen54cc54c2007-12-14 22:08:56 +00002380
Martin Panter5503d472016-03-27 05:35:19 +00002381 if (!group_right_1 && len < 0) {
2382 PyErr_SetString(PyExc_ValueError, "size should not be negative");
2383 return NULL;
2384 }
2385
Antoine Pitroub1fdf472014-10-05 20:41:53 +02002386 if (sock != NULL) {
2387 if (((PyObject*)sock) == Py_None) {
2388 _setSSLError("Underlying socket connection gone",
2389 PY_SSL_ERROR_NO_SOCKET, __FILE__, __LINE__);
2390 return NULL;
2391 }
2392 Py_INCREF(sock);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002393 }
2394
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002395 if (!group_right_1) {
Antoine Pitrou24e561a2010-09-03 18:38:17 +00002396 dest = PyBytes_FromStringAndSize(NULL, len);
2397 if (dest == NULL)
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +00002398 goto error;
Martin Panterbed7f1a2016-07-11 00:17:13 +00002399 if (len == 0) {
2400 Py_XDECREF(sock);
2401 return dest;
2402 }
Antoine Pitrou24e561a2010-09-03 18:38:17 +00002403 mem = PyBytes_AS_STRING(dest);
2404 }
2405 else {
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002406 mem = buffer->buf;
2407 if (len <= 0 || len > buffer->len) {
2408 len = (int) buffer->len;
2409 if (buffer->len != len) {
Antoine Pitrou24e561a2010-09-03 18:38:17 +00002410 PyErr_SetString(PyExc_OverflowError,
2411 "maximum length can't fit in a C 'int'");
2412 goto error;
2413 }
Martin Panterbed7f1a2016-07-11 00:17:13 +00002414 if (len == 0) {
2415 count = 0;
2416 goto done;
2417 }
Antoine Pitrou24e561a2010-09-03 18:38:17 +00002418 }
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002419 }
2420
Antoine Pitroub1fdf472014-10-05 20:41:53 +02002421 if (sock != NULL) {
2422 /* just in case the blocking state of the socket has been changed */
Victor Stinnere2452312015-03-28 03:00:46 +01002423 nonblocking = (sock->sock_timeout >= 0);
Antoine Pitroub1fdf472014-10-05 20:41:53 +02002424 BIO_set_nbio(SSL_get_rbio(self->ssl), nonblocking);
2425 BIO_set_nbio(SSL_get_wbio(self->ssl), nonblocking);
2426 }
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002427
Victor Stinner14690702015-04-06 22:46:13 +02002428 timeout = GET_SOCKET_TIMEOUT(sock);
2429 has_timeout = (timeout > 0);
2430 if (has_timeout)
2431 deadline = _PyTime_GetMonotonicClock() + timeout;
2432
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002433 do {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002434 PySSL_BEGIN_ALLOW_THREADS
2435 count = SSL_read(self->ssl, mem, len);
Steve Dowerc6fd1c12018-09-17 11:34:47 -07002436 err = _PySSL_errno(count <= 0, self->ssl, count);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002437 PySSL_END_ALLOW_THREADS
Steve Dowerc6fd1c12018-09-17 11:34:47 -07002438 self->err = err;
Victor Stinner4e3cfa42015-04-02 21:28:28 +02002439
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002440 if (PyErr_CheckSignals())
2441 goto error;
Victor Stinner4e3cfa42015-04-02 21:28:28 +02002442
Victor Stinner14690702015-04-06 22:46:13 +02002443 if (has_timeout)
2444 timeout = deadline - _PyTime_GetMonotonicClock();
2445
Steve Dowerc6fd1c12018-09-17 11:34:47 -07002446 if (err.ssl == SSL_ERROR_WANT_READ) {
Victor Stinner14690702015-04-06 22:46:13 +02002447 sockstate = PySSL_select(sock, 0, timeout);
Steve Dowerc6fd1c12018-09-17 11:34:47 -07002448 } else if (err.ssl == SSL_ERROR_WANT_WRITE) {
Victor Stinner14690702015-04-06 22:46:13 +02002449 sockstate = PySSL_select(sock, 1, timeout);
Steve Dowerc6fd1c12018-09-17 11:34:47 -07002450 } else if (err.ssl == SSL_ERROR_ZERO_RETURN &&
Victor Stinner4e3cfa42015-04-02 21:28:28 +02002451 SSL_get_shutdown(self->ssl) == SSL_RECEIVED_SHUTDOWN)
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002452 {
2453 count = 0;
2454 goto done;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002455 }
Victor Stinner4e3cfa42015-04-02 21:28:28 +02002456 else
2457 sockstate = SOCKET_OPERATION_OK;
2458
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002459 if (sockstate == SOCKET_HAS_TIMED_OUT) {
Antoine Pitrouc4df7842010-12-03 19:59:41 +00002460 PyErr_SetString(PySocketModule.timeout_error,
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002461 "The read operation timed out");
2462 goto error;
2463 } else if (sockstate == SOCKET_IS_NONBLOCKING) {
2464 break;
2465 }
Steve Dowerc6fd1c12018-09-17 11:34:47 -07002466 } while (err.ssl == SSL_ERROR_WANT_READ ||
2467 err.ssl == SSL_ERROR_WANT_WRITE);
Victor Stinner4e3cfa42015-04-02 21:28:28 +02002468
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002469 if (count <= 0) {
2470 PySSL_SetError(self, count, __FILE__, __LINE__);
2471 goto error;
2472 }
Antoine Pitrou24e561a2010-09-03 18:38:17 +00002473
2474done:
Antoine Pitroub1fdf472014-10-05 20:41:53 +02002475 Py_XDECREF(sock);
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002476 if (!group_right_1) {
Antoine Pitrou24e561a2010-09-03 18:38:17 +00002477 _PyBytes_Resize(&dest, count);
2478 return dest;
2479 }
2480 else {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002481 return PyLong_FromLong(count);
2482 }
Antoine Pitrou24e561a2010-09-03 18:38:17 +00002483
2484error:
Antoine Pitroub1fdf472014-10-05 20:41:53 +02002485 Py_XDECREF(sock);
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002486 if (!group_right_1)
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +00002487 Py_XDECREF(dest);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002488 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002489}
2490
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002491/*[clinic input]
2492_ssl._SSLSocket.shutdown
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002493
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002494Does the SSL shutdown handshake with the remote end.
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002495[clinic start generated code]*/
2496
2497static PyObject *
2498_ssl__SSLSocket_shutdown_impl(PySSLSocket *self)
Christian Heimes141c5e82018-02-24 21:10:57 +01002499/*[clinic end generated code: output=ca1aa7ed9d25ca42 input=11d39e69b0a2bf4a]*/
Bill Janssen40a0f662008-08-12 16:56:25 +00002500{
Steve Dowerc6fd1c12018-09-17 11:34:47 -07002501 _PySSLError err;
2502 int sockstate, nonblocking, ret;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002503 int zeros = 0;
Antoine Pitroub1fdf472014-10-05 20:41:53 +02002504 PySocketSockObject *sock = GET_SOCKET(self);
Victor Stinner14690702015-04-06 22:46:13 +02002505 _PyTime_t timeout, deadline = 0;
2506 int has_timeout;
Bill Janssen40a0f662008-08-12 16:56:25 +00002507
Antoine Pitroub1fdf472014-10-05 20:41:53 +02002508 if (sock != NULL) {
2509 /* Guard against closed socket */
Victor Stinner524714e2016-07-22 17:43:59 +02002510 if ((((PyObject*)sock) == Py_None) || (sock->sock_fd == INVALID_SOCKET)) {
Antoine Pitroub1fdf472014-10-05 20:41:53 +02002511 _setSSLError("Underlying socket connection gone",
2512 PY_SSL_ERROR_NO_SOCKET, __FILE__, __LINE__);
2513 return NULL;
2514 }
2515 Py_INCREF(sock);
2516
2517 /* Just in case the blocking state of the socket has been changed */
Victor Stinnere2452312015-03-28 03:00:46 +01002518 nonblocking = (sock->sock_timeout >= 0);
Antoine Pitroub1fdf472014-10-05 20:41:53 +02002519 BIO_set_nbio(SSL_get_rbio(self->ssl), nonblocking);
2520 BIO_set_nbio(SSL_get_wbio(self->ssl), nonblocking);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002521 }
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002522
Victor Stinner14690702015-04-06 22:46:13 +02002523 timeout = GET_SOCKET_TIMEOUT(sock);
2524 has_timeout = (timeout > 0);
2525 if (has_timeout)
2526 deadline = _PyTime_GetMonotonicClock() + timeout;
2527
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002528 while (1) {
2529 PySSL_BEGIN_ALLOW_THREADS
2530 /* Disable read-ahead so that unwrap can work correctly.
2531 * Otherwise OpenSSL might read in too much data,
2532 * eating clear text data that happens to be
2533 * transmitted after the SSL shutdown.
Ezio Melotti85a86292013-08-17 16:57:41 +03002534 * Should be safe to call repeatedly every time this
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002535 * function is used and the shutdown_seen_zero != 0
2536 * condition is met.
2537 */
2538 if (self->shutdown_seen_zero)
2539 SSL_set_read_ahead(self->ssl, 0);
Steve Dowerc6fd1c12018-09-17 11:34:47 -07002540 ret = SSL_shutdown(self->ssl);
2541 err = _PySSL_errno(ret < 0, self->ssl, ret);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002542 PySSL_END_ALLOW_THREADS
Steve Dowerc6fd1c12018-09-17 11:34:47 -07002543 self->err = err;
Victor Stinner4e3cfa42015-04-02 21:28:28 +02002544
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002545 /* If err == 1, a secure shutdown with SSL_shutdown() is complete */
Steve Dowerc6fd1c12018-09-17 11:34:47 -07002546 if (ret > 0)
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002547 break;
Steve Dowerc6fd1c12018-09-17 11:34:47 -07002548 if (ret == 0) {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002549 /* Don't loop endlessly; instead preserve legacy
2550 behaviour of trying SSL_shutdown() only twice.
2551 This looks necessary for OpenSSL < 0.9.8m */
2552 if (++zeros > 1)
2553 break;
2554 /* Shutdown was sent, now try receiving */
2555 self->shutdown_seen_zero = 1;
2556 continue;
Bill Janssen40a0f662008-08-12 16:56:25 +00002557 }
2558
Victor Stinner14690702015-04-06 22:46:13 +02002559 if (has_timeout)
2560 timeout = deadline - _PyTime_GetMonotonicClock();
2561
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002562 /* Possibly retry shutdown until timeout or failure */
Steve Dowerc6fd1c12018-09-17 11:34:47 -07002563 if (err.ssl == SSL_ERROR_WANT_READ)
Victor Stinner14690702015-04-06 22:46:13 +02002564 sockstate = PySSL_select(sock, 0, timeout);
Steve Dowerc6fd1c12018-09-17 11:34:47 -07002565 else if (err.ssl == SSL_ERROR_WANT_WRITE)
Victor Stinner14690702015-04-06 22:46:13 +02002566 sockstate = PySSL_select(sock, 1, timeout);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002567 else
2568 break;
Victor Stinner4e3cfa42015-04-02 21:28:28 +02002569
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002570 if (sockstate == SOCKET_HAS_TIMED_OUT) {
Steve Dowerc6fd1c12018-09-17 11:34:47 -07002571 if (err.ssl == SSL_ERROR_WANT_READ)
Antoine Pitrouc4df7842010-12-03 19:59:41 +00002572 PyErr_SetString(PySocketModule.timeout_error,
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002573 "The read operation timed out");
2574 else
Antoine Pitrouc4df7842010-12-03 19:59:41 +00002575 PyErr_SetString(PySocketModule.timeout_error,
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002576 "The write operation timed out");
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +00002577 goto error;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002578 }
2579 else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
2580 PyErr_SetString(PySSLErrorObject,
2581 "Underlying socket too large for select().");
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +00002582 goto error;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002583 }
2584 else if (sockstate != SOCKET_OPERATION_OK)
2585 /* Retain the SSL error code */
2586 break;
2587 }
Antoine Pitrou2c4f98b2010-04-23 00:16:21 +00002588
Nathaniel J. Smithc0da5822018-09-21 21:44:12 -07002589 if (ret < 0) {
Antoine Pitroub1fdf472014-10-05 20:41:53 +02002590 Py_XDECREF(sock);
Nathaniel J. Smithc0da5822018-09-21 21:44:12 -07002591 return PySSL_SetError(self, ret, __FILE__, __LINE__);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002592 }
Antoine Pitroub1fdf472014-10-05 20:41:53 +02002593 if (sock)
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +00002594 /* It's already INCREF'ed */
2595 return (PyObject *) sock;
Antoine Pitroub1fdf472014-10-05 20:41:53 +02002596 else
2597 Py_RETURN_NONE;
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +00002598
2599error:
Antoine Pitroub1fdf472014-10-05 20:41:53 +02002600 Py_XDECREF(sock);
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +00002601 return NULL;
Bill Janssen40a0f662008-08-12 16:56:25 +00002602}
2603
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002604/*[clinic input]
Christian Heimes141c5e82018-02-24 21:10:57 +01002605_ssl._SSLSocket.get_channel_binding
2606 cb_type: str = "tls-unique"
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002607
Christian Heimes141c5e82018-02-24 21:10:57 +01002608Get channel binding data for current connection.
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002609
Christian Heimes141c5e82018-02-24 21:10:57 +01002610Raise ValueError if the requested `cb_type` is not supported. Return bytes
2611of the data or None if the data is not available (e.g. before the handshake).
2612Only 'tls-unique' channel binding data from RFC 5929 is supported.
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002613[clinic start generated code]*/
Bill Janssen40a0f662008-08-12 16:56:25 +00002614
Antoine Pitroud6494802011-07-21 01:11:30 +02002615static PyObject *
Christian Heimes141c5e82018-02-24 21:10:57 +01002616_ssl__SSLSocket_get_channel_binding_impl(PySSLSocket *self,
2617 const char *cb_type)
2618/*[clinic end generated code: output=34bac9acb6a61d31 input=08b7e43b99c17d41]*/
Antoine Pitroud6494802011-07-21 01:11:30 +02002619{
Antoine Pitroud6494802011-07-21 01:11:30 +02002620 char buf[PySSL_CB_MAXLEN];
Victor Stinner9ee02032013-06-23 15:08:23 +02002621 size_t len;
Antoine Pitroud6494802011-07-21 01:11:30 +02002622
Christian Heimes141c5e82018-02-24 21:10:57 +01002623 if (strcmp(cb_type, "tls-unique") == 0) {
2624 if (SSL_session_reused(self->ssl) ^ !self->socket_type) {
2625 /* if session is resumed XOR we are the client */
2626 len = SSL_get_finished(self->ssl, buf, PySSL_CB_MAXLEN);
2627 }
2628 else {
2629 /* if a new session XOR we are the server */
2630 len = SSL_get_peer_finished(self->ssl, buf, PySSL_CB_MAXLEN);
2631 }
Antoine Pitroud6494802011-07-21 01:11:30 +02002632 }
2633 else {
Christian Heimes141c5e82018-02-24 21:10:57 +01002634 PyErr_Format(
2635 PyExc_ValueError,
2636 "'%s' channel binding type not implemented",
2637 cb_type
2638 );
2639 return NULL;
Antoine Pitroud6494802011-07-21 01:11:30 +02002640 }
2641
2642 /* It cannot be negative in current OpenSSL version as of July 2011 */
Antoine Pitroud6494802011-07-21 01:11:30 +02002643 if (len == 0)
2644 Py_RETURN_NONE;
2645
Christian Heimes141c5e82018-02-24 21:10:57 +01002646 return PyBytes_FromStringAndSize(buf, len);
Antoine Pitroud6494802011-07-21 01:11:30 +02002647}
2648
Christian Heimes9fb051f2018-09-23 08:32:31 +02002649/*[clinic input]
2650_ssl._SSLSocket.verify_client_post_handshake
2651
2652Initiate TLS 1.3 post-handshake authentication
2653[clinic start generated code]*/
2654
2655static PyObject *
2656_ssl__SSLSocket_verify_client_post_handshake_impl(PySSLSocket *self)
2657/*[clinic end generated code: output=532147f3b1341425 input=6bfa874810a3d889]*/
2658{
2659#ifdef TLS1_3_VERSION
2660 int err = SSL_verify_client_post_handshake(self->ssl);
2661 if (err == 0)
2662 return _setSSLError(NULL, 0, __FILE__, __LINE__);
2663 else
2664 Py_RETURN_NONE;
2665#else
2666 PyErr_SetString(PyExc_NotImplementedError,
2667 "Post-handshake auth is not supported by your "
2668 "OpenSSL version.");
2669 return NULL;
2670#endif
2671}
2672
Christian Heimes99a65702016-09-10 23:44:53 +02002673#ifdef OPENSSL_VERSION_1_1
2674
2675static SSL_SESSION*
2676_ssl_session_dup(SSL_SESSION *session) {
2677 SSL_SESSION *newsession = NULL;
2678 int slen;
2679 unsigned char *senc = NULL, *p;
2680 const unsigned char *const_p;
2681
2682 if (session == NULL) {
2683 PyErr_SetString(PyExc_ValueError, "Invalid session");
2684 goto error;
2685 }
2686
2687 /* get length */
2688 slen = i2d_SSL_SESSION(session, NULL);
2689 if (slen == 0 || slen > 0xFF00) {
2690 PyErr_SetString(PyExc_ValueError, "i2d() failed.");
2691 goto error;
2692 }
2693 if ((senc = PyMem_Malloc(slen)) == NULL) {
2694 PyErr_NoMemory();
2695 goto error;
2696 }
2697 p = senc;
2698 if (!i2d_SSL_SESSION(session, &p)) {
2699 PyErr_SetString(PyExc_ValueError, "i2d() failed.");
2700 goto error;
2701 }
2702 const_p = senc;
2703 newsession = d2i_SSL_SESSION(NULL, &const_p, slen);
2704 if (session == NULL) {
2705 goto error;
2706 }
2707 PyMem_Free(senc);
2708 return newsession;
2709 error:
2710 if (senc != NULL) {
2711 PyMem_Free(senc);
2712 }
2713 return NULL;
2714}
2715#endif
2716
2717static PyObject *
2718PySSL_get_session(PySSLSocket *self, void *closure) {
2719 /* get_session can return sessions from a server-side connection,
2720 * it does not check for handshake done or client socket. */
2721 PySSLSession *pysess;
2722 SSL_SESSION *session;
2723
2724#ifdef OPENSSL_VERSION_1_1
2725 /* duplicate session as workaround for session bug in OpenSSL 1.1.0,
2726 * https://github.com/openssl/openssl/issues/1550 */
2727 session = SSL_get0_session(self->ssl); /* borrowed reference */
2728 if (session == NULL) {
2729 Py_RETURN_NONE;
2730 }
2731 if ((session = _ssl_session_dup(session)) == NULL) {
2732 return NULL;
2733 }
2734#else
2735 session = SSL_get1_session(self->ssl);
2736 if (session == NULL) {
2737 Py_RETURN_NONE;
2738 }
2739#endif
Christian Heimesa5d07652016-09-24 10:48:05 +02002740 pysess = PyObject_GC_New(PySSLSession, &PySSLSession_Type);
Christian Heimes99a65702016-09-10 23:44:53 +02002741 if (pysess == NULL) {
2742 SSL_SESSION_free(session);
2743 return NULL;
2744 }
2745
2746 assert(self->ctx);
2747 pysess->ctx = self->ctx;
2748 Py_INCREF(pysess->ctx);
2749 pysess->session = session;
Christian Heimesa5d07652016-09-24 10:48:05 +02002750 PyObject_GC_Track(pysess);
Christian Heimes99a65702016-09-10 23:44:53 +02002751 return (PyObject *)pysess;
2752}
2753
2754static int PySSL_set_session(PySSLSocket *self, PyObject *value,
2755 void *closure)
2756 {
2757 PySSLSession *pysess;
2758#ifdef OPENSSL_VERSION_1_1
2759 SSL_SESSION *session;
2760#endif
2761 int result;
2762
2763 if (!PySSLSession_Check(value)) {
Ned Deily4531ec72018-06-11 20:26:28 -04002764 PyErr_SetString(PyExc_TypeError, "Value is not a SSLSession.");
Christian Heimes99a65702016-09-10 23:44:53 +02002765 return -1;
2766 }
2767 pysess = (PySSLSession *)value;
2768
2769 if (self->ctx->ctx != pysess->ctx->ctx) {
2770 PyErr_SetString(PyExc_ValueError,
2771 "Session refers to a different SSLContext.");
2772 return -1;
2773 }
2774 if (self->socket_type != PY_SSL_CLIENT) {
2775 PyErr_SetString(PyExc_ValueError,
2776 "Cannot set session for server-side SSLSocket.");
2777 return -1;
2778 }
Christian Heimes66dc33b2017-05-23 16:02:02 -07002779 if (SSL_is_init_finished(self->ssl)) {
Christian Heimes99a65702016-09-10 23:44:53 +02002780 PyErr_SetString(PyExc_ValueError,
2781 "Cannot set session after handshake.");
2782 return -1;
2783 }
2784#ifdef OPENSSL_VERSION_1_1
2785 /* duplicate session */
2786 if ((session = _ssl_session_dup(pysess->session)) == NULL) {
2787 return -1;
2788 }
2789 result = SSL_set_session(self->ssl, session);
2790 /* free duplicate, SSL_set_session() bumps ref count */
2791 SSL_SESSION_free(session);
2792#else
2793 result = SSL_set_session(self->ssl, pysess->session);
2794#endif
2795 if (result == 0) {
2796 _setSSLError(NULL, 0, __FILE__, __LINE__);
2797 return -1;
2798 }
2799 return 0;
2800}
2801
2802PyDoc_STRVAR(PySSL_set_session_doc,
2803"_setter_session(session)\n\
2804\
2805Get / set SSLSession.");
2806
2807static PyObject *
2808PySSL_get_session_reused(PySSLSocket *self, void *closure) {
2809 if (SSL_session_reused(self->ssl)) {
2810 Py_RETURN_TRUE;
2811 } else {
2812 Py_RETURN_FALSE;
2813 }
2814}
2815
2816PyDoc_STRVAR(PySSL_get_session_reused_doc,
2817"Was the client session reused during handshake?");
2818
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01002819static PyGetSetDef ssl_getsetlist[] = {
2820 {"context", (getter) PySSL_get_context,
2821 (setter) PySSL_set_context, PySSL_set_context_doc},
Antoine Pitroub1fdf472014-10-05 20:41:53 +02002822 {"server_side", (getter) PySSL_get_server_side, NULL,
2823 PySSL_get_server_side_doc},
2824 {"server_hostname", (getter) PySSL_get_server_hostname, NULL,
2825 PySSL_get_server_hostname_doc},
2826 {"owner", (getter) PySSL_get_owner, (setter) PySSL_set_owner,
2827 PySSL_get_owner_doc},
Christian Heimes99a65702016-09-10 23:44:53 +02002828 {"session", (getter) PySSL_get_session,
2829 (setter) PySSL_set_session, PySSL_set_session_doc},
2830 {"session_reused", (getter) PySSL_get_session_reused, NULL,
2831 PySSL_get_session_reused_doc},
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01002832 {NULL}, /* sentinel */
2833};
2834
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002835static PyMethodDef PySSLMethods[] = {
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002836 _SSL__SSLSOCKET_DO_HANDSHAKE_METHODDEF
2837 _SSL__SSLSOCKET_WRITE_METHODDEF
2838 _SSL__SSLSOCKET_READ_METHODDEF
2839 _SSL__SSLSOCKET_PENDING_METHODDEF
Christian Heimes141c5e82018-02-24 21:10:57 +01002840 _SSL__SSLSOCKET_GETPEERCERT_METHODDEF
2841 _SSL__SSLSOCKET_GET_CHANNEL_BINDING_METHODDEF
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002842 _SSL__SSLSOCKET_CIPHER_METHODDEF
2843 _SSL__SSLSOCKET_SHARED_CIPHERS_METHODDEF
2844 _SSL__SSLSOCKET_VERSION_METHODDEF
2845 _SSL__SSLSOCKET_SELECTED_NPN_PROTOCOL_METHODDEF
2846 _SSL__SSLSOCKET_SELECTED_ALPN_PROTOCOL_METHODDEF
2847 _SSL__SSLSOCKET_COMPRESSION_METHODDEF
2848 _SSL__SSLSOCKET_SHUTDOWN_METHODDEF
Christian Heimes9fb051f2018-09-23 08:32:31 +02002849 _SSL__SSLSOCKET_VERIFY_CLIENT_POST_HANDSHAKE_METHODDEF
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002850 {NULL, NULL}
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002851};
2852
Antoine Pitrou152efa22010-05-16 18:19:27 +00002853static PyTypeObject PySSLSocket_Type = {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002854 PyVarObject_HEAD_INIT(NULL, 0)
Antoine Pitrou152efa22010-05-16 18:19:27 +00002855 "_ssl._SSLSocket", /*tp_name*/
2856 sizeof(PySSLSocket), /*tp_basicsize*/
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002857 0, /*tp_itemsize*/
2858 /* methods */
2859 (destructor)PySSL_dealloc, /*tp_dealloc*/
2860 0, /*tp_print*/
2861 0, /*tp_getattr*/
2862 0, /*tp_setattr*/
2863 0, /*tp_reserved*/
2864 0, /*tp_repr*/
2865 0, /*tp_as_number*/
2866 0, /*tp_as_sequence*/
2867 0, /*tp_as_mapping*/
2868 0, /*tp_hash*/
2869 0, /*tp_call*/
2870 0, /*tp_str*/
2871 0, /*tp_getattro*/
2872 0, /*tp_setattro*/
2873 0, /*tp_as_buffer*/
2874 Py_TPFLAGS_DEFAULT, /*tp_flags*/
2875 0, /*tp_doc*/
2876 0, /*tp_traverse*/
2877 0, /*tp_clear*/
2878 0, /*tp_richcompare*/
2879 0, /*tp_weaklistoffset*/
2880 0, /*tp_iter*/
2881 0, /*tp_iternext*/
2882 PySSLMethods, /*tp_methods*/
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01002883 0, /*tp_members*/
2884 ssl_getsetlist, /*tp_getset*/
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002885};
2886
Antoine Pitrou152efa22010-05-16 18:19:27 +00002887
2888/*
2889 * _SSLContext objects
2890 */
2891
Christian Heimes5fe668c2016-09-12 00:01:11 +02002892static int
Christian Heimes9fb051f2018-09-23 08:32:31 +02002893_set_verify_mode(PySSLContext *self, enum py_ssl_cert_requirements n)
Christian Heimes5fe668c2016-09-12 00:01:11 +02002894{
2895 int mode;
2896 int (*verify_cb)(int, X509_STORE_CTX *) = NULL;
2897
2898 switch(n) {
2899 case PY_SSL_CERT_NONE:
2900 mode = SSL_VERIFY_NONE;
2901 break;
2902 case PY_SSL_CERT_OPTIONAL:
2903 mode = SSL_VERIFY_PEER;
2904 break;
2905 case PY_SSL_CERT_REQUIRED:
2906 mode = SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT;
2907 break;
2908 default:
2909 PyErr_SetString(PyExc_ValueError,
2910 "invalid value for verify_mode");
2911 return -1;
2912 }
Christian Heimes9fb051f2018-09-23 08:32:31 +02002913#ifdef TLS1_3_VERSION
2914 if (self->post_handshake_auth)
2915 mode |= SSL_VERIFY_POST_HANDSHAKE;
2916#endif
Christian Heimes5fe668c2016-09-12 00:01:11 +02002917 /* keep current verify cb */
Christian Heimes9fb051f2018-09-23 08:32:31 +02002918 verify_cb = SSL_CTX_get_verify_callback(self->ctx);
2919 SSL_CTX_set_verify(self->ctx, mode, verify_cb);
Christian Heimes5fe668c2016-09-12 00:01:11 +02002920 return 0;
2921}
2922
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002923/*[clinic input]
2924@classmethod
2925_ssl._SSLContext.__new__
2926 protocol as proto_version: int
2927 /
2928[clinic start generated code]*/
2929
Antoine Pitrou152efa22010-05-16 18:19:27 +00002930static PyObject *
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002931_ssl__SSLContext_impl(PyTypeObject *type, int proto_version)
2932/*[clinic end generated code: output=2cf0d7a0741b6bd1 input=8d58a805b95fc534]*/
Antoine Pitrou152efa22010-05-16 18:19:27 +00002933{
Antoine Pitrou152efa22010-05-16 18:19:27 +00002934 PySSLContext *self;
Antoine Pitroucd3d7ca2014-01-09 20:02:20 +01002935 long options;
Antoine Pitrou152efa22010-05-16 18:19:27 +00002936 SSL_CTX *ctx = NULL;
Christian Heimes61d478c2018-01-27 15:51:38 +01002937 X509_VERIFY_PARAM *params;
Christian Heimes358cfd42016-09-10 22:43:48 +02002938 int result;
Berker Peksagdfcb0412016-04-14 16:48:48 +03002939#if defined(SSL_MODE_RELEASE_BUFFERS)
Benjamin Peterson3b1a8b32016-01-07 21:37:37 -08002940 unsigned long libver;
Berker Peksagdfcb0412016-04-14 16:48:48 +03002941#endif
Antoine Pitrou152efa22010-05-16 18:19:27 +00002942
Antoine Pitrou152efa22010-05-16 18:19:27 +00002943 PySSL_BEGIN_ALLOW_THREADS
2944 if (proto_version == PY_SSL_VERSION_TLS1)
2945 ctx = SSL_CTX_new(TLSv1_method());
Antoine Pitrou2463e5f2013-03-28 22:24:43 +01002946#if HAVE_TLSv1_2
2947 else if (proto_version == PY_SSL_VERSION_TLS1_1)
2948 ctx = SSL_CTX_new(TLSv1_1_method());
2949 else if (proto_version == PY_SSL_VERSION_TLS1_2)
2950 ctx = SSL_CTX_new(TLSv1_2_method());
2951#endif
Benjamin Petersone32467c2014-12-05 21:59:35 -05002952#ifndef OPENSSL_NO_SSL3
Antoine Pitrou152efa22010-05-16 18:19:27 +00002953 else if (proto_version == PY_SSL_VERSION_SSL3)
2954 ctx = SSL_CTX_new(SSLv3_method());
Benjamin Petersone32467c2014-12-05 21:59:35 -05002955#endif
Victor Stinner3de49192011-05-09 00:42:58 +02002956#ifndef OPENSSL_NO_SSL2
Antoine Pitrou152efa22010-05-16 18:19:27 +00002957 else if (proto_version == PY_SSL_VERSION_SSL2)
2958 ctx = SSL_CTX_new(SSLv2_method());
Victor Stinner3de49192011-05-09 00:42:58 +02002959#endif
Christian Heimes5fe668c2016-09-12 00:01:11 +02002960 else if (proto_version == PY_SSL_VERSION_TLS) /* SSLv23 */
Christian Heimes598894f2016-09-05 23:19:05 +02002961 ctx = SSL_CTX_new(TLS_method());
Christian Heimes5fe668c2016-09-12 00:01:11 +02002962 else if (proto_version == PY_SSL_VERSION_TLS_CLIENT)
2963 ctx = SSL_CTX_new(TLS_client_method());
2964 else if (proto_version == PY_SSL_VERSION_TLS_SERVER)
2965 ctx = SSL_CTX_new(TLS_server_method());
Antoine Pitrou152efa22010-05-16 18:19:27 +00002966 else
2967 proto_version = -1;
2968 PySSL_END_ALLOW_THREADS
2969
2970 if (proto_version == -1) {
2971 PyErr_SetString(PyExc_ValueError,
2972 "invalid protocol version");
2973 return NULL;
2974 }
2975 if (ctx == NULL) {
Christian Heimes17c9ac92017-09-07 14:14:00 -07002976 _setSSLError(NULL, 0, __FILE__, __LINE__);
Antoine Pitrou152efa22010-05-16 18:19:27 +00002977 return NULL;
2978 }
2979
2980 assert(type != NULL && type->tp_alloc != NULL);
2981 self = (PySSLContext *) type->tp_alloc(type, 0);
2982 if (self == NULL) {
2983 SSL_CTX_free(ctx);
2984 return NULL;
2985 }
2986 self->ctx = ctx;
Christian Heimes61d478c2018-01-27 15:51:38 +01002987 self->hostflags = X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS;
Christian Heimes11a14932018-02-24 02:35:08 +01002988 self->protocol = proto_version;
Christian Heimes29eab552018-02-25 12:31:33 +01002989#if HAVE_NPN
Christian Heimes5cb31c92012-09-20 12:42:54 +02002990 self->npn_protocols = NULL;
2991#endif
Christian Heimes29eab552018-02-25 12:31:33 +01002992#if HAVE_ALPN
Benjamin Petersoncca27322015-01-23 16:35:37 -05002993 self->alpn_protocols = NULL;
2994#endif
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01002995#ifndef OPENSSL_NO_TLSEXT
Christian Heimes11a14932018-02-24 02:35:08 +01002996 self->set_sni_cb = NULL;
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01002997#endif
Christian Heimes1aa9a752013-12-02 02:41:19 +01002998 /* Don't check host name by default */
Christian Heimes5fe668c2016-09-12 00:01:11 +02002999 if (proto_version == PY_SSL_VERSION_TLS_CLIENT) {
3000 self->check_hostname = 1;
Christian Heimes9fb051f2018-09-23 08:32:31 +02003001 if (_set_verify_mode(self, PY_SSL_CERT_REQUIRED) == -1) {
Christian Heimes5fe668c2016-09-12 00:01:11 +02003002 Py_DECREF(self);
3003 return NULL;
3004 }
3005 } else {
3006 self->check_hostname = 0;
Christian Heimes9fb051f2018-09-23 08:32:31 +02003007 if (_set_verify_mode(self, PY_SSL_CERT_NONE) == -1) {
Christian Heimes5fe668c2016-09-12 00:01:11 +02003008 Py_DECREF(self);
3009 return NULL;
3010 }
3011 }
Antoine Pitrou152efa22010-05-16 18:19:27 +00003012 /* Defaults */
Antoine Pitroucd3d7ca2014-01-09 20:02:20 +01003013 options = SSL_OP_ALL & ~SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS;
3014 if (proto_version != PY_SSL_VERSION_SSL2)
3015 options |= SSL_OP_NO_SSLv2;
Benjamin Petersona9dcdab2015-11-11 22:38:41 -08003016 if (proto_version != PY_SSL_VERSION_SSL3)
3017 options |= SSL_OP_NO_SSLv3;
Christian Heimes358cfd42016-09-10 22:43:48 +02003018 /* Minimal security flags for server and client side context.
3019 * Client sockets ignore server-side parameters. */
3020#ifdef SSL_OP_NO_COMPRESSION
3021 options |= SSL_OP_NO_COMPRESSION;
3022#endif
3023#ifdef SSL_OP_CIPHER_SERVER_PREFERENCE
3024 options |= SSL_OP_CIPHER_SERVER_PREFERENCE;
3025#endif
3026#ifdef SSL_OP_SINGLE_DH_USE
3027 options |= SSL_OP_SINGLE_DH_USE;
3028#endif
3029#ifdef SSL_OP_SINGLE_ECDH_USE
3030 options |= SSL_OP_SINGLE_ECDH_USE;
3031#endif
Antoine Pitroucd3d7ca2014-01-09 20:02:20 +01003032 SSL_CTX_set_options(self->ctx, options);
Antoine Pitrou152efa22010-05-16 18:19:27 +00003033
Semen Zhydenko1295e112017-10-15 21:28:31 +02003034 /* A bare minimum cipher list without completely broken cipher suites.
Christian Heimes358cfd42016-09-10 22:43:48 +02003035 * It's far from perfect but gives users a better head start. */
3036 if (proto_version != PY_SSL_VERSION_SSL2) {
Christian Heimes892d66e2018-01-29 14:10:18 +01003037#if PY_SSL_DEFAULT_CIPHERS == 2
3038 /* stick to OpenSSL's default settings */
3039 result = 1;
3040#else
3041 result = SSL_CTX_set_cipher_list(ctx, PY_SSL_DEFAULT_CIPHER_STRING);
3042#endif
Christian Heimes358cfd42016-09-10 22:43:48 +02003043 } else {
3044 /* SSLv2 needs MD5 */
3045 result = SSL_CTX_set_cipher_list(ctx, "HIGH:!aNULL:!eNULL");
3046 }
3047 if (result == 0) {
3048 Py_DECREF(self);
3049 ERR_clear_error();
3050 PyErr_SetString(PySSLErrorObject,
3051 "No cipher can be selected.");
3052 return NULL;
3053 }
3054
Benjamin Peterson3b1a8b32016-01-07 21:37:37 -08003055#if defined(SSL_MODE_RELEASE_BUFFERS)
3056 /* Set SSL_MODE_RELEASE_BUFFERS. This potentially greatly reduces memory
3057 usage for no cost at all. However, don't do this for OpenSSL versions
3058 between 1.0.1 and 1.0.1h or 1.0.0 and 1.0.0m, which are affected by CVE
3059 2014-0198. I can't find exactly which beta fixed this CVE, so be
3060 conservative and assume it wasn't fixed until release. We do this check
3061 at runtime to avoid problems from the dynamic linker.
3062 See #25672 for more on this. */
3063 libver = SSLeay();
3064 if (!(libver >= 0x10001000UL && libver < 0x1000108fUL) &&
3065 !(libver >= 0x10000000UL && libver < 0x100000dfUL)) {
3066 SSL_CTX_set_mode(self->ctx, SSL_MODE_RELEASE_BUFFERS);
3067 }
3068#endif
3069
3070
Donald Stufft8ae264c2017-03-02 11:45:29 -05003071#if !defined(OPENSSL_NO_ECDH) && !defined(OPENSSL_VERSION_1_1)
Antoine Pitrou0bebbc32014-03-22 18:13:50 +01003072 /* Allow automatic ECDH curve selection (on OpenSSL 1.0.2+), or use
3073 prime256v1 by default. This is Apache mod_ssl's initialization
Christian Heimes598894f2016-09-05 23:19:05 +02003074 policy, so we should be safe. OpenSSL 1.1 has it enabled by default.
3075 */
Donald Stufft8ae264c2017-03-02 11:45:29 -05003076#if defined(SSL_CTX_set_ecdh_auto)
Antoine Pitrou0bebbc32014-03-22 18:13:50 +01003077 SSL_CTX_set_ecdh_auto(self->ctx, 1);
3078#else
3079 {
3080 EC_KEY *key = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1);
3081 SSL_CTX_set_tmp_ecdh(self->ctx, key);
3082 EC_KEY_free(key);
3083 }
3084#endif
3085#endif
3086
Antoine Pitroufc113ee2010-10-13 12:46:13 +00003087#define SID_CTX "Python"
3088 SSL_CTX_set_session_id_context(self->ctx, (const unsigned char *) SID_CTX,
3089 sizeof(SID_CTX));
3090#undef SID_CTX
3091
Christian Heimes61d478c2018-01-27 15:51:38 +01003092 params = SSL_CTX_get0_param(self->ctx);
Benjamin Petersonfdb19712015-03-04 22:11:12 -05003093#ifdef X509_V_FLAG_TRUSTED_FIRST
Christian Heimes61d478c2018-01-27 15:51:38 +01003094 /* Improve trust chain building when cross-signed intermediate
3095 certificates are present. See https://bugs.python.org/issue23476. */
3096 X509_VERIFY_PARAM_set_flags(params, X509_V_FLAG_TRUSTED_FIRST);
Benjamin Petersonfdb19712015-03-04 22:11:12 -05003097#endif
Christian Heimes61d478c2018-01-27 15:51:38 +01003098 X509_VERIFY_PARAM_set_hostflags(params, self->hostflags);
Benjamin Petersonfdb19712015-03-04 22:11:12 -05003099
Christian Heimes9fb051f2018-09-23 08:32:31 +02003100#ifdef TLS1_3_VERSION
3101 self->post_handshake_auth = 0;
3102 SSL_CTX_set_post_handshake_auth(self->ctx, self->post_handshake_auth);
3103#endif
3104
Antoine Pitrou152efa22010-05-16 18:19:27 +00003105 return (PyObject *)self;
3106}
3107
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01003108static int
3109context_traverse(PySSLContext *self, visitproc visit, void *arg)
3110{
3111#ifndef OPENSSL_NO_TLSEXT
Christian Heimes11a14932018-02-24 02:35:08 +01003112 Py_VISIT(self->set_sni_cb);
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01003113#endif
3114 return 0;
3115}
3116
3117static int
3118context_clear(PySSLContext *self)
3119{
3120#ifndef OPENSSL_NO_TLSEXT
Christian Heimes11a14932018-02-24 02:35:08 +01003121 Py_CLEAR(self->set_sni_cb);
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01003122#endif
3123 return 0;
3124}
3125
Antoine Pitrou152efa22010-05-16 18:19:27 +00003126static void
3127context_dealloc(PySSLContext *self)
3128{
INADA Naokia6296d32017-08-24 14:55:17 +09003129 /* bpo-31095: UnTrack is needed before calling any callbacks */
3130 PyObject_GC_UnTrack(self);
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01003131 context_clear(self);
Antoine Pitrou152efa22010-05-16 18:19:27 +00003132 SSL_CTX_free(self->ctx);
Christian Heimes29eab552018-02-25 12:31:33 +01003133#if HAVE_NPN
Benjamin Petersoncca27322015-01-23 16:35:37 -05003134 PyMem_FREE(self->npn_protocols);
3135#endif
Christian Heimes29eab552018-02-25 12:31:33 +01003136#if HAVE_ALPN
Benjamin Petersoncca27322015-01-23 16:35:37 -05003137 PyMem_FREE(self->alpn_protocols);
Antoine Pitroud5d17eb2012-03-22 00:23:03 +01003138#endif
Antoine Pitrou152efa22010-05-16 18:19:27 +00003139 Py_TYPE(self)->tp_free(self);
3140}
3141
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03003142/*[clinic input]
3143_ssl._SSLContext.set_ciphers
3144 cipherlist: str
3145 /
3146[clinic start generated code]*/
Antoine Pitrou152efa22010-05-16 18:19:27 +00003147
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03003148static PyObject *
3149_ssl__SSLContext_set_ciphers_impl(PySSLContext *self, const char *cipherlist)
3150/*[clinic end generated code: output=3a3162f3557c0f3f input=a7ac931b9f3ca7fc]*/
3151{
3152 int ret = SSL_CTX_set_cipher_list(self->ctx, cipherlist);
Antoine Pitrou152efa22010-05-16 18:19:27 +00003153 if (ret == 0) {
Antoine Pitrou65ec8ae2010-05-16 19:56:32 +00003154 /* Clearing the error queue is necessary on some OpenSSL versions,
3155 otherwise the error will be reported again when another SSL call
3156 is done. */
3157 ERR_clear_error();
Antoine Pitrou152efa22010-05-16 18:19:27 +00003158 PyErr_SetString(PySSLErrorObject,
3159 "No cipher can be selected.");
3160 return NULL;
3161 }
3162 Py_RETURN_NONE;
3163}
3164
Christian Heimes25bfcd52016-09-06 00:04:45 +02003165#if OPENSSL_VERSION_NUMBER >= 0x10002000UL
3166/*[clinic input]
3167_ssl._SSLContext.get_ciphers
3168[clinic start generated code]*/
3169
3170static PyObject *
3171_ssl__SSLContext_get_ciphers_impl(PySSLContext *self)
3172/*[clinic end generated code: output=a56e4d68a406dfc4 input=a2aadc9af89b79c5]*/
3173{
3174 SSL *ssl = NULL;
3175 STACK_OF(SSL_CIPHER) *sk = NULL;
Christian Heimes99a65702016-09-10 23:44:53 +02003176 const SSL_CIPHER *cipher;
Christian Heimes25bfcd52016-09-06 00:04:45 +02003177 int i=0;
3178 PyObject *result = NULL, *dct;
3179
3180 ssl = SSL_new(self->ctx);
3181 if (ssl == NULL) {
3182 _setSSLError(NULL, 0, __FILE__, __LINE__);
3183 goto exit;
3184 }
3185 sk = SSL_get_ciphers(ssl);
3186
3187 result = PyList_New(sk_SSL_CIPHER_num(sk));
3188 if (result == NULL) {
3189 goto exit;
3190 }
3191
3192 for (i = 0; i < sk_SSL_CIPHER_num(sk); i++) {
3193 cipher = sk_SSL_CIPHER_value(sk, i);
3194 dct = cipher_to_dict(cipher);
3195 if (dct == NULL) {
3196 Py_CLEAR(result);
3197 goto exit;
3198 }
3199 PyList_SET_ITEM(result, i, dct);
3200 }
3201
3202 exit:
3203 if (ssl != NULL)
3204 SSL_free(ssl);
3205 return result;
3206
3207}
3208#endif
3209
3210
Christian Heimes29eab552018-02-25 12:31:33 +01003211#if HAVE_NPN || HAVE_ALPN
Benjamin Petersoncca27322015-01-23 16:35:37 -05003212static int
Benjamin Peterson88615022015-01-23 17:30:26 -05003213do_protocol_selection(int alpn, unsigned char **out, unsigned char *outlen,
3214 const unsigned char *server_protocols, unsigned int server_protocols_len,
3215 const unsigned char *client_protocols, unsigned int client_protocols_len)
Benjamin Petersoncca27322015-01-23 16:35:37 -05003216{
Benjamin Peterson88615022015-01-23 17:30:26 -05003217 int ret;
3218 if (client_protocols == NULL) {
3219 client_protocols = (unsigned char *)"";
3220 client_protocols_len = 0;
3221 }
3222 if (server_protocols == NULL) {
3223 server_protocols = (unsigned char *)"";
3224 server_protocols_len = 0;
Benjamin Petersoncca27322015-01-23 16:35:37 -05003225 }
3226
Benjamin Peterson88615022015-01-23 17:30:26 -05003227 ret = SSL_select_next_proto(out, outlen,
3228 server_protocols, server_protocols_len,
3229 client_protocols, client_protocols_len);
3230 if (alpn && ret != OPENSSL_NPN_NEGOTIATED)
3231 return SSL_TLSEXT_ERR_NOACK;
Benjamin Petersoncca27322015-01-23 16:35:37 -05003232
3233 return SSL_TLSEXT_ERR_OK;
3234}
Melvyn Sopacuab2d096b2017-09-04 23:35:15 +02003235#endif
Benjamin Petersoncca27322015-01-23 16:35:37 -05003236
Christian Heimes29eab552018-02-25 12:31:33 +01003237#if HAVE_NPN
Antoine Pitroud5d17eb2012-03-22 00:23:03 +01003238/* this callback gets passed to SSL_CTX_set_next_protos_advertise_cb */
3239static int
Victor Stinner4569cd52013-06-23 14:58:43 +02003240_advertiseNPN_cb(SSL *s,
3241 const unsigned char **data, unsigned int *len,
Antoine Pitroud5d17eb2012-03-22 00:23:03 +01003242 void *args)
3243{
3244 PySSLContext *ssl_ctx = (PySSLContext *) args;
3245
3246 if (ssl_ctx->npn_protocols == NULL) {
Benjamin Petersoncca27322015-01-23 16:35:37 -05003247 *data = (unsigned char *)"";
Antoine Pitroud5d17eb2012-03-22 00:23:03 +01003248 *len = 0;
3249 } else {
Benjamin Petersoncca27322015-01-23 16:35:37 -05003250 *data = ssl_ctx->npn_protocols;
Antoine Pitroud5d17eb2012-03-22 00:23:03 +01003251 *len = ssl_ctx->npn_protocols_len;
3252 }
3253
3254 return SSL_TLSEXT_ERR_OK;
3255}
3256/* this callback gets passed to SSL_CTX_set_next_proto_select_cb */
3257static int
Victor Stinner4569cd52013-06-23 14:58:43 +02003258_selectNPN_cb(SSL *s,
Antoine Pitroud5d17eb2012-03-22 00:23:03 +01003259 unsigned char **out, unsigned char *outlen,
3260 const unsigned char *server, unsigned int server_len,
3261 void *args)
3262{
Benjamin Petersoncca27322015-01-23 16:35:37 -05003263 PySSLContext *ctx = (PySSLContext *)args;
Benjamin Peterson88615022015-01-23 17:30:26 -05003264 return do_protocol_selection(0, out, outlen, server, server_len,
Benjamin Petersoncca27322015-01-23 16:35:37 -05003265 ctx->npn_protocols, ctx->npn_protocols_len);
Antoine Pitroud5d17eb2012-03-22 00:23:03 +01003266}
3267#endif
3268
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03003269/*[clinic input]
3270_ssl._SSLContext._set_npn_protocols
3271 protos: Py_buffer
3272 /
3273[clinic start generated code]*/
3274
Antoine Pitroud5d17eb2012-03-22 00:23:03 +01003275static PyObject *
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03003276_ssl__SSLContext__set_npn_protocols_impl(PySSLContext *self,
3277 Py_buffer *protos)
3278/*[clinic end generated code: output=72b002c3324390c6 input=319fcb66abf95bd7]*/
Antoine Pitroud5d17eb2012-03-22 00:23:03 +01003279{
Christian Heimes29eab552018-02-25 12:31:33 +01003280#if HAVE_NPN
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03003281 PyMem_Free(self->npn_protocols);
3282 self->npn_protocols = PyMem_Malloc(protos->len);
3283 if (self->npn_protocols == NULL)
Antoine Pitroud5d17eb2012-03-22 00:23:03 +01003284 return PyErr_NoMemory();
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03003285 memcpy(self->npn_protocols, protos->buf, protos->len);
3286 self->npn_protocols_len = (int) protos->len;
Antoine Pitroud5d17eb2012-03-22 00:23:03 +01003287
3288 /* set both server and client callbacks, because the context can
3289 * be used to create both types of sockets */
3290 SSL_CTX_set_next_protos_advertised_cb(self->ctx,
3291 _advertiseNPN_cb,
3292 self);
3293 SSL_CTX_set_next_proto_select_cb(self->ctx,
3294 _selectNPN_cb,
3295 self);
3296
Antoine Pitroud5d17eb2012-03-22 00:23:03 +01003297 Py_RETURN_NONE;
3298#else
3299 PyErr_SetString(PyExc_NotImplementedError,
3300 "The NPN extension requires OpenSSL 1.0.1 or later.");
3301 return NULL;
3302#endif
3303}
3304
Christian Heimes29eab552018-02-25 12:31:33 +01003305#if HAVE_ALPN
Benjamin Petersoncca27322015-01-23 16:35:37 -05003306static int
3307_selectALPN_cb(SSL *s,
3308 const unsigned char **out, unsigned char *outlen,
3309 const unsigned char *client_protocols, unsigned int client_protocols_len,
3310 void *args)
3311{
3312 PySSLContext *ctx = (PySSLContext *)args;
Benjamin Peterson88615022015-01-23 17:30:26 -05003313 return do_protocol_selection(1, (unsigned char **)out, outlen,
3314 ctx->alpn_protocols, ctx->alpn_protocols_len,
3315 client_protocols, client_protocols_len);
Benjamin Petersoncca27322015-01-23 16:35:37 -05003316}
3317#endif
3318
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03003319/*[clinic input]
3320_ssl._SSLContext._set_alpn_protocols
3321 protos: Py_buffer
3322 /
3323[clinic start generated code]*/
3324
Benjamin Petersoncca27322015-01-23 16:35:37 -05003325static PyObject *
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03003326_ssl__SSLContext__set_alpn_protocols_impl(PySSLContext *self,
3327 Py_buffer *protos)
3328/*[clinic end generated code: output=87599a7f76651a9b input=9bba964595d519be]*/
Benjamin Petersoncca27322015-01-23 16:35:37 -05003329{
Christian Heimes29eab552018-02-25 12:31:33 +01003330#if HAVE_ALPN
Victor Stinner5a615592017-09-14 01:10:30 -07003331 if ((size_t)protos->len > UINT_MAX) {
Segev Finer5cff6372017-07-27 01:19:17 +03003332 PyErr_Format(PyExc_OverflowError,
3333 "protocols longer than %d bytes", UINT_MAX);
3334 return NULL;
3335 }
3336
Benjamin Petersoncca27322015-01-23 16:35:37 -05003337 PyMem_FREE(self->alpn_protocols);
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03003338 self->alpn_protocols = PyMem_Malloc(protos->len);
Benjamin Petersoncca27322015-01-23 16:35:37 -05003339 if (!self->alpn_protocols)
3340 return PyErr_NoMemory();
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03003341 memcpy(self->alpn_protocols, protos->buf, protos->len);
Segev Finer5cff6372017-07-27 01:19:17 +03003342 self->alpn_protocols_len = (unsigned int)protos->len;
Benjamin Petersoncca27322015-01-23 16:35:37 -05003343
3344 if (SSL_CTX_set_alpn_protos(self->ctx, self->alpn_protocols, self->alpn_protocols_len))
3345 return PyErr_NoMemory();
3346 SSL_CTX_set_alpn_select_cb(self->ctx, _selectALPN_cb, self);
3347
Benjamin Petersoncca27322015-01-23 16:35:37 -05003348 Py_RETURN_NONE;
3349#else
3350 PyErr_SetString(PyExc_NotImplementedError,
3351 "The ALPN extension requires OpenSSL 1.0.2 or later.");
3352 return NULL;
3353#endif
3354}
3355
Antoine Pitrou152efa22010-05-16 18:19:27 +00003356static PyObject *
3357get_verify_mode(PySSLContext *self, void *c)
3358{
Christian Heimes9fb051f2018-09-23 08:32:31 +02003359 /* ignore SSL_VERIFY_CLIENT_ONCE and SSL_VERIFY_POST_HANDSHAKE */
3360 int mask = (SSL_VERIFY_NONE | SSL_VERIFY_PEER |
3361 SSL_VERIFY_FAIL_IF_NO_PEER_CERT);
3362 switch (SSL_CTX_get_verify_mode(self->ctx) & mask) {
Antoine Pitrou152efa22010-05-16 18:19:27 +00003363 case SSL_VERIFY_NONE:
3364 return PyLong_FromLong(PY_SSL_CERT_NONE);
3365 case SSL_VERIFY_PEER:
3366 return PyLong_FromLong(PY_SSL_CERT_OPTIONAL);
3367 case SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT:
3368 return PyLong_FromLong(PY_SSL_CERT_REQUIRED);
3369 }
3370 PyErr_SetString(PySSLErrorObject,
3371 "invalid return value from SSL_CTX_get_verify_mode");
3372 return NULL;
3373}
3374
3375static int
3376set_verify_mode(PySSLContext *self, PyObject *arg, void *c)
3377{
Christian Heimes5fe668c2016-09-12 00:01:11 +02003378 int n;
Antoine Pitrou152efa22010-05-16 18:19:27 +00003379 if (!PyArg_Parse(arg, "i", &n))
3380 return -1;
Christian Heimes5fe668c2016-09-12 00:01:11 +02003381 if (n == PY_SSL_CERT_NONE && self->check_hostname) {
Christian Heimes1aa9a752013-12-02 02:41:19 +01003382 PyErr_SetString(PyExc_ValueError,
3383 "Cannot set verify_mode to CERT_NONE when "
3384 "check_hostname is enabled.");
3385 return -1;
3386 }
Christian Heimes9fb051f2018-09-23 08:32:31 +02003387 return _set_verify_mode(self, n);
Antoine Pitrou152efa22010-05-16 18:19:27 +00003388}
3389
3390static PyObject *
Christian Heimes22587792013-11-21 23:56:13 +01003391get_verify_flags(PySSLContext *self, void *c)
3392{
Christian Heimes598894f2016-09-05 23:19:05 +02003393 X509_VERIFY_PARAM *param;
Christian Heimes22587792013-11-21 23:56:13 +01003394 unsigned long flags;
3395
Christian Heimes61d478c2018-01-27 15:51:38 +01003396 param = SSL_CTX_get0_param(self->ctx);
Christian Heimes598894f2016-09-05 23:19:05 +02003397 flags = X509_VERIFY_PARAM_get_flags(param);
Christian Heimes22587792013-11-21 23:56:13 +01003398 return PyLong_FromUnsignedLong(flags);
3399}
3400
3401static int
3402set_verify_flags(PySSLContext *self, PyObject *arg, void *c)
3403{
Christian Heimes598894f2016-09-05 23:19:05 +02003404 X509_VERIFY_PARAM *param;
Christian Heimes22587792013-11-21 23:56:13 +01003405 unsigned long new_flags, flags, set, clear;
3406
3407 if (!PyArg_Parse(arg, "k", &new_flags))
3408 return -1;
Christian Heimes61d478c2018-01-27 15:51:38 +01003409 param = SSL_CTX_get0_param(self->ctx);
Christian Heimes598894f2016-09-05 23:19:05 +02003410 flags = X509_VERIFY_PARAM_get_flags(param);
Christian Heimes22587792013-11-21 23:56:13 +01003411 clear = flags & ~new_flags;
3412 set = ~flags & new_flags;
3413 if (clear) {
Christian Heimes598894f2016-09-05 23:19:05 +02003414 if (!X509_VERIFY_PARAM_clear_flags(param, clear)) {
Christian Heimes22587792013-11-21 23:56:13 +01003415 _setSSLError(NULL, 0, __FILE__, __LINE__);
3416 return -1;
3417 }
3418 }
3419 if (set) {
Christian Heimes598894f2016-09-05 23:19:05 +02003420 if (!X509_VERIFY_PARAM_set_flags(param, set)) {
Christian Heimes22587792013-11-21 23:56:13 +01003421 _setSSLError(NULL, 0, __FILE__, __LINE__);
3422 return -1;
3423 }
3424 }
3425 return 0;
3426}
3427
Christian Heimes698dde12018-02-27 11:54:43 +01003428/* Getter and setter for protocol version */
3429#if defined(SSL_CTRL_GET_MAX_PROTO_VERSION)
3430
3431
3432static int
3433set_min_max_proto_version(PySSLContext *self, PyObject *arg, int what)
3434{
3435 long v;
3436 int result;
3437
3438 if (!PyArg_Parse(arg, "l", &v))
3439 return -1;
3440 if (v > INT_MAX) {
3441 PyErr_SetString(PyExc_OverflowError, "Option is too long");
3442 return -1;
3443 }
3444
3445 switch(self->protocol) {
3446 case PY_SSL_VERSION_TLS_CLIENT: /* fall through */
3447 case PY_SSL_VERSION_TLS_SERVER: /* fall through */
3448 case PY_SSL_VERSION_TLS:
3449 break;
3450 default:
3451 PyErr_SetString(
3452 PyExc_ValueError,
3453 "The context's protocol doesn't support modification of "
3454 "highest and lowest version."
3455 );
3456 return -1;
3457 }
3458
3459 if (what == 0) {
3460 switch(v) {
3461 case PY_PROTO_MINIMUM_SUPPORTED:
3462 v = 0;
3463 break;
3464 case PY_PROTO_MAXIMUM_SUPPORTED:
3465 /* Emulate max for set_min_proto_version */
3466 v = PY_PROTO_MAXIMUM_AVAILABLE;
3467 break;
3468 default:
3469 break;
3470 }
3471 result = SSL_CTX_set_min_proto_version(self->ctx, v);
3472 }
3473 else {
3474 switch(v) {
3475 case PY_PROTO_MAXIMUM_SUPPORTED:
3476 v = 0;
3477 break;
3478 case PY_PROTO_MINIMUM_SUPPORTED:
3479 /* Emulate max for set_min_proto_version */
3480 v = PY_PROTO_MINIMUM_AVAILABLE;
3481 break;
3482 default:
3483 break;
3484 }
3485 result = SSL_CTX_set_max_proto_version(self->ctx, v);
3486 }
3487 if (result == 0) {
3488 PyErr_Format(PyExc_ValueError,
3489 "Unsupported protocol version 0x%x", v);
3490 return -1;
3491 }
3492 return 0;
3493}
3494
3495static PyObject *
3496get_minimum_version(PySSLContext *self, void *c)
3497{
3498 int v = SSL_CTX_ctrl(self->ctx, SSL_CTRL_GET_MIN_PROTO_VERSION, 0, NULL);
3499 if (v == 0) {
3500 v = PY_PROTO_MINIMUM_SUPPORTED;
3501 }
3502 return PyLong_FromLong(v);
3503}
3504
3505static int
3506set_minimum_version(PySSLContext *self, PyObject *arg, void *c)
3507{
3508 return set_min_max_proto_version(self, arg, 0);
3509}
3510
3511static PyObject *
3512get_maximum_version(PySSLContext *self, void *c)
3513{
3514 int v = SSL_CTX_ctrl(self->ctx, SSL_CTRL_GET_MAX_PROTO_VERSION, 0, NULL);
3515 if (v == 0) {
3516 v = PY_PROTO_MAXIMUM_SUPPORTED;
3517 }
3518 return PyLong_FromLong(v);
3519}
3520
3521static int
3522set_maximum_version(PySSLContext *self, PyObject *arg, void *c)
3523{
3524 return set_min_max_proto_version(self, arg, 1);
3525}
3526#endif /* SSL_CTRL_GET_MAX_PROTO_VERSION */
3527
Christian Heimes22587792013-11-21 23:56:13 +01003528static PyObject *
Antoine Pitroub5218772010-05-21 09:56:06 +00003529get_options(PySSLContext *self, void *c)
3530{
3531 return PyLong_FromLong(SSL_CTX_get_options(self->ctx));
3532}
3533
3534static int
3535set_options(PySSLContext *self, PyObject *arg, void *c)
3536{
3537 long new_opts, opts, set, clear;
3538 if (!PyArg_Parse(arg, "l", &new_opts))
3539 return -1;
3540 opts = SSL_CTX_get_options(self->ctx);
3541 clear = opts & ~new_opts;
3542 set = ~opts & new_opts;
3543 if (clear) {
3544#ifdef HAVE_SSL_CTX_CLEAR_OPTIONS
3545 SSL_CTX_clear_options(self->ctx, clear);
3546#else
3547 PyErr_SetString(PyExc_ValueError,
3548 "can't clear options before OpenSSL 0.9.8m");
3549 return -1;
3550#endif
3551 }
3552 if (set)
3553 SSL_CTX_set_options(self->ctx, set);
3554 return 0;
3555}
3556
Christian Heimes1aa9a752013-12-02 02:41:19 +01003557static PyObject *
Christian Heimes61d478c2018-01-27 15:51:38 +01003558get_host_flags(PySSLContext *self, void *c)
3559{
3560 return PyLong_FromUnsignedLong(self->hostflags);
3561}
3562
3563static int
3564set_host_flags(PySSLContext *self, PyObject *arg, void *c)
3565{
3566 X509_VERIFY_PARAM *param;
3567 unsigned int new_flags = 0;
3568
3569 if (!PyArg_Parse(arg, "I", &new_flags))
3570 return -1;
3571
3572 param = SSL_CTX_get0_param(self->ctx);
3573 self->hostflags = new_flags;
3574 X509_VERIFY_PARAM_set_hostflags(param, new_flags);
3575 return 0;
3576}
3577
3578static PyObject *
Christian Heimes1aa9a752013-12-02 02:41:19 +01003579get_check_hostname(PySSLContext *self, void *c)
3580{
3581 return PyBool_FromLong(self->check_hostname);
3582}
3583
3584static int
3585set_check_hostname(PySSLContext *self, PyObject *arg, void *c)
3586{
3587 int check_hostname;
3588 if (!PyArg_Parse(arg, "p", &check_hostname))
3589 return -1;
3590 if (check_hostname &&
3591 SSL_CTX_get_verify_mode(self->ctx) == SSL_VERIFY_NONE) {
Christian Heimese82c0342017-09-15 20:29:57 +02003592 /* check_hostname = True sets verify_mode = CERT_REQUIRED */
Christian Heimes9fb051f2018-09-23 08:32:31 +02003593 if (_set_verify_mode(self, PY_SSL_CERT_REQUIRED) == -1) {
Christian Heimese82c0342017-09-15 20:29:57 +02003594 return -1;
3595 }
Christian Heimes1aa9a752013-12-02 02:41:19 +01003596 }
3597 self->check_hostname = check_hostname;
3598 return 0;
3599}
3600
Christian Heimes11a14932018-02-24 02:35:08 +01003601static PyObject *
Christian Heimes9fb051f2018-09-23 08:32:31 +02003602get_post_handshake_auth(PySSLContext *self, void *c) {
3603#if TLS1_3_VERSION
3604 return PyBool_FromLong(self->post_handshake_auth);
3605#else
3606 Py_RETURN_NONE;
3607#endif
3608}
3609
3610#if TLS1_3_VERSION
3611static int
3612set_post_handshake_auth(PySSLContext *self, PyObject *arg, void *c) {
3613 int (*verify_cb)(int, X509_STORE_CTX *) = NULL;
3614 int mode = SSL_CTX_get_verify_mode(self->ctx);
3615 int pha = PyObject_IsTrue(arg);
3616
3617 if (pha == -1) {
3618 return -1;
3619 }
3620 self->post_handshake_auth = pha;
3621
3622 /* client-side socket setting, ignored by server-side */
3623 SSL_CTX_set_post_handshake_auth(self->ctx, pha);
3624
3625 /* server-side socket setting, ignored by client-side */
3626 verify_cb = SSL_CTX_get_verify_callback(self->ctx);
3627 if (pha) {
3628 mode |= SSL_VERIFY_POST_HANDSHAKE;
3629 } else {
3630 mode ^= SSL_VERIFY_POST_HANDSHAKE;
3631 }
3632 SSL_CTX_set_verify(self->ctx, mode, verify_cb);
3633
3634 return 0;
3635}
3636#endif
3637
3638static PyObject *
Christian Heimes11a14932018-02-24 02:35:08 +01003639get_protocol(PySSLContext *self, void *c) {
3640 return PyLong_FromLong(self->protocol);
3641}
Christian Heimes1aa9a752013-12-02 02:41:19 +01003642
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +02003643typedef struct {
3644 PyThreadState *thread_state;
3645 PyObject *callable;
3646 char *password;
Victor Stinner9ee02032013-06-23 15:08:23 +02003647 int size;
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +02003648 int error;
3649} _PySSLPasswordInfo;
3650
3651static int
3652_pwinfo_set(_PySSLPasswordInfo *pw_info, PyObject* password,
3653 const char *bad_type_error)
3654{
3655 /* Set the password and size fields of a _PySSLPasswordInfo struct
3656 from a unicode, bytes, or byte array object.
3657 The password field will be dynamically allocated and must be freed
3658 by the caller */
3659 PyObject *password_bytes = NULL;
3660 const char *data = NULL;
3661 Py_ssize_t size;
3662
3663 if (PyUnicode_Check(password)) {
3664 password_bytes = PyUnicode_AsEncodedString(password, NULL, NULL);
3665 if (!password_bytes) {
3666 goto error;
3667 }
3668 data = PyBytes_AS_STRING(password_bytes);
3669 size = PyBytes_GET_SIZE(password_bytes);
3670 } else if (PyBytes_Check(password)) {
3671 data = PyBytes_AS_STRING(password);
3672 size = PyBytes_GET_SIZE(password);
3673 } else if (PyByteArray_Check(password)) {
3674 data = PyByteArray_AS_STRING(password);
3675 size = PyByteArray_GET_SIZE(password);
3676 } else {
3677 PyErr_SetString(PyExc_TypeError, bad_type_error);
3678 goto error;
3679 }
3680
Victor Stinner9ee02032013-06-23 15:08:23 +02003681 if (size > (Py_ssize_t)INT_MAX) {
3682 PyErr_Format(PyExc_ValueError,
3683 "password cannot be longer than %d bytes", INT_MAX);
3684 goto error;
3685 }
3686
Victor Stinner11ebff22013-07-07 17:07:52 +02003687 PyMem_Free(pw_info->password);
3688 pw_info->password = PyMem_Malloc(size);
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +02003689 if (!pw_info->password) {
3690 PyErr_SetString(PyExc_MemoryError,
3691 "unable to allocate password buffer");
3692 goto error;
3693 }
3694 memcpy(pw_info->password, data, size);
Victor Stinner9ee02032013-06-23 15:08:23 +02003695 pw_info->size = (int)size;
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +02003696
3697 Py_XDECREF(password_bytes);
3698 return 1;
3699
3700error:
3701 Py_XDECREF(password_bytes);
3702 return 0;
3703}
3704
3705static int
3706_password_callback(char *buf, int size, int rwflag, void *userdata)
3707{
3708 _PySSLPasswordInfo *pw_info = (_PySSLPasswordInfo*) userdata;
3709 PyObject *fn_ret = NULL;
3710
3711 PySSL_END_ALLOW_THREADS_S(pw_info->thread_state);
3712
3713 if (pw_info->callable) {
Victor Stinnerf17c3de2016-12-06 18:46:19 +01003714 fn_ret = _PyObject_CallNoArg(pw_info->callable);
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +02003715 if (!fn_ret) {
3716 /* TODO: It would be nice to move _ctypes_add_traceback() into the
3717 core python API, so we could use it to add a frame here */
3718 goto error;
3719 }
3720
3721 if (!_pwinfo_set(pw_info, fn_ret,
3722 "password callback must return a string")) {
3723 goto error;
3724 }
3725 Py_CLEAR(fn_ret);
3726 }
3727
3728 if (pw_info->size > size) {
3729 PyErr_Format(PyExc_ValueError,
3730 "password cannot be longer than %d bytes", size);
3731 goto error;
3732 }
3733
3734 PySSL_BEGIN_ALLOW_THREADS_S(pw_info->thread_state);
3735 memcpy(buf, pw_info->password, pw_info->size);
3736 return pw_info->size;
3737
3738error:
3739 Py_XDECREF(fn_ret);
3740 PySSL_BEGIN_ALLOW_THREADS_S(pw_info->thread_state);
3741 pw_info->error = 1;
3742 return -1;
3743}
3744
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03003745/*[clinic input]
3746_ssl._SSLContext.load_cert_chain
3747 certfile: object
3748 keyfile: object = NULL
3749 password: object = NULL
3750
3751[clinic start generated code]*/
3752
Antoine Pitroub5218772010-05-21 09:56:06 +00003753static PyObject *
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03003754_ssl__SSLContext_load_cert_chain_impl(PySSLContext *self, PyObject *certfile,
3755 PyObject *keyfile, PyObject *password)
3756/*[clinic end generated code: output=9480bc1c380e2095 input=7cf9ac673cbee6fc]*/
Antoine Pitrou152efa22010-05-16 18:19:27 +00003757{
Antoine Pitrou152efa22010-05-16 18:19:27 +00003758 PyObject *certfile_bytes = NULL, *keyfile_bytes = NULL;
Christian Heimes598894f2016-09-05 23:19:05 +02003759 pem_password_cb *orig_passwd_cb = SSL_CTX_get_default_passwd_cb(self->ctx);
3760 void *orig_passwd_userdata = SSL_CTX_get_default_passwd_cb_userdata(self->ctx);
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +02003761 _PySSLPasswordInfo pw_info = { NULL, NULL, NULL, 0, 0 };
Antoine Pitrou152efa22010-05-16 18:19:27 +00003762 int r;
3763
Giampaolo Rodolà745ab382010-08-29 19:25:49 +00003764 errno = 0;
Antoine Pitrou67e8e562010-09-01 20:55:41 +00003765 ERR_clear_error();
Antoine Pitrou152efa22010-05-16 18:19:27 +00003766 if (keyfile == Py_None)
3767 keyfile = NULL;
3768 if (!PyUnicode_FSConverter(certfile, &certfile_bytes)) {
3769 PyErr_SetString(PyExc_TypeError,
3770 "certfile should be a valid filesystem path");
3771 return NULL;
3772 }
3773 if (keyfile && !PyUnicode_FSConverter(keyfile, &keyfile_bytes)) {
3774 PyErr_SetString(PyExc_TypeError,
3775 "keyfile should be a valid filesystem path");
3776 goto error;
3777 }
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +02003778 if (password && password != Py_None) {
3779 if (PyCallable_Check(password)) {
3780 pw_info.callable = password;
3781 } else if (!_pwinfo_set(&pw_info, password,
3782 "password should be a string or callable")) {
3783 goto error;
3784 }
3785 SSL_CTX_set_default_passwd_cb(self->ctx, _password_callback);
3786 SSL_CTX_set_default_passwd_cb_userdata(self->ctx, &pw_info);
3787 }
3788 PySSL_BEGIN_ALLOW_THREADS_S(pw_info.thread_state);
Antoine Pitrou152efa22010-05-16 18:19:27 +00003789 r = SSL_CTX_use_certificate_chain_file(self->ctx,
3790 PyBytes_AS_STRING(certfile_bytes));
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +02003791 PySSL_END_ALLOW_THREADS_S(pw_info.thread_state);
Antoine Pitrou152efa22010-05-16 18:19:27 +00003792 if (r != 1) {
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +02003793 if (pw_info.error) {
3794 ERR_clear_error();
3795 /* the password callback has already set the error information */
3796 }
3797 else if (errno != 0) {
Giampaolo Rodolàe0f98632010-09-01 19:28:49 +00003798 ERR_clear_error();
Serhiy Storchaka55fe1ae2017-04-16 10:46:38 +03003799 PyErr_SetFromErrno(PyExc_OSError);
Giampaolo Rodolà745ab382010-08-29 19:25:49 +00003800 }
3801 else {
3802 _setSSLError(NULL, 0, __FILE__, __LINE__);
3803 }
Antoine Pitrou152efa22010-05-16 18:19:27 +00003804 goto error;
3805 }
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +02003806 PySSL_BEGIN_ALLOW_THREADS_S(pw_info.thread_state);
Antoine Pitrou9c254862011-04-03 18:15:34 +02003807 r = SSL_CTX_use_PrivateKey_file(self->ctx,
Antoine Pitrou152efa22010-05-16 18:19:27 +00003808 PyBytes_AS_STRING(keyfile ? keyfile_bytes : certfile_bytes),
3809 SSL_FILETYPE_PEM);
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +02003810 PySSL_END_ALLOW_THREADS_S(pw_info.thread_state);
3811 Py_CLEAR(keyfile_bytes);
3812 Py_CLEAR(certfile_bytes);
Antoine Pitrou152efa22010-05-16 18:19:27 +00003813 if (r != 1) {
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +02003814 if (pw_info.error) {
3815 ERR_clear_error();
3816 /* the password callback has already set the error information */
3817 }
3818 else if (errno != 0) {
Giampaolo Rodolàe0f98632010-09-01 19:28:49 +00003819 ERR_clear_error();
Serhiy Storchaka55fe1ae2017-04-16 10:46:38 +03003820 PyErr_SetFromErrno(PyExc_OSError);
Giampaolo Rodolà745ab382010-08-29 19:25:49 +00003821 }
3822 else {
3823 _setSSLError(NULL, 0, __FILE__, __LINE__);
3824 }
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +02003825 goto error;
Antoine Pitrou152efa22010-05-16 18:19:27 +00003826 }
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +02003827 PySSL_BEGIN_ALLOW_THREADS_S(pw_info.thread_state);
Antoine Pitrou152efa22010-05-16 18:19:27 +00003828 r = SSL_CTX_check_private_key(self->ctx);
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +02003829 PySSL_END_ALLOW_THREADS_S(pw_info.thread_state);
Antoine Pitrou152efa22010-05-16 18:19:27 +00003830 if (r != 1) {
3831 _setSSLError(NULL, 0, __FILE__, __LINE__);
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +02003832 goto error;
Antoine Pitrou152efa22010-05-16 18:19:27 +00003833 }
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +02003834 SSL_CTX_set_default_passwd_cb(self->ctx, orig_passwd_cb);
3835 SSL_CTX_set_default_passwd_cb_userdata(self->ctx, orig_passwd_userdata);
Victor Stinner11ebff22013-07-07 17:07:52 +02003836 PyMem_Free(pw_info.password);
Antoine Pitrou152efa22010-05-16 18:19:27 +00003837 Py_RETURN_NONE;
3838
3839error:
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +02003840 SSL_CTX_set_default_passwd_cb(self->ctx, orig_passwd_cb);
3841 SSL_CTX_set_default_passwd_cb_userdata(self->ctx, orig_passwd_userdata);
Victor Stinner11ebff22013-07-07 17:07:52 +02003842 PyMem_Free(pw_info.password);
Antoine Pitrou152efa22010-05-16 18:19:27 +00003843 Py_XDECREF(keyfile_bytes);
3844 Py_XDECREF(certfile_bytes);
3845 return NULL;
3846}
3847
Christian Heimesefff7062013-11-21 03:35:02 +01003848/* internal helper function, returns -1 on error
3849 */
3850static int
3851_add_ca_certs(PySSLContext *self, void *data, Py_ssize_t len,
3852 int filetype)
3853{
3854 BIO *biobuf = NULL;
3855 X509_STORE *store;
3856 int retval = 0, err, loaded = 0;
3857
3858 assert(filetype == SSL_FILETYPE_ASN1 || filetype == SSL_FILETYPE_PEM);
3859
3860 if (len <= 0) {
3861 PyErr_SetString(PyExc_ValueError,
3862 "Empty certificate data");
3863 return -1;
3864 } else if (len > INT_MAX) {
3865 PyErr_SetString(PyExc_OverflowError,
3866 "Certificate data is too long.");
3867 return -1;
3868 }
3869
Christian Heimes1dbf61f2013-11-22 00:34:18 +01003870 biobuf = BIO_new_mem_buf(data, (int)len);
Christian Heimesefff7062013-11-21 03:35:02 +01003871 if (biobuf == NULL) {
3872 _setSSLError("Can't allocate buffer", 0, __FILE__, __LINE__);
3873 return -1;
3874 }
3875
3876 store = SSL_CTX_get_cert_store(self->ctx);
3877 assert(store != NULL);
3878
3879 while (1) {
3880 X509 *cert = NULL;
3881 int r;
3882
3883 if (filetype == SSL_FILETYPE_ASN1) {
3884 cert = d2i_X509_bio(biobuf, NULL);
3885 } else {
3886 cert = PEM_read_bio_X509(biobuf, NULL,
Christian Heimes598894f2016-09-05 23:19:05 +02003887 SSL_CTX_get_default_passwd_cb(self->ctx),
3888 SSL_CTX_get_default_passwd_cb_userdata(self->ctx)
3889 );
Christian Heimesefff7062013-11-21 03:35:02 +01003890 }
3891 if (cert == NULL) {
3892 break;
3893 }
3894 r = X509_STORE_add_cert(store, cert);
3895 X509_free(cert);
3896 if (!r) {
3897 err = ERR_peek_last_error();
3898 if ((ERR_GET_LIB(err) == ERR_LIB_X509) &&
3899 (ERR_GET_REASON(err) == X509_R_CERT_ALREADY_IN_HASH_TABLE)) {
3900 /* cert already in hash table, not an error */
3901 ERR_clear_error();
3902 } else {
3903 break;
3904 }
3905 }
3906 loaded++;
3907 }
3908
3909 err = ERR_peek_last_error();
3910 if ((filetype == SSL_FILETYPE_ASN1) &&
3911 (loaded > 0) &&
3912 (ERR_GET_LIB(err) == ERR_LIB_ASN1) &&
3913 (ERR_GET_REASON(err) == ASN1_R_HEADER_TOO_LONG)) {
3914 /* EOF ASN1 file, not an error */
3915 ERR_clear_error();
3916 retval = 0;
3917 } else if ((filetype == SSL_FILETYPE_PEM) &&
3918 (loaded > 0) &&
3919 (ERR_GET_LIB(err) == ERR_LIB_PEM) &&
3920 (ERR_GET_REASON(err) == PEM_R_NO_START_LINE)) {
3921 /* EOF PEM file, not an error */
3922 ERR_clear_error();
3923 retval = 0;
3924 } else {
3925 _setSSLError(NULL, 0, __FILE__, __LINE__);
3926 retval = -1;
3927 }
3928
3929 BIO_free(biobuf);
3930 return retval;
3931}
3932
3933
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03003934/*[clinic input]
3935_ssl._SSLContext.load_verify_locations
3936 cafile: object = NULL
3937 capath: object = NULL
3938 cadata: object = NULL
3939
3940[clinic start generated code]*/
3941
Antoine Pitrou152efa22010-05-16 18:19:27 +00003942static PyObject *
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03003943_ssl__SSLContext_load_verify_locations_impl(PySSLContext *self,
3944 PyObject *cafile,
3945 PyObject *capath,
3946 PyObject *cadata)
3947/*[clinic end generated code: output=454c7e41230ca551 input=997f1fb3a784ef88]*/
Antoine Pitrou152efa22010-05-16 18:19:27 +00003948{
Antoine Pitrou152efa22010-05-16 18:19:27 +00003949 PyObject *cafile_bytes = NULL, *capath_bytes = NULL;
3950 const char *cafile_buf = NULL, *capath_buf = NULL;
Christian Heimesefff7062013-11-21 03:35:02 +01003951 int r = 0, ok = 1;
Antoine Pitrou152efa22010-05-16 18:19:27 +00003952
Giampaolo Rodolà745ab382010-08-29 19:25:49 +00003953 errno = 0;
Antoine Pitrou152efa22010-05-16 18:19:27 +00003954 if (cafile == Py_None)
3955 cafile = NULL;
3956 if (capath == Py_None)
3957 capath = NULL;
Christian Heimesefff7062013-11-21 03:35:02 +01003958 if (cadata == Py_None)
3959 cadata = NULL;
3960
3961 if (cafile == NULL && capath == NULL && cadata == NULL) {
Antoine Pitrou152efa22010-05-16 18:19:27 +00003962 PyErr_SetString(PyExc_TypeError,
Christian Heimesefff7062013-11-21 03:35:02 +01003963 "cafile, capath and cadata cannot be all omitted");
3964 goto error;
Antoine Pitrou152efa22010-05-16 18:19:27 +00003965 }
3966 if (cafile && !PyUnicode_FSConverter(cafile, &cafile_bytes)) {
3967 PyErr_SetString(PyExc_TypeError,
3968 "cafile should be a valid filesystem path");
Christian Heimesefff7062013-11-21 03:35:02 +01003969 goto error;
Antoine Pitrou152efa22010-05-16 18:19:27 +00003970 }
3971 if (capath && !PyUnicode_FSConverter(capath, &capath_bytes)) {
Antoine Pitrou152efa22010-05-16 18:19:27 +00003972 PyErr_SetString(PyExc_TypeError,
3973 "capath should be a valid filesystem path");
Christian Heimesefff7062013-11-21 03:35:02 +01003974 goto error;
Antoine Pitrou152efa22010-05-16 18:19:27 +00003975 }
Christian Heimesefff7062013-11-21 03:35:02 +01003976
3977 /* validata cadata type and load cadata */
3978 if (cadata) {
3979 Py_buffer buf;
3980 PyObject *cadata_ascii = NULL;
3981
3982 if (PyObject_GetBuffer(cadata, &buf, PyBUF_SIMPLE) == 0) {
3983 if (!PyBuffer_IsContiguous(&buf, 'C') || buf.ndim > 1) {
3984 PyBuffer_Release(&buf);
3985 PyErr_SetString(PyExc_TypeError,
3986 "cadata should be a contiguous buffer with "
3987 "a single dimension");
3988 goto error;
3989 }
3990 r = _add_ca_certs(self, buf.buf, buf.len, SSL_FILETYPE_ASN1);
3991 PyBuffer_Release(&buf);
3992 if (r == -1) {
3993 goto error;
3994 }
3995 } else {
3996 PyErr_Clear();
3997 cadata_ascii = PyUnicode_AsASCIIString(cadata);
3998 if (cadata_ascii == NULL) {
3999 PyErr_SetString(PyExc_TypeError,
Serhiy Storchakad65c9492015-11-02 14:10:23 +02004000 "cadata should be an ASCII string or a "
Christian Heimesefff7062013-11-21 03:35:02 +01004001 "bytes-like object");
4002 goto error;
4003 }
4004 r = _add_ca_certs(self,
4005 PyBytes_AS_STRING(cadata_ascii),
4006 PyBytes_GET_SIZE(cadata_ascii),
4007 SSL_FILETYPE_PEM);
4008 Py_DECREF(cadata_ascii);
4009 if (r == -1) {
4010 goto error;
4011 }
4012 }
4013 }
4014
4015 /* load cafile or capath */
4016 if (cafile || capath) {
4017 if (cafile)
4018 cafile_buf = PyBytes_AS_STRING(cafile_bytes);
4019 if (capath)
4020 capath_buf = PyBytes_AS_STRING(capath_bytes);
4021 PySSL_BEGIN_ALLOW_THREADS
4022 r = SSL_CTX_load_verify_locations(self->ctx, cafile_buf, capath_buf);
4023 PySSL_END_ALLOW_THREADS
4024 if (r != 1) {
4025 ok = 0;
4026 if (errno != 0) {
4027 ERR_clear_error();
Serhiy Storchaka55fe1ae2017-04-16 10:46:38 +03004028 PyErr_SetFromErrno(PyExc_OSError);
Christian Heimesefff7062013-11-21 03:35:02 +01004029 }
4030 else {
4031 _setSSLError(NULL, 0, __FILE__, __LINE__);
4032 }
4033 goto error;
4034 }
4035 }
4036 goto end;
4037
4038 error:
4039 ok = 0;
4040 end:
Antoine Pitrou152efa22010-05-16 18:19:27 +00004041 Py_XDECREF(cafile_bytes);
4042 Py_XDECREF(capath_bytes);
Christian Heimesefff7062013-11-21 03:35:02 +01004043 if (ok) {
4044 Py_RETURN_NONE;
4045 } else {
Antoine Pitrou152efa22010-05-16 18:19:27 +00004046 return NULL;
4047 }
Antoine Pitrou152efa22010-05-16 18:19:27 +00004048}
4049
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004050/*[clinic input]
4051_ssl._SSLContext.load_dh_params
4052 path as filepath: object
4053 /
4054
4055[clinic start generated code]*/
4056
Antoine Pitrou152efa22010-05-16 18:19:27 +00004057static PyObject *
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004058_ssl__SSLContext_load_dh_params(PySSLContext *self, PyObject *filepath)
4059/*[clinic end generated code: output=1c8e57a38e055af0 input=c8871f3c796ae1d6]*/
Antoine Pitrou0e576f12011-12-22 10:03:38 +01004060{
4061 FILE *f;
4062 DH *dh;
4063
Victor Stinnerdaf45552013-08-28 00:53:59 +02004064 f = _Py_fopen_obj(filepath, "rb");
Victor Stinnere42ccd22015-03-18 01:39:23 +01004065 if (f == NULL)
Antoine Pitrou0e576f12011-12-22 10:03:38 +01004066 return NULL;
Victor Stinnere42ccd22015-03-18 01:39:23 +01004067
Antoine Pitrou0e576f12011-12-22 10:03:38 +01004068 errno = 0;
4069 PySSL_BEGIN_ALLOW_THREADS
4070 dh = PEM_read_DHparams(f, NULL, NULL, NULL);
Antoine Pitrou457a2292013-01-12 21:43:45 +01004071 fclose(f);
Antoine Pitrou0e576f12011-12-22 10:03:38 +01004072 PySSL_END_ALLOW_THREADS
4073 if (dh == NULL) {
4074 if (errno != 0) {
4075 ERR_clear_error();
4076 PyErr_SetFromErrnoWithFilenameObject(PyExc_OSError, filepath);
4077 }
4078 else {
4079 _setSSLError(NULL, 0, __FILE__, __LINE__);
4080 }
4081 return NULL;
4082 }
4083 if (SSL_CTX_set_tmp_dh(self->ctx, dh) == 0)
4084 _setSSLError(NULL, 0, __FILE__, __LINE__);
4085 DH_free(dh);
4086 Py_RETURN_NONE;
4087}
4088
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004089/*[clinic input]
4090_ssl._SSLContext._wrap_socket
4091 sock: object(subclass_of="PySocketModule.Sock_Type")
4092 server_side: int
4093 server_hostname as hostname_obj: object = None
Christian Heimes141c5e82018-02-24 21:10:57 +01004094 *
4095 owner: object = None
4096 session: object = None
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004097
4098[clinic start generated code]*/
4099
Antoine Pitrou0e576f12011-12-22 10:03:38 +01004100static PyObject *
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004101_ssl__SSLContext__wrap_socket_impl(PySSLContext *self, PyObject *sock,
Christian Heimes141c5e82018-02-24 21:10:57 +01004102 int server_side, PyObject *hostname_obj,
4103 PyObject *owner, PyObject *session)
4104/*[clinic end generated code: output=f103f238633940b4 input=957d5006183d1894]*/
Antoine Pitrou152efa22010-05-16 18:19:27 +00004105{
Antoine Pitroud5323212010-10-22 18:19:07 +00004106 char *hostname = NULL;
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004107 PyObject *res;
Antoine Pitrou152efa22010-05-16 18:19:27 +00004108
Antoine Pitroud5323212010-10-22 18:19:07 +00004109 /* server_hostname is either None (or absent), or to be encoded
Christian Heimesd02ac252018-03-25 12:36:13 +02004110 as IDN A-label (ASCII str) without NULL bytes. */
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004111 if (hostname_obj != Py_None) {
Christian Heimes11a14932018-02-24 02:35:08 +01004112 if (!PyArg_Parse(hostname_obj, "es", "ascii", &hostname))
Antoine Pitroud5323212010-10-22 18:19:07 +00004113 return NULL;
Antoine Pitroud5323212010-10-22 18:19:07 +00004114 }
Antoine Pitrou152efa22010-05-16 18:19:27 +00004115
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004116 res = (PyObject *) newPySSLSocket(self, (PySocketSockObject *)sock,
4117 server_side, hostname,
Christian Heimes141c5e82018-02-24 21:10:57 +01004118 owner, session,
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004119 NULL, NULL);
Antoine Pitroud5323212010-10-22 18:19:07 +00004120 if (hostname != NULL)
4121 PyMem_Free(hostname);
4122 return res;
Antoine Pitrou152efa22010-05-16 18:19:27 +00004123}
4124
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004125/*[clinic input]
4126_ssl._SSLContext._wrap_bio
4127 incoming: object(subclass_of="&PySSLMemoryBIO_Type", type="PySSLMemoryBIO *")
4128 outgoing: object(subclass_of="&PySSLMemoryBIO_Type", type="PySSLMemoryBIO *")
4129 server_side: int
4130 server_hostname as hostname_obj: object = None
Christian Heimes141c5e82018-02-24 21:10:57 +01004131 *
4132 owner: object = None
4133 session: object = None
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004134
4135[clinic start generated code]*/
4136
Antoine Pitroub0182c82010-10-12 20:09:02 +00004137static PyObject *
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004138_ssl__SSLContext__wrap_bio_impl(PySSLContext *self, PySSLMemoryBIO *incoming,
4139 PySSLMemoryBIO *outgoing, int server_side,
Christian Heimes141c5e82018-02-24 21:10:57 +01004140 PyObject *hostname_obj, PyObject *owner,
4141 PyObject *session)
4142/*[clinic end generated code: output=5c5d6d9b41f99332 input=8cf22f4d586ac56a]*/
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004143{
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004144 char *hostname = NULL;
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004145 PyObject *res;
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004146
4147 /* server_hostname is either None (or absent), or to be encoded
Christian Heimesd02ac252018-03-25 12:36:13 +02004148 as IDN A-label (ASCII str) without NULL bytes. */
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004149 if (hostname_obj != Py_None) {
Christian Heimes11a14932018-02-24 02:35:08 +01004150 if (!PyArg_Parse(hostname_obj, "es", "ascii", &hostname))
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004151 return NULL;
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004152 }
4153
4154 res = (PyObject *) newPySSLSocket(self, NULL, server_side, hostname,
Christian Heimes141c5e82018-02-24 21:10:57 +01004155 owner, session,
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004156 incoming, outgoing);
4157
4158 PyMem_Free(hostname);
4159 return res;
4160}
4161
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004162/*[clinic input]
4163_ssl._SSLContext.session_stats
4164[clinic start generated code]*/
4165
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004166static PyObject *
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004167_ssl__SSLContext_session_stats_impl(PySSLContext *self)
4168/*[clinic end generated code: output=0d96411c42893bfb input=7e0a81fb11102c8b]*/
Antoine Pitroub0182c82010-10-12 20:09:02 +00004169{
4170 int r;
4171 PyObject *value, *stats = PyDict_New();
4172 if (!stats)
4173 return NULL;
4174
4175#define ADD_STATS(SSL_NAME, KEY_NAME) \
4176 value = PyLong_FromLong(SSL_CTX_sess_ ## SSL_NAME (self->ctx)); \
4177 if (value == NULL) \
4178 goto error; \
4179 r = PyDict_SetItemString(stats, KEY_NAME, value); \
4180 Py_DECREF(value); \
4181 if (r < 0) \
4182 goto error;
4183
4184 ADD_STATS(number, "number");
4185 ADD_STATS(connect, "connect");
4186 ADD_STATS(connect_good, "connect_good");
4187 ADD_STATS(connect_renegotiate, "connect_renegotiate");
4188 ADD_STATS(accept, "accept");
4189 ADD_STATS(accept_good, "accept_good");
4190 ADD_STATS(accept_renegotiate, "accept_renegotiate");
4191 ADD_STATS(accept, "accept");
4192 ADD_STATS(hits, "hits");
4193 ADD_STATS(misses, "misses");
4194 ADD_STATS(timeouts, "timeouts");
4195 ADD_STATS(cache_full, "cache_full");
4196
4197#undef ADD_STATS
4198
4199 return stats;
4200
4201error:
4202 Py_DECREF(stats);
4203 return NULL;
4204}
4205
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004206/*[clinic input]
4207_ssl._SSLContext.set_default_verify_paths
4208[clinic start generated code]*/
4209
Antoine Pitrou664c2d12010-11-17 20:29:42 +00004210static PyObject *
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004211_ssl__SSLContext_set_default_verify_paths_impl(PySSLContext *self)
4212/*[clinic end generated code: output=0bee74e6e09deaaa input=35f3408021463d74]*/
Antoine Pitrou664c2d12010-11-17 20:29:42 +00004213{
4214 if (!SSL_CTX_set_default_verify_paths(self->ctx)) {
4215 _setSSLError(NULL, 0, __FILE__, __LINE__);
4216 return NULL;
4217 }
4218 Py_RETURN_NONE;
4219}
4220
Antoine Pitrou501da612011-12-21 09:27:41 +01004221#ifndef OPENSSL_NO_ECDH
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004222/*[clinic input]
4223_ssl._SSLContext.set_ecdh_curve
4224 name: object
4225 /
4226
4227[clinic start generated code]*/
4228
Antoine Pitrou923df6f2011-12-19 17:16:51 +01004229static PyObject *
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004230_ssl__SSLContext_set_ecdh_curve(PySSLContext *self, PyObject *name)
4231/*[clinic end generated code: output=23022c196e40d7d2 input=c2bafb6f6e34726b]*/
Antoine Pitrou923df6f2011-12-19 17:16:51 +01004232{
4233 PyObject *name_bytes;
4234 int nid;
4235 EC_KEY *key;
4236
4237 if (!PyUnicode_FSConverter(name, &name_bytes))
4238 return NULL;
4239 assert(PyBytes_Check(name_bytes));
4240 nid = OBJ_sn2nid(PyBytes_AS_STRING(name_bytes));
4241 Py_DECREF(name_bytes);
4242 if (nid == 0) {
4243 PyErr_Format(PyExc_ValueError,
4244 "unknown elliptic curve name %R", name);
4245 return NULL;
4246 }
4247 key = EC_KEY_new_by_curve_name(nid);
4248 if (key == NULL) {
4249 _setSSLError(NULL, 0, __FILE__, __LINE__);
4250 return NULL;
4251 }
4252 SSL_CTX_set_tmp_ecdh(self->ctx, key);
4253 EC_KEY_free(key);
4254 Py_RETURN_NONE;
4255}
Antoine Pitrou501da612011-12-21 09:27:41 +01004256#endif
Antoine Pitrou923df6f2011-12-19 17:16:51 +01004257
Antoine Pitrou912fbff2013-03-30 16:29:32 +01004258#if HAVE_SNI && !defined(OPENSSL_NO_TLSEXT)
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004259static int
4260_servername_callback(SSL *s, int *al, void *args)
4261{
4262 int ret;
4263 PySSLContext *ssl_ctx = (PySSLContext *) args;
4264 PySSLSocket *ssl;
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004265 PyObject *result;
4266 /* The high-level ssl.SSLSocket object */
4267 PyObject *ssl_socket;
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004268 const char *servername = SSL_get_servername(s, TLSEXT_NAMETYPE_host_name);
Stefan Krah20d60802013-01-17 17:07:17 +01004269 PyGILState_STATE gstate = PyGILState_Ensure();
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004270
Christian Heimes11a14932018-02-24 02:35:08 +01004271 if (ssl_ctx->set_sni_cb == NULL) {
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004272 /* remove race condition in this the call back while if removing the
4273 * callback is in progress */
4274 PyGILState_Release(gstate);
Antoine Pitrou5dd12a52013-01-06 15:25:36 +01004275 return SSL_TLSEXT_ERR_OK;
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004276 }
4277
4278 ssl = SSL_get_app_data(s);
4279 assert(PySSLSocket_Check(ssl));
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004280
Serhiy Storchakaf51d7152015-11-02 14:40:41 +02004281 /* The servername callback expects an argument that represents the current
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004282 * SSL connection and that has a .context attribute that can be changed to
4283 * identify the requested hostname. Since the official API is the Python
4284 * level API we want to pass the callback a Python level object rather than
4285 * a _ssl.SSLSocket instance. If there's an "owner" (typically an
4286 * SSLObject) that will be passed. Otherwise if there's a socket then that
4287 * will be passed. If both do not exist only then the C-level object is
4288 * passed. */
4289 if (ssl->owner)
4290 ssl_socket = PyWeakref_GetObject(ssl->owner);
4291 else if (ssl->Socket)
4292 ssl_socket = PyWeakref_GetObject(ssl->Socket);
4293 else
4294 ssl_socket = (PyObject *) ssl;
4295
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004296 Py_INCREF(ssl_socket);
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004297 if (ssl_socket == Py_None)
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004298 goto error;
Victor Stinner7e001512013-06-25 00:44:31 +02004299
Antoine Pitrou50b24d02013-04-11 20:48:42 +02004300 if (servername == NULL) {
Christian Heimes11a14932018-02-24 02:35:08 +01004301 result = PyObject_CallFunctionObjArgs(ssl_ctx->set_sni_cb, ssl_socket,
Antoine Pitrou50b24d02013-04-11 20:48:42 +02004302 Py_None, ssl_ctx, NULL);
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004303 }
Antoine Pitrou50b24d02013-04-11 20:48:42 +02004304 else {
Christian Heimes11a14932018-02-24 02:35:08 +01004305 PyObject *servername_bytes;
4306 PyObject *servername_str;
4307
4308 servername_bytes = PyBytes_FromString(servername);
4309 if (servername_bytes == NULL) {
Antoine Pitrou50b24d02013-04-11 20:48:42 +02004310 PyErr_WriteUnraisable((PyObject *) ssl_ctx);
4311 goto error;
4312 }
Christian Heimes11a14932018-02-24 02:35:08 +01004313 /* server_hostname was encoded to an A-label by our caller; put it
4314 * back into a str object, but still as an A-label (bpo-28414)
4315 */
4316 servername_str = PyUnicode_FromEncodedObject(servername_bytes, "ascii", NULL);
4317 Py_DECREF(servername_bytes);
4318 if (servername_str == NULL) {
4319 PyErr_WriteUnraisable(servername_bytes);
Antoine Pitrou50b24d02013-04-11 20:48:42 +02004320 goto error;
4321 }
Christian Heimes11a14932018-02-24 02:35:08 +01004322 result = PyObject_CallFunctionObjArgs(
4323 ssl_ctx->set_sni_cb, ssl_socket, servername_str,
4324 ssl_ctx, NULL);
4325 Py_DECREF(servername_str);
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004326 }
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004327 Py_DECREF(ssl_socket);
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004328
4329 if (result == NULL) {
Christian Heimes11a14932018-02-24 02:35:08 +01004330 PyErr_WriteUnraisable(ssl_ctx->set_sni_cb);
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004331 *al = SSL_AD_HANDSHAKE_FAILURE;
4332 ret = SSL_TLSEXT_ERR_ALERT_FATAL;
4333 }
4334 else {
Christian Heimes11a14932018-02-24 02:35:08 +01004335 /* Result may be None, a SSLContext or an integer
4336 * None and SSLContext are OK, integer or other values are an error.
4337 */
4338 if (result == Py_None) {
4339 ret = SSL_TLSEXT_ERR_OK;
4340 } else {
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004341 *al = (int) PyLong_AsLong(result);
4342 if (PyErr_Occurred()) {
4343 PyErr_WriteUnraisable(result);
4344 *al = SSL_AD_INTERNAL_ERROR;
4345 }
4346 ret = SSL_TLSEXT_ERR_ALERT_FATAL;
4347 }
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004348 Py_DECREF(result);
4349 }
4350
4351 PyGILState_Release(gstate);
4352 return ret;
4353
4354error:
4355 Py_DECREF(ssl_socket);
4356 *al = SSL_AD_INTERNAL_ERROR;
4357 ret = SSL_TLSEXT_ERR_ALERT_FATAL;
4358 PyGILState_Release(gstate);
4359 return ret;
4360}
Antoine Pitroua5963382013-03-30 16:39:00 +01004361#endif
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004362
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004363static PyObject *
Christian Heimes11a14932018-02-24 02:35:08 +01004364get_sni_callback(PySSLContext *self, void *c)
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004365{
Christian Heimes11a14932018-02-24 02:35:08 +01004366 PyObject *cb = self->set_sni_cb;
4367 if (cb == NULL) {
4368 Py_RETURN_NONE;
4369 }
4370 Py_INCREF(cb);
4371 return cb;
4372}
4373
4374static int
4375set_sni_callback(PySSLContext *self, PyObject *arg, void *c)
4376{
4377 if (self->protocol == PY_SSL_VERSION_TLS_CLIENT) {
4378 PyErr_SetString(PyExc_ValueError,
4379 "sni_callback cannot be set on TLS_CLIENT context");
4380 return -1;
4381 }
Antoine Pitrou912fbff2013-03-30 16:29:32 +01004382#if HAVE_SNI && !defined(OPENSSL_NO_TLSEXT)
Christian Heimes11a14932018-02-24 02:35:08 +01004383 Py_CLEAR(self->set_sni_cb);
4384 if (arg == Py_None) {
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004385 SSL_CTX_set_tlsext_servername_callback(self->ctx, NULL);
4386 }
4387 else {
Christian Heimes11a14932018-02-24 02:35:08 +01004388 if (!PyCallable_Check(arg)) {
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004389 SSL_CTX_set_tlsext_servername_callback(self->ctx, NULL);
4390 PyErr_SetString(PyExc_TypeError,
4391 "not a callable object");
Christian Heimes11a14932018-02-24 02:35:08 +01004392 return -1;
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004393 }
Christian Heimes11a14932018-02-24 02:35:08 +01004394 Py_INCREF(arg);
4395 self->set_sni_cb = arg;
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004396 SSL_CTX_set_tlsext_servername_callback(self->ctx, _servername_callback);
4397 SSL_CTX_set_tlsext_servername_arg(self->ctx, self);
4398 }
Christian Heimes11a14932018-02-24 02:35:08 +01004399 return 0;
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004400#else
4401 PyErr_SetString(PyExc_NotImplementedError,
4402 "The TLS extension servername callback, "
4403 "SSL_CTX_set_tlsext_servername_callback, "
4404 "is not in the current OpenSSL library.");
Christian Heimes11a14932018-02-24 02:35:08 +01004405 return -1;
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004406#endif
4407}
4408
Christian Heimes11a14932018-02-24 02:35:08 +01004409PyDoc_STRVAR(PySSLContext_sni_callback_doc,
4410"Set a callback that will be called when a server name is provided by the SSL/TLS client in the SNI extension.\n\
4411\n\
4412If the argument is None then the callback is disabled. The method is called\n\
4413with the SSLSocket, the server name as a string, and the SSLContext object.\n\
4414See RFC 6066 for details of the SNI extension.");
4415
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004416/*[clinic input]
4417_ssl._SSLContext.cert_store_stats
4418
4419Returns quantities of loaded X.509 certificates.
4420
4421X.509 certificates with a CA extension and certificate revocation lists
4422inside the context's cert store.
4423
4424NOTE: Certificates in a capath directory aren't loaded unless they have
4425been used at least once.
4426[clinic start generated code]*/
Christian Heimes9a5395a2013-06-17 15:44:12 +02004427
4428static PyObject *
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004429_ssl__SSLContext_cert_store_stats_impl(PySSLContext *self)
4430/*[clinic end generated code: output=5f356f4d9cca874d input=eb40dd0f6d0e40cf]*/
Christian Heimes9a5395a2013-06-17 15:44:12 +02004431{
4432 X509_STORE *store;
Christian Heimes598894f2016-09-05 23:19:05 +02004433 STACK_OF(X509_OBJECT) *objs;
Christian Heimes9a5395a2013-06-17 15:44:12 +02004434 X509_OBJECT *obj;
Christian Heimes598894f2016-09-05 23:19:05 +02004435 int x509 = 0, crl = 0, ca = 0, i;
Christian Heimes9a5395a2013-06-17 15:44:12 +02004436
4437 store = SSL_CTX_get_cert_store(self->ctx);
Christian Heimes598894f2016-09-05 23:19:05 +02004438 objs = X509_STORE_get0_objects(store);
4439 for (i = 0; i < sk_X509_OBJECT_num(objs); i++) {
4440 obj = sk_X509_OBJECT_value(objs, i);
4441 switch (X509_OBJECT_get_type(obj)) {
Christian Heimes9a5395a2013-06-17 15:44:12 +02004442 case X509_LU_X509:
4443 x509++;
Christian Heimes598894f2016-09-05 23:19:05 +02004444 if (X509_check_ca(X509_OBJECT_get0_X509(obj))) {
Christian Heimes9a5395a2013-06-17 15:44:12 +02004445 ca++;
4446 }
4447 break;
4448 case X509_LU_CRL:
4449 crl++;
4450 break;
Christian Heimes9a5395a2013-06-17 15:44:12 +02004451 default:
4452 /* Ignore X509_LU_FAIL, X509_LU_RETRY, X509_LU_PKEY.
4453 * As far as I can tell they are internal states and never
4454 * stored in a cert store */
4455 break;
4456 }
4457 }
4458 return Py_BuildValue("{sisisi}", "x509", x509, "crl", crl,
4459 "x509_ca", ca);
4460}
4461
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004462/*[clinic input]
4463_ssl._SSLContext.get_ca_certs
4464 binary_form: bool = False
4465
4466Returns a list of dicts with information of loaded CA certs.
4467
4468If the optional argument is True, returns a DER-encoded copy of the CA
4469certificate.
4470
4471NOTE: Certificates in a capath directory aren't loaded unless they have
4472been used at least once.
4473[clinic start generated code]*/
Christian Heimes9a5395a2013-06-17 15:44:12 +02004474
4475static PyObject *
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004476_ssl__SSLContext_get_ca_certs_impl(PySSLContext *self, int binary_form)
4477/*[clinic end generated code: output=0d58f148f37e2938 input=6887b5a09b7f9076]*/
Christian Heimes9a5395a2013-06-17 15:44:12 +02004478{
4479 X509_STORE *store;
Christian Heimes598894f2016-09-05 23:19:05 +02004480 STACK_OF(X509_OBJECT) *objs;
Christian Heimes9a5395a2013-06-17 15:44:12 +02004481 PyObject *ci = NULL, *rlist = NULL;
4482 int i;
Christian Heimes9a5395a2013-06-17 15:44:12 +02004483
4484 if ((rlist = PyList_New(0)) == NULL) {
4485 return NULL;
4486 }
4487
4488 store = SSL_CTX_get_cert_store(self->ctx);
Christian Heimes598894f2016-09-05 23:19:05 +02004489 objs = X509_STORE_get0_objects(store);
4490 for (i = 0; i < sk_X509_OBJECT_num(objs); i++) {
Christian Heimes9a5395a2013-06-17 15:44:12 +02004491 X509_OBJECT *obj;
4492 X509 *cert;
4493
Christian Heimes598894f2016-09-05 23:19:05 +02004494 obj = sk_X509_OBJECT_value(objs, i);
4495 if (X509_OBJECT_get_type(obj) != X509_LU_X509) {
Christian Heimes9a5395a2013-06-17 15:44:12 +02004496 /* not a x509 cert */
4497 continue;
4498 }
4499 /* CA for any purpose */
Christian Heimes598894f2016-09-05 23:19:05 +02004500 cert = X509_OBJECT_get0_X509(obj);
Christian Heimes9a5395a2013-06-17 15:44:12 +02004501 if (!X509_check_ca(cert)) {
4502 continue;
4503 }
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004504 if (binary_form) {
Christian Heimes9a5395a2013-06-17 15:44:12 +02004505 ci = _certificate_to_der(cert);
4506 } else {
4507 ci = _decode_certificate(cert);
4508 }
4509 if (ci == NULL) {
4510 goto error;
4511 }
4512 if (PyList_Append(rlist, ci) == -1) {
4513 goto error;
4514 }
4515 Py_CLEAR(ci);
4516 }
4517 return rlist;
4518
4519 error:
4520 Py_XDECREF(ci);
4521 Py_XDECREF(rlist);
4522 return NULL;
4523}
4524
4525
Antoine Pitrou152efa22010-05-16 18:19:27 +00004526static PyGetSetDef context_getsetlist[] = {
Christian Heimes1aa9a752013-12-02 02:41:19 +01004527 {"check_hostname", (getter) get_check_hostname,
4528 (setter) set_check_hostname, NULL},
Christian Heimes61d478c2018-01-27 15:51:38 +01004529 {"_host_flags", (getter) get_host_flags,
4530 (setter) set_host_flags, NULL},
Christian Heimes698dde12018-02-27 11:54:43 +01004531#if SSL_CTRL_GET_MAX_PROTO_VERSION
4532 {"minimum_version", (getter) get_minimum_version,
4533 (setter) set_minimum_version, NULL},
4534 {"maximum_version", (getter) get_maximum_version,
4535 (setter) set_maximum_version, NULL},
4536#endif
Christian Heimes11a14932018-02-24 02:35:08 +01004537 {"sni_callback", (getter) get_sni_callback,
Christian Heimes698dde12018-02-27 11:54:43 +01004538 (setter) set_sni_callback, PySSLContext_sni_callback_doc},
Antoine Pitroub5218772010-05-21 09:56:06 +00004539 {"options", (getter) get_options,
4540 (setter) set_options, NULL},
Christian Heimes9fb051f2018-09-23 08:32:31 +02004541 {"post_handshake_auth", (getter) get_post_handshake_auth,
4542#ifdef TLS1_3_VERSION
4543 (setter) set_post_handshake_auth,
4544#else
4545 NULL,
4546#endif
4547 NULL},
Christian Heimes11a14932018-02-24 02:35:08 +01004548 {"protocol", (getter) get_protocol,
4549 NULL, NULL},
Christian Heimes22587792013-11-21 23:56:13 +01004550 {"verify_flags", (getter) get_verify_flags,
4551 (setter) set_verify_flags, NULL},
Antoine Pitrou152efa22010-05-16 18:19:27 +00004552 {"verify_mode", (getter) get_verify_mode,
4553 (setter) set_verify_mode, NULL},
4554 {NULL}, /* sentinel */
4555};
4556
4557static struct PyMethodDef context_methods[] = {
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004558 _SSL__SSLCONTEXT__WRAP_SOCKET_METHODDEF
4559 _SSL__SSLCONTEXT__WRAP_BIO_METHODDEF
4560 _SSL__SSLCONTEXT_SET_CIPHERS_METHODDEF
4561 _SSL__SSLCONTEXT__SET_ALPN_PROTOCOLS_METHODDEF
4562 _SSL__SSLCONTEXT__SET_NPN_PROTOCOLS_METHODDEF
4563 _SSL__SSLCONTEXT_LOAD_CERT_CHAIN_METHODDEF
4564 _SSL__SSLCONTEXT_LOAD_DH_PARAMS_METHODDEF
4565 _SSL__SSLCONTEXT_LOAD_VERIFY_LOCATIONS_METHODDEF
4566 _SSL__SSLCONTEXT_SESSION_STATS_METHODDEF
4567 _SSL__SSLCONTEXT_SET_DEFAULT_VERIFY_PATHS_METHODDEF
4568 _SSL__SSLCONTEXT_SET_ECDH_CURVE_METHODDEF
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004569 _SSL__SSLCONTEXT_CERT_STORE_STATS_METHODDEF
4570 _SSL__SSLCONTEXT_GET_CA_CERTS_METHODDEF
Christian Heimes25bfcd52016-09-06 00:04:45 +02004571 _SSL__SSLCONTEXT_GET_CIPHERS_METHODDEF
Antoine Pitrou152efa22010-05-16 18:19:27 +00004572 {NULL, NULL} /* sentinel */
4573};
4574
4575static PyTypeObject PySSLContext_Type = {
4576 PyVarObject_HEAD_INIT(NULL, 0)
4577 "_ssl._SSLContext", /*tp_name*/
4578 sizeof(PySSLContext), /*tp_basicsize*/
4579 0, /*tp_itemsize*/
4580 (destructor)context_dealloc, /*tp_dealloc*/
4581 0, /*tp_print*/
4582 0, /*tp_getattr*/
4583 0, /*tp_setattr*/
4584 0, /*tp_reserved*/
4585 0, /*tp_repr*/
4586 0, /*tp_as_number*/
4587 0, /*tp_as_sequence*/
4588 0, /*tp_as_mapping*/
4589 0, /*tp_hash*/
4590 0, /*tp_call*/
4591 0, /*tp_str*/
4592 0, /*tp_getattro*/
4593 0, /*tp_setattro*/
4594 0, /*tp_as_buffer*/
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004595 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, /*tp_flags*/
Antoine Pitrou152efa22010-05-16 18:19:27 +00004596 0, /*tp_doc*/
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004597 (traverseproc) context_traverse, /*tp_traverse*/
4598 (inquiry) context_clear, /*tp_clear*/
Antoine Pitrou152efa22010-05-16 18:19:27 +00004599 0, /*tp_richcompare*/
4600 0, /*tp_weaklistoffset*/
4601 0, /*tp_iter*/
4602 0, /*tp_iternext*/
4603 context_methods, /*tp_methods*/
4604 0, /*tp_members*/
4605 context_getsetlist, /*tp_getset*/
4606 0, /*tp_base*/
4607 0, /*tp_dict*/
4608 0, /*tp_descr_get*/
4609 0, /*tp_descr_set*/
4610 0, /*tp_dictoffset*/
4611 0, /*tp_init*/
4612 0, /*tp_alloc*/
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004613 _ssl__SSLContext, /*tp_new*/
Antoine Pitrou152efa22010-05-16 18:19:27 +00004614};
4615
4616
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004617/*
4618 * MemoryBIO objects
4619 */
4620
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004621/*[clinic input]
4622@classmethod
4623_ssl.MemoryBIO.__new__
4624
4625[clinic start generated code]*/
4626
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004627static PyObject *
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004628_ssl_MemoryBIO_impl(PyTypeObject *type)
4629/*[clinic end generated code: output=8820a58db78330ac input=26d22e4909ecb1b5]*/
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004630{
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004631 BIO *bio;
4632 PySSLMemoryBIO *self;
4633
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004634 bio = BIO_new(BIO_s_mem());
4635 if (bio == NULL) {
4636 PyErr_SetString(PySSLErrorObject,
4637 "failed to allocate BIO");
4638 return NULL;
4639 }
4640 /* Since our BIO is non-blocking an empty read() does not indicate EOF,
4641 * just that no data is currently available. The SSL routines should retry
4642 * the read, which we can achieve by calling BIO_set_retry_read(). */
4643 BIO_set_retry_read(bio);
4644 BIO_set_mem_eof_return(bio, -1);
4645
4646 assert(type != NULL && type->tp_alloc != NULL);
4647 self = (PySSLMemoryBIO *) type->tp_alloc(type, 0);
4648 if (self == NULL) {
4649 BIO_free(bio);
4650 return NULL;
4651 }
4652 self->bio = bio;
4653 self->eof_written = 0;
4654
4655 return (PyObject *) self;
4656}
4657
4658static void
4659memory_bio_dealloc(PySSLMemoryBIO *self)
4660{
4661 BIO_free(self->bio);
4662 Py_TYPE(self)->tp_free(self);
4663}
4664
4665static PyObject *
4666memory_bio_get_pending(PySSLMemoryBIO *self, void *c)
4667{
Segev Finer5cff6372017-07-27 01:19:17 +03004668 return PyLong_FromSize_t(BIO_ctrl_pending(self->bio));
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004669}
4670
4671PyDoc_STRVAR(PySSL_memory_bio_pending_doc,
4672"The number of bytes pending in the memory BIO.");
4673
4674static PyObject *
4675memory_bio_get_eof(PySSLMemoryBIO *self, void *c)
4676{
4677 return PyBool_FromLong((BIO_ctrl_pending(self->bio) == 0)
4678 && self->eof_written);
4679}
4680
4681PyDoc_STRVAR(PySSL_memory_bio_eof_doc,
4682"Whether the memory BIO is at EOF.");
4683
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004684/*[clinic input]
4685_ssl.MemoryBIO.read
4686 size as len: int = -1
4687 /
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004688
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004689Read up to size bytes from the memory BIO.
4690
4691If size is not specified, read the entire buffer.
4692If the return value is an empty bytes instance, this means either
4693EOF or that no data is available. Use the "eof" property to
4694distinguish between the two.
4695[clinic start generated code]*/
4696
4697static PyObject *
4698_ssl_MemoryBIO_read_impl(PySSLMemoryBIO *self, int len)
4699/*[clinic end generated code: output=a657aa1e79cd01b3 input=574d7be06a902366]*/
4700{
4701 int avail, nbytes;
4702 PyObject *result;
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004703
Segev Finer5cff6372017-07-27 01:19:17 +03004704 avail = (int)Py_MIN(BIO_ctrl_pending(self->bio), INT_MAX);
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004705 if ((len < 0) || (len > avail))
4706 len = avail;
4707
4708 result = PyBytes_FromStringAndSize(NULL, len);
4709 if ((result == NULL) || (len == 0))
4710 return result;
4711
4712 nbytes = BIO_read(self->bio, PyBytes_AS_STRING(result), len);
Zackery Spytz365ad2e2018-10-06 11:41:45 -06004713 if (nbytes < 0) {
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004714 Py_DECREF(result);
Zackery Spytz365ad2e2018-10-06 11:41:45 -06004715 _setSSLError(NULL, 0, __FILE__, __LINE__);
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004716 return NULL;
4717 }
4718
Zackery Spytz365ad2e2018-10-06 11:41:45 -06004719 /* There should never be any short reads but check anyway. */
4720 if (nbytes < len) {
4721 _PyBytes_Resize(&result, nbytes);
4722 }
4723
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004724 return result;
4725}
4726
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004727/*[clinic input]
4728_ssl.MemoryBIO.write
4729 b: Py_buffer
4730 /
4731
4732Writes the bytes b into the memory BIO.
4733
4734Returns the number of bytes written.
4735[clinic start generated code]*/
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004736
4737static PyObject *
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004738_ssl_MemoryBIO_write_impl(PySSLMemoryBIO *self, Py_buffer *b)
4739/*[clinic end generated code: output=156ec59110d75935 input=e45757b3e17c4808]*/
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004740{
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004741 int nbytes;
4742
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004743 if (b->len > INT_MAX) {
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004744 PyErr_Format(PyExc_OverflowError,
4745 "string longer than %d bytes", INT_MAX);
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004746 return NULL;
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004747 }
4748
4749 if (self->eof_written) {
4750 PyErr_SetString(PySSLErrorObject,
4751 "cannot write() after write_eof()");
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004752 return NULL;
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004753 }
4754
Segev Finer5cff6372017-07-27 01:19:17 +03004755 nbytes = BIO_write(self->bio, b->buf, (int)b->len);
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004756 if (nbytes < 0) {
4757 _setSSLError(NULL, 0, __FILE__, __LINE__);
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004758 return NULL;
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004759 }
4760
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004761 return PyLong_FromLong(nbytes);
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004762}
4763
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004764/*[clinic input]
4765_ssl.MemoryBIO.write_eof
4766
4767Write an EOF marker to the memory BIO.
4768
4769When all data has been read, the "eof" property will be True.
4770[clinic start generated code]*/
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004771
4772static PyObject *
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004773_ssl_MemoryBIO_write_eof_impl(PySSLMemoryBIO *self)
4774/*[clinic end generated code: output=d4106276ccd1ed34 input=56a945f1d29e8bd6]*/
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004775{
4776 self->eof_written = 1;
4777 /* After an EOF is written, a zero return from read() should be a real EOF
4778 * i.e. it should not be retried. Clear the SHOULD_RETRY flag. */
4779 BIO_clear_retry_flags(self->bio);
4780 BIO_set_mem_eof_return(self->bio, 0);
4781
4782 Py_RETURN_NONE;
4783}
4784
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004785static PyGetSetDef memory_bio_getsetlist[] = {
4786 {"pending", (getter) memory_bio_get_pending, NULL,
4787 PySSL_memory_bio_pending_doc},
4788 {"eof", (getter) memory_bio_get_eof, NULL,
4789 PySSL_memory_bio_eof_doc},
4790 {NULL}, /* sentinel */
4791};
4792
4793static struct PyMethodDef memory_bio_methods[] = {
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004794 _SSL_MEMORYBIO_READ_METHODDEF
4795 _SSL_MEMORYBIO_WRITE_METHODDEF
4796 _SSL_MEMORYBIO_WRITE_EOF_METHODDEF
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004797 {NULL, NULL} /* sentinel */
4798};
4799
4800static PyTypeObject PySSLMemoryBIO_Type = {
4801 PyVarObject_HEAD_INIT(NULL, 0)
4802 "_ssl.MemoryBIO", /*tp_name*/
4803 sizeof(PySSLMemoryBIO), /*tp_basicsize*/
4804 0, /*tp_itemsize*/
4805 (destructor)memory_bio_dealloc, /*tp_dealloc*/
4806 0, /*tp_print*/
4807 0, /*tp_getattr*/
4808 0, /*tp_setattr*/
4809 0, /*tp_reserved*/
4810 0, /*tp_repr*/
4811 0, /*tp_as_number*/
4812 0, /*tp_as_sequence*/
4813 0, /*tp_as_mapping*/
4814 0, /*tp_hash*/
4815 0, /*tp_call*/
4816 0, /*tp_str*/
4817 0, /*tp_getattro*/
4818 0, /*tp_setattro*/
4819 0, /*tp_as_buffer*/
4820 Py_TPFLAGS_DEFAULT, /*tp_flags*/
4821 0, /*tp_doc*/
4822 0, /*tp_traverse*/
4823 0, /*tp_clear*/
4824 0, /*tp_richcompare*/
4825 0, /*tp_weaklistoffset*/
4826 0, /*tp_iter*/
4827 0, /*tp_iternext*/
4828 memory_bio_methods, /*tp_methods*/
4829 0, /*tp_members*/
4830 memory_bio_getsetlist, /*tp_getset*/
4831 0, /*tp_base*/
4832 0, /*tp_dict*/
4833 0, /*tp_descr_get*/
4834 0, /*tp_descr_set*/
4835 0, /*tp_dictoffset*/
4836 0, /*tp_init*/
4837 0, /*tp_alloc*/
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004838 _ssl_MemoryBIO, /*tp_new*/
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004839};
4840
Antoine Pitrou152efa22010-05-16 18:19:27 +00004841
Christian Heimes99a65702016-09-10 23:44:53 +02004842/*
4843 * SSL Session object
4844 */
4845
4846static void
4847PySSLSession_dealloc(PySSLSession *self)
4848{
INADA Naokia6296d32017-08-24 14:55:17 +09004849 /* bpo-31095: UnTrack is needed before calling any callbacks */
Christian Heimesa5d07652016-09-24 10:48:05 +02004850 PyObject_GC_UnTrack(self);
Christian Heimes99a65702016-09-10 23:44:53 +02004851 Py_XDECREF(self->ctx);
4852 if (self->session != NULL) {
4853 SSL_SESSION_free(self->session);
4854 }
Christian Heimesa5d07652016-09-24 10:48:05 +02004855 PyObject_GC_Del(self);
Christian Heimes99a65702016-09-10 23:44:53 +02004856}
4857
4858static PyObject *
4859PySSLSession_richcompare(PyObject *left, PyObject *right, int op)
4860{
4861 int result;
4862
4863 if (left == NULL || right == NULL) {
4864 PyErr_BadInternalCall();
4865 return NULL;
4866 }
4867
4868 if (!PySSLSession_Check(left) || !PySSLSession_Check(right)) {
4869 Py_RETURN_NOTIMPLEMENTED;
4870 }
4871
4872 if (left == right) {
4873 result = 0;
4874 } else {
4875 const unsigned char *left_id, *right_id;
4876 unsigned int left_len, right_len;
4877 left_id = SSL_SESSION_get_id(((PySSLSession *)left)->session,
4878 &left_len);
4879 right_id = SSL_SESSION_get_id(((PySSLSession *)right)->session,
4880 &right_len);
4881 if (left_len == right_len) {
4882 result = memcmp(left_id, right_id, left_len);
4883 } else {
4884 result = 1;
4885 }
4886 }
4887
4888 switch (op) {
4889 case Py_EQ:
4890 if (result == 0) {
4891 Py_RETURN_TRUE;
4892 } else {
4893 Py_RETURN_FALSE;
4894 }
4895 break;
4896 case Py_NE:
4897 if (result != 0) {
4898 Py_RETURN_TRUE;
4899 } else {
4900 Py_RETURN_FALSE;
4901 }
4902 break;
4903 case Py_LT:
4904 case Py_LE:
4905 case Py_GT:
4906 case Py_GE:
4907 Py_RETURN_NOTIMPLEMENTED;
4908 break;
4909 default:
4910 PyErr_BadArgument();
4911 return NULL;
4912 }
4913}
4914
4915static int
4916PySSLSession_traverse(PySSLSession *self, visitproc visit, void *arg)
4917{
4918 Py_VISIT(self->ctx);
4919 return 0;
4920}
4921
4922static int
4923PySSLSession_clear(PySSLSession *self)
4924{
4925 Py_CLEAR(self->ctx);
4926 return 0;
4927}
4928
4929
4930static PyObject *
4931PySSLSession_get_time(PySSLSession *self, void *closure) {
4932 return PyLong_FromLong(SSL_SESSION_get_time(self->session));
4933}
4934
4935PyDoc_STRVAR(PySSLSession_get_time_doc,
4936"Session creation time (seconds since epoch).");
4937
4938
4939static PyObject *
4940PySSLSession_get_timeout(PySSLSession *self, void *closure) {
4941 return PyLong_FromLong(SSL_SESSION_get_timeout(self->session));
4942}
4943
4944PyDoc_STRVAR(PySSLSession_get_timeout_doc,
4945"Session timeout (delta in seconds).");
4946
4947
4948static PyObject *
4949PySSLSession_get_ticket_lifetime_hint(PySSLSession *self, void *closure) {
4950 unsigned long hint = SSL_SESSION_get_ticket_lifetime_hint(self->session);
4951 return PyLong_FromUnsignedLong(hint);
4952}
4953
4954PyDoc_STRVAR(PySSLSession_get_ticket_lifetime_hint_doc,
4955"Ticket life time hint.");
4956
4957
4958static PyObject *
4959PySSLSession_get_session_id(PySSLSession *self, void *closure) {
4960 const unsigned char *id;
4961 unsigned int len;
4962 id = SSL_SESSION_get_id(self->session, &len);
4963 return PyBytes_FromStringAndSize((const char *)id, len);
4964}
4965
4966PyDoc_STRVAR(PySSLSession_get_session_id_doc,
4967"Session id");
4968
4969
4970static PyObject *
4971PySSLSession_get_has_ticket(PySSLSession *self, void *closure) {
4972 if (SSL_SESSION_has_ticket(self->session)) {
4973 Py_RETURN_TRUE;
4974 } else {
4975 Py_RETURN_FALSE;
4976 }
4977}
4978
4979PyDoc_STRVAR(PySSLSession_get_has_ticket_doc,
4980"Does the session contain a ticket?");
4981
4982
4983static PyGetSetDef PySSLSession_getsetlist[] = {
4984 {"has_ticket", (getter) PySSLSession_get_has_ticket, NULL,
4985 PySSLSession_get_has_ticket_doc},
4986 {"id", (getter) PySSLSession_get_session_id, NULL,
4987 PySSLSession_get_session_id_doc},
4988 {"ticket_lifetime_hint", (getter) PySSLSession_get_ticket_lifetime_hint,
4989 NULL, PySSLSession_get_ticket_lifetime_hint_doc},
4990 {"time", (getter) PySSLSession_get_time, NULL,
4991 PySSLSession_get_time_doc},
4992 {"timeout", (getter) PySSLSession_get_timeout, NULL,
4993 PySSLSession_get_timeout_doc},
4994 {NULL}, /* sentinel */
4995};
4996
4997static PyTypeObject PySSLSession_Type = {
4998 PyVarObject_HEAD_INIT(NULL, 0)
4999 "_ssl.Session", /*tp_name*/
5000 sizeof(PySSLSession), /*tp_basicsize*/
5001 0, /*tp_itemsize*/
5002 (destructor)PySSLSession_dealloc, /*tp_dealloc*/
5003 0, /*tp_print*/
5004 0, /*tp_getattr*/
5005 0, /*tp_setattr*/
5006 0, /*tp_reserved*/
5007 0, /*tp_repr*/
5008 0, /*tp_as_number*/
5009 0, /*tp_as_sequence*/
5010 0, /*tp_as_mapping*/
5011 0, /*tp_hash*/
5012 0, /*tp_call*/
5013 0, /*tp_str*/
5014 0, /*tp_getattro*/
5015 0, /*tp_setattro*/
5016 0, /*tp_as_buffer*/
Christian Heimesa5d07652016-09-24 10:48:05 +02005017 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /*tp_flags*/
Christian Heimes99a65702016-09-10 23:44:53 +02005018 0, /*tp_doc*/
5019 (traverseproc)PySSLSession_traverse, /*tp_traverse*/
5020 (inquiry)PySSLSession_clear, /*tp_clear*/
5021 PySSLSession_richcompare, /*tp_richcompare*/
5022 0, /*tp_weaklistoffset*/
5023 0, /*tp_iter*/
5024 0, /*tp_iternext*/
5025 0, /*tp_methods*/
5026 0, /*tp_members*/
5027 PySSLSession_getsetlist, /*tp_getset*/
5028};
5029
5030
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005031/* helper routines for seeding the SSL PRNG */
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03005032/*[clinic input]
5033_ssl.RAND_add
Larry Hastingsdbfdc382015-05-04 06:59:46 -07005034 string as view: Py_buffer(accept={str, buffer})
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03005035 entropy: double
5036 /
5037
5038Mix string into the OpenSSL PRNG state.
5039
5040entropy (a float) is a lower bound on the entropy contained in
Chandan Kumar63c2c8a2017-06-09 15:13:58 +05305041string. See RFC 4086.
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03005042[clinic start generated code]*/
5043
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005044static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03005045_ssl_RAND_add_impl(PyObject *module, Py_buffer *view, double entropy)
Serhiy Storchaka5f31d5c2017-06-10 13:13:51 +03005046/*[clinic end generated code: output=e6dd48df9c9024e9 input=5c33017422828f5c]*/
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005047{
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005048 const char *buf;
Victor Stinner2e57b4e2014-07-01 16:37:17 +02005049 Py_ssize_t len, written;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005050
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03005051 buf = (const char *)view->buf;
5052 len = view->len;
Victor Stinner2e57b4e2014-07-01 16:37:17 +02005053 do {
5054 written = Py_MIN(len, INT_MAX);
5055 RAND_add(buf, (int)written, entropy);
5056 buf += written;
5057 len -= written;
5058 } while (len);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02005059 Py_RETURN_NONE;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005060}
5061
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005062static PyObject *
Victor Stinner99c8b162011-05-24 12:05:19 +02005063PySSL_RAND(int len, int pseudo)
5064{
5065 int ok;
5066 PyObject *bytes;
5067 unsigned long err;
5068 const char *errstr;
5069 PyObject *v;
5070
Victor Stinner1e81a392013-12-19 16:47:04 +01005071 if (len < 0) {
5072 PyErr_SetString(PyExc_ValueError, "num must be positive");
5073 return NULL;
5074 }
5075
Victor Stinner99c8b162011-05-24 12:05:19 +02005076 bytes = PyBytes_FromStringAndSize(NULL, len);
5077 if (bytes == NULL)
5078 return NULL;
5079 if (pseudo) {
5080 ok = RAND_pseudo_bytes((unsigned char*)PyBytes_AS_STRING(bytes), len);
5081 if (ok == 0 || ok == 1)
5082 return Py_BuildValue("NO", bytes, ok == 1 ? Py_True : Py_False);
5083 }
5084 else {
5085 ok = RAND_bytes((unsigned char*)PyBytes_AS_STRING(bytes), len);
5086 if (ok == 1)
5087 return bytes;
5088 }
5089 Py_DECREF(bytes);
5090
5091 err = ERR_get_error();
5092 errstr = ERR_reason_error_string(err);
5093 v = Py_BuildValue("(ks)", err, errstr);
5094 if (v != NULL) {
5095 PyErr_SetObject(PySSLErrorObject, v);
5096 Py_DECREF(v);
5097 }
5098 return NULL;
5099}
5100
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03005101/*[clinic input]
5102_ssl.RAND_bytes
5103 n: int
5104 /
5105
5106Generate n cryptographically strong pseudo-random bytes.
5107[clinic start generated code]*/
5108
Victor Stinner99c8b162011-05-24 12:05:19 +02005109static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03005110_ssl_RAND_bytes_impl(PyObject *module, int n)
5111/*[clinic end generated code: output=977da635e4838bc7 input=678ddf2872dfebfc]*/
Victor Stinner99c8b162011-05-24 12:05:19 +02005112{
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03005113 return PySSL_RAND(n, 0);
Victor Stinner99c8b162011-05-24 12:05:19 +02005114}
5115
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03005116/*[clinic input]
5117_ssl.RAND_pseudo_bytes
5118 n: int
5119 /
5120
5121Generate n pseudo-random bytes.
5122
5123Return a pair (bytes, is_cryptographic). is_cryptographic is True
5124if the bytes generated are cryptographically strong.
5125[clinic start generated code]*/
Victor Stinner99c8b162011-05-24 12:05:19 +02005126
5127static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03005128_ssl_RAND_pseudo_bytes_impl(PyObject *module, int n)
5129/*[clinic end generated code: output=b1509e937000e52d input=58312bd53f9bbdd0]*/
Victor Stinner99c8b162011-05-24 12:05:19 +02005130{
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03005131 return PySSL_RAND(n, 1);
Victor Stinner99c8b162011-05-24 12:05:19 +02005132}
5133
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03005134/*[clinic input]
5135_ssl.RAND_status
5136
5137Returns 1 if the OpenSSL PRNG has been seeded with enough data and 0 if not.
5138
5139It is necessary to seed the PRNG with RAND_add() on some platforms before
5140using the ssl() function.
5141[clinic start generated code]*/
Victor Stinner99c8b162011-05-24 12:05:19 +02005142
5143static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03005144_ssl_RAND_status_impl(PyObject *module)
5145/*[clinic end generated code: output=7e0aaa2d39fdc1ad input=8a774b02d1dc81f3]*/
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005146{
Christian Heimes217cfd12007-12-02 14:31:20 +00005147 return PyLong_FromLong(RAND_status());
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005148}
5149
Benjamin Petersonb8a2f512016-07-06 23:55:15 -07005150#ifndef OPENSSL_NO_EGD
Christian Heimesa5d07652016-09-24 10:48:05 +02005151/* LCOV_EXCL_START */
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03005152/*[clinic input]
5153_ssl.RAND_egd
5154 path: object(converter="PyUnicode_FSConverter")
5155 /
5156
5157Queries the entropy gather daemon (EGD) on the socket named by 'path'.
5158
5159Returns number of bytes read. Raises SSLError if connection to EGD
5160fails or if it does not provide enough data to seed PRNG.
5161[clinic start generated code]*/
5162
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005163static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03005164_ssl_RAND_egd_impl(PyObject *module, PyObject *path)
5165/*[clinic end generated code: output=02a67c7c367f52fa input=1aeb7eb948312195]*/
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005166{
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03005167 int bytes = RAND_egd(PyBytes_AsString(path));
Victor Stinnerf9faaad2010-05-16 21:36:37 +00005168 Py_DECREF(path);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005169 if (bytes == -1) {
Antoine Pitrou525807b2010-05-12 14:05:24 +00005170 PyErr_SetString(PySSLErrorObject,
5171 "EGD connection failed or EGD did not return "
5172 "enough data to seed the PRNG");
5173 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005174 }
Christian Heimes217cfd12007-12-02 14:31:20 +00005175 return PyLong_FromLong(bytes);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005176}
Christian Heimesa5d07652016-09-24 10:48:05 +02005177/* LCOV_EXCL_STOP */
Benjamin Petersonb8a2f512016-07-06 23:55:15 -07005178#endif /* OPENSSL_NO_EGD */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005179
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005180
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03005181
5182/*[clinic input]
5183_ssl.get_default_verify_paths
5184
5185Return search paths and environment vars that are used by SSLContext's set_default_verify_paths() to load default CAs.
5186
5187The values are 'cert_file_env', 'cert_file', 'cert_dir_env', 'cert_dir'.
5188[clinic start generated code]*/
Christian Heimes6d7ad132013-06-09 18:02:55 +02005189
5190static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03005191_ssl_get_default_verify_paths_impl(PyObject *module)
5192/*[clinic end generated code: output=e5b62a466271928b input=5210c953d98c3eb5]*/
Christian Heimes6d7ad132013-06-09 18:02:55 +02005193{
5194 PyObject *ofile_env = NULL;
5195 PyObject *ofile = NULL;
5196 PyObject *odir_env = NULL;
5197 PyObject *odir = NULL;
5198
Benjamin Petersond113c962015-07-18 10:59:13 -07005199#define CONVERT(info, target) { \
Christian Heimes6d7ad132013-06-09 18:02:55 +02005200 const char *tmp = (info); \
5201 target = NULL; \
5202 if (!tmp) { Py_INCREF(Py_None); target = Py_None; } \
5203 else if ((target = PyUnicode_DecodeFSDefault(tmp)) == NULL) { \
5204 target = PyBytes_FromString(tmp); } \
5205 if (!target) goto error; \
Benjamin Peterson025a1fd2015-11-14 15:12:38 -08005206 }
Christian Heimes6d7ad132013-06-09 18:02:55 +02005207
Benjamin Petersond113c962015-07-18 10:59:13 -07005208 CONVERT(X509_get_default_cert_file_env(), ofile_env);
5209 CONVERT(X509_get_default_cert_file(), ofile);
5210 CONVERT(X509_get_default_cert_dir_env(), odir_env);
5211 CONVERT(X509_get_default_cert_dir(), odir);
5212#undef CONVERT
Christian Heimes6d7ad132013-06-09 18:02:55 +02005213
Christian Heimes200bb1b2013-06-14 15:14:29 +02005214 return Py_BuildValue("NNNN", ofile_env, ofile, odir_env, odir);
Christian Heimes6d7ad132013-06-09 18:02:55 +02005215
5216 error:
5217 Py_XDECREF(ofile_env);
5218 Py_XDECREF(ofile);
5219 Py_XDECREF(odir_env);
5220 Py_XDECREF(odir);
5221 return NULL;
5222}
5223
Christian Heimesa6bc95a2013-11-17 19:59:14 +01005224static PyObject*
5225asn1obj2py(ASN1_OBJECT *obj)
5226{
5227 int nid;
5228 const char *ln, *sn;
Christian Heimesa6bc95a2013-11-17 19:59:14 +01005229
5230 nid = OBJ_obj2nid(obj);
5231 if (nid == NID_undef) {
5232 PyErr_Format(PyExc_ValueError, "Unknown object");
5233 return NULL;
5234 }
5235 sn = OBJ_nid2sn(nid);
5236 ln = OBJ_nid2ln(nid);
Serhiy Storchakae503ca52017-09-05 01:28:53 +03005237 return Py_BuildValue("issN", nid, sn, ln, _asn1obj2py(obj, 1));
Christian Heimesa6bc95a2013-11-17 19:59:14 +01005238}
5239
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03005240/*[clinic input]
5241_ssl.txt2obj
5242 txt: str
5243 name: bool = False
Christian Heimesa6bc95a2013-11-17 19:59:14 +01005244
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03005245Lookup NID, short name, long name and OID of an ASN1_OBJECT.
5246
5247By default objects are looked up by OID. With name=True short and
5248long name are also matched.
5249[clinic start generated code]*/
5250
5251static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03005252_ssl_txt2obj_impl(PyObject *module, const char *txt, int name)
5253/*[clinic end generated code: output=c38e3991347079c1 input=1c1e7d0aa7c48602]*/
Christian Heimesa6bc95a2013-11-17 19:59:14 +01005254{
Christian Heimesa6bc95a2013-11-17 19:59:14 +01005255 PyObject *result = NULL;
Christian Heimesa6bc95a2013-11-17 19:59:14 +01005256 ASN1_OBJECT *obj;
5257
Christian Heimesa6bc95a2013-11-17 19:59:14 +01005258 obj = OBJ_txt2obj(txt, name ? 0 : 1);
5259 if (obj == NULL) {
Christian Heimes5398e1a2013-11-22 16:20:53 +01005260 PyErr_Format(PyExc_ValueError, "unknown object '%.100s'", txt);
Christian Heimesa6bc95a2013-11-17 19:59:14 +01005261 return NULL;
5262 }
5263 result = asn1obj2py(obj);
5264 ASN1_OBJECT_free(obj);
5265 return result;
5266}
5267
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03005268/*[clinic input]
5269_ssl.nid2obj
5270 nid: int
5271 /
Christian Heimesa6bc95a2013-11-17 19:59:14 +01005272
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03005273Lookup NID, short name, long name and OID of an ASN1_OBJECT by NID.
5274[clinic start generated code]*/
5275
5276static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03005277_ssl_nid2obj_impl(PyObject *module, int nid)
5278/*[clinic end generated code: output=4a98ab691cd4f84a input=51787a3bee7d8f98]*/
Christian Heimesa6bc95a2013-11-17 19:59:14 +01005279{
5280 PyObject *result = NULL;
Christian Heimesa6bc95a2013-11-17 19:59:14 +01005281 ASN1_OBJECT *obj;
5282
Christian Heimesa6bc95a2013-11-17 19:59:14 +01005283 if (nid < NID_undef) {
Christian Heimes5398e1a2013-11-22 16:20:53 +01005284 PyErr_SetString(PyExc_ValueError, "NID must be positive.");
Christian Heimesa6bc95a2013-11-17 19:59:14 +01005285 return NULL;
5286 }
5287 obj = OBJ_nid2obj(nid);
5288 if (obj == NULL) {
Christian Heimes5398e1a2013-11-22 16:20:53 +01005289 PyErr_Format(PyExc_ValueError, "unknown NID %i", nid);
Christian Heimesa6bc95a2013-11-17 19:59:14 +01005290 return NULL;
5291 }
5292 result = asn1obj2py(obj);
5293 ASN1_OBJECT_free(obj);
5294 return result;
5295}
5296
Christian Heimes46bebee2013-06-09 19:03:31 +02005297#ifdef _MSC_VER
Christian Heimes44109d72013-11-22 01:51:30 +01005298
5299static PyObject*
5300certEncodingType(DWORD encodingType)
5301{
5302 static PyObject *x509_asn = NULL;
5303 static PyObject *pkcs_7_asn = NULL;
5304
5305 if (x509_asn == NULL) {
5306 x509_asn = PyUnicode_InternFromString("x509_asn");
5307 if (x509_asn == NULL)
5308 return NULL;
5309 }
5310 if (pkcs_7_asn == NULL) {
5311 pkcs_7_asn = PyUnicode_InternFromString("pkcs_7_asn");
5312 if (pkcs_7_asn == NULL)
5313 return NULL;
5314 }
5315 switch(encodingType) {
5316 case X509_ASN_ENCODING:
5317 Py_INCREF(x509_asn);
5318 return x509_asn;
5319 case PKCS_7_ASN_ENCODING:
5320 Py_INCREF(pkcs_7_asn);
5321 return pkcs_7_asn;
5322 default:
5323 return PyLong_FromLong(encodingType);
5324 }
5325}
5326
5327static PyObject*
5328parseKeyUsage(PCCERT_CONTEXT pCertCtx, DWORD flags)
5329{
5330 CERT_ENHKEY_USAGE *usage;
5331 DWORD size, error, i;
5332 PyObject *retval;
5333
5334 if (!CertGetEnhancedKeyUsage(pCertCtx, flags, NULL, &size)) {
5335 error = GetLastError();
5336 if (error == CRYPT_E_NOT_FOUND) {
5337 Py_RETURN_TRUE;
5338 }
5339 return PyErr_SetFromWindowsErr(error);
5340 }
5341
5342 usage = (CERT_ENHKEY_USAGE*)PyMem_Malloc(size);
5343 if (usage == NULL) {
5344 return PyErr_NoMemory();
5345 }
5346
5347 /* Now get the actual enhanced usage property */
5348 if (!CertGetEnhancedKeyUsage(pCertCtx, flags, usage, &size)) {
5349 PyMem_Free(usage);
5350 error = GetLastError();
5351 if (error == CRYPT_E_NOT_FOUND) {
5352 Py_RETURN_TRUE;
5353 }
5354 return PyErr_SetFromWindowsErr(error);
5355 }
5356 retval = PySet_New(NULL);
5357 if (retval == NULL) {
5358 goto error;
5359 }
5360 for (i = 0; i < usage->cUsageIdentifier; ++i) {
5361 if (usage->rgpszUsageIdentifier[i]) {
5362 PyObject *oid;
5363 int err;
5364 oid = PyUnicode_FromString(usage->rgpszUsageIdentifier[i]);
5365 if (oid == NULL) {
5366 Py_CLEAR(retval);
5367 goto error;
5368 }
5369 err = PySet_Add(retval, oid);
5370 Py_DECREF(oid);
5371 if (err == -1) {
5372 Py_CLEAR(retval);
5373 goto error;
5374 }
5375 }
5376 }
5377 error:
5378 PyMem_Free(usage);
5379 return retval;
5380}
5381
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03005382/*[clinic input]
5383_ssl.enum_certificates
5384 store_name: str
5385
5386Retrieve certificates from Windows' cert store.
5387
5388store_name may be one of 'CA', 'ROOT' or 'MY'. The system may provide
5389more cert storages, too. The function returns a list of (bytes,
5390encoding_type, trust) tuples. The encoding_type flag can be interpreted
5391with X509_ASN_ENCODING or PKCS_7_ASN_ENCODING. The trust setting is either
5392a set of OIDs or the boolean True.
5393[clinic start generated code]*/
Bill Janssen40a0f662008-08-12 16:56:25 +00005394
Christian Heimes46bebee2013-06-09 19:03:31 +02005395static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03005396_ssl_enum_certificates_impl(PyObject *module, const char *store_name)
5397/*[clinic end generated code: output=5134dc8bb3a3c893 input=915f60d70461ea4e]*/
Christian Heimes46bebee2013-06-09 19:03:31 +02005398{
Christian Heimes46bebee2013-06-09 19:03:31 +02005399 HCERTSTORE hStore = NULL;
Christian Heimes44109d72013-11-22 01:51:30 +01005400 PCCERT_CONTEXT pCertCtx = NULL;
5401 PyObject *keyusage = NULL, *cert = NULL, *enc = NULL, *tup = NULL;
Christian Heimes46bebee2013-06-09 19:03:31 +02005402 PyObject *result = NULL;
Christian Heimes46bebee2013-06-09 19:03:31 +02005403
Christian Heimes44109d72013-11-22 01:51:30 +01005404 result = PyList_New(0);
5405 if (result == NULL) {
5406 return NULL;
5407 }
Benjamin Peterson94912722016-02-17 22:13:19 -08005408 hStore = CertOpenStore(CERT_STORE_PROV_SYSTEM_A, 0, (HCRYPTPROV)NULL,
5409 CERT_STORE_READONLY_FLAG | CERT_SYSTEM_STORE_LOCAL_MACHINE,
5410 store_name);
Christian Heimes44109d72013-11-22 01:51:30 +01005411 if (hStore == NULL) {
Christian Heimes46bebee2013-06-09 19:03:31 +02005412 Py_DECREF(result);
5413 return PyErr_SetFromWindowsErr(GetLastError());
5414 }
5415
Christian Heimes44109d72013-11-22 01:51:30 +01005416 while (pCertCtx = CertEnumCertificatesInStore(hStore, pCertCtx)) {
5417 cert = PyBytes_FromStringAndSize((const char*)pCertCtx->pbCertEncoded,
5418 pCertCtx->cbCertEncoded);
5419 if (!cert) {
5420 Py_CLEAR(result);
5421 break;
Christian Heimes46bebee2013-06-09 19:03:31 +02005422 }
Christian Heimes44109d72013-11-22 01:51:30 +01005423 if ((enc = certEncodingType(pCertCtx->dwCertEncodingType)) == NULL) {
5424 Py_CLEAR(result);
5425 break;
Christian Heimes46bebee2013-06-09 19:03:31 +02005426 }
Christian Heimes44109d72013-11-22 01:51:30 +01005427 keyusage = parseKeyUsage(pCertCtx, CERT_FIND_PROP_ONLY_ENHKEY_USAGE_FLAG);
5428 if (keyusage == Py_True) {
5429 Py_DECREF(keyusage);
5430 keyusage = parseKeyUsage(pCertCtx, CERT_FIND_EXT_ONLY_ENHKEY_USAGE_FLAG);
Christian Heimes46bebee2013-06-09 19:03:31 +02005431 }
Christian Heimes44109d72013-11-22 01:51:30 +01005432 if (keyusage == NULL) {
5433 Py_CLEAR(result);
5434 break;
Christian Heimes46bebee2013-06-09 19:03:31 +02005435 }
Christian Heimes44109d72013-11-22 01:51:30 +01005436 if ((tup = PyTuple_New(3)) == NULL) {
5437 Py_CLEAR(result);
5438 break;
5439 }
5440 PyTuple_SET_ITEM(tup, 0, cert);
5441 cert = NULL;
5442 PyTuple_SET_ITEM(tup, 1, enc);
5443 enc = NULL;
5444 PyTuple_SET_ITEM(tup, 2, keyusage);
5445 keyusage = NULL;
5446 if (PyList_Append(result, tup) < 0) {
5447 Py_CLEAR(result);
5448 break;
5449 }
5450 Py_CLEAR(tup);
5451 }
5452 if (pCertCtx) {
5453 /* loop ended with an error, need to clean up context manually */
5454 CertFreeCertificateContext(pCertCtx);
Christian Heimes46bebee2013-06-09 19:03:31 +02005455 }
5456
5457 /* In error cases cert, enc and tup may not be NULL */
5458 Py_XDECREF(cert);
5459 Py_XDECREF(enc);
Christian Heimes44109d72013-11-22 01:51:30 +01005460 Py_XDECREF(keyusage);
Christian Heimes46bebee2013-06-09 19:03:31 +02005461 Py_XDECREF(tup);
5462
5463 if (!CertCloseStore(hStore, 0)) {
5464 /* This error case might shadow another exception.*/
Christian Heimes44109d72013-11-22 01:51:30 +01005465 Py_XDECREF(result);
5466 return PyErr_SetFromWindowsErr(GetLastError());
5467 }
5468 return result;
5469}
5470
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03005471/*[clinic input]
5472_ssl.enum_crls
5473 store_name: str
5474
5475Retrieve CRLs from Windows' cert store.
5476
5477store_name may be one of 'CA', 'ROOT' or 'MY'. The system may provide
5478more cert storages, too. The function returns a list of (bytes,
5479encoding_type) tuples. The encoding_type flag can be interpreted with
5480X509_ASN_ENCODING or PKCS_7_ASN_ENCODING.
5481[clinic start generated code]*/
Christian Heimes44109d72013-11-22 01:51:30 +01005482
5483static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03005484_ssl_enum_crls_impl(PyObject *module, const char *store_name)
5485/*[clinic end generated code: output=bce467f60ccd03b6 input=a1f1d7629f1c5d3d]*/
Christian Heimes44109d72013-11-22 01:51:30 +01005486{
Christian Heimes44109d72013-11-22 01:51:30 +01005487 HCERTSTORE hStore = NULL;
5488 PCCRL_CONTEXT pCrlCtx = NULL;
5489 PyObject *crl = NULL, *enc = NULL, *tup = NULL;
5490 PyObject *result = NULL;
5491
Christian Heimes44109d72013-11-22 01:51:30 +01005492 result = PyList_New(0);
5493 if (result == NULL) {
5494 return NULL;
5495 }
Benjamin Peterson94912722016-02-17 22:13:19 -08005496 hStore = CertOpenStore(CERT_STORE_PROV_SYSTEM_A, 0, (HCRYPTPROV)NULL,
5497 CERT_STORE_READONLY_FLAG | CERT_SYSTEM_STORE_LOCAL_MACHINE,
5498 store_name);
Christian Heimes44109d72013-11-22 01:51:30 +01005499 if (hStore == NULL) {
Christian Heimes46bebee2013-06-09 19:03:31 +02005500 Py_DECREF(result);
5501 return PyErr_SetFromWindowsErr(GetLastError());
5502 }
Christian Heimes44109d72013-11-22 01:51:30 +01005503
5504 while (pCrlCtx = CertEnumCRLsInStore(hStore, pCrlCtx)) {
5505 crl = PyBytes_FromStringAndSize((const char*)pCrlCtx->pbCrlEncoded,
5506 pCrlCtx->cbCrlEncoded);
5507 if (!crl) {
5508 Py_CLEAR(result);
5509 break;
5510 }
5511 if ((enc = certEncodingType(pCrlCtx->dwCertEncodingType)) == NULL) {
5512 Py_CLEAR(result);
5513 break;
5514 }
5515 if ((tup = PyTuple_New(2)) == NULL) {
5516 Py_CLEAR(result);
5517 break;
5518 }
5519 PyTuple_SET_ITEM(tup, 0, crl);
5520 crl = NULL;
5521 PyTuple_SET_ITEM(tup, 1, enc);
5522 enc = NULL;
5523
5524 if (PyList_Append(result, tup) < 0) {
5525 Py_CLEAR(result);
5526 break;
5527 }
5528 Py_CLEAR(tup);
Christian Heimes46bebee2013-06-09 19:03:31 +02005529 }
Christian Heimes44109d72013-11-22 01:51:30 +01005530 if (pCrlCtx) {
5531 /* loop ended with an error, need to clean up context manually */
5532 CertFreeCRLContext(pCrlCtx);
5533 }
5534
5535 /* In error cases cert, enc and tup may not be NULL */
5536 Py_XDECREF(crl);
5537 Py_XDECREF(enc);
5538 Py_XDECREF(tup);
5539
5540 if (!CertCloseStore(hStore, 0)) {
5541 /* This error case might shadow another exception.*/
5542 Py_XDECREF(result);
5543 return PyErr_SetFromWindowsErr(GetLastError());
5544 }
5545 return result;
Christian Heimes46bebee2013-06-09 19:03:31 +02005546}
Christian Heimes44109d72013-11-22 01:51:30 +01005547
5548#endif /* _MSC_VER */
Bill Janssen40a0f662008-08-12 16:56:25 +00005549
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005550/* List of functions exported by this module. */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005551static PyMethodDef PySSL_methods[] = {
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03005552 _SSL__TEST_DECODE_CERT_METHODDEF
5553 _SSL_RAND_ADD_METHODDEF
5554 _SSL_RAND_BYTES_METHODDEF
5555 _SSL_RAND_PSEUDO_BYTES_METHODDEF
5556 _SSL_RAND_EGD_METHODDEF
5557 _SSL_RAND_STATUS_METHODDEF
5558 _SSL_GET_DEFAULT_VERIFY_PATHS_METHODDEF
5559 _SSL_ENUM_CERTIFICATES_METHODDEF
5560 _SSL_ENUM_CRLS_METHODDEF
5561 _SSL_TXT2OBJ_METHODDEF
5562 _SSL_NID2OBJ_METHODDEF
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00005563 {NULL, NULL} /* Sentinel */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005564};
5565
5566
Christian Heimes598894f2016-09-05 23:19:05 +02005567#ifdef HAVE_OPENSSL_CRYPTO_LOCK
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005568
5569/* an implementation of OpenSSL threading operations in terms
Christian Heimes598894f2016-09-05 23:19:05 +02005570 * of the Python C thread library
5571 * Only used up to 1.0.2. OpenSSL 1.1.0+ has its own locking code.
5572 */
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005573
5574static PyThread_type_lock *_ssl_locks = NULL;
5575
Christian Heimes4d98ca92013-08-19 17:36:29 +02005576#if OPENSSL_VERSION_NUMBER >= 0x10000000
5577/* use new CRYPTO_THREADID API. */
5578static void
5579_ssl_threadid_callback(CRYPTO_THREADID *id)
5580{
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +02005581 CRYPTO_THREADID_set_numeric(id, PyThread_get_thread_ident());
Christian Heimes4d98ca92013-08-19 17:36:29 +02005582}
5583#else
5584/* deprecated CRYPTO_set_id_callback() API. */
5585static unsigned long
5586_ssl_thread_id_function (void) {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00005587 return PyThread_get_thread_ident();
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005588}
Christian Heimes4d98ca92013-08-19 17:36:29 +02005589#endif
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005590
Bill Janssen6e027db2007-11-15 22:23:56 +00005591static void _ssl_thread_locking_function
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00005592 (int mode, int n, const char *file, int line) {
5593 /* this function is needed to perform locking on shared data
5594 structures. (Note that OpenSSL uses a number of global data
5595 structures that will be implicitly shared whenever multiple
5596 threads use OpenSSL.) Multi-threaded applications will
5597 crash at random if it is not set.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005598
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00005599 locking_function() must be able to handle up to
5600 CRYPTO_num_locks() different mutex locks. It sets the n-th
5601 lock if mode & CRYPTO_LOCK, and releases it otherwise.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005602
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00005603 file and line are the file number of the function setting the
5604 lock. They can be useful for debugging.
5605 */
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005606
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00005607 if ((_ssl_locks == NULL) ||
5608 (n < 0) || ((unsigned)n >= _ssl_locks_count))
5609 return;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005610
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00005611 if (mode & CRYPTO_LOCK) {
5612 PyThread_acquire_lock(_ssl_locks[n], 1);
5613 } else {
5614 PyThread_release_lock(_ssl_locks[n]);
5615 }
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005616}
5617
5618static int _setup_ssl_threads(void) {
5619
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00005620 unsigned int i;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005621
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00005622 if (_ssl_locks == NULL) {
5623 _ssl_locks_count = CRYPTO_num_locks();
Christian Heimesf6365e32016-09-13 20:48:13 +02005624 _ssl_locks = PyMem_Calloc(_ssl_locks_count,
5625 sizeof(PyThread_type_lock));
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02005626 if (_ssl_locks == NULL) {
5627 PyErr_NoMemory();
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00005628 return 0;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02005629 }
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00005630 for (i = 0; i < _ssl_locks_count; i++) {
5631 _ssl_locks[i] = PyThread_allocate_lock();
5632 if (_ssl_locks[i] == NULL) {
5633 unsigned int j;
5634 for (j = 0; j < i; j++) {
5635 PyThread_free_lock(_ssl_locks[j]);
5636 }
Victor Stinnerb6404912013-07-07 16:21:41 +02005637 PyMem_Free(_ssl_locks);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00005638 return 0;
5639 }
5640 }
5641 CRYPTO_set_locking_callback(_ssl_thread_locking_function);
Christian Heimes4d98ca92013-08-19 17:36:29 +02005642#if OPENSSL_VERSION_NUMBER >= 0x10000000
5643 CRYPTO_THREADID_set_callback(_ssl_threadid_callback);
5644#else
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00005645 CRYPTO_set_id_callback(_ssl_thread_id_function);
Christian Heimes4d98ca92013-08-19 17:36:29 +02005646#endif
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00005647 }
5648 return 1;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005649}
5650
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02005651#endif /* HAVE_OPENSSL_CRYPTO_LOCK for OpenSSL < 1.1.0 */
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005652
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005653PyDoc_STRVAR(module_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005654"Implementation module for SSL socket operations. See the socket module\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005655for documentation.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005656
Martin v. Löwis1a214512008-06-11 05:26:20 +00005657
5658static struct PyModuleDef _sslmodule = {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00005659 PyModuleDef_HEAD_INIT,
5660 "_ssl",
5661 module_doc,
5662 -1,
5663 PySSL_methods,
5664 NULL,
5665 NULL,
5666 NULL,
5667 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00005668};
5669
Antoine Pitroub9ac25d2011-07-08 18:47:06 +02005670
5671static void
5672parse_openssl_version(unsigned long libver,
5673 unsigned int *major, unsigned int *minor,
5674 unsigned int *fix, unsigned int *patch,
5675 unsigned int *status)
5676{
5677 *status = libver & 0xF;
5678 libver >>= 4;
5679 *patch = libver & 0xFF;
5680 libver >>= 8;
5681 *fix = libver & 0xFF;
5682 libver >>= 8;
5683 *minor = libver & 0xFF;
5684 libver >>= 8;
5685 *major = libver & 0xFF;
5686}
5687
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005688PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00005689PyInit__ssl(void)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005690{
Christian Heimesb3ad0e52017-09-08 12:00:19 -07005691 PyObject *m, *d, *r, *bases;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00005692 unsigned long libver;
5693 unsigned int major, minor, fix, patch, status;
5694 PySocketModule_APIObject *socket_api;
Antoine Pitrou3b36fb12012-06-22 21:11:52 +02005695 struct py_ssl_error_code *errcode;
5696 struct py_ssl_library_code *libcode;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005697
Antoine Pitrou152efa22010-05-16 18:19:27 +00005698 if (PyType_Ready(&PySSLContext_Type) < 0)
5699 return NULL;
5700 if (PyType_Ready(&PySSLSocket_Type) < 0)
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00005701 return NULL;
Antoine Pitroub1fdf472014-10-05 20:41:53 +02005702 if (PyType_Ready(&PySSLMemoryBIO_Type) < 0)
5703 return NULL;
Christian Heimes99a65702016-09-10 23:44:53 +02005704 if (PyType_Ready(&PySSLSession_Type) < 0)
5705 return NULL;
5706
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005707
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00005708 m = PyModule_Create(&_sslmodule);
5709 if (m == NULL)
5710 return NULL;
5711 d = PyModule_GetDict(m);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005712
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00005713 /* Load _socket module and its C API */
5714 socket_api = PySocketModule_ImportModuleAndAPI();
5715 if (!socket_api)
5716 return NULL;
5717 PySocketModule = *socket_api;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005718
Christian Heimesc941e622017-09-05 15:47:11 +02005719#ifndef OPENSSL_VERSION_1_1
5720 /* Load all algorithms and initialize cpuid */
5721 OPENSSL_add_all_algorithms_noconf();
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00005722 /* Init OpenSSL */
5723 SSL_load_error_strings();
5724 SSL_library_init();
Christian Heimesc941e622017-09-05 15:47:11 +02005725#endif
5726
Christian Heimes598894f2016-09-05 23:19:05 +02005727#ifdef HAVE_OPENSSL_CRYPTO_LOCK
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00005728 /* note that this will start threading if not already started */
5729 if (!_setup_ssl_threads()) {
5730 return NULL;
5731 }
Christian Heimes598894f2016-09-05 23:19:05 +02005732#elif OPENSSL_VERSION_1_1 && defined(OPENSSL_THREADS)
5733 /* OpenSSL 1.1.0 builtin thread support is enabled */
5734 _ssl_locks_count++;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005735#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005736
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00005737 /* Add symbols to module dict */
Antoine Pitrou3b36fb12012-06-22 21:11:52 +02005738 sslerror_type_slots[0].pfunc = PyExc_OSError;
5739 PySSLErrorObject = PyType_FromSpec(&sslerror_type_spec);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00005740 if (PySSLErrorObject == NULL)
5741 return NULL;
Antoine Pitrou3b36fb12012-06-22 21:11:52 +02005742
Christian Heimesb3ad0e52017-09-08 12:00:19 -07005743 /* ssl.CertificateError used to be a subclass of ValueError */
5744 bases = Py_BuildValue("OO", PySSLErrorObject, PyExc_ValueError);
5745 if (bases == NULL)
5746 return NULL;
5747 PySSLCertVerificationErrorObject = PyErr_NewExceptionWithDoc(
5748 "ssl.SSLCertVerificationError", SSLCertVerificationError_doc,
5749 bases, NULL);
5750 Py_DECREF(bases);
Antoine Pitrou41032a62011-10-27 23:56:55 +02005751 PySSLZeroReturnErrorObject = PyErr_NewExceptionWithDoc(
5752 "ssl.SSLZeroReturnError", SSLZeroReturnError_doc,
5753 PySSLErrorObject, NULL);
5754 PySSLWantReadErrorObject = PyErr_NewExceptionWithDoc(
5755 "ssl.SSLWantReadError", SSLWantReadError_doc,
5756 PySSLErrorObject, NULL);
5757 PySSLWantWriteErrorObject = PyErr_NewExceptionWithDoc(
5758 "ssl.SSLWantWriteError", SSLWantWriteError_doc,
5759 PySSLErrorObject, NULL);
5760 PySSLSyscallErrorObject = PyErr_NewExceptionWithDoc(
5761 "ssl.SSLSyscallError", SSLSyscallError_doc,
5762 PySSLErrorObject, NULL);
5763 PySSLEOFErrorObject = PyErr_NewExceptionWithDoc(
5764 "ssl.SSLEOFError", SSLEOFError_doc,
5765 PySSLErrorObject, NULL);
Christian Heimesb3ad0e52017-09-08 12:00:19 -07005766 if (PySSLCertVerificationErrorObject == NULL
5767 || PySSLZeroReturnErrorObject == NULL
Antoine Pitrou41032a62011-10-27 23:56:55 +02005768 || PySSLWantReadErrorObject == NULL
5769 || PySSLWantWriteErrorObject == NULL
5770 || PySSLSyscallErrorObject == NULL
5771 || PySSLEOFErrorObject == NULL)
5772 return NULL;
5773 if (PyDict_SetItemString(d, "SSLError", PySSLErrorObject) != 0
Christian Heimesb3ad0e52017-09-08 12:00:19 -07005774 || PyDict_SetItemString(d, "SSLCertVerificationError",
5775 PySSLCertVerificationErrorObject) != 0
Antoine Pitrou41032a62011-10-27 23:56:55 +02005776 || PyDict_SetItemString(d, "SSLZeroReturnError", PySSLZeroReturnErrorObject) != 0
5777 || PyDict_SetItemString(d, "SSLWantReadError", PySSLWantReadErrorObject) != 0
5778 || PyDict_SetItemString(d, "SSLWantWriteError", PySSLWantWriteErrorObject) != 0
5779 || PyDict_SetItemString(d, "SSLSyscallError", PySSLSyscallErrorObject) != 0
5780 || PyDict_SetItemString(d, "SSLEOFError", PySSLEOFErrorObject) != 0)
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00005781 return NULL;
Antoine Pitrou152efa22010-05-16 18:19:27 +00005782 if (PyDict_SetItemString(d, "_SSLContext",
5783 (PyObject *)&PySSLContext_Type) != 0)
5784 return NULL;
5785 if (PyDict_SetItemString(d, "_SSLSocket",
5786 (PyObject *)&PySSLSocket_Type) != 0)
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00005787 return NULL;
Antoine Pitroub1fdf472014-10-05 20:41:53 +02005788 if (PyDict_SetItemString(d, "MemoryBIO",
5789 (PyObject *)&PySSLMemoryBIO_Type) != 0)
5790 return NULL;
Christian Heimes99a65702016-09-10 23:44:53 +02005791 if (PyDict_SetItemString(d, "SSLSession",
5792 (PyObject *)&PySSLSession_Type) != 0)
5793 return NULL;
5794
Christian Heimes892d66e2018-01-29 14:10:18 +01005795 PyModule_AddStringConstant(m, "_DEFAULT_CIPHERS",
5796 PY_SSL_DEFAULT_CIPHER_STRING);
5797
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00005798 PyModule_AddIntConstant(m, "SSL_ERROR_ZERO_RETURN",
5799 PY_SSL_ERROR_ZERO_RETURN);
5800 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_READ",
5801 PY_SSL_ERROR_WANT_READ);
5802 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_WRITE",
5803 PY_SSL_ERROR_WANT_WRITE);
5804 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_X509_LOOKUP",
5805 PY_SSL_ERROR_WANT_X509_LOOKUP);
5806 PyModule_AddIntConstant(m, "SSL_ERROR_SYSCALL",
5807 PY_SSL_ERROR_SYSCALL);
5808 PyModule_AddIntConstant(m, "SSL_ERROR_SSL",
5809 PY_SSL_ERROR_SSL);
5810 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_CONNECT",
5811 PY_SSL_ERROR_WANT_CONNECT);
5812 /* non ssl.h errorcodes */
5813 PyModule_AddIntConstant(m, "SSL_ERROR_EOF",
5814 PY_SSL_ERROR_EOF);
5815 PyModule_AddIntConstant(m, "SSL_ERROR_INVALID_ERROR_CODE",
5816 PY_SSL_ERROR_INVALID_ERROR_CODE);
5817 /* cert requirements */
5818 PyModule_AddIntConstant(m, "CERT_NONE",
5819 PY_SSL_CERT_NONE);
5820 PyModule_AddIntConstant(m, "CERT_OPTIONAL",
5821 PY_SSL_CERT_OPTIONAL);
5822 PyModule_AddIntConstant(m, "CERT_REQUIRED",
5823 PY_SSL_CERT_REQUIRED);
Christian Heimes22587792013-11-21 23:56:13 +01005824 /* CRL verification for verification_flags */
5825 PyModule_AddIntConstant(m, "VERIFY_DEFAULT",
5826 0);
5827 PyModule_AddIntConstant(m, "VERIFY_CRL_CHECK_LEAF",
5828 X509_V_FLAG_CRL_CHECK);
5829 PyModule_AddIntConstant(m, "VERIFY_CRL_CHECK_CHAIN",
5830 X509_V_FLAG_CRL_CHECK|X509_V_FLAG_CRL_CHECK_ALL);
5831 PyModule_AddIntConstant(m, "VERIFY_X509_STRICT",
5832 X509_V_FLAG_X509_STRICT);
Benjamin Peterson990fcaa2015-03-04 22:49:41 -05005833#ifdef X509_V_FLAG_TRUSTED_FIRST
5834 PyModule_AddIntConstant(m, "VERIFY_X509_TRUSTED_FIRST",
5835 X509_V_FLAG_TRUSTED_FIRST);
5836#endif
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00005837
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01005838 /* Alert Descriptions from ssl.h */
5839 /* note RESERVED constants no longer intended for use have been removed */
5840 /* http://www.iana.org/assignments/tls-parameters/tls-parameters.xml#tls-parameters-6 */
5841
5842#define ADD_AD_CONSTANT(s) \
5843 PyModule_AddIntConstant(m, "ALERT_DESCRIPTION_"#s, \
5844 SSL_AD_##s)
5845
5846 ADD_AD_CONSTANT(CLOSE_NOTIFY);
5847 ADD_AD_CONSTANT(UNEXPECTED_MESSAGE);
5848 ADD_AD_CONSTANT(BAD_RECORD_MAC);
5849 ADD_AD_CONSTANT(RECORD_OVERFLOW);
5850 ADD_AD_CONSTANT(DECOMPRESSION_FAILURE);
5851 ADD_AD_CONSTANT(HANDSHAKE_FAILURE);
5852 ADD_AD_CONSTANT(BAD_CERTIFICATE);
5853 ADD_AD_CONSTANT(UNSUPPORTED_CERTIFICATE);
5854 ADD_AD_CONSTANT(CERTIFICATE_REVOKED);
5855 ADD_AD_CONSTANT(CERTIFICATE_EXPIRED);
5856 ADD_AD_CONSTANT(CERTIFICATE_UNKNOWN);
5857 ADD_AD_CONSTANT(ILLEGAL_PARAMETER);
5858 ADD_AD_CONSTANT(UNKNOWN_CA);
5859 ADD_AD_CONSTANT(ACCESS_DENIED);
5860 ADD_AD_CONSTANT(DECODE_ERROR);
5861 ADD_AD_CONSTANT(DECRYPT_ERROR);
5862 ADD_AD_CONSTANT(PROTOCOL_VERSION);
5863 ADD_AD_CONSTANT(INSUFFICIENT_SECURITY);
5864 ADD_AD_CONSTANT(INTERNAL_ERROR);
5865 ADD_AD_CONSTANT(USER_CANCELLED);
5866 ADD_AD_CONSTANT(NO_RENEGOTIATION);
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01005867 /* Not all constants are in old OpenSSL versions */
Antoine Pitrou912fbff2013-03-30 16:29:32 +01005868#ifdef SSL_AD_UNSUPPORTED_EXTENSION
5869 ADD_AD_CONSTANT(UNSUPPORTED_EXTENSION);
5870#endif
5871#ifdef SSL_AD_CERTIFICATE_UNOBTAINABLE
5872 ADD_AD_CONSTANT(CERTIFICATE_UNOBTAINABLE);
5873#endif
5874#ifdef SSL_AD_UNRECOGNIZED_NAME
5875 ADD_AD_CONSTANT(UNRECOGNIZED_NAME);
5876#endif
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01005877#ifdef SSL_AD_BAD_CERTIFICATE_STATUS_RESPONSE
5878 ADD_AD_CONSTANT(BAD_CERTIFICATE_STATUS_RESPONSE);
5879#endif
5880#ifdef SSL_AD_BAD_CERTIFICATE_HASH_VALUE
5881 ADD_AD_CONSTANT(BAD_CERTIFICATE_HASH_VALUE);
5882#endif
5883#ifdef SSL_AD_UNKNOWN_PSK_IDENTITY
5884 ADD_AD_CONSTANT(UNKNOWN_PSK_IDENTITY);
5885#endif
5886
5887#undef ADD_AD_CONSTANT
5888
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00005889 /* protocol versions */
Victor Stinner3de49192011-05-09 00:42:58 +02005890#ifndef OPENSSL_NO_SSL2
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00005891 PyModule_AddIntConstant(m, "PROTOCOL_SSLv2",
5892 PY_SSL_VERSION_SSL2);
Victor Stinner3de49192011-05-09 00:42:58 +02005893#endif
Benjamin Petersone32467c2014-12-05 21:59:35 -05005894#ifndef OPENSSL_NO_SSL3
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00005895 PyModule_AddIntConstant(m, "PROTOCOL_SSLv3",
5896 PY_SSL_VERSION_SSL3);
Benjamin Petersone32467c2014-12-05 21:59:35 -05005897#endif
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00005898 PyModule_AddIntConstant(m, "PROTOCOL_SSLv23",
Christian Heimes598894f2016-09-05 23:19:05 +02005899 PY_SSL_VERSION_TLS);
5900 PyModule_AddIntConstant(m, "PROTOCOL_TLS",
5901 PY_SSL_VERSION_TLS);
Christian Heimes5fe668c2016-09-12 00:01:11 +02005902 PyModule_AddIntConstant(m, "PROTOCOL_TLS_CLIENT",
5903 PY_SSL_VERSION_TLS_CLIENT);
5904 PyModule_AddIntConstant(m, "PROTOCOL_TLS_SERVER",
5905 PY_SSL_VERSION_TLS_SERVER);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00005906 PyModule_AddIntConstant(m, "PROTOCOL_TLSv1",
5907 PY_SSL_VERSION_TLS1);
Antoine Pitrou2463e5f2013-03-28 22:24:43 +01005908#if HAVE_TLSv1_2
5909 PyModule_AddIntConstant(m, "PROTOCOL_TLSv1_1",
5910 PY_SSL_VERSION_TLS1_1);
5911 PyModule_AddIntConstant(m, "PROTOCOL_TLSv1_2",
5912 PY_SSL_VERSION_TLS1_2);
5913#endif
Antoine Pitrou04f6a322010-04-05 21:40:07 +00005914
Antoine Pitroub5218772010-05-21 09:56:06 +00005915 /* protocol options */
Antoine Pitrou3f366312012-01-27 09:50:45 +01005916 PyModule_AddIntConstant(m, "OP_ALL",
5917 SSL_OP_ALL & ~SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS);
Antoine Pitroub5218772010-05-21 09:56:06 +00005918 PyModule_AddIntConstant(m, "OP_NO_SSLv2", SSL_OP_NO_SSLv2);
5919 PyModule_AddIntConstant(m, "OP_NO_SSLv3", SSL_OP_NO_SSLv3);
5920 PyModule_AddIntConstant(m, "OP_NO_TLSv1", SSL_OP_NO_TLSv1);
Antoine Pitrou2463e5f2013-03-28 22:24:43 +01005921#if HAVE_TLSv1_2
5922 PyModule_AddIntConstant(m, "OP_NO_TLSv1_1", SSL_OP_NO_TLSv1_1);
5923 PyModule_AddIntConstant(m, "OP_NO_TLSv1_2", SSL_OP_NO_TLSv1_2);
5924#endif
Christian Heimescb5b68a2017-09-07 18:07:00 -07005925#ifdef SSL_OP_NO_TLSv1_3
5926 PyModule_AddIntConstant(m, "OP_NO_TLSv1_3", SSL_OP_NO_TLSv1_3);
5927#else
5928 PyModule_AddIntConstant(m, "OP_NO_TLSv1_3", 0);
5929#endif
Antoine Pitrou6db49442011-12-19 13:27:11 +01005930 PyModule_AddIntConstant(m, "OP_CIPHER_SERVER_PREFERENCE",
5931 SSL_OP_CIPHER_SERVER_PREFERENCE);
Antoine Pitrou0e576f12011-12-22 10:03:38 +01005932 PyModule_AddIntConstant(m, "OP_SINGLE_DH_USE", SSL_OP_SINGLE_DH_USE);
Christian Heimes99a65702016-09-10 23:44:53 +02005933 PyModule_AddIntConstant(m, "OP_NO_TICKET", SSL_OP_NO_TICKET);
Antoine Pitroue9fccb32012-02-17 11:53:10 +01005934#ifdef SSL_OP_SINGLE_ECDH_USE
Antoine Pitrou923df6f2011-12-19 17:16:51 +01005935 PyModule_AddIntConstant(m, "OP_SINGLE_ECDH_USE", SSL_OP_SINGLE_ECDH_USE);
Antoine Pitroue9fccb32012-02-17 11:53:10 +01005936#endif
Antoine Pitrou8abdb8a2011-12-20 10:13:40 +01005937#ifdef SSL_OP_NO_COMPRESSION
5938 PyModule_AddIntConstant(m, "OP_NO_COMPRESSION",
5939 SSL_OP_NO_COMPRESSION);
5940#endif
Christian Heimes05d9fe32018-02-27 08:55:39 +01005941#ifdef SSL_OP_ENABLE_MIDDLEBOX_COMPAT
5942 PyModule_AddIntConstant(m, "OP_ENABLE_MIDDLEBOX_COMPAT",
5943 SSL_OP_ENABLE_MIDDLEBOX_COMPAT);
5944#endif
Christian Heimes67c48012018-05-15 16:25:40 -04005945#ifdef SSL_OP_NO_RENEGOTIATION
5946 PyModule_AddIntConstant(m, "OP_NO_RENEGOTIATION",
5947 SSL_OP_NO_RENEGOTIATION);
5948#endif
Antoine Pitroub5218772010-05-21 09:56:06 +00005949
Christian Heimes61d478c2018-01-27 15:51:38 +01005950#ifdef X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT
5951 PyModule_AddIntConstant(m, "HOSTFLAG_ALWAYS_CHECK_SUBJECT",
5952 X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT);
5953#endif
5954#ifdef X509_CHECK_FLAG_NEVER_CHECK_SUBJECT
5955 PyModule_AddIntConstant(m, "HOSTFLAG_NEVER_CHECK_SUBJECT",
5956 X509_CHECK_FLAG_NEVER_CHECK_SUBJECT);
5957#endif
5958#ifdef X509_CHECK_FLAG_NO_WILDCARDS
5959 PyModule_AddIntConstant(m, "HOSTFLAG_NO_WILDCARDS",
5960 X509_CHECK_FLAG_NO_WILDCARDS);
5961#endif
5962#ifdef X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS
5963 PyModule_AddIntConstant(m, "HOSTFLAG_NO_PARTIAL_WILDCARDS",
5964 X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS);
5965#endif
5966#ifdef X509_CHECK_FLAG_MULTI_LABEL_WILDCARDS
5967 PyModule_AddIntConstant(m, "HOSTFLAG_MULTI_LABEL_WILDCARDS",
5968 X509_CHECK_FLAG_MULTI_LABEL_WILDCARDS);
5969#endif
5970#ifdef X509_CHECK_FLAG_SINGLE_LABEL_SUBDOMAINS
5971 PyModule_AddIntConstant(m, "HOSTFLAG_SINGLE_LABEL_SUBDOMAINS",
5972 X509_CHECK_FLAG_SINGLE_LABEL_SUBDOMAINS);
5973#endif
5974
Christian Heimes698dde12018-02-27 11:54:43 +01005975 /* protocol versions */
5976 PyModule_AddIntConstant(m, "PROTO_MINIMUM_SUPPORTED",
5977 PY_PROTO_MINIMUM_SUPPORTED);
5978 PyModule_AddIntConstant(m, "PROTO_MAXIMUM_SUPPORTED",
5979 PY_PROTO_MAXIMUM_SUPPORTED);
5980 PyModule_AddIntConstant(m, "PROTO_SSLv3", PY_PROTO_SSLv3);
5981 PyModule_AddIntConstant(m, "PROTO_TLSv1", PY_PROTO_TLSv1);
5982 PyModule_AddIntConstant(m, "PROTO_TLSv1_1", PY_PROTO_TLSv1_1);
5983 PyModule_AddIntConstant(m, "PROTO_TLSv1_2", PY_PROTO_TLSv1_2);
5984 PyModule_AddIntConstant(m, "PROTO_TLSv1_3", PY_PROTO_TLSv1_3);
Antoine Pitroud5323212010-10-22 18:19:07 +00005985
Christian Heimes698dde12018-02-27 11:54:43 +01005986#define addbool(m, v, b) \
5987 Py_INCREF((b) ? Py_True : Py_False); \
5988 PyModule_AddObject((m), (v), (b) ? Py_True : Py_False);
5989
5990#if HAVE_SNI
5991 addbool(m, "HAS_SNI", 1);
Antoine Pitrou501da612011-12-21 09:27:41 +01005992#else
Christian Heimes698dde12018-02-27 11:54:43 +01005993 addbool(m, "HAS_SNI", 0);
Antoine Pitrou501da612011-12-21 09:27:41 +01005994#endif
Christian Heimes698dde12018-02-27 11:54:43 +01005995
5996 addbool(m, "HAS_TLS_UNIQUE", 1);
5997
5998#ifndef OPENSSL_NO_ECDH
5999 addbool(m, "HAS_ECDH", 1);
6000#else
6001 addbool(m, "HAS_ECDH", 0);
6002#endif
Antoine Pitrou501da612011-12-21 09:27:41 +01006003
Christian Heimes29eab552018-02-25 12:31:33 +01006004#if HAVE_NPN
Christian Heimes698dde12018-02-27 11:54:43 +01006005 addbool(m, "HAS_NPN", 1);
Antoine Pitroud5d17eb2012-03-22 00:23:03 +01006006#else
Christian Heimes698dde12018-02-27 11:54:43 +01006007 addbool(m, "HAS_NPN", 0);
Antoine Pitroud5d17eb2012-03-22 00:23:03 +01006008#endif
Antoine Pitroud5d17eb2012-03-22 00:23:03 +01006009
Christian Heimes29eab552018-02-25 12:31:33 +01006010#if HAVE_ALPN
Christian Heimes698dde12018-02-27 11:54:43 +01006011 addbool(m, "HAS_ALPN", 1);
Benjamin Petersoncca27322015-01-23 16:35:37 -05006012#else
Christian Heimes698dde12018-02-27 11:54:43 +01006013 addbool(m, "HAS_ALPN", 0);
Benjamin Petersoncca27322015-01-23 16:35:37 -05006014#endif
Christian Heimes698dde12018-02-27 11:54:43 +01006015
6016#if defined(SSL2_VERSION) && !defined(OPENSSL_NO_SSL2)
6017 addbool(m, "HAS_SSLv2", 1);
6018#else
6019 addbool(m, "HAS_SSLv2", 0);
6020#endif
6021
6022#if defined(SSL3_VERSION) && !defined(OPENSSL_NO_SSL3)
6023 addbool(m, "HAS_SSLv3", 1);
6024#else
6025 addbool(m, "HAS_SSLv3", 0);
6026#endif
6027
6028#if defined(TLS1_VERSION) && !defined(OPENSSL_NO_TLS1)
6029 addbool(m, "HAS_TLSv1", 1);
6030#else
6031 addbool(m, "HAS_TLSv1", 0);
6032#endif
6033
6034#if defined(TLS1_1_VERSION) && !defined(OPENSSL_NO_TLS1_1)
6035 addbool(m, "HAS_TLSv1_1", 1);
6036#else
6037 addbool(m, "HAS_TLSv1_1", 0);
6038#endif
6039
6040#if defined(TLS1_2_VERSION) && !defined(OPENSSL_NO_TLS1_2)
6041 addbool(m, "HAS_TLSv1_2", 1);
6042#else
6043 addbool(m, "HAS_TLSv1_2", 0);
6044#endif
Benjamin Petersoncca27322015-01-23 16:35:37 -05006045
Christian Heimescb5b68a2017-09-07 18:07:00 -07006046#if defined(TLS1_3_VERSION) && !defined(OPENSSL_NO_TLS1_3)
Christian Heimes698dde12018-02-27 11:54:43 +01006047 addbool(m, "HAS_TLSv1_3", 1);
Christian Heimescb5b68a2017-09-07 18:07:00 -07006048#else
Christian Heimes698dde12018-02-27 11:54:43 +01006049 addbool(m, "HAS_TLSv1_3", 0);
Christian Heimescb5b68a2017-09-07 18:07:00 -07006050#endif
Christian Heimescb5b68a2017-09-07 18:07:00 -07006051
Antoine Pitrou3b36fb12012-06-22 21:11:52 +02006052 /* Mappings for error codes */
6053 err_codes_to_names = PyDict_New();
6054 err_names_to_codes = PyDict_New();
6055 if (err_codes_to_names == NULL || err_names_to_codes == NULL)
6056 return NULL;
6057 errcode = error_codes;
6058 while (errcode->mnemonic != NULL) {
6059 PyObject *mnemo, *key;
6060 mnemo = PyUnicode_FromString(errcode->mnemonic);
6061 key = Py_BuildValue("ii", errcode->library, errcode->reason);
6062 if (mnemo == NULL || key == NULL)
6063 return NULL;
6064 if (PyDict_SetItem(err_codes_to_names, key, mnemo))
6065 return NULL;
6066 if (PyDict_SetItem(err_names_to_codes, mnemo, key))
6067 return NULL;
6068 Py_DECREF(key);
6069 Py_DECREF(mnemo);
6070 errcode++;
6071 }
6072 if (PyModule_AddObject(m, "err_codes_to_names", err_codes_to_names))
6073 return NULL;
6074 if (PyModule_AddObject(m, "err_names_to_codes", err_names_to_codes))
6075 return NULL;
6076
6077 lib_codes_to_names = PyDict_New();
6078 if (lib_codes_to_names == NULL)
6079 return NULL;
6080 libcode = library_codes;
6081 while (libcode->library != NULL) {
6082 PyObject *mnemo, *key;
6083 key = PyLong_FromLong(libcode->code);
6084 mnemo = PyUnicode_FromString(libcode->library);
6085 if (key == NULL || mnemo == NULL)
6086 return NULL;
6087 if (PyDict_SetItem(lib_codes_to_names, key, mnemo))
6088 return NULL;
6089 Py_DECREF(key);
6090 Py_DECREF(mnemo);
6091 libcode++;
6092 }
6093 if (PyModule_AddObject(m, "lib_codes_to_names", lib_codes_to_names))
6094 return NULL;
Victor Stinner4569cd52013-06-23 14:58:43 +02006095
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00006096 /* OpenSSL version */
6097 /* SSLeay() gives us the version of the library linked against,
6098 which could be different from the headers version.
6099 */
6100 libver = SSLeay();
6101 r = PyLong_FromUnsignedLong(libver);
6102 if (r == NULL)
6103 return NULL;
6104 if (PyModule_AddObject(m, "OPENSSL_VERSION_NUMBER", r))
6105 return NULL;
Antoine Pitroub9ac25d2011-07-08 18:47:06 +02006106 parse_openssl_version(libver, &major, &minor, &fix, &patch, &status);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00006107 r = Py_BuildValue("IIIII", major, minor, fix, patch, status);
6108 if (r == NULL || PyModule_AddObject(m, "OPENSSL_VERSION_INFO", r))
6109 return NULL;
6110 r = PyUnicode_FromString(SSLeay_version(SSLEAY_VERSION));
6111 if (r == NULL || PyModule_AddObject(m, "OPENSSL_VERSION", r))
6112 return NULL;
Antoine Pitrou04f6a322010-04-05 21:40:07 +00006113
Antoine Pitroub9ac25d2011-07-08 18:47:06 +02006114 libver = OPENSSL_VERSION_NUMBER;
6115 parse_openssl_version(libver, &major, &minor, &fix, &patch, &status);
6116 r = Py_BuildValue("IIIII", major, minor, fix, patch, status);
6117 if (r == NULL || PyModule_AddObject(m, "_OPENSSL_API_VERSION", r))
6118 return NULL;
6119
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00006120 return m;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006121}