blob: 54c365b88e69510891dfb5917cbd6984a1eacf36 [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
Steve Dower68d663c2017-07-17 11:15:48 +020021/* Redefined below for Windows debug builds after important #includes */
22#define _PySSL_FIX_ERRNO
Christian Heimesf77b4b22013-08-21 13:26:05 +020023
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +020024#define PySSL_BEGIN_ALLOW_THREADS_S(save) \
25 do { if (_ssl_locks_count>0) { (save) = PyEval_SaveThread(); } } while (0)
26#define PySSL_END_ALLOW_THREADS_S(save) \
Steve Dower68d663c2017-07-17 11:15:48 +020027 do { if (_ssl_locks_count>0) { PyEval_RestoreThread(save); } _PySSL_FIX_ERRNO; } while (0)
Thomas Wouters1b7f8912007-09-19 03:06:30 +000028#define PySSL_BEGIN_ALLOW_THREADS { \
Antoine Pitroucbb82eb2010-05-05 15:57:33 +000029 PyThreadState *_save = NULL; \
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +020030 PySSL_BEGIN_ALLOW_THREADS_S(_save);
31#define PySSL_BLOCK_THREADS PySSL_END_ALLOW_THREADS_S(_save);
32#define PySSL_UNBLOCK_THREADS PySSL_BEGIN_ALLOW_THREADS_S(_save);
33#define PySSL_END_ALLOW_THREADS PySSL_END_ALLOW_THREADS_S(_save); }
Thomas Wouters1b7f8912007-09-19 03:06:30 +000034
Antoine Pitrou2463e5f2013-03-28 22:24:43 +010035/* Include symbols from _socket module */
36#include "socketmodule.h"
37
38static PySocketModule_APIObject PySocketModule;
39
40#if defined(HAVE_POLL_H)
41#include <poll.h>
42#elif defined(HAVE_SYS_POLL_H)
43#include <sys/poll.h>
44#endif
45
Christian Heimes598894f2016-09-05 23:19:05 +020046/* Don't warn about deprecated functions */
47#ifdef __GNUC__
48#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
49#endif
50#ifdef __clang__
51#pragma clang diagnostic ignored "-Wdeprecated-declarations"
52#endif
53
Antoine Pitrou2463e5f2013-03-28 22:24:43 +010054/* Include OpenSSL header files */
55#include "openssl/rsa.h"
56#include "openssl/crypto.h"
57#include "openssl/x509.h"
58#include "openssl/x509v3.h"
59#include "openssl/pem.h"
60#include "openssl/ssl.h"
61#include "openssl/err.h"
62#include "openssl/rand.h"
Antoine Pitroub1fdf472014-10-05 20:41:53 +020063#include "openssl/bio.h"
Alexandru Ardeleanb3a271f2018-09-17 14:53:31 +030064#include "openssl/dh.h"
Antoine Pitrou2463e5f2013-03-28 22:24:43 +010065
Christian Heimesff5be6e2018-01-20 13:19:21 +010066#ifndef HAVE_X509_VERIFY_PARAM_SET1_HOST
Christian Heimes61d478c2018-01-27 15:51:38 +010067# ifdef LIBRESSL_VERSION_NUMBER
68# error "LibreSSL is missing X509_VERIFY_PARAM_set1_host(), see https://github.com/libressl-portable/portable/issues/381"
69# elif OPENSSL_VERSION_NUMBER > 0x1000200fL
Christian Heimesff5be6e2018-01-20 13:19:21 +010070# define HAVE_X509_VERIFY_PARAM_SET1_HOST
Christian Heimes61d478c2018-01-27 15:51:38 +010071# else
72# error "libssl is too old and does not support X509_VERIFY_PARAM_set1_host()"
Christian Heimesff5be6e2018-01-20 13:19:21 +010073# endif
74#endif
75
Christian Heimesc087a262020-05-15 20:55:25 +020076#ifndef OPENSSL_THREADS
77# error "OPENSSL_THREADS is not defined, Python requires thread-safe OpenSSL"
78#endif
79
Antoine Pitrou2463e5f2013-03-28 22:24:43 +010080/* SSL error object */
81static PyObject *PySSLErrorObject;
Christian Heimesb3ad0e52017-09-08 12:00:19 -070082static PyObject *PySSLCertVerificationErrorObject;
Antoine Pitrou2463e5f2013-03-28 22:24:43 +010083static PyObject *PySSLZeroReturnErrorObject;
84static PyObject *PySSLWantReadErrorObject;
85static PyObject *PySSLWantWriteErrorObject;
86static PyObject *PySSLSyscallErrorObject;
87static PyObject *PySSLEOFErrorObject;
88
89/* Error mappings */
90static PyObject *err_codes_to_names;
91static PyObject *err_names_to_codes;
92static PyObject *lib_codes_to_names;
93
94struct py_ssl_error_code {
95 const char *mnemonic;
96 int library, reason;
97};
98struct py_ssl_library_code {
99 const char *library;
100 int code;
101};
102
Steve Dower68d663c2017-07-17 11:15:48 +0200103#if defined(MS_WINDOWS) && defined(Py_DEBUG)
104/* Debug builds on Windows rely on getting errno directly from OpenSSL.
105 * However, because it uses a different CRT, we need to transfer the
106 * value of errno from OpenSSL into our debug CRT.
107 *
108 * Don't be fooled - this is horribly ugly code. The only reasonable
109 * alternative is to do both debug and release builds of OpenSSL, which
110 * requires much uglier code to transform their automatically generated
111 * makefile. This is the lesser of all the evils.
112 */
113
114static void _PySSLFixErrno(void) {
115 HMODULE ucrtbase = GetModuleHandleW(L"ucrtbase.dll");
116 if (!ucrtbase) {
117 /* If ucrtbase.dll is not loaded but the SSL DLLs are, we likely
118 * have a catastrophic failure, but this function is not the
119 * place to raise it. */
120 return;
121 }
122
123 typedef int *(__stdcall *errno_func)(void);
124 errno_func ssl_errno = (errno_func)GetProcAddress(ucrtbase, "_errno");
125 if (ssl_errno) {
126 errno = *ssl_errno();
127 *ssl_errno() = 0;
128 } else {
129 errno = ENOTRECOVERABLE;
130 }
131}
132
133#undef _PySSL_FIX_ERRNO
134#define _PySSL_FIX_ERRNO _PySSLFixErrno()
135#endif
136
Antoine Pitrou2463e5f2013-03-28 22:24:43 +0100137/* Include generated data (error codes) */
138#include "_ssl_data.h"
139
Christian Heimes598894f2016-09-05 23:19:05 +0200140#if (OPENSSL_VERSION_NUMBER >= 0x10100000L) && !defined(LIBRESSL_VERSION_NUMBER)
141# define OPENSSL_VERSION_1_1 1
Christian Heimes4ca07392018-03-24 15:41:37 +0100142# define PY_OPENSSL_1_1_API 1
143#endif
144
Christian Heimesa871f692020-06-01 08:58:14 +0200145/* OpenSSL API compat */
146#ifdef OPENSSL_API_COMPAT
147#if OPENSSL_API_COMPAT >= 0x10100000L
148
149/* OpenSSL API 1.1.0+ does not include version methods */
150#ifndef OPENSSL_NO_TLS1_METHOD
151#define OPENSSL_NO_TLS1_METHOD 1
152#endif
153#ifndef OPENSSL_NO_TLS1_1_METHOD
154#define OPENSSL_NO_TLS1_1_METHOD 1
155#endif
156#ifndef OPENSSL_NO_TLS1_2_METHOD
157#define OPENSSL_NO_TLS1_2_METHOD 1
158#endif
159
160#endif /* >= 1.1.0 compcat */
161#endif /* OPENSSL_API_COMPAT */
162
Christian Heimes4ca07392018-03-24 15:41:37 +0100163/* LibreSSL 2.7.0 provides necessary OpenSSL 1.1.0 APIs */
164#if defined(LIBRESSL_VERSION_NUMBER) && LIBRESSL_VERSION_NUMBER >= 0x2070000fL
165# define PY_OPENSSL_1_1_API 1
Christian Heimes598894f2016-09-05 23:19:05 +0200166#endif
167
Christian Heimes470fba12013-11-28 15:12:15 +0100168/* SNI support (client- and server-side) appeared in OpenSSL 1.0.0 and 0.9.8f
Antoine Pitrou912fbff2013-03-30 16:29:32 +0100169 * This includes the SSL_set_SSL_CTX() function.
170 */
171#ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME
172# define HAVE_SNI 1
173#else
174# define HAVE_SNI 0
175#endif
176
Benjamin Petersond3308222015-09-27 00:09:02 -0700177#ifdef TLSEXT_TYPE_application_layer_protocol_negotiation
Christian Heimes29eab552018-02-25 12:31:33 +0100178# define HAVE_ALPN 1
179#else
180# define HAVE_ALPN 0
Benjamin Petersoncca27322015-01-23 16:35:37 -0500181#endif
182
Christian Heimes6cdb7952018-02-24 22:12:40 +0100183/* We cannot rely on OPENSSL_NO_NEXTPROTONEG because LibreSSL 2.6.1 dropped
184 * NPN support but did not set OPENSSL_NO_NEXTPROTONEG for compatibility
185 * reasons. The check for TLSEXT_TYPE_next_proto_neg works with
186 * OpenSSL 1.0.1+ and LibreSSL.
Christian Heimes29eab552018-02-25 12:31:33 +0100187 * OpenSSL 1.1.1-pre1 dropped NPN but still has TLSEXT_TYPE_next_proto_neg.
Christian Heimes6cdb7952018-02-24 22:12:40 +0100188 */
189#ifdef OPENSSL_NO_NEXTPROTONEG
Christian Heimes29eab552018-02-25 12:31:33 +0100190# define HAVE_NPN 0
191#elif (OPENSSL_VERSION_NUMBER >= 0x10101000L) && !defined(LIBRESSL_VERSION_NUMBER)
192# define HAVE_NPN 0
Christian Heimes6cdb7952018-02-24 22:12:40 +0100193#elif defined(TLSEXT_TYPE_next_proto_neg)
Christian Heimes29eab552018-02-25 12:31:33 +0100194# define HAVE_NPN 1
Christian Heimes6cdb7952018-02-24 22:12:40 +0100195#else
Christian Heimes29eab552018-02-25 12:31:33 +0100196# define HAVE_NPN 0
197#endif
Christian Heimes6cdb7952018-02-24 22:12:40 +0100198
Christian Heimesc7f70692019-05-31 11:44:05 +0200199#if (OPENSSL_VERSION_NUMBER >= 0x10101000L) && !defined(LIBRESSL_VERSION_NUMBER)
200#define HAVE_OPENSSL_KEYLOG 1
201#endif
202
Victor Stinner524714e2016-07-22 17:43:59 +0200203#ifndef INVALID_SOCKET /* MS defines this */
204#define INVALID_SOCKET (-1)
205#endif
206
Christian Heimes4ca07392018-03-24 15:41:37 +0100207/* OpenSSL 1.0.2 and LibreSSL needs extra code for locking */
208#ifndef OPENSSL_VERSION_1_1
209#define HAVE_OPENSSL_CRYPTO_LOCK
210#endif
211
212#if defined(OPENSSL_VERSION_1_1) && !defined(OPENSSL_NO_SSL2)
Christian Heimes598894f2016-09-05 23:19:05 +0200213#define OPENSSL_NO_SSL2
214#endif
Christian Heimes4ca07392018-03-24 15:41:37 +0100215
216#ifndef PY_OPENSSL_1_1_API
217/* OpenSSL 1.1 API shims for OpenSSL < 1.1.0 and LibreSSL < 2.7.0 */
Christian Heimes598894f2016-09-05 23:19:05 +0200218
219#define TLS_method SSLv23_method
Christian Heimes5fe668c2016-09-12 00:01:11 +0200220#define TLS_client_method SSLv23_client_method
221#define TLS_server_method SSLv23_server_method
Christian Heimesa871f692020-06-01 08:58:14 +0200222#define ASN1_STRING_get0_data ASN1_STRING_data
223#define X509_get0_notBefore X509_get_notBefore
224#define X509_get0_notAfter X509_get_notAfter
225#define OpenSSL_version_num SSLeay
226#define OpenSSL_version SSLeay_version
227#define OPENSSL_VERSION SSLEAY_VERSION
Christian Heimes598894f2016-09-05 23:19:05 +0200228
229static int X509_NAME_ENTRY_set(const X509_NAME_ENTRY *ne)
230{
231 return ne->set;
232}
233
234#ifndef OPENSSL_NO_COMP
Christian Heimesa5d07652016-09-24 10:48:05 +0200235/* LCOV_EXCL_START */
Christian Heimes598894f2016-09-05 23:19:05 +0200236static int COMP_get_type(const COMP_METHOD *meth)
237{
238 return meth->type;
239}
Christian Heimes1a63b9f2016-09-24 12:07:21 +0200240/* LCOV_EXCL_STOP */
Christian Heimes598894f2016-09-05 23:19:05 +0200241#endif
242
243static pem_password_cb *SSL_CTX_get_default_passwd_cb(SSL_CTX *ctx)
244{
245 return ctx->default_passwd_callback;
246}
247
248static void *SSL_CTX_get_default_passwd_cb_userdata(SSL_CTX *ctx)
249{
250 return ctx->default_passwd_callback_userdata;
251}
252
253static int X509_OBJECT_get_type(X509_OBJECT *x)
254{
255 return x->type;
256}
257
258static X509 *X509_OBJECT_get0_X509(X509_OBJECT *x)
259{
260 return x->data.x509;
261}
262
263static int BIO_up_ref(BIO *b)
264{
265 CRYPTO_add(&b->references, 1, CRYPTO_LOCK_BIO);
266 return 1;
267}
268
269static STACK_OF(X509_OBJECT) *X509_STORE_get0_objects(X509_STORE *store) {
270 return store->objs;
271}
272
Christian Heimes99a65702016-09-10 23:44:53 +0200273static int
274SSL_SESSION_has_ticket(const SSL_SESSION *s)
275{
276 return (s->tlsext_ticklen > 0) ? 1 : 0;
277}
278
279static unsigned long
280SSL_SESSION_get_ticket_lifetime_hint(const SSL_SESSION *s)
281{
282 return s->tlsext_tick_lifetime_hint;
283}
284
Christian Heimes4ca07392018-03-24 15:41:37 +0100285#endif /* OpenSSL < 1.1.0 or LibreSSL < 2.7.0 */
Christian Heimes598894f2016-09-05 23:19:05 +0200286
Christian Heimes892d66e2018-01-29 14:10:18 +0100287/* Default cipher suites */
288#ifndef PY_SSL_DEFAULT_CIPHERS
289#define PY_SSL_DEFAULT_CIPHERS 1
290#endif
291
292#if PY_SSL_DEFAULT_CIPHERS == 0
293 #ifndef PY_SSL_DEFAULT_CIPHER_STRING
294 #error "Py_SSL_DEFAULT_CIPHERS 0 needs Py_SSL_DEFAULT_CIPHER_STRING"
295 #endif
296#elif PY_SSL_DEFAULT_CIPHERS == 1
Stéphane Wirtel07fbbfd2018-10-05 16:17:18 +0200297/* Python custom selection of sensible cipher suites
Christian Heimes892d66e2018-01-29 14:10:18 +0100298 * DEFAULT: OpenSSL's default cipher list. Since 1.0.2 the list is in sensible order.
299 * !aNULL:!eNULL: really no NULL ciphers
300 * !MD5:!3DES:!DES:!RC4:!IDEA:!SEED: no weak or broken algorithms on old OpenSSL versions.
301 * !aDSS: no authentication with discrete logarithm DSA algorithm
302 * !SRP:!PSK: no secure remote password or pre-shared key authentication
303 */
304 #define PY_SSL_DEFAULT_CIPHER_STRING "DEFAULT:!aNULL:!eNULL:!MD5:!3DES:!DES:!RC4:!IDEA:!SEED:!aDSS:!SRP:!PSK"
305#elif PY_SSL_DEFAULT_CIPHERS == 2
306/* Ignored in SSLContext constructor, only used to as _ssl.DEFAULT_CIPHER_STRING */
307 #define PY_SSL_DEFAULT_CIPHER_STRING SSL_DEFAULT_CIPHER_LIST
308#else
309 #error "Unsupported PY_SSL_DEFAULT_CIPHERS"
310#endif
311
Christian Heimes598894f2016-09-05 23:19:05 +0200312
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +0000313enum py_ssl_error {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000314 /* these mirror ssl.h */
315 PY_SSL_ERROR_NONE,
316 PY_SSL_ERROR_SSL,
317 PY_SSL_ERROR_WANT_READ,
318 PY_SSL_ERROR_WANT_WRITE,
319 PY_SSL_ERROR_WANT_X509_LOOKUP,
320 PY_SSL_ERROR_SYSCALL, /* look at error stack/return value/errno */
321 PY_SSL_ERROR_ZERO_RETURN,
322 PY_SSL_ERROR_WANT_CONNECT,
323 /* start of non ssl.h errorcodes */
324 PY_SSL_ERROR_EOF, /* special case of SSL_ERROR_SYSCALL */
325 PY_SSL_ERROR_NO_SOCKET, /* socket has been GC'd */
326 PY_SSL_ERROR_INVALID_ERROR_CODE
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +0000327};
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000328
Thomas Woutersed03b412007-08-28 21:37:11 +0000329enum py_ssl_server_or_client {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000330 PY_SSL_CLIENT,
331 PY_SSL_SERVER
Thomas Woutersed03b412007-08-28 21:37:11 +0000332};
333
334enum py_ssl_cert_requirements {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000335 PY_SSL_CERT_NONE,
336 PY_SSL_CERT_OPTIONAL,
337 PY_SSL_CERT_REQUIRED
Thomas Woutersed03b412007-08-28 21:37:11 +0000338};
339
340enum py_ssl_version {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000341 PY_SSL_VERSION_SSL2,
Victor Stinner3de49192011-05-09 00:42:58 +0200342 PY_SSL_VERSION_SSL3=1,
Christian Heimes5fe668c2016-09-12 00:01:11 +0200343 PY_SSL_VERSION_TLS, /* SSLv23 */
Antoine Pitrou2463e5f2013-03-28 22:24:43 +0100344 PY_SSL_VERSION_TLS1,
345 PY_SSL_VERSION_TLS1_1,
Christian Heimes5fe668c2016-09-12 00:01:11 +0200346 PY_SSL_VERSION_TLS1_2,
Christian Heimes5fe668c2016-09-12 00:01:11 +0200347 PY_SSL_VERSION_TLS_CLIENT=0x10,
348 PY_SSL_VERSION_TLS_SERVER,
Antoine Pitrou2463e5f2013-03-28 22:24:43 +0100349};
Antoine Pitrou3b36fb12012-06-22 21:11:52 +0200350
Christian Heimes698dde12018-02-27 11:54:43 +0100351enum py_proto_version {
352 PY_PROTO_MINIMUM_SUPPORTED = -2,
353 PY_PROTO_SSLv3 = SSL3_VERSION,
354 PY_PROTO_TLSv1 = TLS1_VERSION,
355 PY_PROTO_TLSv1_1 = TLS1_1_VERSION,
356 PY_PROTO_TLSv1_2 = TLS1_2_VERSION,
357#ifdef TLS1_3_VERSION
358 PY_PROTO_TLSv1_3 = TLS1_3_VERSION,
359#else
360 PY_PROTO_TLSv1_3 = 0x304,
361#endif
362 PY_PROTO_MAXIMUM_SUPPORTED = -1,
363
364/* OpenSSL has no dedicated API to set the minimum version to the maximum
365 * available version, and the other way around. We have to figure out the
366 * minimum and maximum available version on our own and hope for the best.
367 */
368#if defined(SSL3_VERSION) && !defined(OPENSSL_NO_SSL3)
369 PY_PROTO_MINIMUM_AVAILABLE = PY_PROTO_SSLv3,
370#elif defined(TLS1_VERSION) && !defined(OPENSSL_NO_TLS1)
371 PY_PROTO_MINIMUM_AVAILABLE = PY_PROTO_TLSv1,
372#elif defined(TLS1_1_VERSION) && !defined(OPENSSL_NO_TLS1_1)
373 PY_PROTO_MINIMUM_AVAILABLE = PY_PROTO_TLSv1_1,
374#elif defined(TLS1_2_VERSION) && !defined(OPENSSL_NO_TLS1_2)
375 PY_PROTO_MINIMUM_AVAILABLE = PY_PROTO_TLSv1_2,
376#elif defined(TLS1_3_VERSION) && !defined(OPENSSL_NO_TLS1_3)
377 PY_PROTO_MINIMUM_AVAILABLE = PY_PROTO_TLSv1_3,
378#else
379 #error "PY_PROTO_MINIMUM_AVAILABLE not found"
380#endif
381
382#if defined(TLS1_3_VERSION) && !defined(OPENSSL_NO_TLS1_3)
383 PY_PROTO_MAXIMUM_AVAILABLE = PY_PROTO_TLSv1_3,
384#elif defined(TLS1_2_VERSION) && !defined(OPENSSL_NO_TLS1_2)
385 PY_PROTO_MAXIMUM_AVAILABLE = PY_PROTO_TLSv1_2,
386#elif defined(TLS1_1_VERSION) && !defined(OPENSSL_NO_TLS1_1)
387 PY_PROTO_MAXIMUM_AVAILABLE = PY_PROTO_TLSv1_1,
388#elif defined(TLS1_VERSION) && !defined(OPENSSL_NO_TLS1)
389 PY_PROTO_MAXIMUM_AVAILABLE = PY_PROTO_TLSv1,
390#elif defined(SSL3_VERSION) && !defined(OPENSSL_NO_SSL3)
391 PY_PROTO_MAXIMUM_AVAILABLE = PY_PROTO_SSLv3,
392#else
393 #error "PY_PROTO_MAXIMUM_AVAILABLE not found"
394#endif
395};
396
397
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000398/* serves as a flag to see whether we've initialized the SSL thread support. */
399/* 0 means no, greater than 0 means yes */
400
401static unsigned int _ssl_locks_count = 0;
402
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000403/* SSL socket object */
404
405#define X509_NAME_MAXLEN 256
406
Gregory P. Smithbd4dacb2010-10-13 03:53:21 +0000407/* SSL_CTX_clear_options() and SSL_clear_options() were first added in
408 * OpenSSL 0.9.8m but do not appear in some 0.9.9-dev versions such the
409 * 0.9.9 from "May 2008" that NetBSD 5.0 uses. */
410#if OPENSSL_VERSION_NUMBER >= 0x009080dfL && OPENSSL_VERSION_NUMBER != 0x00909000L
Antoine Pitroub5218772010-05-21 09:56:06 +0000411# define HAVE_SSL_CTX_CLEAR_OPTIONS
412#else
413# undef HAVE_SSL_CTX_CLEAR_OPTIONS
414#endif
415
Antoine Pitroud6494802011-07-21 01:11:30 +0200416/* In case of 'tls-unique' it will be 12 bytes for TLS, 36 bytes for
417 * older SSL, but let's be safe */
418#define PySSL_CB_MAXLEN 128
419
Antoine Pitroua9bf2ac2012-02-17 18:47:54 +0100420
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000421typedef struct {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000422 PyObject_HEAD
Antoine Pitrou152efa22010-05-16 18:19:27 +0000423 SSL_CTX *ctx;
Christian Heimes29eab552018-02-25 12:31:33 +0100424#if HAVE_NPN
Benjamin Petersoncca27322015-01-23 16:35:37 -0500425 unsigned char *npn_protocols;
Antoine Pitroud5d17eb2012-03-22 00:23:03 +0100426 int npn_protocols_len;
427#endif
Christian Heimes29eab552018-02-25 12:31:33 +0100428#if HAVE_ALPN
Benjamin Petersoncca27322015-01-23 16:35:37 -0500429 unsigned char *alpn_protocols;
Segev Finer5cff6372017-07-27 01:19:17 +0300430 unsigned int alpn_protocols_len;
Benjamin Petersoncca27322015-01-23 16:35:37 -0500431#endif
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +0100432#ifndef OPENSSL_NO_TLSEXT
Christian Heimes11a14932018-02-24 02:35:08 +0100433 PyObject *set_sni_cb;
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +0100434#endif
Christian Heimes1aa9a752013-12-02 02:41:19 +0100435 int check_hostname;
Christian Heimes61d478c2018-01-27 15:51:38 +0100436 /* OpenSSL has no API to get hostflags from X509_VERIFY_PARAM* struct.
437 * We have to maintain our own copy. OpenSSL's hostflags default to 0.
438 */
439 unsigned int hostflags;
Christian Heimes11a14932018-02-24 02:35:08 +0100440 int protocol;
Christian Heimes9fb051f2018-09-23 08:32:31 +0200441#ifdef TLS1_3_VERSION
442 int post_handshake_auth;
443#endif
Christian Heimesc7f70692019-05-31 11:44:05 +0200444 PyObject *msg_cb;
445#ifdef HAVE_OPENSSL_KEYLOG
446 PyObject *keylog_filename;
447 BIO *keylog_bio;
448#endif
Antoine Pitrou152efa22010-05-16 18:19:27 +0000449} PySSLContext;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000450
Antoine Pitrou152efa22010-05-16 18:19:27 +0000451typedef struct {
Steve Dowerc6fd1c12018-09-17 11:34:47 -0700452 int ssl; /* last seen error from SSL */
453 int c; /* last seen error from libc */
454#ifdef MS_WINDOWS
455 int ws; /* last seen error from winsock */
456#endif
457} _PySSLError;
458
459typedef struct {
Antoine Pitrou152efa22010-05-16 18:19:27 +0000460 PyObject_HEAD
461 PyObject *Socket; /* weakref to socket on which we're layered */
462 SSL *ssl;
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +0100463 PySSLContext *ctx; /* weakref to SSL context */
Antoine Pitrou20b85552013-09-29 19:50:53 +0200464 char shutdown_seen_zero;
Antoine Pitroud6494802011-07-21 01:11:30 +0200465 enum py_ssl_server_or_client socket_type;
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200466 PyObject *owner; /* Python level "owner" passed to servername callback */
467 PyObject *server_hostname;
Steve Dowerc6fd1c12018-09-17 11:34:47 -0700468 _PySSLError err; /* last seen error from various sources */
Christian Heimesc7f70692019-05-31 11:44:05 +0200469 /* Some SSL callbacks don't have error reporting. Callback wrappers
470 * store exception information on the socket. The handshake, read, write,
471 * and shutdown methods check for chained exceptions.
472 */
473 PyObject *exc_type;
474 PyObject *exc_value;
475 PyObject *exc_tb;
Antoine Pitrou152efa22010-05-16 18:19:27 +0000476} PySSLSocket;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000477
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200478typedef struct {
479 PyObject_HEAD
480 BIO *bio;
481 int eof_written;
482} PySSLMemoryBIO;
483
Christian Heimes99a65702016-09-10 23:44:53 +0200484typedef struct {
485 PyObject_HEAD
486 SSL_SESSION *session;
487 PySSLContext *ctx;
488} PySSLSession;
489
Antoine Pitrou152efa22010-05-16 18:19:27 +0000490static PyTypeObject PySSLContext_Type;
491static PyTypeObject PySSLSocket_Type;
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200492static PyTypeObject PySSLMemoryBIO_Type;
Christian Heimes99a65702016-09-10 23:44:53 +0200493static PyTypeObject PySSLSession_Type;
Antoine Pitrou152efa22010-05-16 18:19:27 +0000494
Steve Dowerc6fd1c12018-09-17 11:34:47 -0700495static inline _PySSLError _PySSL_errno(int failed, const SSL *ssl, int retcode)
496{
497 _PySSLError err = { 0 };
498 if (failed) {
Steve Dowere6eb48c2017-09-08 15:16:15 -0700499#ifdef MS_WINDOWS
Steve Dowerc6fd1c12018-09-17 11:34:47 -0700500 err.ws = WSAGetLastError();
501 _PySSL_FIX_ERRNO;
Steve Dowere6eb48c2017-09-08 15:16:15 -0700502#endif
Steve Dowerc6fd1c12018-09-17 11:34:47 -0700503 err.c = errno;
504 err.ssl = SSL_get_error(ssl, retcode);
505 }
506 return err;
507}
Steve Dowere6eb48c2017-09-08 15:16:15 -0700508
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +0300509/*[clinic input]
510module _ssl
511class _ssl._SSLContext "PySSLContext *" "&PySSLContext_Type"
512class _ssl._SSLSocket "PySSLSocket *" "&PySSLSocket_Type"
513class _ssl.MemoryBIO "PySSLMemoryBIO *" "&PySSLMemoryBIO_Type"
Christian Heimes99a65702016-09-10 23:44:53 +0200514class _ssl.SSLSession "PySSLSession *" "&PySSLSession_Type"
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +0300515[clinic start generated code]*/
Christian Heimes99a65702016-09-10 23:44:53 +0200516/*[clinic end generated code: output=da39a3ee5e6b4b0d input=bdc67fafeeaa8109]*/
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +0300517
518#include "clinic/_ssl.c.h"
519
Victor Stinner14690702015-04-06 22:46:13 +0200520static int PySSL_select(PySocketSockObject *s, int writing, _PyTime_t timeout);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000521
Christian Heimes141c5e82018-02-24 21:10:57 +0100522static int PySSL_set_owner(PySSLSocket *, PyObject *, void *);
523static int PySSL_set_session(PySSLSocket *, PyObject *, void *);
Dong-hee Na1b55b652020-02-17 19:09:15 +0900524#define PySSLSocket_Check(v) Py_IS_TYPE(v, &PySSLSocket_Type)
525#define PySSLMemoryBIO_Check(v) Py_IS_TYPE(v, &PySSLMemoryBIO_Type)
526#define PySSLSession_Check(v) Py_IS_TYPE(v, &PySSLSession_Type)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000527
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +0000528typedef enum {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000529 SOCKET_IS_NONBLOCKING,
530 SOCKET_IS_BLOCKING,
531 SOCKET_HAS_TIMED_OUT,
532 SOCKET_HAS_BEEN_CLOSED,
533 SOCKET_TOO_LARGE_FOR_SELECT,
534 SOCKET_OPERATION_OK
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +0000535} timeout_state;
536
Thomas Woutersed03b412007-08-28 21:37:11 +0000537/* Wrap error strings with filename and line # */
Thomas Woutersed03b412007-08-28 21:37:11 +0000538#define ERRSTR1(x,y,z) (x ":" y ": " z)
Victor Stinner45e8e2f2014-05-14 17:24:35 +0200539#define ERRSTR(x) ERRSTR1("_ssl.c", Py_STRINGIFY(__LINE__), x)
Thomas Woutersed03b412007-08-28 21:37:11 +0000540
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200541/* Get the socket from a PySSLSocket, if it has one */
542#define GET_SOCKET(obj) ((obj)->Socket ? \
543 (PySocketSockObject *) PyWeakref_GetObject((obj)->Socket) : NULL)
Antoine Pitrou3b36fb12012-06-22 21:11:52 +0200544
Victor Stinner14690702015-04-06 22:46:13 +0200545/* If sock is NULL, use a timeout of 0 second */
546#define GET_SOCKET_TIMEOUT(sock) \
547 ((sock != NULL) ? (sock)->sock_timeout : 0)
548
Christian Heimesc7f70692019-05-31 11:44:05 +0200549#include "_ssl/debughelpers.c"
550
Antoine Pitrou3b36fb12012-06-22 21:11:52 +0200551/*
552 * SSL errors.
553 */
554
555PyDoc_STRVAR(SSLError_doc,
556"An error occurred in the SSL implementation.");
557
Christian Heimesb3ad0e52017-09-08 12:00:19 -0700558PyDoc_STRVAR(SSLCertVerificationError_doc,
559"A certificate could not be verified.");
560
Antoine Pitrou3b36fb12012-06-22 21:11:52 +0200561PyDoc_STRVAR(SSLZeroReturnError_doc,
562"SSL/TLS session closed cleanly.");
563
564PyDoc_STRVAR(SSLWantReadError_doc,
565"Non-blocking SSL socket needs to read more data\n"
566"before the requested operation can be completed.");
567
568PyDoc_STRVAR(SSLWantWriteError_doc,
569"Non-blocking SSL socket needs to write more data\n"
570"before the requested operation can be completed.");
571
572PyDoc_STRVAR(SSLSyscallError_doc,
573"System error when attempting SSL operation.");
574
575PyDoc_STRVAR(SSLEOFError_doc,
576"SSL/TLS connection terminated abruptly.");
577
578static PyObject *
579SSLError_str(PyOSErrorObject *self)
580{
581 if (self->strerror != NULL && PyUnicode_Check(self->strerror)) {
582 Py_INCREF(self->strerror);
583 return self->strerror;
584 }
585 else
586 return PyObject_Str(self->args);
587}
588
589static PyType_Slot sslerror_type_slots[] = {
590 {Py_tp_base, NULL}, /* Filled out in module init as it's not a constant */
Inada Naoki926b0cb2019-04-17 08:39:46 +0900591 {Py_tp_doc, (void*)SSLError_doc},
Antoine Pitrou3b36fb12012-06-22 21:11:52 +0200592 {Py_tp_str, SSLError_str},
593 {0, 0},
594};
595
596static PyType_Spec sslerror_type_spec = {
597 "ssl.SSLError",
598 sizeof(PyOSErrorObject),
599 0,
600 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
601 sslerror_type_slots
602};
603
604static void
Christian Heimesb3ad0e52017-09-08 12:00:19 -0700605fill_and_set_sslerror(PySSLSocket *sslsock, PyObject *type, int ssl_errno,
606 const char *errstr, int lineno, unsigned long errcode)
Antoine Pitrou3b36fb12012-06-22 21:11:52 +0200607{
608 PyObject *err_value = NULL, *reason_obj = NULL, *lib_obj = NULL;
Christian Heimesb3ad0e52017-09-08 12:00:19 -0700609 PyObject *verify_obj = NULL, *verify_code_obj = NULL;
Antoine Pitrou3b36fb12012-06-22 21:11:52 +0200610 PyObject *init_value, *msg, *key;
611 _Py_IDENTIFIER(reason);
612 _Py_IDENTIFIER(library);
Christian Heimesb3ad0e52017-09-08 12:00:19 -0700613 _Py_IDENTIFIER(verify_message);
614 _Py_IDENTIFIER(verify_code);
Antoine Pitrou3b36fb12012-06-22 21:11:52 +0200615
616 if (errcode != 0) {
617 int lib, reason;
618
619 lib = ERR_GET_LIB(errcode);
620 reason = ERR_GET_REASON(errcode);
621 key = Py_BuildValue("ii", lib, reason);
622 if (key == NULL)
623 goto fail;
Serhiy Storchaka65fb2c02019-05-31 10:39:15 +0300624 reason_obj = PyDict_GetItemWithError(err_codes_to_names, key);
Antoine Pitrou3b36fb12012-06-22 21:11:52 +0200625 Py_DECREF(key);
Serhiy Storchaka65fb2c02019-05-31 10:39:15 +0300626 if (reason_obj == NULL && PyErr_Occurred()) {
627 goto fail;
Antoine Pitrou3b36fb12012-06-22 21:11:52 +0200628 }
629 key = PyLong_FromLong(lib);
630 if (key == NULL)
631 goto fail;
Serhiy Storchaka65fb2c02019-05-31 10:39:15 +0300632 lib_obj = PyDict_GetItemWithError(lib_codes_to_names, key);
Antoine Pitrou3b36fb12012-06-22 21:11:52 +0200633 Py_DECREF(key);
Serhiy Storchaka65fb2c02019-05-31 10:39:15 +0300634 if (lib_obj == NULL && PyErr_Occurred()) {
635 goto fail;
Antoine Pitrou3b36fb12012-06-22 21:11:52 +0200636 }
637 if (errstr == NULL)
638 errstr = ERR_reason_error_string(errcode);
639 }
640 if (errstr == NULL)
641 errstr = "unknown error";
642
Christian Heimesb3ad0e52017-09-08 12:00:19 -0700643 /* verify code for cert validation error */
644 if ((sslsock != NULL) && (type == PySSLCertVerificationErrorObject)) {
645 const char *verify_str = NULL;
646 long verify_code;
647
648 verify_code = SSL_get_verify_result(sslsock->ssl);
649 verify_code_obj = PyLong_FromLong(verify_code);
650 if (verify_code_obj == NULL) {
651 goto fail;
652 }
653
654 switch (verify_code) {
Christian Heimes09153602017-09-08 14:47:58 -0700655#ifdef X509_V_ERR_HOSTNAME_MISMATCH
656 /* OpenSSL >= 1.0.2, LibreSSL >= 2.5.3 */
Christian Heimesb3ad0e52017-09-08 12:00:19 -0700657 case X509_V_ERR_HOSTNAME_MISMATCH:
658 verify_obj = PyUnicode_FromFormat(
659 "Hostname mismatch, certificate is not valid for '%S'.",
660 sslsock->server_hostname
661 );
662 break;
Christian Heimes09153602017-09-08 14:47:58 -0700663#endif
664#ifdef X509_V_ERR_IP_ADDRESS_MISMATCH
Christian Heimesb3ad0e52017-09-08 12:00:19 -0700665 case X509_V_ERR_IP_ADDRESS_MISMATCH:
666 verify_obj = PyUnicode_FromFormat(
667 "IP address mismatch, certificate is not valid for '%S'.",
668 sslsock->server_hostname
669 );
670 break;
Christian Heimes09153602017-09-08 14:47:58 -0700671#endif
Christian Heimesb3ad0e52017-09-08 12:00:19 -0700672 default:
673 verify_str = X509_verify_cert_error_string(verify_code);
674 if (verify_str != NULL) {
675 verify_obj = PyUnicode_FromString(verify_str);
676 } else {
677 verify_obj = Py_None;
678 Py_INCREF(verify_obj);
679 }
680 break;
681 }
682 if (verify_obj == NULL) {
683 goto fail;
684 }
685 }
686
687 if (verify_obj && reason_obj && lib_obj)
688 msg = PyUnicode_FromFormat("[%S: %S] %s: %S (_ssl.c:%d)",
689 lib_obj, reason_obj, errstr, verify_obj,
690 lineno);
691 else if (reason_obj && lib_obj)
Antoine Pitrou3b36fb12012-06-22 21:11:52 +0200692 msg = PyUnicode_FromFormat("[%S: %S] %s (_ssl.c:%d)",
693 lib_obj, reason_obj, errstr, lineno);
694 else if (lib_obj)
695 msg = PyUnicode_FromFormat("[%S] %s (_ssl.c:%d)",
696 lib_obj, errstr, lineno);
697 else
698 msg = PyUnicode_FromFormat("%s (_ssl.c:%d)", errstr, lineno);
Antoine Pitrou3b36fb12012-06-22 21:11:52 +0200699 if (msg == NULL)
700 goto fail;
Victor Stinnerba9be472013-10-31 15:00:24 +0100701
Paul Monsonfb7e7502019-05-15 15:38:55 -0700702 init_value = Py_BuildValue("iN", ERR_GET_REASON(ssl_errno), msg);
Victor Stinnerba9be472013-10-31 15:00:24 +0100703 if (init_value == NULL)
704 goto fail;
705
Antoine Pitrou3b36fb12012-06-22 21:11:52 +0200706 err_value = PyObject_CallObject(type, init_value);
707 Py_DECREF(init_value);
708 if (err_value == NULL)
709 goto fail;
Victor Stinnerba9be472013-10-31 15:00:24 +0100710
Antoine Pitrou3b36fb12012-06-22 21:11:52 +0200711 if (reason_obj == NULL)
712 reason_obj = Py_None;
713 if (_PyObject_SetAttrId(err_value, &PyId_reason, reason_obj))
714 goto fail;
Christian Heimesb3ad0e52017-09-08 12:00:19 -0700715
Antoine Pitrou3b36fb12012-06-22 21:11:52 +0200716 if (lib_obj == NULL)
717 lib_obj = Py_None;
718 if (_PyObject_SetAttrId(err_value, &PyId_library, lib_obj))
719 goto fail;
Christian Heimesb3ad0e52017-09-08 12:00:19 -0700720
721 if ((sslsock != NULL) && (type == PySSLCertVerificationErrorObject)) {
722 /* Only set verify code / message for SSLCertVerificationError */
723 if (_PyObject_SetAttrId(err_value, &PyId_verify_code,
724 verify_code_obj))
725 goto fail;
726 if (_PyObject_SetAttrId(err_value, &PyId_verify_message, verify_obj))
727 goto fail;
728 }
729
Antoine Pitrou3b36fb12012-06-22 21:11:52 +0200730 PyErr_SetObject(type, err_value);
731fail:
732 Py_XDECREF(err_value);
Christian Heimesb3ad0e52017-09-08 12:00:19 -0700733 Py_XDECREF(verify_code_obj);
734 Py_XDECREF(verify_obj);
Antoine Pitrou3b36fb12012-06-22 21:11:52 +0200735}
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000736
Christian Heimesc7f70692019-05-31 11:44:05 +0200737static int
738PySSL_ChainExceptions(PySSLSocket *sslsock) {
739 if (sslsock->exc_type == NULL)
740 return 0;
741
742 _PyErr_ChainExceptions(sslsock->exc_type, sslsock->exc_value, sslsock->exc_tb);
743 sslsock->exc_type = NULL;
744 sslsock->exc_value = NULL;
745 sslsock->exc_tb = NULL;
746 return -1;
747}
748
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000749static PyObject *
Christian Heimesb3ad0e52017-09-08 12:00:19 -0700750PySSL_SetError(PySSLSocket *sslsock, int ret, const char *filename, int lineno)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000751{
Antoine Pitrou41032a62011-10-27 23:56:55 +0200752 PyObject *type = PySSLErrorObject;
Antoine Pitrou3b36fb12012-06-22 21:11:52 +0200753 char *errstr = NULL;
Steve Dowerc6fd1c12018-09-17 11:34:47 -0700754 _PySSLError err;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000755 enum py_ssl_error p = PY_SSL_ERROR_NONE;
Antoine Pitrou3b36fb12012-06-22 21:11:52 +0200756 unsigned long e = 0;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000757
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000758 assert(ret <= 0);
Antoine Pitrou3b36fb12012-06-22 21:11:52 +0200759 e = ERR_peek_last_error();
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +0000760
Christian Heimesb3ad0e52017-09-08 12:00:19 -0700761 if (sslsock->ssl != NULL) {
Steve Dowerc6fd1c12018-09-17 11:34:47 -0700762 err = sslsock->err;
Thomas Woutersed03b412007-08-28 21:37:11 +0000763
Steve Dowerc6fd1c12018-09-17 11:34:47 -0700764 switch (err.ssl) {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000765 case SSL_ERROR_ZERO_RETURN:
Antoine Pitrou41032a62011-10-27 23:56:55 +0200766 errstr = "TLS/SSL connection has been closed (EOF)";
767 type = PySSLZeroReturnErrorObject;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000768 p = PY_SSL_ERROR_ZERO_RETURN;
769 break;
770 case SSL_ERROR_WANT_READ:
771 errstr = "The operation did not complete (read)";
Antoine Pitrou41032a62011-10-27 23:56:55 +0200772 type = PySSLWantReadErrorObject;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000773 p = PY_SSL_ERROR_WANT_READ;
774 break;
775 case SSL_ERROR_WANT_WRITE:
776 p = PY_SSL_ERROR_WANT_WRITE;
Antoine Pitrou41032a62011-10-27 23:56:55 +0200777 type = PySSLWantWriteErrorObject;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000778 errstr = "The operation did not complete (write)";
779 break;
780 case SSL_ERROR_WANT_X509_LOOKUP:
781 p = PY_SSL_ERROR_WANT_X509_LOOKUP;
Antoine Pitrou525807b2010-05-12 14:05:24 +0000782 errstr = "The operation did not complete (X509 lookup)";
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000783 break;
784 case SSL_ERROR_WANT_CONNECT:
785 p = PY_SSL_ERROR_WANT_CONNECT;
786 errstr = "The operation did not complete (connect)";
787 break;
788 case SSL_ERROR_SYSCALL:
789 {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000790 if (e == 0) {
Christian Heimesb3ad0e52017-09-08 12:00:19 -0700791 PySocketSockObject *s = GET_SOCKET(sslsock);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000792 if (ret == 0 || (((PyObject *)s) == Py_None)) {
Antoine Pitrou525807b2010-05-12 14:05:24 +0000793 p = PY_SSL_ERROR_EOF;
Antoine Pitrou41032a62011-10-27 23:56:55 +0200794 type = PySSLEOFErrorObject;
Antoine Pitrou525807b2010-05-12 14:05:24 +0000795 errstr = "EOF occurred in violation of protocol";
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200796 } else if (s && ret == -1) {
Antoine Pitrou525807b2010-05-12 14:05:24 +0000797 /* underlying BIO reported an I/O error */
Antoine Pitrou9d74b422010-05-16 23:14:22 +0000798 ERR_clear_error();
Steve Dowere6eb48c2017-09-08 15:16:15 -0700799#ifdef MS_WINDOWS
Steve Dowerc6fd1c12018-09-17 11:34:47 -0700800 if (err.ws) {
801 return PyErr_SetFromWindowsErr(err.ws);
802 }
Steve Dowere6eb48c2017-09-08 15:16:15 -0700803#endif
Steve Dowerc6fd1c12018-09-17 11:34:47 -0700804 if (err.c) {
805 errno = err.c;
Steve Dowere6eb48c2017-09-08 15:16:15 -0700806 return PyErr_SetFromErrno(PyExc_OSError);
807 }
Dima Tisnek495bd032020-08-16 02:01:19 +0900808 else {
809 p = PY_SSL_ERROR_EOF;
810 type = PySSLEOFErrorObject;
811 errstr = "EOF occurred in violation of protocol";
812 }
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000813 } else { /* possible? */
Antoine Pitrou525807b2010-05-12 14:05:24 +0000814 p = PY_SSL_ERROR_SYSCALL;
Antoine Pitrou41032a62011-10-27 23:56:55 +0200815 type = PySSLSyscallErrorObject;
Antoine Pitrou525807b2010-05-12 14:05:24 +0000816 errstr = "Some I/O error occurred";
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000817 }
818 } else {
819 p = PY_SSL_ERROR_SYSCALL;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000820 }
821 break;
822 }
823 case SSL_ERROR_SSL:
824 {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000825 p = PY_SSL_ERROR_SSL;
Christian Heimesb3ad0e52017-09-08 12:00:19 -0700826 if (e == 0) {
Antoine Pitrou3b36fb12012-06-22 21:11:52 +0200827 /* possible? */
Antoine Pitrou525807b2010-05-12 14:05:24 +0000828 errstr = "A failure in the SSL library occurred";
Christian Heimesb3ad0e52017-09-08 12:00:19 -0700829 }
830 if (ERR_GET_LIB(e) == ERR_LIB_SSL &&
831 ERR_GET_REASON(e) == SSL_R_CERTIFICATE_VERIFY_FAILED) {
832 type = PySSLCertVerificationErrorObject;
833 }
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000834 break;
835 }
836 default:
837 p = PY_SSL_ERROR_INVALID_ERROR_CODE;
838 errstr = "Invalid error code";
839 }
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000840 }
Christian Heimesb3ad0e52017-09-08 12:00:19 -0700841 fill_and_set_sslerror(sslsock, type, p, errstr, lineno, e);
Antoine Pitrou9d74b422010-05-16 23:14:22 +0000842 ERR_clear_error();
Christian Heimesc7f70692019-05-31 11:44:05 +0200843 PySSL_ChainExceptions(sslsock);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000844 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000845}
846
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000847static PyObject *
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200848_setSSLError (const char *errstr, int errcode, const char *filename, int lineno) {
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000849
Antoine Pitrou3b36fb12012-06-22 21:11:52 +0200850 if (errstr == NULL)
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000851 errcode = ERR_peek_last_error();
Antoine Pitrou3b36fb12012-06-22 21:11:52 +0200852 else
853 errcode = 0;
Christian Heimesb3ad0e52017-09-08 12:00:19 -0700854 fill_and_set_sslerror(NULL, PySSLErrorObject, errcode, errstr, lineno, errcode);
Antoine Pitrou9d74b422010-05-16 23:14:22 +0000855 ERR_clear_error();
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000856 return NULL;
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000857}
858
Christian Heimes61d478c2018-01-27 15:51:38 +0100859/*
860 * SSL objects
861 */
862
863static int
864_ssl_configure_hostname(PySSLSocket *self, const char* server_hostname)
865{
866 int retval = -1;
867 ASN1_OCTET_STRING *ip;
868 PyObject *hostname;
869 size_t len;
870
871 assert(server_hostname);
872
873 /* Disable OpenSSL's special mode with leading dot in hostname:
874 * When name starts with a dot (e.g ".example.com"), it will be
875 * matched by a certificate valid for any sub-domain of name.
876 */
877 len = strlen(server_hostname);
878 if (len == 0 || *server_hostname == '.') {
879 PyErr_SetString(
880 PyExc_ValueError,
881 "server_hostname cannot be an empty string or start with a "
882 "leading dot.");
883 return retval;
884 }
885
886 /* inet_pton is not available on all platforms. */
887 ip = a2i_IPADDRESS(server_hostname);
888 if (ip == NULL) {
889 ERR_clear_error();
890 }
891
Christian Heimes11a14932018-02-24 02:35:08 +0100892 hostname = PyUnicode_Decode(server_hostname, len, "ascii", "strict");
Christian Heimes61d478c2018-01-27 15:51:38 +0100893 if (hostname == NULL) {
894 goto error;
895 }
896 self->server_hostname = hostname;
897
898 /* Only send SNI extension for non-IP hostnames */
899 if (ip == NULL) {
900 if (!SSL_set_tlsext_host_name(self->ssl, server_hostname)) {
901 _setSSLError(NULL, 0, __FILE__, __LINE__);
Zackery Spytzc32f2972020-10-25 12:02:30 -0600902 goto error;
Christian Heimes61d478c2018-01-27 15:51:38 +0100903 }
904 }
905 if (self->ctx->check_hostname) {
906 X509_VERIFY_PARAM *param = SSL_get0_param(self->ssl);
907 if (ip == NULL) {
Christian Heimesd02ac252018-03-25 12:36:13 +0200908 if (!X509_VERIFY_PARAM_set1_host(param, server_hostname,
909 strlen(server_hostname))) {
Christian Heimes61d478c2018-01-27 15:51:38 +0100910 _setSSLError(NULL, 0, __FILE__, __LINE__);
911 goto error;
912 }
913 } else {
Christian Heimesa871f692020-06-01 08:58:14 +0200914 if (!X509_VERIFY_PARAM_set1_ip(param, ASN1_STRING_get0_data(ip),
Christian Heimes61d478c2018-01-27 15:51:38 +0100915 ASN1_STRING_length(ip))) {
916 _setSSLError(NULL, 0, __FILE__, __LINE__);
917 goto error;
918 }
919 }
920 }
921 retval = 0;
922 error:
923 if (ip != NULL) {
924 ASN1_OCTET_STRING_free(ip);
925 }
926 return retval;
927}
928
Antoine Pitrou152efa22010-05-16 18:19:27 +0000929static PySSLSocket *
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +0100930newPySSLSocket(PySSLContext *sslctx, PySocketSockObject *sock,
Antoine Pitroud5323212010-10-22 18:19:07 +0000931 enum py_ssl_server_or_client socket_type,
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200932 char *server_hostname,
Christian Heimes141c5e82018-02-24 21:10:57 +0100933 PyObject *owner, PyObject *session,
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200934 PySSLMemoryBIO *inbio, PySSLMemoryBIO *outbio)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000935{
Antoine Pitrou152efa22010-05-16 18:19:27 +0000936 PySSLSocket *self;
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +0100937 SSL_CTX *ctx = sslctx->ctx;
Steve Dowerc6fd1c12018-09-17 11:34:47 -0700938 _PySSLError err = { 0 };
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000939
Antoine Pitrou152efa22010-05-16 18:19:27 +0000940 self = PyObject_New(PySSLSocket, &PySSLSocket_Type);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000941 if (self == NULL)
942 return NULL;
Antoine Pitrou152efa22010-05-16 18:19:27 +0000943
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000944 self->ssl = NULL;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000945 self->Socket = NULL;
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +0100946 self->ctx = sslctx;
Nathaniel J. Smith65ece7c2017-06-07 23:30:43 -0700947 Py_INCREF(sslctx);
Antoine Pitrou860aee72013-09-29 19:52:45 +0200948 self->shutdown_seen_zero = 0;
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200949 self->owner = NULL;
Benjamin Peterson81b9ecd2016-08-15 21:55:37 -0700950 self->server_hostname = NULL;
Steve Dowerc6fd1c12018-09-17 11:34:47 -0700951 self->err = err;
Christian Heimesc7f70692019-05-31 11:44:05 +0200952 self->exc_type = NULL;
953 self->exc_value = NULL;
954 self->exc_tb = NULL;
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200955
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000956 /* Make sure the SSL error state is initialized */
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000957 ERR_clear_error();
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000958
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000959 PySSL_BEGIN_ALLOW_THREADS
Antoine Pitrou152efa22010-05-16 18:19:27 +0000960 self->ssl = SSL_new(ctx);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000961 PySSL_END_ALLOW_THREADS
Zackery Spytz4c49da02018-12-07 03:11:30 -0700962 if (self->ssl == NULL) {
963 Py_DECREF(self);
964 _setSSLError(NULL, 0, __FILE__, __LINE__);
965 return NULL;
966 }
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200967 SSL_set_app_data(self->ssl, self);
968 if (sock) {
969 SSL_set_fd(self->ssl, Py_SAFE_DOWNCAST(sock->sock_fd, SOCKET_T, int));
970 } else {
971 /* BIOs are reference counted and SSL_set_bio borrows our reference.
972 * To prevent a double free in memory_bio_dealloc() we need to take an
973 * extra reference here. */
Christian Heimes598894f2016-09-05 23:19:05 +0200974 BIO_up_ref(inbio->bio);
975 BIO_up_ref(outbio->bio);
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200976 SSL_set_bio(self->ssl, inbio->bio, outbio->bio);
977 }
Alex Gaynorf0422422018-05-14 11:51:45 -0400978 SSL_set_mode(self->ssl,
979 SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER | SSL_MODE_AUTO_RETRY);
Guido van Rossum4f707ac2003-01-31 18:13:18 +0000980
Christian Heimesf0f59302019-07-01 08:29:17 +0200981#ifdef TLS1_3_VERSION
982 if (sslctx->post_handshake_auth == 1) {
983 if (socket_type == PY_SSL_SERVER) {
984 /* bpo-37428: OpenSSL does not ignore SSL_VERIFY_POST_HANDSHAKE.
985 * Set SSL_VERIFY_POST_HANDSHAKE flag only for server sockets and
986 * only in combination with SSL_VERIFY_PEER flag. */
987 int mode = SSL_get_verify_mode(self->ssl);
988 if (mode & SSL_VERIFY_PEER) {
989 int (*verify_cb)(int, X509_STORE_CTX *) = NULL;
990 verify_cb = SSL_get_verify_callback(self->ssl);
991 mode |= SSL_VERIFY_POST_HANDSHAKE;
992 SSL_set_verify(self->ssl, mode, verify_cb);
993 }
994 } else {
995 /* client socket */
996 SSL_set_post_handshake_auth(self->ssl, 1);
997 }
998 }
999#endif
1000
Christian Heimes61d478c2018-01-27 15:51:38 +01001001 if (server_hostname != NULL) {
1002 if (_ssl_configure_hostname(self, server_hostname) < 0) {
1003 Py_DECREF(self);
1004 return NULL;
1005 }
1006 }
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001007 /* If the socket is in non-blocking mode or timeout mode, set the BIO
1008 * to non-blocking mode (blocking is the default)
1009 */
Victor Stinnere2452312015-03-28 03:00:46 +01001010 if (sock && sock->sock_timeout >= 0) {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001011 BIO_set_nbio(SSL_get_rbio(self->ssl), 1);
1012 BIO_set_nbio(SSL_get_wbio(self->ssl), 1);
1013 }
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001014
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001015 PySSL_BEGIN_ALLOW_THREADS
1016 if (socket_type == PY_SSL_CLIENT)
1017 SSL_set_connect_state(self->ssl);
1018 else
1019 SSL_set_accept_state(self->ssl);
1020 PySSL_END_ALLOW_THREADS
Martin v. Löwis09c35f72002-07-28 09:57:45 +00001021
Antoine Pitroud6494802011-07-21 01:11:30 +02001022 self->socket_type = socket_type;
Antoine Pitroub1fdf472014-10-05 20:41:53 +02001023 if (sock != NULL) {
1024 self->Socket = PyWeakref_NewRef((PyObject *) sock, NULL);
1025 if (self->Socket == NULL) {
1026 Py_DECREF(self);
Antoine Pitroub1fdf472014-10-05 20:41:53 +02001027 return NULL;
1028 }
Victor Stinnera9eb38f2013-10-31 16:35:38 +01001029 }
Christian Heimes141c5e82018-02-24 21:10:57 +01001030 if (owner && owner != Py_None) {
1031 if (PySSL_set_owner(self, owner, NULL) == -1) {
1032 Py_DECREF(self);
1033 return NULL;
1034 }
1035 }
1036 if (session && session != Py_None) {
1037 if (PySSL_set_session(self, session, NULL) == -1) {
1038 Py_DECREF(self);
1039 return NULL;
1040 }
1041 }
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001042 return self;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001043}
1044
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001045/* SSL object methods */
1046
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03001047/*[clinic input]
1048_ssl._SSLSocket.do_handshake
1049[clinic start generated code]*/
1050
1051static PyObject *
1052_ssl__SSLSocket_do_handshake_impl(PySSLSocket *self)
1053/*[clinic end generated code: output=6c0898a8936548f6 input=d2d737de3df018c8]*/
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001054{
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001055 int ret;
Steve Dowerc6fd1c12018-09-17 11:34:47 -07001056 _PySSLError err;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001057 int sockstate, nonblocking;
Antoine Pitroub1fdf472014-10-05 20:41:53 +02001058 PySocketSockObject *sock = GET_SOCKET(self);
Victor Stinner14690702015-04-06 22:46:13 +02001059 _PyTime_t timeout, deadline = 0;
1060 int has_timeout;
Antoine Pitroud3f8ab82010-04-24 21:26:44 +00001061
Antoine Pitroub1fdf472014-10-05 20:41:53 +02001062 if (sock) {
1063 if (((PyObject*)sock) == Py_None) {
1064 _setSSLError("Underlying socket connection gone",
1065 PY_SSL_ERROR_NO_SOCKET, __FILE__, __LINE__);
1066 return NULL;
1067 }
1068 Py_INCREF(sock);
1069
1070 /* just in case the blocking state of the socket has been changed */
Victor Stinnere2452312015-03-28 03:00:46 +01001071 nonblocking = (sock->sock_timeout >= 0);
Antoine Pitroub1fdf472014-10-05 20:41:53 +02001072 BIO_set_nbio(SSL_get_rbio(self->ssl), nonblocking);
1073 BIO_set_nbio(SSL_get_wbio(self->ssl), nonblocking);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001074 }
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001075
Victor Stinner14690702015-04-06 22:46:13 +02001076 timeout = GET_SOCKET_TIMEOUT(sock);
1077 has_timeout = (timeout > 0);
1078 if (has_timeout)
1079 deadline = _PyTime_GetMonotonicClock() + timeout;
1080
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001081 /* Actually negotiate SSL connection */
1082 /* XXX If SSL_do_handshake() returns 0, it's also a failure. */
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001083 do {
Bill Janssen6e027db2007-11-15 22:23:56 +00001084 PySSL_BEGIN_ALLOW_THREADS
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001085 ret = SSL_do_handshake(self->ssl);
Steve Dowerc6fd1c12018-09-17 11:34:47 -07001086 err = _PySSL_errno(ret < 1, self->ssl, ret);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001087 PySSL_END_ALLOW_THREADS
Steve Dowerc6fd1c12018-09-17 11:34:47 -07001088 self->err = err;
Victor Stinner4e3cfa42015-04-02 21:28:28 +02001089
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +00001090 if (PyErr_CheckSignals())
1091 goto error;
Victor Stinner4e3cfa42015-04-02 21:28:28 +02001092
Victor Stinner14690702015-04-06 22:46:13 +02001093 if (has_timeout)
1094 timeout = deadline - _PyTime_GetMonotonicClock();
1095
Steve Dowerc6fd1c12018-09-17 11:34:47 -07001096 if (err.ssl == SSL_ERROR_WANT_READ) {
Victor Stinner14690702015-04-06 22:46:13 +02001097 sockstate = PySSL_select(sock, 0, timeout);
Steve Dowerc6fd1c12018-09-17 11:34:47 -07001098 } else if (err.ssl == SSL_ERROR_WANT_WRITE) {
Victor Stinner14690702015-04-06 22:46:13 +02001099 sockstate = PySSL_select(sock, 1, timeout);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001100 } else {
1101 sockstate = SOCKET_OPERATION_OK;
1102 }
Victor Stinner4e3cfa42015-04-02 21:28:28 +02001103
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001104 if (sockstate == SOCKET_HAS_TIMED_OUT) {
Antoine Pitrouc4df7842010-12-03 19:59:41 +00001105 PyErr_SetString(PySocketModule.timeout_error,
Antoine Pitrou525807b2010-05-12 14:05:24 +00001106 ERRSTR("The handshake operation timed out"));
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +00001107 goto error;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001108 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
1109 PyErr_SetString(PySSLErrorObject,
Antoine Pitrou525807b2010-05-12 14:05:24 +00001110 ERRSTR("Underlying socket has been closed."));
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +00001111 goto error;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001112 } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
1113 PyErr_SetString(PySSLErrorObject,
Antoine Pitrou525807b2010-05-12 14:05:24 +00001114 ERRSTR("Underlying socket too large for select()."));
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +00001115 goto error;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001116 } else if (sockstate == SOCKET_IS_NONBLOCKING) {
1117 break;
1118 }
Steve Dowerc6fd1c12018-09-17 11:34:47 -07001119 } while (err.ssl == SSL_ERROR_WANT_READ ||
1120 err.ssl == SSL_ERROR_WANT_WRITE);
Antoine Pitroub1fdf472014-10-05 20:41:53 +02001121 Py_XDECREF(sock);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001122 if (ret < 1)
1123 return PySSL_SetError(self, ret, __FILE__, __LINE__);
Christian Heimesc7f70692019-05-31 11:44:05 +02001124 if (PySSL_ChainExceptions(self) < 0)
1125 return NULL;
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001126 Py_RETURN_NONE;
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +00001127error:
Antoine Pitroub1fdf472014-10-05 20:41:53 +02001128 Py_XDECREF(sock);
Christian Heimesc7f70692019-05-31 11:44:05 +02001129 PySSL_ChainExceptions(self);
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +00001130 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001131}
1132
Thomas Woutersed03b412007-08-28 21:37:11 +00001133static PyObject *
Serhiy Storchakae503ca52017-09-05 01:28:53 +03001134_asn1obj2py(const ASN1_OBJECT *name, int no_name)
1135{
1136 char buf[X509_NAME_MAXLEN];
1137 char *namebuf = buf;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001138 int buflen;
Serhiy Storchakae503ca52017-09-05 01:28:53 +03001139 PyObject *name_obj = NULL;
Thomas Woutersed03b412007-08-28 21:37:11 +00001140
Serhiy Storchakae503ca52017-09-05 01:28:53 +03001141 buflen = OBJ_obj2txt(namebuf, X509_NAME_MAXLEN, name, no_name);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001142 if (buflen < 0) {
1143 _setSSLError(NULL, 0, __FILE__, __LINE__);
Serhiy Storchakae503ca52017-09-05 01:28:53 +03001144 return NULL;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001145 }
Serhiy Storchakae503ca52017-09-05 01:28:53 +03001146 /* initial buffer is too small for oid + terminating null byte */
1147 if (buflen > X509_NAME_MAXLEN - 1) {
1148 /* make OBJ_obj2txt() calculate the required buflen */
1149 buflen = OBJ_obj2txt(NULL, 0, name, no_name);
1150 /* allocate len + 1 for terminating NULL byte */
1151 namebuf = PyMem_Malloc(buflen + 1);
1152 if (namebuf == NULL) {
1153 PyErr_NoMemory();
1154 return NULL;
1155 }
1156 buflen = OBJ_obj2txt(namebuf, buflen + 1, name, no_name);
1157 if (buflen < 0) {
1158 _setSSLError(NULL, 0, __FILE__, __LINE__);
1159 goto done;
1160 }
1161 }
1162 if (!buflen && no_name) {
1163 Py_INCREF(Py_None);
1164 name_obj = Py_None;
1165 }
1166 else {
1167 name_obj = PyUnicode_FromStringAndSize(namebuf, buflen);
1168 }
1169
1170 done:
1171 if (buf != namebuf) {
1172 PyMem_Free(namebuf);
1173 }
1174 return name_obj;
1175}
1176
1177static PyObject *
1178_create_tuple_for_attribute(ASN1_OBJECT *name, ASN1_STRING *value)
1179{
1180 Py_ssize_t buflen;
1181 unsigned char *valuebuf = NULL;
1182 PyObject *attr;
Guido van Rossumf06628b2007-11-21 20:01:53 +00001183
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001184 buflen = ASN1_STRING_to_UTF8(&valuebuf, value);
1185 if (buflen < 0) {
1186 _setSSLError(NULL, 0, __FILE__, __LINE__);
Serhiy Storchakae503ca52017-09-05 01:28:53 +03001187 return NULL;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001188 }
Serhiy Storchakae503ca52017-09-05 01:28:53 +03001189 attr = Py_BuildValue("Ns#", _asn1obj2py(name, 0), valuebuf, buflen);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001190 OPENSSL_free(valuebuf);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001191 return attr;
Thomas Woutersed03b412007-08-28 21:37:11 +00001192}
1193
1194static PyObject *
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001195_create_tuple_for_X509_NAME (X509_NAME *xname)
Thomas Woutersed03b412007-08-28 21:37:11 +00001196{
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001197 PyObject *dn = NULL; /* tuple which represents the "distinguished name" */
1198 PyObject *rdn = NULL; /* tuple to hold a "relative distinguished name" */
1199 PyObject *rdnt;
1200 PyObject *attr = NULL; /* tuple to hold an attribute */
1201 int entry_count = X509_NAME_entry_count(xname);
1202 X509_NAME_ENTRY *entry;
1203 ASN1_OBJECT *name;
1204 ASN1_STRING *value;
1205 int index_counter;
1206 int rdn_level = -1;
1207 int retcode;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001208
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001209 dn = PyList_New(0);
1210 if (dn == NULL)
1211 return NULL;
1212 /* now create another tuple to hold the top-level RDN */
1213 rdn = PyList_New(0);
1214 if (rdn == NULL)
1215 goto fail0;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001216
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001217 for (index_counter = 0;
1218 index_counter < entry_count;
1219 index_counter++)
1220 {
1221 entry = X509_NAME_get_entry(xname, index_counter);
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001222
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001223 /* check to see if we've gotten to a new RDN */
1224 if (rdn_level >= 0) {
Christian Heimes598894f2016-09-05 23:19:05 +02001225 if (rdn_level != X509_NAME_ENTRY_set(entry)) {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001226 /* yes, new RDN */
1227 /* add old RDN to DN */
1228 rdnt = PyList_AsTuple(rdn);
1229 Py_DECREF(rdn);
1230 if (rdnt == NULL)
1231 goto fail0;
1232 retcode = PyList_Append(dn, rdnt);
1233 Py_DECREF(rdnt);
1234 if (retcode < 0)
1235 goto fail0;
1236 /* create new RDN */
1237 rdn = PyList_New(0);
1238 if (rdn == NULL)
1239 goto fail0;
1240 }
1241 }
Christian Heimes598894f2016-09-05 23:19:05 +02001242 rdn_level = X509_NAME_ENTRY_set(entry);
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001243
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001244 /* now add this attribute to the current RDN */
1245 name = X509_NAME_ENTRY_get_object(entry);
1246 value = X509_NAME_ENTRY_get_data(entry);
1247 attr = _create_tuple_for_attribute(name, value);
1248 /*
1249 fprintf(stderr, "RDN level %d, attribute %s: %s\n",
1250 entry->set,
1251 PyBytes_AS_STRING(PyTuple_GET_ITEM(attr, 0)),
1252 PyBytes_AS_STRING(PyTuple_GET_ITEM(attr, 1)));
1253 */
1254 if (attr == NULL)
1255 goto fail1;
1256 retcode = PyList_Append(rdn, attr);
1257 Py_DECREF(attr);
1258 if (retcode < 0)
1259 goto fail1;
1260 }
1261 /* now, there's typically a dangling RDN */
Antoine Pitrou2f5a1632012-02-15 22:25:27 +01001262 if (rdn != NULL) {
1263 if (PyList_GET_SIZE(rdn) > 0) {
1264 rdnt = PyList_AsTuple(rdn);
1265 Py_DECREF(rdn);
1266 if (rdnt == NULL)
1267 goto fail0;
1268 retcode = PyList_Append(dn, rdnt);
1269 Py_DECREF(rdnt);
1270 if (retcode < 0)
1271 goto fail0;
1272 }
1273 else {
1274 Py_DECREF(rdn);
1275 }
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001276 }
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001277
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001278 /* convert list to tuple */
1279 rdnt = PyList_AsTuple(dn);
1280 Py_DECREF(dn);
1281 if (rdnt == NULL)
1282 return NULL;
1283 return rdnt;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001284
1285 fail1:
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001286 Py_XDECREF(rdn);
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001287
1288 fail0:
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001289 Py_XDECREF(dn);
1290 return NULL;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001291}
1292
1293static PyObject *
1294_get_peer_alt_names (X509 *certificate) {
Guido van Rossumf06628b2007-11-21 20:01:53 +00001295
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001296 /* this code follows the procedure outlined in
1297 OpenSSL's crypto/x509v3/v3_prn.c:X509v3_EXT_print()
1298 function to extract the STACK_OF(GENERAL_NAME),
1299 then iterates through the stack to add the
1300 names. */
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001301
Alex Gaynorb87c0df2017-06-06 07:53:11 -04001302 int j;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001303 PyObject *peer_alt_names = Py_None;
Christian Heimes60bf2fc2013-09-05 16:04:35 +02001304 PyObject *v = NULL, *t;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001305 GENERAL_NAMES *names = NULL;
1306 GENERAL_NAME *name;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001307 BIO *biobuf = NULL;
1308 char buf[2048];
1309 char *vptr;
1310 int len;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001311
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001312 if (certificate == NULL)
1313 return peer_alt_names;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001314
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001315 /* get a memory buffer */
1316 biobuf = BIO_new(BIO_s_mem());
Zackery Spytz4c49da02018-12-07 03:11:30 -07001317 if (biobuf == NULL) {
1318 PyErr_SetString(PySSLErrorObject, "failed to allocate BIO");
1319 return NULL;
1320 }
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001321
Alex Gaynorb87c0df2017-06-06 07:53:11 -04001322 names = (GENERAL_NAMES *)X509_get_ext_d2i(
1323 certificate, NID_subject_alt_name, NULL, NULL);
1324 if (names != NULL) {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001325 if (peer_alt_names == Py_None) {
1326 peer_alt_names = PyList_New(0);
1327 if (peer_alt_names == NULL)
1328 goto fail;
1329 }
Guido van Rossumf06628b2007-11-21 20:01:53 +00001330
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001331 for(j = 0; j < sk_GENERAL_NAME_num(names); j++) {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001332 /* get a rendering of each name in the set of names */
Christian Heimes824f7f32013-08-17 00:54:47 +02001333 int gntype;
1334 ASN1_STRING *as = NULL;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001335
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001336 name = sk_GENERAL_NAME_value(names, j);
Christian Heimes474afdd2013-08-17 17:18:56 +02001337 gntype = name->type;
Christian Heimes824f7f32013-08-17 00:54:47 +02001338 switch (gntype) {
1339 case GEN_DIRNAME:
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001340 /* we special-case DirName as a tuple of
1341 tuples of attributes */
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001342
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001343 t = PyTuple_New(2);
1344 if (t == NULL) {
1345 goto fail;
1346 }
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001347
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001348 v = PyUnicode_FromString("DirName");
1349 if (v == NULL) {
1350 Py_DECREF(t);
1351 goto fail;
1352 }
1353 PyTuple_SET_ITEM(t, 0, v);
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001354
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001355 v = _create_tuple_for_X509_NAME (name->d.dirn);
1356 if (v == NULL) {
1357 Py_DECREF(t);
1358 goto fail;
1359 }
1360 PyTuple_SET_ITEM(t, 1, v);
Christian Heimes824f7f32013-08-17 00:54:47 +02001361 break;
Guido van Rossumf06628b2007-11-21 20:01:53 +00001362
Christian Heimes824f7f32013-08-17 00:54:47 +02001363 case GEN_EMAIL:
1364 case GEN_DNS:
1365 case GEN_URI:
1366 /* GENERAL_NAME_print() doesn't handle NULL bytes in ASN1_string
1367 correctly, CVE-2013-4238 */
1368 t = PyTuple_New(2);
1369 if (t == NULL)
1370 goto fail;
1371 switch (gntype) {
1372 case GEN_EMAIL:
1373 v = PyUnicode_FromString("email");
1374 as = name->d.rfc822Name;
1375 break;
1376 case GEN_DNS:
1377 v = PyUnicode_FromString("DNS");
1378 as = name->d.dNSName;
1379 break;
1380 case GEN_URI:
1381 v = PyUnicode_FromString("URI");
1382 as = name->d.uniformResourceIdentifier;
1383 break;
1384 }
1385 if (v == NULL) {
1386 Py_DECREF(t);
1387 goto fail;
1388 }
1389 PyTuple_SET_ITEM(t, 0, v);
Christian Heimesa871f692020-06-01 08:58:14 +02001390 v = PyUnicode_FromStringAndSize((char *)ASN1_STRING_get0_data(as),
Christian Heimes824f7f32013-08-17 00:54:47 +02001391 ASN1_STRING_length(as));
1392 if (v == NULL) {
1393 Py_DECREF(t);
1394 goto fail;
1395 }
1396 PyTuple_SET_ITEM(t, 1, v);
1397 break;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001398
Christian Heimes1c03abd2016-09-06 23:25:35 +02001399 case GEN_RID:
1400 t = PyTuple_New(2);
1401 if (t == NULL)
1402 goto fail;
1403
1404 v = PyUnicode_FromString("Registered ID");
1405 if (v == NULL) {
1406 Py_DECREF(t);
1407 goto fail;
1408 }
1409 PyTuple_SET_ITEM(t, 0, v);
1410
1411 len = i2t_ASN1_OBJECT(buf, sizeof(buf)-1, name->d.rid);
1412 if (len < 0) {
1413 Py_DECREF(t);
1414 _setSSLError(NULL, 0, __FILE__, __LINE__);
1415 goto fail;
1416 } else if (len >= (int)sizeof(buf)) {
1417 v = PyUnicode_FromString("<INVALID>");
1418 } else {
1419 v = PyUnicode_FromStringAndSize(buf, len);
1420 }
1421 if (v == NULL) {
1422 Py_DECREF(t);
1423 goto fail;
1424 }
1425 PyTuple_SET_ITEM(t, 1, v);
1426 break;
1427
Christian Heimes2b7de662019-12-07 17:59:36 +01001428 case GEN_IPADD:
1429 /* OpenSSL < 3.0.0 adds a trailing \n to IPv6. 3.0.0 removed
1430 * the trailing newline. Remove it in all versions
1431 */
1432 t = PyTuple_New(2);
1433 if (t == NULL)
1434 goto fail;
1435
1436 v = PyUnicode_FromString("IP Address");
1437 if (v == NULL) {
1438 Py_DECREF(t);
1439 goto fail;
1440 }
1441 PyTuple_SET_ITEM(t, 0, v);
1442
1443 if (name->d.ip->length == 4) {
1444 unsigned char *p = name->d.ip->data;
1445 v = PyUnicode_FromFormat(
1446 "%d.%d.%d.%d",
1447 p[0], p[1], p[2], p[3]
1448 );
1449 } else if (name->d.ip->length == 16) {
1450 /* PyUnicode_FromFormat() does not support %X */
1451 unsigned char *p = name->d.ip->data;
1452 len = sprintf(
1453 buf,
1454 "%X:%X:%X:%X:%X:%X:%X:%X",
1455 p[0] << 8 | p[1],
1456 p[2] << 8 | p[3],
1457 p[4] << 8 | p[5],
1458 p[6] << 8 | p[7],
1459 p[8] << 8 | p[9],
1460 p[10] << 8 | p[11],
1461 p[12] << 8 | p[13],
1462 p[14] << 8 | p[15]
1463 );
1464 v = PyUnicode_FromStringAndSize(buf, len);
1465 } else {
1466 v = PyUnicode_FromString("<invalid>");
1467 }
1468
1469 if (v == NULL) {
1470 Py_DECREF(t);
1471 goto fail;
1472 }
1473 PyTuple_SET_ITEM(t, 1, v);
1474 break;
1475
Christian Heimes824f7f32013-08-17 00:54:47 +02001476 default:
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001477 /* for everything else, we use the OpenSSL print form */
Christian Heimes824f7f32013-08-17 00:54:47 +02001478 switch (gntype) {
1479 /* check for new general name type */
1480 case GEN_OTHERNAME:
1481 case GEN_X400:
1482 case GEN_EDIPARTY:
Christian Heimes824f7f32013-08-17 00:54:47 +02001483 case GEN_RID:
1484 break;
1485 default:
1486 if (PyErr_WarnFormat(PyExc_RuntimeWarning, 1,
1487 "Unknown general name type %d",
1488 gntype) == -1) {
1489 goto fail;
1490 }
1491 break;
1492 }
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001493 (void) BIO_reset(biobuf);
1494 GENERAL_NAME_print(biobuf, name);
1495 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
1496 if (len < 0) {
1497 _setSSLError(NULL, 0, __FILE__, __LINE__);
1498 goto fail;
1499 }
1500 vptr = strchr(buf, ':');
Christian Heimes1c03abd2016-09-06 23:25:35 +02001501 if (vptr == NULL) {
1502 PyErr_Format(PyExc_ValueError,
1503 "Invalid value %.200s",
1504 buf);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001505 goto fail;
Christian Heimes1c03abd2016-09-06 23:25:35 +02001506 }
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001507 t = PyTuple_New(2);
1508 if (t == NULL)
1509 goto fail;
1510 v = PyUnicode_FromStringAndSize(buf, (vptr - buf));
1511 if (v == NULL) {
1512 Py_DECREF(t);
1513 goto fail;
1514 }
1515 PyTuple_SET_ITEM(t, 0, v);
1516 v = PyUnicode_FromStringAndSize((vptr + 1),
1517 (len - (vptr - buf + 1)));
1518 if (v == NULL) {
1519 Py_DECREF(t);
1520 goto fail;
1521 }
1522 PyTuple_SET_ITEM(t, 1, v);
Christian Heimes824f7f32013-08-17 00:54:47 +02001523 break;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001524 }
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001525
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001526 /* and add that rendering to the list */
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001527
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001528 if (PyList_Append(peer_alt_names, t) < 0) {
1529 Py_DECREF(t);
1530 goto fail;
1531 }
1532 Py_DECREF(t);
1533 }
Antoine Pitrou116d6b92011-11-23 01:39:19 +01001534 sk_GENERAL_NAME_pop_free(names, GENERAL_NAME_free);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001535 }
1536 BIO_free(biobuf);
1537 if (peer_alt_names != Py_None) {
1538 v = PyList_AsTuple(peer_alt_names);
1539 Py_DECREF(peer_alt_names);
1540 return v;
1541 } else {
1542 return peer_alt_names;
1543 }
Guido van Rossumf06628b2007-11-21 20:01:53 +00001544
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001545
1546 fail:
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001547 if (biobuf != NULL)
1548 BIO_free(biobuf);
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001549
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001550 if (peer_alt_names != Py_None) {
1551 Py_XDECREF(peer_alt_names);
1552 }
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001553
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001554 return NULL;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001555}
1556
1557static PyObject *
Christian Heimesbd3a7f92013-11-21 03:40:15 +01001558_get_aia_uri(X509 *certificate, int nid) {
1559 PyObject *lst = NULL, *ostr = NULL;
1560 int i, result;
1561 AUTHORITY_INFO_ACCESS *info;
1562
1563 info = X509_get_ext_d2i(certificate, NID_info_access, NULL, NULL);
Benjamin Petersonf0c90382015-11-14 15:12:18 -08001564 if (info == NULL)
1565 return Py_None;
1566 if (sk_ACCESS_DESCRIPTION_num(info) == 0) {
1567 AUTHORITY_INFO_ACCESS_free(info);
Christian Heimesbd3a7f92013-11-21 03:40:15 +01001568 return Py_None;
1569 }
1570
1571 if ((lst = PyList_New(0)) == NULL) {
1572 goto fail;
1573 }
1574
1575 for (i = 0; i < sk_ACCESS_DESCRIPTION_num(info); i++) {
1576 ACCESS_DESCRIPTION *ad = sk_ACCESS_DESCRIPTION_value(info, i);
1577 ASN1_IA5STRING *uri;
1578
1579 if ((OBJ_obj2nid(ad->method) != nid) ||
1580 (ad->location->type != GEN_URI)) {
1581 continue;
1582 }
1583 uri = ad->location->d.uniformResourceIdentifier;
1584 ostr = PyUnicode_FromStringAndSize((char *)uri->data,
1585 uri->length);
1586 if (ostr == NULL) {
1587 goto fail;
1588 }
1589 result = PyList_Append(lst, ostr);
1590 Py_DECREF(ostr);
1591 if (result < 0) {
1592 goto fail;
1593 }
1594 }
1595 AUTHORITY_INFO_ACCESS_free(info);
1596
1597 /* convert to tuple or None */
1598 if (PyList_Size(lst) == 0) {
1599 Py_DECREF(lst);
1600 return Py_None;
1601 } else {
1602 PyObject *tup;
1603 tup = PyList_AsTuple(lst);
1604 Py_DECREF(lst);
1605 return tup;
1606 }
1607
1608 fail:
1609 AUTHORITY_INFO_ACCESS_free(info);
Christian Heimes18fc7be2013-11-21 23:57:49 +01001610 Py_XDECREF(lst);
Christian Heimesbd3a7f92013-11-21 03:40:15 +01001611 return NULL;
1612}
1613
1614static PyObject *
1615_get_crl_dp(X509 *certificate) {
1616 STACK_OF(DIST_POINT) *dps;
Benjamin Petersoneda06c82015-11-11 22:07:38 -08001617 int i, j;
1618 PyObject *lst, *res = NULL;
Christian Heimesbd3a7f92013-11-21 03:40:15 +01001619
Christian Heimes598894f2016-09-05 23:19:05 +02001620 dps = X509_get_ext_d2i(certificate, NID_crl_distribution_points, NULL, NULL);
Christian Heimes949ec142013-11-21 16:26:51 +01001621
Benjamin Petersoneda06c82015-11-11 22:07:38 -08001622 if (dps == NULL)
Christian Heimesbd3a7f92013-11-21 03:40:15 +01001623 return Py_None;
Christian Heimesbd3a7f92013-11-21 03:40:15 +01001624
Benjamin Petersoneda06c82015-11-11 22:07:38 -08001625 lst = PyList_New(0);
1626 if (lst == NULL)
1627 goto done;
Christian Heimesbd3a7f92013-11-21 03:40:15 +01001628
1629 for (i=0; i < sk_DIST_POINT_num(dps); i++) {
1630 DIST_POINT *dp;
1631 STACK_OF(GENERAL_NAME) *gns;
1632
1633 dp = sk_DIST_POINT_value(dps, i);
Christian Heimesa37f5242019-01-15 23:47:42 +01001634 if (dp->distpoint == NULL) {
1635 /* Ignore empty DP value, CVE-2019-5010 */
1636 continue;
1637 }
Christian Heimesbd3a7f92013-11-21 03:40:15 +01001638 gns = dp->distpoint->name.fullname;
1639
1640 for (j=0; j < sk_GENERAL_NAME_num(gns); j++) {
1641 GENERAL_NAME *gn;
1642 ASN1_IA5STRING *uri;
1643 PyObject *ouri;
Benjamin Petersoneda06c82015-11-11 22:07:38 -08001644 int err;
Christian Heimesbd3a7f92013-11-21 03:40:15 +01001645
1646 gn = sk_GENERAL_NAME_value(gns, j);
1647 if (gn->type != GEN_URI) {
1648 continue;
1649 }
1650 uri = gn->d.uniformResourceIdentifier;
1651 ouri = PyUnicode_FromStringAndSize((char *)uri->data,
1652 uri->length);
Benjamin Petersoneda06c82015-11-11 22:07:38 -08001653 if (ouri == NULL)
1654 goto done;
1655
1656 err = PyList_Append(lst, ouri);
Christian Heimesbd3a7f92013-11-21 03:40:15 +01001657 Py_DECREF(ouri);
Benjamin Petersoneda06c82015-11-11 22:07:38 -08001658 if (err < 0)
1659 goto done;
Christian Heimesbd3a7f92013-11-21 03:40:15 +01001660 }
1661 }
Benjamin Petersoneda06c82015-11-11 22:07:38 -08001662
1663 /* Convert to tuple. */
1664 res = (PyList_GET_SIZE(lst) > 0) ? PyList_AsTuple(lst) : Py_None;
1665
1666 done:
1667 Py_XDECREF(lst);
Olivier Vielpeau2849cc32017-04-14 21:06:07 -04001668 CRL_DIST_POINTS_free(dps);
Benjamin Petersoneda06c82015-11-11 22:07:38 -08001669 return res;
Christian Heimesbd3a7f92013-11-21 03:40:15 +01001670}
1671
1672static PyObject *
Antoine Pitroufb046912010-11-09 20:21:19 +00001673_decode_certificate(X509 *certificate) {
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001674
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001675 PyObject *retval = NULL;
1676 BIO *biobuf = NULL;
1677 PyObject *peer;
1678 PyObject *peer_alt_names = NULL;
1679 PyObject *issuer;
1680 PyObject *version;
1681 PyObject *sn_obj;
Christian Heimesbd3a7f92013-11-21 03:40:15 +01001682 PyObject *obj;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001683 ASN1_INTEGER *serialNumber;
1684 char buf[2048];
Christian Heimesbd3a7f92013-11-21 03:40:15 +01001685 int len, result;
Christian Heimesa871f692020-06-01 08:58:14 +02001686 const ASN1_TIME *notBefore, *notAfter;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001687 PyObject *pnotBefore, *pnotAfter;
Thomas Woutersed03b412007-08-28 21:37:11 +00001688
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001689 retval = PyDict_New();
1690 if (retval == NULL)
1691 return NULL;
Thomas Woutersed03b412007-08-28 21:37:11 +00001692
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001693 peer = _create_tuple_for_X509_NAME(
1694 X509_get_subject_name(certificate));
1695 if (peer == NULL)
1696 goto fail0;
1697 if (PyDict_SetItemString(retval, (const char *) "subject", peer) < 0) {
1698 Py_DECREF(peer);
1699 goto fail0;
1700 }
1701 Py_DECREF(peer);
Thomas Woutersed03b412007-08-28 21:37:11 +00001702
Antoine Pitroufb046912010-11-09 20:21:19 +00001703 issuer = _create_tuple_for_X509_NAME(
1704 X509_get_issuer_name(certificate));
1705 if (issuer == NULL)
1706 goto fail0;
1707 if (PyDict_SetItemString(retval, (const char *)"issuer", issuer) < 0) {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001708 Py_DECREF(issuer);
Antoine Pitroufb046912010-11-09 20:21:19 +00001709 goto fail0;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001710 }
Antoine Pitroufb046912010-11-09 20:21:19 +00001711 Py_DECREF(issuer);
1712
1713 version = PyLong_FromLong(X509_get_version(certificate) + 1);
Christian Heimes5962bef2013-07-26 15:51:18 +02001714 if (version == NULL)
1715 goto fail0;
Antoine Pitroufb046912010-11-09 20:21:19 +00001716 if (PyDict_SetItemString(retval, "version", version) < 0) {
1717 Py_DECREF(version);
1718 goto fail0;
1719 }
1720 Py_DECREF(version);
Guido van Rossumf06628b2007-11-21 20:01:53 +00001721
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001722 /* get a memory buffer */
1723 biobuf = BIO_new(BIO_s_mem());
Zackery Spytz4c49da02018-12-07 03:11:30 -07001724 if (biobuf == NULL) {
1725 PyErr_SetString(PySSLErrorObject, "failed to allocate BIO");
1726 goto fail0;
1727 }
Guido van Rossumf06628b2007-11-21 20:01:53 +00001728
Antoine Pitroufb046912010-11-09 20:21:19 +00001729 (void) BIO_reset(biobuf);
1730 serialNumber = X509_get_serialNumber(certificate);
1731 /* should not exceed 20 octets, 160 bits, so buf is big enough */
1732 i2a_ASN1_INTEGER(biobuf, serialNumber);
1733 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
1734 if (len < 0) {
1735 _setSSLError(NULL, 0, __FILE__, __LINE__);
1736 goto fail1;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001737 }
Antoine Pitroufb046912010-11-09 20:21:19 +00001738 sn_obj = PyUnicode_FromStringAndSize(buf, len);
1739 if (sn_obj == NULL)
1740 goto fail1;
1741 if (PyDict_SetItemString(retval, "serialNumber", sn_obj) < 0) {
1742 Py_DECREF(sn_obj);
1743 goto fail1;
1744 }
1745 Py_DECREF(sn_obj);
1746
1747 (void) BIO_reset(biobuf);
Christian Heimesa871f692020-06-01 08:58:14 +02001748 notBefore = X509_get0_notBefore(certificate);
Antoine Pitroufb046912010-11-09 20:21:19 +00001749 ASN1_TIME_print(biobuf, notBefore);
1750 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
1751 if (len < 0) {
1752 _setSSLError(NULL, 0, __FILE__, __LINE__);
1753 goto fail1;
1754 }
1755 pnotBefore = PyUnicode_FromStringAndSize(buf, len);
1756 if (pnotBefore == NULL)
1757 goto fail1;
1758 if (PyDict_SetItemString(retval, "notBefore", pnotBefore) < 0) {
1759 Py_DECREF(pnotBefore);
1760 goto fail1;
1761 }
1762 Py_DECREF(pnotBefore);
Thomas Woutersed03b412007-08-28 21:37:11 +00001763
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001764 (void) BIO_reset(biobuf);
Christian Heimesa871f692020-06-01 08:58:14 +02001765 notAfter = X509_get0_notAfter(certificate);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001766 ASN1_TIME_print(biobuf, notAfter);
1767 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
1768 if (len < 0) {
1769 _setSSLError(NULL, 0, __FILE__, __LINE__);
1770 goto fail1;
1771 }
1772 pnotAfter = PyUnicode_FromStringAndSize(buf, len);
1773 if (pnotAfter == NULL)
1774 goto fail1;
1775 if (PyDict_SetItemString(retval, "notAfter", pnotAfter) < 0) {
1776 Py_DECREF(pnotAfter);
1777 goto fail1;
1778 }
1779 Py_DECREF(pnotAfter);
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001780
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001781 /* Now look for subjectAltName */
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001782
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001783 peer_alt_names = _get_peer_alt_names(certificate);
1784 if (peer_alt_names == NULL)
1785 goto fail1;
1786 else if (peer_alt_names != Py_None) {
1787 if (PyDict_SetItemString(retval, "subjectAltName",
1788 peer_alt_names) < 0) {
1789 Py_DECREF(peer_alt_names);
1790 goto fail1;
1791 }
1792 Py_DECREF(peer_alt_names);
1793 }
Guido van Rossumf06628b2007-11-21 20:01:53 +00001794
Christian Heimesbd3a7f92013-11-21 03:40:15 +01001795 /* Authority Information Access: OCSP URIs */
1796 obj = _get_aia_uri(certificate, NID_ad_OCSP);
1797 if (obj == NULL) {
1798 goto fail1;
1799 } else if (obj != Py_None) {
1800 result = PyDict_SetItemString(retval, "OCSP", obj);
1801 Py_DECREF(obj);
1802 if (result < 0) {
1803 goto fail1;
1804 }
1805 }
1806
1807 obj = _get_aia_uri(certificate, NID_ad_ca_issuers);
1808 if (obj == NULL) {
1809 goto fail1;
1810 } else if (obj != Py_None) {
1811 result = PyDict_SetItemString(retval, "caIssuers", obj);
1812 Py_DECREF(obj);
1813 if (result < 0) {
1814 goto fail1;
1815 }
1816 }
1817
1818 /* CDP (CRL distribution points) */
1819 obj = _get_crl_dp(certificate);
1820 if (obj == NULL) {
1821 goto fail1;
1822 } else if (obj != Py_None) {
1823 result = PyDict_SetItemString(retval, "crlDistributionPoints", obj);
1824 Py_DECREF(obj);
1825 if (result < 0) {
1826 goto fail1;
1827 }
1828 }
1829
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001830 BIO_free(biobuf);
1831 return retval;
Thomas Woutersed03b412007-08-28 21:37:11 +00001832
1833 fail1:
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001834 if (biobuf != NULL)
1835 BIO_free(biobuf);
Thomas Woutersed03b412007-08-28 21:37:11 +00001836 fail0:
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001837 Py_XDECREF(retval);
1838 return NULL;
Thomas Woutersed03b412007-08-28 21:37:11 +00001839}
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001840
Christian Heimes9a5395a2013-06-17 15:44:12 +02001841static PyObject *
1842_certificate_to_der(X509 *certificate)
1843{
1844 unsigned char *bytes_buf = NULL;
1845 int len;
1846 PyObject *retval;
1847
1848 bytes_buf = NULL;
1849 len = i2d_X509(certificate, &bytes_buf);
1850 if (len < 0) {
1851 _setSSLError(NULL, 0, __FILE__, __LINE__);
1852 return NULL;
1853 }
1854 /* this is actually an immutable bytes sequence */
1855 retval = PyBytes_FromStringAndSize((const char *) bytes_buf, len);
1856 OPENSSL_free(bytes_buf);
1857 return retval;
1858}
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001859
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03001860/*[clinic input]
1861_ssl._test_decode_cert
1862 path: object(converter="PyUnicode_FSConverter")
1863 /
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001864
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03001865[clinic start generated code]*/
1866
1867static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001868_ssl__test_decode_cert_impl(PyObject *module, PyObject *path)
1869/*[clinic end generated code: output=96becb9abb23c091 input=cdeaaf02d4346628]*/
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03001870{
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001871 PyObject *retval = NULL;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001872 X509 *x=NULL;
1873 BIO *cert;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001874
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001875 if ((cert=BIO_new(BIO_s_file())) == NULL) {
1876 PyErr_SetString(PySSLErrorObject,
1877 "Can't malloc memory to read file");
1878 goto fail0;
1879 }
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001880
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03001881 if (BIO_read_filename(cert, PyBytes_AsString(path)) <= 0) {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001882 PyErr_SetString(PySSLErrorObject,
1883 "Can't open file");
1884 goto fail0;
1885 }
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001886
Alex Gaynor40dad952019-08-15 08:31:28 -04001887 x = PEM_read_bio_X509(cert, NULL, NULL, NULL);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001888 if (x == NULL) {
1889 PyErr_SetString(PySSLErrorObject,
1890 "Error decoding PEM-encoded file");
1891 goto fail0;
1892 }
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001893
Antoine Pitroufb046912010-11-09 20:21:19 +00001894 retval = _decode_certificate(x);
Mark Dickinsonee55df52010-08-03 18:31:54 +00001895 X509_free(x);
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001896
1897 fail0:
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03001898 Py_DECREF(path);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001899 if (cert != NULL) BIO_free(cert);
1900 return retval;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001901}
1902
1903
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03001904/*[clinic input]
Christian Heimes141c5e82018-02-24 21:10:57 +01001905_ssl._SSLSocket.getpeercert
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03001906 der as binary_mode: bool = False
1907 /
1908
1909Returns the certificate for the peer.
1910
1911If no certificate was provided, returns None. If a certificate was
1912provided, but not validated, returns an empty dictionary. Otherwise
1913returns a dict containing information about the peer certificate.
1914
1915If the optional argument is True, returns a DER-encoded copy of the
1916peer certificate, or None if no certificate was provided. This will
1917return the certificate even if it wasn't validated.
1918[clinic start generated code]*/
1919
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001920static PyObject *
Christian Heimes141c5e82018-02-24 21:10:57 +01001921_ssl__SSLSocket_getpeercert_impl(PySSLSocket *self, int binary_mode)
1922/*[clinic end generated code: output=1f0ab66dfb693c88 input=c0fbe802e57629b7]*/
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001923{
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001924 int verification;
Christian Heimes66dc33b2017-05-23 16:02:02 -07001925 X509 *peer_cert;
1926 PyObject *result;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001927
Christian Heimes66dc33b2017-05-23 16:02:02 -07001928 if (!SSL_is_init_finished(self->ssl)) {
Antoine Pitrou20b85552013-09-29 19:50:53 +02001929 PyErr_SetString(PyExc_ValueError,
1930 "handshake not done yet");
1931 return NULL;
1932 }
Christian Heimes66dc33b2017-05-23 16:02:02 -07001933 peer_cert = SSL_get_peer_certificate(self->ssl);
1934 if (peer_cert == NULL)
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001935 Py_RETURN_NONE;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001936
Antoine Pitrou721738f2012-08-15 23:20:39 +02001937 if (binary_mode) {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001938 /* return cert in DER-encoded format */
Christian Heimes66dc33b2017-05-23 16:02:02 -07001939 result = _certificate_to_der(peer_cert);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001940 } else {
Antoine Pitrou152efa22010-05-16 18:19:27 +00001941 verification = SSL_CTX_get_verify_mode(SSL_get_SSL_CTX(self->ssl));
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001942 if ((verification & SSL_VERIFY_PEER) == 0)
Christian Heimes66dc33b2017-05-23 16:02:02 -07001943 result = PyDict_New();
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001944 else
Christian Heimes66dc33b2017-05-23 16:02:02 -07001945 result = _decode_certificate(peer_cert);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001946 }
Christian Heimes66dc33b2017-05-23 16:02:02 -07001947 X509_free(peer_cert);
1948 return result;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001949}
1950
Benjamin Peterson4cb17812015-01-07 11:14:26 -06001951static PyObject *
1952cipher_to_tuple(const SSL_CIPHER *cipher)
1953{
1954 const char *cipher_name, *cipher_protocol;
1955 PyObject *v, *retval = PyTuple_New(3);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001956 if (retval == NULL)
1957 return NULL;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001958
Benjamin Peterson4cb17812015-01-07 11:14:26 -06001959 cipher_name = SSL_CIPHER_get_name(cipher);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001960 if (cipher_name == NULL) {
Hirokazu Yamamoto524f1032010-12-09 10:49:00 +00001961 Py_INCREF(Py_None);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001962 PyTuple_SET_ITEM(retval, 0, Py_None);
1963 } else {
1964 v = PyUnicode_FromString(cipher_name);
1965 if (v == NULL)
Benjamin Peterson4cb17812015-01-07 11:14:26 -06001966 goto fail;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001967 PyTuple_SET_ITEM(retval, 0, v);
1968 }
Benjamin Peterson4cb17812015-01-07 11:14:26 -06001969
1970 cipher_protocol = SSL_CIPHER_get_version(cipher);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001971 if (cipher_protocol == NULL) {
Hirokazu Yamamoto524f1032010-12-09 10:49:00 +00001972 Py_INCREF(Py_None);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001973 PyTuple_SET_ITEM(retval, 1, Py_None);
1974 } else {
1975 v = PyUnicode_FromString(cipher_protocol);
1976 if (v == NULL)
Benjamin Peterson4cb17812015-01-07 11:14:26 -06001977 goto fail;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001978 PyTuple_SET_ITEM(retval, 1, v);
1979 }
Benjamin Peterson4cb17812015-01-07 11:14:26 -06001980
1981 v = PyLong_FromLong(SSL_CIPHER_get_bits(cipher, NULL));
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001982 if (v == NULL)
Benjamin Peterson4cb17812015-01-07 11:14:26 -06001983 goto fail;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001984 PyTuple_SET_ITEM(retval, 2, v);
Benjamin Peterson4cb17812015-01-07 11:14:26 -06001985
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001986 return retval;
Guido van Rossumf06628b2007-11-21 20:01:53 +00001987
Benjamin Peterson4cb17812015-01-07 11:14:26 -06001988 fail:
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001989 Py_DECREF(retval);
1990 return NULL;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001991}
1992
Christian Heimes25bfcd52016-09-06 00:04:45 +02001993#if OPENSSL_VERSION_NUMBER >= 0x10002000UL
1994static PyObject *
1995cipher_to_dict(const SSL_CIPHER *cipher)
1996{
1997 const char *cipher_name, *cipher_protocol;
1998
1999 unsigned long cipher_id;
2000 int alg_bits, strength_bits, len;
2001 char buf[512] = {0};
2002#if OPENSSL_VERSION_1_1
2003 int aead, nid;
2004 const char *skcipher = NULL, *digest = NULL, *kx = NULL, *auth = NULL;
2005#endif
Christian Heimes25bfcd52016-09-06 00:04:45 +02002006
2007 /* can be NULL */
2008 cipher_name = SSL_CIPHER_get_name(cipher);
2009 cipher_protocol = SSL_CIPHER_get_version(cipher);
2010 cipher_id = SSL_CIPHER_get_id(cipher);
2011 SSL_CIPHER_description(cipher, buf, sizeof(buf) - 1);
Segev Finer5cff6372017-07-27 01:19:17 +03002012 /* Downcast to avoid a warning. Safe since buf is always 512 bytes */
2013 len = (int)strlen(buf);
Christian Heimes25bfcd52016-09-06 00:04:45 +02002014 if (len > 1 && buf[len-1] == '\n')
2015 buf[len-1] = '\0';
2016 strength_bits = SSL_CIPHER_get_bits(cipher, &alg_bits);
2017
2018#if OPENSSL_VERSION_1_1
2019 aead = SSL_CIPHER_is_aead(cipher);
2020 nid = SSL_CIPHER_get_cipher_nid(cipher);
2021 skcipher = nid != NID_undef ? OBJ_nid2ln(nid) : NULL;
2022 nid = SSL_CIPHER_get_digest_nid(cipher);
2023 digest = nid != NID_undef ? OBJ_nid2ln(nid) : NULL;
2024 nid = SSL_CIPHER_get_kx_nid(cipher);
2025 kx = nid != NID_undef ? OBJ_nid2ln(nid) : NULL;
2026 nid = SSL_CIPHER_get_auth_nid(cipher);
2027 auth = nid != NID_undef ? OBJ_nid2ln(nid) : NULL;
2028#endif
2029
Victor Stinner410b9882016-09-12 12:00:23 +02002030 return Py_BuildValue(
Christian Heimes25bfcd52016-09-06 00:04:45 +02002031 "{sksssssssisi"
2032#if OPENSSL_VERSION_1_1
2033 "sOssssssss"
2034#endif
2035 "}",
2036 "id", cipher_id,
2037 "name", cipher_name,
2038 "protocol", cipher_protocol,
2039 "description", buf,
2040 "strength_bits", strength_bits,
2041 "alg_bits", alg_bits
2042#if OPENSSL_VERSION_1_1
2043 ,"aead", aead ? Py_True : Py_False,
2044 "symmetric", skcipher,
2045 "digest", digest,
2046 "kea", kx,
2047 "auth", auth
2048#endif
2049 );
Christian Heimes25bfcd52016-09-06 00:04:45 +02002050}
2051#endif
2052
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002053/*[clinic input]
2054_ssl._SSLSocket.shared_ciphers
2055[clinic start generated code]*/
2056
2057static PyObject *
2058_ssl__SSLSocket_shared_ciphers_impl(PySSLSocket *self)
2059/*[clinic end generated code: output=3d174ead2e42c4fd input=0bfe149da8fe6306]*/
Benjamin Peterson4cb17812015-01-07 11:14:26 -06002060{
2061 STACK_OF(SSL_CIPHER) *ciphers;
2062 int i;
2063 PyObject *res;
2064
Christian Heimes598894f2016-09-05 23:19:05 +02002065 ciphers = SSL_get_ciphers(self->ssl);
2066 if (!ciphers)
Benjamin Peterson4cb17812015-01-07 11:14:26 -06002067 Py_RETURN_NONE;
Benjamin Peterson4cb17812015-01-07 11:14:26 -06002068 res = PyList_New(sk_SSL_CIPHER_num(ciphers));
2069 if (!res)
2070 return NULL;
2071 for (i = 0; i < sk_SSL_CIPHER_num(ciphers); i++) {
2072 PyObject *tup = cipher_to_tuple(sk_SSL_CIPHER_value(ciphers, i));
2073 if (!tup) {
2074 Py_DECREF(res);
2075 return NULL;
2076 }
2077 PyList_SET_ITEM(res, i, tup);
2078 }
2079 return res;
2080}
2081
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002082/*[clinic input]
2083_ssl._SSLSocket.cipher
2084[clinic start generated code]*/
2085
2086static PyObject *
2087_ssl__SSLSocket_cipher_impl(PySSLSocket *self)
2088/*[clinic end generated code: output=376417c16d0e5815 input=548fb0e27243796d]*/
Benjamin Peterson4cb17812015-01-07 11:14:26 -06002089{
2090 const SSL_CIPHER *current;
2091
2092 if (self->ssl == NULL)
2093 Py_RETURN_NONE;
2094 current = SSL_get_current_cipher(self->ssl);
2095 if (current == NULL)
2096 Py_RETURN_NONE;
2097 return cipher_to_tuple(current);
2098}
2099
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002100/*[clinic input]
2101_ssl._SSLSocket.version
2102[clinic start generated code]*/
2103
2104static PyObject *
2105_ssl__SSLSocket_version_impl(PySSLSocket *self)
2106/*[clinic end generated code: output=178aed33193b2cdb input=900186a503436fd6]*/
Antoine Pitrou47e40422014-09-04 21:00:10 +02002107{
2108 const char *version;
2109
2110 if (self->ssl == NULL)
2111 Py_RETURN_NONE;
Christian Heimes68771112017-09-05 21:55:40 -07002112 if (!SSL_is_init_finished(self->ssl)) {
2113 /* handshake not finished */
2114 Py_RETURN_NONE;
2115 }
Antoine Pitrou47e40422014-09-04 21:00:10 +02002116 version = SSL_get_version(self->ssl);
2117 if (!strcmp(version, "unknown"))
2118 Py_RETURN_NONE;
2119 return PyUnicode_FromString(version);
2120}
2121
Christian Heimes29eab552018-02-25 12:31:33 +01002122#if HAVE_NPN
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002123/*[clinic input]
2124_ssl._SSLSocket.selected_npn_protocol
2125[clinic start generated code]*/
2126
2127static PyObject *
2128_ssl__SSLSocket_selected_npn_protocol_impl(PySSLSocket *self)
2129/*[clinic end generated code: output=b91d494cd207ecf6 input=c28fde139204b826]*/
2130{
Antoine Pitroud5d17eb2012-03-22 00:23:03 +01002131 const unsigned char *out;
2132 unsigned int outlen;
2133
Victor Stinner4569cd52013-06-23 14:58:43 +02002134 SSL_get0_next_proto_negotiated(self->ssl,
Antoine Pitroud5d17eb2012-03-22 00:23:03 +01002135 &out, &outlen);
2136
2137 if (out == NULL)
2138 Py_RETURN_NONE;
Benjamin Petersoncca27322015-01-23 16:35:37 -05002139 return PyUnicode_FromStringAndSize((char *)out, outlen);
2140}
2141#endif
2142
Christian Heimes29eab552018-02-25 12:31:33 +01002143#if HAVE_ALPN
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002144/*[clinic input]
2145_ssl._SSLSocket.selected_alpn_protocol
2146[clinic start generated code]*/
2147
2148static PyObject *
2149_ssl__SSLSocket_selected_alpn_protocol_impl(PySSLSocket *self)
2150/*[clinic end generated code: output=ec33688b303d250f input=442de30e35bc2913]*/
2151{
Benjamin Petersoncca27322015-01-23 16:35:37 -05002152 const unsigned char *out;
2153 unsigned int outlen;
2154
2155 SSL_get0_alpn_selected(self->ssl, &out, &outlen);
2156
2157 if (out == NULL)
2158 Py_RETURN_NONE;
2159 return PyUnicode_FromStringAndSize((char *)out, outlen);
Antoine Pitroud5d17eb2012-03-22 00:23:03 +01002160}
2161#endif
2162
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002163/*[clinic input]
2164_ssl._SSLSocket.compression
2165[clinic start generated code]*/
2166
2167static PyObject *
2168_ssl__SSLSocket_compression_impl(PySSLSocket *self)
2169/*[clinic end generated code: output=bd16cb1bb4646ae7 input=5d059d0a2bbc32c8]*/
2170{
Antoine Pitrou8abdb8a2011-12-20 10:13:40 +01002171#ifdef OPENSSL_NO_COMP
2172 Py_RETURN_NONE;
2173#else
2174 const COMP_METHOD *comp_method;
2175 const char *short_name;
2176
2177 if (self->ssl == NULL)
2178 Py_RETURN_NONE;
2179 comp_method = SSL_get_current_compression(self->ssl);
Christian Heimes598894f2016-09-05 23:19:05 +02002180 if (comp_method == NULL || COMP_get_type(comp_method) == NID_undef)
Antoine Pitrou8abdb8a2011-12-20 10:13:40 +01002181 Py_RETURN_NONE;
Christian Heimes281e5f82016-09-06 01:10:39 +02002182 short_name = OBJ_nid2sn(COMP_get_type(comp_method));
Antoine Pitrou8abdb8a2011-12-20 10:13:40 +01002183 if (short_name == NULL)
2184 Py_RETURN_NONE;
2185 return PyUnicode_DecodeFSDefault(short_name);
2186#endif
2187}
2188
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01002189static PySSLContext *PySSL_get_context(PySSLSocket *self, void *closure) {
2190 Py_INCREF(self->ctx);
2191 return self->ctx;
2192}
2193
2194static int PySSL_set_context(PySSLSocket *self, PyObject *value,
2195 void *closure) {
2196
2197 if (PyObject_TypeCheck(value, &PySSLContext_Type)) {
Antoine Pitrou912fbff2013-03-30 16:29:32 +01002198#if !HAVE_SNI
2199 PyErr_SetString(PyExc_NotImplementedError, "setting a socket's "
2200 "context is not supported by your OpenSSL library");
Antoine Pitrou41f8c4f2013-03-30 16:36:54 +01002201 return -1;
Antoine Pitrou912fbff2013-03-30 16:29:32 +01002202#else
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01002203 Py_INCREF(value);
Serhiy Storchaka57a01d32016-04-10 18:05:40 +03002204 Py_SETREF(self->ctx, (PySSLContext *)value);
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01002205 SSL_set_SSL_CTX(self->ssl, self->ctx->ctx);
Antoine Pitrou912fbff2013-03-30 16:29:32 +01002206#endif
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01002207 } else {
Ned Deily4531ec72018-06-11 20:26:28 -04002208 PyErr_SetString(PyExc_TypeError, "The value must be a SSLContext");
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01002209 return -1;
2210 }
2211
2212 return 0;
2213}
2214
2215PyDoc_STRVAR(PySSL_set_context_doc,
2216"_setter_context(ctx)\n\
2217\
2218This changes the context associated with the SSLSocket. This is typically\n\
Christian Heimes11a14932018-02-24 02:35:08 +01002219used from within a callback function set by the sni_callback\n\
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01002220on the SSLContext to change the certificate information associated with the\n\
2221SSLSocket before the cryptographic exchange handshake messages\n");
2222
2223
Antoine Pitroub1fdf472014-10-05 20:41:53 +02002224static PyObject *
2225PySSL_get_server_side(PySSLSocket *self, void *c)
2226{
2227 return PyBool_FromLong(self->socket_type == PY_SSL_SERVER);
2228}
2229
2230PyDoc_STRVAR(PySSL_get_server_side_doc,
2231"Whether this is a server-side socket.");
2232
2233static PyObject *
2234PySSL_get_server_hostname(PySSLSocket *self, void *c)
2235{
2236 if (self->server_hostname == NULL)
2237 Py_RETURN_NONE;
2238 Py_INCREF(self->server_hostname);
2239 return self->server_hostname;
2240}
2241
2242PyDoc_STRVAR(PySSL_get_server_hostname_doc,
2243"The currently set server hostname (for SNI).");
2244
2245static PyObject *
2246PySSL_get_owner(PySSLSocket *self, void *c)
2247{
2248 PyObject *owner;
2249
2250 if (self->owner == NULL)
2251 Py_RETURN_NONE;
2252
2253 owner = PyWeakref_GetObject(self->owner);
2254 Py_INCREF(owner);
2255 return owner;
2256}
2257
2258static int
2259PySSL_set_owner(PySSLSocket *self, PyObject *value, void *c)
2260{
Serhiy Storchaka48842712016-04-06 09:45:48 +03002261 Py_XSETREF(self->owner, PyWeakref_NewRef(value, NULL));
Antoine Pitroub1fdf472014-10-05 20:41:53 +02002262 if (self->owner == NULL)
2263 return -1;
2264 return 0;
2265}
2266
2267PyDoc_STRVAR(PySSL_get_owner_doc,
2268"The Python-level owner of this object.\
2269Passed as \"self\" in servername callback.");
2270
Christian Heimesc7f70692019-05-31 11:44:05 +02002271static int
2272PySSL_traverse(PySSLSocket *self, visitproc visit, void *arg)
2273{
2274 Py_VISIT(self->exc_type);
2275 Py_VISIT(self->exc_value);
2276 Py_VISIT(self->exc_tb);
2277 return 0;
2278}
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01002279
Christian Heimesc7f70692019-05-31 11:44:05 +02002280static int
2281PySSL_clear(PySSLSocket *self)
2282{
2283 Py_CLEAR(self->exc_type);
2284 Py_CLEAR(self->exc_value);
2285 Py_CLEAR(self->exc_tb);
2286 return 0;
2287}
2288
2289static void
2290PySSL_dealloc(PySSLSocket *self)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002291{
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002292 if (self->ssl)
2293 SSL_free(self->ssl);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002294 Py_XDECREF(self->Socket);
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01002295 Py_XDECREF(self->ctx);
Antoine Pitroub1fdf472014-10-05 20:41:53 +02002296 Py_XDECREF(self->server_hostname);
2297 Py_XDECREF(self->owner);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002298 PyObject_Del(self);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002299}
2300
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002301/* If the socket has a timeout, do a select()/poll() on the socket.
Guido van Rossum99d4abf2003-01-27 22:22:50 +00002302 The argument writing indicates the direction.
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00002303 Returns one of the possibilities in the timeout_state enum (above).
Guido van Rossum99d4abf2003-01-27 22:22:50 +00002304 */
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00002305
Guido van Rossum99d4abf2003-01-27 22:22:50 +00002306static int
Victor Stinner14690702015-04-06 22:46:13 +02002307PySSL_select(PySocketSockObject *s, int writing, _PyTime_t timeout)
Guido van Rossum99d4abf2003-01-27 22:22:50 +00002308{
Victor Stinner4e3cfa42015-04-02 21:28:28 +02002309 int rc;
2310#ifdef HAVE_POLL
2311 struct pollfd pollfd;
2312 _PyTime_t ms;
2313#else
2314 int nfds;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002315 fd_set fds;
2316 struct timeval tv;
Victor Stinner4e3cfa42015-04-02 21:28:28 +02002317#endif
Guido van Rossum99d4abf2003-01-27 22:22:50 +00002318
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002319 /* Nothing to do unless we're in timeout mode (not non-blocking) */
Victor Stinner14690702015-04-06 22:46:13 +02002320 if ((s == NULL) || (timeout == 0))
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002321 return SOCKET_IS_NONBLOCKING;
Victor Stinner14690702015-04-06 22:46:13 +02002322 else if (timeout < 0) {
2323 if (s->sock_timeout > 0)
2324 return SOCKET_HAS_TIMED_OUT;
2325 else
2326 return SOCKET_IS_BLOCKING;
2327 }
Guido van Rossum99d4abf2003-01-27 22:22:50 +00002328
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002329 /* Guard against closed socket */
Victor Stinner524714e2016-07-22 17:43:59 +02002330 if (s->sock_fd == INVALID_SOCKET)
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002331 return SOCKET_HAS_BEEN_CLOSED;
Guido van Rossum99d4abf2003-01-27 22:22:50 +00002332
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002333 /* Prefer poll, if available, since you can poll() any fd
2334 * which can't be done with select(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002335#ifdef HAVE_POLL
Victor Stinner4e3cfa42015-04-02 21:28:28 +02002336 pollfd.fd = s->sock_fd;
2337 pollfd.events = writing ? POLLOUT : POLLIN;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002338
Victor Stinner14690702015-04-06 22:46:13 +02002339 /* timeout is in seconds, poll() uses milliseconds */
2340 ms = (int)_PyTime_AsMilliseconds(timeout, _PyTime_ROUND_CEILING);
Victor Stinner4e3cfa42015-04-02 21:28:28 +02002341 assert(ms <= INT_MAX);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002342
Victor Stinner4e3cfa42015-04-02 21:28:28 +02002343 PySSL_BEGIN_ALLOW_THREADS
2344 rc = poll(&pollfd, 1, (int)ms);
2345 PySSL_END_ALLOW_THREADS
2346#else
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002347 /* Guard against socket too large for select*/
Charles-François Nataliaa26b272011-08-28 17:51:43 +02002348 if (!_PyIsSelectable_fd(s->sock_fd))
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002349 return SOCKET_TOO_LARGE_FOR_SELECT;
Neal Norwitz082b2df2006-02-07 07:04:46 +00002350
Victor Stinner14690702015-04-06 22:46:13 +02002351 _PyTime_AsTimeval_noraise(timeout, &tv, _PyTime_ROUND_CEILING);
Victor Stinnere2452312015-03-28 03:00:46 +01002352
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002353 FD_ZERO(&fds);
2354 FD_SET(s->sock_fd, &fds);
Guido van Rossum99d4abf2003-01-27 22:22:50 +00002355
Victor Stinner4e3cfa42015-04-02 21:28:28 +02002356 /* Wait until the socket becomes ready */
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002357 PySSL_BEGIN_ALLOW_THREADS
Victor Stinner4e3cfa42015-04-02 21:28:28 +02002358 nfds = Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002359 if (writing)
Victor Stinner4e3cfa42015-04-02 21:28:28 +02002360 rc = select(nfds, NULL, &fds, NULL, &tv);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002361 else
Victor Stinner4e3cfa42015-04-02 21:28:28 +02002362 rc = select(nfds, &fds, NULL, NULL, &tv);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002363 PySSL_END_ALLOW_THREADS
Bill Janssen6e027db2007-11-15 22:23:56 +00002364#endif
Victor Stinner4e3cfa42015-04-02 21:28:28 +02002365
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002366 /* Return SOCKET_TIMED_OUT on timeout, SOCKET_OPERATION_OK otherwise
2367 (when we are able to write or when there's something to read) */
2368 return rc == 0 ? SOCKET_HAS_TIMED_OUT : SOCKET_OPERATION_OK;
Guido van Rossum99d4abf2003-01-27 22:22:50 +00002369}
2370
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002371/*[clinic input]
2372_ssl._SSLSocket.write
2373 b: Py_buffer
2374 /
2375
2376Writes the bytes-like object b into the SSL object.
2377
2378Returns the number of bytes written.
2379[clinic start generated code]*/
2380
2381static PyObject *
2382_ssl__SSLSocket_write_impl(PySSLSocket *self, Py_buffer *b)
2383/*[clinic end generated code: output=aa7a6be5527358d8 input=77262d994fe5100a]*/
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002384{
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002385 int len;
2386 int sockstate;
Steve Dowerc6fd1c12018-09-17 11:34:47 -07002387 _PySSLError err;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002388 int nonblocking;
Antoine Pitroub1fdf472014-10-05 20:41:53 +02002389 PySocketSockObject *sock = GET_SOCKET(self);
Victor Stinner14690702015-04-06 22:46:13 +02002390 _PyTime_t timeout, deadline = 0;
2391 int has_timeout;
Bill Janssen54cc54c2007-12-14 22:08:56 +00002392
Antoine Pitroub1fdf472014-10-05 20:41:53 +02002393 if (sock != NULL) {
2394 if (((PyObject*)sock) == Py_None) {
2395 _setSSLError("Underlying socket connection gone",
2396 PY_SSL_ERROR_NO_SOCKET, __FILE__, __LINE__);
2397 return NULL;
2398 }
2399 Py_INCREF(sock);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002400 }
2401
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002402 if (b->len > INT_MAX) {
Victor Stinner6efa9652013-06-25 00:42:31 +02002403 PyErr_Format(PyExc_OverflowError,
2404 "string longer than %d bytes", INT_MAX);
2405 goto error;
2406 }
2407
Antoine Pitroub1fdf472014-10-05 20:41:53 +02002408 if (sock != NULL) {
2409 /* just in case the blocking state of the socket has been changed */
Victor Stinnere2452312015-03-28 03:00:46 +01002410 nonblocking = (sock->sock_timeout >= 0);
Antoine Pitroub1fdf472014-10-05 20:41:53 +02002411 BIO_set_nbio(SSL_get_rbio(self->ssl), nonblocking);
2412 BIO_set_nbio(SSL_get_wbio(self->ssl), nonblocking);
2413 }
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002414
Victor Stinner14690702015-04-06 22:46:13 +02002415 timeout = GET_SOCKET_TIMEOUT(sock);
2416 has_timeout = (timeout > 0);
2417 if (has_timeout)
2418 deadline = _PyTime_GetMonotonicClock() + timeout;
2419
2420 sockstate = PySSL_select(sock, 1, timeout);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002421 if (sockstate == SOCKET_HAS_TIMED_OUT) {
Antoine Pitrouc4df7842010-12-03 19:59:41 +00002422 PyErr_SetString(PySocketModule.timeout_error,
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002423 "The write operation timed out");
2424 goto error;
2425 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
2426 PyErr_SetString(PySSLErrorObject,
2427 "Underlying socket has been closed.");
2428 goto error;
2429 } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
2430 PyErr_SetString(PySSLErrorObject,
2431 "Underlying socket too large for select().");
2432 goto error;
2433 }
Victor Stinner4e3cfa42015-04-02 21:28:28 +02002434
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002435 do {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002436 PySSL_BEGIN_ALLOW_THREADS
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002437 len = SSL_write(self->ssl, b->buf, (int)b->len);
Steve Dowerc6fd1c12018-09-17 11:34:47 -07002438 err = _PySSL_errno(len <= 0, self->ssl, len);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002439 PySSL_END_ALLOW_THREADS
Steve Dowerc6fd1c12018-09-17 11:34:47 -07002440 self->err = err;
Victor Stinner4e3cfa42015-04-02 21:28:28 +02002441
2442 if (PyErr_CheckSignals())
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002443 goto error;
Victor Stinner4e3cfa42015-04-02 21:28:28 +02002444
Victor Stinner14690702015-04-06 22:46:13 +02002445 if (has_timeout)
2446 timeout = deadline - _PyTime_GetMonotonicClock();
2447
Steve Dowerc6fd1c12018-09-17 11:34:47 -07002448 if (err.ssl == SSL_ERROR_WANT_READ) {
Victor Stinner14690702015-04-06 22:46:13 +02002449 sockstate = PySSL_select(sock, 0, timeout);
Steve Dowerc6fd1c12018-09-17 11:34:47 -07002450 } else if (err.ssl == SSL_ERROR_WANT_WRITE) {
Victor Stinner14690702015-04-06 22:46:13 +02002451 sockstate = PySSL_select(sock, 1, timeout);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002452 } else {
2453 sockstate = SOCKET_OPERATION_OK;
2454 }
Victor Stinner4e3cfa42015-04-02 21:28:28 +02002455
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002456 if (sockstate == SOCKET_HAS_TIMED_OUT) {
Antoine Pitrouc4df7842010-12-03 19:59:41 +00002457 PyErr_SetString(PySocketModule.timeout_error,
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002458 "The write operation timed out");
2459 goto error;
2460 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
2461 PyErr_SetString(PySSLErrorObject,
2462 "Underlying socket has been closed.");
2463 goto error;
2464 } else if (sockstate == SOCKET_IS_NONBLOCKING) {
2465 break;
2466 }
Steve Dowerc6fd1c12018-09-17 11:34:47 -07002467 } while (err.ssl == SSL_ERROR_WANT_READ ||
2468 err.ssl == SSL_ERROR_WANT_WRITE);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002469
Antoine Pitroub1fdf472014-10-05 20:41:53 +02002470 Py_XDECREF(sock);
Christian Heimesc7f70692019-05-31 11:44:05 +02002471 if (len <= 0)
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002472 return PySSL_SetError(self, len, __FILE__, __LINE__);
Christian Heimesc7f70692019-05-31 11:44:05 +02002473 if (PySSL_ChainExceptions(self) < 0)
2474 return NULL;
2475 return PyLong_FromLong(len);
Antoine Pitrou7d7aede2009-11-25 18:55:32 +00002476error:
Antoine Pitroub1fdf472014-10-05 20:41:53 +02002477 Py_XDECREF(sock);
Christian Heimesc7f70692019-05-31 11:44:05 +02002478 PySSL_ChainExceptions(self);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002479 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002480}
2481
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002482/*[clinic input]
2483_ssl._SSLSocket.pending
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002484
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002485Returns the number of already decrypted bytes available for read, pending on the connection.
2486[clinic start generated code]*/
2487
2488static PyObject *
2489_ssl__SSLSocket_pending_impl(PySSLSocket *self)
2490/*[clinic end generated code: output=983d9fecdc308a83 input=2b77487d6dfd597f]*/
Bill Janssen6e027db2007-11-15 22:23:56 +00002491{
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002492 int count = 0;
Steve Dowerc6fd1c12018-09-17 11:34:47 -07002493 _PySSLError err;
Bill Janssen6e027db2007-11-15 22:23:56 +00002494
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002495 PySSL_BEGIN_ALLOW_THREADS
2496 count = SSL_pending(self->ssl);
Steve Dowerc6fd1c12018-09-17 11:34:47 -07002497 err = _PySSL_errno(count < 0, self->ssl, count);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002498 PySSL_END_ALLOW_THREADS
Steve Dowerc6fd1c12018-09-17 11:34:47 -07002499 self->err = err;
2500
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002501 if (count < 0)
2502 return PySSL_SetError(self, count, __FILE__, __LINE__);
2503 else
2504 return PyLong_FromLong(count);
Bill Janssen6e027db2007-11-15 22:23:56 +00002505}
2506
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002507/*[clinic input]
2508_ssl._SSLSocket.read
2509 size as len: int
2510 [
Larry Hastingsdbfdc382015-05-04 06:59:46 -07002511 buffer: Py_buffer(accept={rwbuffer})
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002512 ]
2513 /
Bill Janssen6e027db2007-11-15 22:23:56 +00002514
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002515Read up to size bytes from the SSL socket.
2516[clinic start generated code]*/
2517
2518static PyObject *
2519_ssl__SSLSocket_read_impl(PySSLSocket *self, int len, int group_right_1,
2520 Py_buffer *buffer)
Larry Hastingsdbfdc382015-05-04 06:59:46 -07002521/*[clinic end generated code: output=00097776cec2a0af input=ff157eb918d0905b]*/
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002522{
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002523 PyObject *dest = NULL;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002524 char *mem;
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002525 int count;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002526 int sockstate;
Steve Dowerc6fd1c12018-09-17 11:34:47 -07002527 _PySSLError err;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002528 int nonblocking;
Antoine Pitroub1fdf472014-10-05 20:41:53 +02002529 PySocketSockObject *sock = GET_SOCKET(self);
Victor Stinner14690702015-04-06 22:46:13 +02002530 _PyTime_t timeout, deadline = 0;
2531 int has_timeout;
Bill Janssen54cc54c2007-12-14 22:08:56 +00002532
Martin Panter5503d472016-03-27 05:35:19 +00002533 if (!group_right_1 && len < 0) {
2534 PyErr_SetString(PyExc_ValueError, "size should not be negative");
2535 return NULL;
2536 }
2537
Antoine Pitroub1fdf472014-10-05 20:41:53 +02002538 if (sock != NULL) {
2539 if (((PyObject*)sock) == Py_None) {
2540 _setSSLError("Underlying socket connection gone",
2541 PY_SSL_ERROR_NO_SOCKET, __FILE__, __LINE__);
2542 return NULL;
2543 }
2544 Py_INCREF(sock);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002545 }
2546
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002547 if (!group_right_1) {
Antoine Pitrou24e561a2010-09-03 18:38:17 +00002548 dest = PyBytes_FromStringAndSize(NULL, len);
2549 if (dest == NULL)
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +00002550 goto error;
Martin Panterbed7f1a2016-07-11 00:17:13 +00002551 if (len == 0) {
2552 Py_XDECREF(sock);
2553 return dest;
2554 }
Antoine Pitrou24e561a2010-09-03 18:38:17 +00002555 mem = PyBytes_AS_STRING(dest);
2556 }
2557 else {
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002558 mem = buffer->buf;
2559 if (len <= 0 || len > buffer->len) {
2560 len = (int) buffer->len;
2561 if (buffer->len != len) {
Antoine Pitrou24e561a2010-09-03 18:38:17 +00002562 PyErr_SetString(PyExc_OverflowError,
2563 "maximum length can't fit in a C 'int'");
2564 goto error;
2565 }
Martin Panterbed7f1a2016-07-11 00:17:13 +00002566 if (len == 0) {
2567 count = 0;
2568 goto done;
2569 }
Antoine Pitrou24e561a2010-09-03 18:38:17 +00002570 }
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002571 }
2572
Antoine Pitroub1fdf472014-10-05 20:41:53 +02002573 if (sock != NULL) {
2574 /* just in case the blocking state of the socket has been changed */
Victor Stinnere2452312015-03-28 03:00:46 +01002575 nonblocking = (sock->sock_timeout >= 0);
Antoine Pitroub1fdf472014-10-05 20:41:53 +02002576 BIO_set_nbio(SSL_get_rbio(self->ssl), nonblocking);
2577 BIO_set_nbio(SSL_get_wbio(self->ssl), nonblocking);
2578 }
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002579
Victor Stinner14690702015-04-06 22:46:13 +02002580 timeout = GET_SOCKET_TIMEOUT(sock);
2581 has_timeout = (timeout > 0);
2582 if (has_timeout)
2583 deadline = _PyTime_GetMonotonicClock() + timeout;
2584
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002585 do {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002586 PySSL_BEGIN_ALLOW_THREADS
2587 count = SSL_read(self->ssl, mem, len);
Steve Dowerc6fd1c12018-09-17 11:34:47 -07002588 err = _PySSL_errno(count <= 0, self->ssl, count);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002589 PySSL_END_ALLOW_THREADS
Steve Dowerc6fd1c12018-09-17 11:34:47 -07002590 self->err = err;
Victor Stinner4e3cfa42015-04-02 21:28:28 +02002591
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002592 if (PyErr_CheckSignals())
2593 goto error;
Victor Stinner4e3cfa42015-04-02 21:28:28 +02002594
Victor Stinner14690702015-04-06 22:46:13 +02002595 if (has_timeout)
2596 timeout = deadline - _PyTime_GetMonotonicClock();
2597
Steve Dowerc6fd1c12018-09-17 11:34:47 -07002598 if (err.ssl == SSL_ERROR_WANT_READ) {
Victor Stinner14690702015-04-06 22:46:13 +02002599 sockstate = PySSL_select(sock, 0, timeout);
Steve Dowerc6fd1c12018-09-17 11:34:47 -07002600 } else if (err.ssl == SSL_ERROR_WANT_WRITE) {
Victor Stinner14690702015-04-06 22:46:13 +02002601 sockstate = PySSL_select(sock, 1, timeout);
Steve Dowerc6fd1c12018-09-17 11:34:47 -07002602 } else if (err.ssl == SSL_ERROR_ZERO_RETURN &&
Victor Stinner4e3cfa42015-04-02 21:28:28 +02002603 SSL_get_shutdown(self->ssl) == SSL_RECEIVED_SHUTDOWN)
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002604 {
2605 count = 0;
2606 goto done;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002607 }
Victor Stinner4e3cfa42015-04-02 21:28:28 +02002608 else
2609 sockstate = SOCKET_OPERATION_OK;
2610
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002611 if (sockstate == SOCKET_HAS_TIMED_OUT) {
Antoine Pitrouc4df7842010-12-03 19:59:41 +00002612 PyErr_SetString(PySocketModule.timeout_error,
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002613 "The read operation timed out");
2614 goto error;
2615 } else if (sockstate == SOCKET_IS_NONBLOCKING) {
2616 break;
2617 }
Steve Dowerc6fd1c12018-09-17 11:34:47 -07002618 } while (err.ssl == SSL_ERROR_WANT_READ ||
2619 err.ssl == SSL_ERROR_WANT_WRITE);
Victor Stinner4e3cfa42015-04-02 21:28:28 +02002620
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002621 if (count <= 0) {
2622 PySSL_SetError(self, count, __FILE__, __LINE__);
2623 goto error;
2624 }
Christian Heimesc7f70692019-05-31 11:44:05 +02002625 if (self->exc_type != NULL)
2626 goto error;
Antoine Pitrou24e561a2010-09-03 18:38:17 +00002627
2628done:
Antoine Pitroub1fdf472014-10-05 20:41:53 +02002629 Py_XDECREF(sock);
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002630 if (!group_right_1) {
Antoine Pitrou24e561a2010-09-03 18:38:17 +00002631 _PyBytes_Resize(&dest, count);
2632 return dest;
2633 }
2634 else {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002635 return PyLong_FromLong(count);
2636 }
Antoine Pitrou24e561a2010-09-03 18:38:17 +00002637
2638error:
Christian Heimesc7f70692019-05-31 11:44:05 +02002639 PySSL_ChainExceptions(self);
Antoine Pitroub1fdf472014-10-05 20:41:53 +02002640 Py_XDECREF(sock);
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002641 if (!group_right_1)
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +00002642 Py_XDECREF(dest);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002643 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002644}
2645
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002646/*[clinic input]
2647_ssl._SSLSocket.shutdown
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002648
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002649Does the SSL shutdown handshake with the remote end.
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002650[clinic start generated code]*/
2651
2652static PyObject *
2653_ssl__SSLSocket_shutdown_impl(PySSLSocket *self)
Christian Heimes141c5e82018-02-24 21:10:57 +01002654/*[clinic end generated code: output=ca1aa7ed9d25ca42 input=11d39e69b0a2bf4a]*/
Bill Janssen40a0f662008-08-12 16:56:25 +00002655{
Steve Dowerc6fd1c12018-09-17 11:34:47 -07002656 _PySSLError err;
2657 int sockstate, nonblocking, ret;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002658 int zeros = 0;
Antoine Pitroub1fdf472014-10-05 20:41:53 +02002659 PySocketSockObject *sock = GET_SOCKET(self);
Victor Stinner14690702015-04-06 22:46:13 +02002660 _PyTime_t timeout, deadline = 0;
2661 int has_timeout;
Bill Janssen40a0f662008-08-12 16:56:25 +00002662
Antoine Pitroub1fdf472014-10-05 20:41:53 +02002663 if (sock != NULL) {
2664 /* Guard against closed socket */
Victor Stinner524714e2016-07-22 17:43:59 +02002665 if ((((PyObject*)sock) == Py_None) || (sock->sock_fd == INVALID_SOCKET)) {
Antoine Pitroub1fdf472014-10-05 20:41:53 +02002666 _setSSLError("Underlying socket connection gone",
2667 PY_SSL_ERROR_NO_SOCKET, __FILE__, __LINE__);
2668 return NULL;
2669 }
2670 Py_INCREF(sock);
2671
2672 /* Just in case the blocking state of the socket has been changed */
Victor Stinnere2452312015-03-28 03:00:46 +01002673 nonblocking = (sock->sock_timeout >= 0);
Antoine Pitroub1fdf472014-10-05 20:41:53 +02002674 BIO_set_nbio(SSL_get_rbio(self->ssl), nonblocking);
2675 BIO_set_nbio(SSL_get_wbio(self->ssl), nonblocking);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002676 }
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002677
Victor Stinner14690702015-04-06 22:46:13 +02002678 timeout = GET_SOCKET_TIMEOUT(sock);
2679 has_timeout = (timeout > 0);
2680 if (has_timeout)
2681 deadline = _PyTime_GetMonotonicClock() + timeout;
2682
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002683 while (1) {
2684 PySSL_BEGIN_ALLOW_THREADS
2685 /* Disable read-ahead so that unwrap can work correctly.
2686 * Otherwise OpenSSL might read in too much data,
2687 * eating clear text data that happens to be
2688 * transmitted after the SSL shutdown.
Ezio Melotti85a86292013-08-17 16:57:41 +03002689 * Should be safe to call repeatedly every time this
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002690 * function is used and the shutdown_seen_zero != 0
2691 * condition is met.
2692 */
2693 if (self->shutdown_seen_zero)
2694 SSL_set_read_ahead(self->ssl, 0);
Steve Dowerc6fd1c12018-09-17 11:34:47 -07002695 ret = SSL_shutdown(self->ssl);
2696 err = _PySSL_errno(ret < 0, self->ssl, ret);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002697 PySSL_END_ALLOW_THREADS
Steve Dowerc6fd1c12018-09-17 11:34:47 -07002698 self->err = err;
Victor Stinner4e3cfa42015-04-02 21:28:28 +02002699
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002700 /* If err == 1, a secure shutdown with SSL_shutdown() is complete */
Steve Dowerc6fd1c12018-09-17 11:34:47 -07002701 if (ret > 0)
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002702 break;
Steve Dowerc6fd1c12018-09-17 11:34:47 -07002703 if (ret == 0) {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002704 /* Don't loop endlessly; instead preserve legacy
2705 behaviour of trying SSL_shutdown() only twice.
2706 This looks necessary for OpenSSL < 0.9.8m */
2707 if (++zeros > 1)
2708 break;
2709 /* Shutdown was sent, now try receiving */
2710 self->shutdown_seen_zero = 1;
2711 continue;
Bill Janssen40a0f662008-08-12 16:56:25 +00002712 }
2713
Victor Stinner14690702015-04-06 22:46:13 +02002714 if (has_timeout)
2715 timeout = deadline - _PyTime_GetMonotonicClock();
2716
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002717 /* Possibly retry shutdown until timeout or failure */
Steve Dowerc6fd1c12018-09-17 11:34:47 -07002718 if (err.ssl == SSL_ERROR_WANT_READ)
Victor Stinner14690702015-04-06 22:46:13 +02002719 sockstate = PySSL_select(sock, 0, timeout);
Steve Dowerc6fd1c12018-09-17 11:34:47 -07002720 else if (err.ssl == SSL_ERROR_WANT_WRITE)
Victor Stinner14690702015-04-06 22:46:13 +02002721 sockstate = PySSL_select(sock, 1, timeout);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002722 else
2723 break;
Victor Stinner4e3cfa42015-04-02 21:28:28 +02002724
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002725 if (sockstate == SOCKET_HAS_TIMED_OUT) {
Steve Dowerc6fd1c12018-09-17 11:34:47 -07002726 if (err.ssl == SSL_ERROR_WANT_READ)
Antoine Pitrouc4df7842010-12-03 19:59:41 +00002727 PyErr_SetString(PySocketModule.timeout_error,
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002728 "The read operation timed out");
2729 else
Antoine Pitrouc4df7842010-12-03 19:59:41 +00002730 PyErr_SetString(PySocketModule.timeout_error,
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002731 "The write operation timed out");
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +00002732 goto error;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002733 }
2734 else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
2735 PyErr_SetString(PySSLErrorObject,
2736 "Underlying socket too large for select().");
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +00002737 goto error;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002738 }
2739 else if (sockstate != SOCKET_OPERATION_OK)
2740 /* Retain the SSL error code */
2741 break;
2742 }
Nathaniel J. Smithc0da5822018-09-21 21:44:12 -07002743 if (ret < 0) {
Antoine Pitroub1fdf472014-10-05 20:41:53 +02002744 Py_XDECREF(sock);
Christian Heimesc7f70692019-05-31 11:44:05 +02002745 PySSL_SetError(self, ret, __FILE__, __LINE__);
2746 return NULL;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002747 }
Christian Heimesc7f70692019-05-31 11:44:05 +02002748 if (self->exc_type != NULL)
2749 goto error;
Antoine Pitroub1fdf472014-10-05 20:41:53 +02002750 if (sock)
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +00002751 /* It's already INCREF'ed */
2752 return (PyObject *) sock;
Antoine Pitroub1fdf472014-10-05 20:41:53 +02002753 else
2754 Py_RETURN_NONE;
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +00002755
2756error:
Antoine Pitroub1fdf472014-10-05 20:41:53 +02002757 Py_XDECREF(sock);
Christian Heimesc7f70692019-05-31 11:44:05 +02002758 PySSL_ChainExceptions(self);
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +00002759 return NULL;
Bill Janssen40a0f662008-08-12 16:56:25 +00002760}
2761
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002762/*[clinic input]
Christian Heimes141c5e82018-02-24 21:10:57 +01002763_ssl._SSLSocket.get_channel_binding
2764 cb_type: str = "tls-unique"
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002765
Christian Heimes141c5e82018-02-24 21:10:57 +01002766Get channel binding data for current connection.
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002767
Christian Heimes141c5e82018-02-24 21:10:57 +01002768Raise ValueError if the requested `cb_type` is not supported. Return bytes
2769of the data or None if the data is not available (e.g. before the handshake).
2770Only 'tls-unique' channel binding data from RFC 5929 is supported.
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002771[clinic start generated code]*/
Bill Janssen40a0f662008-08-12 16:56:25 +00002772
Antoine Pitroud6494802011-07-21 01:11:30 +02002773static PyObject *
Christian Heimes141c5e82018-02-24 21:10:57 +01002774_ssl__SSLSocket_get_channel_binding_impl(PySSLSocket *self,
2775 const char *cb_type)
2776/*[clinic end generated code: output=34bac9acb6a61d31 input=08b7e43b99c17d41]*/
Antoine Pitroud6494802011-07-21 01:11:30 +02002777{
Antoine Pitroud6494802011-07-21 01:11:30 +02002778 char buf[PySSL_CB_MAXLEN];
Victor Stinner9ee02032013-06-23 15:08:23 +02002779 size_t len;
Antoine Pitroud6494802011-07-21 01:11:30 +02002780
Christian Heimes141c5e82018-02-24 21:10:57 +01002781 if (strcmp(cb_type, "tls-unique") == 0) {
2782 if (SSL_session_reused(self->ssl) ^ !self->socket_type) {
2783 /* if session is resumed XOR we are the client */
2784 len = SSL_get_finished(self->ssl, buf, PySSL_CB_MAXLEN);
2785 }
2786 else {
2787 /* if a new session XOR we are the server */
2788 len = SSL_get_peer_finished(self->ssl, buf, PySSL_CB_MAXLEN);
2789 }
Antoine Pitroud6494802011-07-21 01:11:30 +02002790 }
2791 else {
Christian Heimes141c5e82018-02-24 21:10:57 +01002792 PyErr_Format(
2793 PyExc_ValueError,
2794 "'%s' channel binding type not implemented",
2795 cb_type
2796 );
2797 return NULL;
Antoine Pitroud6494802011-07-21 01:11:30 +02002798 }
2799
2800 /* It cannot be negative in current OpenSSL version as of July 2011 */
Antoine Pitroud6494802011-07-21 01:11:30 +02002801 if (len == 0)
2802 Py_RETURN_NONE;
2803
Christian Heimes141c5e82018-02-24 21:10:57 +01002804 return PyBytes_FromStringAndSize(buf, len);
Antoine Pitroud6494802011-07-21 01:11:30 +02002805}
2806
Christian Heimes9fb051f2018-09-23 08:32:31 +02002807/*[clinic input]
2808_ssl._SSLSocket.verify_client_post_handshake
2809
2810Initiate TLS 1.3 post-handshake authentication
2811[clinic start generated code]*/
2812
2813static PyObject *
2814_ssl__SSLSocket_verify_client_post_handshake_impl(PySSLSocket *self)
2815/*[clinic end generated code: output=532147f3b1341425 input=6bfa874810a3d889]*/
2816{
2817#ifdef TLS1_3_VERSION
2818 int err = SSL_verify_client_post_handshake(self->ssl);
2819 if (err == 0)
2820 return _setSSLError(NULL, 0, __FILE__, __LINE__);
2821 else
2822 Py_RETURN_NONE;
2823#else
2824 PyErr_SetString(PyExc_NotImplementedError,
2825 "Post-handshake auth is not supported by your "
2826 "OpenSSL version.");
2827 return NULL;
2828#endif
2829}
2830
Christian Heimes99a65702016-09-10 23:44:53 +02002831#ifdef OPENSSL_VERSION_1_1
2832
2833static SSL_SESSION*
2834_ssl_session_dup(SSL_SESSION *session) {
2835 SSL_SESSION *newsession = NULL;
2836 int slen;
2837 unsigned char *senc = NULL, *p;
2838 const unsigned char *const_p;
2839
2840 if (session == NULL) {
2841 PyErr_SetString(PyExc_ValueError, "Invalid session");
2842 goto error;
2843 }
2844
2845 /* get length */
2846 slen = i2d_SSL_SESSION(session, NULL);
2847 if (slen == 0 || slen > 0xFF00) {
2848 PyErr_SetString(PyExc_ValueError, "i2d() failed.");
2849 goto error;
2850 }
2851 if ((senc = PyMem_Malloc(slen)) == NULL) {
2852 PyErr_NoMemory();
2853 goto error;
2854 }
2855 p = senc;
2856 if (!i2d_SSL_SESSION(session, &p)) {
2857 PyErr_SetString(PyExc_ValueError, "i2d() failed.");
2858 goto error;
2859 }
2860 const_p = senc;
2861 newsession = d2i_SSL_SESSION(NULL, &const_p, slen);
2862 if (session == NULL) {
2863 goto error;
2864 }
2865 PyMem_Free(senc);
2866 return newsession;
2867 error:
2868 if (senc != NULL) {
2869 PyMem_Free(senc);
2870 }
2871 return NULL;
2872}
2873#endif
2874
2875static PyObject *
2876PySSL_get_session(PySSLSocket *self, void *closure) {
2877 /* get_session can return sessions from a server-side connection,
2878 * it does not check for handshake done or client socket. */
2879 PySSLSession *pysess;
2880 SSL_SESSION *session;
2881
2882#ifdef OPENSSL_VERSION_1_1
2883 /* duplicate session as workaround for session bug in OpenSSL 1.1.0,
2884 * https://github.com/openssl/openssl/issues/1550 */
2885 session = SSL_get0_session(self->ssl); /* borrowed reference */
2886 if (session == NULL) {
2887 Py_RETURN_NONE;
2888 }
2889 if ((session = _ssl_session_dup(session)) == NULL) {
2890 return NULL;
2891 }
2892#else
2893 session = SSL_get1_session(self->ssl);
2894 if (session == NULL) {
2895 Py_RETURN_NONE;
2896 }
2897#endif
Christian Heimesa5d07652016-09-24 10:48:05 +02002898 pysess = PyObject_GC_New(PySSLSession, &PySSLSession_Type);
Christian Heimes99a65702016-09-10 23:44:53 +02002899 if (pysess == NULL) {
2900 SSL_SESSION_free(session);
2901 return NULL;
2902 }
2903
2904 assert(self->ctx);
2905 pysess->ctx = self->ctx;
2906 Py_INCREF(pysess->ctx);
2907 pysess->session = session;
Christian Heimesa5d07652016-09-24 10:48:05 +02002908 PyObject_GC_Track(pysess);
Christian Heimes99a65702016-09-10 23:44:53 +02002909 return (PyObject *)pysess;
2910}
2911
2912static int PySSL_set_session(PySSLSocket *self, PyObject *value,
2913 void *closure)
2914 {
2915 PySSLSession *pysess;
2916#ifdef OPENSSL_VERSION_1_1
2917 SSL_SESSION *session;
2918#endif
2919 int result;
2920
2921 if (!PySSLSession_Check(value)) {
Ned Deily4531ec72018-06-11 20:26:28 -04002922 PyErr_SetString(PyExc_TypeError, "Value is not a SSLSession.");
Christian Heimes99a65702016-09-10 23:44:53 +02002923 return -1;
2924 }
2925 pysess = (PySSLSession *)value;
2926
2927 if (self->ctx->ctx != pysess->ctx->ctx) {
2928 PyErr_SetString(PyExc_ValueError,
2929 "Session refers to a different SSLContext.");
2930 return -1;
2931 }
2932 if (self->socket_type != PY_SSL_CLIENT) {
2933 PyErr_SetString(PyExc_ValueError,
2934 "Cannot set session for server-side SSLSocket.");
2935 return -1;
2936 }
Christian Heimes66dc33b2017-05-23 16:02:02 -07002937 if (SSL_is_init_finished(self->ssl)) {
Christian Heimes99a65702016-09-10 23:44:53 +02002938 PyErr_SetString(PyExc_ValueError,
2939 "Cannot set session after handshake.");
2940 return -1;
2941 }
2942#ifdef OPENSSL_VERSION_1_1
2943 /* duplicate session */
2944 if ((session = _ssl_session_dup(pysess->session)) == NULL) {
2945 return -1;
2946 }
2947 result = SSL_set_session(self->ssl, session);
2948 /* free duplicate, SSL_set_session() bumps ref count */
2949 SSL_SESSION_free(session);
2950#else
2951 result = SSL_set_session(self->ssl, pysess->session);
2952#endif
2953 if (result == 0) {
2954 _setSSLError(NULL, 0, __FILE__, __LINE__);
2955 return -1;
2956 }
2957 return 0;
2958}
2959
2960PyDoc_STRVAR(PySSL_set_session_doc,
2961"_setter_session(session)\n\
2962\
2963Get / set SSLSession.");
2964
2965static PyObject *
2966PySSL_get_session_reused(PySSLSocket *self, void *closure) {
2967 if (SSL_session_reused(self->ssl)) {
2968 Py_RETURN_TRUE;
2969 } else {
2970 Py_RETURN_FALSE;
2971 }
2972}
2973
2974PyDoc_STRVAR(PySSL_get_session_reused_doc,
2975"Was the client session reused during handshake?");
2976
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01002977static PyGetSetDef ssl_getsetlist[] = {
2978 {"context", (getter) PySSL_get_context,
2979 (setter) PySSL_set_context, PySSL_set_context_doc},
Antoine Pitroub1fdf472014-10-05 20:41:53 +02002980 {"server_side", (getter) PySSL_get_server_side, NULL,
2981 PySSL_get_server_side_doc},
2982 {"server_hostname", (getter) PySSL_get_server_hostname, NULL,
2983 PySSL_get_server_hostname_doc},
2984 {"owner", (getter) PySSL_get_owner, (setter) PySSL_set_owner,
2985 PySSL_get_owner_doc},
Christian Heimes99a65702016-09-10 23:44:53 +02002986 {"session", (getter) PySSL_get_session,
2987 (setter) PySSL_set_session, PySSL_set_session_doc},
2988 {"session_reused", (getter) PySSL_get_session_reused, NULL,
2989 PySSL_get_session_reused_doc},
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01002990 {NULL}, /* sentinel */
2991};
2992
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002993static PyMethodDef PySSLMethods[] = {
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002994 _SSL__SSLSOCKET_DO_HANDSHAKE_METHODDEF
2995 _SSL__SSLSOCKET_WRITE_METHODDEF
2996 _SSL__SSLSOCKET_READ_METHODDEF
2997 _SSL__SSLSOCKET_PENDING_METHODDEF
Christian Heimes141c5e82018-02-24 21:10:57 +01002998 _SSL__SSLSOCKET_GETPEERCERT_METHODDEF
2999 _SSL__SSLSOCKET_GET_CHANNEL_BINDING_METHODDEF
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03003000 _SSL__SSLSOCKET_CIPHER_METHODDEF
3001 _SSL__SSLSOCKET_SHARED_CIPHERS_METHODDEF
3002 _SSL__SSLSOCKET_VERSION_METHODDEF
3003 _SSL__SSLSOCKET_SELECTED_NPN_PROTOCOL_METHODDEF
3004 _SSL__SSLSOCKET_SELECTED_ALPN_PROTOCOL_METHODDEF
3005 _SSL__SSLSOCKET_COMPRESSION_METHODDEF
3006 _SSL__SSLSOCKET_SHUTDOWN_METHODDEF
Christian Heimes9fb051f2018-09-23 08:32:31 +02003007 _SSL__SSLSOCKET_VERIFY_CLIENT_POST_HANDSHAKE_METHODDEF
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00003008 {NULL, NULL}
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003009};
3010
Antoine Pitrou152efa22010-05-16 18:19:27 +00003011static PyTypeObject PySSLSocket_Type = {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00003012 PyVarObject_HEAD_INIT(NULL, 0)
Antoine Pitrou152efa22010-05-16 18:19:27 +00003013 "_ssl._SSLSocket", /*tp_name*/
3014 sizeof(PySSLSocket), /*tp_basicsize*/
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00003015 0, /*tp_itemsize*/
3016 /* methods */
3017 (destructor)PySSL_dealloc, /*tp_dealloc*/
Jeroen Demeyer530f5062019-05-31 04:13:39 +02003018 0, /*tp_vectorcall_offset*/
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00003019 0, /*tp_getattr*/
3020 0, /*tp_setattr*/
Jeroen Demeyer530f5062019-05-31 04:13:39 +02003021 0, /*tp_as_async*/
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00003022 0, /*tp_repr*/
3023 0, /*tp_as_number*/
3024 0, /*tp_as_sequence*/
3025 0, /*tp_as_mapping*/
3026 0, /*tp_hash*/
3027 0, /*tp_call*/
3028 0, /*tp_str*/
3029 0, /*tp_getattro*/
3030 0, /*tp_setattro*/
3031 0, /*tp_as_buffer*/
3032 Py_TPFLAGS_DEFAULT, /*tp_flags*/
3033 0, /*tp_doc*/
Christian Heimesc7f70692019-05-31 11:44:05 +02003034 (traverseproc) PySSL_traverse, /*tp_traverse*/
3035 (inquiry) PySSL_clear, /*tp_clear*/
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00003036 0, /*tp_richcompare*/
3037 0, /*tp_weaklistoffset*/
3038 0, /*tp_iter*/
3039 0, /*tp_iternext*/
3040 PySSLMethods, /*tp_methods*/
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01003041 0, /*tp_members*/
3042 ssl_getsetlist, /*tp_getset*/
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003043};
3044
Antoine Pitrou152efa22010-05-16 18:19:27 +00003045
3046/*
3047 * _SSLContext objects
3048 */
3049
Christian Heimes5fe668c2016-09-12 00:01:11 +02003050static int
Christian Heimes9fb051f2018-09-23 08:32:31 +02003051_set_verify_mode(PySSLContext *self, enum py_ssl_cert_requirements n)
Christian Heimes5fe668c2016-09-12 00:01:11 +02003052{
3053 int mode;
3054 int (*verify_cb)(int, X509_STORE_CTX *) = NULL;
3055
3056 switch(n) {
3057 case PY_SSL_CERT_NONE:
3058 mode = SSL_VERIFY_NONE;
3059 break;
3060 case PY_SSL_CERT_OPTIONAL:
3061 mode = SSL_VERIFY_PEER;
3062 break;
3063 case PY_SSL_CERT_REQUIRED:
3064 mode = SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT;
3065 break;
3066 default:
3067 PyErr_SetString(PyExc_ValueError,
3068 "invalid value for verify_mode");
3069 return -1;
3070 }
Christian Heimesf0f59302019-07-01 08:29:17 +02003071
3072 /* bpo-37428: newPySSLSocket() sets SSL_VERIFY_POST_HANDSHAKE flag for
3073 * server sockets and SSL_set_post_handshake_auth() for client. */
3074
Christian Heimes5fe668c2016-09-12 00:01:11 +02003075 /* keep current verify cb */
Christian Heimes9fb051f2018-09-23 08:32:31 +02003076 verify_cb = SSL_CTX_get_verify_callback(self->ctx);
3077 SSL_CTX_set_verify(self->ctx, mode, verify_cb);
Christian Heimes5fe668c2016-09-12 00:01:11 +02003078 return 0;
3079}
3080
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03003081/*[clinic input]
3082@classmethod
3083_ssl._SSLContext.__new__
3084 protocol as proto_version: int
3085 /
3086[clinic start generated code]*/
3087
Antoine Pitrou152efa22010-05-16 18:19:27 +00003088static PyObject *
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03003089_ssl__SSLContext_impl(PyTypeObject *type, int proto_version)
3090/*[clinic end generated code: output=2cf0d7a0741b6bd1 input=8d58a805b95fc534]*/
Antoine Pitrou152efa22010-05-16 18:19:27 +00003091{
Antoine Pitrou152efa22010-05-16 18:19:27 +00003092 PySSLContext *self;
Antoine Pitroucd3d7ca2014-01-09 20:02:20 +01003093 long options;
Antoine Pitrou152efa22010-05-16 18:19:27 +00003094 SSL_CTX *ctx = NULL;
Christian Heimes61d478c2018-01-27 15:51:38 +01003095 X509_VERIFY_PARAM *params;
Christian Heimes358cfd42016-09-10 22:43:48 +02003096 int result;
Berker Peksagdfcb0412016-04-14 16:48:48 +03003097#if defined(SSL_MODE_RELEASE_BUFFERS)
Benjamin Peterson3b1a8b32016-01-07 21:37:37 -08003098 unsigned long libver;
Berker Peksagdfcb0412016-04-14 16:48:48 +03003099#endif
Antoine Pitrou152efa22010-05-16 18:19:27 +00003100
Antoine Pitrou152efa22010-05-16 18:19:27 +00003101 PySSL_BEGIN_ALLOW_THREADS
Christian Heimes6e8cda92020-05-16 03:33:05 +02003102 switch(proto_version) {
3103#if defined(SSL3_VERSION) && !defined(OPENSSL_NO_SSL3)
3104 case PY_SSL_VERSION_SSL3:
Antoine Pitrou152efa22010-05-16 18:19:27 +00003105 ctx = SSL_CTX_new(SSLv3_method());
Christian Heimes6e8cda92020-05-16 03:33:05 +02003106 break;
Benjamin Petersone32467c2014-12-05 21:59:35 -05003107#endif
Christian Heimesa871f692020-06-01 08:58:14 +02003108#if (defined(TLS1_VERSION) && \
3109 !defined(OPENSSL_NO_TLS1) && \
3110 !defined(OPENSSL_NO_TLS1_METHOD))
Christian Heimes6e8cda92020-05-16 03:33:05 +02003111 case PY_SSL_VERSION_TLS1:
3112 ctx = SSL_CTX_new(TLSv1_method());
3113 break;
Victor Stinner3de49192011-05-09 00:42:58 +02003114#endif
Christian Heimesa871f692020-06-01 08:58:14 +02003115#if (defined(TLS1_1_VERSION) && \
3116 !defined(OPENSSL_NO_TLS1_1) && \
3117 !defined(OPENSSL_NO_TLS1_1_METHOD))
Christian Heimes6e8cda92020-05-16 03:33:05 +02003118 case PY_SSL_VERSION_TLS1_1:
3119 ctx = SSL_CTX_new(TLSv1_1_method());
3120 break;
3121#endif
Christian Heimesa871f692020-06-01 08:58:14 +02003122#if (defined(TLS1_2_VERSION) && \
3123 !defined(OPENSSL_NO_TLS1_2) && \
3124 !defined(OPENSSL_NO_TLS1_2_METHOD))
Christian Heimes6e8cda92020-05-16 03:33:05 +02003125 case PY_SSL_VERSION_TLS1_2:
3126 ctx = SSL_CTX_new(TLSv1_2_method());
3127 break;
3128#endif
3129 case PY_SSL_VERSION_TLS:
3130 /* SSLv23 */
Christian Heimes598894f2016-09-05 23:19:05 +02003131 ctx = SSL_CTX_new(TLS_method());
Christian Heimes6e8cda92020-05-16 03:33:05 +02003132 break;
3133 case PY_SSL_VERSION_TLS_CLIENT:
Christian Heimes5fe668c2016-09-12 00:01:11 +02003134 ctx = SSL_CTX_new(TLS_client_method());
Christian Heimes6e8cda92020-05-16 03:33:05 +02003135 break;
3136 case PY_SSL_VERSION_TLS_SERVER:
Christian Heimes5fe668c2016-09-12 00:01:11 +02003137 ctx = SSL_CTX_new(TLS_server_method());
Christian Heimes6e8cda92020-05-16 03:33:05 +02003138 break;
3139 default:
Antoine Pitrou152efa22010-05-16 18:19:27 +00003140 proto_version = -1;
Christian Heimes6e8cda92020-05-16 03:33:05 +02003141 }
Antoine Pitrou152efa22010-05-16 18:19:27 +00003142 PySSL_END_ALLOW_THREADS
3143
3144 if (proto_version == -1) {
3145 PyErr_SetString(PyExc_ValueError,
Christian Heimes6e8cda92020-05-16 03:33:05 +02003146 "invalid or unsupported protocol version");
Antoine Pitrou152efa22010-05-16 18:19:27 +00003147 return NULL;
3148 }
3149 if (ctx == NULL) {
Christian Heimes17c9ac92017-09-07 14:14:00 -07003150 _setSSLError(NULL, 0, __FILE__, __LINE__);
Antoine Pitrou152efa22010-05-16 18:19:27 +00003151 return NULL;
3152 }
3153
3154 assert(type != NULL && type->tp_alloc != NULL);
3155 self = (PySSLContext *) type->tp_alloc(type, 0);
3156 if (self == NULL) {
3157 SSL_CTX_free(ctx);
3158 return NULL;
3159 }
3160 self->ctx = ctx;
Christian Heimes61d478c2018-01-27 15:51:38 +01003161 self->hostflags = X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS;
Christian Heimes11a14932018-02-24 02:35:08 +01003162 self->protocol = proto_version;
Christian Heimesc7f70692019-05-31 11:44:05 +02003163 self->msg_cb = NULL;
3164#ifdef HAVE_OPENSSL_KEYLOG
3165 self->keylog_filename = NULL;
3166 self->keylog_bio = NULL;
3167#endif
Christian Heimes29eab552018-02-25 12:31:33 +01003168#if HAVE_NPN
Christian Heimes5cb31c92012-09-20 12:42:54 +02003169 self->npn_protocols = NULL;
3170#endif
Christian Heimes29eab552018-02-25 12:31:33 +01003171#if HAVE_ALPN
Benjamin Petersoncca27322015-01-23 16:35:37 -05003172 self->alpn_protocols = NULL;
3173#endif
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01003174#ifndef OPENSSL_NO_TLSEXT
Christian Heimes11a14932018-02-24 02:35:08 +01003175 self->set_sni_cb = NULL;
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01003176#endif
Christian Heimes1aa9a752013-12-02 02:41:19 +01003177 /* Don't check host name by default */
Christian Heimes5fe668c2016-09-12 00:01:11 +02003178 if (proto_version == PY_SSL_VERSION_TLS_CLIENT) {
3179 self->check_hostname = 1;
Christian Heimes9fb051f2018-09-23 08:32:31 +02003180 if (_set_verify_mode(self, PY_SSL_CERT_REQUIRED) == -1) {
Christian Heimes5fe668c2016-09-12 00:01:11 +02003181 Py_DECREF(self);
3182 return NULL;
3183 }
3184 } else {
3185 self->check_hostname = 0;
Christian Heimes9fb051f2018-09-23 08:32:31 +02003186 if (_set_verify_mode(self, PY_SSL_CERT_NONE) == -1) {
Christian Heimes5fe668c2016-09-12 00:01:11 +02003187 Py_DECREF(self);
3188 return NULL;
3189 }
3190 }
Antoine Pitrou152efa22010-05-16 18:19:27 +00003191 /* Defaults */
Antoine Pitroucd3d7ca2014-01-09 20:02:20 +01003192 options = SSL_OP_ALL & ~SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS;
3193 if (proto_version != PY_SSL_VERSION_SSL2)
3194 options |= SSL_OP_NO_SSLv2;
Benjamin Petersona9dcdab2015-11-11 22:38:41 -08003195 if (proto_version != PY_SSL_VERSION_SSL3)
3196 options |= SSL_OP_NO_SSLv3;
Christian Heimes358cfd42016-09-10 22:43:48 +02003197 /* Minimal security flags for server and client side context.
3198 * Client sockets ignore server-side parameters. */
3199#ifdef SSL_OP_NO_COMPRESSION
3200 options |= SSL_OP_NO_COMPRESSION;
3201#endif
3202#ifdef SSL_OP_CIPHER_SERVER_PREFERENCE
3203 options |= SSL_OP_CIPHER_SERVER_PREFERENCE;
3204#endif
3205#ifdef SSL_OP_SINGLE_DH_USE
3206 options |= SSL_OP_SINGLE_DH_USE;
3207#endif
3208#ifdef SSL_OP_SINGLE_ECDH_USE
3209 options |= SSL_OP_SINGLE_ECDH_USE;
3210#endif
Antoine Pitroucd3d7ca2014-01-09 20:02:20 +01003211 SSL_CTX_set_options(self->ctx, options);
Antoine Pitrou152efa22010-05-16 18:19:27 +00003212
Semen Zhydenko1295e112017-10-15 21:28:31 +02003213 /* A bare minimum cipher list without completely broken cipher suites.
Christian Heimes358cfd42016-09-10 22:43:48 +02003214 * It's far from perfect but gives users a better head start. */
3215 if (proto_version != PY_SSL_VERSION_SSL2) {
Christian Heimes892d66e2018-01-29 14:10:18 +01003216#if PY_SSL_DEFAULT_CIPHERS == 2
3217 /* stick to OpenSSL's default settings */
3218 result = 1;
3219#else
3220 result = SSL_CTX_set_cipher_list(ctx, PY_SSL_DEFAULT_CIPHER_STRING);
3221#endif
Christian Heimes358cfd42016-09-10 22:43:48 +02003222 } else {
3223 /* SSLv2 needs MD5 */
3224 result = SSL_CTX_set_cipher_list(ctx, "HIGH:!aNULL:!eNULL");
3225 }
3226 if (result == 0) {
3227 Py_DECREF(self);
3228 ERR_clear_error();
3229 PyErr_SetString(PySSLErrorObject,
3230 "No cipher can be selected.");
3231 return NULL;
3232 }
3233
Benjamin Peterson3b1a8b32016-01-07 21:37:37 -08003234#if defined(SSL_MODE_RELEASE_BUFFERS)
3235 /* Set SSL_MODE_RELEASE_BUFFERS. This potentially greatly reduces memory
3236 usage for no cost at all. However, don't do this for OpenSSL versions
3237 between 1.0.1 and 1.0.1h or 1.0.0 and 1.0.0m, which are affected by CVE
3238 2014-0198. I can't find exactly which beta fixed this CVE, so be
3239 conservative and assume it wasn't fixed until release. We do this check
3240 at runtime to avoid problems from the dynamic linker.
3241 See #25672 for more on this. */
Christian Heimesa871f692020-06-01 08:58:14 +02003242 libver = OpenSSL_version_num();
Benjamin Peterson3b1a8b32016-01-07 21:37:37 -08003243 if (!(libver >= 0x10001000UL && libver < 0x1000108fUL) &&
3244 !(libver >= 0x10000000UL && libver < 0x100000dfUL)) {
3245 SSL_CTX_set_mode(self->ctx, SSL_MODE_RELEASE_BUFFERS);
3246 }
3247#endif
3248
3249
Donald Stufft8ae264c2017-03-02 11:45:29 -05003250#if !defined(OPENSSL_NO_ECDH) && !defined(OPENSSL_VERSION_1_1)
Antoine Pitrou0bebbc32014-03-22 18:13:50 +01003251 /* Allow automatic ECDH curve selection (on OpenSSL 1.0.2+), or use
3252 prime256v1 by default. This is Apache mod_ssl's initialization
Christian Heimes598894f2016-09-05 23:19:05 +02003253 policy, so we should be safe. OpenSSL 1.1 has it enabled by default.
3254 */
Donald Stufft8ae264c2017-03-02 11:45:29 -05003255#if defined(SSL_CTX_set_ecdh_auto)
Antoine Pitrou0bebbc32014-03-22 18:13:50 +01003256 SSL_CTX_set_ecdh_auto(self->ctx, 1);
3257#else
3258 {
3259 EC_KEY *key = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1);
3260 SSL_CTX_set_tmp_ecdh(self->ctx, key);
3261 EC_KEY_free(key);
3262 }
3263#endif
3264#endif
3265
Antoine Pitroufc113ee2010-10-13 12:46:13 +00003266#define SID_CTX "Python"
3267 SSL_CTX_set_session_id_context(self->ctx, (const unsigned char *) SID_CTX,
3268 sizeof(SID_CTX));
3269#undef SID_CTX
3270
Christian Heimes61d478c2018-01-27 15:51:38 +01003271 params = SSL_CTX_get0_param(self->ctx);
Benjamin Petersonfdb19712015-03-04 22:11:12 -05003272#ifdef X509_V_FLAG_TRUSTED_FIRST
Christian Heimes61d478c2018-01-27 15:51:38 +01003273 /* Improve trust chain building when cross-signed intermediate
3274 certificates are present. See https://bugs.python.org/issue23476. */
3275 X509_VERIFY_PARAM_set_flags(params, X509_V_FLAG_TRUSTED_FIRST);
Benjamin Petersonfdb19712015-03-04 22:11:12 -05003276#endif
Christian Heimes61d478c2018-01-27 15:51:38 +01003277 X509_VERIFY_PARAM_set_hostflags(params, self->hostflags);
Benjamin Petersonfdb19712015-03-04 22:11:12 -05003278
Christian Heimes9fb051f2018-09-23 08:32:31 +02003279#ifdef TLS1_3_VERSION
3280 self->post_handshake_auth = 0;
3281 SSL_CTX_set_post_handshake_auth(self->ctx, self->post_handshake_auth);
3282#endif
3283
Antoine Pitrou152efa22010-05-16 18:19:27 +00003284 return (PyObject *)self;
3285}
3286
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01003287static int
3288context_traverse(PySSLContext *self, visitproc visit, void *arg)
3289{
3290#ifndef OPENSSL_NO_TLSEXT
Christian Heimes11a14932018-02-24 02:35:08 +01003291 Py_VISIT(self->set_sni_cb);
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01003292#endif
Christian Heimesc7f70692019-05-31 11:44:05 +02003293 Py_VISIT(self->msg_cb);
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01003294 return 0;
3295}
3296
3297static int
3298context_clear(PySSLContext *self)
3299{
3300#ifndef OPENSSL_NO_TLSEXT
Christian Heimes11a14932018-02-24 02:35:08 +01003301 Py_CLEAR(self->set_sni_cb);
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01003302#endif
Christian Heimesc7f70692019-05-31 11:44:05 +02003303 Py_CLEAR(self->msg_cb);
3304#ifdef HAVE_OPENSSL_KEYLOG
3305 Py_CLEAR(self->keylog_filename);
3306 if (self->keylog_bio != NULL) {
3307 PySSL_BEGIN_ALLOW_THREADS
3308 BIO_free_all(self->keylog_bio);
3309 PySSL_END_ALLOW_THREADS
3310 self->keylog_bio = NULL;
3311 }
3312#endif
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01003313 return 0;
3314}
3315
Antoine Pitrou152efa22010-05-16 18:19:27 +00003316static void
3317context_dealloc(PySSLContext *self)
3318{
INADA Naokia6296d32017-08-24 14:55:17 +09003319 /* bpo-31095: UnTrack is needed before calling any callbacks */
3320 PyObject_GC_UnTrack(self);
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01003321 context_clear(self);
Antoine Pitrou152efa22010-05-16 18:19:27 +00003322 SSL_CTX_free(self->ctx);
Christian Heimes29eab552018-02-25 12:31:33 +01003323#if HAVE_NPN
Benjamin Petersoncca27322015-01-23 16:35:37 -05003324 PyMem_FREE(self->npn_protocols);
3325#endif
Christian Heimes29eab552018-02-25 12:31:33 +01003326#if HAVE_ALPN
Benjamin Petersoncca27322015-01-23 16:35:37 -05003327 PyMem_FREE(self->alpn_protocols);
Antoine Pitroud5d17eb2012-03-22 00:23:03 +01003328#endif
Antoine Pitrou152efa22010-05-16 18:19:27 +00003329 Py_TYPE(self)->tp_free(self);
3330}
3331
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03003332/*[clinic input]
3333_ssl._SSLContext.set_ciphers
3334 cipherlist: str
3335 /
3336[clinic start generated code]*/
Antoine Pitrou152efa22010-05-16 18:19:27 +00003337
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03003338static PyObject *
3339_ssl__SSLContext_set_ciphers_impl(PySSLContext *self, const char *cipherlist)
3340/*[clinic end generated code: output=3a3162f3557c0f3f input=a7ac931b9f3ca7fc]*/
3341{
3342 int ret = SSL_CTX_set_cipher_list(self->ctx, cipherlist);
Antoine Pitrou152efa22010-05-16 18:19:27 +00003343 if (ret == 0) {
Antoine Pitrou65ec8ae2010-05-16 19:56:32 +00003344 /* Clearing the error queue is necessary on some OpenSSL versions,
3345 otherwise the error will be reported again when another SSL call
3346 is done. */
3347 ERR_clear_error();
Antoine Pitrou152efa22010-05-16 18:19:27 +00003348 PyErr_SetString(PySSLErrorObject,
3349 "No cipher can be selected.");
3350 return NULL;
3351 }
3352 Py_RETURN_NONE;
3353}
3354
Christian Heimes25bfcd52016-09-06 00:04:45 +02003355#if OPENSSL_VERSION_NUMBER >= 0x10002000UL
3356/*[clinic input]
3357_ssl._SSLContext.get_ciphers
3358[clinic start generated code]*/
3359
3360static PyObject *
3361_ssl__SSLContext_get_ciphers_impl(PySSLContext *self)
3362/*[clinic end generated code: output=a56e4d68a406dfc4 input=a2aadc9af89b79c5]*/
3363{
3364 SSL *ssl = NULL;
3365 STACK_OF(SSL_CIPHER) *sk = NULL;
Christian Heimes99a65702016-09-10 23:44:53 +02003366 const SSL_CIPHER *cipher;
Christian Heimes25bfcd52016-09-06 00:04:45 +02003367 int i=0;
3368 PyObject *result = NULL, *dct;
3369
3370 ssl = SSL_new(self->ctx);
3371 if (ssl == NULL) {
3372 _setSSLError(NULL, 0, __FILE__, __LINE__);
3373 goto exit;
3374 }
3375 sk = SSL_get_ciphers(ssl);
3376
3377 result = PyList_New(sk_SSL_CIPHER_num(sk));
3378 if (result == NULL) {
3379 goto exit;
3380 }
3381
3382 for (i = 0; i < sk_SSL_CIPHER_num(sk); i++) {
3383 cipher = sk_SSL_CIPHER_value(sk, i);
3384 dct = cipher_to_dict(cipher);
3385 if (dct == NULL) {
3386 Py_CLEAR(result);
3387 goto exit;
3388 }
3389 PyList_SET_ITEM(result, i, dct);
3390 }
3391
3392 exit:
3393 if (ssl != NULL)
3394 SSL_free(ssl);
3395 return result;
3396
3397}
3398#endif
3399
3400
Christian Heimes29eab552018-02-25 12:31:33 +01003401#if HAVE_NPN || HAVE_ALPN
Benjamin Petersoncca27322015-01-23 16:35:37 -05003402static int
Benjamin Peterson88615022015-01-23 17:30:26 -05003403do_protocol_selection(int alpn, unsigned char **out, unsigned char *outlen,
3404 const unsigned char *server_protocols, unsigned int server_protocols_len,
3405 const unsigned char *client_protocols, unsigned int client_protocols_len)
Benjamin Petersoncca27322015-01-23 16:35:37 -05003406{
Benjamin Peterson88615022015-01-23 17:30:26 -05003407 int ret;
3408 if (client_protocols == NULL) {
3409 client_protocols = (unsigned char *)"";
3410 client_protocols_len = 0;
3411 }
3412 if (server_protocols == NULL) {
3413 server_protocols = (unsigned char *)"";
3414 server_protocols_len = 0;
Benjamin Petersoncca27322015-01-23 16:35:37 -05003415 }
3416
Benjamin Peterson88615022015-01-23 17:30:26 -05003417 ret = SSL_select_next_proto(out, outlen,
3418 server_protocols, server_protocols_len,
3419 client_protocols, client_protocols_len);
3420 if (alpn && ret != OPENSSL_NPN_NEGOTIATED)
3421 return SSL_TLSEXT_ERR_NOACK;
Benjamin Petersoncca27322015-01-23 16:35:37 -05003422
3423 return SSL_TLSEXT_ERR_OK;
3424}
Melvyn Sopacuab2d096b2017-09-04 23:35:15 +02003425#endif
Benjamin Petersoncca27322015-01-23 16:35:37 -05003426
Christian Heimes29eab552018-02-25 12:31:33 +01003427#if HAVE_NPN
Antoine Pitroud5d17eb2012-03-22 00:23:03 +01003428/* this callback gets passed to SSL_CTX_set_next_protos_advertise_cb */
3429static int
Victor Stinner4569cd52013-06-23 14:58:43 +02003430_advertiseNPN_cb(SSL *s,
3431 const unsigned char **data, unsigned int *len,
Antoine Pitroud5d17eb2012-03-22 00:23:03 +01003432 void *args)
3433{
3434 PySSLContext *ssl_ctx = (PySSLContext *) args;
3435
3436 if (ssl_ctx->npn_protocols == NULL) {
Benjamin Petersoncca27322015-01-23 16:35:37 -05003437 *data = (unsigned char *)"";
Antoine Pitroud5d17eb2012-03-22 00:23:03 +01003438 *len = 0;
3439 } else {
Benjamin Petersoncca27322015-01-23 16:35:37 -05003440 *data = ssl_ctx->npn_protocols;
Antoine Pitroud5d17eb2012-03-22 00:23:03 +01003441 *len = ssl_ctx->npn_protocols_len;
3442 }
3443
3444 return SSL_TLSEXT_ERR_OK;
3445}
3446/* this callback gets passed to SSL_CTX_set_next_proto_select_cb */
3447static int
Victor Stinner4569cd52013-06-23 14:58:43 +02003448_selectNPN_cb(SSL *s,
Antoine Pitroud5d17eb2012-03-22 00:23:03 +01003449 unsigned char **out, unsigned char *outlen,
3450 const unsigned char *server, unsigned int server_len,
3451 void *args)
3452{
Benjamin Petersoncca27322015-01-23 16:35:37 -05003453 PySSLContext *ctx = (PySSLContext *)args;
Benjamin Peterson88615022015-01-23 17:30:26 -05003454 return do_protocol_selection(0, out, outlen, server, server_len,
Benjamin Petersoncca27322015-01-23 16:35:37 -05003455 ctx->npn_protocols, ctx->npn_protocols_len);
Antoine Pitroud5d17eb2012-03-22 00:23:03 +01003456}
3457#endif
3458
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03003459/*[clinic input]
3460_ssl._SSLContext._set_npn_protocols
3461 protos: Py_buffer
3462 /
3463[clinic start generated code]*/
3464
Antoine Pitroud5d17eb2012-03-22 00:23:03 +01003465static PyObject *
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03003466_ssl__SSLContext__set_npn_protocols_impl(PySSLContext *self,
3467 Py_buffer *protos)
3468/*[clinic end generated code: output=72b002c3324390c6 input=319fcb66abf95bd7]*/
Antoine Pitroud5d17eb2012-03-22 00:23:03 +01003469{
Christian Heimes29eab552018-02-25 12:31:33 +01003470#if HAVE_NPN
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03003471 PyMem_Free(self->npn_protocols);
3472 self->npn_protocols = PyMem_Malloc(protos->len);
3473 if (self->npn_protocols == NULL)
Antoine Pitroud5d17eb2012-03-22 00:23:03 +01003474 return PyErr_NoMemory();
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03003475 memcpy(self->npn_protocols, protos->buf, protos->len);
3476 self->npn_protocols_len = (int) protos->len;
Antoine Pitroud5d17eb2012-03-22 00:23:03 +01003477
3478 /* set both server and client callbacks, because the context can
3479 * be used to create both types of sockets */
3480 SSL_CTX_set_next_protos_advertised_cb(self->ctx,
3481 _advertiseNPN_cb,
3482 self);
3483 SSL_CTX_set_next_proto_select_cb(self->ctx,
3484 _selectNPN_cb,
3485 self);
3486
Antoine Pitroud5d17eb2012-03-22 00:23:03 +01003487 Py_RETURN_NONE;
3488#else
3489 PyErr_SetString(PyExc_NotImplementedError,
3490 "The NPN extension requires OpenSSL 1.0.1 or later.");
3491 return NULL;
3492#endif
3493}
3494
Christian Heimes29eab552018-02-25 12:31:33 +01003495#if HAVE_ALPN
Benjamin Petersoncca27322015-01-23 16:35:37 -05003496static int
3497_selectALPN_cb(SSL *s,
3498 const unsigned char **out, unsigned char *outlen,
3499 const unsigned char *client_protocols, unsigned int client_protocols_len,
3500 void *args)
3501{
3502 PySSLContext *ctx = (PySSLContext *)args;
Benjamin Peterson88615022015-01-23 17:30:26 -05003503 return do_protocol_selection(1, (unsigned char **)out, outlen,
3504 ctx->alpn_protocols, ctx->alpn_protocols_len,
3505 client_protocols, client_protocols_len);
Benjamin Petersoncca27322015-01-23 16:35:37 -05003506}
3507#endif
3508
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03003509/*[clinic input]
3510_ssl._SSLContext._set_alpn_protocols
3511 protos: Py_buffer
3512 /
3513[clinic start generated code]*/
3514
Benjamin Petersoncca27322015-01-23 16:35:37 -05003515static PyObject *
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03003516_ssl__SSLContext__set_alpn_protocols_impl(PySSLContext *self,
3517 Py_buffer *protos)
3518/*[clinic end generated code: output=87599a7f76651a9b input=9bba964595d519be]*/
Benjamin Petersoncca27322015-01-23 16:35:37 -05003519{
Christian Heimes29eab552018-02-25 12:31:33 +01003520#if HAVE_ALPN
Victor Stinner5a615592017-09-14 01:10:30 -07003521 if ((size_t)protos->len > UINT_MAX) {
Segev Finer5cff6372017-07-27 01:19:17 +03003522 PyErr_Format(PyExc_OverflowError,
Serhiy Storchakad53fe5f2019-03-13 22:59:55 +02003523 "protocols longer than %u bytes", UINT_MAX);
Segev Finer5cff6372017-07-27 01:19:17 +03003524 return NULL;
3525 }
3526
Benjamin Petersoncca27322015-01-23 16:35:37 -05003527 PyMem_FREE(self->alpn_protocols);
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03003528 self->alpn_protocols = PyMem_Malloc(protos->len);
Benjamin Petersoncca27322015-01-23 16:35:37 -05003529 if (!self->alpn_protocols)
3530 return PyErr_NoMemory();
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03003531 memcpy(self->alpn_protocols, protos->buf, protos->len);
Segev Finer5cff6372017-07-27 01:19:17 +03003532 self->alpn_protocols_len = (unsigned int)protos->len;
Benjamin Petersoncca27322015-01-23 16:35:37 -05003533
3534 if (SSL_CTX_set_alpn_protos(self->ctx, self->alpn_protocols, self->alpn_protocols_len))
3535 return PyErr_NoMemory();
3536 SSL_CTX_set_alpn_select_cb(self->ctx, _selectALPN_cb, self);
3537
Benjamin Petersoncca27322015-01-23 16:35:37 -05003538 Py_RETURN_NONE;
3539#else
3540 PyErr_SetString(PyExc_NotImplementedError,
3541 "The ALPN extension requires OpenSSL 1.0.2 or later.");
3542 return NULL;
3543#endif
3544}
3545
Antoine Pitrou152efa22010-05-16 18:19:27 +00003546static PyObject *
3547get_verify_mode(PySSLContext *self, void *c)
3548{
Christian Heimes9fb051f2018-09-23 08:32:31 +02003549 /* ignore SSL_VERIFY_CLIENT_ONCE and SSL_VERIFY_POST_HANDSHAKE */
3550 int mask = (SSL_VERIFY_NONE | SSL_VERIFY_PEER |
3551 SSL_VERIFY_FAIL_IF_NO_PEER_CERT);
3552 switch (SSL_CTX_get_verify_mode(self->ctx) & mask) {
Antoine Pitrou152efa22010-05-16 18:19:27 +00003553 case SSL_VERIFY_NONE:
3554 return PyLong_FromLong(PY_SSL_CERT_NONE);
3555 case SSL_VERIFY_PEER:
3556 return PyLong_FromLong(PY_SSL_CERT_OPTIONAL);
3557 case SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT:
3558 return PyLong_FromLong(PY_SSL_CERT_REQUIRED);
3559 }
3560 PyErr_SetString(PySSLErrorObject,
3561 "invalid return value from SSL_CTX_get_verify_mode");
3562 return NULL;
3563}
3564
3565static int
3566set_verify_mode(PySSLContext *self, PyObject *arg, void *c)
3567{
Christian Heimes5fe668c2016-09-12 00:01:11 +02003568 int n;
Antoine Pitrou152efa22010-05-16 18:19:27 +00003569 if (!PyArg_Parse(arg, "i", &n))
3570 return -1;
Christian Heimes5fe668c2016-09-12 00:01:11 +02003571 if (n == PY_SSL_CERT_NONE && self->check_hostname) {
Christian Heimes1aa9a752013-12-02 02:41:19 +01003572 PyErr_SetString(PyExc_ValueError,
3573 "Cannot set verify_mode to CERT_NONE when "
3574 "check_hostname is enabled.");
3575 return -1;
3576 }
Christian Heimes9fb051f2018-09-23 08:32:31 +02003577 return _set_verify_mode(self, n);
Antoine Pitrou152efa22010-05-16 18:19:27 +00003578}
3579
3580static PyObject *
Christian Heimes22587792013-11-21 23:56:13 +01003581get_verify_flags(PySSLContext *self, void *c)
3582{
Christian Heimes598894f2016-09-05 23:19:05 +02003583 X509_VERIFY_PARAM *param;
Christian Heimes22587792013-11-21 23:56:13 +01003584 unsigned long flags;
3585
Christian Heimes61d478c2018-01-27 15:51:38 +01003586 param = SSL_CTX_get0_param(self->ctx);
Christian Heimes598894f2016-09-05 23:19:05 +02003587 flags = X509_VERIFY_PARAM_get_flags(param);
Christian Heimes22587792013-11-21 23:56:13 +01003588 return PyLong_FromUnsignedLong(flags);
3589}
3590
3591static int
3592set_verify_flags(PySSLContext *self, PyObject *arg, void *c)
3593{
Christian Heimes598894f2016-09-05 23:19:05 +02003594 X509_VERIFY_PARAM *param;
Christian Heimes22587792013-11-21 23:56:13 +01003595 unsigned long new_flags, flags, set, clear;
3596
3597 if (!PyArg_Parse(arg, "k", &new_flags))
3598 return -1;
Christian Heimes61d478c2018-01-27 15:51:38 +01003599 param = SSL_CTX_get0_param(self->ctx);
Christian Heimes598894f2016-09-05 23:19:05 +02003600 flags = X509_VERIFY_PARAM_get_flags(param);
Christian Heimes22587792013-11-21 23:56:13 +01003601 clear = flags & ~new_flags;
3602 set = ~flags & new_flags;
3603 if (clear) {
Christian Heimes598894f2016-09-05 23:19:05 +02003604 if (!X509_VERIFY_PARAM_clear_flags(param, clear)) {
Christian Heimes22587792013-11-21 23:56:13 +01003605 _setSSLError(NULL, 0, __FILE__, __LINE__);
3606 return -1;
3607 }
3608 }
3609 if (set) {
Christian Heimes598894f2016-09-05 23:19:05 +02003610 if (!X509_VERIFY_PARAM_set_flags(param, set)) {
Christian Heimes22587792013-11-21 23:56:13 +01003611 _setSSLError(NULL, 0, __FILE__, __LINE__);
3612 return -1;
3613 }
3614 }
3615 return 0;
3616}
3617
Christian Heimes698dde12018-02-27 11:54:43 +01003618/* Getter and setter for protocol version */
3619#if defined(SSL_CTRL_GET_MAX_PROTO_VERSION)
3620
3621
3622static int
3623set_min_max_proto_version(PySSLContext *self, PyObject *arg, int what)
3624{
3625 long v;
3626 int result;
3627
3628 if (!PyArg_Parse(arg, "l", &v))
3629 return -1;
3630 if (v > INT_MAX) {
3631 PyErr_SetString(PyExc_OverflowError, "Option is too long");
3632 return -1;
3633 }
3634
3635 switch(self->protocol) {
3636 case PY_SSL_VERSION_TLS_CLIENT: /* fall through */
3637 case PY_SSL_VERSION_TLS_SERVER: /* fall through */
3638 case PY_SSL_VERSION_TLS:
3639 break;
3640 default:
3641 PyErr_SetString(
3642 PyExc_ValueError,
3643 "The context's protocol doesn't support modification of "
3644 "highest and lowest version."
3645 );
3646 return -1;
3647 }
3648
3649 if (what == 0) {
3650 switch(v) {
3651 case PY_PROTO_MINIMUM_SUPPORTED:
3652 v = 0;
3653 break;
3654 case PY_PROTO_MAXIMUM_SUPPORTED:
3655 /* Emulate max for set_min_proto_version */
3656 v = PY_PROTO_MAXIMUM_AVAILABLE;
3657 break;
3658 default:
3659 break;
3660 }
3661 result = SSL_CTX_set_min_proto_version(self->ctx, v);
3662 }
3663 else {
3664 switch(v) {
3665 case PY_PROTO_MAXIMUM_SUPPORTED:
3666 v = 0;
3667 break;
3668 case PY_PROTO_MINIMUM_SUPPORTED:
3669 /* Emulate max for set_min_proto_version */
3670 v = PY_PROTO_MINIMUM_AVAILABLE;
3671 break;
3672 default:
3673 break;
3674 }
3675 result = SSL_CTX_set_max_proto_version(self->ctx, v);
3676 }
3677 if (result == 0) {
3678 PyErr_Format(PyExc_ValueError,
3679 "Unsupported protocol version 0x%x", v);
3680 return -1;
3681 }
3682 return 0;
3683}
3684
3685static PyObject *
3686get_minimum_version(PySSLContext *self, void *c)
3687{
3688 int v = SSL_CTX_ctrl(self->ctx, SSL_CTRL_GET_MIN_PROTO_VERSION, 0, NULL);
3689 if (v == 0) {
3690 v = PY_PROTO_MINIMUM_SUPPORTED;
3691 }
3692 return PyLong_FromLong(v);
3693}
3694
3695static int
3696set_minimum_version(PySSLContext *self, PyObject *arg, void *c)
3697{
3698 return set_min_max_proto_version(self, arg, 0);
3699}
3700
3701static PyObject *
3702get_maximum_version(PySSLContext *self, void *c)
3703{
3704 int v = SSL_CTX_ctrl(self->ctx, SSL_CTRL_GET_MAX_PROTO_VERSION, 0, NULL);
3705 if (v == 0) {
3706 v = PY_PROTO_MAXIMUM_SUPPORTED;
3707 }
3708 return PyLong_FromLong(v);
3709}
3710
3711static int
3712set_maximum_version(PySSLContext *self, PyObject *arg, void *c)
3713{
3714 return set_min_max_proto_version(self, arg, 1);
3715}
3716#endif /* SSL_CTRL_GET_MAX_PROTO_VERSION */
3717
Christian Heimes78c7d522019-06-03 21:00:10 +02003718#if (OPENSSL_VERSION_NUMBER >= 0x10101000L) && !defined(LIBRESSL_VERSION_NUMBER)
3719static PyObject *
3720get_num_tickets(PySSLContext *self, void *c)
3721{
Victor Stinner76611c72019-07-09 13:30:52 +02003722 return PyLong_FromSize_t(SSL_CTX_get_num_tickets(self->ctx));
Christian Heimes78c7d522019-06-03 21:00:10 +02003723}
3724
3725static int
3726set_num_tickets(PySSLContext *self, PyObject *arg, void *c)
3727{
3728 long num;
3729 if (!PyArg_Parse(arg, "l", &num))
3730 return -1;
3731 if (num < 0) {
3732 PyErr_SetString(PyExc_ValueError, "value must be non-negative");
3733 return -1;
3734 }
3735 if (self->protocol != PY_SSL_VERSION_TLS_SERVER) {
3736 PyErr_SetString(PyExc_ValueError,
3737 "SSLContext is not a server context.");
3738 return -1;
3739 }
3740 if (SSL_CTX_set_num_tickets(self->ctx, num) != 1) {
3741 PyErr_SetString(PyExc_ValueError, "failed to set num tickets.");
3742 return -1;
3743 }
3744 return 0;
3745}
3746
3747PyDoc_STRVAR(PySSLContext_num_tickets_doc,
3748"Control the number of TLSv1.3 session tickets");
3749#endif /* OpenSSL 1.1.1 */
3750
matthewhughes9348e836bb2020-07-17 09:59:15 +01003751#if (OPENSSL_VERSION_NUMBER >= 0x10100000L) && !defined(LIBRESSL_VERSION_NUMBER)
3752static PyObject *
3753get_security_level(PySSLContext *self, void *c)
3754{
3755 return PyLong_FromLong(SSL_CTX_get_security_level(self->ctx));
3756}
3757PyDoc_STRVAR(PySSLContext_security_level_doc, "The current security level");
3758#endif /* OpenSSL 1.1.0 */
3759
Christian Heimes22587792013-11-21 23:56:13 +01003760static PyObject *
Antoine Pitroub5218772010-05-21 09:56:06 +00003761get_options(PySSLContext *self, void *c)
3762{
3763 return PyLong_FromLong(SSL_CTX_get_options(self->ctx));
3764}
3765
3766static int
3767set_options(PySSLContext *self, PyObject *arg, void *c)
3768{
3769 long new_opts, opts, set, clear;
3770 if (!PyArg_Parse(arg, "l", &new_opts))
3771 return -1;
3772 opts = SSL_CTX_get_options(self->ctx);
3773 clear = opts & ~new_opts;
3774 set = ~opts & new_opts;
3775 if (clear) {
3776#ifdef HAVE_SSL_CTX_CLEAR_OPTIONS
3777 SSL_CTX_clear_options(self->ctx, clear);
3778#else
3779 PyErr_SetString(PyExc_ValueError,
3780 "can't clear options before OpenSSL 0.9.8m");
3781 return -1;
3782#endif
3783 }
3784 if (set)
3785 SSL_CTX_set_options(self->ctx, set);
3786 return 0;
3787}
3788
Christian Heimes1aa9a752013-12-02 02:41:19 +01003789static PyObject *
Christian Heimes61d478c2018-01-27 15:51:38 +01003790get_host_flags(PySSLContext *self, void *c)
3791{
3792 return PyLong_FromUnsignedLong(self->hostflags);
3793}
3794
3795static int
3796set_host_flags(PySSLContext *self, PyObject *arg, void *c)
3797{
3798 X509_VERIFY_PARAM *param;
3799 unsigned int new_flags = 0;
3800
3801 if (!PyArg_Parse(arg, "I", &new_flags))
3802 return -1;
3803
3804 param = SSL_CTX_get0_param(self->ctx);
3805 self->hostflags = new_flags;
3806 X509_VERIFY_PARAM_set_hostflags(param, new_flags);
3807 return 0;
3808}
3809
3810static PyObject *
Christian Heimes1aa9a752013-12-02 02:41:19 +01003811get_check_hostname(PySSLContext *self, void *c)
3812{
3813 return PyBool_FromLong(self->check_hostname);
3814}
3815
3816static int
3817set_check_hostname(PySSLContext *self, PyObject *arg, void *c)
3818{
3819 int check_hostname;
3820 if (!PyArg_Parse(arg, "p", &check_hostname))
3821 return -1;
3822 if (check_hostname &&
3823 SSL_CTX_get_verify_mode(self->ctx) == SSL_VERIFY_NONE) {
Christian Heimese82c0342017-09-15 20:29:57 +02003824 /* check_hostname = True sets verify_mode = CERT_REQUIRED */
Christian Heimes9fb051f2018-09-23 08:32:31 +02003825 if (_set_verify_mode(self, PY_SSL_CERT_REQUIRED) == -1) {
Christian Heimese82c0342017-09-15 20:29:57 +02003826 return -1;
3827 }
Christian Heimes1aa9a752013-12-02 02:41:19 +01003828 }
3829 self->check_hostname = check_hostname;
3830 return 0;
3831}
3832
Christian Heimes11a14932018-02-24 02:35:08 +01003833static PyObject *
Christian Heimes9fb051f2018-09-23 08:32:31 +02003834get_post_handshake_auth(PySSLContext *self, void *c) {
3835#if TLS1_3_VERSION
3836 return PyBool_FromLong(self->post_handshake_auth);
3837#else
3838 Py_RETURN_NONE;
3839#endif
3840}
3841
3842#if TLS1_3_VERSION
3843static int
3844set_post_handshake_auth(PySSLContext *self, PyObject *arg, void *c) {
Zackery Spytz842acaa2018-12-17 07:52:45 -07003845 if (arg == NULL) {
3846 PyErr_SetString(PyExc_AttributeError, "cannot delete attribute");
3847 return -1;
3848 }
Christian Heimes9fb051f2018-09-23 08:32:31 +02003849 int pha = PyObject_IsTrue(arg);
3850
3851 if (pha == -1) {
3852 return -1;
3853 }
3854 self->post_handshake_auth = pha;
3855
Christian Heimesf0f59302019-07-01 08:29:17 +02003856 /* bpo-37428: newPySSLSocket() sets SSL_VERIFY_POST_HANDSHAKE flag for
3857 * server sockets and SSL_set_post_handshake_auth() for client. */
Christian Heimes9fb051f2018-09-23 08:32:31 +02003858
3859 return 0;
3860}
3861#endif
3862
3863static PyObject *
Christian Heimes11a14932018-02-24 02:35:08 +01003864get_protocol(PySSLContext *self, void *c) {
3865 return PyLong_FromLong(self->protocol);
3866}
Christian Heimes1aa9a752013-12-02 02:41:19 +01003867
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +02003868typedef struct {
3869 PyThreadState *thread_state;
3870 PyObject *callable;
3871 char *password;
Victor Stinner9ee02032013-06-23 15:08:23 +02003872 int size;
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +02003873 int error;
3874} _PySSLPasswordInfo;
3875
3876static int
3877_pwinfo_set(_PySSLPasswordInfo *pw_info, PyObject* password,
3878 const char *bad_type_error)
3879{
3880 /* Set the password and size fields of a _PySSLPasswordInfo struct
3881 from a unicode, bytes, or byte array object.
3882 The password field will be dynamically allocated and must be freed
3883 by the caller */
3884 PyObject *password_bytes = NULL;
3885 const char *data = NULL;
3886 Py_ssize_t size;
3887
3888 if (PyUnicode_Check(password)) {
Serhiy Storchaka65fb2c02019-05-31 10:39:15 +03003889 password_bytes = PyUnicode_AsUTF8String(password);
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +02003890 if (!password_bytes) {
3891 goto error;
3892 }
3893 data = PyBytes_AS_STRING(password_bytes);
3894 size = PyBytes_GET_SIZE(password_bytes);
3895 } else if (PyBytes_Check(password)) {
3896 data = PyBytes_AS_STRING(password);
3897 size = PyBytes_GET_SIZE(password);
3898 } else if (PyByteArray_Check(password)) {
3899 data = PyByteArray_AS_STRING(password);
3900 size = PyByteArray_GET_SIZE(password);
3901 } else {
3902 PyErr_SetString(PyExc_TypeError, bad_type_error);
3903 goto error;
3904 }
3905
Victor Stinner9ee02032013-06-23 15:08:23 +02003906 if (size > (Py_ssize_t)INT_MAX) {
3907 PyErr_Format(PyExc_ValueError,
3908 "password cannot be longer than %d bytes", INT_MAX);
3909 goto error;
3910 }
3911
Victor Stinner11ebff22013-07-07 17:07:52 +02003912 PyMem_Free(pw_info->password);
3913 pw_info->password = PyMem_Malloc(size);
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +02003914 if (!pw_info->password) {
3915 PyErr_SetString(PyExc_MemoryError,
3916 "unable to allocate password buffer");
3917 goto error;
3918 }
3919 memcpy(pw_info->password, data, size);
Victor Stinner9ee02032013-06-23 15:08:23 +02003920 pw_info->size = (int)size;
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +02003921
3922 Py_XDECREF(password_bytes);
3923 return 1;
3924
3925error:
3926 Py_XDECREF(password_bytes);
3927 return 0;
3928}
3929
3930static int
3931_password_callback(char *buf, int size, int rwflag, void *userdata)
3932{
3933 _PySSLPasswordInfo *pw_info = (_PySSLPasswordInfo*) userdata;
3934 PyObject *fn_ret = NULL;
3935
3936 PySSL_END_ALLOW_THREADS_S(pw_info->thread_state);
3937
3938 if (pw_info->callable) {
Victor Stinnerf17c3de2016-12-06 18:46:19 +01003939 fn_ret = _PyObject_CallNoArg(pw_info->callable);
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +02003940 if (!fn_ret) {
3941 /* TODO: It would be nice to move _ctypes_add_traceback() into the
3942 core python API, so we could use it to add a frame here */
3943 goto error;
3944 }
3945
3946 if (!_pwinfo_set(pw_info, fn_ret,
3947 "password callback must return a string")) {
3948 goto error;
3949 }
3950 Py_CLEAR(fn_ret);
3951 }
3952
3953 if (pw_info->size > size) {
3954 PyErr_Format(PyExc_ValueError,
3955 "password cannot be longer than %d bytes", size);
3956 goto error;
3957 }
3958
3959 PySSL_BEGIN_ALLOW_THREADS_S(pw_info->thread_state);
3960 memcpy(buf, pw_info->password, pw_info->size);
3961 return pw_info->size;
3962
3963error:
3964 Py_XDECREF(fn_ret);
3965 PySSL_BEGIN_ALLOW_THREADS_S(pw_info->thread_state);
3966 pw_info->error = 1;
3967 return -1;
3968}
3969
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03003970/*[clinic input]
3971_ssl._SSLContext.load_cert_chain
3972 certfile: object
Serhiy Storchaka279f4462019-09-14 12:24:05 +03003973 keyfile: object = None
3974 password: object = None
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03003975
3976[clinic start generated code]*/
3977
Antoine Pitroub5218772010-05-21 09:56:06 +00003978static PyObject *
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03003979_ssl__SSLContext_load_cert_chain_impl(PySSLContext *self, PyObject *certfile,
3980 PyObject *keyfile, PyObject *password)
Serhiy Storchaka279f4462019-09-14 12:24:05 +03003981/*[clinic end generated code: output=9480bc1c380e2095 input=30bc7e967ea01a58]*/
Antoine Pitrou152efa22010-05-16 18:19:27 +00003982{
Antoine Pitrou152efa22010-05-16 18:19:27 +00003983 PyObject *certfile_bytes = NULL, *keyfile_bytes = NULL;
Christian Heimes598894f2016-09-05 23:19:05 +02003984 pem_password_cb *orig_passwd_cb = SSL_CTX_get_default_passwd_cb(self->ctx);
3985 void *orig_passwd_userdata = SSL_CTX_get_default_passwd_cb_userdata(self->ctx);
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +02003986 _PySSLPasswordInfo pw_info = { NULL, NULL, NULL, 0, 0 };
Antoine Pitrou152efa22010-05-16 18:19:27 +00003987 int r;
3988
Giampaolo Rodolà745ab382010-08-29 19:25:49 +00003989 errno = 0;
Antoine Pitrou67e8e562010-09-01 20:55:41 +00003990 ERR_clear_error();
Antoine Pitrou152efa22010-05-16 18:19:27 +00003991 if (keyfile == Py_None)
3992 keyfile = NULL;
3993 if (!PyUnicode_FSConverter(certfile, &certfile_bytes)) {
Serhiy Storchaka65fb2c02019-05-31 10:39:15 +03003994 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
3995 PyErr_SetString(PyExc_TypeError,
3996 "certfile should be a valid filesystem path");
3997 }
Antoine Pitrou152efa22010-05-16 18:19:27 +00003998 return NULL;
3999 }
4000 if (keyfile && !PyUnicode_FSConverter(keyfile, &keyfile_bytes)) {
Serhiy Storchaka65fb2c02019-05-31 10:39:15 +03004001 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
4002 PyErr_SetString(PyExc_TypeError,
4003 "keyfile should be a valid filesystem path");
4004 }
Antoine Pitrou152efa22010-05-16 18:19:27 +00004005 goto error;
4006 }
Serhiy Storchaka279f4462019-09-14 12:24:05 +03004007 if (password != Py_None) {
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +02004008 if (PyCallable_Check(password)) {
4009 pw_info.callable = password;
4010 } else if (!_pwinfo_set(&pw_info, password,
4011 "password should be a string or callable")) {
4012 goto error;
4013 }
4014 SSL_CTX_set_default_passwd_cb(self->ctx, _password_callback);
4015 SSL_CTX_set_default_passwd_cb_userdata(self->ctx, &pw_info);
4016 }
4017 PySSL_BEGIN_ALLOW_THREADS_S(pw_info.thread_state);
Antoine Pitrou152efa22010-05-16 18:19:27 +00004018 r = SSL_CTX_use_certificate_chain_file(self->ctx,
4019 PyBytes_AS_STRING(certfile_bytes));
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +02004020 PySSL_END_ALLOW_THREADS_S(pw_info.thread_state);
Antoine Pitrou152efa22010-05-16 18:19:27 +00004021 if (r != 1) {
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +02004022 if (pw_info.error) {
4023 ERR_clear_error();
4024 /* the password callback has already set the error information */
4025 }
4026 else if (errno != 0) {
Giampaolo Rodolàe0f98632010-09-01 19:28:49 +00004027 ERR_clear_error();
Serhiy Storchaka55fe1ae2017-04-16 10:46:38 +03004028 PyErr_SetFromErrno(PyExc_OSError);
Giampaolo Rodolà745ab382010-08-29 19:25:49 +00004029 }
4030 else {
4031 _setSSLError(NULL, 0, __FILE__, __LINE__);
4032 }
Antoine Pitrou152efa22010-05-16 18:19:27 +00004033 goto error;
4034 }
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +02004035 PySSL_BEGIN_ALLOW_THREADS_S(pw_info.thread_state);
Antoine Pitrou9c254862011-04-03 18:15:34 +02004036 r = SSL_CTX_use_PrivateKey_file(self->ctx,
Antoine Pitrou152efa22010-05-16 18:19:27 +00004037 PyBytes_AS_STRING(keyfile ? keyfile_bytes : certfile_bytes),
4038 SSL_FILETYPE_PEM);
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +02004039 PySSL_END_ALLOW_THREADS_S(pw_info.thread_state);
4040 Py_CLEAR(keyfile_bytes);
4041 Py_CLEAR(certfile_bytes);
Antoine Pitrou152efa22010-05-16 18:19:27 +00004042 if (r != 1) {
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +02004043 if (pw_info.error) {
4044 ERR_clear_error();
4045 /* the password callback has already set the error information */
4046 }
4047 else if (errno != 0) {
Giampaolo Rodolàe0f98632010-09-01 19:28:49 +00004048 ERR_clear_error();
Serhiy Storchaka55fe1ae2017-04-16 10:46:38 +03004049 PyErr_SetFromErrno(PyExc_OSError);
Giampaolo Rodolà745ab382010-08-29 19:25:49 +00004050 }
4051 else {
4052 _setSSLError(NULL, 0, __FILE__, __LINE__);
4053 }
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +02004054 goto error;
Antoine Pitrou152efa22010-05-16 18:19:27 +00004055 }
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +02004056 PySSL_BEGIN_ALLOW_THREADS_S(pw_info.thread_state);
Antoine Pitrou152efa22010-05-16 18:19:27 +00004057 r = SSL_CTX_check_private_key(self->ctx);
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +02004058 PySSL_END_ALLOW_THREADS_S(pw_info.thread_state);
Antoine Pitrou152efa22010-05-16 18:19:27 +00004059 if (r != 1) {
4060 _setSSLError(NULL, 0, __FILE__, __LINE__);
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +02004061 goto error;
Antoine Pitrou152efa22010-05-16 18:19:27 +00004062 }
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +02004063 SSL_CTX_set_default_passwd_cb(self->ctx, orig_passwd_cb);
4064 SSL_CTX_set_default_passwd_cb_userdata(self->ctx, orig_passwd_userdata);
Victor Stinner11ebff22013-07-07 17:07:52 +02004065 PyMem_Free(pw_info.password);
Antoine Pitrou152efa22010-05-16 18:19:27 +00004066 Py_RETURN_NONE;
4067
4068error:
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +02004069 SSL_CTX_set_default_passwd_cb(self->ctx, orig_passwd_cb);
4070 SSL_CTX_set_default_passwd_cb_userdata(self->ctx, orig_passwd_userdata);
Victor Stinner11ebff22013-07-07 17:07:52 +02004071 PyMem_Free(pw_info.password);
Antoine Pitrou152efa22010-05-16 18:19:27 +00004072 Py_XDECREF(keyfile_bytes);
4073 Py_XDECREF(certfile_bytes);
4074 return NULL;
4075}
4076
Christian Heimesefff7062013-11-21 03:35:02 +01004077/* internal helper function, returns -1 on error
4078 */
4079static int
Serhiy Storchaka8f87eef2020-04-12 14:58:27 +03004080_add_ca_certs(PySSLContext *self, const void *data, Py_ssize_t len,
Christian Heimesefff7062013-11-21 03:35:02 +01004081 int filetype)
4082{
4083 BIO *biobuf = NULL;
4084 X509_STORE *store;
4085 int retval = 0, err, loaded = 0;
4086
4087 assert(filetype == SSL_FILETYPE_ASN1 || filetype == SSL_FILETYPE_PEM);
4088
4089 if (len <= 0) {
4090 PyErr_SetString(PyExc_ValueError,
4091 "Empty certificate data");
4092 return -1;
4093 } else if (len > INT_MAX) {
4094 PyErr_SetString(PyExc_OverflowError,
4095 "Certificate data is too long.");
4096 return -1;
4097 }
4098
Christian Heimes1dbf61f2013-11-22 00:34:18 +01004099 biobuf = BIO_new_mem_buf(data, (int)len);
Christian Heimesefff7062013-11-21 03:35:02 +01004100 if (biobuf == NULL) {
4101 _setSSLError("Can't allocate buffer", 0, __FILE__, __LINE__);
4102 return -1;
4103 }
4104
4105 store = SSL_CTX_get_cert_store(self->ctx);
4106 assert(store != NULL);
4107
4108 while (1) {
4109 X509 *cert = NULL;
4110 int r;
4111
4112 if (filetype == SSL_FILETYPE_ASN1) {
4113 cert = d2i_X509_bio(biobuf, NULL);
4114 } else {
4115 cert = PEM_read_bio_X509(biobuf, NULL,
Christian Heimes598894f2016-09-05 23:19:05 +02004116 SSL_CTX_get_default_passwd_cb(self->ctx),
4117 SSL_CTX_get_default_passwd_cb_userdata(self->ctx)
4118 );
Christian Heimesefff7062013-11-21 03:35:02 +01004119 }
4120 if (cert == NULL) {
4121 break;
4122 }
4123 r = X509_STORE_add_cert(store, cert);
4124 X509_free(cert);
4125 if (!r) {
4126 err = ERR_peek_last_error();
4127 if ((ERR_GET_LIB(err) == ERR_LIB_X509) &&
4128 (ERR_GET_REASON(err) == X509_R_CERT_ALREADY_IN_HASH_TABLE)) {
4129 /* cert already in hash table, not an error */
4130 ERR_clear_error();
4131 } else {
4132 break;
4133 }
4134 }
4135 loaded++;
4136 }
4137
4138 err = ERR_peek_last_error();
4139 if ((filetype == SSL_FILETYPE_ASN1) &&
4140 (loaded > 0) &&
4141 (ERR_GET_LIB(err) == ERR_LIB_ASN1) &&
4142 (ERR_GET_REASON(err) == ASN1_R_HEADER_TOO_LONG)) {
4143 /* EOF ASN1 file, not an error */
4144 ERR_clear_error();
4145 retval = 0;
4146 } else if ((filetype == SSL_FILETYPE_PEM) &&
4147 (loaded > 0) &&
4148 (ERR_GET_LIB(err) == ERR_LIB_PEM) &&
4149 (ERR_GET_REASON(err) == PEM_R_NO_START_LINE)) {
4150 /* EOF PEM file, not an error */
4151 ERR_clear_error();
4152 retval = 0;
4153 } else {
4154 _setSSLError(NULL, 0, __FILE__, __LINE__);
4155 retval = -1;
4156 }
4157
4158 BIO_free(biobuf);
4159 return retval;
4160}
4161
4162
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004163/*[clinic input]
4164_ssl._SSLContext.load_verify_locations
Serhiy Storchaka279f4462019-09-14 12:24:05 +03004165 cafile: object = None
4166 capath: object = None
4167 cadata: object = None
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004168
4169[clinic start generated code]*/
4170
Antoine Pitrou152efa22010-05-16 18:19:27 +00004171static PyObject *
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004172_ssl__SSLContext_load_verify_locations_impl(PySSLContext *self,
4173 PyObject *cafile,
4174 PyObject *capath,
4175 PyObject *cadata)
Serhiy Storchaka279f4462019-09-14 12:24:05 +03004176/*[clinic end generated code: output=454c7e41230ca551 input=42ecfe258233e194]*/
Antoine Pitrou152efa22010-05-16 18:19:27 +00004177{
Antoine Pitrou152efa22010-05-16 18:19:27 +00004178 PyObject *cafile_bytes = NULL, *capath_bytes = NULL;
4179 const char *cafile_buf = NULL, *capath_buf = NULL;
Christian Heimesefff7062013-11-21 03:35:02 +01004180 int r = 0, ok = 1;
Antoine Pitrou152efa22010-05-16 18:19:27 +00004181
Giampaolo Rodolà745ab382010-08-29 19:25:49 +00004182 errno = 0;
Antoine Pitrou152efa22010-05-16 18:19:27 +00004183 if (cafile == Py_None)
4184 cafile = NULL;
4185 if (capath == Py_None)
4186 capath = NULL;
Christian Heimesefff7062013-11-21 03:35:02 +01004187 if (cadata == Py_None)
4188 cadata = NULL;
4189
4190 if (cafile == NULL && capath == NULL && cadata == NULL) {
Antoine Pitrou152efa22010-05-16 18:19:27 +00004191 PyErr_SetString(PyExc_TypeError,
Christian Heimesefff7062013-11-21 03:35:02 +01004192 "cafile, capath and cadata cannot be all omitted");
4193 goto error;
Antoine Pitrou152efa22010-05-16 18:19:27 +00004194 }
4195 if (cafile && !PyUnicode_FSConverter(cafile, &cafile_bytes)) {
Serhiy Storchaka65fb2c02019-05-31 10:39:15 +03004196 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
4197 PyErr_SetString(PyExc_TypeError,
4198 "cafile should be a valid filesystem path");
4199 }
Christian Heimesefff7062013-11-21 03:35:02 +01004200 goto error;
Antoine Pitrou152efa22010-05-16 18:19:27 +00004201 }
4202 if (capath && !PyUnicode_FSConverter(capath, &capath_bytes)) {
Serhiy Storchaka65fb2c02019-05-31 10:39:15 +03004203 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
4204 PyErr_SetString(PyExc_TypeError,
4205 "capath should be a valid filesystem path");
4206 }
Christian Heimesefff7062013-11-21 03:35:02 +01004207 goto error;
Antoine Pitrou152efa22010-05-16 18:19:27 +00004208 }
Christian Heimesefff7062013-11-21 03:35:02 +01004209
4210 /* validata cadata type and load cadata */
4211 if (cadata) {
Serhiy Storchaka65fb2c02019-05-31 10:39:15 +03004212 if (PyUnicode_Check(cadata)) {
4213 PyObject *cadata_ascii = PyUnicode_AsASCIIString(cadata);
4214 if (cadata_ascii == NULL) {
4215 if (PyErr_ExceptionMatches(PyExc_UnicodeEncodeError)) {
4216 goto invalid_cadata;
4217 }
4218 goto error;
4219 }
4220 r = _add_ca_certs(self,
4221 PyBytes_AS_STRING(cadata_ascii),
4222 PyBytes_GET_SIZE(cadata_ascii),
4223 SSL_FILETYPE_PEM);
4224 Py_DECREF(cadata_ascii);
4225 if (r == -1) {
4226 goto error;
4227 }
4228 }
4229 else if (PyObject_CheckBuffer(cadata)) {
4230 Py_buffer buf;
4231 if (PyObject_GetBuffer(cadata, &buf, PyBUF_SIMPLE)) {
4232 goto error;
4233 }
Christian Heimesefff7062013-11-21 03:35:02 +01004234 if (!PyBuffer_IsContiguous(&buf, 'C') || buf.ndim > 1) {
4235 PyBuffer_Release(&buf);
4236 PyErr_SetString(PyExc_TypeError,
4237 "cadata should be a contiguous buffer with "
4238 "a single dimension");
4239 goto error;
4240 }
4241 r = _add_ca_certs(self, buf.buf, buf.len, SSL_FILETYPE_ASN1);
4242 PyBuffer_Release(&buf);
4243 if (r == -1) {
4244 goto error;
4245 }
Serhiy Storchaka65fb2c02019-05-31 10:39:15 +03004246 }
4247 else {
4248 invalid_cadata:
4249 PyErr_SetString(PyExc_TypeError,
4250 "cadata should be an ASCII string or a "
4251 "bytes-like object");
4252 goto error;
Christian Heimesefff7062013-11-21 03:35:02 +01004253 }
4254 }
4255
4256 /* load cafile or capath */
4257 if (cafile || capath) {
4258 if (cafile)
4259 cafile_buf = PyBytes_AS_STRING(cafile_bytes);
4260 if (capath)
4261 capath_buf = PyBytes_AS_STRING(capath_bytes);
4262 PySSL_BEGIN_ALLOW_THREADS
4263 r = SSL_CTX_load_verify_locations(self->ctx, cafile_buf, capath_buf);
4264 PySSL_END_ALLOW_THREADS
4265 if (r != 1) {
Christian Heimesefff7062013-11-21 03:35:02 +01004266 if (errno != 0) {
4267 ERR_clear_error();
Serhiy Storchaka55fe1ae2017-04-16 10:46:38 +03004268 PyErr_SetFromErrno(PyExc_OSError);
Christian Heimesefff7062013-11-21 03:35:02 +01004269 }
4270 else {
4271 _setSSLError(NULL, 0, __FILE__, __LINE__);
4272 }
4273 goto error;
4274 }
4275 }
4276 goto end;
4277
4278 error:
4279 ok = 0;
4280 end:
Antoine Pitrou152efa22010-05-16 18:19:27 +00004281 Py_XDECREF(cafile_bytes);
4282 Py_XDECREF(capath_bytes);
Christian Heimesefff7062013-11-21 03:35:02 +01004283 if (ok) {
4284 Py_RETURN_NONE;
4285 } else {
Antoine Pitrou152efa22010-05-16 18:19:27 +00004286 return NULL;
4287 }
Antoine Pitrou152efa22010-05-16 18:19:27 +00004288}
4289
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004290/*[clinic input]
4291_ssl._SSLContext.load_dh_params
4292 path as filepath: object
4293 /
4294
4295[clinic start generated code]*/
4296
Antoine Pitrou152efa22010-05-16 18:19:27 +00004297static PyObject *
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004298_ssl__SSLContext_load_dh_params(PySSLContext *self, PyObject *filepath)
4299/*[clinic end generated code: output=1c8e57a38e055af0 input=c8871f3c796ae1d6]*/
Antoine Pitrou0e576f12011-12-22 10:03:38 +01004300{
4301 FILE *f;
4302 DH *dh;
4303
Victor Stinnerdaf45552013-08-28 00:53:59 +02004304 f = _Py_fopen_obj(filepath, "rb");
Victor Stinnere42ccd22015-03-18 01:39:23 +01004305 if (f == NULL)
Antoine Pitrou0e576f12011-12-22 10:03:38 +01004306 return NULL;
Victor Stinnere42ccd22015-03-18 01:39:23 +01004307
Antoine Pitrou0e576f12011-12-22 10:03:38 +01004308 errno = 0;
4309 PySSL_BEGIN_ALLOW_THREADS
4310 dh = PEM_read_DHparams(f, NULL, NULL, NULL);
Antoine Pitrou457a2292013-01-12 21:43:45 +01004311 fclose(f);
Antoine Pitrou0e576f12011-12-22 10:03:38 +01004312 PySSL_END_ALLOW_THREADS
4313 if (dh == NULL) {
4314 if (errno != 0) {
4315 ERR_clear_error();
4316 PyErr_SetFromErrnoWithFilenameObject(PyExc_OSError, filepath);
4317 }
4318 else {
4319 _setSSLError(NULL, 0, __FILE__, __LINE__);
4320 }
4321 return NULL;
4322 }
Zackery Spytzaebc0492020-07-07 22:21:58 -06004323 if (!SSL_CTX_set_tmp_dh(self->ctx, dh)) {
4324 DH_free(dh);
4325 return _setSSLError(NULL, 0, __FILE__, __LINE__);
4326 }
Antoine Pitrou0e576f12011-12-22 10:03:38 +01004327 DH_free(dh);
4328 Py_RETURN_NONE;
4329}
4330
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004331/*[clinic input]
4332_ssl._SSLContext._wrap_socket
4333 sock: object(subclass_of="PySocketModule.Sock_Type")
4334 server_side: int
4335 server_hostname as hostname_obj: object = None
Christian Heimes141c5e82018-02-24 21:10:57 +01004336 *
4337 owner: object = None
4338 session: object = None
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004339
4340[clinic start generated code]*/
4341
Antoine Pitrou0e576f12011-12-22 10:03:38 +01004342static PyObject *
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004343_ssl__SSLContext__wrap_socket_impl(PySSLContext *self, PyObject *sock,
Christian Heimes141c5e82018-02-24 21:10:57 +01004344 int server_side, PyObject *hostname_obj,
4345 PyObject *owner, PyObject *session)
4346/*[clinic end generated code: output=f103f238633940b4 input=957d5006183d1894]*/
Antoine Pitrou152efa22010-05-16 18:19:27 +00004347{
Antoine Pitroud5323212010-10-22 18:19:07 +00004348 char *hostname = NULL;
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004349 PyObject *res;
Antoine Pitrou152efa22010-05-16 18:19:27 +00004350
Antoine Pitroud5323212010-10-22 18:19:07 +00004351 /* server_hostname is either None (or absent), or to be encoded
Christian Heimesd02ac252018-03-25 12:36:13 +02004352 as IDN A-label (ASCII str) without NULL bytes. */
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004353 if (hostname_obj != Py_None) {
Christian Heimes11a14932018-02-24 02:35:08 +01004354 if (!PyArg_Parse(hostname_obj, "es", "ascii", &hostname))
Antoine Pitroud5323212010-10-22 18:19:07 +00004355 return NULL;
Antoine Pitroud5323212010-10-22 18:19:07 +00004356 }
Antoine Pitrou152efa22010-05-16 18:19:27 +00004357
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004358 res = (PyObject *) newPySSLSocket(self, (PySocketSockObject *)sock,
4359 server_side, hostname,
Christian Heimes141c5e82018-02-24 21:10:57 +01004360 owner, session,
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004361 NULL, NULL);
Antoine Pitroud5323212010-10-22 18:19:07 +00004362 if (hostname != NULL)
4363 PyMem_Free(hostname);
4364 return res;
Antoine Pitrou152efa22010-05-16 18:19:27 +00004365}
4366
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004367/*[clinic input]
4368_ssl._SSLContext._wrap_bio
4369 incoming: object(subclass_of="&PySSLMemoryBIO_Type", type="PySSLMemoryBIO *")
4370 outgoing: object(subclass_of="&PySSLMemoryBIO_Type", type="PySSLMemoryBIO *")
4371 server_side: int
4372 server_hostname as hostname_obj: object = None
Christian Heimes141c5e82018-02-24 21:10:57 +01004373 *
4374 owner: object = None
4375 session: object = None
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004376
4377[clinic start generated code]*/
4378
Antoine Pitroub0182c82010-10-12 20:09:02 +00004379static PyObject *
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004380_ssl__SSLContext__wrap_bio_impl(PySSLContext *self, PySSLMemoryBIO *incoming,
4381 PySSLMemoryBIO *outgoing, int server_side,
Christian Heimes141c5e82018-02-24 21:10:57 +01004382 PyObject *hostname_obj, PyObject *owner,
4383 PyObject *session)
4384/*[clinic end generated code: output=5c5d6d9b41f99332 input=8cf22f4d586ac56a]*/
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004385{
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004386 char *hostname = NULL;
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004387 PyObject *res;
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004388
4389 /* server_hostname is either None (or absent), or to be encoded
Christian Heimesd02ac252018-03-25 12:36:13 +02004390 as IDN A-label (ASCII str) without NULL bytes. */
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004391 if (hostname_obj != Py_None) {
Christian Heimes11a14932018-02-24 02:35:08 +01004392 if (!PyArg_Parse(hostname_obj, "es", "ascii", &hostname))
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004393 return NULL;
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004394 }
4395
4396 res = (PyObject *) newPySSLSocket(self, NULL, server_side, hostname,
Christian Heimes141c5e82018-02-24 21:10:57 +01004397 owner, session,
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004398 incoming, outgoing);
4399
4400 PyMem_Free(hostname);
4401 return res;
4402}
4403
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004404/*[clinic input]
4405_ssl._SSLContext.session_stats
4406[clinic start generated code]*/
4407
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004408static PyObject *
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004409_ssl__SSLContext_session_stats_impl(PySSLContext *self)
4410/*[clinic end generated code: output=0d96411c42893bfb input=7e0a81fb11102c8b]*/
Antoine Pitroub0182c82010-10-12 20:09:02 +00004411{
4412 int r;
4413 PyObject *value, *stats = PyDict_New();
4414 if (!stats)
4415 return NULL;
4416
4417#define ADD_STATS(SSL_NAME, KEY_NAME) \
4418 value = PyLong_FromLong(SSL_CTX_sess_ ## SSL_NAME (self->ctx)); \
4419 if (value == NULL) \
4420 goto error; \
4421 r = PyDict_SetItemString(stats, KEY_NAME, value); \
4422 Py_DECREF(value); \
4423 if (r < 0) \
4424 goto error;
4425
4426 ADD_STATS(number, "number");
4427 ADD_STATS(connect, "connect");
4428 ADD_STATS(connect_good, "connect_good");
4429 ADD_STATS(connect_renegotiate, "connect_renegotiate");
4430 ADD_STATS(accept, "accept");
4431 ADD_STATS(accept_good, "accept_good");
4432 ADD_STATS(accept_renegotiate, "accept_renegotiate");
4433 ADD_STATS(accept, "accept");
4434 ADD_STATS(hits, "hits");
4435 ADD_STATS(misses, "misses");
4436 ADD_STATS(timeouts, "timeouts");
4437 ADD_STATS(cache_full, "cache_full");
4438
4439#undef ADD_STATS
4440
4441 return stats;
4442
4443error:
4444 Py_DECREF(stats);
4445 return NULL;
4446}
4447
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004448/*[clinic input]
4449_ssl._SSLContext.set_default_verify_paths
4450[clinic start generated code]*/
4451
Antoine Pitrou664c2d12010-11-17 20:29:42 +00004452static PyObject *
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004453_ssl__SSLContext_set_default_verify_paths_impl(PySSLContext *self)
4454/*[clinic end generated code: output=0bee74e6e09deaaa input=35f3408021463d74]*/
Antoine Pitrou664c2d12010-11-17 20:29:42 +00004455{
4456 if (!SSL_CTX_set_default_verify_paths(self->ctx)) {
4457 _setSSLError(NULL, 0, __FILE__, __LINE__);
4458 return NULL;
4459 }
4460 Py_RETURN_NONE;
4461}
4462
Antoine Pitrou501da612011-12-21 09:27:41 +01004463#ifndef OPENSSL_NO_ECDH
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004464/*[clinic input]
4465_ssl._SSLContext.set_ecdh_curve
4466 name: object
4467 /
4468
4469[clinic start generated code]*/
4470
Antoine Pitrou923df6f2011-12-19 17:16:51 +01004471static PyObject *
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004472_ssl__SSLContext_set_ecdh_curve(PySSLContext *self, PyObject *name)
4473/*[clinic end generated code: output=23022c196e40d7d2 input=c2bafb6f6e34726b]*/
Antoine Pitrou923df6f2011-12-19 17:16:51 +01004474{
4475 PyObject *name_bytes;
4476 int nid;
4477 EC_KEY *key;
4478
4479 if (!PyUnicode_FSConverter(name, &name_bytes))
4480 return NULL;
4481 assert(PyBytes_Check(name_bytes));
4482 nid = OBJ_sn2nid(PyBytes_AS_STRING(name_bytes));
4483 Py_DECREF(name_bytes);
4484 if (nid == 0) {
4485 PyErr_Format(PyExc_ValueError,
4486 "unknown elliptic curve name %R", name);
4487 return NULL;
4488 }
4489 key = EC_KEY_new_by_curve_name(nid);
4490 if (key == NULL) {
4491 _setSSLError(NULL, 0, __FILE__, __LINE__);
4492 return NULL;
4493 }
4494 SSL_CTX_set_tmp_ecdh(self->ctx, key);
4495 EC_KEY_free(key);
4496 Py_RETURN_NONE;
4497}
Antoine Pitrou501da612011-12-21 09:27:41 +01004498#endif
Antoine Pitrou923df6f2011-12-19 17:16:51 +01004499
Antoine Pitrou912fbff2013-03-30 16:29:32 +01004500#if HAVE_SNI && !defined(OPENSSL_NO_TLSEXT)
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004501static int
4502_servername_callback(SSL *s, int *al, void *args)
4503{
4504 int ret;
4505 PySSLContext *ssl_ctx = (PySSLContext *) args;
4506 PySSLSocket *ssl;
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004507 PyObject *result;
4508 /* The high-level ssl.SSLSocket object */
4509 PyObject *ssl_socket;
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004510 const char *servername = SSL_get_servername(s, TLSEXT_NAMETYPE_host_name);
Stefan Krah20d60802013-01-17 17:07:17 +01004511 PyGILState_STATE gstate = PyGILState_Ensure();
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004512
Christian Heimes11a14932018-02-24 02:35:08 +01004513 if (ssl_ctx->set_sni_cb == NULL) {
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004514 /* remove race condition in this the call back while if removing the
4515 * callback is in progress */
4516 PyGILState_Release(gstate);
Antoine Pitrou5dd12a52013-01-06 15:25:36 +01004517 return SSL_TLSEXT_ERR_OK;
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004518 }
4519
4520 ssl = SSL_get_app_data(s);
4521 assert(PySSLSocket_Check(ssl));
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004522
Serhiy Storchakaf51d7152015-11-02 14:40:41 +02004523 /* The servername callback expects an argument that represents the current
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004524 * SSL connection and that has a .context attribute that can be changed to
4525 * identify the requested hostname. Since the official API is the Python
4526 * level API we want to pass the callback a Python level object rather than
4527 * a _ssl.SSLSocket instance. If there's an "owner" (typically an
4528 * SSLObject) that will be passed. Otherwise if there's a socket then that
4529 * will be passed. If both do not exist only then the C-level object is
4530 * passed. */
4531 if (ssl->owner)
4532 ssl_socket = PyWeakref_GetObject(ssl->owner);
4533 else if (ssl->Socket)
4534 ssl_socket = PyWeakref_GetObject(ssl->Socket);
4535 else
4536 ssl_socket = (PyObject *) ssl;
4537
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004538 Py_INCREF(ssl_socket);
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004539 if (ssl_socket == Py_None)
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004540 goto error;
Victor Stinner7e001512013-06-25 00:44:31 +02004541
Antoine Pitrou50b24d02013-04-11 20:48:42 +02004542 if (servername == NULL) {
Christian Heimes11a14932018-02-24 02:35:08 +01004543 result = PyObject_CallFunctionObjArgs(ssl_ctx->set_sni_cb, ssl_socket,
Antoine Pitrou50b24d02013-04-11 20:48:42 +02004544 Py_None, ssl_ctx, NULL);
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004545 }
Antoine Pitrou50b24d02013-04-11 20:48:42 +02004546 else {
Christian Heimes11a14932018-02-24 02:35:08 +01004547 PyObject *servername_bytes;
4548 PyObject *servername_str;
4549
4550 servername_bytes = PyBytes_FromString(servername);
4551 if (servername_bytes == NULL) {
Antoine Pitrou50b24d02013-04-11 20:48:42 +02004552 PyErr_WriteUnraisable((PyObject *) ssl_ctx);
4553 goto error;
4554 }
Christian Heimes11a14932018-02-24 02:35:08 +01004555 /* server_hostname was encoded to an A-label by our caller; put it
4556 * back into a str object, but still as an A-label (bpo-28414)
4557 */
4558 servername_str = PyUnicode_FromEncodedObject(servername_bytes, "ascii", NULL);
Christian Heimes11a14932018-02-24 02:35:08 +01004559 if (servername_str == NULL) {
4560 PyErr_WriteUnraisable(servername_bytes);
Zackery Spytzee96f322020-07-09 04:00:21 -06004561 Py_DECREF(servername_bytes);
Antoine Pitrou50b24d02013-04-11 20:48:42 +02004562 goto error;
4563 }
Zackery Spytzee96f322020-07-09 04:00:21 -06004564 Py_DECREF(servername_bytes);
Christian Heimes11a14932018-02-24 02:35:08 +01004565 result = PyObject_CallFunctionObjArgs(
4566 ssl_ctx->set_sni_cb, ssl_socket, servername_str,
4567 ssl_ctx, NULL);
4568 Py_DECREF(servername_str);
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004569 }
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004570 Py_DECREF(ssl_socket);
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004571
4572 if (result == NULL) {
Christian Heimes11a14932018-02-24 02:35:08 +01004573 PyErr_WriteUnraisable(ssl_ctx->set_sni_cb);
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004574 *al = SSL_AD_HANDSHAKE_FAILURE;
4575 ret = SSL_TLSEXT_ERR_ALERT_FATAL;
4576 }
4577 else {
Christian Heimes11a14932018-02-24 02:35:08 +01004578 /* Result may be None, a SSLContext or an integer
4579 * None and SSLContext are OK, integer or other values are an error.
4580 */
4581 if (result == Py_None) {
4582 ret = SSL_TLSEXT_ERR_OK;
4583 } else {
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004584 *al = (int) PyLong_AsLong(result);
4585 if (PyErr_Occurred()) {
4586 PyErr_WriteUnraisable(result);
4587 *al = SSL_AD_INTERNAL_ERROR;
4588 }
4589 ret = SSL_TLSEXT_ERR_ALERT_FATAL;
4590 }
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004591 Py_DECREF(result);
4592 }
4593
4594 PyGILState_Release(gstate);
4595 return ret;
4596
4597error:
4598 Py_DECREF(ssl_socket);
4599 *al = SSL_AD_INTERNAL_ERROR;
4600 ret = SSL_TLSEXT_ERR_ALERT_FATAL;
4601 PyGILState_Release(gstate);
4602 return ret;
4603}
Antoine Pitroua5963382013-03-30 16:39:00 +01004604#endif
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004605
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004606static PyObject *
Christian Heimes11a14932018-02-24 02:35:08 +01004607get_sni_callback(PySSLContext *self, void *c)
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004608{
Christian Heimes11a14932018-02-24 02:35:08 +01004609 PyObject *cb = self->set_sni_cb;
4610 if (cb == NULL) {
4611 Py_RETURN_NONE;
4612 }
4613 Py_INCREF(cb);
4614 return cb;
4615}
4616
4617static int
4618set_sni_callback(PySSLContext *self, PyObject *arg, void *c)
4619{
4620 if (self->protocol == PY_SSL_VERSION_TLS_CLIENT) {
4621 PyErr_SetString(PyExc_ValueError,
4622 "sni_callback cannot be set on TLS_CLIENT context");
4623 return -1;
4624 }
Antoine Pitrou912fbff2013-03-30 16:29:32 +01004625#if HAVE_SNI && !defined(OPENSSL_NO_TLSEXT)
Christian Heimes11a14932018-02-24 02:35:08 +01004626 Py_CLEAR(self->set_sni_cb);
4627 if (arg == Py_None) {
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004628 SSL_CTX_set_tlsext_servername_callback(self->ctx, NULL);
4629 }
4630 else {
Christian Heimes11a14932018-02-24 02:35:08 +01004631 if (!PyCallable_Check(arg)) {
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004632 SSL_CTX_set_tlsext_servername_callback(self->ctx, NULL);
4633 PyErr_SetString(PyExc_TypeError,
4634 "not a callable object");
Christian Heimes11a14932018-02-24 02:35:08 +01004635 return -1;
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004636 }
Christian Heimes11a14932018-02-24 02:35:08 +01004637 Py_INCREF(arg);
4638 self->set_sni_cb = arg;
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004639 SSL_CTX_set_tlsext_servername_callback(self->ctx, _servername_callback);
4640 SSL_CTX_set_tlsext_servername_arg(self->ctx, self);
4641 }
Christian Heimes11a14932018-02-24 02:35:08 +01004642 return 0;
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004643#else
4644 PyErr_SetString(PyExc_NotImplementedError,
4645 "The TLS extension servername callback, "
4646 "SSL_CTX_set_tlsext_servername_callback, "
4647 "is not in the current OpenSSL library.");
Christian Heimes11a14932018-02-24 02:35:08 +01004648 return -1;
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004649#endif
4650}
4651
Christian Heimes11a14932018-02-24 02:35:08 +01004652PyDoc_STRVAR(PySSLContext_sni_callback_doc,
4653"Set a callback that will be called when a server name is provided by the SSL/TLS client in the SNI extension.\n\
4654\n\
4655If the argument is None then the callback is disabled. The method is called\n\
4656with the SSLSocket, the server name as a string, and the SSLContext object.\n\
4657See RFC 6066 for details of the SNI extension.");
4658
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004659/*[clinic input]
4660_ssl._SSLContext.cert_store_stats
4661
4662Returns quantities of loaded X.509 certificates.
4663
4664X.509 certificates with a CA extension and certificate revocation lists
4665inside the context's cert store.
4666
4667NOTE: Certificates in a capath directory aren't loaded unless they have
4668been used at least once.
4669[clinic start generated code]*/
Christian Heimes9a5395a2013-06-17 15:44:12 +02004670
4671static PyObject *
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004672_ssl__SSLContext_cert_store_stats_impl(PySSLContext *self)
4673/*[clinic end generated code: output=5f356f4d9cca874d input=eb40dd0f6d0e40cf]*/
Christian Heimes9a5395a2013-06-17 15:44:12 +02004674{
4675 X509_STORE *store;
Christian Heimes598894f2016-09-05 23:19:05 +02004676 STACK_OF(X509_OBJECT) *objs;
Christian Heimes9a5395a2013-06-17 15:44:12 +02004677 X509_OBJECT *obj;
Christian Heimes598894f2016-09-05 23:19:05 +02004678 int x509 = 0, crl = 0, ca = 0, i;
Christian Heimes9a5395a2013-06-17 15:44:12 +02004679
4680 store = SSL_CTX_get_cert_store(self->ctx);
Christian Heimes598894f2016-09-05 23:19:05 +02004681 objs = X509_STORE_get0_objects(store);
4682 for (i = 0; i < sk_X509_OBJECT_num(objs); i++) {
4683 obj = sk_X509_OBJECT_value(objs, i);
4684 switch (X509_OBJECT_get_type(obj)) {
Christian Heimes9a5395a2013-06-17 15:44:12 +02004685 case X509_LU_X509:
4686 x509++;
Christian Heimes598894f2016-09-05 23:19:05 +02004687 if (X509_check_ca(X509_OBJECT_get0_X509(obj))) {
Christian Heimes9a5395a2013-06-17 15:44:12 +02004688 ca++;
4689 }
4690 break;
4691 case X509_LU_CRL:
4692 crl++;
4693 break;
Christian Heimes9a5395a2013-06-17 15:44:12 +02004694 default:
4695 /* Ignore X509_LU_FAIL, X509_LU_RETRY, X509_LU_PKEY.
4696 * As far as I can tell they are internal states and never
4697 * stored in a cert store */
4698 break;
4699 }
4700 }
4701 return Py_BuildValue("{sisisi}", "x509", x509, "crl", crl,
4702 "x509_ca", ca);
4703}
4704
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004705/*[clinic input]
4706_ssl._SSLContext.get_ca_certs
4707 binary_form: bool = False
4708
4709Returns a list of dicts with information of loaded CA certs.
4710
4711If the optional argument is True, returns a DER-encoded copy of the CA
4712certificate.
4713
4714NOTE: Certificates in a capath directory aren't loaded unless they have
4715been used at least once.
4716[clinic start generated code]*/
Christian Heimes9a5395a2013-06-17 15:44:12 +02004717
4718static PyObject *
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004719_ssl__SSLContext_get_ca_certs_impl(PySSLContext *self, int binary_form)
4720/*[clinic end generated code: output=0d58f148f37e2938 input=6887b5a09b7f9076]*/
Christian Heimes9a5395a2013-06-17 15:44:12 +02004721{
4722 X509_STORE *store;
Christian Heimes598894f2016-09-05 23:19:05 +02004723 STACK_OF(X509_OBJECT) *objs;
Christian Heimes9a5395a2013-06-17 15:44:12 +02004724 PyObject *ci = NULL, *rlist = NULL;
4725 int i;
Christian Heimes9a5395a2013-06-17 15:44:12 +02004726
4727 if ((rlist = PyList_New(0)) == NULL) {
4728 return NULL;
4729 }
4730
4731 store = SSL_CTX_get_cert_store(self->ctx);
Christian Heimes598894f2016-09-05 23:19:05 +02004732 objs = X509_STORE_get0_objects(store);
4733 for (i = 0; i < sk_X509_OBJECT_num(objs); i++) {
Christian Heimes9a5395a2013-06-17 15:44:12 +02004734 X509_OBJECT *obj;
4735 X509 *cert;
4736
Christian Heimes598894f2016-09-05 23:19:05 +02004737 obj = sk_X509_OBJECT_value(objs, i);
4738 if (X509_OBJECT_get_type(obj) != X509_LU_X509) {
Christian Heimes9a5395a2013-06-17 15:44:12 +02004739 /* not a x509 cert */
4740 continue;
4741 }
4742 /* CA for any purpose */
Christian Heimes598894f2016-09-05 23:19:05 +02004743 cert = X509_OBJECT_get0_X509(obj);
Christian Heimes9a5395a2013-06-17 15:44:12 +02004744 if (!X509_check_ca(cert)) {
4745 continue;
4746 }
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004747 if (binary_form) {
Christian Heimes9a5395a2013-06-17 15:44:12 +02004748 ci = _certificate_to_der(cert);
4749 } else {
4750 ci = _decode_certificate(cert);
4751 }
4752 if (ci == NULL) {
4753 goto error;
4754 }
4755 if (PyList_Append(rlist, ci) == -1) {
4756 goto error;
4757 }
4758 Py_CLEAR(ci);
4759 }
4760 return rlist;
4761
4762 error:
4763 Py_XDECREF(ci);
4764 Py_XDECREF(rlist);
4765 return NULL;
4766}
4767
4768
Antoine Pitrou152efa22010-05-16 18:19:27 +00004769static PyGetSetDef context_getsetlist[] = {
Christian Heimes1aa9a752013-12-02 02:41:19 +01004770 {"check_hostname", (getter) get_check_hostname,
4771 (setter) set_check_hostname, NULL},
Christian Heimes61d478c2018-01-27 15:51:38 +01004772 {"_host_flags", (getter) get_host_flags,
4773 (setter) set_host_flags, NULL},
Christian Heimes698dde12018-02-27 11:54:43 +01004774#if SSL_CTRL_GET_MAX_PROTO_VERSION
4775 {"minimum_version", (getter) get_minimum_version,
4776 (setter) set_minimum_version, NULL},
4777 {"maximum_version", (getter) get_maximum_version,
4778 (setter) set_maximum_version, NULL},
4779#endif
Christian Heimesc7f70692019-05-31 11:44:05 +02004780#ifdef HAVE_OPENSSL_KEYLOG
4781 {"keylog_filename", (getter) _PySSLContext_get_keylog_filename,
4782 (setter) _PySSLContext_set_keylog_filename, NULL},
4783#endif
4784 {"_msg_callback", (getter) _PySSLContext_get_msg_callback,
4785 (setter) _PySSLContext_set_msg_callback, NULL},
Christian Heimes11a14932018-02-24 02:35:08 +01004786 {"sni_callback", (getter) get_sni_callback,
Christian Heimes698dde12018-02-27 11:54:43 +01004787 (setter) set_sni_callback, PySSLContext_sni_callback_doc},
Christian Heimes78c7d522019-06-03 21:00:10 +02004788#if (OPENSSL_VERSION_NUMBER >= 0x10101000L) && !defined(LIBRESSL_VERSION_NUMBER)
4789 {"num_tickets", (getter) get_num_tickets,
4790 (setter) set_num_tickets, PySSLContext_num_tickets_doc},
4791#endif
Antoine Pitroub5218772010-05-21 09:56:06 +00004792 {"options", (getter) get_options,
4793 (setter) set_options, NULL},
Christian Heimes9fb051f2018-09-23 08:32:31 +02004794 {"post_handshake_auth", (getter) get_post_handshake_auth,
4795#ifdef TLS1_3_VERSION
4796 (setter) set_post_handshake_auth,
4797#else
4798 NULL,
4799#endif
4800 NULL},
Christian Heimes11a14932018-02-24 02:35:08 +01004801 {"protocol", (getter) get_protocol,
4802 NULL, NULL},
Christian Heimes22587792013-11-21 23:56:13 +01004803 {"verify_flags", (getter) get_verify_flags,
4804 (setter) set_verify_flags, NULL},
Antoine Pitrou152efa22010-05-16 18:19:27 +00004805 {"verify_mode", (getter) get_verify_mode,
4806 (setter) set_verify_mode, NULL},
matthewhughes9348e836bb2020-07-17 09:59:15 +01004807#if (OPENSSL_VERSION_NUMBER >= 0x10100000L) && !defined(LIBRESSL_VERSION_NUMBER)
4808 {"security_level", (getter) get_security_level,
4809 NULL, PySSLContext_security_level_doc},
4810#endif
Antoine Pitrou152efa22010-05-16 18:19:27 +00004811 {NULL}, /* sentinel */
4812};
4813
4814static struct PyMethodDef context_methods[] = {
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004815 _SSL__SSLCONTEXT__WRAP_SOCKET_METHODDEF
4816 _SSL__SSLCONTEXT__WRAP_BIO_METHODDEF
4817 _SSL__SSLCONTEXT_SET_CIPHERS_METHODDEF
4818 _SSL__SSLCONTEXT__SET_ALPN_PROTOCOLS_METHODDEF
4819 _SSL__SSLCONTEXT__SET_NPN_PROTOCOLS_METHODDEF
4820 _SSL__SSLCONTEXT_LOAD_CERT_CHAIN_METHODDEF
4821 _SSL__SSLCONTEXT_LOAD_DH_PARAMS_METHODDEF
4822 _SSL__SSLCONTEXT_LOAD_VERIFY_LOCATIONS_METHODDEF
4823 _SSL__SSLCONTEXT_SESSION_STATS_METHODDEF
4824 _SSL__SSLCONTEXT_SET_DEFAULT_VERIFY_PATHS_METHODDEF
4825 _SSL__SSLCONTEXT_SET_ECDH_CURVE_METHODDEF
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004826 _SSL__SSLCONTEXT_CERT_STORE_STATS_METHODDEF
4827 _SSL__SSLCONTEXT_GET_CA_CERTS_METHODDEF
Christian Heimes25bfcd52016-09-06 00:04:45 +02004828 _SSL__SSLCONTEXT_GET_CIPHERS_METHODDEF
Antoine Pitrou152efa22010-05-16 18:19:27 +00004829 {NULL, NULL} /* sentinel */
4830};
4831
4832static PyTypeObject PySSLContext_Type = {
4833 PyVarObject_HEAD_INIT(NULL, 0)
4834 "_ssl._SSLContext", /*tp_name*/
4835 sizeof(PySSLContext), /*tp_basicsize*/
4836 0, /*tp_itemsize*/
4837 (destructor)context_dealloc, /*tp_dealloc*/
Jeroen Demeyer530f5062019-05-31 04:13:39 +02004838 0, /*tp_vectorcall_offset*/
Antoine Pitrou152efa22010-05-16 18:19:27 +00004839 0, /*tp_getattr*/
4840 0, /*tp_setattr*/
Jeroen Demeyer530f5062019-05-31 04:13:39 +02004841 0, /*tp_as_async*/
Antoine Pitrou152efa22010-05-16 18:19:27 +00004842 0, /*tp_repr*/
4843 0, /*tp_as_number*/
4844 0, /*tp_as_sequence*/
4845 0, /*tp_as_mapping*/
4846 0, /*tp_hash*/
4847 0, /*tp_call*/
4848 0, /*tp_str*/
4849 0, /*tp_getattro*/
4850 0, /*tp_setattro*/
4851 0, /*tp_as_buffer*/
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004852 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, /*tp_flags*/
Antoine Pitrou152efa22010-05-16 18:19:27 +00004853 0, /*tp_doc*/
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004854 (traverseproc) context_traverse, /*tp_traverse*/
4855 (inquiry) context_clear, /*tp_clear*/
Antoine Pitrou152efa22010-05-16 18:19:27 +00004856 0, /*tp_richcompare*/
4857 0, /*tp_weaklistoffset*/
4858 0, /*tp_iter*/
4859 0, /*tp_iternext*/
4860 context_methods, /*tp_methods*/
4861 0, /*tp_members*/
4862 context_getsetlist, /*tp_getset*/
4863 0, /*tp_base*/
4864 0, /*tp_dict*/
4865 0, /*tp_descr_get*/
4866 0, /*tp_descr_set*/
4867 0, /*tp_dictoffset*/
4868 0, /*tp_init*/
4869 0, /*tp_alloc*/
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004870 _ssl__SSLContext, /*tp_new*/
Antoine Pitrou152efa22010-05-16 18:19:27 +00004871};
4872
4873
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004874/*
4875 * MemoryBIO objects
4876 */
4877
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004878/*[clinic input]
4879@classmethod
4880_ssl.MemoryBIO.__new__
4881
4882[clinic start generated code]*/
4883
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004884static PyObject *
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004885_ssl_MemoryBIO_impl(PyTypeObject *type)
4886/*[clinic end generated code: output=8820a58db78330ac input=26d22e4909ecb1b5]*/
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004887{
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004888 BIO *bio;
4889 PySSLMemoryBIO *self;
4890
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004891 bio = BIO_new(BIO_s_mem());
4892 if (bio == NULL) {
4893 PyErr_SetString(PySSLErrorObject,
4894 "failed to allocate BIO");
4895 return NULL;
4896 }
4897 /* Since our BIO is non-blocking an empty read() does not indicate EOF,
4898 * just that no data is currently available. The SSL routines should retry
4899 * the read, which we can achieve by calling BIO_set_retry_read(). */
4900 BIO_set_retry_read(bio);
4901 BIO_set_mem_eof_return(bio, -1);
4902
4903 assert(type != NULL && type->tp_alloc != NULL);
4904 self = (PySSLMemoryBIO *) type->tp_alloc(type, 0);
4905 if (self == NULL) {
4906 BIO_free(bio);
4907 return NULL;
4908 }
4909 self->bio = bio;
4910 self->eof_written = 0;
4911
4912 return (PyObject *) self;
4913}
4914
4915static void
4916memory_bio_dealloc(PySSLMemoryBIO *self)
4917{
4918 BIO_free(self->bio);
4919 Py_TYPE(self)->tp_free(self);
4920}
4921
4922static PyObject *
4923memory_bio_get_pending(PySSLMemoryBIO *self, void *c)
4924{
Segev Finer5cff6372017-07-27 01:19:17 +03004925 return PyLong_FromSize_t(BIO_ctrl_pending(self->bio));
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004926}
4927
4928PyDoc_STRVAR(PySSL_memory_bio_pending_doc,
4929"The number of bytes pending in the memory BIO.");
4930
4931static PyObject *
4932memory_bio_get_eof(PySSLMemoryBIO *self, void *c)
4933{
4934 return PyBool_FromLong((BIO_ctrl_pending(self->bio) == 0)
4935 && self->eof_written);
4936}
4937
4938PyDoc_STRVAR(PySSL_memory_bio_eof_doc,
4939"Whether the memory BIO is at EOF.");
4940
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004941/*[clinic input]
4942_ssl.MemoryBIO.read
4943 size as len: int = -1
4944 /
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004945
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004946Read up to size bytes from the memory BIO.
4947
4948If size is not specified, read the entire buffer.
4949If the return value is an empty bytes instance, this means either
4950EOF or that no data is available. Use the "eof" property to
4951distinguish between the two.
4952[clinic start generated code]*/
4953
4954static PyObject *
4955_ssl_MemoryBIO_read_impl(PySSLMemoryBIO *self, int len)
4956/*[clinic end generated code: output=a657aa1e79cd01b3 input=574d7be06a902366]*/
4957{
4958 int avail, nbytes;
4959 PyObject *result;
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004960
Segev Finer5cff6372017-07-27 01:19:17 +03004961 avail = (int)Py_MIN(BIO_ctrl_pending(self->bio), INT_MAX);
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004962 if ((len < 0) || (len > avail))
4963 len = avail;
4964
4965 result = PyBytes_FromStringAndSize(NULL, len);
4966 if ((result == NULL) || (len == 0))
4967 return result;
4968
4969 nbytes = BIO_read(self->bio, PyBytes_AS_STRING(result), len);
Zackery Spytz365ad2e2018-10-06 11:41:45 -06004970 if (nbytes < 0) {
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004971 Py_DECREF(result);
Zackery Spytz365ad2e2018-10-06 11:41:45 -06004972 _setSSLError(NULL, 0, __FILE__, __LINE__);
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004973 return NULL;
4974 }
4975
Zackery Spytz365ad2e2018-10-06 11:41:45 -06004976 /* There should never be any short reads but check anyway. */
4977 if (nbytes < len) {
4978 _PyBytes_Resize(&result, nbytes);
4979 }
4980
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004981 return result;
4982}
4983
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004984/*[clinic input]
4985_ssl.MemoryBIO.write
4986 b: Py_buffer
4987 /
4988
4989Writes the bytes b into the memory BIO.
4990
4991Returns the number of bytes written.
4992[clinic start generated code]*/
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004993
4994static PyObject *
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004995_ssl_MemoryBIO_write_impl(PySSLMemoryBIO *self, Py_buffer *b)
4996/*[clinic end generated code: output=156ec59110d75935 input=e45757b3e17c4808]*/
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004997{
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004998 int nbytes;
4999
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03005000 if (b->len > INT_MAX) {
Antoine Pitroub1fdf472014-10-05 20:41:53 +02005001 PyErr_Format(PyExc_OverflowError,
5002 "string longer than %d bytes", INT_MAX);
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03005003 return NULL;
Antoine Pitroub1fdf472014-10-05 20:41:53 +02005004 }
5005
5006 if (self->eof_written) {
5007 PyErr_SetString(PySSLErrorObject,
5008 "cannot write() after write_eof()");
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03005009 return NULL;
Antoine Pitroub1fdf472014-10-05 20:41:53 +02005010 }
5011
Segev Finer5cff6372017-07-27 01:19:17 +03005012 nbytes = BIO_write(self->bio, b->buf, (int)b->len);
Antoine Pitroub1fdf472014-10-05 20:41:53 +02005013 if (nbytes < 0) {
5014 _setSSLError(NULL, 0, __FILE__, __LINE__);
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03005015 return NULL;
Antoine Pitroub1fdf472014-10-05 20:41:53 +02005016 }
5017
Antoine Pitroub1fdf472014-10-05 20:41:53 +02005018 return PyLong_FromLong(nbytes);
Antoine Pitroub1fdf472014-10-05 20:41:53 +02005019}
5020
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03005021/*[clinic input]
5022_ssl.MemoryBIO.write_eof
5023
5024Write an EOF marker to the memory BIO.
5025
5026When all data has been read, the "eof" property will be True.
5027[clinic start generated code]*/
Antoine Pitroub1fdf472014-10-05 20:41:53 +02005028
5029static PyObject *
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03005030_ssl_MemoryBIO_write_eof_impl(PySSLMemoryBIO *self)
5031/*[clinic end generated code: output=d4106276ccd1ed34 input=56a945f1d29e8bd6]*/
Antoine Pitroub1fdf472014-10-05 20:41:53 +02005032{
5033 self->eof_written = 1;
5034 /* After an EOF is written, a zero return from read() should be a real EOF
5035 * i.e. it should not be retried. Clear the SHOULD_RETRY flag. */
5036 BIO_clear_retry_flags(self->bio);
5037 BIO_set_mem_eof_return(self->bio, 0);
5038
5039 Py_RETURN_NONE;
5040}
5041
Antoine Pitroub1fdf472014-10-05 20:41:53 +02005042static PyGetSetDef memory_bio_getsetlist[] = {
5043 {"pending", (getter) memory_bio_get_pending, NULL,
5044 PySSL_memory_bio_pending_doc},
5045 {"eof", (getter) memory_bio_get_eof, NULL,
5046 PySSL_memory_bio_eof_doc},
5047 {NULL}, /* sentinel */
5048};
5049
5050static struct PyMethodDef memory_bio_methods[] = {
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03005051 _SSL_MEMORYBIO_READ_METHODDEF
5052 _SSL_MEMORYBIO_WRITE_METHODDEF
5053 _SSL_MEMORYBIO_WRITE_EOF_METHODDEF
Antoine Pitroub1fdf472014-10-05 20:41:53 +02005054 {NULL, NULL} /* sentinel */
5055};
5056
5057static PyTypeObject PySSLMemoryBIO_Type = {
5058 PyVarObject_HEAD_INIT(NULL, 0)
5059 "_ssl.MemoryBIO", /*tp_name*/
5060 sizeof(PySSLMemoryBIO), /*tp_basicsize*/
5061 0, /*tp_itemsize*/
5062 (destructor)memory_bio_dealloc, /*tp_dealloc*/
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005063 0, /*tp_vectorcall_offset*/
Antoine Pitroub1fdf472014-10-05 20:41:53 +02005064 0, /*tp_getattr*/
5065 0, /*tp_setattr*/
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005066 0, /*tp_as_async*/
Antoine Pitroub1fdf472014-10-05 20:41:53 +02005067 0, /*tp_repr*/
5068 0, /*tp_as_number*/
5069 0, /*tp_as_sequence*/
5070 0, /*tp_as_mapping*/
5071 0, /*tp_hash*/
5072 0, /*tp_call*/
5073 0, /*tp_str*/
5074 0, /*tp_getattro*/
5075 0, /*tp_setattro*/
5076 0, /*tp_as_buffer*/
5077 Py_TPFLAGS_DEFAULT, /*tp_flags*/
5078 0, /*tp_doc*/
5079 0, /*tp_traverse*/
5080 0, /*tp_clear*/
5081 0, /*tp_richcompare*/
5082 0, /*tp_weaklistoffset*/
5083 0, /*tp_iter*/
5084 0, /*tp_iternext*/
5085 memory_bio_methods, /*tp_methods*/
5086 0, /*tp_members*/
5087 memory_bio_getsetlist, /*tp_getset*/
5088 0, /*tp_base*/
5089 0, /*tp_dict*/
5090 0, /*tp_descr_get*/
5091 0, /*tp_descr_set*/
5092 0, /*tp_dictoffset*/
5093 0, /*tp_init*/
5094 0, /*tp_alloc*/
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03005095 _ssl_MemoryBIO, /*tp_new*/
Antoine Pitroub1fdf472014-10-05 20:41:53 +02005096};
5097
Antoine Pitrou152efa22010-05-16 18:19:27 +00005098
Christian Heimes99a65702016-09-10 23:44:53 +02005099/*
5100 * SSL Session object
5101 */
5102
5103static void
5104PySSLSession_dealloc(PySSLSession *self)
5105{
INADA Naokia6296d32017-08-24 14:55:17 +09005106 /* bpo-31095: UnTrack is needed before calling any callbacks */
Christian Heimesa5d07652016-09-24 10:48:05 +02005107 PyObject_GC_UnTrack(self);
Christian Heimes99a65702016-09-10 23:44:53 +02005108 Py_XDECREF(self->ctx);
5109 if (self->session != NULL) {
5110 SSL_SESSION_free(self->session);
5111 }
Christian Heimesa5d07652016-09-24 10:48:05 +02005112 PyObject_GC_Del(self);
Christian Heimes99a65702016-09-10 23:44:53 +02005113}
5114
5115static PyObject *
5116PySSLSession_richcompare(PyObject *left, PyObject *right, int op)
5117{
5118 int result;
5119
5120 if (left == NULL || right == NULL) {
5121 PyErr_BadInternalCall();
5122 return NULL;
5123 }
5124
5125 if (!PySSLSession_Check(left) || !PySSLSession_Check(right)) {
5126 Py_RETURN_NOTIMPLEMENTED;
5127 }
5128
5129 if (left == right) {
5130 result = 0;
5131 } else {
5132 const unsigned char *left_id, *right_id;
5133 unsigned int left_len, right_len;
5134 left_id = SSL_SESSION_get_id(((PySSLSession *)left)->session,
5135 &left_len);
5136 right_id = SSL_SESSION_get_id(((PySSLSession *)right)->session,
5137 &right_len);
5138 if (left_len == right_len) {
5139 result = memcmp(left_id, right_id, left_len);
5140 } else {
5141 result = 1;
5142 }
5143 }
5144
5145 switch (op) {
5146 case Py_EQ:
5147 if (result == 0) {
5148 Py_RETURN_TRUE;
5149 } else {
5150 Py_RETURN_FALSE;
5151 }
5152 break;
5153 case Py_NE:
5154 if (result != 0) {
5155 Py_RETURN_TRUE;
5156 } else {
5157 Py_RETURN_FALSE;
5158 }
5159 break;
5160 case Py_LT:
5161 case Py_LE:
5162 case Py_GT:
5163 case Py_GE:
5164 Py_RETURN_NOTIMPLEMENTED;
5165 break;
5166 default:
5167 PyErr_BadArgument();
5168 return NULL;
5169 }
5170}
5171
5172static int
5173PySSLSession_traverse(PySSLSession *self, visitproc visit, void *arg)
5174{
5175 Py_VISIT(self->ctx);
5176 return 0;
5177}
5178
5179static int
5180PySSLSession_clear(PySSLSession *self)
5181{
5182 Py_CLEAR(self->ctx);
5183 return 0;
5184}
5185
5186
5187static PyObject *
5188PySSLSession_get_time(PySSLSession *self, void *closure) {
5189 return PyLong_FromLong(SSL_SESSION_get_time(self->session));
5190}
5191
5192PyDoc_STRVAR(PySSLSession_get_time_doc,
5193"Session creation time (seconds since epoch).");
5194
5195
5196static PyObject *
5197PySSLSession_get_timeout(PySSLSession *self, void *closure) {
5198 return PyLong_FromLong(SSL_SESSION_get_timeout(self->session));
5199}
5200
5201PyDoc_STRVAR(PySSLSession_get_timeout_doc,
5202"Session timeout (delta in seconds).");
5203
5204
5205static PyObject *
5206PySSLSession_get_ticket_lifetime_hint(PySSLSession *self, void *closure) {
5207 unsigned long hint = SSL_SESSION_get_ticket_lifetime_hint(self->session);
5208 return PyLong_FromUnsignedLong(hint);
5209}
5210
5211PyDoc_STRVAR(PySSLSession_get_ticket_lifetime_hint_doc,
5212"Ticket life time hint.");
5213
5214
5215static PyObject *
5216PySSLSession_get_session_id(PySSLSession *self, void *closure) {
5217 const unsigned char *id;
5218 unsigned int len;
5219 id = SSL_SESSION_get_id(self->session, &len);
5220 return PyBytes_FromStringAndSize((const char *)id, len);
5221}
5222
5223PyDoc_STRVAR(PySSLSession_get_session_id_doc,
5224"Session id");
5225
5226
5227static PyObject *
5228PySSLSession_get_has_ticket(PySSLSession *self, void *closure) {
5229 if (SSL_SESSION_has_ticket(self->session)) {
5230 Py_RETURN_TRUE;
5231 } else {
5232 Py_RETURN_FALSE;
5233 }
5234}
5235
5236PyDoc_STRVAR(PySSLSession_get_has_ticket_doc,
5237"Does the session contain a ticket?");
5238
5239
5240static PyGetSetDef PySSLSession_getsetlist[] = {
5241 {"has_ticket", (getter) PySSLSession_get_has_ticket, NULL,
5242 PySSLSession_get_has_ticket_doc},
5243 {"id", (getter) PySSLSession_get_session_id, NULL,
5244 PySSLSession_get_session_id_doc},
5245 {"ticket_lifetime_hint", (getter) PySSLSession_get_ticket_lifetime_hint,
5246 NULL, PySSLSession_get_ticket_lifetime_hint_doc},
5247 {"time", (getter) PySSLSession_get_time, NULL,
5248 PySSLSession_get_time_doc},
5249 {"timeout", (getter) PySSLSession_get_timeout, NULL,
5250 PySSLSession_get_timeout_doc},
5251 {NULL}, /* sentinel */
5252};
5253
5254static PyTypeObject PySSLSession_Type = {
5255 PyVarObject_HEAD_INIT(NULL, 0)
5256 "_ssl.Session", /*tp_name*/
5257 sizeof(PySSLSession), /*tp_basicsize*/
5258 0, /*tp_itemsize*/
5259 (destructor)PySSLSession_dealloc, /*tp_dealloc*/
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005260 0, /*tp_vectorcall_offset*/
Christian Heimes99a65702016-09-10 23:44:53 +02005261 0, /*tp_getattr*/
5262 0, /*tp_setattr*/
Jeroen Demeyer530f5062019-05-31 04:13:39 +02005263 0, /*tp_as_async*/
Christian Heimes99a65702016-09-10 23:44:53 +02005264 0, /*tp_repr*/
5265 0, /*tp_as_number*/
5266 0, /*tp_as_sequence*/
5267 0, /*tp_as_mapping*/
5268 0, /*tp_hash*/
5269 0, /*tp_call*/
5270 0, /*tp_str*/
5271 0, /*tp_getattro*/
5272 0, /*tp_setattro*/
5273 0, /*tp_as_buffer*/
Christian Heimesa5d07652016-09-24 10:48:05 +02005274 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /*tp_flags*/
Christian Heimes99a65702016-09-10 23:44:53 +02005275 0, /*tp_doc*/
5276 (traverseproc)PySSLSession_traverse, /*tp_traverse*/
5277 (inquiry)PySSLSession_clear, /*tp_clear*/
5278 PySSLSession_richcompare, /*tp_richcompare*/
5279 0, /*tp_weaklistoffset*/
5280 0, /*tp_iter*/
5281 0, /*tp_iternext*/
5282 0, /*tp_methods*/
5283 0, /*tp_members*/
5284 PySSLSession_getsetlist, /*tp_getset*/
5285};
5286
5287
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005288/* helper routines for seeding the SSL PRNG */
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03005289/*[clinic input]
5290_ssl.RAND_add
Larry Hastingsdbfdc382015-05-04 06:59:46 -07005291 string as view: Py_buffer(accept={str, buffer})
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03005292 entropy: double
5293 /
5294
5295Mix string into the OpenSSL PRNG state.
5296
5297entropy (a float) is a lower bound on the entropy contained in
Chandan Kumar63c2c8a2017-06-09 15:13:58 +05305298string. See RFC 4086.
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03005299[clinic start generated code]*/
5300
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005301static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03005302_ssl_RAND_add_impl(PyObject *module, Py_buffer *view, double entropy)
Serhiy Storchaka5f31d5c2017-06-10 13:13:51 +03005303/*[clinic end generated code: output=e6dd48df9c9024e9 input=5c33017422828f5c]*/
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005304{
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005305 const char *buf;
Victor Stinner2e57b4e2014-07-01 16:37:17 +02005306 Py_ssize_t len, written;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005307
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03005308 buf = (const char *)view->buf;
5309 len = view->len;
Victor Stinner2e57b4e2014-07-01 16:37:17 +02005310 do {
5311 written = Py_MIN(len, INT_MAX);
5312 RAND_add(buf, (int)written, entropy);
5313 buf += written;
5314 len -= written;
5315 } while (len);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02005316 Py_RETURN_NONE;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005317}
5318
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005319static PyObject *
Victor Stinner99c8b162011-05-24 12:05:19 +02005320PySSL_RAND(int len, int pseudo)
5321{
5322 int ok;
5323 PyObject *bytes;
5324 unsigned long err;
5325 const char *errstr;
5326 PyObject *v;
5327
Victor Stinner1e81a392013-12-19 16:47:04 +01005328 if (len < 0) {
5329 PyErr_SetString(PyExc_ValueError, "num must be positive");
5330 return NULL;
5331 }
5332
Victor Stinner99c8b162011-05-24 12:05:19 +02005333 bytes = PyBytes_FromStringAndSize(NULL, len);
5334 if (bytes == NULL)
5335 return NULL;
5336 if (pseudo) {
Christian Heimesa871f692020-06-01 08:58:14 +02005337#ifdef PY_OPENSSL_1_1_API
5338 ok = RAND_bytes((unsigned char*)PyBytes_AS_STRING(bytes), len);
5339#else
Victor Stinner99c8b162011-05-24 12:05:19 +02005340 ok = RAND_pseudo_bytes((unsigned char*)PyBytes_AS_STRING(bytes), len);
Christian Heimesa871f692020-06-01 08:58:14 +02005341#endif
Victor Stinner99c8b162011-05-24 12:05:19 +02005342 if (ok == 0 || ok == 1)
5343 return Py_BuildValue("NO", bytes, ok == 1 ? Py_True : Py_False);
5344 }
5345 else {
5346 ok = RAND_bytes((unsigned char*)PyBytes_AS_STRING(bytes), len);
5347 if (ok == 1)
5348 return bytes;
5349 }
5350 Py_DECREF(bytes);
5351
5352 err = ERR_get_error();
5353 errstr = ERR_reason_error_string(err);
5354 v = Py_BuildValue("(ks)", err, errstr);
5355 if (v != NULL) {
5356 PyErr_SetObject(PySSLErrorObject, v);
5357 Py_DECREF(v);
5358 }
5359 return NULL;
5360}
5361
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03005362/*[clinic input]
5363_ssl.RAND_bytes
5364 n: int
5365 /
5366
5367Generate n cryptographically strong pseudo-random bytes.
5368[clinic start generated code]*/
5369
Victor Stinner99c8b162011-05-24 12:05:19 +02005370static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03005371_ssl_RAND_bytes_impl(PyObject *module, int n)
5372/*[clinic end generated code: output=977da635e4838bc7 input=678ddf2872dfebfc]*/
Victor Stinner99c8b162011-05-24 12:05:19 +02005373{
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03005374 return PySSL_RAND(n, 0);
Victor Stinner99c8b162011-05-24 12:05:19 +02005375}
5376
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03005377/*[clinic input]
5378_ssl.RAND_pseudo_bytes
5379 n: int
5380 /
5381
5382Generate n pseudo-random bytes.
5383
5384Return a pair (bytes, is_cryptographic). is_cryptographic is True
5385if the bytes generated are cryptographically strong.
5386[clinic start generated code]*/
Victor Stinner99c8b162011-05-24 12:05:19 +02005387
5388static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03005389_ssl_RAND_pseudo_bytes_impl(PyObject *module, int n)
5390/*[clinic end generated code: output=b1509e937000e52d input=58312bd53f9bbdd0]*/
Victor Stinner99c8b162011-05-24 12:05:19 +02005391{
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03005392 return PySSL_RAND(n, 1);
Victor Stinner99c8b162011-05-24 12:05:19 +02005393}
5394
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03005395/*[clinic input]
5396_ssl.RAND_status
5397
5398Returns 1 if the OpenSSL PRNG has been seeded with enough data and 0 if not.
5399
5400It is necessary to seed the PRNG with RAND_add() on some platforms before
5401using the ssl() function.
5402[clinic start generated code]*/
Victor Stinner99c8b162011-05-24 12:05:19 +02005403
5404static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03005405_ssl_RAND_status_impl(PyObject *module)
5406/*[clinic end generated code: output=7e0aaa2d39fdc1ad input=8a774b02d1dc81f3]*/
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005407{
Christian Heimes217cfd12007-12-02 14:31:20 +00005408 return PyLong_FromLong(RAND_status());
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005409}
5410
Benjamin Petersonb8a2f512016-07-06 23:55:15 -07005411#ifndef OPENSSL_NO_EGD
Christian Heimesa5d07652016-09-24 10:48:05 +02005412/* LCOV_EXCL_START */
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03005413/*[clinic input]
5414_ssl.RAND_egd
5415 path: object(converter="PyUnicode_FSConverter")
5416 /
5417
5418Queries the entropy gather daemon (EGD) on the socket named by 'path'.
5419
5420Returns number of bytes read. Raises SSLError if connection to EGD
5421fails or if it does not provide enough data to seed PRNG.
5422[clinic start generated code]*/
5423
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005424static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03005425_ssl_RAND_egd_impl(PyObject *module, PyObject *path)
5426/*[clinic end generated code: output=02a67c7c367f52fa input=1aeb7eb948312195]*/
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005427{
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03005428 int bytes = RAND_egd(PyBytes_AsString(path));
Victor Stinnerf9faaad2010-05-16 21:36:37 +00005429 Py_DECREF(path);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005430 if (bytes == -1) {
Antoine Pitrou525807b2010-05-12 14:05:24 +00005431 PyErr_SetString(PySSLErrorObject,
5432 "EGD connection failed or EGD did not return "
5433 "enough data to seed the PRNG");
5434 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005435 }
Christian Heimes217cfd12007-12-02 14:31:20 +00005436 return PyLong_FromLong(bytes);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005437}
Christian Heimesa5d07652016-09-24 10:48:05 +02005438/* LCOV_EXCL_STOP */
Benjamin Petersonb8a2f512016-07-06 23:55:15 -07005439#endif /* OPENSSL_NO_EGD */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005440
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005441
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03005442
5443/*[clinic input]
5444_ssl.get_default_verify_paths
5445
5446Return search paths and environment vars that are used by SSLContext's set_default_verify_paths() to load default CAs.
5447
5448The values are 'cert_file_env', 'cert_file', 'cert_dir_env', 'cert_dir'.
5449[clinic start generated code]*/
Christian Heimes6d7ad132013-06-09 18:02:55 +02005450
5451static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03005452_ssl_get_default_verify_paths_impl(PyObject *module)
5453/*[clinic end generated code: output=e5b62a466271928b input=5210c953d98c3eb5]*/
Christian Heimes6d7ad132013-06-09 18:02:55 +02005454{
5455 PyObject *ofile_env = NULL;
5456 PyObject *ofile = NULL;
5457 PyObject *odir_env = NULL;
5458 PyObject *odir = NULL;
5459
Benjamin Petersond113c962015-07-18 10:59:13 -07005460#define CONVERT(info, target) { \
Christian Heimes6d7ad132013-06-09 18:02:55 +02005461 const char *tmp = (info); \
5462 target = NULL; \
5463 if (!tmp) { Py_INCREF(Py_None); target = Py_None; } \
5464 else if ((target = PyUnicode_DecodeFSDefault(tmp)) == NULL) { \
5465 target = PyBytes_FromString(tmp); } \
5466 if (!target) goto error; \
Benjamin Peterson025a1fd2015-11-14 15:12:38 -08005467 }
Christian Heimes6d7ad132013-06-09 18:02:55 +02005468
Benjamin Petersond113c962015-07-18 10:59:13 -07005469 CONVERT(X509_get_default_cert_file_env(), ofile_env);
5470 CONVERT(X509_get_default_cert_file(), ofile);
5471 CONVERT(X509_get_default_cert_dir_env(), odir_env);
5472 CONVERT(X509_get_default_cert_dir(), odir);
5473#undef CONVERT
Christian Heimes6d7ad132013-06-09 18:02:55 +02005474
Christian Heimes200bb1b2013-06-14 15:14:29 +02005475 return Py_BuildValue("NNNN", ofile_env, ofile, odir_env, odir);
Christian Heimes6d7ad132013-06-09 18:02:55 +02005476
5477 error:
5478 Py_XDECREF(ofile_env);
5479 Py_XDECREF(ofile);
5480 Py_XDECREF(odir_env);
5481 Py_XDECREF(odir);
5482 return NULL;
5483}
5484
Christian Heimesa6bc95a2013-11-17 19:59:14 +01005485static PyObject*
5486asn1obj2py(ASN1_OBJECT *obj)
5487{
5488 int nid;
5489 const char *ln, *sn;
Christian Heimesa6bc95a2013-11-17 19:59:14 +01005490
5491 nid = OBJ_obj2nid(obj);
5492 if (nid == NID_undef) {
5493 PyErr_Format(PyExc_ValueError, "Unknown object");
5494 return NULL;
5495 }
5496 sn = OBJ_nid2sn(nid);
5497 ln = OBJ_nid2ln(nid);
Serhiy Storchakae503ca52017-09-05 01:28:53 +03005498 return Py_BuildValue("issN", nid, sn, ln, _asn1obj2py(obj, 1));
Christian Heimesa6bc95a2013-11-17 19:59:14 +01005499}
5500
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03005501/*[clinic input]
5502_ssl.txt2obj
5503 txt: str
5504 name: bool = False
Christian Heimesa6bc95a2013-11-17 19:59:14 +01005505
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03005506Lookup NID, short name, long name and OID of an ASN1_OBJECT.
5507
5508By default objects are looked up by OID. With name=True short and
5509long name are also matched.
5510[clinic start generated code]*/
5511
5512static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03005513_ssl_txt2obj_impl(PyObject *module, const char *txt, int name)
5514/*[clinic end generated code: output=c38e3991347079c1 input=1c1e7d0aa7c48602]*/
Christian Heimesa6bc95a2013-11-17 19:59:14 +01005515{
Christian Heimesa6bc95a2013-11-17 19:59:14 +01005516 PyObject *result = NULL;
Christian Heimesa6bc95a2013-11-17 19:59:14 +01005517 ASN1_OBJECT *obj;
5518
Christian Heimesa6bc95a2013-11-17 19:59:14 +01005519 obj = OBJ_txt2obj(txt, name ? 0 : 1);
5520 if (obj == NULL) {
Christian Heimes5398e1a2013-11-22 16:20:53 +01005521 PyErr_Format(PyExc_ValueError, "unknown object '%.100s'", txt);
Christian Heimesa6bc95a2013-11-17 19:59:14 +01005522 return NULL;
5523 }
5524 result = asn1obj2py(obj);
5525 ASN1_OBJECT_free(obj);
5526 return result;
5527}
5528
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03005529/*[clinic input]
5530_ssl.nid2obj
5531 nid: int
5532 /
Christian Heimesa6bc95a2013-11-17 19:59:14 +01005533
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03005534Lookup NID, short name, long name and OID of an ASN1_OBJECT by NID.
5535[clinic start generated code]*/
5536
5537static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03005538_ssl_nid2obj_impl(PyObject *module, int nid)
5539/*[clinic end generated code: output=4a98ab691cd4f84a input=51787a3bee7d8f98]*/
Christian Heimesa6bc95a2013-11-17 19:59:14 +01005540{
5541 PyObject *result = NULL;
Christian Heimesa6bc95a2013-11-17 19:59:14 +01005542 ASN1_OBJECT *obj;
5543
Christian Heimesa6bc95a2013-11-17 19:59:14 +01005544 if (nid < NID_undef) {
Christian Heimes5398e1a2013-11-22 16:20:53 +01005545 PyErr_SetString(PyExc_ValueError, "NID must be positive.");
Christian Heimesa6bc95a2013-11-17 19:59:14 +01005546 return NULL;
5547 }
5548 obj = OBJ_nid2obj(nid);
5549 if (obj == NULL) {
Christian Heimes5398e1a2013-11-22 16:20:53 +01005550 PyErr_Format(PyExc_ValueError, "unknown NID %i", nid);
Christian Heimesa6bc95a2013-11-17 19:59:14 +01005551 return NULL;
5552 }
5553 result = asn1obj2py(obj);
5554 ASN1_OBJECT_free(obj);
5555 return result;
5556}
5557
Christian Heimes46bebee2013-06-09 19:03:31 +02005558#ifdef _MSC_VER
Christian Heimes44109d72013-11-22 01:51:30 +01005559
5560static PyObject*
5561certEncodingType(DWORD encodingType)
5562{
5563 static PyObject *x509_asn = NULL;
5564 static PyObject *pkcs_7_asn = NULL;
5565
5566 if (x509_asn == NULL) {
5567 x509_asn = PyUnicode_InternFromString("x509_asn");
5568 if (x509_asn == NULL)
5569 return NULL;
5570 }
5571 if (pkcs_7_asn == NULL) {
5572 pkcs_7_asn = PyUnicode_InternFromString("pkcs_7_asn");
5573 if (pkcs_7_asn == NULL)
5574 return NULL;
5575 }
5576 switch(encodingType) {
5577 case X509_ASN_ENCODING:
5578 Py_INCREF(x509_asn);
5579 return x509_asn;
5580 case PKCS_7_ASN_ENCODING:
5581 Py_INCREF(pkcs_7_asn);
5582 return pkcs_7_asn;
5583 default:
5584 return PyLong_FromLong(encodingType);
5585 }
5586}
5587
5588static PyObject*
5589parseKeyUsage(PCCERT_CONTEXT pCertCtx, DWORD flags)
5590{
5591 CERT_ENHKEY_USAGE *usage;
5592 DWORD size, error, i;
5593 PyObject *retval;
5594
5595 if (!CertGetEnhancedKeyUsage(pCertCtx, flags, NULL, &size)) {
5596 error = GetLastError();
5597 if (error == CRYPT_E_NOT_FOUND) {
5598 Py_RETURN_TRUE;
5599 }
5600 return PyErr_SetFromWindowsErr(error);
5601 }
5602
5603 usage = (CERT_ENHKEY_USAGE*)PyMem_Malloc(size);
5604 if (usage == NULL) {
5605 return PyErr_NoMemory();
5606 }
5607
5608 /* Now get the actual enhanced usage property */
5609 if (!CertGetEnhancedKeyUsage(pCertCtx, flags, usage, &size)) {
5610 PyMem_Free(usage);
5611 error = GetLastError();
5612 if (error == CRYPT_E_NOT_FOUND) {
5613 Py_RETURN_TRUE;
5614 }
5615 return PyErr_SetFromWindowsErr(error);
5616 }
Christian Heimes915cd3f2019-09-09 18:06:55 +02005617 retval = PyFrozenSet_New(NULL);
Christian Heimes44109d72013-11-22 01:51:30 +01005618 if (retval == NULL) {
5619 goto error;
5620 }
5621 for (i = 0; i < usage->cUsageIdentifier; ++i) {
5622 if (usage->rgpszUsageIdentifier[i]) {
5623 PyObject *oid;
5624 int err;
5625 oid = PyUnicode_FromString(usage->rgpszUsageIdentifier[i]);
5626 if (oid == NULL) {
5627 Py_CLEAR(retval);
5628 goto error;
5629 }
5630 err = PySet_Add(retval, oid);
5631 Py_DECREF(oid);
5632 if (err == -1) {
5633 Py_CLEAR(retval);
5634 goto error;
5635 }
5636 }
5637 }
5638 error:
5639 PyMem_Free(usage);
5640 return retval;
5641}
5642
kctherookied93fbbf2019-03-29 00:59:06 +07005643static HCERTSTORE
5644ssl_collect_certificates(const char *store_name)
5645{
5646/* this function collects the system certificate stores listed in
5647 * system_stores into a collection certificate store for being
5648 * enumerated. The store must be readable to be added to the
5649 * store collection.
5650 */
5651
5652 HCERTSTORE hCollectionStore = NULL, hSystemStore = NULL;
5653 static DWORD system_stores[] = {
5654 CERT_SYSTEM_STORE_LOCAL_MACHINE,
5655 CERT_SYSTEM_STORE_LOCAL_MACHINE_ENTERPRISE,
5656 CERT_SYSTEM_STORE_LOCAL_MACHINE_GROUP_POLICY,
5657 CERT_SYSTEM_STORE_CURRENT_USER,
5658 CERT_SYSTEM_STORE_CURRENT_USER_GROUP_POLICY,
5659 CERT_SYSTEM_STORE_SERVICES,
5660 CERT_SYSTEM_STORE_USERS};
5661 size_t i, storesAdded;
5662 BOOL result;
5663
5664 hCollectionStore = CertOpenStore(CERT_STORE_PROV_COLLECTION, 0,
5665 (HCRYPTPROV)NULL, 0, NULL);
5666 if (!hCollectionStore) {
5667 return NULL;
5668 }
5669 storesAdded = 0;
5670 for (i = 0; i < sizeof(system_stores) / sizeof(DWORD); i++) {
5671 hSystemStore = CertOpenStore(CERT_STORE_PROV_SYSTEM_A, 0,
5672 (HCRYPTPROV)NULL,
5673 CERT_STORE_READONLY_FLAG |
5674 system_stores[i], store_name);
5675 if (hSystemStore) {
5676 result = CertAddStoreToCollection(hCollectionStore, hSystemStore,
5677 CERT_PHYSICAL_STORE_ADD_ENABLE_FLAG, 0);
5678 if (result) {
5679 ++storesAdded;
5680 }
neoneneed701292019-09-09 21:33:43 +09005681 CertCloseStore(hSystemStore, 0); /* flag must be 0 */
kctherookied93fbbf2019-03-29 00:59:06 +07005682 }
5683 }
5684 if (storesAdded == 0) {
5685 CertCloseStore(hCollectionStore, CERT_CLOSE_STORE_FORCE_FLAG);
5686 return NULL;
5687 }
5688
5689 return hCollectionStore;
5690}
5691
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03005692/*[clinic input]
5693_ssl.enum_certificates
5694 store_name: str
5695
5696Retrieve certificates from Windows' cert store.
5697
5698store_name may be one of 'CA', 'ROOT' or 'MY'. The system may provide
5699more cert storages, too. The function returns a list of (bytes,
5700encoding_type, trust) tuples. The encoding_type flag can be interpreted
5701with X509_ASN_ENCODING or PKCS_7_ASN_ENCODING. The trust setting is either
5702a set of OIDs or the boolean True.
5703[clinic start generated code]*/
Bill Janssen40a0f662008-08-12 16:56:25 +00005704
Christian Heimes46bebee2013-06-09 19:03:31 +02005705static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03005706_ssl_enum_certificates_impl(PyObject *module, const char *store_name)
5707/*[clinic end generated code: output=5134dc8bb3a3c893 input=915f60d70461ea4e]*/
Christian Heimes46bebee2013-06-09 19:03:31 +02005708{
kctherookied93fbbf2019-03-29 00:59:06 +07005709 HCERTSTORE hCollectionStore = NULL;
Christian Heimes44109d72013-11-22 01:51:30 +01005710 PCCERT_CONTEXT pCertCtx = NULL;
5711 PyObject *keyusage = NULL, *cert = NULL, *enc = NULL, *tup = NULL;
Christian Heimes46bebee2013-06-09 19:03:31 +02005712 PyObject *result = NULL;
Christian Heimes46bebee2013-06-09 19:03:31 +02005713
Christian Heimes915cd3f2019-09-09 18:06:55 +02005714 result = PySet_New(NULL);
Christian Heimes44109d72013-11-22 01:51:30 +01005715 if (result == NULL) {
5716 return NULL;
5717 }
kctherookied93fbbf2019-03-29 00:59:06 +07005718 hCollectionStore = ssl_collect_certificates(store_name);
5719 if (hCollectionStore == NULL) {
Christian Heimes46bebee2013-06-09 19:03:31 +02005720 Py_DECREF(result);
5721 return PyErr_SetFromWindowsErr(GetLastError());
5722 }
5723
kctherookied93fbbf2019-03-29 00:59:06 +07005724 while (pCertCtx = CertEnumCertificatesInStore(hCollectionStore, pCertCtx)) {
Christian Heimes44109d72013-11-22 01:51:30 +01005725 cert = PyBytes_FromStringAndSize((const char*)pCertCtx->pbCertEncoded,
5726 pCertCtx->cbCertEncoded);
5727 if (!cert) {
5728 Py_CLEAR(result);
5729 break;
Christian Heimes46bebee2013-06-09 19:03:31 +02005730 }
Christian Heimes44109d72013-11-22 01:51:30 +01005731 if ((enc = certEncodingType(pCertCtx->dwCertEncodingType)) == NULL) {
5732 Py_CLEAR(result);
5733 break;
Christian Heimes46bebee2013-06-09 19:03:31 +02005734 }
Christian Heimes44109d72013-11-22 01:51:30 +01005735 keyusage = parseKeyUsage(pCertCtx, CERT_FIND_PROP_ONLY_ENHKEY_USAGE_FLAG);
5736 if (keyusage == Py_True) {
5737 Py_DECREF(keyusage);
5738 keyusage = parseKeyUsage(pCertCtx, CERT_FIND_EXT_ONLY_ENHKEY_USAGE_FLAG);
Christian Heimes46bebee2013-06-09 19:03:31 +02005739 }
Christian Heimes44109d72013-11-22 01:51:30 +01005740 if (keyusage == NULL) {
5741 Py_CLEAR(result);
5742 break;
Christian Heimes46bebee2013-06-09 19:03:31 +02005743 }
Christian Heimes44109d72013-11-22 01:51:30 +01005744 if ((tup = PyTuple_New(3)) == NULL) {
5745 Py_CLEAR(result);
5746 break;
5747 }
5748 PyTuple_SET_ITEM(tup, 0, cert);
5749 cert = NULL;
5750 PyTuple_SET_ITEM(tup, 1, enc);
5751 enc = NULL;
5752 PyTuple_SET_ITEM(tup, 2, keyusage);
5753 keyusage = NULL;
Christian Heimes915cd3f2019-09-09 18:06:55 +02005754 if (PySet_Add(result, tup) == -1) {
5755 Py_CLEAR(result);
5756 Py_CLEAR(tup);
5757 break;
Christian Heimes44109d72013-11-22 01:51:30 +01005758 }
5759 Py_CLEAR(tup);
5760 }
5761 if (pCertCtx) {
5762 /* loop ended with an error, need to clean up context manually */
5763 CertFreeCertificateContext(pCertCtx);
Christian Heimes46bebee2013-06-09 19:03:31 +02005764 }
5765
5766 /* In error cases cert, enc and tup may not be NULL */
5767 Py_XDECREF(cert);
5768 Py_XDECREF(enc);
Christian Heimes44109d72013-11-22 01:51:30 +01005769 Py_XDECREF(keyusage);
Christian Heimes46bebee2013-06-09 19:03:31 +02005770 Py_XDECREF(tup);
5771
kctherookied93fbbf2019-03-29 00:59:06 +07005772 /* CERT_CLOSE_STORE_FORCE_FLAG forces freeing of memory for all contexts
5773 associated with the store, in this case our collection store and the
5774 associated system stores. */
5775 if (!CertCloseStore(hCollectionStore, CERT_CLOSE_STORE_FORCE_FLAG)) {
Christian Heimes46bebee2013-06-09 19:03:31 +02005776 /* This error case might shadow another exception.*/
Christian Heimes44109d72013-11-22 01:51:30 +01005777 Py_XDECREF(result);
5778 return PyErr_SetFromWindowsErr(GetLastError());
5779 }
kctherookied93fbbf2019-03-29 00:59:06 +07005780
Christian Heimes915cd3f2019-09-09 18:06:55 +02005781 /* convert set to list */
5782 if (result == NULL) {
5783 return NULL;
5784 } else {
5785 PyObject *lst = PySequence_List(result);
5786 Py_DECREF(result);
5787 return lst;
5788 }
Christian Heimes44109d72013-11-22 01:51:30 +01005789}
5790
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03005791/*[clinic input]
5792_ssl.enum_crls
5793 store_name: str
5794
5795Retrieve CRLs from Windows' cert store.
5796
5797store_name may be one of 'CA', 'ROOT' or 'MY'. The system may provide
5798more cert storages, too. The function returns a list of (bytes,
5799encoding_type) tuples. The encoding_type flag can be interpreted with
5800X509_ASN_ENCODING or PKCS_7_ASN_ENCODING.
5801[clinic start generated code]*/
Christian Heimes44109d72013-11-22 01:51:30 +01005802
5803static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03005804_ssl_enum_crls_impl(PyObject *module, const char *store_name)
5805/*[clinic end generated code: output=bce467f60ccd03b6 input=a1f1d7629f1c5d3d]*/
Christian Heimes44109d72013-11-22 01:51:30 +01005806{
kctherookied93fbbf2019-03-29 00:59:06 +07005807 HCERTSTORE hCollectionStore = NULL;
Christian Heimes44109d72013-11-22 01:51:30 +01005808 PCCRL_CONTEXT pCrlCtx = NULL;
5809 PyObject *crl = NULL, *enc = NULL, *tup = NULL;
5810 PyObject *result = NULL;
5811
Christian Heimes915cd3f2019-09-09 18:06:55 +02005812 result = PySet_New(NULL);
Christian Heimes44109d72013-11-22 01:51:30 +01005813 if (result == NULL) {
5814 return NULL;
5815 }
kctherookied93fbbf2019-03-29 00:59:06 +07005816 hCollectionStore = ssl_collect_certificates(store_name);
5817 if (hCollectionStore == NULL) {
Christian Heimes46bebee2013-06-09 19:03:31 +02005818 Py_DECREF(result);
5819 return PyErr_SetFromWindowsErr(GetLastError());
5820 }
Christian Heimes44109d72013-11-22 01:51:30 +01005821
kctherookied93fbbf2019-03-29 00:59:06 +07005822 while (pCrlCtx = CertEnumCRLsInStore(hCollectionStore, pCrlCtx)) {
Christian Heimes44109d72013-11-22 01:51:30 +01005823 crl = PyBytes_FromStringAndSize((const char*)pCrlCtx->pbCrlEncoded,
5824 pCrlCtx->cbCrlEncoded);
5825 if (!crl) {
5826 Py_CLEAR(result);
5827 break;
5828 }
5829 if ((enc = certEncodingType(pCrlCtx->dwCertEncodingType)) == NULL) {
5830 Py_CLEAR(result);
5831 break;
5832 }
5833 if ((tup = PyTuple_New(2)) == NULL) {
5834 Py_CLEAR(result);
5835 break;
5836 }
5837 PyTuple_SET_ITEM(tup, 0, crl);
5838 crl = NULL;
5839 PyTuple_SET_ITEM(tup, 1, enc);
5840 enc = NULL;
5841
Christian Heimes915cd3f2019-09-09 18:06:55 +02005842 if (PySet_Add(result, tup) == -1) {
5843 Py_CLEAR(result);
5844 Py_CLEAR(tup);
5845 break;
Christian Heimes44109d72013-11-22 01:51:30 +01005846 }
5847 Py_CLEAR(tup);
Christian Heimes46bebee2013-06-09 19:03:31 +02005848 }
Christian Heimes44109d72013-11-22 01:51:30 +01005849 if (pCrlCtx) {
5850 /* loop ended with an error, need to clean up context manually */
5851 CertFreeCRLContext(pCrlCtx);
5852 }
5853
5854 /* In error cases cert, enc and tup may not be NULL */
5855 Py_XDECREF(crl);
5856 Py_XDECREF(enc);
5857 Py_XDECREF(tup);
5858
kctherookied93fbbf2019-03-29 00:59:06 +07005859 /* CERT_CLOSE_STORE_FORCE_FLAG forces freeing of memory for all contexts
5860 associated with the store, in this case our collection store and the
5861 associated system stores. */
5862 if (!CertCloseStore(hCollectionStore, CERT_CLOSE_STORE_FORCE_FLAG)) {
Christian Heimes44109d72013-11-22 01:51:30 +01005863 /* This error case might shadow another exception.*/
5864 Py_XDECREF(result);
5865 return PyErr_SetFromWindowsErr(GetLastError());
5866 }
Christian Heimes915cd3f2019-09-09 18:06:55 +02005867 /* convert set to list */
5868 if (result == NULL) {
5869 return NULL;
5870 } else {
5871 PyObject *lst = PySequence_List(result);
5872 Py_DECREF(result);
5873 return lst;
5874 }
Christian Heimes46bebee2013-06-09 19:03:31 +02005875}
Christian Heimes44109d72013-11-22 01:51:30 +01005876
5877#endif /* _MSC_VER */
Bill Janssen40a0f662008-08-12 16:56:25 +00005878
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005879/* List of functions exported by this module. */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005880static PyMethodDef PySSL_methods[] = {
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03005881 _SSL__TEST_DECODE_CERT_METHODDEF
5882 _SSL_RAND_ADD_METHODDEF
5883 _SSL_RAND_BYTES_METHODDEF
5884 _SSL_RAND_PSEUDO_BYTES_METHODDEF
5885 _SSL_RAND_EGD_METHODDEF
5886 _SSL_RAND_STATUS_METHODDEF
5887 _SSL_GET_DEFAULT_VERIFY_PATHS_METHODDEF
5888 _SSL_ENUM_CERTIFICATES_METHODDEF
5889 _SSL_ENUM_CRLS_METHODDEF
5890 _SSL_TXT2OBJ_METHODDEF
5891 _SSL_NID2OBJ_METHODDEF
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00005892 {NULL, NULL} /* Sentinel */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005893};
5894
5895
Christian Heimes598894f2016-09-05 23:19:05 +02005896#ifdef HAVE_OPENSSL_CRYPTO_LOCK
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005897
5898/* an implementation of OpenSSL threading operations in terms
Christian Heimes598894f2016-09-05 23:19:05 +02005899 * of the Python C thread library
5900 * Only used up to 1.0.2. OpenSSL 1.1.0+ has its own locking code.
5901 */
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005902
5903static PyThread_type_lock *_ssl_locks = NULL;
5904
Christian Heimes4d98ca92013-08-19 17:36:29 +02005905#if OPENSSL_VERSION_NUMBER >= 0x10000000
5906/* use new CRYPTO_THREADID API. */
5907static void
5908_ssl_threadid_callback(CRYPTO_THREADID *id)
5909{
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +02005910 CRYPTO_THREADID_set_numeric(id, PyThread_get_thread_ident());
Christian Heimes4d98ca92013-08-19 17:36:29 +02005911}
5912#else
5913/* deprecated CRYPTO_set_id_callback() API. */
5914static unsigned long
5915_ssl_thread_id_function (void) {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00005916 return PyThread_get_thread_ident();
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005917}
Christian Heimes4d98ca92013-08-19 17:36:29 +02005918#endif
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005919
Bill Janssen6e027db2007-11-15 22:23:56 +00005920static void _ssl_thread_locking_function
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00005921 (int mode, int n, const char *file, int line) {
5922 /* this function is needed to perform locking on shared data
5923 structures. (Note that OpenSSL uses a number of global data
5924 structures that will be implicitly shared whenever multiple
5925 threads use OpenSSL.) Multi-threaded applications will
5926 crash at random if it is not set.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005927
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00005928 locking_function() must be able to handle up to
5929 CRYPTO_num_locks() different mutex locks. It sets the n-th
5930 lock if mode & CRYPTO_LOCK, and releases it otherwise.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005931
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00005932 file and line are the file number of the function setting the
5933 lock. They can be useful for debugging.
5934 */
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005935
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00005936 if ((_ssl_locks == NULL) ||
5937 (n < 0) || ((unsigned)n >= _ssl_locks_count))
5938 return;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005939
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00005940 if (mode & CRYPTO_LOCK) {
5941 PyThread_acquire_lock(_ssl_locks[n], 1);
5942 } else {
5943 PyThread_release_lock(_ssl_locks[n]);
5944 }
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005945}
5946
5947static int _setup_ssl_threads(void) {
5948
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00005949 unsigned int i;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005950
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00005951 if (_ssl_locks == NULL) {
5952 _ssl_locks_count = CRYPTO_num_locks();
Christian Heimesf6365e32016-09-13 20:48:13 +02005953 _ssl_locks = PyMem_Calloc(_ssl_locks_count,
5954 sizeof(PyThread_type_lock));
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02005955 if (_ssl_locks == NULL) {
5956 PyErr_NoMemory();
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00005957 return 0;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02005958 }
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00005959 for (i = 0; i < _ssl_locks_count; i++) {
5960 _ssl_locks[i] = PyThread_allocate_lock();
5961 if (_ssl_locks[i] == NULL) {
5962 unsigned int j;
5963 for (j = 0; j < i; j++) {
5964 PyThread_free_lock(_ssl_locks[j]);
5965 }
Victor Stinnerb6404912013-07-07 16:21:41 +02005966 PyMem_Free(_ssl_locks);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00005967 return 0;
5968 }
5969 }
5970 CRYPTO_set_locking_callback(_ssl_thread_locking_function);
Christian Heimes4d98ca92013-08-19 17:36:29 +02005971#if OPENSSL_VERSION_NUMBER >= 0x10000000
5972 CRYPTO_THREADID_set_callback(_ssl_threadid_callback);
5973#else
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00005974 CRYPTO_set_id_callback(_ssl_thread_id_function);
Christian Heimes4d98ca92013-08-19 17:36:29 +02005975#endif
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00005976 }
5977 return 1;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005978}
5979
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02005980#endif /* HAVE_OPENSSL_CRYPTO_LOCK for OpenSSL < 1.1.0 */
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005981
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005982PyDoc_STRVAR(module_doc,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005983"Implementation module for SSL socket operations. See the socket module\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005984for documentation.");
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005985
Martin v. Löwis1a214512008-06-11 05:26:20 +00005986
5987static struct PyModuleDef _sslmodule = {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00005988 PyModuleDef_HEAD_INIT,
5989 "_ssl",
5990 module_doc,
5991 -1,
5992 PySSL_methods,
5993 NULL,
5994 NULL,
5995 NULL,
5996 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00005997};
5998
Antoine Pitroub9ac25d2011-07-08 18:47:06 +02005999
6000static void
6001parse_openssl_version(unsigned long libver,
6002 unsigned int *major, unsigned int *minor,
6003 unsigned int *fix, unsigned int *patch,
6004 unsigned int *status)
6005{
6006 *status = libver & 0xF;
6007 libver >>= 4;
6008 *patch = libver & 0xFF;
6009 libver >>= 8;
6010 *fix = libver & 0xFF;
6011 libver >>= 8;
6012 *minor = libver & 0xFF;
6013 libver >>= 8;
6014 *major = libver & 0xFF;
6015}
6016
Mark Hammondfe51c6d2002-08-02 02:27:13 +00006017PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00006018PyInit__ssl(void)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006019{
Christian Heimesb3ad0e52017-09-08 12:00:19 -07006020 PyObject *m, *d, *r, *bases;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00006021 unsigned long libver;
6022 unsigned int major, minor, fix, patch, status;
6023 PySocketModule_APIObject *socket_api;
Antoine Pitrou3b36fb12012-06-22 21:11:52 +02006024 struct py_ssl_error_code *errcode;
6025 struct py_ssl_library_code *libcode;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006026
Antoine Pitrou152efa22010-05-16 18:19:27 +00006027 if (PyType_Ready(&PySSLContext_Type) < 0)
6028 return NULL;
6029 if (PyType_Ready(&PySSLSocket_Type) < 0)
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00006030 return NULL;
Antoine Pitroub1fdf472014-10-05 20:41:53 +02006031 if (PyType_Ready(&PySSLMemoryBIO_Type) < 0)
6032 return NULL;
Christian Heimes99a65702016-09-10 23:44:53 +02006033 if (PyType_Ready(&PySSLSession_Type) < 0)
6034 return NULL;
6035
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006036
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00006037 m = PyModule_Create(&_sslmodule);
6038 if (m == NULL)
6039 return NULL;
6040 d = PyModule_GetDict(m);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006041
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00006042 /* Load _socket module and its C API */
6043 socket_api = PySocketModule_ImportModuleAndAPI();
6044 if (!socket_api)
6045 return NULL;
6046 PySocketModule = *socket_api;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006047
Christian Heimesc941e622017-09-05 15:47:11 +02006048#ifndef OPENSSL_VERSION_1_1
6049 /* Load all algorithms and initialize cpuid */
6050 OPENSSL_add_all_algorithms_noconf();
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00006051 /* Init OpenSSL */
6052 SSL_load_error_strings();
6053 SSL_library_init();
Christian Heimesc941e622017-09-05 15:47:11 +02006054#endif
6055
Christian Heimes598894f2016-09-05 23:19:05 +02006056#ifdef HAVE_OPENSSL_CRYPTO_LOCK
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00006057 /* note that this will start threading if not already started */
6058 if (!_setup_ssl_threads()) {
6059 return NULL;
6060 }
Christian Heimesc087a262020-05-15 20:55:25 +02006061#elif OPENSSL_VERSION_1_1
Christian Heimes598894f2016-09-05 23:19:05 +02006062 /* OpenSSL 1.1.0 builtin thread support is enabled */
6063 _ssl_locks_count++;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00006064#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006065
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00006066 /* Add symbols to module dict */
Antoine Pitrou3b36fb12012-06-22 21:11:52 +02006067 sslerror_type_slots[0].pfunc = PyExc_OSError;
6068 PySSLErrorObject = PyType_FromSpec(&sslerror_type_spec);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00006069 if (PySSLErrorObject == NULL)
6070 return NULL;
Antoine Pitrou3b36fb12012-06-22 21:11:52 +02006071
Christian Heimesb3ad0e52017-09-08 12:00:19 -07006072 /* ssl.CertificateError used to be a subclass of ValueError */
6073 bases = Py_BuildValue("OO", PySSLErrorObject, PyExc_ValueError);
6074 if (bases == NULL)
6075 return NULL;
6076 PySSLCertVerificationErrorObject = PyErr_NewExceptionWithDoc(
6077 "ssl.SSLCertVerificationError", SSLCertVerificationError_doc,
6078 bases, NULL);
6079 Py_DECREF(bases);
Antoine Pitrou41032a62011-10-27 23:56:55 +02006080 PySSLZeroReturnErrorObject = PyErr_NewExceptionWithDoc(
6081 "ssl.SSLZeroReturnError", SSLZeroReturnError_doc,
6082 PySSLErrorObject, NULL);
6083 PySSLWantReadErrorObject = PyErr_NewExceptionWithDoc(
6084 "ssl.SSLWantReadError", SSLWantReadError_doc,
6085 PySSLErrorObject, NULL);
6086 PySSLWantWriteErrorObject = PyErr_NewExceptionWithDoc(
6087 "ssl.SSLWantWriteError", SSLWantWriteError_doc,
6088 PySSLErrorObject, NULL);
6089 PySSLSyscallErrorObject = PyErr_NewExceptionWithDoc(
6090 "ssl.SSLSyscallError", SSLSyscallError_doc,
6091 PySSLErrorObject, NULL);
6092 PySSLEOFErrorObject = PyErr_NewExceptionWithDoc(
6093 "ssl.SSLEOFError", SSLEOFError_doc,
6094 PySSLErrorObject, NULL);
Christian Heimesb3ad0e52017-09-08 12:00:19 -07006095 if (PySSLCertVerificationErrorObject == NULL
6096 || PySSLZeroReturnErrorObject == NULL
Antoine Pitrou41032a62011-10-27 23:56:55 +02006097 || PySSLWantReadErrorObject == NULL
6098 || PySSLWantWriteErrorObject == NULL
6099 || PySSLSyscallErrorObject == NULL
6100 || PySSLEOFErrorObject == NULL)
6101 return NULL;
6102 if (PyDict_SetItemString(d, "SSLError", PySSLErrorObject) != 0
Christian Heimesb3ad0e52017-09-08 12:00:19 -07006103 || PyDict_SetItemString(d, "SSLCertVerificationError",
6104 PySSLCertVerificationErrorObject) != 0
Antoine Pitrou41032a62011-10-27 23:56:55 +02006105 || PyDict_SetItemString(d, "SSLZeroReturnError", PySSLZeroReturnErrorObject) != 0
6106 || PyDict_SetItemString(d, "SSLWantReadError", PySSLWantReadErrorObject) != 0
6107 || PyDict_SetItemString(d, "SSLWantWriteError", PySSLWantWriteErrorObject) != 0
6108 || PyDict_SetItemString(d, "SSLSyscallError", PySSLSyscallErrorObject) != 0
6109 || PyDict_SetItemString(d, "SSLEOFError", PySSLEOFErrorObject) != 0)
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00006110 return NULL;
Antoine Pitrou152efa22010-05-16 18:19:27 +00006111 if (PyDict_SetItemString(d, "_SSLContext",
6112 (PyObject *)&PySSLContext_Type) != 0)
6113 return NULL;
6114 if (PyDict_SetItemString(d, "_SSLSocket",
6115 (PyObject *)&PySSLSocket_Type) != 0)
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00006116 return NULL;
Antoine Pitroub1fdf472014-10-05 20:41:53 +02006117 if (PyDict_SetItemString(d, "MemoryBIO",
6118 (PyObject *)&PySSLMemoryBIO_Type) != 0)
6119 return NULL;
Christian Heimes99a65702016-09-10 23:44:53 +02006120 if (PyDict_SetItemString(d, "SSLSession",
6121 (PyObject *)&PySSLSession_Type) != 0)
6122 return NULL;
6123
Christian Heimes892d66e2018-01-29 14:10:18 +01006124 PyModule_AddStringConstant(m, "_DEFAULT_CIPHERS",
6125 PY_SSL_DEFAULT_CIPHER_STRING);
6126
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00006127 PyModule_AddIntConstant(m, "SSL_ERROR_ZERO_RETURN",
6128 PY_SSL_ERROR_ZERO_RETURN);
6129 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_READ",
6130 PY_SSL_ERROR_WANT_READ);
6131 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_WRITE",
6132 PY_SSL_ERROR_WANT_WRITE);
6133 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_X509_LOOKUP",
6134 PY_SSL_ERROR_WANT_X509_LOOKUP);
6135 PyModule_AddIntConstant(m, "SSL_ERROR_SYSCALL",
6136 PY_SSL_ERROR_SYSCALL);
6137 PyModule_AddIntConstant(m, "SSL_ERROR_SSL",
6138 PY_SSL_ERROR_SSL);
6139 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_CONNECT",
6140 PY_SSL_ERROR_WANT_CONNECT);
6141 /* non ssl.h errorcodes */
6142 PyModule_AddIntConstant(m, "SSL_ERROR_EOF",
6143 PY_SSL_ERROR_EOF);
6144 PyModule_AddIntConstant(m, "SSL_ERROR_INVALID_ERROR_CODE",
6145 PY_SSL_ERROR_INVALID_ERROR_CODE);
6146 /* cert requirements */
6147 PyModule_AddIntConstant(m, "CERT_NONE",
6148 PY_SSL_CERT_NONE);
6149 PyModule_AddIntConstant(m, "CERT_OPTIONAL",
6150 PY_SSL_CERT_OPTIONAL);
6151 PyModule_AddIntConstant(m, "CERT_REQUIRED",
6152 PY_SSL_CERT_REQUIRED);
Christian Heimes22587792013-11-21 23:56:13 +01006153 /* CRL verification for verification_flags */
6154 PyModule_AddIntConstant(m, "VERIFY_DEFAULT",
6155 0);
6156 PyModule_AddIntConstant(m, "VERIFY_CRL_CHECK_LEAF",
6157 X509_V_FLAG_CRL_CHECK);
6158 PyModule_AddIntConstant(m, "VERIFY_CRL_CHECK_CHAIN",
6159 X509_V_FLAG_CRL_CHECK|X509_V_FLAG_CRL_CHECK_ALL);
6160 PyModule_AddIntConstant(m, "VERIFY_X509_STRICT",
6161 X509_V_FLAG_X509_STRICT);
Benjamin Peterson990fcaa2015-03-04 22:49:41 -05006162#ifdef X509_V_FLAG_TRUSTED_FIRST
6163 PyModule_AddIntConstant(m, "VERIFY_X509_TRUSTED_FIRST",
6164 X509_V_FLAG_TRUSTED_FIRST);
6165#endif
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00006166
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01006167 /* Alert Descriptions from ssl.h */
6168 /* note RESERVED constants no longer intended for use have been removed */
6169 /* http://www.iana.org/assignments/tls-parameters/tls-parameters.xml#tls-parameters-6 */
6170
6171#define ADD_AD_CONSTANT(s) \
6172 PyModule_AddIntConstant(m, "ALERT_DESCRIPTION_"#s, \
6173 SSL_AD_##s)
6174
6175 ADD_AD_CONSTANT(CLOSE_NOTIFY);
6176 ADD_AD_CONSTANT(UNEXPECTED_MESSAGE);
6177 ADD_AD_CONSTANT(BAD_RECORD_MAC);
6178 ADD_AD_CONSTANT(RECORD_OVERFLOW);
6179 ADD_AD_CONSTANT(DECOMPRESSION_FAILURE);
6180 ADD_AD_CONSTANT(HANDSHAKE_FAILURE);
6181 ADD_AD_CONSTANT(BAD_CERTIFICATE);
6182 ADD_AD_CONSTANT(UNSUPPORTED_CERTIFICATE);
6183 ADD_AD_CONSTANT(CERTIFICATE_REVOKED);
6184 ADD_AD_CONSTANT(CERTIFICATE_EXPIRED);
6185 ADD_AD_CONSTANT(CERTIFICATE_UNKNOWN);
6186 ADD_AD_CONSTANT(ILLEGAL_PARAMETER);
6187 ADD_AD_CONSTANT(UNKNOWN_CA);
6188 ADD_AD_CONSTANT(ACCESS_DENIED);
6189 ADD_AD_CONSTANT(DECODE_ERROR);
6190 ADD_AD_CONSTANT(DECRYPT_ERROR);
6191 ADD_AD_CONSTANT(PROTOCOL_VERSION);
6192 ADD_AD_CONSTANT(INSUFFICIENT_SECURITY);
6193 ADD_AD_CONSTANT(INTERNAL_ERROR);
6194 ADD_AD_CONSTANT(USER_CANCELLED);
6195 ADD_AD_CONSTANT(NO_RENEGOTIATION);
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01006196 /* Not all constants are in old OpenSSL versions */
Antoine Pitrou912fbff2013-03-30 16:29:32 +01006197#ifdef SSL_AD_UNSUPPORTED_EXTENSION
6198 ADD_AD_CONSTANT(UNSUPPORTED_EXTENSION);
6199#endif
6200#ifdef SSL_AD_CERTIFICATE_UNOBTAINABLE
6201 ADD_AD_CONSTANT(CERTIFICATE_UNOBTAINABLE);
6202#endif
6203#ifdef SSL_AD_UNRECOGNIZED_NAME
6204 ADD_AD_CONSTANT(UNRECOGNIZED_NAME);
6205#endif
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01006206#ifdef SSL_AD_BAD_CERTIFICATE_STATUS_RESPONSE
6207 ADD_AD_CONSTANT(BAD_CERTIFICATE_STATUS_RESPONSE);
6208#endif
6209#ifdef SSL_AD_BAD_CERTIFICATE_HASH_VALUE
6210 ADD_AD_CONSTANT(BAD_CERTIFICATE_HASH_VALUE);
6211#endif
6212#ifdef SSL_AD_UNKNOWN_PSK_IDENTITY
6213 ADD_AD_CONSTANT(UNKNOWN_PSK_IDENTITY);
6214#endif
6215
6216#undef ADD_AD_CONSTANT
6217
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00006218 /* protocol versions */
Victor Stinner3de49192011-05-09 00:42:58 +02006219#ifndef OPENSSL_NO_SSL2
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00006220 PyModule_AddIntConstant(m, "PROTOCOL_SSLv2",
6221 PY_SSL_VERSION_SSL2);
Victor Stinner3de49192011-05-09 00:42:58 +02006222#endif
Benjamin Petersone32467c2014-12-05 21:59:35 -05006223#ifndef OPENSSL_NO_SSL3
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00006224 PyModule_AddIntConstant(m, "PROTOCOL_SSLv3",
6225 PY_SSL_VERSION_SSL3);
Benjamin Petersone32467c2014-12-05 21:59:35 -05006226#endif
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00006227 PyModule_AddIntConstant(m, "PROTOCOL_SSLv23",
Christian Heimes598894f2016-09-05 23:19:05 +02006228 PY_SSL_VERSION_TLS);
6229 PyModule_AddIntConstant(m, "PROTOCOL_TLS",
6230 PY_SSL_VERSION_TLS);
Christian Heimes5fe668c2016-09-12 00:01:11 +02006231 PyModule_AddIntConstant(m, "PROTOCOL_TLS_CLIENT",
6232 PY_SSL_VERSION_TLS_CLIENT);
6233 PyModule_AddIntConstant(m, "PROTOCOL_TLS_SERVER",
6234 PY_SSL_VERSION_TLS_SERVER);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00006235 PyModule_AddIntConstant(m, "PROTOCOL_TLSv1",
6236 PY_SSL_VERSION_TLS1);
Antoine Pitrou2463e5f2013-03-28 22:24:43 +01006237 PyModule_AddIntConstant(m, "PROTOCOL_TLSv1_1",
6238 PY_SSL_VERSION_TLS1_1);
6239 PyModule_AddIntConstant(m, "PROTOCOL_TLSv1_2",
6240 PY_SSL_VERSION_TLS1_2);
Antoine Pitrou04f6a322010-04-05 21:40:07 +00006241
Antoine Pitroub5218772010-05-21 09:56:06 +00006242 /* protocol options */
Antoine Pitrou3f366312012-01-27 09:50:45 +01006243 PyModule_AddIntConstant(m, "OP_ALL",
6244 SSL_OP_ALL & ~SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS);
Antoine Pitroub5218772010-05-21 09:56:06 +00006245 PyModule_AddIntConstant(m, "OP_NO_SSLv2", SSL_OP_NO_SSLv2);
6246 PyModule_AddIntConstant(m, "OP_NO_SSLv3", SSL_OP_NO_SSLv3);
6247 PyModule_AddIntConstant(m, "OP_NO_TLSv1", SSL_OP_NO_TLSv1);
Antoine Pitrou2463e5f2013-03-28 22:24:43 +01006248 PyModule_AddIntConstant(m, "OP_NO_TLSv1_1", SSL_OP_NO_TLSv1_1);
6249 PyModule_AddIntConstant(m, "OP_NO_TLSv1_2", SSL_OP_NO_TLSv1_2);
Christian Heimescb5b68a2017-09-07 18:07:00 -07006250#ifdef SSL_OP_NO_TLSv1_3
6251 PyModule_AddIntConstant(m, "OP_NO_TLSv1_3", SSL_OP_NO_TLSv1_3);
6252#else
6253 PyModule_AddIntConstant(m, "OP_NO_TLSv1_3", 0);
6254#endif
Antoine Pitrou6db49442011-12-19 13:27:11 +01006255 PyModule_AddIntConstant(m, "OP_CIPHER_SERVER_PREFERENCE",
6256 SSL_OP_CIPHER_SERVER_PREFERENCE);
Antoine Pitrou0e576f12011-12-22 10:03:38 +01006257 PyModule_AddIntConstant(m, "OP_SINGLE_DH_USE", SSL_OP_SINGLE_DH_USE);
Christian Heimes99a65702016-09-10 23:44:53 +02006258 PyModule_AddIntConstant(m, "OP_NO_TICKET", SSL_OP_NO_TICKET);
Antoine Pitroue9fccb32012-02-17 11:53:10 +01006259#ifdef SSL_OP_SINGLE_ECDH_USE
Antoine Pitrou923df6f2011-12-19 17:16:51 +01006260 PyModule_AddIntConstant(m, "OP_SINGLE_ECDH_USE", SSL_OP_SINGLE_ECDH_USE);
Antoine Pitroue9fccb32012-02-17 11:53:10 +01006261#endif
Antoine Pitrou8abdb8a2011-12-20 10:13:40 +01006262#ifdef SSL_OP_NO_COMPRESSION
6263 PyModule_AddIntConstant(m, "OP_NO_COMPRESSION",
6264 SSL_OP_NO_COMPRESSION);
6265#endif
Christian Heimes05d9fe32018-02-27 08:55:39 +01006266#ifdef SSL_OP_ENABLE_MIDDLEBOX_COMPAT
6267 PyModule_AddIntConstant(m, "OP_ENABLE_MIDDLEBOX_COMPAT",
6268 SSL_OP_ENABLE_MIDDLEBOX_COMPAT);
6269#endif
Christian Heimes67c48012018-05-15 16:25:40 -04006270#ifdef SSL_OP_NO_RENEGOTIATION
6271 PyModule_AddIntConstant(m, "OP_NO_RENEGOTIATION",
6272 SSL_OP_NO_RENEGOTIATION);
6273#endif
Antoine Pitroub5218772010-05-21 09:56:06 +00006274
Christian Heimes61d478c2018-01-27 15:51:38 +01006275#ifdef X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT
6276 PyModule_AddIntConstant(m, "HOSTFLAG_ALWAYS_CHECK_SUBJECT",
6277 X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT);
6278#endif
6279#ifdef X509_CHECK_FLAG_NEVER_CHECK_SUBJECT
6280 PyModule_AddIntConstant(m, "HOSTFLAG_NEVER_CHECK_SUBJECT",
6281 X509_CHECK_FLAG_NEVER_CHECK_SUBJECT);
6282#endif
6283#ifdef X509_CHECK_FLAG_NO_WILDCARDS
6284 PyModule_AddIntConstant(m, "HOSTFLAG_NO_WILDCARDS",
6285 X509_CHECK_FLAG_NO_WILDCARDS);
6286#endif
6287#ifdef X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS
6288 PyModule_AddIntConstant(m, "HOSTFLAG_NO_PARTIAL_WILDCARDS",
6289 X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS);
6290#endif
6291#ifdef X509_CHECK_FLAG_MULTI_LABEL_WILDCARDS
6292 PyModule_AddIntConstant(m, "HOSTFLAG_MULTI_LABEL_WILDCARDS",
6293 X509_CHECK_FLAG_MULTI_LABEL_WILDCARDS);
6294#endif
6295#ifdef X509_CHECK_FLAG_SINGLE_LABEL_SUBDOMAINS
6296 PyModule_AddIntConstant(m, "HOSTFLAG_SINGLE_LABEL_SUBDOMAINS",
6297 X509_CHECK_FLAG_SINGLE_LABEL_SUBDOMAINS);
6298#endif
6299
Christian Heimes698dde12018-02-27 11:54:43 +01006300 /* protocol versions */
6301 PyModule_AddIntConstant(m, "PROTO_MINIMUM_SUPPORTED",
6302 PY_PROTO_MINIMUM_SUPPORTED);
6303 PyModule_AddIntConstant(m, "PROTO_MAXIMUM_SUPPORTED",
6304 PY_PROTO_MAXIMUM_SUPPORTED);
6305 PyModule_AddIntConstant(m, "PROTO_SSLv3", PY_PROTO_SSLv3);
6306 PyModule_AddIntConstant(m, "PROTO_TLSv1", PY_PROTO_TLSv1);
6307 PyModule_AddIntConstant(m, "PROTO_TLSv1_1", PY_PROTO_TLSv1_1);
6308 PyModule_AddIntConstant(m, "PROTO_TLSv1_2", PY_PROTO_TLSv1_2);
6309 PyModule_AddIntConstant(m, "PROTO_TLSv1_3", PY_PROTO_TLSv1_3);
Antoine Pitroud5323212010-10-22 18:19:07 +00006310
Victor Stinnerb37672d2018-11-22 03:37:50 +01006311#define addbool(m, key, value) \
6312 do { \
6313 PyObject *bool_obj = (value) ? Py_True : Py_False; \
6314 Py_INCREF(bool_obj); \
6315 PyModule_AddObject((m), (key), bool_obj); \
6316 } while (0)
Christian Heimes698dde12018-02-27 11:54:43 +01006317
6318#if HAVE_SNI
6319 addbool(m, "HAS_SNI", 1);
Antoine Pitrou501da612011-12-21 09:27:41 +01006320#else
Christian Heimes698dde12018-02-27 11:54:43 +01006321 addbool(m, "HAS_SNI", 0);
Antoine Pitrou501da612011-12-21 09:27:41 +01006322#endif
Christian Heimes698dde12018-02-27 11:54:43 +01006323
6324 addbool(m, "HAS_TLS_UNIQUE", 1);
6325
6326#ifndef OPENSSL_NO_ECDH
6327 addbool(m, "HAS_ECDH", 1);
6328#else
6329 addbool(m, "HAS_ECDH", 0);
6330#endif
Antoine Pitrou501da612011-12-21 09:27:41 +01006331
Christian Heimes29eab552018-02-25 12:31:33 +01006332#if HAVE_NPN
Christian Heimes698dde12018-02-27 11:54:43 +01006333 addbool(m, "HAS_NPN", 1);
Antoine Pitroud5d17eb2012-03-22 00:23:03 +01006334#else
Christian Heimes698dde12018-02-27 11:54:43 +01006335 addbool(m, "HAS_NPN", 0);
Antoine Pitroud5d17eb2012-03-22 00:23:03 +01006336#endif
Antoine Pitroud5d17eb2012-03-22 00:23:03 +01006337
Christian Heimes29eab552018-02-25 12:31:33 +01006338#if HAVE_ALPN
Christian Heimes698dde12018-02-27 11:54:43 +01006339 addbool(m, "HAS_ALPN", 1);
Benjamin Petersoncca27322015-01-23 16:35:37 -05006340#else
Christian Heimes698dde12018-02-27 11:54:43 +01006341 addbool(m, "HAS_ALPN", 0);
Benjamin Petersoncca27322015-01-23 16:35:37 -05006342#endif
Christian Heimes698dde12018-02-27 11:54:43 +01006343
6344#if defined(SSL2_VERSION) && !defined(OPENSSL_NO_SSL2)
6345 addbool(m, "HAS_SSLv2", 1);
6346#else
6347 addbool(m, "HAS_SSLv2", 0);
6348#endif
6349
6350#if defined(SSL3_VERSION) && !defined(OPENSSL_NO_SSL3)
6351 addbool(m, "HAS_SSLv3", 1);
6352#else
6353 addbool(m, "HAS_SSLv3", 0);
6354#endif
6355
6356#if defined(TLS1_VERSION) && !defined(OPENSSL_NO_TLS1)
6357 addbool(m, "HAS_TLSv1", 1);
6358#else
6359 addbool(m, "HAS_TLSv1", 0);
6360#endif
6361
6362#if defined(TLS1_1_VERSION) && !defined(OPENSSL_NO_TLS1_1)
6363 addbool(m, "HAS_TLSv1_1", 1);
6364#else
6365 addbool(m, "HAS_TLSv1_1", 0);
6366#endif
6367
6368#if defined(TLS1_2_VERSION) && !defined(OPENSSL_NO_TLS1_2)
6369 addbool(m, "HAS_TLSv1_2", 1);
6370#else
6371 addbool(m, "HAS_TLSv1_2", 0);
6372#endif
Benjamin Petersoncca27322015-01-23 16:35:37 -05006373
Christian Heimescb5b68a2017-09-07 18:07:00 -07006374#if defined(TLS1_3_VERSION) && !defined(OPENSSL_NO_TLS1_3)
Christian Heimes698dde12018-02-27 11:54:43 +01006375 addbool(m, "HAS_TLSv1_3", 1);
Christian Heimescb5b68a2017-09-07 18:07:00 -07006376#else
Christian Heimes698dde12018-02-27 11:54:43 +01006377 addbool(m, "HAS_TLSv1_3", 0);
Christian Heimescb5b68a2017-09-07 18:07:00 -07006378#endif
Christian Heimescb5b68a2017-09-07 18:07:00 -07006379
Antoine Pitrou3b36fb12012-06-22 21:11:52 +02006380 /* Mappings for error codes */
6381 err_codes_to_names = PyDict_New();
6382 err_names_to_codes = PyDict_New();
6383 if (err_codes_to_names == NULL || err_names_to_codes == NULL)
6384 return NULL;
6385 errcode = error_codes;
6386 while (errcode->mnemonic != NULL) {
6387 PyObject *mnemo, *key;
6388 mnemo = PyUnicode_FromString(errcode->mnemonic);
6389 key = Py_BuildValue("ii", errcode->library, errcode->reason);
6390 if (mnemo == NULL || key == NULL)
6391 return NULL;
6392 if (PyDict_SetItem(err_codes_to_names, key, mnemo))
6393 return NULL;
6394 if (PyDict_SetItem(err_names_to_codes, mnemo, key))
6395 return NULL;
6396 Py_DECREF(key);
6397 Py_DECREF(mnemo);
6398 errcode++;
6399 }
6400 if (PyModule_AddObject(m, "err_codes_to_names", err_codes_to_names))
6401 return NULL;
6402 if (PyModule_AddObject(m, "err_names_to_codes", err_names_to_codes))
6403 return NULL;
6404
6405 lib_codes_to_names = PyDict_New();
6406 if (lib_codes_to_names == NULL)
6407 return NULL;
6408 libcode = library_codes;
6409 while (libcode->library != NULL) {
6410 PyObject *mnemo, *key;
6411 key = PyLong_FromLong(libcode->code);
6412 mnemo = PyUnicode_FromString(libcode->library);
6413 if (key == NULL || mnemo == NULL)
6414 return NULL;
6415 if (PyDict_SetItem(lib_codes_to_names, key, mnemo))
6416 return NULL;
6417 Py_DECREF(key);
6418 Py_DECREF(mnemo);
6419 libcode++;
6420 }
6421 if (PyModule_AddObject(m, "lib_codes_to_names", lib_codes_to_names))
6422 return NULL;
Victor Stinner4569cd52013-06-23 14:58:43 +02006423
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00006424 /* OpenSSL version */
6425 /* SSLeay() gives us the version of the library linked against,
6426 which could be different from the headers version.
6427 */
Christian Heimesa871f692020-06-01 08:58:14 +02006428 libver = OpenSSL_version_num();
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00006429 r = PyLong_FromUnsignedLong(libver);
6430 if (r == NULL)
6431 return NULL;
6432 if (PyModule_AddObject(m, "OPENSSL_VERSION_NUMBER", r))
6433 return NULL;
Antoine Pitroub9ac25d2011-07-08 18:47:06 +02006434 parse_openssl_version(libver, &major, &minor, &fix, &patch, &status);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00006435 r = Py_BuildValue("IIIII", major, minor, fix, patch, status);
6436 if (r == NULL || PyModule_AddObject(m, "OPENSSL_VERSION_INFO", r))
6437 return NULL;
Christian Heimesa871f692020-06-01 08:58:14 +02006438 r = PyUnicode_FromString(OpenSSL_version(OPENSSL_VERSION));
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00006439 if (r == NULL || PyModule_AddObject(m, "OPENSSL_VERSION", r))
6440 return NULL;
Antoine Pitrou04f6a322010-04-05 21:40:07 +00006441
Antoine Pitroub9ac25d2011-07-08 18:47:06 +02006442 libver = OPENSSL_VERSION_NUMBER;
6443 parse_openssl_version(libver, &major, &minor, &fix, &patch, &status);
6444 r = Py_BuildValue("IIIII", major, minor, fix, patch, status);
6445 if (r == NULL || PyModule_AddObject(m, "_OPENSSL_API_VERSION", r))
6446 return NULL;
6447
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00006448 return m;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006449}