blob: 94b06dd4b79e703fd93da60a334dacd3bf16a1e9 [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
Christian Heimes5c36da72020-11-20 09:40:12 +0100490static PyTypeObject *PySSLContext_Type;
491static PyTypeObject *PySSLSocket_Type;
492static PyTypeObject *PySSLMemoryBIO_Type;
493static 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
Christian Heimes5c36da72020-11-20 09:40:12 +0100511class _ssl._SSLContext "PySSLContext *" "PySSLContext_Type"
512class _ssl._SSLSocket "PySSLSocket *" "PySSLSocket_Type"
513class _ssl.MemoryBIO "PySSLMemoryBIO *" "PySSLMemoryBIO_Type"
514class _ssl.SSLSession "PySSLSession *" "PySSLSession_Type"
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +0300515[clinic start generated code]*/
Christian Heimes5c36da72020-11-20 09:40:12 +0100516/*[clinic end generated code: output=da39a3ee5e6b4b0d input=cc4883756da17954]*/
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 *);
Christian Heimes5c36da72020-11-20 09:40:12 +0100524#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[] = {
Inada Naoki926b0cb2019-04-17 08:39:46 +0900590 {Py_tp_doc, (void*)SSLError_doc},
Antoine Pitrou3b36fb12012-06-22 21:11:52 +0200591 {Py_tp_str, SSLError_str},
592 {0, 0},
593};
594
595static PyType_Spec sslerror_type_spec = {
596 "ssl.SSLError",
597 sizeof(PyOSErrorObject),
598 0,
599 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
600 sslerror_type_slots
601};
602
603static void
Christian Heimesb3ad0e52017-09-08 12:00:19 -0700604fill_and_set_sslerror(PySSLSocket *sslsock, PyObject *type, int ssl_errno,
605 const char *errstr, int lineno, unsigned long errcode)
Antoine Pitrou3b36fb12012-06-22 21:11:52 +0200606{
607 PyObject *err_value = NULL, *reason_obj = NULL, *lib_obj = NULL;
Christian Heimesb3ad0e52017-09-08 12:00:19 -0700608 PyObject *verify_obj = NULL, *verify_code_obj = NULL;
Antoine Pitrou3b36fb12012-06-22 21:11:52 +0200609 PyObject *init_value, *msg, *key;
610 _Py_IDENTIFIER(reason);
611 _Py_IDENTIFIER(library);
Christian Heimesb3ad0e52017-09-08 12:00:19 -0700612 _Py_IDENTIFIER(verify_message);
613 _Py_IDENTIFIER(verify_code);
Antoine Pitrou3b36fb12012-06-22 21:11:52 +0200614
615 if (errcode != 0) {
616 int lib, reason;
617
618 lib = ERR_GET_LIB(errcode);
619 reason = ERR_GET_REASON(errcode);
620 key = Py_BuildValue("ii", lib, reason);
621 if (key == NULL)
622 goto fail;
Serhiy Storchaka65fb2c02019-05-31 10:39:15 +0300623 reason_obj = PyDict_GetItemWithError(err_codes_to_names, key);
Antoine Pitrou3b36fb12012-06-22 21:11:52 +0200624 Py_DECREF(key);
Serhiy Storchaka65fb2c02019-05-31 10:39:15 +0300625 if (reason_obj == NULL && PyErr_Occurred()) {
626 goto fail;
Antoine Pitrou3b36fb12012-06-22 21:11:52 +0200627 }
628 key = PyLong_FromLong(lib);
629 if (key == NULL)
630 goto fail;
Serhiy Storchaka65fb2c02019-05-31 10:39:15 +0300631 lib_obj = PyDict_GetItemWithError(lib_codes_to_names, key);
Antoine Pitrou3b36fb12012-06-22 21:11:52 +0200632 Py_DECREF(key);
Serhiy Storchaka65fb2c02019-05-31 10:39:15 +0300633 if (lib_obj == NULL && PyErr_Occurred()) {
634 goto fail;
Antoine Pitrou3b36fb12012-06-22 21:11:52 +0200635 }
636 if (errstr == NULL)
637 errstr = ERR_reason_error_string(errcode);
638 }
639 if (errstr == NULL)
640 errstr = "unknown error";
641
Christian Heimesb3ad0e52017-09-08 12:00:19 -0700642 /* verify code for cert validation error */
643 if ((sslsock != NULL) && (type == PySSLCertVerificationErrorObject)) {
644 const char *verify_str = NULL;
645 long verify_code;
646
647 verify_code = SSL_get_verify_result(sslsock->ssl);
648 verify_code_obj = PyLong_FromLong(verify_code);
649 if (verify_code_obj == NULL) {
650 goto fail;
651 }
652
653 switch (verify_code) {
Christian Heimes09153602017-09-08 14:47:58 -0700654#ifdef X509_V_ERR_HOSTNAME_MISMATCH
655 /* OpenSSL >= 1.0.2, LibreSSL >= 2.5.3 */
Christian Heimesb3ad0e52017-09-08 12:00:19 -0700656 case X509_V_ERR_HOSTNAME_MISMATCH:
657 verify_obj = PyUnicode_FromFormat(
658 "Hostname mismatch, certificate is not valid for '%S'.",
659 sslsock->server_hostname
660 );
661 break;
Christian Heimes09153602017-09-08 14:47:58 -0700662#endif
663#ifdef X509_V_ERR_IP_ADDRESS_MISMATCH
Christian Heimesb3ad0e52017-09-08 12:00:19 -0700664 case X509_V_ERR_IP_ADDRESS_MISMATCH:
665 verify_obj = PyUnicode_FromFormat(
666 "IP address mismatch, certificate is not valid for '%S'.",
667 sslsock->server_hostname
668 );
669 break;
Christian Heimes09153602017-09-08 14:47:58 -0700670#endif
Christian Heimesb3ad0e52017-09-08 12:00:19 -0700671 default:
672 verify_str = X509_verify_cert_error_string(verify_code);
673 if (verify_str != NULL) {
674 verify_obj = PyUnicode_FromString(verify_str);
675 } else {
676 verify_obj = Py_None;
677 Py_INCREF(verify_obj);
678 }
679 break;
680 }
681 if (verify_obj == NULL) {
682 goto fail;
683 }
684 }
685
686 if (verify_obj && reason_obj && lib_obj)
687 msg = PyUnicode_FromFormat("[%S: %S] %s: %S (_ssl.c:%d)",
688 lib_obj, reason_obj, errstr, verify_obj,
689 lineno);
690 else if (reason_obj && lib_obj)
Antoine Pitrou3b36fb12012-06-22 21:11:52 +0200691 msg = PyUnicode_FromFormat("[%S: %S] %s (_ssl.c:%d)",
692 lib_obj, reason_obj, errstr, lineno);
693 else if (lib_obj)
694 msg = PyUnicode_FromFormat("[%S] %s (_ssl.c:%d)",
695 lib_obj, errstr, lineno);
696 else
697 msg = PyUnicode_FromFormat("%s (_ssl.c:%d)", errstr, lineno);
Antoine Pitrou3b36fb12012-06-22 21:11:52 +0200698 if (msg == NULL)
699 goto fail;
Victor Stinnerba9be472013-10-31 15:00:24 +0100700
Paul Monsonfb7e7502019-05-15 15:38:55 -0700701 init_value = Py_BuildValue("iN", ERR_GET_REASON(ssl_errno), msg);
Victor Stinnerba9be472013-10-31 15:00:24 +0100702 if (init_value == NULL)
703 goto fail;
704
Antoine Pitrou3b36fb12012-06-22 21:11:52 +0200705 err_value = PyObject_CallObject(type, init_value);
706 Py_DECREF(init_value);
707 if (err_value == NULL)
708 goto fail;
Victor Stinnerba9be472013-10-31 15:00:24 +0100709
Antoine Pitrou3b36fb12012-06-22 21:11:52 +0200710 if (reason_obj == NULL)
711 reason_obj = Py_None;
712 if (_PyObject_SetAttrId(err_value, &PyId_reason, reason_obj))
713 goto fail;
Christian Heimesb3ad0e52017-09-08 12:00:19 -0700714
Antoine Pitrou3b36fb12012-06-22 21:11:52 +0200715 if (lib_obj == NULL)
716 lib_obj = Py_None;
717 if (_PyObject_SetAttrId(err_value, &PyId_library, lib_obj))
718 goto fail;
Christian Heimesb3ad0e52017-09-08 12:00:19 -0700719
720 if ((sslsock != NULL) && (type == PySSLCertVerificationErrorObject)) {
721 /* Only set verify code / message for SSLCertVerificationError */
722 if (_PyObject_SetAttrId(err_value, &PyId_verify_code,
723 verify_code_obj))
724 goto fail;
725 if (_PyObject_SetAttrId(err_value, &PyId_verify_message, verify_obj))
726 goto fail;
727 }
728
Antoine Pitrou3b36fb12012-06-22 21:11:52 +0200729 PyErr_SetObject(type, err_value);
730fail:
731 Py_XDECREF(err_value);
Christian Heimesb3ad0e52017-09-08 12:00:19 -0700732 Py_XDECREF(verify_code_obj);
733 Py_XDECREF(verify_obj);
Antoine Pitrou3b36fb12012-06-22 21:11:52 +0200734}
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000735
Christian Heimesc7f70692019-05-31 11:44:05 +0200736static int
737PySSL_ChainExceptions(PySSLSocket *sslsock) {
738 if (sslsock->exc_type == NULL)
739 return 0;
740
741 _PyErr_ChainExceptions(sslsock->exc_type, sslsock->exc_value, sslsock->exc_tb);
742 sslsock->exc_type = NULL;
743 sslsock->exc_value = NULL;
744 sslsock->exc_tb = NULL;
745 return -1;
746}
747
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000748static PyObject *
Christian Heimesb3ad0e52017-09-08 12:00:19 -0700749PySSL_SetError(PySSLSocket *sslsock, int ret, const char *filename, int lineno)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000750{
Antoine Pitrou41032a62011-10-27 23:56:55 +0200751 PyObject *type = PySSLErrorObject;
Antoine Pitrou3b36fb12012-06-22 21:11:52 +0200752 char *errstr = NULL;
Steve Dowerc6fd1c12018-09-17 11:34:47 -0700753 _PySSLError err;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000754 enum py_ssl_error p = PY_SSL_ERROR_NONE;
Antoine Pitrou3b36fb12012-06-22 21:11:52 +0200755 unsigned long e = 0;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000756
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000757 assert(ret <= 0);
Antoine Pitrou3b36fb12012-06-22 21:11:52 +0200758 e = ERR_peek_last_error();
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +0000759
Christian Heimesb3ad0e52017-09-08 12:00:19 -0700760 if (sslsock->ssl != NULL) {
Steve Dowerc6fd1c12018-09-17 11:34:47 -0700761 err = sslsock->err;
Thomas Woutersed03b412007-08-28 21:37:11 +0000762
Steve Dowerc6fd1c12018-09-17 11:34:47 -0700763 switch (err.ssl) {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000764 case SSL_ERROR_ZERO_RETURN:
Antoine Pitrou41032a62011-10-27 23:56:55 +0200765 errstr = "TLS/SSL connection has been closed (EOF)";
766 type = PySSLZeroReturnErrorObject;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000767 p = PY_SSL_ERROR_ZERO_RETURN;
768 break;
769 case SSL_ERROR_WANT_READ:
770 errstr = "The operation did not complete (read)";
Antoine Pitrou41032a62011-10-27 23:56:55 +0200771 type = PySSLWantReadErrorObject;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000772 p = PY_SSL_ERROR_WANT_READ;
773 break;
774 case SSL_ERROR_WANT_WRITE:
775 p = PY_SSL_ERROR_WANT_WRITE;
Antoine Pitrou41032a62011-10-27 23:56:55 +0200776 type = PySSLWantWriteErrorObject;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000777 errstr = "The operation did not complete (write)";
778 break;
779 case SSL_ERROR_WANT_X509_LOOKUP:
780 p = PY_SSL_ERROR_WANT_X509_LOOKUP;
Antoine Pitrou525807b2010-05-12 14:05:24 +0000781 errstr = "The operation did not complete (X509 lookup)";
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000782 break;
783 case SSL_ERROR_WANT_CONNECT:
784 p = PY_SSL_ERROR_WANT_CONNECT;
785 errstr = "The operation did not complete (connect)";
786 break;
787 case SSL_ERROR_SYSCALL:
788 {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000789 if (e == 0) {
Christian Heimesb3ad0e52017-09-08 12:00:19 -0700790 PySocketSockObject *s = GET_SOCKET(sslsock);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000791 if (ret == 0 || (((PyObject *)s) == Py_None)) {
Antoine Pitrou525807b2010-05-12 14:05:24 +0000792 p = PY_SSL_ERROR_EOF;
Antoine Pitrou41032a62011-10-27 23:56:55 +0200793 type = PySSLEOFErrorObject;
Antoine Pitrou525807b2010-05-12 14:05:24 +0000794 errstr = "EOF occurred in violation of protocol";
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200795 } else if (s && ret == -1) {
Antoine Pitrou525807b2010-05-12 14:05:24 +0000796 /* underlying BIO reported an I/O error */
Antoine Pitrou9d74b422010-05-16 23:14:22 +0000797 ERR_clear_error();
Steve Dowere6eb48c2017-09-08 15:16:15 -0700798#ifdef MS_WINDOWS
Steve Dowerc6fd1c12018-09-17 11:34:47 -0700799 if (err.ws) {
800 return PyErr_SetFromWindowsErr(err.ws);
801 }
Steve Dowere6eb48c2017-09-08 15:16:15 -0700802#endif
Steve Dowerc6fd1c12018-09-17 11:34:47 -0700803 if (err.c) {
804 errno = err.c;
Steve Dowere6eb48c2017-09-08 15:16:15 -0700805 return PyErr_SetFromErrno(PyExc_OSError);
806 }
Dima Tisnek495bd032020-08-16 02:01:19 +0900807 else {
808 p = PY_SSL_ERROR_EOF;
809 type = PySSLEOFErrorObject;
810 errstr = "EOF occurred in violation of protocol";
811 }
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000812 } else { /* possible? */
Antoine Pitrou525807b2010-05-12 14:05:24 +0000813 p = PY_SSL_ERROR_SYSCALL;
Antoine Pitrou41032a62011-10-27 23:56:55 +0200814 type = PySSLSyscallErrorObject;
Antoine Pitrou525807b2010-05-12 14:05:24 +0000815 errstr = "Some I/O error occurred";
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000816 }
817 } else {
818 p = PY_SSL_ERROR_SYSCALL;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000819 }
820 break;
821 }
822 case SSL_ERROR_SSL:
823 {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000824 p = PY_SSL_ERROR_SSL;
Christian Heimesb3ad0e52017-09-08 12:00:19 -0700825 if (e == 0) {
Antoine Pitrou3b36fb12012-06-22 21:11:52 +0200826 /* possible? */
Antoine Pitrou525807b2010-05-12 14:05:24 +0000827 errstr = "A failure in the SSL library occurred";
Christian Heimesb3ad0e52017-09-08 12:00:19 -0700828 }
829 if (ERR_GET_LIB(e) == ERR_LIB_SSL &&
830 ERR_GET_REASON(e) == SSL_R_CERTIFICATE_VERIFY_FAILED) {
831 type = PySSLCertVerificationErrorObject;
832 }
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000833 break;
834 }
835 default:
836 p = PY_SSL_ERROR_INVALID_ERROR_CODE;
837 errstr = "Invalid error code";
838 }
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000839 }
Christian Heimesb3ad0e52017-09-08 12:00:19 -0700840 fill_and_set_sslerror(sslsock, type, p, errstr, lineno, e);
Antoine Pitrou9d74b422010-05-16 23:14:22 +0000841 ERR_clear_error();
Christian Heimesc7f70692019-05-31 11:44:05 +0200842 PySSL_ChainExceptions(sslsock);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000843 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000844}
845
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000846static PyObject *
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200847_setSSLError (const char *errstr, int errcode, const char *filename, int lineno) {
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000848
Antoine Pitrou3b36fb12012-06-22 21:11:52 +0200849 if (errstr == NULL)
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000850 errcode = ERR_peek_last_error();
Antoine Pitrou3b36fb12012-06-22 21:11:52 +0200851 else
852 errcode = 0;
Christian Heimesb3ad0e52017-09-08 12:00:19 -0700853 fill_and_set_sslerror(NULL, PySSLErrorObject, errcode, errstr, lineno, errcode);
Antoine Pitrou9d74b422010-05-16 23:14:22 +0000854 ERR_clear_error();
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000855 return NULL;
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000856}
857
Christian Heimes61d478c2018-01-27 15:51:38 +0100858/*
859 * SSL objects
860 */
861
862static int
863_ssl_configure_hostname(PySSLSocket *self, const char* server_hostname)
864{
865 int retval = -1;
866 ASN1_OCTET_STRING *ip;
867 PyObject *hostname;
868 size_t len;
869
870 assert(server_hostname);
871
872 /* Disable OpenSSL's special mode with leading dot in hostname:
873 * When name starts with a dot (e.g ".example.com"), it will be
874 * matched by a certificate valid for any sub-domain of name.
875 */
876 len = strlen(server_hostname);
877 if (len == 0 || *server_hostname == '.') {
878 PyErr_SetString(
879 PyExc_ValueError,
880 "server_hostname cannot be an empty string or start with a "
881 "leading dot.");
882 return retval;
883 }
884
885 /* inet_pton is not available on all platforms. */
886 ip = a2i_IPADDRESS(server_hostname);
887 if (ip == NULL) {
888 ERR_clear_error();
889 }
890
Christian Heimes11a14932018-02-24 02:35:08 +0100891 hostname = PyUnicode_Decode(server_hostname, len, "ascii", "strict");
Christian Heimes61d478c2018-01-27 15:51:38 +0100892 if (hostname == NULL) {
893 goto error;
894 }
895 self->server_hostname = hostname;
896
897 /* Only send SNI extension for non-IP hostnames */
898 if (ip == NULL) {
899 if (!SSL_set_tlsext_host_name(self->ssl, server_hostname)) {
900 _setSSLError(NULL, 0, __FILE__, __LINE__);
Zackery Spytzc32f2972020-10-25 12:02:30 -0600901 goto error;
Christian Heimes61d478c2018-01-27 15:51:38 +0100902 }
903 }
904 if (self->ctx->check_hostname) {
905 X509_VERIFY_PARAM *param = SSL_get0_param(self->ssl);
906 if (ip == NULL) {
Christian Heimesd02ac252018-03-25 12:36:13 +0200907 if (!X509_VERIFY_PARAM_set1_host(param, server_hostname,
908 strlen(server_hostname))) {
Christian Heimes61d478c2018-01-27 15:51:38 +0100909 _setSSLError(NULL, 0, __FILE__, __LINE__);
910 goto error;
911 }
912 } else {
Christian Heimesa871f692020-06-01 08:58:14 +0200913 if (!X509_VERIFY_PARAM_set1_ip(param, ASN1_STRING_get0_data(ip),
Christian Heimes61d478c2018-01-27 15:51:38 +0100914 ASN1_STRING_length(ip))) {
915 _setSSLError(NULL, 0, __FILE__, __LINE__);
916 goto error;
917 }
918 }
919 }
920 retval = 0;
921 error:
922 if (ip != NULL) {
923 ASN1_OCTET_STRING_free(ip);
924 }
925 return retval;
926}
927
Antoine Pitrou152efa22010-05-16 18:19:27 +0000928static PySSLSocket *
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +0100929newPySSLSocket(PySSLContext *sslctx, PySocketSockObject *sock,
Antoine Pitroud5323212010-10-22 18:19:07 +0000930 enum py_ssl_server_or_client socket_type,
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200931 char *server_hostname,
Christian Heimes141c5e82018-02-24 21:10:57 +0100932 PyObject *owner, PyObject *session,
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200933 PySSLMemoryBIO *inbio, PySSLMemoryBIO *outbio)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000934{
Antoine Pitrou152efa22010-05-16 18:19:27 +0000935 PySSLSocket *self;
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +0100936 SSL_CTX *ctx = sslctx->ctx;
Steve Dowerc6fd1c12018-09-17 11:34:47 -0700937 _PySSLError err = { 0 };
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000938
Christian Heimes5c36da72020-11-20 09:40:12 +0100939 self = PyObject_New(PySSLSocket, PySSLSocket_Type);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000940 if (self == NULL)
941 return NULL;
Antoine Pitrou152efa22010-05-16 18:19:27 +0000942
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000943 self->ssl = NULL;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000944 self->Socket = NULL;
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +0100945 self->ctx = sslctx;
Nathaniel J. Smith65ece7c2017-06-07 23:30:43 -0700946 Py_INCREF(sslctx);
Antoine Pitrou860aee72013-09-29 19:52:45 +0200947 self->shutdown_seen_zero = 0;
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200948 self->owner = NULL;
Benjamin Peterson81b9ecd2016-08-15 21:55:37 -0700949 self->server_hostname = NULL;
Steve Dowerc6fd1c12018-09-17 11:34:47 -0700950 self->err = err;
Christian Heimesc7f70692019-05-31 11:44:05 +0200951 self->exc_type = NULL;
952 self->exc_value = NULL;
953 self->exc_tb = NULL;
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200954
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000955 /* Make sure the SSL error state is initialized */
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000956 ERR_clear_error();
Thomas Wouters1b7f8912007-09-19 03:06:30 +0000957
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000958 PySSL_BEGIN_ALLOW_THREADS
Antoine Pitrou152efa22010-05-16 18:19:27 +0000959 self->ssl = SSL_new(ctx);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +0000960 PySSL_END_ALLOW_THREADS
Zackery Spytz4c49da02018-12-07 03:11:30 -0700961 if (self->ssl == NULL) {
962 Py_DECREF(self);
963 _setSSLError(NULL, 0, __FILE__, __LINE__);
964 return NULL;
965 }
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200966 SSL_set_app_data(self->ssl, self);
967 if (sock) {
968 SSL_set_fd(self->ssl, Py_SAFE_DOWNCAST(sock->sock_fd, SOCKET_T, int));
969 } else {
970 /* BIOs are reference counted and SSL_set_bio borrows our reference.
971 * To prevent a double free in memory_bio_dealloc() we need to take an
972 * extra reference here. */
Christian Heimes598894f2016-09-05 23:19:05 +0200973 BIO_up_ref(inbio->bio);
974 BIO_up_ref(outbio->bio);
Antoine Pitroub1fdf472014-10-05 20:41:53 +0200975 SSL_set_bio(self->ssl, inbio->bio, outbio->bio);
976 }
Alex Gaynorf0422422018-05-14 11:51:45 -0400977 SSL_set_mode(self->ssl,
978 SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER | SSL_MODE_AUTO_RETRY);
Guido van Rossum4f707ac2003-01-31 18:13:18 +0000979
Christian Heimesf0f59302019-07-01 08:29:17 +0200980#ifdef TLS1_3_VERSION
981 if (sslctx->post_handshake_auth == 1) {
982 if (socket_type == PY_SSL_SERVER) {
983 /* bpo-37428: OpenSSL does not ignore SSL_VERIFY_POST_HANDSHAKE.
984 * Set SSL_VERIFY_POST_HANDSHAKE flag only for server sockets and
985 * only in combination with SSL_VERIFY_PEER flag. */
986 int mode = SSL_get_verify_mode(self->ssl);
987 if (mode & SSL_VERIFY_PEER) {
988 int (*verify_cb)(int, X509_STORE_CTX *) = NULL;
989 verify_cb = SSL_get_verify_callback(self->ssl);
990 mode |= SSL_VERIFY_POST_HANDSHAKE;
991 SSL_set_verify(self->ssl, mode, verify_cb);
992 }
993 } else {
994 /* client socket */
995 SSL_set_post_handshake_auth(self->ssl, 1);
996 }
997 }
998#endif
999
Christian Heimes61d478c2018-01-27 15:51:38 +01001000 if (server_hostname != NULL) {
1001 if (_ssl_configure_hostname(self, server_hostname) < 0) {
1002 Py_DECREF(self);
1003 return NULL;
1004 }
1005 }
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001006 /* If the socket is in non-blocking mode or timeout mode, set the BIO
1007 * to non-blocking mode (blocking is the default)
1008 */
Victor Stinnere2452312015-03-28 03:00:46 +01001009 if (sock && sock->sock_timeout >= 0) {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001010 BIO_set_nbio(SSL_get_rbio(self->ssl), 1);
1011 BIO_set_nbio(SSL_get_wbio(self->ssl), 1);
1012 }
Guido van Rossum4f707ac2003-01-31 18:13:18 +00001013
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001014 PySSL_BEGIN_ALLOW_THREADS
1015 if (socket_type == PY_SSL_CLIENT)
1016 SSL_set_connect_state(self->ssl);
1017 else
1018 SSL_set_accept_state(self->ssl);
1019 PySSL_END_ALLOW_THREADS
Martin v. Löwis09c35f72002-07-28 09:57:45 +00001020
Antoine Pitroud6494802011-07-21 01:11:30 +02001021 self->socket_type = socket_type;
Antoine Pitroub1fdf472014-10-05 20:41:53 +02001022 if (sock != NULL) {
1023 self->Socket = PyWeakref_NewRef((PyObject *) sock, NULL);
1024 if (self->Socket == NULL) {
1025 Py_DECREF(self);
Antoine Pitroub1fdf472014-10-05 20:41:53 +02001026 return NULL;
1027 }
Victor Stinnera9eb38f2013-10-31 16:35:38 +01001028 }
Christian Heimes141c5e82018-02-24 21:10:57 +01001029 if (owner && owner != Py_None) {
1030 if (PySSL_set_owner(self, owner, NULL) == -1) {
1031 Py_DECREF(self);
1032 return NULL;
1033 }
1034 }
1035 if (session && session != Py_None) {
1036 if (PySSL_set_session(self, session, NULL) == -1) {
1037 Py_DECREF(self);
1038 return NULL;
1039 }
1040 }
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001041 return self;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001042}
1043
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001044/* SSL object methods */
1045
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03001046/*[clinic input]
1047_ssl._SSLSocket.do_handshake
1048[clinic start generated code]*/
1049
1050static PyObject *
1051_ssl__SSLSocket_do_handshake_impl(PySSLSocket *self)
1052/*[clinic end generated code: output=6c0898a8936548f6 input=d2d737de3df018c8]*/
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001053{
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001054 int ret;
Steve Dowerc6fd1c12018-09-17 11:34:47 -07001055 _PySSLError err;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001056 int sockstate, nonblocking;
Antoine Pitroub1fdf472014-10-05 20:41:53 +02001057 PySocketSockObject *sock = GET_SOCKET(self);
Victor Stinner14690702015-04-06 22:46:13 +02001058 _PyTime_t timeout, deadline = 0;
1059 int has_timeout;
Antoine Pitroud3f8ab82010-04-24 21:26:44 +00001060
Antoine Pitroub1fdf472014-10-05 20:41:53 +02001061 if (sock) {
1062 if (((PyObject*)sock) == Py_None) {
1063 _setSSLError("Underlying socket connection gone",
1064 PY_SSL_ERROR_NO_SOCKET, __FILE__, __LINE__);
1065 return NULL;
1066 }
1067 Py_INCREF(sock);
1068
1069 /* just in case the blocking state of the socket has been changed */
Victor Stinnere2452312015-03-28 03:00:46 +01001070 nonblocking = (sock->sock_timeout >= 0);
Antoine Pitroub1fdf472014-10-05 20:41:53 +02001071 BIO_set_nbio(SSL_get_rbio(self->ssl), nonblocking);
1072 BIO_set_nbio(SSL_get_wbio(self->ssl), nonblocking);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001073 }
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001074
Victor Stinner14690702015-04-06 22:46:13 +02001075 timeout = GET_SOCKET_TIMEOUT(sock);
1076 has_timeout = (timeout > 0);
1077 if (has_timeout)
1078 deadline = _PyTime_GetMonotonicClock() + timeout;
1079
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001080 /* Actually negotiate SSL connection */
1081 /* XXX If SSL_do_handshake() returns 0, it's also a failure. */
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001082 do {
Bill Janssen6e027db2007-11-15 22:23:56 +00001083 PySSL_BEGIN_ALLOW_THREADS
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001084 ret = SSL_do_handshake(self->ssl);
Steve Dowerc6fd1c12018-09-17 11:34:47 -07001085 err = _PySSL_errno(ret < 1, self->ssl, ret);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001086 PySSL_END_ALLOW_THREADS
Steve Dowerc6fd1c12018-09-17 11:34:47 -07001087 self->err = err;
Victor Stinner4e3cfa42015-04-02 21:28:28 +02001088
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +00001089 if (PyErr_CheckSignals())
1090 goto error;
Victor Stinner4e3cfa42015-04-02 21:28:28 +02001091
Victor Stinner14690702015-04-06 22:46:13 +02001092 if (has_timeout)
1093 timeout = deadline - _PyTime_GetMonotonicClock();
1094
Steve Dowerc6fd1c12018-09-17 11:34:47 -07001095 if (err.ssl == SSL_ERROR_WANT_READ) {
Victor Stinner14690702015-04-06 22:46:13 +02001096 sockstate = PySSL_select(sock, 0, timeout);
Steve Dowerc6fd1c12018-09-17 11:34:47 -07001097 } else if (err.ssl == SSL_ERROR_WANT_WRITE) {
Victor Stinner14690702015-04-06 22:46:13 +02001098 sockstate = PySSL_select(sock, 1, timeout);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001099 } else {
1100 sockstate = SOCKET_OPERATION_OK;
1101 }
Victor Stinner4e3cfa42015-04-02 21:28:28 +02001102
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001103 if (sockstate == SOCKET_HAS_TIMED_OUT) {
Christian Heimes03c8ddd2020-11-20 09:26:07 +01001104 PyErr_SetString(PyExc_TimeoutError,
Antoine Pitrou525807b2010-05-12 14:05:24 +00001105 ERRSTR("The handshake operation timed out"));
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +00001106 goto error;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001107 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
1108 PyErr_SetString(PySSLErrorObject,
Antoine Pitrou525807b2010-05-12 14:05:24 +00001109 ERRSTR("Underlying socket has been closed."));
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +00001110 goto error;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001111 } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
1112 PyErr_SetString(PySSLErrorObject,
Antoine Pitrou525807b2010-05-12 14:05:24 +00001113 ERRSTR("Underlying socket too large for select()."));
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +00001114 goto error;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001115 } else if (sockstate == SOCKET_IS_NONBLOCKING) {
1116 break;
1117 }
Steve Dowerc6fd1c12018-09-17 11:34:47 -07001118 } while (err.ssl == SSL_ERROR_WANT_READ ||
1119 err.ssl == SSL_ERROR_WANT_WRITE);
Antoine Pitroub1fdf472014-10-05 20:41:53 +02001120 Py_XDECREF(sock);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001121 if (ret < 1)
1122 return PySSL_SetError(self, ret, __FILE__, __LINE__);
Christian Heimesc7f70692019-05-31 11:44:05 +02001123 if (PySSL_ChainExceptions(self) < 0)
1124 return NULL;
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001125 Py_RETURN_NONE;
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +00001126error:
Antoine Pitroub1fdf472014-10-05 20:41:53 +02001127 Py_XDECREF(sock);
Christian Heimesc7f70692019-05-31 11:44:05 +02001128 PySSL_ChainExceptions(self);
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +00001129 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001130}
1131
Thomas Woutersed03b412007-08-28 21:37:11 +00001132static PyObject *
Serhiy Storchakae503ca52017-09-05 01:28:53 +03001133_asn1obj2py(const ASN1_OBJECT *name, int no_name)
1134{
1135 char buf[X509_NAME_MAXLEN];
1136 char *namebuf = buf;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001137 int buflen;
Serhiy Storchakae503ca52017-09-05 01:28:53 +03001138 PyObject *name_obj = NULL;
Thomas Woutersed03b412007-08-28 21:37:11 +00001139
Serhiy Storchakae503ca52017-09-05 01:28:53 +03001140 buflen = OBJ_obj2txt(namebuf, X509_NAME_MAXLEN, name, no_name);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001141 if (buflen < 0) {
1142 _setSSLError(NULL, 0, __FILE__, __LINE__);
Serhiy Storchakae503ca52017-09-05 01:28:53 +03001143 return NULL;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001144 }
Serhiy Storchakae503ca52017-09-05 01:28:53 +03001145 /* initial buffer is too small for oid + terminating null byte */
1146 if (buflen > X509_NAME_MAXLEN - 1) {
1147 /* make OBJ_obj2txt() calculate the required buflen */
1148 buflen = OBJ_obj2txt(NULL, 0, name, no_name);
1149 /* allocate len + 1 for terminating NULL byte */
1150 namebuf = PyMem_Malloc(buflen + 1);
1151 if (namebuf == NULL) {
1152 PyErr_NoMemory();
1153 return NULL;
1154 }
1155 buflen = OBJ_obj2txt(namebuf, buflen + 1, name, no_name);
1156 if (buflen < 0) {
1157 _setSSLError(NULL, 0, __FILE__, __LINE__);
1158 goto done;
1159 }
1160 }
1161 if (!buflen && no_name) {
1162 Py_INCREF(Py_None);
1163 name_obj = Py_None;
1164 }
1165 else {
1166 name_obj = PyUnicode_FromStringAndSize(namebuf, buflen);
1167 }
1168
1169 done:
1170 if (buf != namebuf) {
1171 PyMem_Free(namebuf);
1172 }
1173 return name_obj;
1174}
1175
1176static PyObject *
1177_create_tuple_for_attribute(ASN1_OBJECT *name, ASN1_STRING *value)
1178{
1179 Py_ssize_t buflen;
1180 unsigned char *valuebuf = NULL;
1181 PyObject *attr;
Guido van Rossumf06628b2007-11-21 20:01:53 +00001182
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001183 buflen = ASN1_STRING_to_UTF8(&valuebuf, value);
1184 if (buflen < 0) {
1185 _setSSLError(NULL, 0, __FILE__, __LINE__);
Serhiy Storchakae503ca52017-09-05 01:28:53 +03001186 return NULL;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001187 }
Serhiy Storchakae503ca52017-09-05 01:28:53 +03001188 attr = Py_BuildValue("Ns#", _asn1obj2py(name, 0), valuebuf, buflen);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001189 OPENSSL_free(valuebuf);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001190 return attr;
Thomas Woutersed03b412007-08-28 21:37:11 +00001191}
1192
1193static PyObject *
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001194_create_tuple_for_X509_NAME (X509_NAME *xname)
Thomas Woutersed03b412007-08-28 21:37:11 +00001195{
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001196 PyObject *dn = NULL; /* tuple which represents the "distinguished name" */
1197 PyObject *rdn = NULL; /* tuple to hold a "relative distinguished name" */
1198 PyObject *rdnt;
1199 PyObject *attr = NULL; /* tuple to hold an attribute */
1200 int entry_count = X509_NAME_entry_count(xname);
1201 X509_NAME_ENTRY *entry;
1202 ASN1_OBJECT *name;
1203 ASN1_STRING *value;
1204 int index_counter;
1205 int rdn_level = -1;
1206 int retcode;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001207
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001208 dn = PyList_New(0);
1209 if (dn == NULL)
1210 return NULL;
1211 /* now create another tuple to hold the top-level RDN */
1212 rdn = PyList_New(0);
1213 if (rdn == NULL)
1214 goto fail0;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001215
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001216 for (index_counter = 0;
1217 index_counter < entry_count;
1218 index_counter++)
1219 {
1220 entry = X509_NAME_get_entry(xname, index_counter);
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001221
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001222 /* check to see if we've gotten to a new RDN */
1223 if (rdn_level >= 0) {
Christian Heimes598894f2016-09-05 23:19:05 +02001224 if (rdn_level != X509_NAME_ENTRY_set(entry)) {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001225 /* yes, new RDN */
1226 /* add old RDN to DN */
1227 rdnt = PyList_AsTuple(rdn);
1228 Py_DECREF(rdn);
1229 if (rdnt == NULL)
1230 goto fail0;
1231 retcode = PyList_Append(dn, rdnt);
1232 Py_DECREF(rdnt);
1233 if (retcode < 0)
1234 goto fail0;
1235 /* create new RDN */
1236 rdn = PyList_New(0);
1237 if (rdn == NULL)
1238 goto fail0;
1239 }
1240 }
Christian Heimes598894f2016-09-05 23:19:05 +02001241 rdn_level = X509_NAME_ENTRY_set(entry);
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001242
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001243 /* now add this attribute to the current RDN */
1244 name = X509_NAME_ENTRY_get_object(entry);
1245 value = X509_NAME_ENTRY_get_data(entry);
1246 attr = _create_tuple_for_attribute(name, value);
1247 /*
1248 fprintf(stderr, "RDN level %d, attribute %s: %s\n",
1249 entry->set,
1250 PyBytes_AS_STRING(PyTuple_GET_ITEM(attr, 0)),
1251 PyBytes_AS_STRING(PyTuple_GET_ITEM(attr, 1)));
1252 */
1253 if (attr == NULL)
1254 goto fail1;
1255 retcode = PyList_Append(rdn, attr);
1256 Py_DECREF(attr);
1257 if (retcode < 0)
1258 goto fail1;
1259 }
1260 /* now, there's typically a dangling RDN */
Antoine Pitrou2f5a1632012-02-15 22:25:27 +01001261 if (rdn != NULL) {
1262 if (PyList_GET_SIZE(rdn) > 0) {
1263 rdnt = PyList_AsTuple(rdn);
1264 Py_DECREF(rdn);
1265 if (rdnt == NULL)
1266 goto fail0;
1267 retcode = PyList_Append(dn, rdnt);
1268 Py_DECREF(rdnt);
1269 if (retcode < 0)
1270 goto fail0;
1271 }
1272 else {
1273 Py_DECREF(rdn);
1274 }
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001275 }
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001276
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001277 /* convert list to tuple */
1278 rdnt = PyList_AsTuple(dn);
1279 Py_DECREF(dn);
1280 if (rdnt == NULL)
1281 return NULL;
1282 return rdnt;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001283
1284 fail1:
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001285 Py_XDECREF(rdn);
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001286
1287 fail0:
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001288 Py_XDECREF(dn);
1289 return NULL;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001290}
1291
1292static PyObject *
1293_get_peer_alt_names (X509 *certificate) {
Guido van Rossumf06628b2007-11-21 20:01:53 +00001294
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001295 /* this code follows the procedure outlined in
1296 OpenSSL's crypto/x509v3/v3_prn.c:X509v3_EXT_print()
1297 function to extract the STACK_OF(GENERAL_NAME),
1298 then iterates through the stack to add the
1299 names. */
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001300
Alex Gaynorb87c0df2017-06-06 07:53:11 -04001301 int j;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001302 PyObject *peer_alt_names = Py_None;
Christian Heimes60bf2fc2013-09-05 16:04:35 +02001303 PyObject *v = NULL, *t;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001304 GENERAL_NAMES *names = NULL;
1305 GENERAL_NAME *name;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001306 BIO *biobuf = NULL;
1307 char buf[2048];
1308 char *vptr;
1309 int len;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001310
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001311 if (certificate == NULL)
1312 return peer_alt_names;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001313
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001314 /* get a memory buffer */
1315 biobuf = BIO_new(BIO_s_mem());
Zackery Spytz4c49da02018-12-07 03:11:30 -07001316 if (biobuf == NULL) {
1317 PyErr_SetString(PySSLErrorObject, "failed to allocate BIO");
1318 return NULL;
1319 }
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001320
Alex Gaynorb87c0df2017-06-06 07:53:11 -04001321 names = (GENERAL_NAMES *)X509_get_ext_d2i(
1322 certificate, NID_subject_alt_name, NULL, NULL);
1323 if (names != NULL) {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001324 if (peer_alt_names == Py_None) {
1325 peer_alt_names = PyList_New(0);
1326 if (peer_alt_names == NULL)
1327 goto fail;
1328 }
Guido van Rossumf06628b2007-11-21 20:01:53 +00001329
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001330 for(j = 0; j < sk_GENERAL_NAME_num(names); j++) {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001331 /* get a rendering of each name in the set of names */
Christian Heimes824f7f32013-08-17 00:54:47 +02001332 int gntype;
1333 ASN1_STRING *as = NULL;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001334
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001335 name = sk_GENERAL_NAME_value(names, j);
Christian Heimes474afdd2013-08-17 17:18:56 +02001336 gntype = name->type;
Christian Heimes824f7f32013-08-17 00:54:47 +02001337 switch (gntype) {
1338 case GEN_DIRNAME:
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001339 /* we special-case DirName as a tuple of
1340 tuples of attributes */
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001341
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001342 t = PyTuple_New(2);
1343 if (t == NULL) {
1344 goto fail;
1345 }
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001346
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001347 v = PyUnicode_FromString("DirName");
1348 if (v == NULL) {
1349 Py_DECREF(t);
1350 goto fail;
1351 }
1352 PyTuple_SET_ITEM(t, 0, v);
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001353
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001354 v = _create_tuple_for_X509_NAME (name->d.dirn);
1355 if (v == NULL) {
1356 Py_DECREF(t);
1357 goto fail;
1358 }
1359 PyTuple_SET_ITEM(t, 1, v);
Christian Heimes824f7f32013-08-17 00:54:47 +02001360 break;
Guido van Rossumf06628b2007-11-21 20:01:53 +00001361
Christian Heimes824f7f32013-08-17 00:54:47 +02001362 case GEN_EMAIL:
1363 case GEN_DNS:
1364 case GEN_URI:
1365 /* GENERAL_NAME_print() doesn't handle NULL bytes in ASN1_string
1366 correctly, CVE-2013-4238 */
1367 t = PyTuple_New(2);
1368 if (t == NULL)
1369 goto fail;
1370 switch (gntype) {
1371 case GEN_EMAIL:
1372 v = PyUnicode_FromString("email");
1373 as = name->d.rfc822Name;
1374 break;
1375 case GEN_DNS:
1376 v = PyUnicode_FromString("DNS");
1377 as = name->d.dNSName;
1378 break;
1379 case GEN_URI:
1380 v = PyUnicode_FromString("URI");
1381 as = name->d.uniformResourceIdentifier;
1382 break;
1383 }
1384 if (v == NULL) {
1385 Py_DECREF(t);
1386 goto fail;
1387 }
1388 PyTuple_SET_ITEM(t, 0, v);
Christian Heimesa871f692020-06-01 08:58:14 +02001389 v = PyUnicode_FromStringAndSize((char *)ASN1_STRING_get0_data(as),
Christian Heimes824f7f32013-08-17 00:54:47 +02001390 ASN1_STRING_length(as));
1391 if (v == NULL) {
1392 Py_DECREF(t);
1393 goto fail;
1394 }
1395 PyTuple_SET_ITEM(t, 1, v);
1396 break;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001397
Christian Heimes1c03abd2016-09-06 23:25:35 +02001398 case GEN_RID:
1399 t = PyTuple_New(2);
1400 if (t == NULL)
1401 goto fail;
1402
1403 v = PyUnicode_FromString("Registered ID");
1404 if (v == NULL) {
1405 Py_DECREF(t);
1406 goto fail;
1407 }
1408 PyTuple_SET_ITEM(t, 0, v);
1409
1410 len = i2t_ASN1_OBJECT(buf, sizeof(buf)-1, name->d.rid);
1411 if (len < 0) {
1412 Py_DECREF(t);
1413 _setSSLError(NULL, 0, __FILE__, __LINE__);
1414 goto fail;
1415 } else if (len >= (int)sizeof(buf)) {
1416 v = PyUnicode_FromString("<INVALID>");
1417 } else {
1418 v = PyUnicode_FromStringAndSize(buf, len);
1419 }
1420 if (v == NULL) {
1421 Py_DECREF(t);
1422 goto fail;
1423 }
1424 PyTuple_SET_ITEM(t, 1, v);
1425 break;
1426
Christian Heimes2b7de662019-12-07 17:59:36 +01001427 case GEN_IPADD:
1428 /* OpenSSL < 3.0.0 adds a trailing \n to IPv6. 3.0.0 removed
1429 * the trailing newline. Remove it in all versions
1430 */
1431 t = PyTuple_New(2);
1432 if (t == NULL)
1433 goto fail;
1434
1435 v = PyUnicode_FromString("IP Address");
1436 if (v == NULL) {
1437 Py_DECREF(t);
1438 goto fail;
1439 }
1440 PyTuple_SET_ITEM(t, 0, v);
1441
1442 if (name->d.ip->length == 4) {
1443 unsigned char *p = name->d.ip->data;
1444 v = PyUnicode_FromFormat(
1445 "%d.%d.%d.%d",
1446 p[0], p[1], p[2], p[3]
1447 );
1448 } else if (name->d.ip->length == 16) {
1449 /* PyUnicode_FromFormat() does not support %X */
1450 unsigned char *p = name->d.ip->data;
1451 len = sprintf(
1452 buf,
1453 "%X:%X:%X:%X:%X:%X:%X:%X",
1454 p[0] << 8 | p[1],
1455 p[2] << 8 | p[3],
1456 p[4] << 8 | p[5],
1457 p[6] << 8 | p[7],
1458 p[8] << 8 | p[9],
1459 p[10] << 8 | p[11],
1460 p[12] << 8 | p[13],
1461 p[14] << 8 | p[15]
1462 );
1463 v = PyUnicode_FromStringAndSize(buf, len);
1464 } else {
1465 v = PyUnicode_FromString("<invalid>");
1466 }
1467
1468 if (v == NULL) {
1469 Py_DECREF(t);
1470 goto fail;
1471 }
1472 PyTuple_SET_ITEM(t, 1, v);
1473 break;
1474
Christian Heimes824f7f32013-08-17 00:54:47 +02001475 default:
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001476 /* for everything else, we use the OpenSSL print form */
Christian Heimes824f7f32013-08-17 00:54:47 +02001477 switch (gntype) {
1478 /* check for new general name type */
1479 case GEN_OTHERNAME:
1480 case GEN_X400:
1481 case GEN_EDIPARTY:
Christian Heimes824f7f32013-08-17 00:54:47 +02001482 case GEN_RID:
1483 break;
1484 default:
1485 if (PyErr_WarnFormat(PyExc_RuntimeWarning, 1,
1486 "Unknown general name type %d",
1487 gntype) == -1) {
1488 goto fail;
1489 }
1490 break;
1491 }
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001492 (void) BIO_reset(biobuf);
1493 GENERAL_NAME_print(biobuf, name);
1494 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
1495 if (len < 0) {
1496 _setSSLError(NULL, 0, __FILE__, __LINE__);
1497 goto fail;
1498 }
1499 vptr = strchr(buf, ':');
Christian Heimes1c03abd2016-09-06 23:25:35 +02001500 if (vptr == NULL) {
1501 PyErr_Format(PyExc_ValueError,
1502 "Invalid value %.200s",
1503 buf);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001504 goto fail;
Christian Heimes1c03abd2016-09-06 23:25:35 +02001505 }
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001506 t = PyTuple_New(2);
1507 if (t == NULL)
1508 goto fail;
1509 v = PyUnicode_FromStringAndSize(buf, (vptr - buf));
1510 if (v == NULL) {
1511 Py_DECREF(t);
1512 goto fail;
1513 }
1514 PyTuple_SET_ITEM(t, 0, v);
1515 v = PyUnicode_FromStringAndSize((vptr + 1),
1516 (len - (vptr - buf + 1)));
1517 if (v == NULL) {
1518 Py_DECREF(t);
1519 goto fail;
1520 }
1521 PyTuple_SET_ITEM(t, 1, v);
Christian Heimes824f7f32013-08-17 00:54:47 +02001522 break;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001523 }
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001524
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001525 /* and add that rendering to the list */
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001526
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001527 if (PyList_Append(peer_alt_names, t) < 0) {
1528 Py_DECREF(t);
1529 goto fail;
1530 }
1531 Py_DECREF(t);
1532 }
Antoine Pitrou116d6b92011-11-23 01:39:19 +01001533 sk_GENERAL_NAME_pop_free(names, GENERAL_NAME_free);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001534 }
1535 BIO_free(biobuf);
1536 if (peer_alt_names != Py_None) {
1537 v = PyList_AsTuple(peer_alt_names);
1538 Py_DECREF(peer_alt_names);
1539 return v;
1540 } else {
1541 return peer_alt_names;
1542 }
Guido van Rossumf06628b2007-11-21 20:01:53 +00001543
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001544
1545 fail:
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001546 if (biobuf != NULL)
1547 BIO_free(biobuf);
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001548
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001549 if (peer_alt_names != Py_None) {
1550 Py_XDECREF(peer_alt_names);
1551 }
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001552
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001553 return NULL;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001554}
1555
1556static PyObject *
Christian Heimesbd3a7f92013-11-21 03:40:15 +01001557_get_aia_uri(X509 *certificate, int nid) {
1558 PyObject *lst = NULL, *ostr = NULL;
1559 int i, result;
1560 AUTHORITY_INFO_ACCESS *info;
1561
1562 info = X509_get_ext_d2i(certificate, NID_info_access, NULL, NULL);
Benjamin Petersonf0c90382015-11-14 15:12:18 -08001563 if (info == NULL)
1564 return Py_None;
1565 if (sk_ACCESS_DESCRIPTION_num(info) == 0) {
1566 AUTHORITY_INFO_ACCESS_free(info);
Christian Heimesbd3a7f92013-11-21 03:40:15 +01001567 return Py_None;
1568 }
1569
1570 if ((lst = PyList_New(0)) == NULL) {
1571 goto fail;
1572 }
1573
1574 for (i = 0; i < sk_ACCESS_DESCRIPTION_num(info); i++) {
1575 ACCESS_DESCRIPTION *ad = sk_ACCESS_DESCRIPTION_value(info, i);
1576 ASN1_IA5STRING *uri;
1577
1578 if ((OBJ_obj2nid(ad->method) != nid) ||
1579 (ad->location->type != GEN_URI)) {
1580 continue;
1581 }
1582 uri = ad->location->d.uniformResourceIdentifier;
1583 ostr = PyUnicode_FromStringAndSize((char *)uri->data,
1584 uri->length);
1585 if (ostr == NULL) {
1586 goto fail;
1587 }
1588 result = PyList_Append(lst, ostr);
1589 Py_DECREF(ostr);
1590 if (result < 0) {
1591 goto fail;
1592 }
1593 }
1594 AUTHORITY_INFO_ACCESS_free(info);
1595
1596 /* convert to tuple or None */
1597 if (PyList_Size(lst) == 0) {
1598 Py_DECREF(lst);
1599 return Py_None;
1600 } else {
1601 PyObject *tup;
1602 tup = PyList_AsTuple(lst);
1603 Py_DECREF(lst);
1604 return tup;
1605 }
1606
1607 fail:
1608 AUTHORITY_INFO_ACCESS_free(info);
Christian Heimes18fc7be2013-11-21 23:57:49 +01001609 Py_XDECREF(lst);
Christian Heimesbd3a7f92013-11-21 03:40:15 +01001610 return NULL;
1611}
1612
1613static PyObject *
1614_get_crl_dp(X509 *certificate) {
1615 STACK_OF(DIST_POINT) *dps;
Benjamin Petersoneda06c82015-11-11 22:07:38 -08001616 int i, j;
1617 PyObject *lst, *res = NULL;
Christian Heimesbd3a7f92013-11-21 03:40:15 +01001618
Christian Heimes598894f2016-09-05 23:19:05 +02001619 dps = X509_get_ext_d2i(certificate, NID_crl_distribution_points, NULL, NULL);
Christian Heimes949ec142013-11-21 16:26:51 +01001620
Benjamin Petersoneda06c82015-11-11 22:07:38 -08001621 if (dps == NULL)
Christian Heimesbd3a7f92013-11-21 03:40:15 +01001622 return Py_None;
Christian Heimesbd3a7f92013-11-21 03:40:15 +01001623
Benjamin Petersoneda06c82015-11-11 22:07:38 -08001624 lst = PyList_New(0);
1625 if (lst == NULL)
1626 goto done;
Christian Heimesbd3a7f92013-11-21 03:40:15 +01001627
1628 for (i=0; i < sk_DIST_POINT_num(dps); i++) {
1629 DIST_POINT *dp;
1630 STACK_OF(GENERAL_NAME) *gns;
1631
1632 dp = sk_DIST_POINT_value(dps, i);
Christian Heimesa37f5242019-01-15 23:47:42 +01001633 if (dp->distpoint == NULL) {
1634 /* Ignore empty DP value, CVE-2019-5010 */
1635 continue;
1636 }
Christian Heimesbd3a7f92013-11-21 03:40:15 +01001637 gns = dp->distpoint->name.fullname;
1638
1639 for (j=0; j < sk_GENERAL_NAME_num(gns); j++) {
1640 GENERAL_NAME *gn;
1641 ASN1_IA5STRING *uri;
1642 PyObject *ouri;
Benjamin Petersoneda06c82015-11-11 22:07:38 -08001643 int err;
Christian Heimesbd3a7f92013-11-21 03:40:15 +01001644
1645 gn = sk_GENERAL_NAME_value(gns, j);
1646 if (gn->type != GEN_URI) {
1647 continue;
1648 }
1649 uri = gn->d.uniformResourceIdentifier;
1650 ouri = PyUnicode_FromStringAndSize((char *)uri->data,
1651 uri->length);
Benjamin Petersoneda06c82015-11-11 22:07:38 -08001652 if (ouri == NULL)
1653 goto done;
1654
1655 err = PyList_Append(lst, ouri);
Christian Heimesbd3a7f92013-11-21 03:40:15 +01001656 Py_DECREF(ouri);
Benjamin Petersoneda06c82015-11-11 22:07:38 -08001657 if (err < 0)
1658 goto done;
Christian Heimesbd3a7f92013-11-21 03:40:15 +01001659 }
1660 }
Benjamin Petersoneda06c82015-11-11 22:07:38 -08001661
1662 /* Convert to tuple. */
1663 res = (PyList_GET_SIZE(lst) > 0) ? PyList_AsTuple(lst) : Py_None;
1664
1665 done:
1666 Py_XDECREF(lst);
Olivier Vielpeau2849cc32017-04-14 21:06:07 -04001667 CRL_DIST_POINTS_free(dps);
Benjamin Petersoneda06c82015-11-11 22:07:38 -08001668 return res;
Christian Heimesbd3a7f92013-11-21 03:40:15 +01001669}
1670
1671static PyObject *
Antoine Pitroufb046912010-11-09 20:21:19 +00001672_decode_certificate(X509 *certificate) {
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001673
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001674 PyObject *retval = NULL;
1675 BIO *biobuf = NULL;
1676 PyObject *peer;
1677 PyObject *peer_alt_names = NULL;
1678 PyObject *issuer;
1679 PyObject *version;
1680 PyObject *sn_obj;
Christian Heimesbd3a7f92013-11-21 03:40:15 +01001681 PyObject *obj;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001682 ASN1_INTEGER *serialNumber;
1683 char buf[2048];
Christian Heimesbd3a7f92013-11-21 03:40:15 +01001684 int len, result;
Christian Heimesa871f692020-06-01 08:58:14 +02001685 const ASN1_TIME *notBefore, *notAfter;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001686 PyObject *pnotBefore, *pnotAfter;
Thomas Woutersed03b412007-08-28 21:37:11 +00001687
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001688 retval = PyDict_New();
1689 if (retval == NULL)
1690 return NULL;
Thomas Woutersed03b412007-08-28 21:37:11 +00001691
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001692 peer = _create_tuple_for_X509_NAME(
1693 X509_get_subject_name(certificate));
1694 if (peer == NULL)
1695 goto fail0;
1696 if (PyDict_SetItemString(retval, (const char *) "subject", peer) < 0) {
1697 Py_DECREF(peer);
1698 goto fail0;
1699 }
1700 Py_DECREF(peer);
Thomas Woutersed03b412007-08-28 21:37:11 +00001701
Antoine Pitroufb046912010-11-09 20:21:19 +00001702 issuer = _create_tuple_for_X509_NAME(
1703 X509_get_issuer_name(certificate));
1704 if (issuer == NULL)
1705 goto fail0;
1706 if (PyDict_SetItemString(retval, (const char *)"issuer", issuer) < 0) {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001707 Py_DECREF(issuer);
Antoine Pitroufb046912010-11-09 20:21:19 +00001708 goto fail0;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001709 }
Antoine Pitroufb046912010-11-09 20:21:19 +00001710 Py_DECREF(issuer);
1711
1712 version = PyLong_FromLong(X509_get_version(certificate) + 1);
Christian Heimes5962bef2013-07-26 15:51:18 +02001713 if (version == NULL)
1714 goto fail0;
Antoine Pitroufb046912010-11-09 20:21:19 +00001715 if (PyDict_SetItemString(retval, "version", version) < 0) {
1716 Py_DECREF(version);
1717 goto fail0;
1718 }
1719 Py_DECREF(version);
Guido van Rossumf06628b2007-11-21 20:01:53 +00001720
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001721 /* get a memory buffer */
1722 biobuf = BIO_new(BIO_s_mem());
Zackery Spytz4c49da02018-12-07 03:11:30 -07001723 if (biobuf == NULL) {
1724 PyErr_SetString(PySSLErrorObject, "failed to allocate BIO");
1725 goto fail0;
1726 }
Guido van Rossumf06628b2007-11-21 20:01:53 +00001727
Antoine Pitroufb046912010-11-09 20:21:19 +00001728 (void) BIO_reset(biobuf);
1729 serialNumber = X509_get_serialNumber(certificate);
1730 /* should not exceed 20 octets, 160 bits, so buf is big enough */
1731 i2a_ASN1_INTEGER(biobuf, serialNumber);
1732 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
1733 if (len < 0) {
1734 _setSSLError(NULL, 0, __FILE__, __LINE__);
1735 goto fail1;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001736 }
Antoine Pitroufb046912010-11-09 20:21:19 +00001737 sn_obj = PyUnicode_FromStringAndSize(buf, len);
1738 if (sn_obj == NULL)
1739 goto fail1;
1740 if (PyDict_SetItemString(retval, "serialNumber", sn_obj) < 0) {
1741 Py_DECREF(sn_obj);
1742 goto fail1;
1743 }
1744 Py_DECREF(sn_obj);
1745
1746 (void) BIO_reset(biobuf);
Christian Heimesa871f692020-06-01 08:58:14 +02001747 notBefore = X509_get0_notBefore(certificate);
Antoine Pitroufb046912010-11-09 20:21:19 +00001748 ASN1_TIME_print(biobuf, notBefore);
1749 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
1750 if (len < 0) {
1751 _setSSLError(NULL, 0, __FILE__, __LINE__);
1752 goto fail1;
1753 }
1754 pnotBefore = PyUnicode_FromStringAndSize(buf, len);
1755 if (pnotBefore == NULL)
1756 goto fail1;
1757 if (PyDict_SetItemString(retval, "notBefore", pnotBefore) < 0) {
1758 Py_DECREF(pnotBefore);
1759 goto fail1;
1760 }
1761 Py_DECREF(pnotBefore);
Thomas Woutersed03b412007-08-28 21:37:11 +00001762
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001763 (void) BIO_reset(biobuf);
Christian Heimesa871f692020-06-01 08:58:14 +02001764 notAfter = X509_get0_notAfter(certificate);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001765 ASN1_TIME_print(biobuf, notAfter);
1766 len = BIO_gets(biobuf, buf, sizeof(buf)-1);
1767 if (len < 0) {
1768 _setSSLError(NULL, 0, __FILE__, __LINE__);
1769 goto fail1;
1770 }
1771 pnotAfter = PyUnicode_FromStringAndSize(buf, len);
1772 if (pnotAfter == NULL)
1773 goto fail1;
1774 if (PyDict_SetItemString(retval, "notAfter", pnotAfter) < 0) {
1775 Py_DECREF(pnotAfter);
1776 goto fail1;
1777 }
1778 Py_DECREF(pnotAfter);
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001779
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001780 /* Now look for subjectAltName */
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001781
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001782 peer_alt_names = _get_peer_alt_names(certificate);
1783 if (peer_alt_names == NULL)
1784 goto fail1;
1785 else if (peer_alt_names != Py_None) {
1786 if (PyDict_SetItemString(retval, "subjectAltName",
1787 peer_alt_names) < 0) {
1788 Py_DECREF(peer_alt_names);
1789 goto fail1;
1790 }
1791 Py_DECREF(peer_alt_names);
1792 }
Guido van Rossumf06628b2007-11-21 20:01:53 +00001793
Christian Heimesbd3a7f92013-11-21 03:40:15 +01001794 /* Authority Information Access: OCSP URIs */
1795 obj = _get_aia_uri(certificate, NID_ad_OCSP);
1796 if (obj == NULL) {
1797 goto fail1;
1798 } else if (obj != Py_None) {
1799 result = PyDict_SetItemString(retval, "OCSP", obj);
1800 Py_DECREF(obj);
1801 if (result < 0) {
1802 goto fail1;
1803 }
1804 }
1805
1806 obj = _get_aia_uri(certificate, NID_ad_ca_issuers);
1807 if (obj == NULL) {
1808 goto fail1;
1809 } else if (obj != Py_None) {
1810 result = PyDict_SetItemString(retval, "caIssuers", obj);
1811 Py_DECREF(obj);
1812 if (result < 0) {
1813 goto fail1;
1814 }
1815 }
1816
1817 /* CDP (CRL distribution points) */
1818 obj = _get_crl_dp(certificate);
1819 if (obj == NULL) {
1820 goto fail1;
1821 } else if (obj != Py_None) {
1822 result = PyDict_SetItemString(retval, "crlDistributionPoints", obj);
1823 Py_DECREF(obj);
1824 if (result < 0) {
1825 goto fail1;
1826 }
1827 }
1828
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001829 BIO_free(biobuf);
1830 return retval;
Thomas Woutersed03b412007-08-28 21:37:11 +00001831
1832 fail1:
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001833 if (biobuf != NULL)
1834 BIO_free(biobuf);
Thomas Woutersed03b412007-08-28 21:37:11 +00001835 fail0:
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001836 Py_XDECREF(retval);
1837 return NULL;
Thomas Woutersed03b412007-08-28 21:37:11 +00001838}
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00001839
Christian Heimes9a5395a2013-06-17 15:44:12 +02001840static PyObject *
1841_certificate_to_der(X509 *certificate)
1842{
1843 unsigned char *bytes_buf = NULL;
1844 int len;
1845 PyObject *retval;
1846
1847 bytes_buf = NULL;
1848 len = i2d_X509(certificate, &bytes_buf);
1849 if (len < 0) {
1850 _setSSLError(NULL, 0, __FILE__, __LINE__);
1851 return NULL;
1852 }
1853 /* this is actually an immutable bytes sequence */
1854 retval = PyBytes_FromStringAndSize((const char *) bytes_buf, len);
1855 OPENSSL_free(bytes_buf);
1856 return retval;
1857}
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001858
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03001859/*[clinic input]
1860_ssl._test_decode_cert
1861 path: object(converter="PyUnicode_FSConverter")
1862 /
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001863
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03001864[clinic start generated code]*/
1865
1866static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001867_ssl__test_decode_cert_impl(PyObject *module, PyObject *path)
1868/*[clinic end generated code: output=96becb9abb23c091 input=cdeaaf02d4346628]*/
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03001869{
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001870 PyObject *retval = NULL;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001871 X509 *x=NULL;
1872 BIO *cert;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001873
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001874 if ((cert=BIO_new(BIO_s_file())) == NULL) {
1875 PyErr_SetString(PySSLErrorObject,
1876 "Can't malloc memory to read file");
1877 goto fail0;
1878 }
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001879
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03001880 if (BIO_read_filename(cert, PyBytes_AsString(path)) <= 0) {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001881 PyErr_SetString(PySSLErrorObject,
1882 "Can't open file");
1883 goto fail0;
1884 }
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001885
Alex Gaynor40dad952019-08-15 08:31:28 -04001886 x = PEM_read_bio_X509(cert, NULL, NULL, NULL);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001887 if (x == NULL) {
1888 PyErr_SetString(PySSLErrorObject,
1889 "Error decoding PEM-encoded file");
1890 goto fail0;
1891 }
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001892
Antoine Pitroufb046912010-11-09 20:21:19 +00001893 retval = _decode_certificate(x);
Mark Dickinsonee55df52010-08-03 18:31:54 +00001894 X509_free(x);
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001895
1896 fail0:
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03001897 Py_DECREF(path);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001898 if (cert != NULL) BIO_free(cert);
1899 return retval;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001900}
1901
1902
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03001903/*[clinic input]
Christian Heimes141c5e82018-02-24 21:10:57 +01001904_ssl._SSLSocket.getpeercert
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03001905 der as binary_mode: bool = False
1906 /
1907
1908Returns the certificate for the peer.
1909
1910If no certificate was provided, returns None. If a certificate was
1911provided, but not validated, returns an empty dictionary. Otherwise
1912returns a dict containing information about the peer certificate.
1913
1914If the optional argument is True, returns a DER-encoded copy of the
1915peer certificate, or None if no certificate was provided. This will
1916return the certificate even if it wasn't validated.
1917[clinic start generated code]*/
1918
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001919static PyObject *
Christian Heimes141c5e82018-02-24 21:10:57 +01001920_ssl__SSLSocket_getpeercert_impl(PySSLSocket *self, int binary_mode)
1921/*[clinic end generated code: output=1f0ab66dfb693c88 input=c0fbe802e57629b7]*/
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001922{
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001923 int verification;
Christian Heimes66dc33b2017-05-23 16:02:02 -07001924 X509 *peer_cert;
1925 PyObject *result;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001926
Christian Heimes66dc33b2017-05-23 16:02:02 -07001927 if (!SSL_is_init_finished(self->ssl)) {
Antoine Pitrou20b85552013-09-29 19:50:53 +02001928 PyErr_SetString(PyExc_ValueError,
1929 "handshake not done yet");
1930 return NULL;
1931 }
Christian Heimes66dc33b2017-05-23 16:02:02 -07001932 peer_cert = SSL_get_peer_certificate(self->ssl);
1933 if (peer_cert == NULL)
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001934 Py_RETURN_NONE;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001935
Antoine Pitrou721738f2012-08-15 23:20:39 +02001936 if (binary_mode) {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001937 /* return cert in DER-encoded format */
Christian Heimes66dc33b2017-05-23 16:02:02 -07001938 result = _certificate_to_der(peer_cert);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001939 } else {
Antoine Pitrou152efa22010-05-16 18:19:27 +00001940 verification = SSL_CTX_get_verify_mode(SSL_get_SSL_CTX(self->ssl));
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001941 if ((verification & SSL_VERIFY_PEER) == 0)
Christian Heimes66dc33b2017-05-23 16:02:02 -07001942 result = PyDict_New();
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001943 else
Christian Heimes66dc33b2017-05-23 16:02:02 -07001944 result = _decode_certificate(peer_cert);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001945 }
Christian Heimes66dc33b2017-05-23 16:02:02 -07001946 X509_free(peer_cert);
1947 return result;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001948}
1949
Benjamin Peterson4cb17812015-01-07 11:14:26 -06001950static PyObject *
1951cipher_to_tuple(const SSL_CIPHER *cipher)
1952{
1953 const char *cipher_name, *cipher_protocol;
1954 PyObject *v, *retval = PyTuple_New(3);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001955 if (retval == NULL)
1956 return NULL;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001957
Benjamin Peterson4cb17812015-01-07 11:14:26 -06001958 cipher_name = SSL_CIPHER_get_name(cipher);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001959 if (cipher_name == NULL) {
Hirokazu Yamamoto524f1032010-12-09 10:49:00 +00001960 Py_INCREF(Py_None);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001961 PyTuple_SET_ITEM(retval, 0, Py_None);
1962 } else {
1963 v = PyUnicode_FromString(cipher_name);
1964 if (v == NULL)
Benjamin Peterson4cb17812015-01-07 11:14:26 -06001965 goto fail;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001966 PyTuple_SET_ITEM(retval, 0, v);
1967 }
Benjamin Peterson4cb17812015-01-07 11:14:26 -06001968
1969 cipher_protocol = SSL_CIPHER_get_version(cipher);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001970 if (cipher_protocol == NULL) {
Hirokazu Yamamoto524f1032010-12-09 10:49:00 +00001971 Py_INCREF(Py_None);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001972 PyTuple_SET_ITEM(retval, 1, Py_None);
1973 } else {
1974 v = PyUnicode_FromString(cipher_protocol);
1975 if (v == NULL)
Benjamin Peterson4cb17812015-01-07 11:14:26 -06001976 goto fail;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001977 PyTuple_SET_ITEM(retval, 1, v);
1978 }
Benjamin Peterson4cb17812015-01-07 11:14:26 -06001979
1980 v = PyLong_FromLong(SSL_CIPHER_get_bits(cipher, NULL));
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001981 if (v == NULL)
Benjamin Peterson4cb17812015-01-07 11:14:26 -06001982 goto fail;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001983 PyTuple_SET_ITEM(retval, 2, v);
Benjamin Peterson4cb17812015-01-07 11:14:26 -06001984
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001985 return retval;
Guido van Rossumf06628b2007-11-21 20:01:53 +00001986
Benjamin Peterson4cb17812015-01-07 11:14:26 -06001987 fail:
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00001988 Py_DECREF(retval);
1989 return NULL;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00001990}
1991
Christian Heimes25bfcd52016-09-06 00:04:45 +02001992#if OPENSSL_VERSION_NUMBER >= 0x10002000UL
1993static PyObject *
1994cipher_to_dict(const SSL_CIPHER *cipher)
1995{
1996 const char *cipher_name, *cipher_protocol;
1997
1998 unsigned long cipher_id;
1999 int alg_bits, strength_bits, len;
2000 char buf[512] = {0};
2001#if OPENSSL_VERSION_1_1
2002 int aead, nid;
2003 const char *skcipher = NULL, *digest = NULL, *kx = NULL, *auth = NULL;
2004#endif
Christian Heimes25bfcd52016-09-06 00:04:45 +02002005
2006 /* can be NULL */
2007 cipher_name = SSL_CIPHER_get_name(cipher);
2008 cipher_protocol = SSL_CIPHER_get_version(cipher);
2009 cipher_id = SSL_CIPHER_get_id(cipher);
2010 SSL_CIPHER_description(cipher, buf, sizeof(buf) - 1);
Segev Finer5cff6372017-07-27 01:19:17 +03002011 /* Downcast to avoid a warning. Safe since buf is always 512 bytes */
2012 len = (int)strlen(buf);
Christian Heimes25bfcd52016-09-06 00:04:45 +02002013 if (len > 1 && buf[len-1] == '\n')
2014 buf[len-1] = '\0';
2015 strength_bits = SSL_CIPHER_get_bits(cipher, &alg_bits);
2016
2017#if OPENSSL_VERSION_1_1
2018 aead = SSL_CIPHER_is_aead(cipher);
2019 nid = SSL_CIPHER_get_cipher_nid(cipher);
2020 skcipher = nid != NID_undef ? OBJ_nid2ln(nid) : NULL;
2021 nid = SSL_CIPHER_get_digest_nid(cipher);
2022 digest = nid != NID_undef ? OBJ_nid2ln(nid) : NULL;
2023 nid = SSL_CIPHER_get_kx_nid(cipher);
2024 kx = nid != NID_undef ? OBJ_nid2ln(nid) : NULL;
2025 nid = SSL_CIPHER_get_auth_nid(cipher);
2026 auth = nid != NID_undef ? OBJ_nid2ln(nid) : NULL;
2027#endif
2028
Victor Stinner410b9882016-09-12 12:00:23 +02002029 return Py_BuildValue(
Christian Heimes25bfcd52016-09-06 00:04:45 +02002030 "{sksssssssisi"
2031#if OPENSSL_VERSION_1_1
2032 "sOssssssss"
2033#endif
2034 "}",
2035 "id", cipher_id,
2036 "name", cipher_name,
2037 "protocol", cipher_protocol,
2038 "description", buf,
2039 "strength_bits", strength_bits,
2040 "alg_bits", alg_bits
2041#if OPENSSL_VERSION_1_1
2042 ,"aead", aead ? Py_True : Py_False,
2043 "symmetric", skcipher,
2044 "digest", digest,
2045 "kea", kx,
2046 "auth", auth
2047#endif
2048 );
Christian Heimes25bfcd52016-09-06 00:04:45 +02002049}
2050#endif
2051
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002052/*[clinic input]
2053_ssl._SSLSocket.shared_ciphers
2054[clinic start generated code]*/
2055
2056static PyObject *
2057_ssl__SSLSocket_shared_ciphers_impl(PySSLSocket *self)
2058/*[clinic end generated code: output=3d174ead2e42c4fd input=0bfe149da8fe6306]*/
Benjamin Peterson4cb17812015-01-07 11:14:26 -06002059{
2060 STACK_OF(SSL_CIPHER) *ciphers;
2061 int i;
2062 PyObject *res;
2063
Christian Heimes598894f2016-09-05 23:19:05 +02002064 ciphers = SSL_get_ciphers(self->ssl);
2065 if (!ciphers)
Benjamin Peterson4cb17812015-01-07 11:14:26 -06002066 Py_RETURN_NONE;
Benjamin Peterson4cb17812015-01-07 11:14:26 -06002067 res = PyList_New(sk_SSL_CIPHER_num(ciphers));
2068 if (!res)
2069 return NULL;
2070 for (i = 0; i < sk_SSL_CIPHER_num(ciphers); i++) {
2071 PyObject *tup = cipher_to_tuple(sk_SSL_CIPHER_value(ciphers, i));
2072 if (!tup) {
2073 Py_DECREF(res);
2074 return NULL;
2075 }
2076 PyList_SET_ITEM(res, i, tup);
2077 }
2078 return res;
2079}
2080
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002081/*[clinic input]
2082_ssl._SSLSocket.cipher
2083[clinic start generated code]*/
2084
2085static PyObject *
2086_ssl__SSLSocket_cipher_impl(PySSLSocket *self)
2087/*[clinic end generated code: output=376417c16d0e5815 input=548fb0e27243796d]*/
Benjamin Peterson4cb17812015-01-07 11:14:26 -06002088{
2089 const SSL_CIPHER *current;
2090
2091 if (self->ssl == NULL)
2092 Py_RETURN_NONE;
2093 current = SSL_get_current_cipher(self->ssl);
2094 if (current == NULL)
2095 Py_RETURN_NONE;
2096 return cipher_to_tuple(current);
2097}
2098
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002099/*[clinic input]
2100_ssl._SSLSocket.version
2101[clinic start generated code]*/
2102
2103static PyObject *
2104_ssl__SSLSocket_version_impl(PySSLSocket *self)
2105/*[clinic end generated code: output=178aed33193b2cdb input=900186a503436fd6]*/
Antoine Pitrou47e40422014-09-04 21:00:10 +02002106{
2107 const char *version;
2108
2109 if (self->ssl == NULL)
2110 Py_RETURN_NONE;
Christian Heimes68771112017-09-05 21:55:40 -07002111 if (!SSL_is_init_finished(self->ssl)) {
2112 /* handshake not finished */
2113 Py_RETURN_NONE;
2114 }
Antoine Pitrou47e40422014-09-04 21:00:10 +02002115 version = SSL_get_version(self->ssl);
2116 if (!strcmp(version, "unknown"))
2117 Py_RETURN_NONE;
2118 return PyUnicode_FromString(version);
2119}
2120
Christian Heimes29eab552018-02-25 12:31:33 +01002121#if HAVE_NPN
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002122/*[clinic input]
2123_ssl._SSLSocket.selected_npn_protocol
2124[clinic start generated code]*/
2125
2126static PyObject *
2127_ssl__SSLSocket_selected_npn_protocol_impl(PySSLSocket *self)
2128/*[clinic end generated code: output=b91d494cd207ecf6 input=c28fde139204b826]*/
2129{
Antoine Pitroud5d17eb2012-03-22 00:23:03 +01002130 const unsigned char *out;
2131 unsigned int outlen;
2132
Victor Stinner4569cd52013-06-23 14:58:43 +02002133 SSL_get0_next_proto_negotiated(self->ssl,
Antoine Pitroud5d17eb2012-03-22 00:23:03 +01002134 &out, &outlen);
2135
2136 if (out == NULL)
2137 Py_RETURN_NONE;
Benjamin Petersoncca27322015-01-23 16:35:37 -05002138 return PyUnicode_FromStringAndSize((char *)out, outlen);
2139}
2140#endif
2141
Christian Heimes29eab552018-02-25 12:31:33 +01002142#if HAVE_ALPN
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002143/*[clinic input]
2144_ssl._SSLSocket.selected_alpn_protocol
2145[clinic start generated code]*/
2146
2147static PyObject *
2148_ssl__SSLSocket_selected_alpn_protocol_impl(PySSLSocket *self)
2149/*[clinic end generated code: output=ec33688b303d250f input=442de30e35bc2913]*/
2150{
Benjamin Petersoncca27322015-01-23 16:35:37 -05002151 const unsigned char *out;
2152 unsigned int outlen;
2153
2154 SSL_get0_alpn_selected(self->ssl, &out, &outlen);
2155
2156 if (out == NULL)
2157 Py_RETURN_NONE;
2158 return PyUnicode_FromStringAndSize((char *)out, outlen);
Antoine Pitroud5d17eb2012-03-22 00:23:03 +01002159}
2160#endif
2161
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002162/*[clinic input]
2163_ssl._SSLSocket.compression
2164[clinic start generated code]*/
2165
2166static PyObject *
2167_ssl__SSLSocket_compression_impl(PySSLSocket *self)
2168/*[clinic end generated code: output=bd16cb1bb4646ae7 input=5d059d0a2bbc32c8]*/
2169{
Antoine Pitrou8abdb8a2011-12-20 10:13:40 +01002170#ifdef OPENSSL_NO_COMP
2171 Py_RETURN_NONE;
2172#else
2173 const COMP_METHOD *comp_method;
2174 const char *short_name;
2175
2176 if (self->ssl == NULL)
2177 Py_RETURN_NONE;
2178 comp_method = SSL_get_current_compression(self->ssl);
Christian Heimes598894f2016-09-05 23:19:05 +02002179 if (comp_method == NULL || COMP_get_type(comp_method) == NID_undef)
Antoine Pitrou8abdb8a2011-12-20 10:13:40 +01002180 Py_RETURN_NONE;
Christian Heimes281e5f82016-09-06 01:10:39 +02002181 short_name = OBJ_nid2sn(COMP_get_type(comp_method));
Antoine Pitrou8abdb8a2011-12-20 10:13:40 +01002182 if (short_name == NULL)
2183 Py_RETURN_NONE;
2184 return PyUnicode_DecodeFSDefault(short_name);
2185#endif
2186}
2187
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01002188static PySSLContext *PySSL_get_context(PySSLSocket *self, void *closure) {
2189 Py_INCREF(self->ctx);
2190 return self->ctx;
2191}
2192
2193static int PySSL_set_context(PySSLSocket *self, PyObject *value,
2194 void *closure) {
2195
Christian Heimes5c36da72020-11-20 09:40:12 +01002196 if (PyObject_TypeCheck(value, PySSLContext_Type)) {
Antoine Pitrou912fbff2013-03-30 16:29:32 +01002197#if !HAVE_SNI
2198 PyErr_SetString(PyExc_NotImplementedError, "setting a socket's "
2199 "context is not supported by your OpenSSL library");
Antoine Pitrou41f8c4f2013-03-30 16:36:54 +01002200 return -1;
Antoine Pitrou912fbff2013-03-30 16:29:32 +01002201#else
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01002202 Py_INCREF(value);
Serhiy Storchaka57a01d32016-04-10 18:05:40 +03002203 Py_SETREF(self->ctx, (PySSLContext *)value);
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01002204 SSL_set_SSL_CTX(self->ssl, self->ctx->ctx);
Christian Heimes77cde502021-03-21 16:13:09 +01002205 /* Set SSL* internal msg_callback to state of new context's state */
2206 SSL_set_msg_callback(
2207 self->ssl,
2208 self->ctx->msg_cb ? _PySSL_msg_callback : NULL
2209 );
Antoine Pitrou912fbff2013-03-30 16:29:32 +01002210#endif
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01002211 } else {
Ned Deily4531ec72018-06-11 20:26:28 -04002212 PyErr_SetString(PyExc_TypeError, "The value must be a SSLContext");
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01002213 return -1;
2214 }
2215
2216 return 0;
2217}
2218
2219PyDoc_STRVAR(PySSL_set_context_doc,
2220"_setter_context(ctx)\n\
2221\
2222This changes the context associated with the SSLSocket. This is typically\n\
Christian Heimes11a14932018-02-24 02:35:08 +01002223used from within a callback function set by the sni_callback\n\
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01002224on the SSLContext to change the certificate information associated with the\n\
2225SSLSocket before the cryptographic exchange handshake messages\n");
2226
2227
Antoine Pitroub1fdf472014-10-05 20:41:53 +02002228static PyObject *
2229PySSL_get_server_side(PySSLSocket *self, void *c)
2230{
2231 return PyBool_FromLong(self->socket_type == PY_SSL_SERVER);
2232}
2233
2234PyDoc_STRVAR(PySSL_get_server_side_doc,
2235"Whether this is a server-side socket.");
2236
2237static PyObject *
2238PySSL_get_server_hostname(PySSLSocket *self, void *c)
2239{
2240 if (self->server_hostname == NULL)
2241 Py_RETURN_NONE;
2242 Py_INCREF(self->server_hostname);
2243 return self->server_hostname;
2244}
2245
2246PyDoc_STRVAR(PySSL_get_server_hostname_doc,
2247"The currently set server hostname (for SNI).");
2248
2249static PyObject *
2250PySSL_get_owner(PySSLSocket *self, void *c)
2251{
2252 PyObject *owner;
2253
2254 if (self->owner == NULL)
2255 Py_RETURN_NONE;
2256
2257 owner = PyWeakref_GetObject(self->owner);
2258 Py_INCREF(owner);
2259 return owner;
2260}
2261
2262static int
2263PySSL_set_owner(PySSLSocket *self, PyObject *value, void *c)
2264{
Serhiy Storchaka48842712016-04-06 09:45:48 +03002265 Py_XSETREF(self->owner, PyWeakref_NewRef(value, NULL));
Antoine Pitroub1fdf472014-10-05 20:41:53 +02002266 if (self->owner == NULL)
2267 return -1;
2268 return 0;
2269}
2270
2271PyDoc_STRVAR(PySSL_get_owner_doc,
2272"The Python-level owner of this object.\
2273Passed as \"self\" in servername callback.");
2274
Christian Heimesc7f70692019-05-31 11:44:05 +02002275static int
2276PySSL_traverse(PySSLSocket *self, visitproc visit, void *arg)
2277{
2278 Py_VISIT(self->exc_type);
2279 Py_VISIT(self->exc_value);
2280 Py_VISIT(self->exc_tb);
2281 return 0;
2282}
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01002283
Christian Heimesc7f70692019-05-31 11:44:05 +02002284static int
2285PySSL_clear(PySSLSocket *self)
2286{
2287 Py_CLEAR(self->exc_type);
2288 Py_CLEAR(self->exc_value);
2289 Py_CLEAR(self->exc_tb);
2290 return 0;
2291}
2292
2293static void
2294PySSL_dealloc(PySSLSocket *self)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002295{
Christian Heimes5c36da72020-11-20 09:40:12 +01002296 PyTypeObject *tp = Py_TYPE(self);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002297 if (self->ssl)
2298 SSL_free(self->ssl);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002299 Py_XDECREF(self->Socket);
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01002300 Py_XDECREF(self->ctx);
Antoine Pitroub1fdf472014-10-05 20:41:53 +02002301 Py_XDECREF(self->server_hostname);
2302 Py_XDECREF(self->owner);
Victor Stinner32bd68c2020-12-01 10:37:39 +01002303 PyObject_Free(self);
Christian Heimes5c36da72020-11-20 09:40:12 +01002304 Py_DECREF(tp);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002305}
2306
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002307/* If the socket has a timeout, do a select()/poll() on the socket.
Guido van Rossum99d4abf2003-01-27 22:22:50 +00002308 The argument writing indicates the direction.
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00002309 Returns one of the possibilities in the timeout_state enum (above).
Guido van Rossum99d4abf2003-01-27 22:22:50 +00002310 */
Andrew M. Kuchling9c3efe32004-07-10 21:15:17 +00002311
Guido van Rossum99d4abf2003-01-27 22:22:50 +00002312static int
Victor Stinner14690702015-04-06 22:46:13 +02002313PySSL_select(PySocketSockObject *s, int writing, _PyTime_t timeout)
Guido van Rossum99d4abf2003-01-27 22:22:50 +00002314{
Victor Stinner4e3cfa42015-04-02 21:28:28 +02002315 int rc;
2316#ifdef HAVE_POLL
2317 struct pollfd pollfd;
2318 _PyTime_t ms;
2319#else
2320 int nfds;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002321 fd_set fds;
2322 struct timeval tv;
Victor Stinner4e3cfa42015-04-02 21:28:28 +02002323#endif
Guido van Rossum99d4abf2003-01-27 22:22:50 +00002324
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002325 /* Nothing to do unless we're in timeout mode (not non-blocking) */
Victor Stinner14690702015-04-06 22:46:13 +02002326 if ((s == NULL) || (timeout == 0))
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002327 return SOCKET_IS_NONBLOCKING;
Victor Stinner14690702015-04-06 22:46:13 +02002328 else if (timeout < 0) {
2329 if (s->sock_timeout > 0)
2330 return SOCKET_HAS_TIMED_OUT;
2331 else
2332 return SOCKET_IS_BLOCKING;
2333 }
Guido van Rossum99d4abf2003-01-27 22:22:50 +00002334
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002335 /* Guard against closed socket */
Victor Stinner524714e2016-07-22 17:43:59 +02002336 if (s->sock_fd == INVALID_SOCKET)
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002337 return SOCKET_HAS_BEEN_CLOSED;
Guido van Rossum99d4abf2003-01-27 22:22:50 +00002338
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002339 /* Prefer poll, if available, since you can poll() any fd
2340 * which can't be done with select(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002341#ifdef HAVE_POLL
Victor Stinner4e3cfa42015-04-02 21:28:28 +02002342 pollfd.fd = s->sock_fd;
2343 pollfd.events = writing ? POLLOUT : POLLIN;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002344
Victor Stinner14690702015-04-06 22:46:13 +02002345 /* timeout is in seconds, poll() uses milliseconds */
2346 ms = (int)_PyTime_AsMilliseconds(timeout, _PyTime_ROUND_CEILING);
Victor Stinner4e3cfa42015-04-02 21:28:28 +02002347 assert(ms <= INT_MAX);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002348
Victor Stinner4e3cfa42015-04-02 21:28:28 +02002349 PySSL_BEGIN_ALLOW_THREADS
2350 rc = poll(&pollfd, 1, (int)ms);
2351 PySSL_END_ALLOW_THREADS
2352#else
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002353 /* Guard against socket too large for select*/
Charles-François Nataliaa26b272011-08-28 17:51:43 +02002354 if (!_PyIsSelectable_fd(s->sock_fd))
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002355 return SOCKET_TOO_LARGE_FOR_SELECT;
Neal Norwitz082b2df2006-02-07 07:04:46 +00002356
Victor Stinner14690702015-04-06 22:46:13 +02002357 _PyTime_AsTimeval_noraise(timeout, &tv, _PyTime_ROUND_CEILING);
Victor Stinnere2452312015-03-28 03:00:46 +01002358
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002359 FD_ZERO(&fds);
2360 FD_SET(s->sock_fd, &fds);
Guido van Rossum99d4abf2003-01-27 22:22:50 +00002361
Victor Stinner4e3cfa42015-04-02 21:28:28 +02002362 /* Wait until the socket becomes ready */
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002363 PySSL_BEGIN_ALLOW_THREADS
Victor Stinner4e3cfa42015-04-02 21:28:28 +02002364 nfds = Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002365 if (writing)
Victor Stinner4e3cfa42015-04-02 21:28:28 +02002366 rc = select(nfds, NULL, &fds, NULL, &tv);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002367 else
Victor Stinner4e3cfa42015-04-02 21:28:28 +02002368 rc = select(nfds, &fds, NULL, NULL, &tv);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002369 PySSL_END_ALLOW_THREADS
Bill Janssen6e027db2007-11-15 22:23:56 +00002370#endif
Victor Stinner4e3cfa42015-04-02 21:28:28 +02002371
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002372 /* Return SOCKET_TIMED_OUT on timeout, SOCKET_OPERATION_OK otherwise
2373 (when we are able to write or when there's something to read) */
2374 return rc == 0 ? SOCKET_HAS_TIMED_OUT : SOCKET_OPERATION_OK;
Guido van Rossum99d4abf2003-01-27 22:22:50 +00002375}
2376
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002377/*[clinic input]
2378_ssl._SSLSocket.write
2379 b: Py_buffer
2380 /
2381
2382Writes the bytes-like object b into the SSL object.
2383
2384Returns the number of bytes written.
2385[clinic start generated code]*/
2386
2387static PyObject *
2388_ssl__SSLSocket_write_impl(PySSLSocket *self, Py_buffer *b)
2389/*[clinic end generated code: output=aa7a6be5527358d8 input=77262d994fe5100a]*/
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002390{
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002391 int len;
2392 int sockstate;
Steve Dowerc6fd1c12018-09-17 11:34:47 -07002393 _PySSLError err;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002394 int nonblocking;
Antoine Pitroub1fdf472014-10-05 20:41:53 +02002395 PySocketSockObject *sock = GET_SOCKET(self);
Victor Stinner14690702015-04-06 22:46:13 +02002396 _PyTime_t timeout, deadline = 0;
2397 int has_timeout;
Bill Janssen54cc54c2007-12-14 22:08:56 +00002398
Antoine Pitroub1fdf472014-10-05 20:41:53 +02002399 if (sock != NULL) {
2400 if (((PyObject*)sock) == Py_None) {
2401 _setSSLError("Underlying socket connection gone",
2402 PY_SSL_ERROR_NO_SOCKET, __FILE__, __LINE__);
2403 return NULL;
2404 }
2405 Py_INCREF(sock);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002406 }
2407
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002408 if (b->len > INT_MAX) {
Victor Stinner6efa9652013-06-25 00:42:31 +02002409 PyErr_Format(PyExc_OverflowError,
2410 "string longer than %d bytes", INT_MAX);
2411 goto error;
2412 }
2413
Antoine Pitroub1fdf472014-10-05 20:41:53 +02002414 if (sock != NULL) {
2415 /* just in case the blocking state of the socket has been changed */
Victor Stinnere2452312015-03-28 03:00:46 +01002416 nonblocking = (sock->sock_timeout >= 0);
Antoine Pitroub1fdf472014-10-05 20:41:53 +02002417 BIO_set_nbio(SSL_get_rbio(self->ssl), nonblocking);
2418 BIO_set_nbio(SSL_get_wbio(self->ssl), nonblocking);
2419 }
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002420
Victor Stinner14690702015-04-06 22:46:13 +02002421 timeout = GET_SOCKET_TIMEOUT(sock);
2422 has_timeout = (timeout > 0);
2423 if (has_timeout)
2424 deadline = _PyTime_GetMonotonicClock() + timeout;
2425
2426 sockstate = PySSL_select(sock, 1, timeout);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002427 if (sockstate == SOCKET_HAS_TIMED_OUT) {
Christian Heimes03c8ddd2020-11-20 09:26:07 +01002428 PyErr_SetString(PyExc_TimeoutError,
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002429 "The write operation timed out");
2430 goto error;
2431 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
2432 PyErr_SetString(PySSLErrorObject,
2433 "Underlying socket has been closed.");
2434 goto error;
2435 } else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
2436 PyErr_SetString(PySSLErrorObject,
2437 "Underlying socket too large for select().");
2438 goto error;
2439 }
Victor Stinner4e3cfa42015-04-02 21:28:28 +02002440
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002441 do {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002442 PySSL_BEGIN_ALLOW_THREADS
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002443 len = SSL_write(self->ssl, b->buf, (int)b->len);
Steve Dowerc6fd1c12018-09-17 11:34:47 -07002444 err = _PySSL_errno(len <= 0, self->ssl, len);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002445 PySSL_END_ALLOW_THREADS
Steve Dowerc6fd1c12018-09-17 11:34:47 -07002446 self->err = err;
Victor Stinner4e3cfa42015-04-02 21:28:28 +02002447
2448 if (PyErr_CheckSignals())
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002449 goto error;
Victor Stinner4e3cfa42015-04-02 21:28:28 +02002450
Victor Stinner14690702015-04-06 22:46:13 +02002451 if (has_timeout)
2452 timeout = deadline - _PyTime_GetMonotonicClock();
2453
Steve Dowerc6fd1c12018-09-17 11:34:47 -07002454 if (err.ssl == SSL_ERROR_WANT_READ) {
Victor Stinner14690702015-04-06 22:46:13 +02002455 sockstate = PySSL_select(sock, 0, timeout);
Steve Dowerc6fd1c12018-09-17 11:34:47 -07002456 } else if (err.ssl == SSL_ERROR_WANT_WRITE) {
Victor Stinner14690702015-04-06 22:46:13 +02002457 sockstate = PySSL_select(sock, 1, timeout);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002458 } else {
2459 sockstate = SOCKET_OPERATION_OK;
2460 }
Victor Stinner4e3cfa42015-04-02 21:28:28 +02002461
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002462 if (sockstate == SOCKET_HAS_TIMED_OUT) {
Christian Heimes03c8ddd2020-11-20 09:26:07 +01002463 PyErr_SetString(PyExc_TimeoutError,
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002464 "The write operation timed out");
2465 goto error;
2466 } else if (sockstate == SOCKET_HAS_BEEN_CLOSED) {
2467 PyErr_SetString(PySSLErrorObject,
2468 "Underlying socket has been closed.");
2469 goto error;
2470 } else if (sockstate == SOCKET_IS_NONBLOCKING) {
2471 break;
2472 }
Steve Dowerc6fd1c12018-09-17 11:34:47 -07002473 } while (err.ssl == SSL_ERROR_WANT_READ ||
2474 err.ssl == SSL_ERROR_WANT_WRITE);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002475
Antoine Pitroub1fdf472014-10-05 20:41:53 +02002476 Py_XDECREF(sock);
Christian Heimesc7f70692019-05-31 11:44:05 +02002477 if (len <= 0)
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002478 return PySSL_SetError(self, len, __FILE__, __LINE__);
Christian Heimesc7f70692019-05-31 11:44:05 +02002479 if (PySSL_ChainExceptions(self) < 0)
2480 return NULL;
2481 return PyLong_FromLong(len);
Antoine Pitrou7d7aede2009-11-25 18:55:32 +00002482error:
Antoine Pitroub1fdf472014-10-05 20:41:53 +02002483 Py_XDECREF(sock);
Christian Heimesc7f70692019-05-31 11:44:05 +02002484 PySSL_ChainExceptions(self);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002485 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002486}
2487
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002488/*[clinic input]
2489_ssl._SSLSocket.pending
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002490
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002491Returns the number of already decrypted bytes available for read, pending on the connection.
2492[clinic start generated code]*/
2493
2494static PyObject *
2495_ssl__SSLSocket_pending_impl(PySSLSocket *self)
2496/*[clinic end generated code: output=983d9fecdc308a83 input=2b77487d6dfd597f]*/
Bill Janssen6e027db2007-11-15 22:23:56 +00002497{
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002498 int count = 0;
Steve Dowerc6fd1c12018-09-17 11:34:47 -07002499 _PySSLError err;
Bill Janssen6e027db2007-11-15 22:23:56 +00002500
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002501 PySSL_BEGIN_ALLOW_THREADS
2502 count = SSL_pending(self->ssl);
Steve Dowerc6fd1c12018-09-17 11:34:47 -07002503 err = _PySSL_errno(count < 0, self->ssl, count);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002504 PySSL_END_ALLOW_THREADS
Steve Dowerc6fd1c12018-09-17 11:34:47 -07002505 self->err = err;
2506
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002507 if (count < 0)
2508 return PySSL_SetError(self, count, __FILE__, __LINE__);
2509 else
2510 return PyLong_FromLong(count);
Bill Janssen6e027db2007-11-15 22:23:56 +00002511}
2512
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002513/*[clinic input]
2514_ssl._SSLSocket.read
2515 size as len: int
2516 [
Larry Hastingsdbfdc382015-05-04 06:59:46 -07002517 buffer: Py_buffer(accept={rwbuffer})
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002518 ]
2519 /
Bill Janssen6e027db2007-11-15 22:23:56 +00002520
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002521Read up to size bytes from the SSL socket.
2522[clinic start generated code]*/
2523
2524static PyObject *
2525_ssl__SSLSocket_read_impl(PySSLSocket *self, int len, int group_right_1,
2526 Py_buffer *buffer)
Larry Hastingsdbfdc382015-05-04 06:59:46 -07002527/*[clinic end generated code: output=00097776cec2a0af input=ff157eb918d0905b]*/
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002528{
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002529 PyObject *dest = NULL;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002530 char *mem;
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002531 int count;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002532 int sockstate;
Steve Dowerc6fd1c12018-09-17 11:34:47 -07002533 _PySSLError err;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002534 int nonblocking;
Antoine Pitroub1fdf472014-10-05 20:41:53 +02002535 PySocketSockObject *sock = GET_SOCKET(self);
Victor Stinner14690702015-04-06 22:46:13 +02002536 _PyTime_t timeout, deadline = 0;
2537 int has_timeout;
Bill Janssen54cc54c2007-12-14 22:08:56 +00002538
Martin Panter5503d472016-03-27 05:35:19 +00002539 if (!group_right_1 && len < 0) {
2540 PyErr_SetString(PyExc_ValueError, "size should not be negative");
2541 return NULL;
2542 }
2543
Antoine Pitroub1fdf472014-10-05 20:41:53 +02002544 if (sock != NULL) {
2545 if (((PyObject*)sock) == Py_None) {
2546 _setSSLError("Underlying socket connection gone",
2547 PY_SSL_ERROR_NO_SOCKET, __FILE__, __LINE__);
2548 return NULL;
2549 }
2550 Py_INCREF(sock);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002551 }
2552
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002553 if (!group_right_1) {
Antoine Pitrou24e561a2010-09-03 18:38:17 +00002554 dest = PyBytes_FromStringAndSize(NULL, len);
2555 if (dest == NULL)
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +00002556 goto error;
Martin Panterbed7f1a2016-07-11 00:17:13 +00002557 if (len == 0) {
2558 Py_XDECREF(sock);
2559 return dest;
2560 }
Antoine Pitrou24e561a2010-09-03 18:38:17 +00002561 mem = PyBytes_AS_STRING(dest);
2562 }
2563 else {
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002564 mem = buffer->buf;
2565 if (len <= 0 || len > buffer->len) {
2566 len = (int) buffer->len;
2567 if (buffer->len != len) {
Antoine Pitrou24e561a2010-09-03 18:38:17 +00002568 PyErr_SetString(PyExc_OverflowError,
2569 "maximum length can't fit in a C 'int'");
2570 goto error;
2571 }
Martin Panterbed7f1a2016-07-11 00:17:13 +00002572 if (len == 0) {
2573 count = 0;
2574 goto done;
2575 }
Antoine Pitrou24e561a2010-09-03 18:38:17 +00002576 }
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002577 }
2578
Antoine Pitroub1fdf472014-10-05 20:41:53 +02002579 if (sock != NULL) {
2580 /* just in case the blocking state of the socket has been changed */
Victor Stinnere2452312015-03-28 03:00:46 +01002581 nonblocking = (sock->sock_timeout >= 0);
Antoine Pitroub1fdf472014-10-05 20:41:53 +02002582 BIO_set_nbio(SSL_get_rbio(self->ssl), nonblocking);
2583 BIO_set_nbio(SSL_get_wbio(self->ssl), nonblocking);
2584 }
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002585
Victor Stinner14690702015-04-06 22:46:13 +02002586 timeout = GET_SOCKET_TIMEOUT(sock);
2587 has_timeout = (timeout > 0);
2588 if (has_timeout)
2589 deadline = _PyTime_GetMonotonicClock() + timeout;
2590
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002591 do {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002592 PySSL_BEGIN_ALLOW_THREADS
2593 count = SSL_read(self->ssl, mem, len);
Steve Dowerc6fd1c12018-09-17 11:34:47 -07002594 err = _PySSL_errno(count <= 0, self->ssl, count);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002595 PySSL_END_ALLOW_THREADS
Steve Dowerc6fd1c12018-09-17 11:34:47 -07002596 self->err = err;
Victor Stinner4e3cfa42015-04-02 21:28:28 +02002597
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002598 if (PyErr_CheckSignals())
2599 goto error;
Victor Stinner4e3cfa42015-04-02 21:28:28 +02002600
Victor Stinner14690702015-04-06 22:46:13 +02002601 if (has_timeout)
2602 timeout = deadline - _PyTime_GetMonotonicClock();
2603
Steve Dowerc6fd1c12018-09-17 11:34:47 -07002604 if (err.ssl == SSL_ERROR_WANT_READ) {
Victor Stinner14690702015-04-06 22:46:13 +02002605 sockstate = PySSL_select(sock, 0, timeout);
Steve Dowerc6fd1c12018-09-17 11:34:47 -07002606 } else if (err.ssl == SSL_ERROR_WANT_WRITE) {
Victor Stinner14690702015-04-06 22:46:13 +02002607 sockstate = PySSL_select(sock, 1, timeout);
Steve Dowerc6fd1c12018-09-17 11:34:47 -07002608 } else if (err.ssl == SSL_ERROR_ZERO_RETURN &&
Victor Stinner4e3cfa42015-04-02 21:28:28 +02002609 SSL_get_shutdown(self->ssl) == SSL_RECEIVED_SHUTDOWN)
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002610 {
2611 count = 0;
2612 goto done;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002613 }
Victor Stinner4e3cfa42015-04-02 21:28:28 +02002614 else
2615 sockstate = SOCKET_OPERATION_OK;
2616
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002617 if (sockstate == SOCKET_HAS_TIMED_OUT) {
Christian Heimes03c8ddd2020-11-20 09:26:07 +01002618 PyErr_SetString(PyExc_TimeoutError,
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002619 "The read operation timed out");
2620 goto error;
2621 } else if (sockstate == SOCKET_IS_NONBLOCKING) {
2622 break;
2623 }
Steve Dowerc6fd1c12018-09-17 11:34:47 -07002624 } while (err.ssl == SSL_ERROR_WANT_READ ||
2625 err.ssl == SSL_ERROR_WANT_WRITE);
Victor Stinner4e3cfa42015-04-02 21:28:28 +02002626
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002627 if (count <= 0) {
2628 PySSL_SetError(self, count, __FILE__, __LINE__);
2629 goto error;
2630 }
Christian Heimesc7f70692019-05-31 11:44:05 +02002631 if (self->exc_type != NULL)
2632 goto error;
Antoine Pitrou24e561a2010-09-03 18:38:17 +00002633
2634done:
Antoine Pitroub1fdf472014-10-05 20:41:53 +02002635 Py_XDECREF(sock);
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002636 if (!group_right_1) {
Antoine Pitrou24e561a2010-09-03 18:38:17 +00002637 _PyBytes_Resize(&dest, count);
2638 return dest;
2639 }
2640 else {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002641 return PyLong_FromLong(count);
2642 }
Antoine Pitrou24e561a2010-09-03 18:38:17 +00002643
2644error:
Christian Heimesc7f70692019-05-31 11:44:05 +02002645 PySSL_ChainExceptions(self);
Antoine Pitroub1fdf472014-10-05 20:41:53 +02002646 Py_XDECREF(sock);
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002647 if (!group_right_1)
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +00002648 Py_XDECREF(dest);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002649 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002650}
2651
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002652/*[clinic input]
2653_ssl._SSLSocket.shutdown
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002654
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002655Does the SSL shutdown handshake with the remote end.
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002656[clinic start generated code]*/
2657
2658static PyObject *
2659_ssl__SSLSocket_shutdown_impl(PySSLSocket *self)
Christian Heimes141c5e82018-02-24 21:10:57 +01002660/*[clinic end generated code: output=ca1aa7ed9d25ca42 input=11d39e69b0a2bf4a]*/
Bill Janssen40a0f662008-08-12 16:56:25 +00002661{
Steve Dowerc6fd1c12018-09-17 11:34:47 -07002662 _PySSLError err;
2663 int sockstate, nonblocking, ret;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002664 int zeros = 0;
Antoine Pitroub1fdf472014-10-05 20:41:53 +02002665 PySocketSockObject *sock = GET_SOCKET(self);
Victor Stinner14690702015-04-06 22:46:13 +02002666 _PyTime_t timeout, deadline = 0;
2667 int has_timeout;
Bill Janssen40a0f662008-08-12 16:56:25 +00002668
Antoine Pitroub1fdf472014-10-05 20:41:53 +02002669 if (sock != NULL) {
2670 /* Guard against closed socket */
Victor Stinner524714e2016-07-22 17:43:59 +02002671 if ((((PyObject*)sock) == Py_None) || (sock->sock_fd == INVALID_SOCKET)) {
Antoine Pitroub1fdf472014-10-05 20:41:53 +02002672 _setSSLError("Underlying socket connection gone",
2673 PY_SSL_ERROR_NO_SOCKET, __FILE__, __LINE__);
2674 return NULL;
2675 }
2676 Py_INCREF(sock);
2677
2678 /* Just in case the blocking state of the socket has been changed */
Victor Stinnere2452312015-03-28 03:00:46 +01002679 nonblocking = (sock->sock_timeout >= 0);
Antoine Pitroub1fdf472014-10-05 20:41:53 +02002680 BIO_set_nbio(SSL_get_rbio(self->ssl), nonblocking);
2681 BIO_set_nbio(SSL_get_wbio(self->ssl), nonblocking);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002682 }
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002683
Victor Stinner14690702015-04-06 22:46:13 +02002684 timeout = GET_SOCKET_TIMEOUT(sock);
2685 has_timeout = (timeout > 0);
2686 if (has_timeout)
2687 deadline = _PyTime_GetMonotonicClock() + timeout;
2688
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002689 while (1) {
2690 PySSL_BEGIN_ALLOW_THREADS
2691 /* Disable read-ahead so that unwrap can work correctly.
2692 * Otherwise OpenSSL might read in too much data,
2693 * eating clear text data that happens to be
2694 * transmitted after the SSL shutdown.
Ezio Melotti85a86292013-08-17 16:57:41 +03002695 * Should be safe to call repeatedly every time this
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002696 * function is used and the shutdown_seen_zero != 0
2697 * condition is met.
2698 */
2699 if (self->shutdown_seen_zero)
2700 SSL_set_read_ahead(self->ssl, 0);
Steve Dowerc6fd1c12018-09-17 11:34:47 -07002701 ret = SSL_shutdown(self->ssl);
2702 err = _PySSL_errno(ret < 0, self->ssl, ret);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002703 PySSL_END_ALLOW_THREADS
Steve Dowerc6fd1c12018-09-17 11:34:47 -07002704 self->err = err;
Victor Stinner4e3cfa42015-04-02 21:28:28 +02002705
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002706 /* If err == 1, a secure shutdown with SSL_shutdown() is complete */
Steve Dowerc6fd1c12018-09-17 11:34:47 -07002707 if (ret > 0)
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002708 break;
Steve Dowerc6fd1c12018-09-17 11:34:47 -07002709 if (ret == 0) {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002710 /* Don't loop endlessly; instead preserve legacy
2711 behaviour of trying SSL_shutdown() only twice.
2712 This looks necessary for OpenSSL < 0.9.8m */
2713 if (++zeros > 1)
2714 break;
2715 /* Shutdown was sent, now try receiving */
2716 self->shutdown_seen_zero = 1;
2717 continue;
Bill Janssen40a0f662008-08-12 16:56:25 +00002718 }
2719
Victor Stinner14690702015-04-06 22:46:13 +02002720 if (has_timeout)
2721 timeout = deadline - _PyTime_GetMonotonicClock();
2722
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002723 /* Possibly retry shutdown until timeout or failure */
Steve Dowerc6fd1c12018-09-17 11:34:47 -07002724 if (err.ssl == SSL_ERROR_WANT_READ)
Victor Stinner14690702015-04-06 22:46:13 +02002725 sockstate = PySSL_select(sock, 0, timeout);
Steve Dowerc6fd1c12018-09-17 11:34:47 -07002726 else if (err.ssl == SSL_ERROR_WANT_WRITE)
Victor Stinner14690702015-04-06 22:46:13 +02002727 sockstate = PySSL_select(sock, 1, timeout);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002728 else
2729 break;
Victor Stinner4e3cfa42015-04-02 21:28:28 +02002730
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002731 if (sockstate == SOCKET_HAS_TIMED_OUT) {
Steve Dowerc6fd1c12018-09-17 11:34:47 -07002732 if (err.ssl == SSL_ERROR_WANT_READ)
Christian Heimes03c8ddd2020-11-20 09:26:07 +01002733 PyErr_SetString(PyExc_TimeoutError,
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002734 "The read operation timed out");
2735 else
Christian Heimes03c8ddd2020-11-20 09:26:07 +01002736 PyErr_SetString(PyExc_TimeoutError,
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002737 "The write operation timed out");
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +00002738 goto error;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002739 }
2740 else if (sockstate == SOCKET_TOO_LARGE_FOR_SELECT) {
2741 PyErr_SetString(PySSLErrorObject,
2742 "Underlying socket too large for select().");
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +00002743 goto error;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002744 }
2745 else if (sockstate != SOCKET_OPERATION_OK)
2746 /* Retain the SSL error code */
2747 break;
2748 }
Nathaniel J. Smithc0da5822018-09-21 21:44:12 -07002749 if (ret < 0) {
Antoine Pitroub1fdf472014-10-05 20:41:53 +02002750 Py_XDECREF(sock);
Christian Heimesc7f70692019-05-31 11:44:05 +02002751 PySSL_SetError(self, ret, __FILE__, __LINE__);
2752 return NULL;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00002753 }
Christian Heimesc7f70692019-05-31 11:44:05 +02002754 if (self->exc_type != NULL)
2755 goto error;
Antoine Pitroub1fdf472014-10-05 20:41:53 +02002756 if (sock)
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +00002757 /* It's already INCREF'ed */
2758 return (PyObject *) sock;
Antoine Pitroub1fdf472014-10-05 20:41:53 +02002759 else
2760 Py_RETURN_NONE;
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +00002761
2762error:
Antoine Pitroub1fdf472014-10-05 20:41:53 +02002763 Py_XDECREF(sock);
Christian Heimesc7f70692019-05-31 11:44:05 +02002764 PySSL_ChainExceptions(self);
Antoine Pitrou8bae4ec2010-06-24 22:34:04 +00002765 return NULL;
Bill Janssen40a0f662008-08-12 16:56:25 +00002766}
2767
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002768/*[clinic input]
Christian Heimes141c5e82018-02-24 21:10:57 +01002769_ssl._SSLSocket.get_channel_binding
2770 cb_type: str = "tls-unique"
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002771
Christian Heimes141c5e82018-02-24 21:10:57 +01002772Get channel binding data for current connection.
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002773
Christian Heimes141c5e82018-02-24 21:10:57 +01002774Raise ValueError if the requested `cb_type` is not supported. Return bytes
2775of the data or None if the data is not available (e.g. before the handshake).
2776Only 'tls-unique' channel binding data from RFC 5929 is supported.
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03002777[clinic start generated code]*/
Bill Janssen40a0f662008-08-12 16:56:25 +00002778
Antoine Pitroud6494802011-07-21 01:11:30 +02002779static PyObject *
Christian Heimes141c5e82018-02-24 21:10:57 +01002780_ssl__SSLSocket_get_channel_binding_impl(PySSLSocket *self,
2781 const char *cb_type)
2782/*[clinic end generated code: output=34bac9acb6a61d31 input=08b7e43b99c17d41]*/
Antoine Pitroud6494802011-07-21 01:11:30 +02002783{
Antoine Pitroud6494802011-07-21 01:11:30 +02002784 char buf[PySSL_CB_MAXLEN];
Victor Stinner9ee02032013-06-23 15:08:23 +02002785 size_t len;
Antoine Pitroud6494802011-07-21 01:11:30 +02002786
Christian Heimes141c5e82018-02-24 21:10:57 +01002787 if (strcmp(cb_type, "tls-unique") == 0) {
2788 if (SSL_session_reused(self->ssl) ^ !self->socket_type) {
2789 /* if session is resumed XOR we are the client */
2790 len = SSL_get_finished(self->ssl, buf, PySSL_CB_MAXLEN);
2791 }
2792 else {
2793 /* if a new session XOR we are the server */
2794 len = SSL_get_peer_finished(self->ssl, buf, PySSL_CB_MAXLEN);
2795 }
Antoine Pitroud6494802011-07-21 01:11:30 +02002796 }
2797 else {
Christian Heimes141c5e82018-02-24 21:10:57 +01002798 PyErr_Format(
2799 PyExc_ValueError,
2800 "'%s' channel binding type not implemented",
2801 cb_type
2802 );
2803 return NULL;
Antoine Pitroud6494802011-07-21 01:11:30 +02002804 }
2805
2806 /* It cannot be negative in current OpenSSL version as of July 2011 */
Antoine Pitroud6494802011-07-21 01:11:30 +02002807 if (len == 0)
2808 Py_RETURN_NONE;
2809
Christian Heimes141c5e82018-02-24 21:10:57 +01002810 return PyBytes_FromStringAndSize(buf, len);
Antoine Pitroud6494802011-07-21 01:11:30 +02002811}
2812
Christian Heimes9fb051f2018-09-23 08:32:31 +02002813/*[clinic input]
2814_ssl._SSLSocket.verify_client_post_handshake
2815
2816Initiate TLS 1.3 post-handshake authentication
2817[clinic start generated code]*/
2818
2819static PyObject *
2820_ssl__SSLSocket_verify_client_post_handshake_impl(PySSLSocket *self)
2821/*[clinic end generated code: output=532147f3b1341425 input=6bfa874810a3d889]*/
2822{
2823#ifdef TLS1_3_VERSION
2824 int err = SSL_verify_client_post_handshake(self->ssl);
2825 if (err == 0)
2826 return _setSSLError(NULL, 0, __FILE__, __LINE__);
2827 else
2828 Py_RETURN_NONE;
2829#else
2830 PyErr_SetString(PyExc_NotImplementedError,
2831 "Post-handshake auth is not supported by your "
2832 "OpenSSL version.");
2833 return NULL;
2834#endif
2835}
2836
Christian Heimes99a65702016-09-10 23:44:53 +02002837#ifdef OPENSSL_VERSION_1_1
2838
2839static SSL_SESSION*
2840_ssl_session_dup(SSL_SESSION *session) {
2841 SSL_SESSION *newsession = NULL;
2842 int slen;
2843 unsigned char *senc = NULL, *p;
2844 const unsigned char *const_p;
2845
2846 if (session == NULL) {
2847 PyErr_SetString(PyExc_ValueError, "Invalid session");
2848 goto error;
2849 }
2850
2851 /* get length */
2852 slen = i2d_SSL_SESSION(session, NULL);
2853 if (slen == 0 || slen > 0xFF00) {
2854 PyErr_SetString(PyExc_ValueError, "i2d() failed.");
2855 goto error;
2856 }
2857 if ((senc = PyMem_Malloc(slen)) == NULL) {
2858 PyErr_NoMemory();
2859 goto error;
2860 }
2861 p = senc;
2862 if (!i2d_SSL_SESSION(session, &p)) {
2863 PyErr_SetString(PyExc_ValueError, "i2d() failed.");
2864 goto error;
2865 }
2866 const_p = senc;
2867 newsession = d2i_SSL_SESSION(NULL, &const_p, slen);
2868 if (session == NULL) {
2869 goto error;
2870 }
2871 PyMem_Free(senc);
2872 return newsession;
2873 error:
2874 if (senc != NULL) {
2875 PyMem_Free(senc);
2876 }
2877 return NULL;
2878}
2879#endif
2880
2881static PyObject *
2882PySSL_get_session(PySSLSocket *self, void *closure) {
2883 /* get_session can return sessions from a server-side connection,
2884 * it does not check for handshake done or client socket. */
2885 PySSLSession *pysess;
2886 SSL_SESSION *session;
2887
2888#ifdef OPENSSL_VERSION_1_1
2889 /* duplicate session as workaround for session bug in OpenSSL 1.1.0,
2890 * https://github.com/openssl/openssl/issues/1550 */
2891 session = SSL_get0_session(self->ssl); /* borrowed reference */
2892 if (session == NULL) {
2893 Py_RETURN_NONE;
2894 }
2895 if ((session = _ssl_session_dup(session)) == NULL) {
2896 return NULL;
2897 }
2898#else
2899 session = SSL_get1_session(self->ssl);
2900 if (session == NULL) {
2901 Py_RETURN_NONE;
2902 }
2903#endif
Christian Heimes5c36da72020-11-20 09:40:12 +01002904 pysess = PyObject_GC_New(PySSLSession, PySSLSession_Type);
Christian Heimes99a65702016-09-10 23:44:53 +02002905 if (pysess == NULL) {
2906 SSL_SESSION_free(session);
2907 return NULL;
2908 }
2909
2910 assert(self->ctx);
2911 pysess->ctx = self->ctx;
2912 Py_INCREF(pysess->ctx);
2913 pysess->session = session;
Christian Heimesa5d07652016-09-24 10:48:05 +02002914 PyObject_GC_Track(pysess);
Christian Heimes99a65702016-09-10 23:44:53 +02002915 return (PyObject *)pysess;
2916}
2917
2918static int PySSL_set_session(PySSLSocket *self, PyObject *value,
2919 void *closure)
2920 {
2921 PySSLSession *pysess;
2922#ifdef OPENSSL_VERSION_1_1
2923 SSL_SESSION *session;
2924#endif
2925 int result;
2926
2927 if (!PySSLSession_Check(value)) {
Ned Deily4531ec72018-06-11 20:26:28 -04002928 PyErr_SetString(PyExc_TypeError, "Value is not a SSLSession.");
Christian Heimes99a65702016-09-10 23:44:53 +02002929 return -1;
2930 }
2931 pysess = (PySSLSession *)value;
2932
2933 if (self->ctx->ctx != pysess->ctx->ctx) {
2934 PyErr_SetString(PyExc_ValueError,
2935 "Session refers to a different SSLContext.");
2936 return -1;
2937 }
2938 if (self->socket_type != PY_SSL_CLIENT) {
2939 PyErr_SetString(PyExc_ValueError,
2940 "Cannot set session for server-side SSLSocket.");
2941 return -1;
2942 }
Christian Heimes66dc33b2017-05-23 16:02:02 -07002943 if (SSL_is_init_finished(self->ssl)) {
Christian Heimes99a65702016-09-10 23:44:53 +02002944 PyErr_SetString(PyExc_ValueError,
2945 "Cannot set session after handshake.");
2946 return -1;
2947 }
2948#ifdef OPENSSL_VERSION_1_1
2949 /* duplicate session */
2950 if ((session = _ssl_session_dup(pysess->session)) == NULL) {
2951 return -1;
2952 }
2953 result = SSL_set_session(self->ssl, session);
2954 /* free duplicate, SSL_set_session() bumps ref count */
2955 SSL_SESSION_free(session);
2956#else
2957 result = SSL_set_session(self->ssl, pysess->session);
2958#endif
2959 if (result == 0) {
2960 _setSSLError(NULL, 0, __FILE__, __LINE__);
2961 return -1;
2962 }
2963 return 0;
2964}
2965
2966PyDoc_STRVAR(PySSL_set_session_doc,
2967"_setter_session(session)\n\
2968\
2969Get / set SSLSession.");
2970
2971static PyObject *
2972PySSL_get_session_reused(PySSLSocket *self, void *closure) {
2973 if (SSL_session_reused(self->ssl)) {
2974 Py_RETURN_TRUE;
2975 } else {
2976 Py_RETURN_FALSE;
2977 }
2978}
2979
2980PyDoc_STRVAR(PySSL_get_session_reused_doc,
2981"Was the client session reused during handshake?");
2982
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01002983static PyGetSetDef ssl_getsetlist[] = {
2984 {"context", (getter) PySSL_get_context,
2985 (setter) PySSL_set_context, PySSL_set_context_doc},
Antoine Pitroub1fdf472014-10-05 20:41:53 +02002986 {"server_side", (getter) PySSL_get_server_side, NULL,
2987 PySSL_get_server_side_doc},
2988 {"server_hostname", (getter) PySSL_get_server_hostname, NULL,
2989 PySSL_get_server_hostname_doc},
2990 {"owner", (getter) PySSL_get_owner, (setter) PySSL_set_owner,
2991 PySSL_get_owner_doc},
Christian Heimes99a65702016-09-10 23:44:53 +02002992 {"session", (getter) PySSL_get_session,
2993 (setter) PySSL_set_session, PySSL_set_session_doc},
2994 {"session_reused", (getter) PySSL_get_session_reused, NULL,
2995 PySSL_get_session_reused_doc},
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01002996 {NULL}, /* sentinel */
2997};
2998
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00002999static PyMethodDef PySSLMethods[] = {
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03003000 _SSL__SSLSOCKET_DO_HANDSHAKE_METHODDEF
3001 _SSL__SSLSOCKET_WRITE_METHODDEF
3002 _SSL__SSLSOCKET_READ_METHODDEF
3003 _SSL__SSLSOCKET_PENDING_METHODDEF
Christian Heimes141c5e82018-02-24 21:10:57 +01003004 _SSL__SSLSOCKET_GETPEERCERT_METHODDEF
3005 _SSL__SSLSOCKET_GET_CHANNEL_BINDING_METHODDEF
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03003006 _SSL__SSLSOCKET_CIPHER_METHODDEF
3007 _SSL__SSLSOCKET_SHARED_CIPHERS_METHODDEF
3008 _SSL__SSLSOCKET_VERSION_METHODDEF
3009 _SSL__SSLSOCKET_SELECTED_NPN_PROTOCOL_METHODDEF
3010 _SSL__SSLSOCKET_SELECTED_ALPN_PROTOCOL_METHODDEF
3011 _SSL__SSLSOCKET_COMPRESSION_METHODDEF
3012 _SSL__SSLSOCKET_SHUTDOWN_METHODDEF
Christian Heimes9fb051f2018-09-23 08:32:31 +02003013 _SSL__SSLSOCKET_VERIFY_CLIENT_POST_HANDSHAKE_METHODDEF
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00003014 {NULL, NULL}
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003015};
3016
Christian Heimes5c36da72020-11-20 09:40:12 +01003017static PyType_Slot PySSLSocket_slots[] = {
3018 {Py_tp_methods, PySSLMethods},
3019 {Py_tp_getset, ssl_getsetlist},
3020 {Py_tp_dealloc, PySSL_dealloc},
3021 {Py_tp_traverse, PySSL_traverse},
3022 {Py_tp_clear, PySSL_clear},
3023 {0, 0},
3024};
3025
3026static PyType_Spec PySSLSocket_spec = {
3027 "_ssl._SSLSocket",
3028 sizeof(PySSLSocket),
3029 0,
3030 Py_TPFLAGS_DEFAULT,
3031 PySSLSocket_slots,
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00003032};
3033
Antoine Pitrou152efa22010-05-16 18:19:27 +00003034
3035/*
3036 * _SSLContext objects
3037 */
3038
Christian Heimes5fe668c2016-09-12 00:01:11 +02003039static int
Christian Heimes9fb051f2018-09-23 08:32:31 +02003040_set_verify_mode(PySSLContext *self, enum py_ssl_cert_requirements n)
Christian Heimes5fe668c2016-09-12 00:01:11 +02003041{
3042 int mode;
3043 int (*verify_cb)(int, X509_STORE_CTX *) = NULL;
3044
3045 switch(n) {
3046 case PY_SSL_CERT_NONE:
3047 mode = SSL_VERIFY_NONE;
3048 break;
3049 case PY_SSL_CERT_OPTIONAL:
3050 mode = SSL_VERIFY_PEER;
3051 break;
3052 case PY_SSL_CERT_REQUIRED:
3053 mode = SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT;
3054 break;
3055 default:
3056 PyErr_SetString(PyExc_ValueError,
3057 "invalid value for verify_mode");
3058 return -1;
3059 }
Christian Heimesf0f59302019-07-01 08:29:17 +02003060
3061 /* bpo-37428: newPySSLSocket() sets SSL_VERIFY_POST_HANDSHAKE flag for
3062 * server sockets and SSL_set_post_handshake_auth() for client. */
3063
Christian Heimes5fe668c2016-09-12 00:01:11 +02003064 /* keep current verify cb */
Christian Heimes9fb051f2018-09-23 08:32:31 +02003065 verify_cb = SSL_CTX_get_verify_callback(self->ctx);
3066 SSL_CTX_set_verify(self->ctx, mode, verify_cb);
Christian Heimes5fe668c2016-09-12 00:01:11 +02003067 return 0;
3068}
3069
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03003070/*[clinic input]
3071@classmethod
3072_ssl._SSLContext.__new__
3073 protocol as proto_version: int
3074 /
3075[clinic start generated code]*/
3076
Antoine Pitrou152efa22010-05-16 18:19:27 +00003077static PyObject *
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03003078_ssl__SSLContext_impl(PyTypeObject *type, int proto_version)
3079/*[clinic end generated code: output=2cf0d7a0741b6bd1 input=8d58a805b95fc534]*/
Antoine Pitrou152efa22010-05-16 18:19:27 +00003080{
Antoine Pitrou152efa22010-05-16 18:19:27 +00003081 PySSLContext *self;
Antoine Pitroucd3d7ca2014-01-09 20:02:20 +01003082 long options;
Antoine Pitrou152efa22010-05-16 18:19:27 +00003083 SSL_CTX *ctx = NULL;
Christian Heimes61d478c2018-01-27 15:51:38 +01003084 X509_VERIFY_PARAM *params;
Christian Heimes358cfd42016-09-10 22:43:48 +02003085 int result;
Berker Peksagdfcb0412016-04-14 16:48:48 +03003086#if defined(SSL_MODE_RELEASE_BUFFERS)
Benjamin Peterson3b1a8b32016-01-07 21:37:37 -08003087 unsigned long libver;
Berker Peksagdfcb0412016-04-14 16:48:48 +03003088#endif
Antoine Pitrou152efa22010-05-16 18:19:27 +00003089
Antoine Pitrou152efa22010-05-16 18:19:27 +00003090 PySSL_BEGIN_ALLOW_THREADS
Christian Heimes6e8cda92020-05-16 03:33:05 +02003091 switch(proto_version) {
3092#if defined(SSL3_VERSION) && !defined(OPENSSL_NO_SSL3)
3093 case PY_SSL_VERSION_SSL3:
Antoine Pitrou152efa22010-05-16 18:19:27 +00003094 ctx = SSL_CTX_new(SSLv3_method());
Christian Heimes6e8cda92020-05-16 03:33:05 +02003095 break;
Benjamin Petersone32467c2014-12-05 21:59:35 -05003096#endif
Christian Heimesa871f692020-06-01 08:58:14 +02003097#if (defined(TLS1_VERSION) && \
3098 !defined(OPENSSL_NO_TLS1) && \
3099 !defined(OPENSSL_NO_TLS1_METHOD))
Christian Heimes6e8cda92020-05-16 03:33:05 +02003100 case PY_SSL_VERSION_TLS1:
3101 ctx = SSL_CTX_new(TLSv1_method());
3102 break;
Victor Stinner3de49192011-05-09 00:42:58 +02003103#endif
Christian Heimesa871f692020-06-01 08:58:14 +02003104#if (defined(TLS1_1_VERSION) && \
3105 !defined(OPENSSL_NO_TLS1_1) && \
3106 !defined(OPENSSL_NO_TLS1_1_METHOD))
Christian Heimes6e8cda92020-05-16 03:33:05 +02003107 case PY_SSL_VERSION_TLS1_1:
3108 ctx = SSL_CTX_new(TLSv1_1_method());
3109 break;
3110#endif
Christian Heimesa871f692020-06-01 08:58:14 +02003111#if (defined(TLS1_2_VERSION) && \
3112 !defined(OPENSSL_NO_TLS1_2) && \
3113 !defined(OPENSSL_NO_TLS1_2_METHOD))
Christian Heimes6e8cda92020-05-16 03:33:05 +02003114 case PY_SSL_VERSION_TLS1_2:
3115 ctx = SSL_CTX_new(TLSv1_2_method());
3116 break;
3117#endif
3118 case PY_SSL_VERSION_TLS:
3119 /* SSLv23 */
Christian Heimes598894f2016-09-05 23:19:05 +02003120 ctx = SSL_CTX_new(TLS_method());
Christian Heimes6e8cda92020-05-16 03:33:05 +02003121 break;
3122 case PY_SSL_VERSION_TLS_CLIENT:
Christian Heimes5fe668c2016-09-12 00:01:11 +02003123 ctx = SSL_CTX_new(TLS_client_method());
Christian Heimes6e8cda92020-05-16 03:33:05 +02003124 break;
3125 case PY_SSL_VERSION_TLS_SERVER:
Christian Heimes5fe668c2016-09-12 00:01:11 +02003126 ctx = SSL_CTX_new(TLS_server_method());
Christian Heimes6e8cda92020-05-16 03:33:05 +02003127 break;
3128 default:
Antoine Pitrou152efa22010-05-16 18:19:27 +00003129 proto_version = -1;
Christian Heimes6e8cda92020-05-16 03:33:05 +02003130 }
Antoine Pitrou152efa22010-05-16 18:19:27 +00003131 PySSL_END_ALLOW_THREADS
3132
3133 if (proto_version == -1) {
3134 PyErr_SetString(PyExc_ValueError,
Christian Heimes6e8cda92020-05-16 03:33:05 +02003135 "invalid or unsupported protocol version");
Antoine Pitrou152efa22010-05-16 18:19:27 +00003136 return NULL;
3137 }
3138 if (ctx == NULL) {
Christian Heimes17c9ac92017-09-07 14:14:00 -07003139 _setSSLError(NULL, 0, __FILE__, __LINE__);
Antoine Pitrou152efa22010-05-16 18:19:27 +00003140 return NULL;
3141 }
3142
3143 assert(type != NULL && type->tp_alloc != NULL);
3144 self = (PySSLContext *) type->tp_alloc(type, 0);
3145 if (self == NULL) {
3146 SSL_CTX_free(ctx);
3147 return NULL;
3148 }
3149 self->ctx = ctx;
Christian Heimes61d478c2018-01-27 15:51:38 +01003150 self->hostflags = X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS;
Christian Heimes11a14932018-02-24 02:35:08 +01003151 self->protocol = proto_version;
Christian Heimesc7f70692019-05-31 11:44:05 +02003152 self->msg_cb = NULL;
3153#ifdef HAVE_OPENSSL_KEYLOG
3154 self->keylog_filename = NULL;
3155 self->keylog_bio = NULL;
3156#endif
Christian Heimes29eab552018-02-25 12:31:33 +01003157#if HAVE_NPN
Christian Heimes5cb31c92012-09-20 12:42:54 +02003158 self->npn_protocols = NULL;
3159#endif
Christian Heimes29eab552018-02-25 12:31:33 +01003160#if HAVE_ALPN
Benjamin Petersoncca27322015-01-23 16:35:37 -05003161 self->alpn_protocols = NULL;
3162#endif
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01003163#ifndef OPENSSL_NO_TLSEXT
Christian Heimes11a14932018-02-24 02:35:08 +01003164 self->set_sni_cb = NULL;
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01003165#endif
Christian Heimes1aa9a752013-12-02 02:41:19 +01003166 /* Don't check host name by default */
Christian Heimes5fe668c2016-09-12 00:01:11 +02003167 if (proto_version == PY_SSL_VERSION_TLS_CLIENT) {
3168 self->check_hostname = 1;
Christian Heimes9fb051f2018-09-23 08:32:31 +02003169 if (_set_verify_mode(self, PY_SSL_CERT_REQUIRED) == -1) {
Christian Heimes5fe668c2016-09-12 00:01:11 +02003170 Py_DECREF(self);
3171 return NULL;
3172 }
3173 } else {
3174 self->check_hostname = 0;
Christian Heimes9fb051f2018-09-23 08:32:31 +02003175 if (_set_verify_mode(self, PY_SSL_CERT_NONE) == -1) {
Christian Heimes5fe668c2016-09-12 00:01:11 +02003176 Py_DECREF(self);
3177 return NULL;
3178 }
3179 }
Antoine Pitrou152efa22010-05-16 18:19:27 +00003180 /* Defaults */
Antoine Pitroucd3d7ca2014-01-09 20:02:20 +01003181 options = SSL_OP_ALL & ~SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS;
3182 if (proto_version != PY_SSL_VERSION_SSL2)
3183 options |= SSL_OP_NO_SSLv2;
Benjamin Petersona9dcdab2015-11-11 22:38:41 -08003184 if (proto_version != PY_SSL_VERSION_SSL3)
3185 options |= SSL_OP_NO_SSLv3;
Christian Heimes358cfd42016-09-10 22:43:48 +02003186 /* Minimal security flags for server and client side context.
3187 * Client sockets ignore server-side parameters. */
3188#ifdef SSL_OP_NO_COMPRESSION
3189 options |= SSL_OP_NO_COMPRESSION;
3190#endif
3191#ifdef SSL_OP_CIPHER_SERVER_PREFERENCE
3192 options |= SSL_OP_CIPHER_SERVER_PREFERENCE;
3193#endif
3194#ifdef SSL_OP_SINGLE_DH_USE
3195 options |= SSL_OP_SINGLE_DH_USE;
3196#endif
3197#ifdef SSL_OP_SINGLE_ECDH_USE
3198 options |= SSL_OP_SINGLE_ECDH_USE;
3199#endif
Antoine Pitroucd3d7ca2014-01-09 20:02:20 +01003200 SSL_CTX_set_options(self->ctx, options);
Antoine Pitrou152efa22010-05-16 18:19:27 +00003201
Semen Zhydenko1295e112017-10-15 21:28:31 +02003202 /* A bare minimum cipher list without completely broken cipher suites.
Christian Heimes358cfd42016-09-10 22:43:48 +02003203 * It's far from perfect but gives users a better head start. */
3204 if (proto_version != PY_SSL_VERSION_SSL2) {
Christian Heimes892d66e2018-01-29 14:10:18 +01003205#if PY_SSL_DEFAULT_CIPHERS == 2
3206 /* stick to OpenSSL's default settings */
3207 result = 1;
3208#else
3209 result = SSL_CTX_set_cipher_list(ctx, PY_SSL_DEFAULT_CIPHER_STRING);
3210#endif
Christian Heimes358cfd42016-09-10 22:43:48 +02003211 } else {
3212 /* SSLv2 needs MD5 */
3213 result = SSL_CTX_set_cipher_list(ctx, "HIGH:!aNULL:!eNULL");
3214 }
3215 if (result == 0) {
3216 Py_DECREF(self);
3217 ERR_clear_error();
3218 PyErr_SetString(PySSLErrorObject,
3219 "No cipher can be selected.");
3220 return NULL;
3221 }
3222
Benjamin Peterson3b1a8b32016-01-07 21:37:37 -08003223#if defined(SSL_MODE_RELEASE_BUFFERS)
3224 /* Set SSL_MODE_RELEASE_BUFFERS. This potentially greatly reduces memory
3225 usage for no cost at all. However, don't do this for OpenSSL versions
3226 between 1.0.1 and 1.0.1h or 1.0.0 and 1.0.0m, which are affected by CVE
3227 2014-0198. I can't find exactly which beta fixed this CVE, so be
3228 conservative and assume it wasn't fixed until release. We do this check
3229 at runtime to avoid problems from the dynamic linker.
3230 See #25672 for more on this. */
Christian Heimesa871f692020-06-01 08:58:14 +02003231 libver = OpenSSL_version_num();
Benjamin Peterson3b1a8b32016-01-07 21:37:37 -08003232 if (!(libver >= 0x10001000UL && libver < 0x1000108fUL) &&
3233 !(libver >= 0x10000000UL && libver < 0x100000dfUL)) {
3234 SSL_CTX_set_mode(self->ctx, SSL_MODE_RELEASE_BUFFERS);
3235 }
3236#endif
3237
3238
Donald Stufft8ae264c2017-03-02 11:45:29 -05003239#if !defined(OPENSSL_NO_ECDH) && !defined(OPENSSL_VERSION_1_1)
Antoine Pitrou0bebbc32014-03-22 18:13:50 +01003240 /* Allow automatic ECDH curve selection (on OpenSSL 1.0.2+), or use
3241 prime256v1 by default. This is Apache mod_ssl's initialization
Christian Heimes598894f2016-09-05 23:19:05 +02003242 policy, so we should be safe. OpenSSL 1.1 has it enabled by default.
3243 */
Donald Stufft8ae264c2017-03-02 11:45:29 -05003244#if defined(SSL_CTX_set_ecdh_auto)
Antoine Pitrou0bebbc32014-03-22 18:13:50 +01003245 SSL_CTX_set_ecdh_auto(self->ctx, 1);
3246#else
3247 {
3248 EC_KEY *key = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1);
3249 SSL_CTX_set_tmp_ecdh(self->ctx, key);
3250 EC_KEY_free(key);
3251 }
3252#endif
3253#endif
3254
Antoine Pitroufc113ee2010-10-13 12:46:13 +00003255#define SID_CTX "Python"
3256 SSL_CTX_set_session_id_context(self->ctx, (const unsigned char *) SID_CTX,
3257 sizeof(SID_CTX));
3258#undef SID_CTX
3259
Christian Heimes61d478c2018-01-27 15:51:38 +01003260 params = SSL_CTX_get0_param(self->ctx);
Benjamin Petersonfdb19712015-03-04 22:11:12 -05003261#ifdef X509_V_FLAG_TRUSTED_FIRST
Christian Heimes61d478c2018-01-27 15:51:38 +01003262 /* Improve trust chain building when cross-signed intermediate
3263 certificates are present. See https://bugs.python.org/issue23476. */
3264 X509_VERIFY_PARAM_set_flags(params, X509_V_FLAG_TRUSTED_FIRST);
Benjamin Petersonfdb19712015-03-04 22:11:12 -05003265#endif
Christian Heimes61d478c2018-01-27 15:51:38 +01003266 X509_VERIFY_PARAM_set_hostflags(params, self->hostflags);
Benjamin Petersonfdb19712015-03-04 22:11:12 -05003267
Christian Heimes9fb051f2018-09-23 08:32:31 +02003268#ifdef TLS1_3_VERSION
3269 self->post_handshake_auth = 0;
3270 SSL_CTX_set_post_handshake_auth(self->ctx, self->post_handshake_auth);
3271#endif
3272
Antoine Pitrou152efa22010-05-16 18:19:27 +00003273 return (PyObject *)self;
3274}
3275
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01003276static int
3277context_traverse(PySSLContext *self, visitproc visit, void *arg)
3278{
3279#ifndef OPENSSL_NO_TLSEXT
Christian Heimes11a14932018-02-24 02:35:08 +01003280 Py_VISIT(self->set_sni_cb);
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01003281#endif
Christian Heimesc7f70692019-05-31 11:44:05 +02003282 Py_VISIT(self->msg_cb);
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01003283 return 0;
3284}
3285
3286static int
3287context_clear(PySSLContext *self)
3288{
3289#ifndef OPENSSL_NO_TLSEXT
Christian Heimes11a14932018-02-24 02:35:08 +01003290 Py_CLEAR(self->set_sni_cb);
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01003291#endif
Christian Heimesc7f70692019-05-31 11:44:05 +02003292 Py_CLEAR(self->msg_cb);
3293#ifdef HAVE_OPENSSL_KEYLOG
3294 Py_CLEAR(self->keylog_filename);
3295 if (self->keylog_bio != NULL) {
3296 PySSL_BEGIN_ALLOW_THREADS
3297 BIO_free_all(self->keylog_bio);
3298 PySSL_END_ALLOW_THREADS
3299 self->keylog_bio = NULL;
3300 }
3301#endif
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01003302 return 0;
3303}
3304
Antoine Pitrou152efa22010-05-16 18:19:27 +00003305static void
3306context_dealloc(PySSLContext *self)
3307{
Christian Heimes5c36da72020-11-20 09:40:12 +01003308 PyTypeObject *tp = Py_TYPE(self);
INADA Naokia6296d32017-08-24 14:55:17 +09003309 /* bpo-31095: UnTrack is needed before calling any callbacks */
3310 PyObject_GC_UnTrack(self);
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01003311 context_clear(self);
Antoine Pitrou152efa22010-05-16 18:19:27 +00003312 SSL_CTX_free(self->ctx);
Christian Heimes29eab552018-02-25 12:31:33 +01003313#if HAVE_NPN
Victor Stinner00d7abd2020-12-01 09:56:42 +01003314 PyMem_Free(self->npn_protocols);
Benjamin Petersoncca27322015-01-23 16:35:37 -05003315#endif
Christian Heimes29eab552018-02-25 12:31:33 +01003316#if HAVE_ALPN
Victor Stinner00d7abd2020-12-01 09:56:42 +01003317 PyMem_Free(self->alpn_protocols);
Antoine Pitroud5d17eb2012-03-22 00:23:03 +01003318#endif
Antoine Pitrou152efa22010-05-16 18:19:27 +00003319 Py_TYPE(self)->tp_free(self);
Christian Heimes5c36da72020-11-20 09:40:12 +01003320 Py_DECREF(tp);
Antoine Pitrou152efa22010-05-16 18:19:27 +00003321}
3322
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03003323/*[clinic input]
3324_ssl._SSLContext.set_ciphers
3325 cipherlist: str
3326 /
3327[clinic start generated code]*/
Antoine Pitrou152efa22010-05-16 18:19:27 +00003328
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03003329static PyObject *
3330_ssl__SSLContext_set_ciphers_impl(PySSLContext *self, const char *cipherlist)
3331/*[clinic end generated code: output=3a3162f3557c0f3f input=a7ac931b9f3ca7fc]*/
3332{
3333 int ret = SSL_CTX_set_cipher_list(self->ctx, cipherlist);
Antoine Pitrou152efa22010-05-16 18:19:27 +00003334 if (ret == 0) {
Antoine Pitrou65ec8ae2010-05-16 19:56:32 +00003335 /* Clearing the error queue is necessary on some OpenSSL versions,
3336 otherwise the error will be reported again when another SSL call
3337 is done. */
3338 ERR_clear_error();
Antoine Pitrou152efa22010-05-16 18:19:27 +00003339 PyErr_SetString(PySSLErrorObject,
3340 "No cipher can be selected.");
3341 return NULL;
3342 }
3343 Py_RETURN_NONE;
3344}
3345
Christian Heimes25bfcd52016-09-06 00:04:45 +02003346#if OPENSSL_VERSION_NUMBER >= 0x10002000UL
3347/*[clinic input]
3348_ssl._SSLContext.get_ciphers
3349[clinic start generated code]*/
3350
3351static PyObject *
3352_ssl__SSLContext_get_ciphers_impl(PySSLContext *self)
3353/*[clinic end generated code: output=a56e4d68a406dfc4 input=a2aadc9af89b79c5]*/
3354{
3355 SSL *ssl = NULL;
3356 STACK_OF(SSL_CIPHER) *sk = NULL;
Christian Heimes99a65702016-09-10 23:44:53 +02003357 const SSL_CIPHER *cipher;
Christian Heimes25bfcd52016-09-06 00:04:45 +02003358 int i=0;
3359 PyObject *result = NULL, *dct;
3360
3361 ssl = SSL_new(self->ctx);
3362 if (ssl == NULL) {
3363 _setSSLError(NULL, 0, __FILE__, __LINE__);
3364 goto exit;
3365 }
3366 sk = SSL_get_ciphers(ssl);
3367
3368 result = PyList_New(sk_SSL_CIPHER_num(sk));
3369 if (result == NULL) {
3370 goto exit;
3371 }
3372
3373 for (i = 0; i < sk_SSL_CIPHER_num(sk); i++) {
3374 cipher = sk_SSL_CIPHER_value(sk, i);
3375 dct = cipher_to_dict(cipher);
3376 if (dct == NULL) {
3377 Py_CLEAR(result);
3378 goto exit;
3379 }
3380 PyList_SET_ITEM(result, i, dct);
3381 }
3382
3383 exit:
3384 if (ssl != NULL)
3385 SSL_free(ssl);
3386 return result;
3387
3388}
3389#endif
3390
3391
Christian Heimes29eab552018-02-25 12:31:33 +01003392#if HAVE_NPN || HAVE_ALPN
Benjamin Petersoncca27322015-01-23 16:35:37 -05003393static int
Benjamin Peterson88615022015-01-23 17:30:26 -05003394do_protocol_selection(int alpn, unsigned char **out, unsigned char *outlen,
3395 const unsigned char *server_protocols, unsigned int server_protocols_len,
3396 const unsigned char *client_protocols, unsigned int client_protocols_len)
Benjamin Petersoncca27322015-01-23 16:35:37 -05003397{
Benjamin Peterson88615022015-01-23 17:30:26 -05003398 int ret;
3399 if (client_protocols == NULL) {
3400 client_protocols = (unsigned char *)"";
3401 client_protocols_len = 0;
3402 }
3403 if (server_protocols == NULL) {
3404 server_protocols = (unsigned char *)"";
3405 server_protocols_len = 0;
Benjamin Petersoncca27322015-01-23 16:35:37 -05003406 }
3407
Benjamin Peterson88615022015-01-23 17:30:26 -05003408 ret = SSL_select_next_proto(out, outlen,
3409 server_protocols, server_protocols_len,
3410 client_protocols, client_protocols_len);
3411 if (alpn && ret != OPENSSL_NPN_NEGOTIATED)
3412 return SSL_TLSEXT_ERR_NOACK;
Benjamin Petersoncca27322015-01-23 16:35:37 -05003413
3414 return SSL_TLSEXT_ERR_OK;
3415}
Melvyn Sopacuab2d096b2017-09-04 23:35:15 +02003416#endif
Benjamin Petersoncca27322015-01-23 16:35:37 -05003417
Christian Heimes29eab552018-02-25 12:31:33 +01003418#if HAVE_NPN
Antoine Pitroud5d17eb2012-03-22 00:23:03 +01003419/* this callback gets passed to SSL_CTX_set_next_protos_advertise_cb */
3420static int
Victor Stinner4569cd52013-06-23 14:58:43 +02003421_advertiseNPN_cb(SSL *s,
3422 const unsigned char **data, unsigned int *len,
Antoine Pitroud5d17eb2012-03-22 00:23:03 +01003423 void *args)
3424{
3425 PySSLContext *ssl_ctx = (PySSLContext *) args;
3426
3427 if (ssl_ctx->npn_protocols == NULL) {
Benjamin Petersoncca27322015-01-23 16:35:37 -05003428 *data = (unsigned char *)"";
Antoine Pitroud5d17eb2012-03-22 00:23:03 +01003429 *len = 0;
3430 } else {
Benjamin Petersoncca27322015-01-23 16:35:37 -05003431 *data = ssl_ctx->npn_protocols;
Antoine Pitroud5d17eb2012-03-22 00:23:03 +01003432 *len = ssl_ctx->npn_protocols_len;
3433 }
3434
3435 return SSL_TLSEXT_ERR_OK;
3436}
3437/* this callback gets passed to SSL_CTX_set_next_proto_select_cb */
3438static int
Victor Stinner4569cd52013-06-23 14:58:43 +02003439_selectNPN_cb(SSL *s,
Antoine Pitroud5d17eb2012-03-22 00:23:03 +01003440 unsigned char **out, unsigned char *outlen,
3441 const unsigned char *server, unsigned int server_len,
3442 void *args)
3443{
Benjamin Petersoncca27322015-01-23 16:35:37 -05003444 PySSLContext *ctx = (PySSLContext *)args;
Benjamin Peterson88615022015-01-23 17:30:26 -05003445 return do_protocol_selection(0, out, outlen, server, server_len,
Benjamin Petersoncca27322015-01-23 16:35:37 -05003446 ctx->npn_protocols, ctx->npn_protocols_len);
Antoine Pitroud5d17eb2012-03-22 00:23:03 +01003447}
3448#endif
3449
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03003450/*[clinic input]
3451_ssl._SSLContext._set_npn_protocols
3452 protos: Py_buffer
3453 /
3454[clinic start generated code]*/
3455
Antoine Pitroud5d17eb2012-03-22 00:23:03 +01003456static PyObject *
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03003457_ssl__SSLContext__set_npn_protocols_impl(PySSLContext *self,
3458 Py_buffer *protos)
3459/*[clinic end generated code: output=72b002c3324390c6 input=319fcb66abf95bd7]*/
Antoine Pitroud5d17eb2012-03-22 00:23:03 +01003460{
Christian Heimes29eab552018-02-25 12:31:33 +01003461#if HAVE_NPN
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03003462 PyMem_Free(self->npn_protocols);
3463 self->npn_protocols = PyMem_Malloc(protos->len);
3464 if (self->npn_protocols == NULL)
Antoine Pitroud5d17eb2012-03-22 00:23:03 +01003465 return PyErr_NoMemory();
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03003466 memcpy(self->npn_protocols, protos->buf, protos->len);
3467 self->npn_protocols_len = (int) protos->len;
Antoine Pitroud5d17eb2012-03-22 00:23:03 +01003468
3469 /* set both server and client callbacks, because the context can
3470 * be used to create both types of sockets */
3471 SSL_CTX_set_next_protos_advertised_cb(self->ctx,
3472 _advertiseNPN_cb,
3473 self);
3474 SSL_CTX_set_next_proto_select_cb(self->ctx,
3475 _selectNPN_cb,
3476 self);
3477
Antoine Pitroud5d17eb2012-03-22 00:23:03 +01003478 Py_RETURN_NONE;
3479#else
3480 PyErr_SetString(PyExc_NotImplementedError,
3481 "The NPN extension requires OpenSSL 1.0.1 or later.");
3482 return NULL;
3483#endif
3484}
3485
Christian Heimes29eab552018-02-25 12:31:33 +01003486#if HAVE_ALPN
Benjamin Petersoncca27322015-01-23 16:35:37 -05003487static int
3488_selectALPN_cb(SSL *s,
3489 const unsigned char **out, unsigned char *outlen,
3490 const unsigned char *client_protocols, unsigned int client_protocols_len,
3491 void *args)
3492{
3493 PySSLContext *ctx = (PySSLContext *)args;
Benjamin Peterson88615022015-01-23 17:30:26 -05003494 return do_protocol_selection(1, (unsigned char **)out, outlen,
3495 ctx->alpn_protocols, ctx->alpn_protocols_len,
3496 client_protocols, client_protocols_len);
Benjamin Petersoncca27322015-01-23 16:35:37 -05003497}
3498#endif
3499
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03003500/*[clinic input]
3501_ssl._SSLContext._set_alpn_protocols
3502 protos: Py_buffer
3503 /
3504[clinic start generated code]*/
3505
Benjamin Petersoncca27322015-01-23 16:35:37 -05003506static PyObject *
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03003507_ssl__SSLContext__set_alpn_protocols_impl(PySSLContext *self,
3508 Py_buffer *protos)
3509/*[clinic end generated code: output=87599a7f76651a9b input=9bba964595d519be]*/
Benjamin Petersoncca27322015-01-23 16:35:37 -05003510{
Christian Heimes29eab552018-02-25 12:31:33 +01003511#if HAVE_ALPN
Victor Stinner5a615592017-09-14 01:10:30 -07003512 if ((size_t)protos->len > UINT_MAX) {
Segev Finer5cff6372017-07-27 01:19:17 +03003513 PyErr_Format(PyExc_OverflowError,
Serhiy Storchakad53fe5f2019-03-13 22:59:55 +02003514 "protocols longer than %u bytes", UINT_MAX);
Segev Finer5cff6372017-07-27 01:19:17 +03003515 return NULL;
3516 }
3517
Victor Stinner00d7abd2020-12-01 09:56:42 +01003518 PyMem_Free(self->alpn_protocols);
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03003519 self->alpn_protocols = PyMem_Malloc(protos->len);
Benjamin Petersoncca27322015-01-23 16:35:37 -05003520 if (!self->alpn_protocols)
3521 return PyErr_NoMemory();
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03003522 memcpy(self->alpn_protocols, protos->buf, protos->len);
Segev Finer5cff6372017-07-27 01:19:17 +03003523 self->alpn_protocols_len = (unsigned int)protos->len;
Benjamin Petersoncca27322015-01-23 16:35:37 -05003524
3525 if (SSL_CTX_set_alpn_protos(self->ctx, self->alpn_protocols, self->alpn_protocols_len))
3526 return PyErr_NoMemory();
3527 SSL_CTX_set_alpn_select_cb(self->ctx, _selectALPN_cb, self);
3528
Benjamin Petersoncca27322015-01-23 16:35:37 -05003529 Py_RETURN_NONE;
3530#else
3531 PyErr_SetString(PyExc_NotImplementedError,
3532 "The ALPN extension requires OpenSSL 1.0.2 or later.");
3533 return NULL;
3534#endif
3535}
3536
Antoine Pitrou152efa22010-05-16 18:19:27 +00003537static PyObject *
3538get_verify_mode(PySSLContext *self, void *c)
3539{
Christian Heimes9fb051f2018-09-23 08:32:31 +02003540 /* ignore SSL_VERIFY_CLIENT_ONCE and SSL_VERIFY_POST_HANDSHAKE */
3541 int mask = (SSL_VERIFY_NONE | SSL_VERIFY_PEER |
3542 SSL_VERIFY_FAIL_IF_NO_PEER_CERT);
3543 switch (SSL_CTX_get_verify_mode(self->ctx) & mask) {
Antoine Pitrou152efa22010-05-16 18:19:27 +00003544 case SSL_VERIFY_NONE:
3545 return PyLong_FromLong(PY_SSL_CERT_NONE);
3546 case SSL_VERIFY_PEER:
3547 return PyLong_FromLong(PY_SSL_CERT_OPTIONAL);
3548 case SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT:
3549 return PyLong_FromLong(PY_SSL_CERT_REQUIRED);
3550 }
3551 PyErr_SetString(PySSLErrorObject,
3552 "invalid return value from SSL_CTX_get_verify_mode");
3553 return NULL;
3554}
3555
3556static int
3557set_verify_mode(PySSLContext *self, PyObject *arg, void *c)
3558{
Christian Heimes5fe668c2016-09-12 00:01:11 +02003559 int n;
Antoine Pitrou152efa22010-05-16 18:19:27 +00003560 if (!PyArg_Parse(arg, "i", &n))
3561 return -1;
Christian Heimes5fe668c2016-09-12 00:01:11 +02003562 if (n == PY_SSL_CERT_NONE && self->check_hostname) {
Christian Heimes1aa9a752013-12-02 02:41:19 +01003563 PyErr_SetString(PyExc_ValueError,
3564 "Cannot set verify_mode to CERT_NONE when "
3565 "check_hostname is enabled.");
3566 return -1;
3567 }
Christian Heimes9fb051f2018-09-23 08:32:31 +02003568 return _set_verify_mode(self, n);
Antoine Pitrou152efa22010-05-16 18:19:27 +00003569}
3570
3571static PyObject *
Christian Heimes22587792013-11-21 23:56:13 +01003572get_verify_flags(PySSLContext *self, void *c)
3573{
Christian Heimes598894f2016-09-05 23:19:05 +02003574 X509_VERIFY_PARAM *param;
Christian Heimes22587792013-11-21 23:56:13 +01003575 unsigned long flags;
3576
Christian Heimes61d478c2018-01-27 15:51:38 +01003577 param = SSL_CTX_get0_param(self->ctx);
Christian Heimes598894f2016-09-05 23:19:05 +02003578 flags = X509_VERIFY_PARAM_get_flags(param);
Christian Heimes22587792013-11-21 23:56:13 +01003579 return PyLong_FromUnsignedLong(flags);
3580}
3581
3582static int
3583set_verify_flags(PySSLContext *self, PyObject *arg, void *c)
3584{
Christian Heimes598894f2016-09-05 23:19:05 +02003585 X509_VERIFY_PARAM *param;
Christian Heimes22587792013-11-21 23:56:13 +01003586 unsigned long new_flags, flags, set, clear;
3587
3588 if (!PyArg_Parse(arg, "k", &new_flags))
3589 return -1;
Christian Heimes61d478c2018-01-27 15:51:38 +01003590 param = SSL_CTX_get0_param(self->ctx);
Christian Heimes598894f2016-09-05 23:19:05 +02003591 flags = X509_VERIFY_PARAM_get_flags(param);
Christian Heimes22587792013-11-21 23:56:13 +01003592 clear = flags & ~new_flags;
3593 set = ~flags & new_flags;
3594 if (clear) {
Christian Heimes598894f2016-09-05 23:19:05 +02003595 if (!X509_VERIFY_PARAM_clear_flags(param, clear)) {
Christian Heimes22587792013-11-21 23:56:13 +01003596 _setSSLError(NULL, 0, __FILE__, __LINE__);
3597 return -1;
3598 }
3599 }
3600 if (set) {
Christian Heimes598894f2016-09-05 23:19:05 +02003601 if (!X509_VERIFY_PARAM_set_flags(param, set)) {
Christian Heimes22587792013-11-21 23:56:13 +01003602 _setSSLError(NULL, 0, __FILE__, __LINE__);
3603 return -1;
3604 }
3605 }
3606 return 0;
3607}
3608
Christian Heimes698dde12018-02-27 11:54:43 +01003609/* Getter and setter for protocol version */
3610#if defined(SSL_CTRL_GET_MAX_PROTO_VERSION)
3611
3612
3613static int
3614set_min_max_proto_version(PySSLContext *self, PyObject *arg, int what)
3615{
3616 long v;
3617 int result;
3618
3619 if (!PyArg_Parse(arg, "l", &v))
3620 return -1;
3621 if (v > INT_MAX) {
3622 PyErr_SetString(PyExc_OverflowError, "Option is too long");
3623 return -1;
3624 }
3625
3626 switch(self->protocol) {
3627 case PY_SSL_VERSION_TLS_CLIENT: /* fall through */
3628 case PY_SSL_VERSION_TLS_SERVER: /* fall through */
3629 case PY_SSL_VERSION_TLS:
3630 break;
3631 default:
3632 PyErr_SetString(
3633 PyExc_ValueError,
3634 "The context's protocol doesn't support modification of "
3635 "highest and lowest version."
3636 );
3637 return -1;
3638 }
3639
3640 if (what == 0) {
3641 switch(v) {
3642 case PY_PROTO_MINIMUM_SUPPORTED:
3643 v = 0;
3644 break;
3645 case PY_PROTO_MAXIMUM_SUPPORTED:
3646 /* Emulate max for set_min_proto_version */
3647 v = PY_PROTO_MAXIMUM_AVAILABLE;
3648 break;
3649 default:
3650 break;
3651 }
3652 result = SSL_CTX_set_min_proto_version(self->ctx, v);
3653 }
3654 else {
3655 switch(v) {
3656 case PY_PROTO_MAXIMUM_SUPPORTED:
3657 v = 0;
3658 break;
3659 case PY_PROTO_MINIMUM_SUPPORTED:
3660 /* Emulate max for set_min_proto_version */
3661 v = PY_PROTO_MINIMUM_AVAILABLE;
3662 break;
3663 default:
3664 break;
3665 }
3666 result = SSL_CTX_set_max_proto_version(self->ctx, v);
3667 }
3668 if (result == 0) {
3669 PyErr_Format(PyExc_ValueError,
3670 "Unsupported protocol version 0x%x", v);
3671 return -1;
3672 }
3673 return 0;
3674}
3675
3676static PyObject *
3677get_minimum_version(PySSLContext *self, void *c)
3678{
3679 int v = SSL_CTX_ctrl(self->ctx, SSL_CTRL_GET_MIN_PROTO_VERSION, 0, NULL);
3680 if (v == 0) {
3681 v = PY_PROTO_MINIMUM_SUPPORTED;
3682 }
3683 return PyLong_FromLong(v);
3684}
3685
3686static int
3687set_minimum_version(PySSLContext *self, PyObject *arg, void *c)
3688{
3689 return set_min_max_proto_version(self, arg, 0);
3690}
3691
3692static PyObject *
3693get_maximum_version(PySSLContext *self, void *c)
3694{
3695 int v = SSL_CTX_ctrl(self->ctx, SSL_CTRL_GET_MAX_PROTO_VERSION, 0, NULL);
3696 if (v == 0) {
3697 v = PY_PROTO_MAXIMUM_SUPPORTED;
3698 }
3699 return PyLong_FromLong(v);
3700}
3701
3702static int
3703set_maximum_version(PySSLContext *self, PyObject *arg, void *c)
3704{
3705 return set_min_max_proto_version(self, arg, 1);
3706}
3707#endif /* SSL_CTRL_GET_MAX_PROTO_VERSION */
3708
Christian Heimes78c7d522019-06-03 21:00:10 +02003709#if (OPENSSL_VERSION_NUMBER >= 0x10101000L) && !defined(LIBRESSL_VERSION_NUMBER)
3710static PyObject *
3711get_num_tickets(PySSLContext *self, void *c)
3712{
Victor Stinner76611c72019-07-09 13:30:52 +02003713 return PyLong_FromSize_t(SSL_CTX_get_num_tickets(self->ctx));
Christian Heimes78c7d522019-06-03 21:00:10 +02003714}
3715
3716static int
3717set_num_tickets(PySSLContext *self, PyObject *arg, void *c)
3718{
3719 long num;
3720 if (!PyArg_Parse(arg, "l", &num))
3721 return -1;
3722 if (num < 0) {
3723 PyErr_SetString(PyExc_ValueError, "value must be non-negative");
3724 return -1;
3725 }
3726 if (self->protocol != PY_SSL_VERSION_TLS_SERVER) {
3727 PyErr_SetString(PyExc_ValueError,
3728 "SSLContext is not a server context.");
3729 return -1;
3730 }
3731 if (SSL_CTX_set_num_tickets(self->ctx, num) != 1) {
3732 PyErr_SetString(PyExc_ValueError, "failed to set num tickets.");
3733 return -1;
3734 }
3735 return 0;
3736}
3737
3738PyDoc_STRVAR(PySSLContext_num_tickets_doc,
3739"Control the number of TLSv1.3 session tickets");
3740#endif /* OpenSSL 1.1.1 */
3741
matthewhughes9348e836bb2020-07-17 09:59:15 +01003742#if (OPENSSL_VERSION_NUMBER >= 0x10100000L) && !defined(LIBRESSL_VERSION_NUMBER)
3743static PyObject *
3744get_security_level(PySSLContext *self, void *c)
3745{
3746 return PyLong_FromLong(SSL_CTX_get_security_level(self->ctx));
3747}
3748PyDoc_STRVAR(PySSLContext_security_level_doc, "The current security level");
3749#endif /* OpenSSL 1.1.0 */
3750
Christian Heimes22587792013-11-21 23:56:13 +01003751static PyObject *
Antoine Pitroub5218772010-05-21 09:56:06 +00003752get_options(PySSLContext *self, void *c)
3753{
3754 return PyLong_FromLong(SSL_CTX_get_options(self->ctx));
3755}
3756
3757static int
3758set_options(PySSLContext *self, PyObject *arg, void *c)
3759{
3760 long new_opts, opts, set, clear;
3761 if (!PyArg_Parse(arg, "l", &new_opts))
3762 return -1;
3763 opts = SSL_CTX_get_options(self->ctx);
3764 clear = opts & ~new_opts;
3765 set = ~opts & new_opts;
3766 if (clear) {
3767#ifdef HAVE_SSL_CTX_CLEAR_OPTIONS
3768 SSL_CTX_clear_options(self->ctx, clear);
3769#else
3770 PyErr_SetString(PyExc_ValueError,
3771 "can't clear options before OpenSSL 0.9.8m");
3772 return -1;
3773#endif
3774 }
3775 if (set)
3776 SSL_CTX_set_options(self->ctx, set);
3777 return 0;
3778}
3779
Christian Heimes1aa9a752013-12-02 02:41:19 +01003780static PyObject *
Christian Heimes61d478c2018-01-27 15:51:38 +01003781get_host_flags(PySSLContext *self, void *c)
3782{
3783 return PyLong_FromUnsignedLong(self->hostflags);
3784}
3785
3786static int
3787set_host_flags(PySSLContext *self, PyObject *arg, void *c)
3788{
3789 X509_VERIFY_PARAM *param;
3790 unsigned int new_flags = 0;
3791
3792 if (!PyArg_Parse(arg, "I", &new_flags))
3793 return -1;
3794
3795 param = SSL_CTX_get0_param(self->ctx);
3796 self->hostflags = new_flags;
3797 X509_VERIFY_PARAM_set_hostflags(param, new_flags);
3798 return 0;
3799}
3800
3801static PyObject *
Christian Heimes1aa9a752013-12-02 02:41:19 +01003802get_check_hostname(PySSLContext *self, void *c)
3803{
3804 return PyBool_FromLong(self->check_hostname);
3805}
3806
3807static int
3808set_check_hostname(PySSLContext *self, PyObject *arg, void *c)
3809{
3810 int check_hostname;
3811 if (!PyArg_Parse(arg, "p", &check_hostname))
3812 return -1;
3813 if (check_hostname &&
3814 SSL_CTX_get_verify_mode(self->ctx) == SSL_VERIFY_NONE) {
Christian Heimese82c0342017-09-15 20:29:57 +02003815 /* check_hostname = True sets verify_mode = CERT_REQUIRED */
Christian Heimes9fb051f2018-09-23 08:32:31 +02003816 if (_set_verify_mode(self, PY_SSL_CERT_REQUIRED) == -1) {
Christian Heimese82c0342017-09-15 20:29:57 +02003817 return -1;
3818 }
Christian Heimes1aa9a752013-12-02 02:41:19 +01003819 }
3820 self->check_hostname = check_hostname;
3821 return 0;
3822}
3823
Christian Heimes11a14932018-02-24 02:35:08 +01003824static PyObject *
Christian Heimes9fb051f2018-09-23 08:32:31 +02003825get_post_handshake_auth(PySSLContext *self, void *c) {
3826#if TLS1_3_VERSION
3827 return PyBool_FromLong(self->post_handshake_auth);
3828#else
3829 Py_RETURN_NONE;
3830#endif
3831}
3832
3833#if TLS1_3_VERSION
3834static int
3835set_post_handshake_auth(PySSLContext *self, PyObject *arg, void *c) {
Zackery Spytz842acaa2018-12-17 07:52:45 -07003836 if (arg == NULL) {
3837 PyErr_SetString(PyExc_AttributeError, "cannot delete attribute");
3838 return -1;
3839 }
Christian Heimes9fb051f2018-09-23 08:32:31 +02003840 int pha = PyObject_IsTrue(arg);
3841
3842 if (pha == -1) {
3843 return -1;
3844 }
3845 self->post_handshake_auth = pha;
3846
Christian Heimesf0f59302019-07-01 08:29:17 +02003847 /* bpo-37428: newPySSLSocket() sets SSL_VERIFY_POST_HANDSHAKE flag for
3848 * server sockets and SSL_set_post_handshake_auth() for client. */
Christian Heimes9fb051f2018-09-23 08:32:31 +02003849
3850 return 0;
3851}
3852#endif
3853
3854static PyObject *
Christian Heimes11a14932018-02-24 02:35:08 +01003855get_protocol(PySSLContext *self, void *c) {
3856 return PyLong_FromLong(self->protocol);
3857}
Christian Heimes1aa9a752013-12-02 02:41:19 +01003858
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +02003859typedef struct {
3860 PyThreadState *thread_state;
3861 PyObject *callable;
3862 char *password;
Victor Stinner9ee02032013-06-23 15:08:23 +02003863 int size;
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +02003864 int error;
3865} _PySSLPasswordInfo;
3866
3867static int
3868_pwinfo_set(_PySSLPasswordInfo *pw_info, PyObject* password,
3869 const char *bad_type_error)
3870{
3871 /* Set the password and size fields of a _PySSLPasswordInfo struct
3872 from a unicode, bytes, or byte array object.
3873 The password field will be dynamically allocated and must be freed
3874 by the caller */
3875 PyObject *password_bytes = NULL;
3876 const char *data = NULL;
3877 Py_ssize_t size;
3878
3879 if (PyUnicode_Check(password)) {
Serhiy Storchaka65fb2c02019-05-31 10:39:15 +03003880 password_bytes = PyUnicode_AsUTF8String(password);
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +02003881 if (!password_bytes) {
3882 goto error;
3883 }
3884 data = PyBytes_AS_STRING(password_bytes);
3885 size = PyBytes_GET_SIZE(password_bytes);
3886 } else if (PyBytes_Check(password)) {
3887 data = PyBytes_AS_STRING(password);
3888 size = PyBytes_GET_SIZE(password);
3889 } else if (PyByteArray_Check(password)) {
3890 data = PyByteArray_AS_STRING(password);
3891 size = PyByteArray_GET_SIZE(password);
3892 } else {
3893 PyErr_SetString(PyExc_TypeError, bad_type_error);
3894 goto error;
3895 }
3896
Victor Stinner9ee02032013-06-23 15:08:23 +02003897 if (size > (Py_ssize_t)INT_MAX) {
3898 PyErr_Format(PyExc_ValueError,
3899 "password cannot be longer than %d bytes", INT_MAX);
3900 goto error;
3901 }
3902
Victor Stinner11ebff22013-07-07 17:07:52 +02003903 PyMem_Free(pw_info->password);
3904 pw_info->password = PyMem_Malloc(size);
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +02003905 if (!pw_info->password) {
3906 PyErr_SetString(PyExc_MemoryError,
3907 "unable to allocate password buffer");
3908 goto error;
3909 }
3910 memcpy(pw_info->password, data, size);
Victor Stinner9ee02032013-06-23 15:08:23 +02003911 pw_info->size = (int)size;
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +02003912
3913 Py_XDECREF(password_bytes);
3914 return 1;
3915
3916error:
3917 Py_XDECREF(password_bytes);
3918 return 0;
3919}
3920
3921static int
3922_password_callback(char *buf, int size, int rwflag, void *userdata)
3923{
3924 _PySSLPasswordInfo *pw_info = (_PySSLPasswordInfo*) userdata;
3925 PyObject *fn_ret = NULL;
3926
3927 PySSL_END_ALLOW_THREADS_S(pw_info->thread_state);
3928
Christian Heimesd3b73f32021-04-09 15:23:38 +02003929 if (pw_info->error) {
3930 /* already failed previously. OpenSSL 3.0.0-alpha14 invokes the
3931 * callback multiple times which can lead to fatal Python error in
3932 * exception check. */
3933 goto error;
3934 }
3935
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +02003936 if (pw_info->callable) {
Victor Stinnerf17c3de2016-12-06 18:46:19 +01003937 fn_ret = _PyObject_CallNoArg(pw_info->callable);
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +02003938 if (!fn_ret) {
3939 /* TODO: It would be nice to move _ctypes_add_traceback() into the
3940 core python API, so we could use it to add a frame here */
3941 goto error;
3942 }
3943
3944 if (!_pwinfo_set(pw_info, fn_ret,
3945 "password callback must return a string")) {
3946 goto error;
3947 }
3948 Py_CLEAR(fn_ret);
3949 }
3950
3951 if (pw_info->size > size) {
3952 PyErr_Format(PyExc_ValueError,
3953 "password cannot be longer than %d bytes", size);
3954 goto error;
3955 }
3956
3957 PySSL_BEGIN_ALLOW_THREADS_S(pw_info->thread_state);
3958 memcpy(buf, pw_info->password, pw_info->size);
3959 return pw_info->size;
3960
3961error:
3962 Py_XDECREF(fn_ret);
3963 PySSL_BEGIN_ALLOW_THREADS_S(pw_info->thread_state);
3964 pw_info->error = 1;
3965 return -1;
3966}
3967
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03003968/*[clinic input]
3969_ssl._SSLContext.load_cert_chain
3970 certfile: object
Serhiy Storchaka279f4462019-09-14 12:24:05 +03003971 keyfile: object = None
3972 password: object = None
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03003973
3974[clinic start generated code]*/
3975
Antoine Pitroub5218772010-05-21 09:56:06 +00003976static PyObject *
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03003977_ssl__SSLContext_load_cert_chain_impl(PySSLContext *self, PyObject *certfile,
3978 PyObject *keyfile, PyObject *password)
Serhiy Storchaka279f4462019-09-14 12:24:05 +03003979/*[clinic end generated code: output=9480bc1c380e2095 input=30bc7e967ea01a58]*/
Antoine Pitrou152efa22010-05-16 18:19:27 +00003980{
Antoine Pitrou152efa22010-05-16 18:19:27 +00003981 PyObject *certfile_bytes = NULL, *keyfile_bytes = NULL;
Christian Heimes598894f2016-09-05 23:19:05 +02003982 pem_password_cb *orig_passwd_cb = SSL_CTX_get_default_passwd_cb(self->ctx);
3983 void *orig_passwd_userdata = SSL_CTX_get_default_passwd_cb_userdata(self->ctx);
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +02003984 _PySSLPasswordInfo pw_info = { NULL, NULL, NULL, 0, 0 };
Antoine Pitrou152efa22010-05-16 18:19:27 +00003985 int r;
3986
Giampaolo Rodolà745ab382010-08-29 19:25:49 +00003987 errno = 0;
Antoine Pitrou67e8e562010-09-01 20:55:41 +00003988 ERR_clear_error();
Antoine Pitrou152efa22010-05-16 18:19:27 +00003989 if (keyfile == Py_None)
3990 keyfile = NULL;
3991 if (!PyUnicode_FSConverter(certfile, &certfile_bytes)) {
Serhiy Storchaka65fb2c02019-05-31 10:39:15 +03003992 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
3993 PyErr_SetString(PyExc_TypeError,
3994 "certfile should be a valid filesystem path");
3995 }
Antoine Pitrou152efa22010-05-16 18:19:27 +00003996 return NULL;
3997 }
3998 if (keyfile && !PyUnicode_FSConverter(keyfile, &keyfile_bytes)) {
Serhiy Storchaka65fb2c02019-05-31 10:39:15 +03003999 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
4000 PyErr_SetString(PyExc_TypeError,
4001 "keyfile should be a valid filesystem path");
4002 }
Antoine Pitrou152efa22010-05-16 18:19:27 +00004003 goto error;
4004 }
Serhiy Storchaka279f4462019-09-14 12:24:05 +03004005 if (password != Py_None) {
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +02004006 if (PyCallable_Check(password)) {
4007 pw_info.callable = password;
4008 } else if (!_pwinfo_set(&pw_info, password,
4009 "password should be a string or callable")) {
4010 goto error;
4011 }
4012 SSL_CTX_set_default_passwd_cb(self->ctx, _password_callback);
4013 SSL_CTX_set_default_passwd_cb_userdata(self->ctx, &pw_info);
4014 }
4015 PySSL_BEGIN_ALLOW_THREADS_S(pw_info.thread_state);
Antoine Pitrou152efa22010-05-16 18:19:27 +00004016 r = SSL_CTX_use_certificate_chain_file(self->ctx,
4017 PyBytes_AS_STRING(certfile_bytes));
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +02004018 PySSL_END_ALLOW_THREADS_S(pw_info.thread_state);
Antoine Pitrou152efa22010-05-16 18:19:27 +00004019 if (r != 1) {
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +02004020 if (pw_info.error) {
4021 ERR_clear_error();
4022 /* the password callback has already set the error information */
4023 }
4024 else if (errno != 0) {
Giampaolo Rodolàe0f98632010-09-01 19:28:49 +00004025 ERR_clear_error();
Serhiy Storchaka55fe1ae2017-04-16 10:46:38 +03004026 PyErr_SetFromErrno(PyExc_OSError);
Giampaolo Rodolà745ab382010-08-29 19:25:49 +00004027 }
4028 else {
4029 _setSSLError(NULL, 0, __FILE__, __LINE__);
4030 }
Antoine Pitrou152efa22010-05-16 18:19:27 +00004031 goto error;
4032 }
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +02004033 PySSL_BEGIN_ALLOW_THREADS_S(pw_info.thread_state);
Antoine Pitrou9c254862011-04-03 18:15:34 +02004034 r = SSL_CTX_use_PrivateKey_file(self->ctx,
Antoine Pitrou152efa22010-05-16 18:19:27 +00004035 PyBytes_AS_STRING(keyfile ? keyfile_bytes : certfile_bytes),
4036 SSL_FILETYPE_PEM);
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +02004037 PySSL_END_ALLOW_THREADS_S(pw_info.thread_state);
4038 Py_CLEAR(keyfile_bytes);
4039 Py_CLEAR(certfile_bytes);
Antoine Pitrou152efa22010-05-16 18:19:27 +00004040 if (r != 1) {
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +02004041 if (pw_info.error) {
4042 ERR_clear_error();
4043 /* the password callback has already set the error information */
4044 }
4045 else if (errno != 0) {
Giampaolo Rodolàe0f98632010-09-01 19:28:49 +00004046 ERR_clear_error();
Serhiy Storchaka55fe1ae2017-04-16 10:46:38 +03004047 PyErr_SetFromErrno(PyExc_OSError);
Giampaolo Rodolà745ab382010-08-29 19:25:49 +00004048 }
4049 else {
4050 _setSSLError(NULL, 0, __FILE__, __LINE__);
4051 }
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +02004052 goto error;
Antoine Pitrou152efa22010-05-16 18:19:27 +00004053 }
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +02004054 PySSL_BEGIN_ALLOW_THREADS_S(pw_info.thread_state);
Antoine Pitrou152efa22010-05-16 18:19:27 +00004055 r = SSL_CTX_check_private_key(self->ctx);
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +02004056 PySSL_END_ALLOW_THREADS_S(pw_info.thread_state);
Antoine Pitrou152efa22010-05-16 18:19:27 +00004057 if (r != 1) {
4058 _setSSLError(NULL, 0, __FILE__, __LINE__);
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +02004059 goto error;
Antoine Pitrou152efa22010-05-16 18:19:27 +00004060 }
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +02004061 SSL_CTX_set_default_passwd_cb(self->ctx, orig_passwd_cb);
4062 SSL_CTX_set_default_passwd_cb_userdata(self->ctx, orig_passwd_userdata);
Victor Stinner11ebff22013-07-07 17:07:52 +02004063 PyMem_Free(pw_info.password);
Antoine Pitrou152efa22010-05-16 18:19:27 +00004064 Py_RETURN_NONE;
4065
4066error:
Antoine Pitrou4fd1e6a2011-08-25 14:39:44 +02004067 SSL_CTX_set_default_passwd_cb(self->ctx, orig_passwd_cb);
4068 SSL_CTX_set_default_passwd_cb_userdata(self->ctx, orig_passwd_userdata);
Victor Stinner11ebff22013-07-07 17:07:52 +02004069 PyMem_Free(pw_info.password);
Antoine Pitrou152efa22010-05-16 18:19:27 +00004070 Py_XDECREF(keyfile_bytes);
4071 Py_XDECREF(certfile_bytes);
4072 return NULL;
4073}
4074
Christian Heimesefff7062013-11-21 03:35:02 +01004075/* internal helper function, returns -1 on error
4076 */
4077static int
Serhiy Storchaka8f87eef2020-04-12 14:58:27 +03004078_add_ca_certs(PySSLContext *self, const void *data, Py_ssize_t len,
Christian Heimesefff7062013-11-21 03:35:02 +01004079 int filetype)
4080{
4081 BIO *biobuf = NULL;
4082 X509_STORE *store;
4083 int retval = 0, err, loaded = 0;
4084
4085 assert(filetype == SSL_FILETYPE_ASN1 || filetype == SSL_FILETYPE_PEM);
4086
4087 if (len <= 0) {
4088 PyErr_SetString(PyExc_ValueError,
4089 "Empty certificate data");
4090 return -1;
4091 } else if (len > INT_MAX) {
4092 PyErr_SetString(PyExc_OverflowError,
4093 "Certificate data is too long.");
4094 return -1;
4095 }
4096
Christian Heimes1dbf61f2013-11-22 00:34:18 +01004097 biobuf = BIO_new_mem_buf(data, (int)len);
Christian Heimesefff7062013-11-21 03:35:02 +01004098 if (biobuf == NULL) {
4099 _setSSLError("Can't allocate buffer", 0, __FILE__, __LINE__);
4100 return -1;
4101 }
4102
4103 store = SSL_CTX_get_cert_store(self->ctx);
4104 assert(store != NULL);
4105
4106 while (1) {
4107 X509 *cert = NULL;
4108 int r;
4109
4110 if (filetype == SSL_FILETYPE_ASN1) {
4111 cert = d2i_X509_bio(biobuf, NULL);
4112 } else {
4113 cert = PEM_read_bio_X509(biobuf, NULL,
Christian Heimes598894f2016-09-05 23:19:05 +02004114 SSL_CTX_get_default_passwd_cb(self->ctx),
4115 SSL_CTX_get_default_passwd_cb_userdata(self->ctx)
4116 );
Christian Heimesefff7062013-11-21 03:35:02 +01004117 }
4118 if (cert == NULL) {
4119 break;
4120 }
4121 r = X509_STORE_add_cert(store, cert);
4122 X509_free(cert);
4123 if (!r) {
4124 err = ERR_peek_last_error();
4125 if ((ERR_GET_LIB(err) == ERR_LIB_X509) &&
4126 (ERR_GET_REASON(err) == X509_R_CERT_ALREADY_IN_HASH_TABLE)) {
4127 /* cert already in hash table, not an error */
4128 ERR_clear_error();
4129 } else {
4130 break;
4131 }
4132 }
4133 loaded++;
4134 }
4135
4136 err = ERR_peek_last_error();
4137 if ((filetype == SSL_FILETYPE_ASN1) &&
4138 (loaded > 0) &&
4139 (ERR_GET_LIB(err) == ERR_LIB_ASN1) &&
4140 (ERR_GET_REASON(err) == ASN1_R_HEADER_TOO_LONG)) {
4141 /* EOF ASN1 file, not an error */
4142 ERR_clear_error();
4143 retval = 0;
4144 } else if ((filetype == SSL_FILETYPE_PEM) &&
4145 (loaded > 0) &&
4146 (ERR_GET_LIB(err) == ERR_LIB_PEM) &&
4147 (ERR_GET_REASON(err) == PEM_R_NO_START_LINE)) {
4148 /* EOF PEM file, not an error */
4149 ERR_clear_error();
4150 retval = 0;
4151 } else {
4152 _setSSLError(NULL, 0, __FILE__, __LINE__);
4153 retval = -1;
4154 }
4155
4156 BIO_free(biobuf);
4157 return retval;
4158}
4159
4160
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004161/*[clinic input]
4162_ssl._SSLContext.load_verify_locations
Serhiy Storchaka279f4462019-09-14 12:24:05 +03004163 cafile: object = None
4164 capath: object = None
4165 cadata: object = None
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004166
4167[clinic start generated code]*/
4168
Antoine Pitrou152efa22010-05-16 18:19:27 +00004169static PyObject *
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004170_ssl__SSLContext_load_verify_locations_impl(PySSLContext *self,
4171 PyObject *cafile,
4172 PyObject *capath,
4173 PyObject *cadata)
Serhiy Storchaka279f4462019-09-14 12:24:05 +03004174/*[clinic end generated code: output=454c7e41230ca551 input=42ecfe258233e194]*/
Antoine Pitrou152efa22010-05-16 18:19:27 +00004175{
Antoine Pitrou152efa22010-05-16 18:19:27 +00004176 PyObject *cafile_bytes = NULL, *capath_bytes = NULL;
4177 const char *cafile_buf = NULL, *capath_buf = NULL;
Christian Heimesefff7062013-11-21 03:35:02 +01004178 int r = 0, ok = 1;
Antoine Pitrou152efa22010-05-16 18:19:27 +00004179
Giampaolo Rodolà745ab382010-08-29 19:25:49 +00004180 errno = 0;
Antoine Pitrou152efa22010-05-16 18:19:27 +00004181 if (cafile == Py_None)
4182 cafile = NULL;
4183 if (capath == Py_None)
4184 capath = NULL;
Christian Heimesefff7062013-11-21 03:35:02 +01004185 if (cadata == Py_None)
4186 cadata = NULL;
4187
4188 if (cafile == NULL && capath == NULL && cadata == NULL) {
Antoine Pitrou152efa22010-05-16 18:19:27 +00004189 PyErr_SetString(PyExc_TypeError,
Christian Heimesefff7062013-11-21 03:35:02 +01004190 "cafile, capath and cadata cannot be all omitted");
4191 goto error;
Antoine Pitrou152efa22010-05-16 18:19:27 +00004192 }
4193 if (cafile && !PyUnicode_FSConverter(cafile, &cafile_bytes)) {
Serhiy Storchaka65fb2c02019-05-31 10:39:15 +03004194 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
4195 PyErr_SetString(PyExc_TypeError,
4196 "cafile should be a valid filesystem path");
4197 }
Christian Heimesefff7062013-11-21 03:35:02 +01004198 goto error;
Antoine Pitrou152efa22010-05-16 18:19:27 +00004199 }
4200 if (capath && !PyUnicode_FSConverter(capath, &capath_bytes)) {
Serhiy Storchaka65fb2c02019-05-31 10:39:15 +03004201 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
4202 PyErr_SetString(PyExc_TypeError,
4203 "capath should be a valid filesystem path");
4204 }
Christian Heimesefff7062013-11-21 03:35:02 +01004205 goto error;
Antoine Pitrou152efa22010-05-16 18:19:27 +00004206 }
Christian Heimesefff7062013-11-21 03:35:02 +01004207
4208 /* validata cadata type and load cadata */
4209 if (cadata) {
Serhiy Storchaka65fb2c02019-05-31 10:39:15 +03004210 if (PyUnicode_Check(cadata)) {
4211 PyObject *cadata_ascii = PyUnicode_AsASCIIString(cadata);
4212 if (cadata_ascii == NULL) {
4213 if (PyErr_ExceptionMatches(PyExc_UnicodeEncodeError)) {
4214 goto invalid_cadata;
4215 }
4216 goto error;
4217 }
4218 r = _add_ca_certs(self,
4219 PyBytes_AS_STRING(cadata_ascii),
4220 PyBytes_GET_SIZE(cadata_ascii),
4221 SSL_FILETYPE_PEM);
4222 Py_DECREF(cadata_ascii);
4223 if (r == -1) {
4224 goto error;
4225 }
4226 }
4227 else if (PyObject_CheckBuffer(cadata)) {
4228 Py_buffer buf;
4229 if (PyObject_GetBuffer(cadata, &buf, PyBUF_SIMPLE)) {
4230 goto error;
4231 }
Christian Heimesefff7062013-11-21 03:35:02 +01004232 if (!PyBuffer_IsContiguous(&buf, 'C') || buf.ndim > 1) {
4233 PyBuffer_Release(&buf);
4234 PyErr_SetString(PyExc_TypeError,
4235 "cadata should be a contiguous buffer with "
4236 "a single dimension");
4237 goto error;
4238 }
4239 r = _add_ca_certs(self, buf.buf, buf.len, SSL_FILETYPE_ASN1);
4240 PyBuffer_Release(&buf);
4241 if (r == -1) {
4242 goto error;
4243 }
Serhiy Storchaka65fb2c02019-05-31 10:39:15 +03004244 }
4245 else {
4246 invalid_cadata:
4247 PyErr_SetString(PyExc_TypeError,
4248 "cadata should be an ASCII string or a "
4249 "bytes-like object");
4250 goto error;
Christian Heimesefff7062013-11-21 03:35:02 +01004251 }
4252 }
4253
4254 /* load cafile or capath */
4255 if (cafile || capath) {
4256 if (cafile)
4257 cafile_buf = PyBytes_AS_STRING(cafile_bytes);
4258 if (capath)
4259 capath_buf = PyBytes_AS_STRING(capath_bytes);
4260 PySSL_BEGIN_ALLOW_THREADS
4261 r = SSL_CTX_load_verify_locations(self->ctx, cafile_buf, capath_buf);
4262 PySSL_END_ALLOW_THREADS
4263 if (r != 1) {
Christian Heimesefff7062013-11-21 03:35:02 +01004264 if (errno != 0) {
4265 ERR_clear_error();
Serhiy Storchaka55fe1ae2017-04-16 10:46:38 +03004266 PyErr_SetFromErrno(PyExc_OSError);
Christian Heimesefff7062013-11-21 03:35:02 +01004267 }
4268 else {
4269 _setSSLError(NULL, 0, __FILE__, __LINE__);
4270 }
4271 goto error;
4272 }
4273 }
4274 goto end;
4275
4276 error:
4277 ok = 0;
4278 end:
Antoine Pitrou152efa22010-05-16 18:19:27 +00004279 Py_XDECREF(cafile_bytes);
4280 Py_XDECREF(capath_bytes);
Christian Heimesefff7062013-11-21 03:35:02 +01004281 if (ok) {
4282 Py_RETURN_NONE;
4283 } else {
Antoine Pitrou152efa22010-05-16 18:19:27 +00004284 return NULL;
4285 }
Antoine Pitrou152efa22010-05-16 18:19:27 +00004286}
4287
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004288/*[clinic input]
4289_ssl._SSLContext.load_dh_params
4290 path as filepath: object
4291 /
4292
4293[clinic start generated code]*/
4294
Antoine Pitrou152efa22010-05-16 18:19:27 +00004295static PyObject *
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004296_ssl__SSLContext_load_dh_params(PySSLContext *self, PyObject *filepath)
4297/*[clinic end generated code: output=1c8e57a38e055af0 input=c8871f3c796ae1d6]*/
Antoine Pitrou0e576f12011-12-22 10:03:38 +01004298{
4299 FILE *f;
4300 DH *dh;
4301
Victor Stinnerdaf45552013-08-28 00:53:59 +02004302 f = _Py_fopen_obj(filepath, "rb");
Victor Stinnere42ccd22015-03-18 01:39:23 +01004303 if (f == NULL)
Antoine Pitrou0e576f12011-12-22 10:03:38 +01004304 return NULL;
Victor Stinnere42ccd22015-03-18 01:39:23 +01004305
Antoine Pitrou0e576f12011-12-22 10:03:38 +01004306 errno = 0;
4307 PySSL_BEGIN_ALLOW_THREADS
4308 dh = PEM_read_DHparams(f, NULL, NULL, NULL);
Antoine Pitrou457a2292013-01-12 21:43:45 +01004309 fclose(f);
Antoine Pitrou0e576f12011-12-22 10:03:38 +01004310 PySSL_END_ALLOW_THREADS
4311 if (dh == NULL) {
4312 if (errno != 0) {
4313 ERR_clear_error();
4314 PyErr_SetFromErrnoWithFilenameObject(PyExc_OSError, filepath);
4315 }
4316 else {
4317 _setSSLError(NULL, 0, __FILE__, __LINE__);
4318 }
4319 return NULL;
4320 }
Zackery Spytzaebc0492020-07-07 22:21:58 -06004321 if (!SSL_CTX_set_tmp_dh(self->ctx, dh)) {
4322 DH_free(dh);
4323 return _setSSLError(NULL, 0, __FILE__, __LINE__);
4324 }
Antoine Pitrou0e576f12011-12-22 10:03:38 +01004325 DH_free(dh);
4326 Py_RETURN_NONE;
4327}
4328
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004329/*[clinic input]
4330_ssl._SSLContext._wrap_socket
4331 sock: object(subclass_of="PySocketModule.Sock_Type")
4332 server_side: int
4333 server_hostname as hostname_obj: object = None
Christian Heimes141c5e82018-02-24 21:10:57 +01004334 *
4335 owner: object = None
4336 session: object = None
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004337
4338[clinic start generated code]*/
4339
Antoine Pitrou0e576f12011-12-22 10:03:38 +01004340static PyObject *
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004341_ssl__SSLContext__wrap_socket_impl(PySSLContext *self, PyObject *sock,
Christian Heimes141c5e82018-02-24 21:10:57 +01004342 int server_side, PyObject *hostname_obj,
4343 PyObject *owner, PyObject *session)
4344/*[clinic end generated code: output=f103f238633940b4 input=957d5006183d1894]*/
Antoine Pitrou152efa22010-05-16 18:19:27 +00004345{
Antoine Pitroud5323212010-10-22 18:19:07 +00004346 char *hostname = NULL;
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004347 PyObject *res;
Antoine Pitrou152efa22010-05-16 18:19:27 +00004348
Antoine Pitroud5323212010-10-22 18:19:07 +00004349 /* server_hostname is either None (or absent), or to be encoded
Christian Heimesd02ac252018-03-25 12:36:13 +02004350 as IDN A-label (ASCII str) without NULL bytes. */
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004351 if (hostname_obj != Py_None) {
Christian Heimes11a14932018-02-24 02:35:08 +01004352 if (!PyArg_Parse(hostname_obj, "es", "ascii", &hostname))
Antoine Pitroud5323212010-10-22 18:19:07 +00004353 return NULL;
Antoine Pitroud5323212010-10-22 18:19:07 +00004354 }
Antoine Pitrou152efa22010-05-16 18:19:27 +00004355
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004356 res = (PyObject *) newPySSLSocket(self, (PySocketSockObject *)sock,
4357 server_side, hostname,
Christian Heimes141c5e82018-02-24 21:10:57 +01004358 owner, session,
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004359 NULL, NULL);
Antoine Pitroud5323212010-10-22 18:19:07 +00004360 if (hostname != NULL)
4361 PyMem_Free(hostname);
4362 return res;
Antoine Pitrou152efa22010-05-16 18:19:27 +00004363}
4364
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004365/*[clinic input]
4366_ssl._SSLContext._wrap_bio
Christian Heimes5c36da72020-11-20 09:40:12 +01004367 incoming: object(subclass_of="PySSLMemoryBIO_Type", type="PySSLMemoryBIO *")
4368 outgoing: object(subclass_of="PySSLMemoryBIO_Type", type="PySSLMemoryBIO *")
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004369 server_side: int
4370 server_hostname as hostname_obj: object = None
Christian Heimes141c5e82018-02-24 21:10:57 +01004371 *
4372 owner: object = None
4373 session: object = None
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004374
4375[clinic start generated code]*/
4376
Antoine Pitroub0182c82010-10-12 20:09:02 +00004377static PyObject *
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004378_ssl__SSLContext__wrap_bio_impl(PySSLContext *self, PySSLMemoryBIO *incoming,
4379 PySSLMemoryBIO *outgoing, int server_side,
Christian Heimes141c5e82018-02-24 21:10:57 +01004380 PyObject *hostname_obj, PyObject *owner,
4381 PyObject *session)
Christian Heimes5c36da72020-11-20 09:40:12 +01004382/*[clinic end generated code: output=5c5d6d9b41f99332 input=63867b8f3e1a1aa3]*/
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004383{
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004384 char *hostname = NULL;
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004385 PyObject *res;
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004386
4387 /* server_hostname is either None (or absent), or to be encoded
Christian Heimesd02ac252018-03-25 12:36:13 +02004388 as IDN A-label (ASCII str) without NULL bytes. */
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004389 if (hostname_obj != Py_None) {
Christian Heimes11a14932018-02-24 02:35:08 +01004390 if (!PyArg_Parse(hostname_obj, "es", "ascii", &hostname))
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004391 return NULL;
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004392 }
4393
4394 res = (PyObject *) newPySSLSocket(self, NULL, server_side, hostname,
Christian Heimes141c5e82018-02-24 21:10:57 +01004395 owner, session,
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004396 incoming, outgoing);
4397
4398 PyMem_Free(hostname);
4399 return res;
4400}
4401
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004402/*[clinic input]
4403_ssl._SSLContext.session_stats
4404[clinic start generated code]*/
4405
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004406static PyObject *
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004407_ssl__SSLContext_session_stats_impl(PySSLContext *self)
4408/*[clinic end generated code: output=0d96411c42893bfb input=7e0a81fb11102c8b]*/
Antoine Pitroub0182c82010-10-12 20:09:02 +00004409{
4410 int r;
4411 PyObject *value, *stats = PyDict_New();
4412 if (!stats)
4413 return NULL;
4414
4415#define ADD_STATS(SSL_NAME, KEY_NAME) \
4416 value = PyLong_FromLong(SSL_CTX_sess_ ## SSL_NAME (self->ctx)); \
4417 if (value == NULL) \
4418 goto error; \
4419 r = PyDict_SetItemString(stats, KEY_NAME, value); \
4420 Py_DECREF(value); \
4421 if (r < 0) \
4422 goto error;
4423
4424 ADD_STATS(number, "number");
4425 ADD_STATS(connect, "connect");
4426 ADD_STATS(connect_good, "connect_good");
4427 ADD_STATS(connect_renegotiate, "connect_renegotiate");
4428 ADD_STATS(accept, "accept");
4429 ADD_STATS(accept_good, "accept_good");
4430 ADD_STATS(accept_renegotiate, "accept_renegotiate");
4431 ADD_STATS(accept, "accept");
4432 ADD_STATS(hits, "hits");
4433 ADD_STATS(misses, "misses");
4434 ADD_STATS(timeouts, "timeouts");
4435 ADD_STATS(cache_full, "cache_full");
4436
4437#undef ADD_STATS
4438
4439 return stats;
4440
4441error:
4442 Py_DECREF(stats);
4443 return NULL;
4444}
4445
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004446/*[clinic input]
4447_ssl._SSLContext.set_default_verify_paths
4448[clinic start generated code]*/
4449
Antoine Pitrou664c2d12010-11-17 20:29:42 +00004450static PyObject *
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004451_ssl__SSLContext_set_default_verify_paths_impl(PySSLContext *self)
4452/*[clinic end generated code: output=0bee74e6e09deaaa input=35f3408021463d74]*/
Antoine Pitrou664c2d12010-11-17 20:29:42 +00004453{
4454 if (!SSL_CTX_set_default_verify_paths(self->ctx)) {
4455 _setSSLError(NULL, 0, __FILE__, __LINE__);
4456 return NULL;
4457 }
4458 Py_RETURN_NONE;
4459}
4460
Antoine Pitrou501da612011-12-21 09:27:41 +01004461#ifndef OPENSSL_NO_ECDH
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004462/*[clinic input]
4463_ssl._SSLContext.set_ecdh_curve
4464 name: object
4465 /
4466
4467[clinic start generated code]*/
4468
Antoine Pitrou923df6f2011-12-19 17:16:51 +01004469static PyObject *
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004470_ssl__SSLContext_set_ecdh_curve(PySSLContext *self, PyObject *name)
4471/*[clinic end generated code: output=23022c196e40d7d2 input=c2bafb6f6e34726b]*/
Antoine Pitrou923df6f2011-12-19 17:16:51 +01004472{
4473 PyObject *name_bytes;
4474 int nid;
4475 EC_KEY *key;
4476
4477 if (!PyUnicode_FSConverter(name, &name_bytes))
4478 return NULL;
4479 assert(PyBytes_Check(name_bytes));
4480 nid = OBJ_sn2nid(PyBytes_AS_STRING(name_bytes));
4481 Py_DECREF(name_bytes);
4482 if (nid == 0) {
4483 PyErr_Format(PyExc_ValueError,
4484 "unknown elliptic curve name %R", name);
4485 return NULL;
4486 }
4487 key = EC_KEY_new_by_curve_name(nid);
4488 if (key == NULL) {
4489 _setSSLError(NULL, 0, __FILE__, __LINE__);
4490 return NULL;
4491 }
4492 SSL_CTX_set_tmp_ecdh(self->ctx, key);
4493 EC_KEY_free(key);
4494 Py_RETURN_NONE;
4495}
Antoine Pitrou501da612011-12-21 09:27:41 +01004496#endif
Antoine Pitrou923df6f2011-12-19 17:16:51 +01004497
Antoine Pitrou912fbff2013-03-30 16:29:32 +01004498#if HAVE_SNI && !defined(OPENSSL_NO_TLSEXT)
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004499static int
4500_servername_callback(SSL *s, int *al, void *args)
4501{
4502 int ret;
4503 PySSLContext *ssl_ctx = (PySSLContext *) args;
4504 PySSLSocket *ssl;
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004505 PyObject *result;
4506 /* The high-level ssl.SSLSocket object */
4507 PyObject *ssl_socket;
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004508 const char *servername = SSL_get_servername(s, TLSEXT_NAMETYPE_host_name);
Stefan Krah20d60802013-01-17 17:07:17 +01004509 PyGILState_STATE gstate = PyGILState_Ensure();
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004510
Christian Heimes11a14932018-02-24 02:35:08 +01004511 if (ssl_ctx->set_sni_cb == NULL) {
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004512 /* remove race condition in this the call back while if removing the
4513 * callback is in progress */
4514 PyGILState_Release(gstate);
Antoine Pitrou5dd12a52013-01-06 15:25:36 +01004515 return SSL_TLSEXT_ERR_OK;
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004516 }
4517
4518 ssl = SSL_get_app_data(s);
4519 assert(PySSLSocket_Check(ssl));
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004520
Serhiy Storchakaf51d7152015-11-02 14:40:41 +02004521 /* The servername callback expects an argument that represents the current
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004522 * SSL connection and that has a .context attribute that can be changed to
4523 * identify the requested hostname. Since the official API is the Python
4524 * level API we want to pass the callback a Python level object rather than
4525 * a _ssl.SSLSocket instance. If there's an "owner" (typically an
4526 * SSLObject) that will be passed. Otherwise if there's a socket then that
4527 * will be passed. If both do not exist only then the C-level object is
4528 * passed. */
4529 if (ssl->owner)
4530 ssl_socket = PyWeakref_GetObject(ssl->owner);
4531 else if (ssl->Socket)
4532 ssl_socket = PyWeakref_GetObject(ssl->Socket);
4533 else
4534 ssl_socket = (PyObject *) ssl;
4535
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004536 Py_INCREF(ssl_socket);
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004537 if (ssl_socket == Py_None)
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004538 goto error;
Victor Stinner7e001512013-06-25 00:44:31 +02004539
Antoine Pitrou50b24d02013-04-11 20:48:42 +02004540 if (servername == NULL) {
Christian Heimes11a14932018-02-24 02:35:08 +01004541 result = PyObject_CallFunctionObjArgs(ssl_ctx->set_sni_cb, ssl_socket,
Antoine Pitrou50b24d02013-04-11 20:48:42 +02004542 Py_None, ssl_ctx, NULL);
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004543 }
Antoine Pitrou50b24d02013-04-11 20:48:42 +02004544 else {
Christian Heimes11a14932018-02-24 02:35:08 +01004545 PyObject *servername_bytes;
4546 PyObject *servername_str;
4547
4548 servername_bytes = PyBytes_FromString(servername);
4549 if (servername_bytes == NULL) {
Antoine Pitrou50b24d02013-04-11 20:48:42 +02004550 PyErr_WriteUnraisable((PyObject *) ssl_ctx);
4551 goto error;
4552 }
Christian Heimes11a14932018-02-24 02:35:08 +01004553 /* server_hostname was encoded to an A-label by our caller; put it
4554 * back into a str object, but still as an A-label (bpo-28414)
4555 */
4556 servername_str = PyUnicode_FromEncodedObject(servername_bytes, "ascii", NULL);
Christian Heimes11a14932018-02-24 02:35:08 +01004557 if (servername_str == NULL) {
4558 PyErr_WriteUnraisable(servername_bytes);
Zackery Spytzee96f322020-07-09 04:00:21 -06004559 Py_DECREF(servername_bytes);
Antoine Pitrou50b24d02013-04-11 20:48:42 +02004560 goto error;
4561 }
Zackery Spytzee96f322020-07-09 04:00:21 -06004562 Py_DECREF(servername_bytes);
Christian Heimes11a14932018-02-24 02:35:08 +01004563 result = PyObject_CallFunctionObjArgs(
4564 ssl_ctx->set_sni_cb, ssl_socket, servername_str,
4565 ssl_ctx, NULL);
4566 Py_DECREF(servername_str);
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004567 }
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004568 Py_DECREF(ssl_socket);
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004569
4570 if (result == NULL) {
Christian Heimes11a14932018-02-24 02:35:08 +01004571 PyErr_WriteUnraisable(ssl_ctx->set_sni_cb);
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004572 *al = SSL_AD_HANDSHAKE_FAILURE;
4573 ret = SSL_TLSEXT_ERR_ALERT_FATAL;
4574 }
4575 else {
Christian Heimes11a14932018-02-24 02:35:08 +01004576 /* Result may be None, a SSLContext or an integer
4577 * None and SSLContext are OK, integer or other values are an error.
4578 */
4579 if (result == Py_None) {
4580 ret = SSL_TLSEXT_ERR_OK;
4581 } else {
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004582 *al = (int) PyLong_AsLong(result);
4583 if (PyErr_Occurred()) {
4584 PyErr_WriteUnraisable(result);
4585 *al = SSL_AD_INTERNAL_ERROR;
4586 }
4587 ret = SSL_TLSEXT_ERR_ALERT_FATAL;
4588 }
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004589 Py_DECREF(result);
4590 }
4591
4592 PyGILState_Release(gstate);
4593 return ret;
4594
4595error:
4596 Py_DECREF(ssl_socket);
4597 *al = SSL_AD_INTERNAL_ERROR;
4598 ret = SSL_TLSEXT_ERR_ALERT_FATAL;
4599 PyGILState_Release(gstate);
4600 return ret;
4601}
Antoine Pitroua5963382013-03-30 16:39:00 +01004602#endif
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004603
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004604static PyObject *
Christian Heimes11a14932018-02-24 02:35:08 +01004605get_sni_callback(PySSLContext *self, void *c)
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004606{
Christian Heimes11a14932018-02-24 02:35:08 +01004607 PyObject *cb = self->set_sni_cb;
4608 if (cb == NULL) {
4609 Py_RETURN_NONE;
4610 }
4611 Py_INCREF(cb);
4612 return cb;
4613}
4614
4615static int
4616set_sni_callback(PySSLContext *self, PyObject *arg, void *c)
4617{
4618 if (self->protocol == PY_SSL_VERSION_TLS_CLIENT) {
4619 PyErr_SetString(PyExc_ValueError,
4620 "sni_callback cannot be set on TLS_CLIENT context");
4621 return -1;
4622 }
Antoine Pitrou912fbff2013-03-30 16:29:32 +01004623#if HAVE_SNI && !defined(OPENSSL_NO_TLSEXT)
Christian Heimes11a14932018-02-24 02:35:08 +01004624 Py_CLEAR(self->set_sni_cb);
4625 if (arg == Py_None) {
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004626 SSL_CTX_set_tlsext_servername_callback(self->ctx, NULL);
4627 }
4628 else {
Christian Heimes11a14932018-02-24 02:35:08 +01004629 if (!PyCallable_Check(arg)) {
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004630 SSL_CTX_set_tlsext_servername_callback(self->ctx, NULL);
4631 PyErr_SetString(PyExc_TypeError,
4632 "not a callable object");
Christian Heimes11a14932018-02-24 02:35:08 +01004633 return -1;
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004634 }
Christian Heimes11a14932018-02-24 02:35:08 +01004635 Py_INCREF(arg);
4636 self->set_sni_cb = arg;
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004637 SSL_CTX_set_tlsext_servername_callback(self->ctx, _servername_callback);
4638 SSL_CTX_set_tlsext_servername_arg(self->ctx, self);
4639 }
Christian Heimes11a14932018-02-24 02:35:08 +01004640 return 0;
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004641#else
4642 PyErr_SetString(PyExc_NotImplementedError,
4643 "The TLS extension servername callback, "
4644 "SSL_CTX_set_tlsext_servername_callback, "
4645 "is not in the current OpenSSL library.");
Christian Heimes11a14932018-02-24 02:35:08 +01004646 return -1;
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01004647#endif
4648}
4649
Christian Heimes11a14932018-02-24 02:35:08 +01004650PyDoc_STRVAR(PySSLContext_sni_callback_doc,
4651"Set a callback that will be called when a server name is provided by the SSL/TLS client in the SNI extension.\n\
4652\n\
4653If the argument is None then the callback is disabled. The method is called\n\
4654with the SSLSocket, the server name as a string, and the SSLContext object.\n\
4655See RFC 6066 for details of the SNI extension.");
4656
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004657/*[clinic input]
4658_ssl._SSLContext.cert_store_stats
4659
4660Returns quantities of loaded X.509 certificates.
4661
4662X.509 certificates with a CA extension and certificate revocation lists
4663inside the context's cert store.
4664
4665NOTE: Certificates in a capath directory aren't loaded unless they have
4666been used at least once.
4667[clinic start generated code]*/
Christian Heimes9a5395a2013-06-17 15:44:12 +02004668
4669static PyObject *
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004670_ssl__SSLContext_cert_store_stats_impl(PySSLContext *self)
4671/*[clinic end generated code: output=5f356f4d9cca874d input=eb40dd0f6d0e40cf]*/
Christian Heimes9a5395a2013-06-17 15:44:12 +02004672{
4673 X509_STORE *store;
Christian Heimes598894f2016-09-05 23:19:05 +02004674 STACK_OF(X509_OBJECT) *objs;
Christian Heimes9a5395a2013-06-17 15:44:12 +02004675 X509_OBJECT *obj;
Christian Heimes598894f2016-09-05 23:19:05 +02004676 int x509 = 0, crl = 0, ca = 0, i;
Christian Heimes9a5395a2013-06-17 15:44:12 +02004677
4678 store = SSL_CTX_get_cert_store(self->ctx);
Christian Heimes598894f2016-09-05 23:19:05 +02004679 objs = X509_STORE_get0_objects(store);
4680 for (i = 0; i < sk_X509_OBJECT_num(objs); i++) {
4681 obj = sk_X509_OBJECT_value(objs, i);
4682 switch (X509_OBJECT_get_type(obj)) {
Christian Heimes9a5395a2013-06-17 15:44:12 +02004683 case X509_LU_X509:
4684 x509++;
Christian Heimes598894f2016-09-05 23:19:05 +02004685 if (X509_check_ca(X509_OBJECT_get0_X509(obj))) {
Christian Heimes9a5395a2013-06-17 15:44:12 +02004686 ca++;
4687 }
4688 break;
4689 case X509_LU_CRL:
4690 crl++;
4691 break;
Christian Heimes9a5395a2013-06-17 15:44:12 +02004692 default:
4693 /* Ignore X509_LU_FAIL, X509_LU_RETRY, X509_LU_PKEY.
4694 * As far as I can tell they are internal states and never
4695 * stored in a cert store */
4696 break;
4697 }
4698 }
4699 return Py_BuildValue("{sisisi}", "x509", x509, "crl", crl,
4700 "x509_ca", ca);
4701}
4702
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004703/*[clinic input]
4704_ssl._SSLContext.get_ca_certs
4705 binary_form: bool = False
4706
4707Returns a list of dicts with information of loaded CA certs.
4708
4709If the optional argument is True, returns a DER-encoded copy of the CA
4710certificate.
4711
4712NOTE: Certificates in a capath directory aren't loaded unless they have
4713been used at least once.
4714[clinic start generated code]*/
Christian Heimes9a5395a2013-06-17 15:44:12 +02004715
4716static PyObject *
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004717_ssl__SSLContext_get_ca_certs_impl(PySSLContext *self, int binary_form)
4718/*[clinic end generated code: output=0d58f148f37e2938 input=6887b5a09b7f9076]*/
Christian Heimes9a5395a2013-06-17 15:44:12 +02004719{
4720 X509_STORE *store;
Christian Heimes598894f2016-09-05 23:19:05 +02004721 STACK_OF(X509_OBJECT) *objs;
Christian Heimes9a5395a2013-06-17 15:44:12 +02004722 PyObject *ci = NULL, *rlist = NULL;
4723 int i;
Christian Heimes9a5395a2013-06-17 15:44:12 +02004724
4725 if ((rlist = PyList_New(0)) == NULL) {
4726 return NULL;
4727 }
4728
4729 store = SSL_CTX_get_cert_store(self->ctx);
Christian Heimes598894f2016-09-05 23:19:05 +02004730 objs = X509_STORE_get0_objects(store);
4731 for (i = 0; i < sk_X509_OBJECT_num(objs); i++) {
Christian Heimes9a5395a2013-06-17 15:44:12 +02004732 X509_OBJECT *obj;
4733 X509 *cert;
4734
Christian Heimes598894f2016-09-05 23:19:05 +02004735 obj = sk_X509_OBJECT_value(objs, i);
4736 if (X509_OBJECT_get_type(obj) != X509_LU_X509) {
Christian Heimes9a5395a2013-06-17 15:44:12 +02004737 /* not a x509 cert */
4738 continue;
4739 }
4740 /* CA for any purpose */
Christian Heimes598894f2016-09-05 23:19:05 +02004741 cert = X509_OBJECT_get0_X509(obj);
Christian Heimes9a5395a2013-06-17 15:44:12 +02004742 if (!X509_check_ca(cert)) {
4743 continue;
4744 }
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004745 if (binary_form) {
Christian Heimes9a5395a2013-06-17 15:44:12 +02004746 ci = _certificate_to_der(cert);
4747 } else {
4748 ci = _decode_certificate(cert);
4749 }
4750 if (ci == NULL) {
4751 goto error;
4752 }
4753 if (PyList_Append(rlist, ci) == -1) {
4754 goto error;
4755 }
4756 Py_CLEAR(ci);
4757 }
4758 return rlist;
4759
4760 error:
4761 Py_XDECREF(ci);
4762 Py_XDECREF(rlist);
4763 return NULL;
4764}
4765
4766
Antoine Pitrou152efa22010-05-16 18:19:27 +00004767static PyGetSetDef context_getsetlist[] = {
Christian Heimes1aa9a752013-12-02 02:41:19 +01004768 {"check_hostname", (getter) get_check_hostname,
4769 (setter) set_check_hostname, NULL},
Christian Heimes61d478c2018-01-27 15:51:38 +01004770 {"_host_flags", (getter) get_host_flags,
4771 (setter) set_host_flags, NULL},
Christian Heimes698dde12018-02-27 11:54:43 +01004772#if SSL_CTRL_GET_MAX_PROTO_VERSION
4773 {"minimum_version", (getter) get_minimum_version,
4774 (setter) set_minimum_version, NULL},
4775 {"maximum_version", (getter) get_maximum_version,
4776 (setter) set_maximum_version, NULL},
4777#endif
Christian Heimesc7f70692019-05-31 11:44:05 +02004778#ifdef HAVE_OPENSSL_KEYLOG
4779 {"keylog_filename", (getter) _PySSLContext_get_keylog_filename,
4780 (setter) _PySSLContext_set_keylog_filename, NULL},
4781#endif
4782 {"_msg_callback", (getter) _PySSLContext_get_msg_callback,
4783 (setter) _PySSLContext_set_msg_callback, NULL},
Christian Heimes11a14932018-02-24 02:35:08 +01004784 {"sni_callback", (getter) get_sni_callback,
Christian Heimes698dde12018-02-27 11:54:43 +01004785 (setter) set_sni_callback, PySSLContext_sni_callback_doc},
Christian Heimes78c7d522019-06-03 21:00:10 +02004786#if (OPENSSL_VERSION_NUMBER >= 0x10101000L) && !defined(LIBRESSL_VERSION_NUMBER)
4787 {"num_tickets", (getter) get_num_tickets,
4788 (setter) set_num_tickets, PySSLContext_num_tickets_doc},
4789#endif
Antoine Pitroub5218772010-05-21 09:56:06 +00004790 {"options", (getter) get_options,
4791 (setter) set_options, NULL},
Christian Heimes9fb051f2018-09-23 08:32:31 +02004792 {"post_handshake_auth", (getter) get_post_handshake_auth,
4793#ifdef TLS1_3_VERSION
4794 (setter) set_post_handshake_auth,
4795#else
4796 NULL,
4797#endif
4798 NULL},
Christian Heimes11a14932018-02-24 02:35:08 +01004799 {"protocol", (getter) get_protocol,
4800 NULL, NULL},
Christian Heimes22587792013-11-21 23:56:13 +01004801 {"verify_flags", (getter) get_verify_flags,
4802 (setter) set_verify_flags, NULL},
Antoine Pitrou152efa22010-05-16 18:19:27 +00004803 {"verify_mode", (getter) get_verify_mode,
4804 (setter) set_verify_mode, NULL},
matthewhughes9348e836bb2020-07-17 09:59:15 +01004805#if (OPENSSL_VERSION_NUMBER >= 0x10100000L) && !defined(LIBRESSL_VERSION_NUMBER)
4806 {"security_level", (getter) get_security_level,
4807 NULL, PySSLContext_security_level_doc},
4808#endif
Antoine Pitrou152efa22010-05-16 18:19:27 +00004809 {NULL}, /* sentinel */
4810};
4811
4812static struct PyMethodDef context_methods[] = {
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004813 _SSL__SSLCONTEXT__WRAP_SOCKET_METHODDEF
4814 _SSL__SSLCONTEXT__WRAP_BIO_METHODDEF
4815 _SSL__SSLCONTEXT_SET_CIPHERS_METHODDEF
4816 _SSL__SSLCONTEXT__SET_ALPN_PROTOCOLS_METHODDEF
4817 _SSL__SSLCONTEXT__SET_NPN_PROTOCOLS_METHODDEF
4818 _SSL__SSLCONTEXT_LOAD_CERT_CHAIN_METHODDEF
4819 _SSL__SSLCONTEXT_LOAD_DH_PARAMS_METHODDEF
4820 _SSL__SSLCONTEXT_LOAD_VERIFY_LOCATIONS_METHODDEF
4821 _SSL__SSLCONTEXT_SESSION_STATS_METHODDEF
4822 _SSL__SSLCONTEXT_SET_DEFAULT_VERIFY_PATHS_METHODDEF
4823 _SSL__SSLCONTEXT_SET_ECDH_CURVE_METHODDEF
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004824 _SSL__SSLCONTEXT_CERT_STORE_STATS_METHODDEF
4825 _SSL__SSLCONTEXT_GET_CA_CERTS_METHODDEF
Christian Heimes25bfcd52016-09-06 00:04:45 +02004826 _SSL__SSLCONTEXT_GET_CIPHERS_METHODDEF
Antoine Pitrou152efa22010-05-16 18:19:27 +00004827 {NULL, NULL} /* sentinel */
4828};
4829
Christian Heimes5c36da72020-11-20 09:40:12 +01004830static PyType_Slot PySSLContext_slots[] = {
4831 {Py_tp_methods, context_methods},
4832 {Py_tp_getset, context_getsetlist},
4833 {Py_tp_new, _ssl__SSLContext},
4834 {Py_tp_dealloc, context_dealloc},
4835 {Py_tp_traverse, context_traverse},
4836 {Py_tp_clear, context_clear},
4837 {0, 0},
4838};
4839
4840static PyType_Spec PySSLContext_spec = {
4841 "_ssl._SSLContext",
4842 sizeof(PySSLContext),
4843 0,
4844 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
4845 PySSLContext_slots,
Antoine Pitrou152efa22010-05-16 18:19:27 +00004846};
4847
4848
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004849/*
4850 * MemoryBIO objects
4851 */
4852
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004853/*[clinic input]
4854@classmethod
4855_ssl.MemoryBIO.__new__
4856
4857[clinic start generated code]*/
4858
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004859static PyObject *
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004860_ssl_MemoryBIO_impl(PyTypeObject *type)
4861/*[clinic end generated code: output=8820a58db78330ac input=26d22e4909ecb1b5]*/
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004862{
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004863 BIO *bio;
4864 PySSLMemoryBIO *self;
4865
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004866 bio = BIO_new(BIO_s_mem());
4867 if (bio == NULL) {
4868 PyErr_SetString(PySSLErrorObject,
4869 "failed to allocate BIO");
4870 return NULL;
4871 }
4872 /* Since our BIO is non-blocking an empty read() does not indicate EOF,
4873 * just that no data is currently available. The SSL routines should retry
4874 * the read, which we can achieve by calling BIO_set_retry_read(). */
4875 BIO_set_retry_read(bio);
4876 BIO_set_mem_eof_return(bio, -1);
4877
4878 assert(type != NULL && type->tp_alloc != NULL);
4879 self = (PySSLMemoryBIO *) type->tp_alloc(type, 0);
4880 if (self == NULL) {
4881 BIO_free(bio);
4882 return NULL;
4883 }
4884 self->bio = bio;
4885 self->eof_written = 0;
4886
4887 return (PyObject *) self;
4888}
4889
4890static void
4891memory_bio_dealloc(PySSLMemoryBIO *self)
4892{
Christian Heimes5c36da72020-11-20 09:40:12 +01004893 PyTypeObject *tp = Py_TYPE(self);
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004894 BIO_free(self->bio);
4895 Py_TYPE(self)->tp_free(self);
Christian Heimes5c36da72020-11-20 09:40:12 +01004896 Py_DECREF(tp);
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004897}
4898
4899static PyObject *
4900memory_bio_get_pending(PySSLMemoryBIO *self, void *c)
4901{
Segev Finer5cff6372017-07-27 01:19:17 +03004902 return PyLong_FromSize_t(BIO_ctrl_pending(self->bio));
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004903}
4904
4905PyDoc_STRVAR(PySSL_memory_bio_pending_doc,
4906"The number of bytes pending in the memory BIO.");
4907
4908static PyObject *
4909memory_bio_get_eof(PySSLMemoryBIO *self, void *c)
4910{
4911 return PyBool_FromLong((BIO_ctrl_pending(self->bio) == 0)
4912 && self->eof_written);
4913}
4914
4915PyDoc_STRVAR(PySSL_memory_bio_eof_doc,
4916"Whether the memory BIO is at EOF.");
4917
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004918/*[clinic input]
4919_ssl.MemoryBIO.read
4920 size as len: int = -1
4921 /
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004922
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004923Read up to size bytes from the memory BIO.
4924
4925If size is not specified, read the entire buffer.
4926If the return value is an empty bytes instance, this means either
4927EOF or that no data is available. Use the "eof" property to
4928distinguish between the two.
4929[clinic start generated code]*/
4930
4931static PyObject *
4932_ssl_MemoryBIO_read_impl(PySSLMemoryBIO *self, int len)
4933/*[clinic end generated code: output=a657aa1e79cd01b3 input=574d7be06a902366]*/
4934{
4935 int avail, nbytes;
4936 PyObject *result;
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004937
Segev Finer5cff6372017-07-27 01:19:17 +03004938 avail = (int)Py_MIN(BIO_ctrl_pending(self->bio), INT_MAX);
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004939 if ((len < 0) || (len > avail))
4940 len = avail;
4941
4942 result = PyBytes_FromStringAndSize(NULL, len);
4943 if ((result == NULL) || (len == 0))
4944 return result;
4945
4946 nbytes = BIO_read(self->bio, PyBytes_AS_STRING(result), len);
Zackery Spytz365ad2e2018-10-06 11:41:45 -06004947 if (nbytes < 0) {
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004948 Py_DECREF(result);
Zackery Spytz365ad2e2018-10-06 11:41:45 -06004949 _setSSLError(NULL, 0, __FILE__, __LINE__);
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004950 return NULL;
4951 }
4952
Zackery Spytz365ad2e2018-10-06 11:41:45 -06004953 /* There should never be any short reads but check anyway. */
4954 if (nbytes < len) {
4955 _PyBytes_Resize(&result, nbytes);
4956 }
4957
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004958 return result;
4959}
4960
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004961/*[clinic input]
4962_ssl.MemoryBIO.write
4963 b: Py_buffer
4964 /
4965
4966Writes the bytes b into the memory BIO.
4967
4968Returns the number of bytes written.
4969[clinic start generated code]*/
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004970
4971static PyObject *
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004972_ssl_MemoryBIO_write_impl(PySSLMemoryBIO *self, Py_buffer *b)
4973/*[clinic end generated code: output=156ec59110d75935 input=e45757b3e17c4808]*/
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004974{
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004975 int nbytes;
4976
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004977 if (b->len > INT_MAX) {
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004978 PyErr_Format(PyExc_OverflowError,
4979 "string longer than %d bytes", INT_MAX);
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004980 return NULL;
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004981 }
4982
4983 if (self->eof_written) {
4984 PyErr_SetString(PySSLErrorObject,
4985 "cannot write() after write_eof()");
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004986 return NULL;
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004987 }
4988
Segev Finer5cff6372017-07-27 01:19:17 +03004989 nbytes = BIO_write(self->bio, b->buf, (int)b->len);
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004990 if (nbytes < 0) {
4991 _setSSLError(NULL, 0, __FILE__, __LINE__);
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004992 return NULL;
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004993 }
4994
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004995 return PyLong_FromLong(nbytes);
Antoine Pitroub1fdf472014-10-05 20:41:53 +02004996}
4997
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03004998/*[clinic input]
4999_ssl.MemoryBIO.write_eof
5000
5001Write an EOF marker to the memory BIO.
5002
5003When all data has been read, the "eof" property will be True.
5004[clinic start generated code]*/
Antoine Pitroub1fdf472014-10-05 20:41:53 +02005005
5006static PyObject *
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03005007_ssl_MemoryBIO_write_eof_impl(PySSLMemoryBIO *self)
5008/*[clinic end generated code: output=d4106276ccd1ed34 input=56a945f1d29e8bd6]*/
Antoine Pitroub1fdf472014-10-05 20:41:53 +02005009{
5010 self->eof_written = 1;
5011 /* After an EOF is written, a zero return from read() should be a real EOF
5012 * i.e. it should not be retried. Clear the SHOULD_RETRY flag. */
5013 BIO_clear_retry_flags(self->bio);
5014 BIO_set_mem_eof_return(self->bio, 0);
5015
5016 Py_RETURN_NONE;
5017}
5018
Antoine Pitroub1fdf472014-10-05 20:41:53 +02005019static PyGetSetDef memory_bio_getsetlist[] = {
5020 {"pending", (getter) memory_bio_get_pending, NULL,
5021 PySSL_memory_bio_pending_doc},
5022 {"eof", (getter) memory_bio_get_eof, NULL,
5023 PySSL_memory_bio_eof_doc},
5024 {NULL}, /* sentinel */
5025};
5026
5027static struct PyMethodDef memory_bio_methods[] = {
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03005028 _SSL_MEMORYBIO_READ_METHODDEF
5029 _SSL_MEMORYBIO_WRITE_METHODDEF
5030 _SSL_MEMORYBIO_WRITE_EOF_METHODDEF
Antoine Pitroub1fdf472014-10-05 20:41:53 +02005031 {NULL, NULL} /* sentinel */
5032};
5033
Christian Heimes5c36da72020-11-20 09:40:12 +01005034static PyType_Slot PySSLMemoryBIO_slots[] = {
5035 {Py_tp_methods, memory_bio_methods},
5036 {Py_tp_getset, memory_bio_getsetlist},
5037 {Py_tp_new, _ssl_MemoryBIO},
5038 {Py_tp_dealloc, memory_bio_dealloc},
5039 {0, 0},
Antoine Pitroub1fdf472014-10-05 20:41:53 +02005040};
5041
Christian Heimes5c36da72020-11-20 09:40:12 +01005042static PyType_Spec PySSLMemoryBIO_spec = {
5043 "_ssl.MemoryBIO",
5044 sizeof(PySSLMemoryBIO),
5045 0,
5046 Py_TPFLAGS_DEFAULT,
5047 PySSLMemoryBIO_slots,
5048};
Antoine Pitrou152efa22010-05-16 18:19:27 +00005049
Christian Heimes99a65702016-09-10 23:44:53 +02005050/*
5051 * SSL Session object
5052 */
5053
5054static void
5055PySSLSession_dealloc(PySSLSession *self)
5056{
Christian Heimes5c36da72020-11-20 09:40:12 +01005057 PyTypeObject *tp = Py_TYPE(self);
INADA Naokia6296d32017-08-24 14:55:17 +09005058 /* bpo-31095: UnTrack is needed before calling any callbacks */
Christian Heimesa5d07652016-09-24 10:48:05 +02005059 PyObject_GC_UnTrack(self);
Christian Heimes99a65702016-09-10 23:44:53 +02005060 Py_XDECREF(self->ctx);
5061 if (self->session != NULL) {
5062 SSL_SESSION_free(self->session);
5063 }
Christian Heimesa5d07652016-09-24 10:48:05 +02005064 PyObject_GC_Del(self);
Christian Heimes5c36da72020-11-20 09:40:12 +01005065 Py_DECREF(tp);
Christian Heimes99a65702016-09-10 23:44:53 +02005066}
5067
5068static PyObject *
5069PySSLSession_richcompare(PyObject *left, PyObject *right, int op)
5070{
5071 int result;
5072
5073 if (left == NULL || right == NULL) {
5074 PyErr_BadInternalCall();
5075 return NULL;
5076 }
5077
5078 if (!PySSLSession_Check(left) || !PySSLSession_Check(right)) {
5079 Py_RETURN_NOTIMPLEMENTED;
5080 }
5081
5082 if (left == right) {
5083 result = 0;
5084 } else {
5085 const unsigned char *left_id, *right_id;
5086 unsigned int left_len, right_len;
5087 left_id = SSL_SESSION_get_id(((PySSLSession *)left)->session,
5088 &left_len);
5089 right_id = SSL_SESSION_get_id(((PySSLSession *)right)->session,
5090 &right_len);
5091 if (left_len == right_len) {
5092 result = memcmp(left_id, right_id, left_len);
5093 } else {
5094 result = 1;
5095 }
5096 }
5097
5098 switch (op) {
5099 case Py_EQ:
5100 if (result == 0) {
5101 Py_RETURN_TRUE;
5102 } else {
5103 Py_RETURN_FALSE;
5104 }
5105 break;
5106 case Py_NE:
5107 if (result != 0) {
5108 Py_RETURN_TRUE;
5109 } else {
5110 Py_RETURN_FALSE;
5111 }
5112 break;
5113 case Py_LT:
5114 case Py_LE:
5115 case Py_GT:
5116 case Py_GE:
5117 Py_RETURN_NOTIMPLEMENTED;
5118 break;
5119 default:
5120 PyErr_BadArgument();
5121 return NULL;
5122 }
5123}
5124
5125static int
5126PySSLSession_traverse(PySSLSession *self, visitproc visit, void *arg)
5127{
5128 Py_VISIT(self->ctx);
5129 return 0;
5130}
5131
5132static int
5133PySSLSession_clear(PySSLSession *self)
5134{
5135 Py_CLEAR(self->ctx);
5136 return 0;
5137}
5138
5139
5140static PyObject *
5141PySSLSession_get_time(PySSLSession *self, void *closure) {
5142 return PyLong_FromLong(SSL_SESSION_get_time(self->session));
5143}
5144
5145PyDoc_STRVAR(PySSLSession_get_time_doc,
5146"Session creation time (seconds since epoch).");
5147
5148
5149static PyObject *
5150PySSLSession_get_timeout(PySSLSession *self, void *closure) {
5151 return PyLong_FromLong(SSL_SESSION_get_timeout(self->session));
5152}
5153
5154PyDoc_STRVAR(PySSLSession_get_timeout_doc,
5155"Session timeout (delta in seconds).");
5156
5157
5158static PyObject *
5159PySSLSession_get_ticket_lifetime_hint(PySSLSession *self, void *closure) {
5160 unsigned long hint = SSL_SESSION_get_ticket_lifetime_hint(self->session);
5161 return PyLong_FromUnsignedLong(hint);
5162}
5163
5164PyDoc_STRVAR(PySSLSession_get_ticket_lifetime_hint_doc,
5165"Ticket life time hint.");
5166
5167
5168static PyObject *
5169PySSLSession_get_session_id(PySSLSession *self, void *closure) {
5170 const unsigned char *id;
5171 unsigned int len;
5172 id = SSL_SESSION_get_id(self->session, &len);
5173 return PyBytes_FromStringAndSize((const char *)id, len);
5174}
5175
5176PyDoc_STRVAR(PySSLSession_get_session_id_doc,
5177"Session id");
5178
5179
5180static PyObject *
5181PySSLSession_get_has_ticket(PySSLSession *self, void *closure) {
5182 if (SSL_SESSION_has_ticket(self->session)) {
5183 Py_RETURN_TRUE;
5184 } else {
5185 Py_RETURN_FALSE;
5186 }
5187}
5188
5189PyDoc_STRVAR(PySSLSession_get_has_ticket_doc,
5190"Does the session contain a ticket?");
5191
5192
5193static PyGetSetDef PySSLSession_getsetlist[] = {
5194 {"has_ticket", (getter) PySSLSession_get_has_ticket, NULL,
5195 PySSLSession_get_has_ticket_doc},
5196 {"id", (getter) PySSLSession_get_session_id, NULL,
5197 PySSLSession_get_session_id_doc},
5198 {"ticket_lifetime_hint", (getter) PySSLSession_get_ticket_lifetime_hint,
5199 NULL, PySSLSession_get_ticket_lifetime_hint_doc},
5200 {"time", (getter) PySSLSession_get_time, NULL,
5201 PySSLSession_get_time_doc},
5202 {"timeout", (getter) PySSLSession_get_timeout, NULL,
5203 PySSLSession_get_timeout_doc},
5204 {NULL}, /* sentinel */
5205};
5206
Christian Heimes5c36da72020-11-20 09:40:12 +01005207static PyType_Slot PySSLSession_slots[] = {
5208 {Py_tp_getset,PySSLSession_getsetlist},
5209 {Py_tp_richcompare, PySSLSession_richcompare},
5210 {Py_tp_dealloc, PySSLSession_dealloc},
5211 {Py_tp_traverse, PySSLSession_traverse},
5212 {Py_tp_clear, PySSLSession_clear},
5213 {0, 0},
5214};
5215
5216static PyType_Spec PySSLSession_spec = {
5217 "_ssl.SSLSession",
5218 sizeof(PySSLSession),
5219 0,
5220 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,
5221 PySSLSession_slots,
Christian Heimes99a65702016-09-10 23:44:53 +02005222};
5223
5224
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005225/* helper routines for seeding the SSL PRNG */
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03005226/*[clinic input]
5227_ssl.RAND_add
Larry Hastingsdbfdc382015-05-04 06:59:46 -07005228 string as view: Py_buffer(accept={str, buffer})
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03005229 entropy: double
5230 /
5231
5232Mix string into the OpenSSL PRNG state.
5233
5234entropy (a float) is a lower bound on the entropy contained in
Chandan Kumar63c2c8a2017-06-09 15:13:58 +05305235string. See RFC 4086.
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03005236[clinic start generated code]*/
5237
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005238static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03005239_ssl_RAND_add_impl(PyObject *module, Py_buffer *view, double entropy)
Serhiy Storchaka5f31d5c2017-06-10 13:13:51 +03005240/*[clinic end generated code: output=e6dd48df9c9024e9 input=5c33017422828f5c]*/
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005241{
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005242 const char *buf;
Victor Stinner2e57b4e2014-07-01 16:37:17 +02005243 Py_ssize_t len, written;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005244
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03005245 buf = (const char *)view->buf;
5246 len = view->len;
Victor Stinner2e57b4e2014-07-01 16:37:17 +02005247 do {
5248 written = Py_MIN(len, INT_MAX);
5249 RAND_add(buf, (int)written, entropy);
5250 buf += written;
5251 len -= written;
5252 } while (len);
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02005253 Py_RETURN_NONE;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005254}
5255
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005256static PyObject *
Victor Stinner99c8b162011-05-24 12:05:19 +02005257PySSL_RAND(int len, int pseudo)
5258{
5259 int ok;
5260 PyObject *bytes;
5261 unsigned long err;
5262 const char *errstr;
5263 PyObject *v;
5264
Victor Stinner1e81a392013-12-19 16:47:04 +01005265 if (len < 0) {
5266 PyErr_SetString(PyExc_ValueError, "num must be positive");
5267 return NULL;
5268 }
5269
Victor Stinner99c8b162011-05-24 12:05:19 +02005270 bytes = PyBytes_FromStringAndSize(NULL, len);
5271 if (bytes == NULL)
5272 return NULL;
5273 if (pseudo) {
Christian Heimesa871f692020-06-01 08:58:14 +02005274#ifdef PY_OPENSSL_1_1_API
5275 ok = RAND_bytes((unsigned char*)PyBytes_AS_STRING(bytes), len);
5276#else
Victor Stinner99c8b162011-05-24 12:05:19 +02005277 ok = RAND_pseudo_bytes((unsigned char*)PyBytes_AS_STRING(bytes), len);
Christian Heimesa871f692020-06-01 08:58:14 +02005278#endif
Victor Stinner99c8b162011-05-24 12:05:19 +02005279 if (ok == 0 || ok == 1)
5280 return Py_BuildValue("NO", bytes, ok == 1 ? Py_True : Py_False);
5281 }
5282 else {
5283 ok = RAND_bytes((unsigned char*)PyBytes_AS_STRING(bytes), len);
5284 if (ok == 1)
5285 return bytes;
5286 }
5287 Py_DECREF(bytes);
5288
5289 err = ERR_get_error();
5290 errstr = ERR_reason_error_string(err);
5291 v = Py_BuildValue("(ks)", err, errstr);
5292 if (v != NULL) {
5293 PyErr_SetObject(PySSLErrorObject, v);
5294 Py_DECREF(v);
5295 }
5296 return NULL;
5297}
5298
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03005299/*[clinic input]
5300_ssl.RAND_bytes
5301 n: int
5302 /
5303
5304Generate n cryptographically strong pseudo-random bytes.
5305[clinic start generated code]*/
5306
Victor Stinner99c8b162011-05-24 12:05:19 +02005307static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03005308_ssl_RAND_bytes_impl(PyObject *module, int n)
5309/*[clinic end generated code: output=977da635e4838bc7 input=678ddf2872dfebfc]*/
Victor Stinner99c8b162011-05-24 12:05:19 +02005310{
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03005311 return PySSL_RAND(n, 0);
Victor Stinner99c8b162011-05-24 12:05:19 +02005312}
5313
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03005314/*[clinic input]
5315_ssl.RAND_pseudo_bytes
5316 n: int
5317 /
5318
5319Generate n pseudo-random bytes.
5320
5321Return a pair (bytes, is_cryptographic). is_cryptographic is True
5322if the bytes generated are cryptographically strong.
5323[clinic start generated code]*/
Victor Stinner99c8b162011-05-24 12:05:19 +02005324
5325static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03005326_ssl_RAND_pseudo_bytes_impl(PyObject *module, int n)
5327/*[clinic end generated code: output=b1509e937000e52d input=58312bd53f9bbdd0]*/
Victor Stinner99c8b162011-05-24 12:05:19 +02005328{
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03005329 return PySSL_RAND(n, 1);
Victor Stinner99c8b162011-05-24 12:05:19 +02005330}
5331
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03005332/*[clinic input]
5333_ssl.RAND_status
5334
5335Returns 1 if the OpenSSL PRNG has been seeded with enough data and 0 if not.
5336
5337It is necessary to seed the PRNG with RAND_add() on some platforms before
5338using the ssl() function.
5339[clinic start generated code]*/
Victor Stinner99c8b162011-05-24 12:05:19 +02005340
5341static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03005342_ssl_RAND_status_impl(PyObject *module)
5343/*[clinic end generated code: output=7e0aaa2d39fdc1ad input=8a774b02d1dc81f3]*/
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005344{
Christian Heimes217cfd12007-12-02 14:31:20 +00005345 return PyLong_FromLong(RAND_status());
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005346}
5347
Benjamin Petersonb8a2f512016-07-06 23:55:15 -07005348#ifndef OPENSSL_NO_EGD
Christian Heimesa5d07652016-09-24 10:48:05 +02005349/* LCOV_EXCL_START */
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03005350/*[clinic input]
5351_ssl.RAND_egd
5352 path: object(converter="PyUnicode_FSConverter")
5353 /
5354
5355Queries the entropy gather daemon (EGD) on the socket named by 'path'.
5356
5357Returns number of bytes read. Raises SSLError if connection to EGD
5358fails or if it does not provide enough data to seed PRNG.
5359[clinic start generated code]*/
5360
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005361static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03005362_ssl_RAND_egd_impl(PyObject *module, PyObject *path)
5363/*[clinic end generated code: output=02a67c7c367f52fa input=1aeb7eb948312195]*/
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005364{
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03005365 int bytes = RAND_egd(PyBytes_AsString(path));
Victor Stinnerf9faaad2010-05-16 21:36:37 +00005366 Py_DECREF(path);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005367 if (bytes == -1) {
Antoine Pitrou525807b2010-05-12 14:05:24 +00005368 PyErr_SetString(PySSLErrorObject,
5369 "EGD connection failed or EGD did not return "
5370 "enough data to seed the PRNG");
5371 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005372 }
Christian Heimes217cfd12007-12-02 14:31:20 +00005373 return PyLong_FromLong(bytes);
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005374}
Christian Heimesa5d07652016-09-24 10:48:05 +02005375/* LCOV_EXCL_STOP */
Benjamin Petersonb8a2f512016-07-06 23:55:15 -07005376#endif /* OPENSSL_NO_EGD */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005377
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005378
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03005379
5380/*[clinic input]
5381_ssl.get_default_verify_paths
5382
5383Return search paths and environment vars that are used by SSLContext's set_default_verify_paths() to load default CAs.
5384
5385The values are 'cert_file_env', 'cert_file', 'cert_dir_env', 'cert_dir'.
5386[clinic start generated code]*/
Christian Heimes6d7ad132013-06-09 18:02:55 +02005387
5388static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03005389_ssl_get_default_verify_paths_impl(PyObject *module)
5390/*[clinic end generated code: output=e5b62a466271928b input=5210c953d98c3eb5]*/
Christian Heimes6d7ad132013-06-09 18:02:55 +02005391{
5392 PyObject *ofile_env = NULL;
5393 PyObject *ofile = NULL;
5394 PyObject *odir_env = NULL;
5395 PyObject *odir = NULL;
5396
Benjamin Petersond113c962015-07-18 10:59:13 -07005397#define CONVERT(info, target) { \
Christian Heimes6d7ad132013-06-09 18:02:55 +02005398 const char *tmp = (info); \
5399 target = NULL; \
5400 if (!tmp) { Py_INCREF(Py_None); target = Py_None; } \
5401 else if ((target = PyUnicode_DecodeFSDefault(tmp)) == NULL) { \
5402 target = PyBytes_FromString(tmp); } \
5403 if (!target) goto error; \
Benjamin Peterson025a1fd2015-11-14 15:12:38 -08005404 }
Christian Heimes6d7ad132013-06-09 18:02:55 +02005405
Benjamin Petersond113c962015-07-18 10:59:13 -07005406 CONVERT(X509_get_default_cert_file_env(), ofile_env);
5407 CONVERT(X509_get_default_cert_file(), ofile);
5408 CONVERT(X509_get_default_cert_dir_env(), odir_env);
5409 CONVERT(X509_get_default_cert_dir(), odir);
5410#undef CONVERT
Christian Heimes6d7ad132013-06-09 18:02:55 +02005411
Christian Heimes200bb1b2013-06-14 15:14:29 +02005412 return Py_BuildValue("NNNN", ofile_env, ofile, odir_env, odir);
Christian Heimes6d7ad132013-06-09 18:02:55 +02005413
5414 error:
5415 Py_XDECREF(ofile_env);
5416 Py_XDECREF(ofile);
5417 Py_XDECREF(odir_env);
5418 Py_XDECREF(odir);
5419 return NULL;
5420}
5421
Christian Heimesa6bc95a2013-11-17 19:59:14 +01005422static PyObject*
5423asn1obj2py(ASN1_OBJECT *obj)
5424{
5425 int nid;
5426 const char *ln, *sn;
Christian Heimesa6bc95a2013-11-17 19:59:14 +01005427
5428 nid = OBJ_obj2nid(obj);
5429 if (nid == NID_undef) {
5430 PyErr_Format(PyExc_ValueError, "Unknown object");
5431 return NULL;
5432 }
5433 sn = OBJ_nid2sn(nid);
5434 ln = OBJ_nid2ln(nid);
Serhiy Storchakae503ca52017-09-05 01:28:53 +03005435 return Py_BuildValue("issN", nid, sn, ln, _asn1obj2py(obj, 1));
Christian Heimesa6bc95a2013-11-17 19:59:14 +01005436}
5437
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03005438/*[clinic input]
5439_ssl.txt2obj
5440 txt: str
5441 name: bool = False
Christian Heimesa6bc95a2013-11-17 19:59:14 +01005442
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03005443Lookup NID, short name, long name and OID of an ASN1_OBJECT.
5444
5445By default objects are looked up by OID. With name=True short and
5446long name are also matched.
5447[clinic start generated code]*/
5448
5449static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03005450_ssl_txt2obj_impl(PyObject *module, const char *txt, int name)
5451/*[clinic end generated code: output=c38e3991347079c1 input=1c1e7d0aa7c48602]*/
Christian Heimesa6bc95a2013-11-17 19:59:14 +01005452{
Christian Heimesa6bc95a2013-11-17 19:59:14 +01005453 PyObject *result = NULL;
Christian Heimesa6bc95a2013-11-17 19:59:14 +01005454 ASN1_OBJECT *obj;
5455
Christian Heimesa6bc95a2013-11-17 19:59:14 +01005456 obj = OBJ_txt2obj(txt, name ? 0 : 1);
5457 if (obj == NULL) {
Christian Heimes5398e1a2013-11-22 16:20:53 +01005458 PyErr_Format(PyExc_ValueError, "unknown object '%.100s'", txt);
Christian Heimesa6bc95a2013-11-17 19:59:14 +01005459 return NULL;
5460 }
5461 result = asn1obj2py(obj);
5462 ASN1_OBJECT_free(obj);
5463 return result;
5464}
5465
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03005466/*[clinic input]
5467_ssl.nid2obj
5468 nid: int
5469 /
Christian Heimesa6bc95a2013-11-17 19:59:14 +01005470
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03005471Lookup NID, short name, long name and OID of an ASN1_OBJECT by NID.
5472[clinic start generated code]*/
5473
5474static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03005475_ssl_nid2obj_impl(PyObject *module, int nid)
5476/*[clinic end generated code: output=4a98ab691cd4f84a input=51787a3bee7d8f98]*/
Christian Heimesa6bc95a2013-11-17 19:59:14 +01005477{
5478 PyObject *result = NULL;
Christian Heimesa6bc95a2013-11-17 19:59:14 +01005479 ASN1_OBJECT *obj;
5480
Christian Heimesa6bc95a2013-11-17 19:59:14 +01005481 if (nid < NID_undef) {
Christian Heimes5398e1a2013-11-22 16:20:53 +01005482 PyErr_SetString(PyExc_ValueError, "NID must be positive.");
Christian Heimesa6bc95a2013-11-17 19:59:14 +01005483 return NULL;
5484 }
5485 obj = OBJ_nid2obj(nid);
5486 if (obj == NULL) {
Christian Heimes5398e1a2013-11-22 16:20:53 +01005487 PyErr_Format(PyExc_ValueError, "unknown NID %i", nid);
Christian Heimesa6bc95a2013-11-17 19:59:14 +01005488 return NULL;
5489 }
5490 result = asn1obj2py(obj);
5491 ASN1_OBJECT_free(obj);
5492 return result;
5493}
5494
Christian Heimes46bebee2013-06-09 19:03:31 +02005495#ifdef _MSC_VER
Christian Heimes44109d72013-11-22 01:51:30 +01005496
5497static PyObject*
5498certEncodingType(DWORD encodingType)
5499{
5500 static PyObject *x509_asn = NULL;
5501 static PyObject *pkcs_7_asn = NULL;
5502
5503 if (x509_asn == NULL) {
5504 x509_asn = PyUnicode_InternFromString("x509_asn");
5505 if (x509_asn == NULL)
5506 return NULL;
5507 }
5508 if (pkcs_7_asn == NULL) {
5509 pkcs_7_asn = PyUnicode_InternFromString("pkcs_7_asn");
5510 if (pkcs_7_asn == NULL)
5511 return NULL;
5512 }
5513 switch(encodingType) {
5514 case X509_ASN_ENCODING:
5515 Py_INCREF(x509_asn);
5516 return x509_asn;
5517 case PKCS_7_ASN_ENCODING:
5518 Py_INCREF(pkcs_7_asn);
5519 return pkcs_7_asn;
5520 default:
5521 return PyLong_FromLong(encodingType);
5522 }
5523}
5524
5525static PyObject*
5526parseKeyUsage(PCCERT_CONTEXT pCertCtx, DWORD flags)
5527{
5528 CERT_ENHKEY_USAGE *usage;
5529 DWORD size, error, i;
5530 PyObject *retval;
5531
5532 if (!CertGetEnhancedKeyUsage(pCertCtx, flags, NULL, &size)) {
5533 error = GetLastError();
5534 if (error == CRYPT_E_NOT_FOUND) {
5535 Py_RETURN_TRUE;
5536 }
5537 return PyErr_SetFromWindowsErr(error);
5538 }
5539
5540 usage = (CERT_ENHKEY_USAGE*)PyMem_Malloc(size);
5541 if (usage == NULL) {
5542 return PyErr_NoMemory();
5543 }
5544
5545 /* Now get the actual enhanced usage property */
5546 if (!CertGetEnhancedKeyUsage(pCertCtx, flags, usage, &size)) {
5547 PyMem_Free(usage);
5548 error = GetLastError();
5549 if (error == CRYPT_E_NOT_FOUND) {
5550 Py_RETURN_TRUE;
5551 }
5552 return PyErr_SetFromWindowsErr(error);
5553 }
Christian Heimes915cd3f2019-09-09 18:06:55 +02005554 retval = PyFrozenSet_New(NULL);
Christian Heimes44109d72013-11-22 01:51:30 +01005555 if (retval == NULL) {
5556 goto error;
5557 }
5558 for (i = 0; i < usage->cUsageIdentifier; ++i) {
5559 if (usage->rgpszUsageIdentifier[i]) {
5560 PyObject *oid;
5561 int err;
5562 oid = PyUnicode_FromString(usage->rgpszUsageIdentifier[i]);
5563 if (oid == NULL) {
5564 Py_CLEAR(retval);
5565 goto error;
5566 }
5567 err = PySet_Add(retval, oid);
5568 Py_DECREF(oid);
5569 if (err == -1) {
5570 Py_CLEAR(retval);
5571 goto error;
5572 }
5573 }
5574 }
5575 error:
5576 PyMem_Free(usage);
5577 return retval;
5578}
5579
kctherookied93fbbf2019-03-29 00:59:06 +07005580static HCERTSTORE
5581ssl_collect_certificates(const char *store_name)
5582{
5583/* this function collects the system certificate stores listed in
5584 * system_stores into a collection certificate store for being
5585 * enumerated. The store must be readable to be added to the
5586 * store collection.
5587 */
5588
5589 HCERTSTORE hCollectionStore = NULL, hSystemStore = NULL;
5590 static DWORD system_stores[] = {
5591 CERT_SYSTEM_STORE_LOCAL_MACHINE,
5592 CERT_SYSTEM_STORE_LOCAL_MACHINE_ENTERPRISE,
5593 CERT_SYSTEM_STORE_LOCAL_MACHINE_GROUP_POLICY,
5594 CERT_SYSTEM_STORE_CURRENT_USER,
5595 CERT_SYSTEM_STORE_CURRENT_USER_GROUP_POLICY,
5596 CERT_SYSTEM_STORE_SERVICES,
5597 CERT_SYSTEM_STORE_USERS};
5598 size_t i, storesAdded;
5599 BOOL result;
5600
5601 hCollectionStore = CertOpenStore(CERT_STORE_PROV_COLLECTION, 0,
5602 (HCRYPTPROV)NULL, 0, NULL);
5603 if (!hCollectionStore) {
5604 return NULL;
5605 }
5606 storesAdded = 0;
5607 for (i = 0; i < sizeof(system_stores) / sizeof(DWORD); i++) {
5608 hSystemStore = CertOpenStore(CERT_STORE_PROV_SYSTEM_A, 0,
5609 (HCRYPTPROV)NULL,
5610 CERT_STORE_READONLY_FLAG |
5611 system_stores[i], store_name);
5612 if (hSystemStore) {
5613 result = CertAddStoreToCollection(hCollectionStore, hSystemStore,
5614 CERT_PHYSICAL_STORE_ADD_ENABLE_FLAG, 0);
5615 if (result) {
5616 ++storesAdded;
5617 }
neoneneed701292019-09-09 21:33:43 +09005618 CertCloseStore(hSystemStore, 0); /* flag must be 0 */
kctherookied93fbbf2019-03-29 00:59:06 +07005619 }
5620 }
5621 if (storesAdded == 0) {
5622 CertCloseStore(hCollectionStore, CERT_CLOSE_STORE_FORCE_FLAG);
5623 return NULL;
5624 }
5625
5626 return hCollectionStore;
5627}
5628
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03005629/*[clinic input]
5630_ssl.enum_certificates
5631 store_name: str
5632
5633Retrieve certificates from Windows' cert store.
5634
5635store_name may be one of 'CA', 'ROOT' or 'MY'. The system may provide
5636more cert storages, too. The function returns a list of (bytes,
5637encoding_type, trust) tuples. The encoding_type flag can be interpreted
5638with X509_ASN_ENCODING or PKCS_7_ASN_ENCODING. The trust setting is either
5639a set of OIDs or the boolean True.
5640[clinic start generated code]*/
Bill Janssen40a0f662008-08-12 16:56:25 +00005641
Christian Heimes46bebee2013-06-09 19:03:31 +02005642static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03005643_ssl_enum_certificates_impl(PyObject *module, const char *store_name)
5644/*[clinic end generated code: output=5134dc8bb3a3c893 input=915f60d70461ea4e]*/
Christian Heimes46bebee2013-06-09 19:03:31 +02005645{
kctherookied93fbbf2019-03-29 00:59:06 +07005646 HCERTSTORE hCollectionStore = NULL;
Christian Heimes44109d72013-11-22 01:51:30 +01005647 PCCERT_CONTEXT pCertCtx = NULL;
5648 PyObject *keyusage = NULL, *cert = NULL, *enc = NULL, *tup = NULL;
Christian Heimes46bebee2013-06-09 19:03:31 +02005649 PyObject *result = NULL;
Christian Heimes46bebee2013-06-09 19:03:31 +02005650
Christian Heimes915cd3f2019-09-09 18:06:55 +02005651 result = PySet_New(NULL);
Christian Heimes44109d72013-11-22 01:51:30 +01005652 if (result == NULL) {
5653 return NULL;
5654 }
kctherookied93fbbf2019-03-29 00:59:06 +07005655 hCollectionStore = ssl_collect_certificates(store_name);
5656 if (hCollectionStore == NULL) {
Christian Heimes46bebee2013-06-09 19:03:31 +02005657 Py_DECREF(result);
5658 return PyErr_SetFromWindowsErr(GetLastError());
5659 }
5660
kctherookied93fbbf2019-03-29 00:59:06 +07005661 while (pCertCtx = CertEnumCertificatesInStore(hCollectionStore, pCertCtx)) {
Christian Heimes44109d72013-11-22 01:51:30 +01005662 cert = PyBytes_FromStringAndSize((const char*)pCertCtx->pbCertEncoded,
5663 pCertCtx->cbCertEncoded);
5664 if (!cert) {
5665 Py_CLEAR(result);
5666 break;
Christian Heimes46bebee2013-06-09 19:03:31 +02005667 }
Christian Heimes44109d72013-11-22 01:51:30 +01005668 if ((enc = certEncodingType(pCertCtx->dwCertEncodingType)) == NULL) {
5669 Py_CLEAR(result);
5670 break;
Christian Heimes46bebee2013-06-09 19:03:31 +02005671 }
Christian Heimes44109d72013-11-22 01:51:30 +01005672 keyusage = parseKeyUsage(pCertCtx, CERT_FIND_PROP_ONLY_ENHKEY_USAGE_FLAG);
5673 if (keyusage == Py_True) {
5674 Py_DECREF(keyusage);
5675 keyusage = parseKeyUsage(pCertCtx, CERT_FIND_EXT_ONLY_ENHKEY_USAGE_FLAG);
Christian Heimes46bebee2013-06-09 19:03:31 +02005676 }
Christian Heimes44109d72013-11-22 01:51:30 +01005677 if (keyusage == NULL) {
5678 Py_CLEAR(result);
5679 break;
Christian Heimes46bebee2013-06-09 19:03:31 +02005680 }
Christian Heimes44109d72013-11-22 01:51:30 +01005681 if ((tup = PyTuple_New(3)) == NULL) {
5682 Py_CLEAR(result);
5683 break;
5684 }
5685 PyTuple_SET_ITEM(tup, 0, cert);
5686 cert = NULL;
5687 PyTuple_SET_ITEM(tup, 1, enc);
5688 enc = NULL;
5689 PyTuple_SET_ITEM(tup, 2, keyusage);
5690 keyusage = NULL;
Christian Heimes915cd3f2019-09-09 18:06:55 +02005691 if (PySet_Add(result, tup) == -1) {
5692 Py_CLEAR(result);
5693 Py_CLEAR(tup);
5694 break;
Christian Heimes44109d72013-11-22 01:51:30 +01005695 }
5696 Py_CLEAR(tup);
5697 }
5698 if (pCertCtx) {
5699 /* loop ended with an error, need to clean up context manually */
5700 CertFreeCertificateContext(pCertCtx);
Christian Heimes46bebee2013-06-09 19:03:31 +02005701 }
5702
5703 /* In error cases cert, enc and tup may not be NULL */
5704 Py_XDECREF(cert);
5705 Py_XDECREF(enc);
Christian Heimes44109d72013-11-22 01:51:30 +01005706 Py_XDECREF(keyusage);
Christian Heimes46bebee2013-06-09 19:03:31 +02005707 Py_XDECREF(tup);
5708
kctherookied93fbbf2019-03-29 00:59:06 +07005709 /* CERT_CLOSE_STORE_FORCE_FLAG forces freeing of memory for all contexts
5710 associated with the store, in this case our collection store and the
5711 associated system stores. */
5712 if (!CertCloseStore(hCollectionStore, CERT_CLOSE_STORE_FORCE_FLAG)) {
Christian Heimes46bebee2013-06-09 19:03:31 +02005713 /* This error case might shadow another exception.*/
Christian Heimes44109d72013-11-22 01:51:30 +01005714 Py_XDECREF(result);
5715 return PyErr_SetFromWindowsErr(GetLastError());
5716 }
kctherookied93fbbf2019-03-29 00:59:06 +07005717
Christian Heimes915cd3f2019-09-09 18:06:55 +02005718 /* convert set to list */
5719 if (result == NULL) {
5720 return NULL;
5721 } else {
5722 PyObject *lst = PySequence_List(result);
5723 Py_DECREF(result);
5724 return lst;
5725 }
Christian Heimes44109d72013-11-22 01:51:30 +01005726}
5727
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03005728/*[clinic input]
5729_ssl.enum_crls
5730 store_name: str
5731
5732Retrieve CRLs from Windows' cert store.
5733
5734store_name may be one of 'CA', 'ROOT' or 'MY'. The system may provide
5735more cert storages, too. The function returns a list of (bytes,
5736encoding_type) tuples. The encoding_type flag can be interpreted with
5737X509_ASN_ENCODING or PKCS_7_ASN_ENCODING.
5738[clinic start generated code]*/
Christian Heimes44109d72013-11-22 01:51:30 +01005739
5740static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03005741_ssl_enum_crls_impl(PyObject *module, const char *store_name)
5742/*[clinic end generated code: output=bce467f60ccd03b6 input=a1f1d7629f1c5d3d]*/
Christian Heimes44109d72013-11-22 01:51:30 +01005743{
kctherookied93fbbf2019-03-29 00:59:06 +07005744 HCERTSTORE hCollectionStore = NULL;
Christian Heimes44109d72013-11-22 01:51:30 +01005745 PCCRL_CONTEXT pCrlCtx = NULL;
5746 PyObject *crl = NULL, *enc = NULL, *tup = NULL;
5747 PyObject *result = NULL;
5748
Christian Heimes915cd3f2019-09-09 18:06:55 +02005749 result = PySet_New(NULL);
Christian Heimes44109d72013-11-22 01:51:30 +01005750 if (result == NULL) {
5751 return NULL;
5752 }
kctherookied93fbbf2019-03-29 00:59:06 +07005753 hCollectionStore = ssl_collect_certificates(store_name);
5754 if (hCollectionStore == NULL) {
Christian Heimes46bebee2013-06-09 19:03:31 +02005755 Py_DECREF(result);
5756 return PyErr_SetFromWindowsErr(GetLastError());
5757 }
Christian Heimes44109d72013-11-22 01:51:30 +01005758
kctherookied93fbbf2019-03-29 00:59:06 +07005759 while (pCrlCtx = CertEnumCRLsInStore(hCollectionStore, pCrlCtx)) {
Christian Heimes44109d72013-11-22 01:51:30 +01005760 crl = PyBytes_FromStringAndSize((const char*)pCrlCtx->pbCrlEncoded,
5761 pCrlCtx->cbCrlEncoded);
5762 if (!crl) {
5763 Py_CLEAR(result);
5764 break;
5765 }
5766 if ((enc = certEncodingType(pCrlCtx->dwCertEncodingType)) == NULL) {
5767 Py_CLEAR(result);
5768 break;
5769 }
5770 if ((tup = PyTuple_New(2)) == NULL) {
5771 Py_CLEAR(result);
5772 break;
5773 }
5774 PyTuple_SET_ITEM(tup, 0, crl);
5775 crl = NULL;
5776 PyTuple_SET_ITEM(tup, 1, enc);
5777 enc = NULL;
5778
Christian Heimes915cd3f2019-09-09 18:06:55 +02005779 if (PySet_Add(result, tup) == -1) {
5780 Py_CLEAR(result);
5781 Py_CLEAR(tup);
5782 break;
Christian Heimes44109d72013-11-22 01:51:30 +01005783 }
5784 Py_CLEAR(tup);
Christian Heimes46bebee2013-06-09 19:03:31 +02005785 }
Christian Heimes44109d72013-11-22 01:51:30 +01005786 if (pCrlCtx) {
5787 /* loop ended with an error, need to clean up context manually */
5788 CertFreeCRLContext(pCrlCtx);
5789 }
5790
5791 /* In error cases cert, enc and tup may not be NULL */
5792 Py_XDECREF(crl);
5793 Py_XDECREF(enc);
5794 Py_XDECREF(tup);
5795
kctherookied93fbbf2019-03-29 00:59:06 +07005796 /* CERT_CLOSE_STORE_FORCE_FLAG forces freeing of memory for all contexts
5797 associated with the store, in this case our collection store and the
5798 associated system stores. */
5799 if (!CertCloseStore(hCollectionStore, CERT_CLOSE_STORE_FORCE_FLAG)) {
Christian Heimes44109d72013-11-22 01:51:30 +01005800 /* This error case might shadow another exception.*/
5801 Py_XDECREF(result);
5802 return PyErr_SetFromWindowsErr(GetLastError());
5803 }
Christian Heimes915cd3f2019-09-09 18:06:55 +02005804 /* convert set to list */
5805 if (result == NULL) {
5806 return NULL;
5807 } else {
5808 PyObject *lst = PySequence_List(result);
5809 Py_DECREF(result);
5810 return lst;
5811 }
Christian Heimes46bebee2013-06-09 19:03:31 +02005812}
Christian Heimes44109d72013-11-22 01:51:30 +01005813
5814#endif /* _MSC_VER */
Bill Janssen40a0f662008-08-12 16:56:25 +00005815
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005816/* List of functions exported by this module. */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005817static PyMethodDef PySSL_methods[] = {
Serhiy Storchaka4b7b82f2015-05-03 16:14:08 +03005818 _SSL__TEST_DECODE_CERT_METHODDEF
5819 _SSL_RAND_ADD_METHODDEF
5820 _SSL_RAND_BYTES_METHODDEF
5821 _SSL_RAND_PSEUDO_BYTES_METHODDEF
5822 _SSL_RAND_EGD_METHODDEF
5823 _SSL_RAND_STATUS_METHODDEF
5824 _SSL_GET_DEFAULT_VERIFY_PATHS_METHODDEF
5825 _SSL_ENUM_CERTIFICATES_METHODDEF
5826 _SSL_ENUM_CRLS_METHODDEF
5827 _SSL_TXT2OBJ_METHODDEF
5828 _SSL_NID2OBJ_METHODDEF
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00005829 {NULL, NULL} /* Sentinel */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005830};
5831
5832
Christian Heimes598894f2016-09-05 23:19:05 +02005833#ifdef HAVE_OPENSSL_CRYPTO_LOCK
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005834
5835/* an implementation of OpenSSL threading operations in terms
Christian Heimes598894f2016-09-05 23:19:05 +02005836 * of the Python C thread library
5837 * Only used up to 1.0.2. OpenSSL 1.1.0+ has its own locking code.
5838 */
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005839
5840static PyThread_type_lock *_ssl_locks = NULL;
5841
Christian Heimes4d98ca92013-08-19 17:36:29 +02005842#if OPENSSL_VERSION_NUMBER >= 0x10000000
5843/* use new CRYPTO_THREADID API. */
5844static void
5845_ssl_threadid_callback(CRYPTO_THREADID *id)
5846{
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +02005847 CRYPTO_THREADID_set_numeric(id, PyThread_get_thread_ident());
Christian Heimes4d98ca92013-08-19 17:36:29 +02005848}
5849#else
5850/* deprecated CRYPTO_set_id_callback() API. */
5851static unsigned long
5852_ssl_thread_id_function (void) {
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00005853 return PyThread_get_thread_ident();
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005854}
Christian Heimes4d98ca92013-08-19 17:36:29 +02005855#endif
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005856
Bill Janssen6e027db2007-11-15 22:23:56 +00005857static void _ssl_thread_locking_function
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00005858 (int mode, int n, const char *file, int line) {
5859 /* this function is needed to perform locking on shared data
5860 structures. (Note that OpenSSL uses a number of global data
5861 structures that will be implicitly shared whenever multiple
5862 threads use OpenSSL.) Multi-threaded applications will
5863 crash at random if it is not set.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005864
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00005865 locking_function() must be able to handle up to
5866 CRYPTO_num_locks() different mutex locks. It sets the n-th
5867 lock if mode & CRYPTO_LOCK, and releases it otherwise.
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005868
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00005869 file and line are the file number of the function setting the
5870 lock. They can be useful for debugging.
5871 */
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005872
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00005873 if ((_ssl_locks == NULL) ||
5874 (n < 0) || ((unsigned)n >= _ssl_locks_count))
5875 return;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005876
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00005877 if (mode & CRYPTO_LOCK) {
5878 PyThread_acquire_lock(_ssl_locks[n], 1);
5879 } else {
5880 PyThread_release_lock(_ssl_locks[n]);
5881 }
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005882}
5883
5884static int _setup_ssl_threads(void) {
5885
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00005886 unsigned int i;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005887
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00005888 if (_ssl_locks == NULL) {
5889 _ssl_locks_count = CRYPTO_num_locks();
Christian Heimesf6365e32016-09-13 20:48:13 +02005890 _ssl_locks = PyMem_Calloc(_ssl_locks_count,
5891 sizeof(PyThread_type_lock));
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02005892 if (_ssl_locks == NULL) {
5893 PyErr_NoMemory();
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00005894 return 0;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02005895 }
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00005896 for (i = 0; i < _ssl_locks_count; i++) {
5897 _ssl_locks[i] = PyThread_allocate_lock();
5898 if (_ssl_locks[i] == NULL) {
5899 unsigned int j;
5900 for (j = 0; j < i; j++) {
5901 PyThread_free_lock(_ssl_locks[j]);
5902 }
Victor Stinnerb6404912013-07-07 16:21:41 +02005903 PyMem_Free(_ssl_locks);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00005904 return 0;
5905 }
5906 }
5907 CRYPTO_set_locking_callback(_ssl_thread_locking_function);
Christian Heimes4d98ca92013-08-19 17:36:29 +02005908#if OPENSSL_VERSION_NUMBER >= 0x10000000
5909 CRYPTO_THREADID_set_callback(_ssl_threadid_callback);
5910#else
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00005911 CRYPTO_set_id_callback(_ssl_thread_id_function);
Christian Heimes4d98ca92013-08-19 17:36:29 +02005912#endif
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00005913 }
5914 return 1;
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005915}
5916
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02005917#endif /* HAVE_OPENSSL_CRYPTO_LOCK for OpenSSL < 1.1.0 */
Thomas Wouters1b7f8912007-09-19 03:06:30 +00005918
Christian Heimes5c36da72020-11-20 09:40:12 +01005919static int
5920sslmodule_init_types(PyObject *module)
5921{
5922 PySSLContext_Type = (PyTypeObject *)PyType_FromModuleAndSpec(
5923 module, &PySSLContext_spec, NULL
5924 );
5925 if (PySSLContext_Type == NULL)
5926 return -1;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005927
Christian Heimes5c36da72020-11-20 09:40:12 +01005928 PySSLSocket_Type = (PyTypeObject *)PyType_FromModuleAndSpec(
5929 module, &PySSLSocket_spec, NULL
5930 );
5931 if (PySSLSocket_Type == NULL)
5932 return -1;
Martin v. Löwis1a214512008-06-11 05:26:20 +00005933
Christian Heimes5c36da72020-11-20 09:40:12 +01005934 PySSLMemoryBIO_Type = (PyTypeObject *)PyType_FromModuleAndSpec(
5935 module, &PySSLMemoryBIO_spec, NULL
5936 );
5937 if (PySSLMemoryBIO_Type == NULL)
5938 return -1;
Martin v. Löwis1a214512008-06-11 05:26:20 +00005939
Christian Heimes5c36da72020-11-20 09:40:12 +01005940 PySSLSession_Type = (PyTypeObject *)PyType_FromModuleAndSpec(
5941 module, &PySSLSession_spec, NULL
5942 );
5943 if (PySSLSession_Type == NULL)
5944 return -1;
5945
5946 if (PyModule_AddType(module, PySSLContext_Type))
5947 return -1;
5948 if (PyModule_AddType(module, PySSLSocket_Type))
5949 return -1;
5950 if (PyModule_AddType(module, PySSLMemoryBIO_Type))
5951 return -1;
5952 if (PyModule_AddType(module, PySSLSession_Type))
5953 return -1;
5954
5955 return 0;
5956}
5957
5958static int
5959sslmodule_init_exceptions(PyObject *module)
5960{
5961 PyObject *bases = NULL;
5962
5963#define add_exception(exc, name, doc, base) \
5964do { \
5965 (exc) = PyErr_NewExceptionWithDoc("ssl." name, (doc), (base), NULL); \
5966 if ((exc) == NULL) goto error; \
5967 if (PyModule_AddObjectRef(module, name, exc) < 0) goto error; \
5968} while(0)
5969
Serhiy Storchaka686c2032020-11-22 13:25:02 +02005970 PySSLErrorObject = PyType_FromSpecWithBases(&sslerror_type_spec, PyExc_OSError);
Christian Heimes5c36da72020-11-20 09:40:12 +01005971 if (PySSLErrorObject == NULL) {
5972 goto error;
5973 }
5974 if (PyModule_AddObjectRef(module, "SSLError", PySSLErrorObject) < 0) {
5975 goto error;
5976 }
5977
5978 /* ssl.CertificateError used to be a subclass of ValueError */
5979 bases = PyTuple_Pack(2, PySSLErrorObject, PyExc_ValueError);
5980 if (bases == NULL) {
5981 goto error;
5982 }
5983 add_exception(
5984 PySSLCertVerificationErrorObject,
5985 "SSLCertVerificationError",
5986 SSLCertVerificationError_doc,
5987 bases
5988 );
5989 Py_CLEAR(bases);
5990
5991 add_exception(
5992 PySSLZeroReturnErrorObject,
5993 "SSLZeroReturnError",
5994 SSLZeroReturnError_doc,
5995 PySSLErrorObject
5996 );
5997
5998 add_exception(
5999 PySSLWantWriteErrorObject,
6000 "SSLWantWriteError",
6001 SSLWantWriteError_doc,
6002 PySSLErrorObject
6003 );
6004
6005 add_exception(
6006 PySSLWantReadErrorObject,
6007 "SSLWantReadError",
6008 SSLWantReadError_doc,
6009 PySSLErrorObject
6010 );
6011
6012 add_exception(
6013 PySSLSyscallErrorObject,
6014 "SSLSyscallError",
6015 SSLSyscallError_doc,
6016 PySSLErrorObject
6017 );
6018
6019 add_exception(
6020 PySSLEOFErrorObject,
6021 "SSLEOFError",
6022 SSLEOFError_doc,
6023 PySSLErrorObject
6024 );
6025#undef add_exception
6026
6027 return 0;
6028 error:
6029 Py_XDECREF(bases);
6030 return -1;
6031}
6032
6033static int
6034sslmodule_init_socketapi(PyObject *module)
6035{
6036 PySocketModule_APIObject *socket_api;
6037
6038 /* Load _socket module and its C API */
6039 socket_api = PySocketModule_ImportModuleAndAPI();
6040 if (socket_api == NULL)
6041 return -1;
6042 PySocketModule = *socket_api;
6043
6044 return 0;
6045}
6046
6047static int
6048sslmodule_init_errorcodes(PyObject *module)
6049{
6050 struct py_ssl_error_code *errcode;
6051 struct py_ssl_library_code *libcode;
6052
6053 /* Mappings for error codes */
6054 err_codes_to_names = PyDict_New();
6055 if (err_codes_to_names == NULL)
6056 return -1;
6057 err_names_to_codes = PyDict_New();
6058 if (err_names_to_codes == NULL)
6059 return -1;
6060 lib_codes_to_names = PyDict_New();
6061 if (lib_codes_to_names == NULL)
6062 return -1;
6063
6064 errcode = error_codes;
6065 while (errcode->mnemonic != NULL) {
6066 PyObject *mnemo, *key;
6067 mnemo = PyUnicode_FromString(errcode->mnemonic);
6068 key = Py_BuildValue("ii", errcode->library, errcode->reason);
6069 if (mnemo == NULL || key == NULL)
6070 return -1;
6071 if (PyDict_SetItem(err_codes_to_names, key, mnemo))
6072 return -1;
6073 if (PyDict_SetItem(err_names_to_codes, mnemo, key))
6074 return -1;
6075 Py_DECREF(key);
6076 Py_DECREF(mnemo);
6077 errcode++;
6078 }
6079
6080 libcode = library_codes;
6081 while (libcode->library != NULL) {
6082 PyObject *mnemo, *key;
6083 key = PyLong_FromLong(libcode->code);
6084 mnemo = PyUnicode_FromString(libcode->library);
6085 if (key == NULL || mnemo == NULL)
6086 return -1;
6087 if (PyDict_SetItem(lib_codes_to_names, key, mnemo))
6088 return -1;
6089 Py_DECREF(key);
6090 Py_DECREF(mnemo);
6091 libcode++;
6092 }
6093
6094 if (PyModule_AddObject(module, "err_codes_to_names", err_codes_to_names))
6095 return -1;
6096 if (PyModule_AddObject(module, "err_names_to_codes", err_names_to_codes))
6097 return -1;
6098 if (PyModule_AddObject(module, "lib_codes_to_names", lib_codes_to_names))
6099 return -1;
6100
6101 return 0;
6102}
Antoine Pitroub9ac25d2011-07-08 18:47:06 +02006103
6104static void
6105parse_openssl_version(unsigned long libver,
6106 unsigned int *major, unsigned int *minor,
6107 unsigned int *fix, unsigned int *patch,
6108 unsigned int *status)
6109{
6110 *status = libver & 0xF;
6111 libver >>= 4;
6112 *patch = libver & 0xFF;
6113 libver >>= 8;
6114 *fix = libver & 0xFF;
6115 libver >>= 8;
6116 *minor = libver & 0xFF;
6117 libver >>= 8;
6118 *major = libver & 0xFF;
6119}
6120
Christian Heimes5c36da72020-11-20 09:40:12 +01006121static int
6122sslmodule_init_versioninfo(PyObject *m)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006123{
Christian Heimes5c36da72020-11-20 09:40:12 +01006124 PyObject *r;
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00006125 unsigned long libver;
6126 unsigned int major, minor, fix, patch, status;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006127
Christian Heimes5c36da72020-11-20 09:40:12 +01006128 /* OpenSSL version */
6129 /* SSLeay() gives us the version of the library linked against,
6130 which could be different from the headers version.
6131 */
6132 libver = OpenSSL_version_num();
6133 r = PyLong_FromUnsignedLong(libver);
6134 if (r == NULL || PyModule_AddObject(m, "OPENSSL_VERSION_NUMBER", r))
6135 return -1;
Christian Heimes99a65702016-09-10 23:44:53 +02006136
Christian Heimes5c36da72020-11-20 09:40:12 +01006137 parse_openssl_version(libver, &major, &minor, &fix, &patch, &status);
6138 r = Py_BuildValue("IIIII", major, minor, fix, patch, status);
6139 if (r == NULL || PyModule_AddObject(m, "OPENSSL_VERSION_INFO", r))
6140 return -1;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006141
Christian Heimes5c36da72020-11-20 09:40:12 +01006142 r = PyUnicode_FromString(OpenSSL_version(OPENSSL_VERSION));
6143 if (r == NULL || PyModule_AddObject(m, "OPENSSL_VERSION", r))
6144 return -1;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006145
Christian Heimes5c36da72020-11-20 09:40:12 +01006146 libver = OPENSSL_VERSION_NUMBER;
6147 parse_openssl_version(libver, &major, &minor, &fix, &patch, &status);
6148 r = Py_BuildValue("IIIII", major, minor, fix, patch, status);
6149 if (r == NULL || PyModule_AddObject(m, "_OPENSSL_API_VERSION", r))
6150 return -1;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006151
Christian Heimes5c36da72020-11-20 09:40:12 +01006152 return 0;
6153}
Christian Heimesc941e622017-09-05 15:47:11 +02006154
Christian Heimes5c36da72020-11-20 09:40:12 +01006155static int
6156sslmodule_init_constants(PyObject *m)
6157{
Christian Heimes892d66e2018-01-29 14:10:18 +01006158 PyModule_AddStringConstant(m, "_DEFAULT_CIPHERS",
6159 PY_SSL_DEFAULT_CIPHER_STRING);
6160
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00006161 PyModule_AddIntConstant(m, "SSL_ERROR_ZERO_RETURN",
6162 PY_SSL_ERROR_ZERO_RETURN);
6163 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_READ",
6164 PY_SSL_ERROR_WANT_READ);
6165 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_WRITE",
6166 PY_SSL_ERROR_WANT_WRITE);
6167 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_X509_LOOKUP",
6168 PY_SSL_ERROR_WANT_X509_LOOKUP);
6169 PyModule_AddIntConstant(m, "SSL_ERROR_SYSCALL",
6170 PY_SSL_ERROR_SYSCALL);
6171 PyModule_AddIntConstant(m, "SSL_ERROR_SSL",
6172 PY_SSL_ERROR_SSL);
6173 PyModule_AddIntConstant(m, "SSL_ERROR_WANT_CONNECT",
6174 PY_SSL_ERROR_WANT_CONNECT);
6175 /* non ssl.h errorcodes */
6176 PyModule_AddIntConstant(m, "SSL_ERROR_EOF",
6177 PY_SSL_ERROR_EOF);
6178 PyModule_AddIntConstant(m, "SSL_ERROR_INVALID_ERROR_CODE",
6179 PY_SSL_ERROR_INVALID_ERROR_CODE);
6180 /* cert requirements */
6181 PyModule_AddIntConstant(m, "CERT_NONE",
6182 PY_SSL_CERT_NONE);
6183 PyModule_AddIntConstant(m, "CERT_OPTIONAL",
6184 PY_SSL_CERT_OPTIONAL);
6185 PyModule_AddIntConstant(m, "CERT_REQUIRED",
6186 PY_SSL_CERT_REQUIRED);
Christian Heimes22587792013-11-21 23:56:13 +01006187 /* CRL verification for verification_flags */
6188 PyModule_AddIntConstant(m, "VERIFY_DEFAULT",
6189 0);
6190 PyModule_AddIntConstant(m, "VERIFY_CRL_CHECK_LEAF",
6191 X509_V_FLAG_CRL_CHECK);
6192 PyModule_AddIntConstant(m, "VERIFY_CRL_CHECK_CHAIN",
6193 X509_V_FLAG_CRL_CHECK|X509_V_FLAG_CRL_CHECK_ALL);
6194 PyModule_AddIntConstant(m, "VERIFY_X509_STRICT",
6195 X509_V_FLAG_X509_STRICT);
Chris Burre0b4aa02021-03-18 09:24:01 +01006196 PyModule_AddIntConstant(m, "VERIFY_ALLOW_PROXY_CERTS",
6197 X509_V_FLAG_ALLOW_PROXY_CERTS);
Benjamin Peterson990fcaa2015-03-04 22:49:41 -05006198#ifdef X509_V_FLAG_TRUSTED_FIRST
6199 PyModule_AddIntConstant(m, "VERIFY_X509_TRUSTED_FIRST",
6200 X509_V_FLAG_TRUSTED_FIRST);
6201#endif
Martin v. Löwis6af3e2d2002-04-20 07:47:40 +00006202
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01006203 /* Alert Descriptions from ssl.h */
6204 /* note RESERVED constants no longer intended for use have been removed */
6205 /* http://www.iana.org/assignments/tls-parameters/tls-parameters.xml#tls-parameters-6 */
6206
6207#define ADD_AD_CONSTANT(s) \
6208 PyModule_AddIntConstant(m, "ALERT_DESCRIPTION_"#s, \
6209 SSL_AD_##s)
6210
6211 ADD_AD_CONSTANT(CLOSE_NOTIFY);
6212 ADD_AD_CONSTANT(UNEXPECTED_MESSAGE);
6213 ADD_AD_CONSTANT(BAD_RECORD_MAC);
6214 ADD_AD_CONSTANT(RECORD_OVERFLOW);
6215 ADD_AD_CONSTANT(DECOMPRESSION_FAILURE);
6216 ADD_AD_CONSTANT(HANDSHAKE_FAILURE);
6217 ADD_AD_CONSTANT(BAD_CERTIFICATE);
6218 ADD_AD_CONSTANT(UNSUPPORTED_CERTIFICATE);
6219 ADD_AD_CONSTANT(CERTIFICATE_REVOKED);
6220 ADD_AD_CONSTANT(CERTIFICATE_EXPIRED);
6221 ADD_AD_CONSTANT(CERTIFICATE_UNKNOWN);
6222 ADD_AD_CONSTANT(ILLEGAL_PARAMETER);
6223 ADD_AD_CONSTANT(UNKNOWN_CA);
6224 ADD_AD_CONSTANT(ACCESS_DENIED);
6225 ADD_AD_CONSTANT(DECODE_ERROR);
6226 ADD_AD_CONSTANT(DECRYPT_ERROR);
6227 ADD_AD_CONSTANT(PROTOCOL_VERSION);
6228 ADD_AD_CONSTANT(INSUFFICIENT_SECURITY);
6229 ADD_AD_CONSTANT(INTERNAL_ERROR);
6230 ADD_AD_CONSTANT(USER_CANCELLED);
6231 ADD_AD_CONSTANT(NO_RENEGOTIATION);
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01006232 /* Not all constants are in old OpenSSL versions */
Antoine Pitrou912fbff2013-03-30 16:29:32 +01006233#ifdef SSL_AD_UNSUPPORTED_EXTENSION
6234 ADD_AD_CONSTANT(UNSUPPORTED_EXTENSION);
6235#endif
6236#ifdef SSL_AD_CERTIFICATE_UNOBTAINABLE
6237 ADD_AD_CONSTANT(CERTIFICATE_UNOBTAINABLE);
6238#endif
6239#ifdef SSL_AD_UNRECOGNIZED_NAME
6240 ADD_AD_CONSTANT(UNRECOGNIZED_NAME);
6241#endif
Antoine Pitrou58ddc9d2013-01-05 21:20:29 +01006242#ifdef SSL_AD_BAD_CERTIFICATE_STATUS_RESPONSE
6243 ADD_AD_CONSTANT(BAD_CERTIFICATE_STATUS_RESPONSE);
6244#endif
6245#ifdef SSL_AD_BAD_CERTIFICATE_HASH_VALUE
6246 ADD_AD_CONSTANT(BAD_CERTIFICATE_HASH_VALUE);
6247#endif
6248#ifdef SSL_AD_UNKNOWN_PSK_IDENTITY
6249 ADD_AD_CONSTANT(UNKNOWN_PSK_IDENTITY);
6250#endif
6251
6252#undef ADD_AD_CONSTANT
6253
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00006254 /* protocol versions */
Victor Stinner3de49192011-05-09 00:42:58 +02006255#ifndef OPENSSL_NO_SSL2
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00006256 PyModule_AddIntConstant(m, "PROTOCOL_SSLv2",
6257 PY_SSL_VERSION_SSL2);
Victor Stinner3de49192011-05-09 00:42:58 +02006258#endif
Benjamin Petersone32467c2014-12-05 21:59:35 -05006259#ifndef OPENSSL_NO_SSL3
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00006260 PyModule_AddIntConstant(m, "PROTOCOL_SSLv3",
6261 PY_SSL_VERSION_SSL3);
Benjamin Petersone32467c2014-12-05 21:59:35 -05006262#endif
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00006263 PyModule_AddIntConstant(m, "PROTOCOL_SSLv23",
Christian Heimes598894f2016-09-05 23:19:05 +02006264 PY_SSL_VERSION_TLS);
6265 PyModule_AddIntConstant(m, "PROTOCOL_TLS",
6266 PY_SSL_VERSION_TLS);
Christian Heimes5fe668c2016-09-12 00:01:11 +02006267 PyModule_AddIntConstant(m, "PROTOCOL_TLS_CLIENT",
6268 PY_SSL_VERSION_TLS_CLIENT);
6269 PyModule_AddIntConstant(m, "PROTOCOL_TLS_SERVER",
6270 PY_SSL_VERSION_TLS_SERVER);
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00006271 PyModule_AddIntConstant(m, "PROTOCOL_TLSv1",
6272 PY_SSL_VERSION_TLS1);
Antoine Pitrou2463e5f2013-03-28 22:24:43 +01006273 PyModule_AddIntConstant(m, "PROTOCOL_TLSv1_1",
6274 PY_SSL_VERSION_TLS1_1);
6275 PyModule_AddIntConstant(m, "PROTOCOL_TLSv1_2",
6276 PY_SSL_VERSION_TLS1_2);
Antoine Pitrou04f6a322010-04-05 21:40:07 +00006277
Antoine Pitroub5218772010-05-21 09:56:06 +00006278 /* protocol options */
Antoine Pitrou3f366312012-01-27 09:50:45 +01006279 PyModule_AddIntConstant(m, "OP_ALL",
6280 SSL_OP_ALL & ~SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS);
Antoine Pitroub5218772010-05-21 09:56:06 +00006281 PyModule_AddIntConstant(m, "OP_NO_SSLv2", SSL_OP_NO_SSLv2);
6282 PyModule_AddIntConstant(m, "OP_NO_SSLv3", SSL_OP_NO_SSLv3);
6283 PyModule_AddIntConstant(m, "OP_NO_TLSv1", SSL_OP_NO_TLSv1);
Antoine Pitrou2463e5f2013-03-28 22:24:43 +01006284 PyModule_AddIntConstant(m, "OP_NO_TLSv1_1", SSL_OP_NO_TLSv1_1);
6285 PyModule_AddIntConstant(m, "OP_NO_TLSv1_2", SSL_OP_NO_TLSv1_2);
Christian Heimescb5b68a2017-09-07 18:07:00 -07006286#ifdef SSL_OP_NO_TLSv1_3
6287 PyModule_AddIntConstant(m, "OP_NO_TLSv1_3", SSL_OP_NO_TLSv1_3);
6288#else
6289 PyModule_AddIntConstant(m, "OP_NO_TLSv1_3", 0);
6290#endif
Antoine Pitrou6db49442011-12-19 13:27:11 +01006291 PyModule_AddIntConstant(m, "OP_CIPHER_SERVER_PREFERENCE",
6292 SSL_OP_CIPHER_SERVER_PREFERENCE);
Antoine Pitrou0e576f12011-12-22 10:03:38 +01006293 PyModule_AddIntConstant(m, "OP_SINGLE_DH_USE", SSL_OP_SINGLE_DH_USE);
Christian Heimes99a65702016-09-10 23:44:53 +02006294 PyModule_AddIntConstant(m, "OP_NO_TICKET", SSL_OP_NO_TICKET);
Antoine Pitroue9fccb32012-02-17 11:53:10 +01006295#ifdef SSL_OP_SINGLE_ECDH_USE
Antoine Pitrou923df6f2011-12-19 17:16:51 +01006296 PyModule_AddIntConstant(m, "OP_SINGLE_ECDH_USE", SSL_OP_SINGLE_ECDH_USE);
Antoine Pitroue9fccb32012-02-17 11:53:10 +01006297#endif
Antoine Pitrou8abdb8a2011-12-20 10:13:40 +01006298#ifdef SSL_OP_NO_COMPRESSION
6299 PyModule_AddIntConstant(m, "OP_NO_COMPRESSION",
6300 SSL_OP_NO_COMPRESSION);
6301#endif
Christian Heimes05d9fe32018-02-27 08:55:39 +01006302#ifdef SSL_OP_ENABLE_MIDDLEBOX_COMPAT
6303 PyModule_AddIntConstant(m, "OP_ENABLE_MIDDLEBOX_COMPAT",
6304 SSL_OP_ENABLE_MIDDLEBOX_COMPAT);
6305#endif
Christian Heimes67c48012018-05-15 16:25:40 -04006306#ifdef SSL_OP_NO_RENEGOTIATION
6307 PyModule_AddIntConstant(m, "OP_NO_RENEGOTIATION",
6308 SSL_OP_NO_RENEGOTIATION);
6309#endif
Antoine Pitroub5218772010-05-21 09:56:06 +00006310
Christian Heimes61d478c2018-01-27 15:51:38 +01006311#ifdef X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT
6312 PyModule_AddIntConstant(m, "HOSTFLAG_ALWAYS_CHECK_SUBJECT",
6313 X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT);
6314#endif
6315#ifdef X509_CHECK_FLAG_NEVER_CHECK_SUBJECT
6316 PyModule_AddIntConstant(m, "HOSTFLAG_NEVER_CHECK_SUBJECT",
6317 X509_CHECK_FLAG_NEVER_CHECK_SUBJECT);
6318#endif
6319#ifdef X509_CHECK_FLAG_NO_WILDCARDS
6320 PyModule_AddIntConstant(m, "HOSTFLAG_NO_WILDCARDS",
6321 X509_CHECK_FLAG_NO_WILDCARDS);
6322#endif
6323#ifdef X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS
6324 PyModule_AddIntConstant(m, "HOSTFLAG_NO_PARTIAL_WILDCARDS",
6325 X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS);
6326#endif
6327#ifdef X509_CHECK_FLAG_MULTI_LABEL_WILDCARDS
6328 PyModule_AddIntConstant(m, "HOSTFLAG_MULTI_LABEL_WILDCARDS",
6329 X509_CHECK_FLAG_MULTI_LABEL_WILDCARDS);
6330#endif
6331#ifdef X509_CHECK_FLAG_SINGLE_LABEL_SUBDOMAINS
6332 PyModule_AddIntConstant(m, "HOSTFLAG_SINGLE_LABEL_SUBDOMAINS",
6333 X509_CHECK_FLAG_SINGLE_LABEL_SUBDOMAINS);
6334#endif
6335
Christian Heimes698dde12018-02-27 11:54:43 +01006336 /* protocol versions */
6337 PyModule_AddIntConstant(m, "PROTO_MINIMUM_SUPPORTED",
6338 PY_PROTO_MINIMUM_SUPPORTED);
6339 PyModule_AddIntConstant(m, "PROTO_MAXIMUM_SUPPORTED",
6340 PY_PROTO_MAXIMUM_SUPPORTED);
6341 PyModule_AddIntConstant(m, "PROTO_SSLv3", PY_PROTO_SSLv3);
6342 PyModule_AddIntConstant(m, "PROTO_TLSv1", PY_PROTO_TLSv1);
6343 PyModule_AddIntConstant(m, "PROTO_TLSv1_1", PY_PROTO_TLSv1_1);
6344 PyModule_AddIntConstant(m, "PROTO_TLSv1_2", PY_PROTO_TLSv1_2);
6345 PyModule_AddIntConstant(m, "PROTO_TLSv1_3", PY_PROTO_TLSv1_3);
Antoine Pitroud5323212010-10-22 18:19:07 +00006346
Victor Stinnerb37672d2018-11-22 03:37:50 +01006347#define addbool(m, key, value) \
6348 do { \
6349 PyObject *bool_obj = (value) ? Py_True : Py_False; \
6350 Py_INCREF(bool_obj); \
6351 PyModule_AddObject((m), (key), bool_obj); \
6352 } while (0)
Christian Heimes698dde12018-02-27 11:54:43 +01006353
6354#if HAVE_SNI
6355 addbool(m, "HAS_SNI", 1);
Antoine Pitrou501da612011-12-21 09:27:41 +01006356#else
Christian Heimes698dde12018-02-27 11:54:43 +01006357 addbool(m, "HAS_SNI", 0);
Antoine Pitrou501da612011-12-21 09:27:41 +01006358#endif
Christian Heimes698dde12018-02-27 11:54:43 +01006359
6360 addbool(m, "HAS_TLS_UNIQUE", 1);
6361
6362#ifndef OPENSSL_NO_ECDH
6363 addbool(m, "HAS_ECDH", 1);
6364#else
6365 addbool(m, "HAS_ECDH", 0);
6366#endif
Antoine Pitrou501da612011-12-21 09:27:41 +01006367
Christian Heimes29eab552018-02-25 12:31:33 +01006368#if HAVE_NPN
Christian Heimes698dde12018-02-27 11:54:43 +01006369 addbool(m, "HAS_NPN", 1);
Antoine Pitroud5d17eb2012-03-22 00:23:03 +01006370#else
Christian Heimes698dde12018-02-27 11:54:43 +01006371 addbool(m, "HAS_NPN", 0);
Antoine Pitroud5d17eb2012-03-22 00:23:03 +01006372#endif
Antoine Pitroud5d17eb2012-03-22 00:23:03 +01006373
Christian Heimes29eab552018-02-25 12:31:33 +01006374#if HAVE_ALPN
Christian Heimes698dde12018-02-27 11:54:43 +01006375 addbool(m, "HAS_ALPN", 1);
Benjamin Petersoncca27322015-01-23 16:35:37 -05006376#else
Christian Heimes698dde12018-02-27 11:54:43 +01006377 addbool(m, "HAS_ALPN", 0);
Benjamin Petersoncca27322015-01-23 16:35:37 -05006378#endif
Christian Heimes698dde12018-02-27 11:54:43 +01006379
6380#if defined(SSL2_VERSION) && !defined(OPENSSL_NO_SSL2)
6381 addbool(m, "HAS_SSLv2", 1);
6382#else
6383 addbool(m, "HAS_SSLv2", 0);
6384#endif
6385
6386#if defined(SSL3_VERSION) && !defined(OPENSSL_NO_SSL3)
6387 addbool(m, "HAS_SSLv3", 1);
6388#else
6389 addbool(m, "HAS_SSLv3", 0);
6390#endif
6391
6392#if defined(TLS1_VERSION) && !defined(OPENSSL_NO_TLS1)
6393 addbool(m, "HAS_TLSv1", 1);
6394#else
6395 addbool(m, "HAS_TLSv1", 0);
6396#endif
6397
6398#if defined(TLS1_1_VERSION) && !defined(OPENSSL_NO_TLS1_1)
6399 addbool(m, "HAS_TLSv1_1", 1);
6400#else
6401 addbool(m, "HAS_TLSv1_1", 0);
6402#endif
6403
6404#if defined(TLS1_2_VERSION) && !defined(OPENSSL_NO_TLS1_2)
6405 addbool(m, "HAS_TLSv1_2", 1);
6406#else
6407 addbool(m, "HAS_TLSv1_2", 0);
6408#endif
Benjamin Petersoncca27322015-01-23 16:35:37 -05006409
Christian Heimescb5b68a2017-09-07 18:07:00 -07006410#if defined(TLS1_3_VERSION) && !defined(OPENSSL_NO_TLS1_3)
Christian Heimes698dde12018-02-27 11:54:43 +01006411 addbool(m, "HAS_TLSv1_3", 1);
Christian Heimescb5b68a2017-09-07 18:07:00 -07006412#else
Christian Heimes698dde12018-02-27 11:54:43 +01006413 addbool(m, "HAS_TLSv1_3", 0);
Christian Heimescb5b68a2017-09-07 18:07:00 -07006414#endif
Christian Heimescb5b68a2017-09-07 18:07:00 -07006415
Christian Heimes5c36da72020-11-20 09:40:12 +01006416 return 0;
6417}
6418
6419static int
6420sslmodule_legacy(PyObject *module)
6421{
6422#ifndef OPENSSL_VERSION_1_1
6423 /* Load all algorithms and initialize cpuid */
6424 OPENSSL_add_all_algorithms_noconf();
6425 /* Init OpenSSL */
6426 SSL_load_error_strings();
6427 SSL_library_init();
6428#endif
6429
6430#ifdef HAVE_OPENSSL_CRYPTO_LOCK
6431 /* note that this will start threading if not already started */
6432 if (!_setup_ssl_threads()) {
Pablo Galindo93a0ef72020-12-02 06:07:56 +00006433 return 0;
Antoine Pitrou3b36fb12012-06-22 21:11:52 +02006434 }
Christian Heimes5c36da72020-11-20 09:40:12 +01006435#elif OPENSSL_VERSION_1_1
6436 /* OpenSSL 1.1.0 builtin thread support is enabled */
6437 _ssl_locks_count++;
6438#endif
6439 return 0;
6440}
6441
6442PyDoc_STRVAR(module_doc,
6443"Implementation module for SSL socket operations. See the socket module\n\
6444for documentation.");
6445
6446
6447static struct PyModuleDef _sslmodule = {
6448 PyModuleDef_HEAD_INIT,
6449 "_ssl",
6450 module_doc,
6451 -1,
6452 PySSL_methods,
6453 NULL,
6454 NULL,
6455 NULL,
6456 NULL
6457};
6458
6459PyMODINIT_FUNC
6460PyInit__ssl(void)
6461{
6462 PyObject *m;
6463
6464 m = PyModule_Create(&_sslmodule);
6465 if (m == NULL)
Antoine Pitrou3b36fb12012-06-22 21:11:52 +02006466 return NULL;
6467
Christian Heimes5c36da72020-11-20 09:40:12 +01006468 if (sslmodule_init_types(m) != 0)
Antoine Pitrou3b36fb12012-06-22 21:11:52 +02006469 return NULL;
Christian Heimes5c36da72020-11-20 09:40:12 +01006470 if (sslmodule_init_exceptions(m) != 0)
Antoine Pitrou3b36fb12012-06-22 21:11:52 +02006471 return NULL;
Christian Heimes5c36da72020-11-20 09:40:12 +01006472 if (sslmodule_init_socketapi(m) != 0)
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00006473 return NULL;
Christian Heimes5c36da72020-11-20 09:40:12 +01006474 if (sslmodule_init_errorcodes(m) != 0)
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00006475 return NULL;
Christian Heimes5c36da72020-11-20 09:40:12 +01006476 if (sslmodule_init_constants(m) != 0)
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00006477 return NULL;
Christian Heimes5c36da72020-11-20 09:40:12 +01006478 if (sslmodule_init_versioninfo(m) != 0)
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00006479 return NULL;
Christian Heimes5c36da72020-11-20 09:40:12 +01006480 if (sslmodule_legacy(m) != 0)
Antoine Pitroub9ac25d2011-07-08 18:47:06 +02006481 return NULL;
6482
Antoine Pitroucbb82eb2010-05-05 15:57:33 +00006483 return m;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006484}