Skip to content

Commit 72ed233

Browse files
authored
[2.7] bpo-30622: Change NPN detection: (GH-2079) (#3316)
* Change NPN detection: Version breakdown, support disabled (pre-patch/post-patch): - pre-1.0.1: OPENSSL_NPN_NEGOTIATED will not be defined -> False/False - 1.0.1 and 1.0.2: OPENSSL_NPN_NEGOTIATED will not be defined -> False/False - 1.1.0+: OPENSSL_NPN_NEGOTIATED will be defined and OPENSSL_NO_NEXTPROTONEG will be defined -> True/False Version breakdown support enabled (pre-patch/post-patch): - pre-1.0.1: OPENSSL_NPN_NEGOTIATED will not be defined -> False/False - 1.0.1 and 1.0.2: OPENSSL_NPN_NEGOTIATED will be defined and OPENSSL_NO_NEXTPROTONEG will not be defined -> True/True - 1.1.0+: OPENSSL_NPN_NEGOTIATED will be defined and OPENSSL_NO_NEXTPROTONEG will not be defined -> True/True * Refine NPN guard: - If NPN is disabled, but ALPN is available we need our callback - Make clinic's ssl behave the same way This created a working ssl module for me, with NPN disabled and ALPN enabled for OpenSSL 1.1.0f. Concerns to address: The initial commit for NPN support into OpenSSL [1], had the OPENSSL_NPN_* variables defined inside the OPENSSL_NO_NEXTPROTONEG guard. The question is if that ever made it into a release. This would need an ugly hack, something like: GH-if defined(OPENSSL_NO_NEXTPROTONEG) && \ !defined(OPENSSL_NPN_NEGOTIATED) GH- define OPENSSL_NPN_UNSUPPORTED 0 GH- define OPENSSL_NPN_NEGOTIATED 1 GH- define OPENSSL_NPN_NO_OVERLAP 2 GH-endif [1] openssl/openssl@68b33cc5c7. (cherry picked from commit b2d096b)
1 parent 986b7ff commit 72ed233

File tree

1 file changed

+9
-7
lines changed

1 file changed

+9
-7
lines changed

Modules/_ssl.c

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -280,7 +280,7 @@ static unsigned int _ssl_locks_count = 0;
280280
typedef struct {
281281
PyObject_HEAD
282282
SSL_CTX *ctx;
283-
#ifdef OPENSSL_NPN_NEGOTIATED
283+
#if defined(OPENSSL_NPN_NEGOTIATED) && !defined(OPENSSL_NO_NEXTPROTONEG)
284284
unsigned char *npn_protocols;
285285
int npn_protocols_len;
286286
#endif
@@ -1502,7 +1502,7 @@ static PyObject *PySSL_version(PySSLSocket *self)
15021502
return PyUnicode_FromString(version);
15031503
}
15041504

1505-
#ifdef OPENSSL_NPN_NEGOTIATED
1505+
#if defined(OPENSSL_NPN_NEGOTIATED) && !defined(OPENSSL_NO_NEXTPROTONEG)
15061506
static PyObject *PySSL_selected_npn_protocol(PySSLSocket *self) {
15071507
const unsigned char *out;
15081508
unsigned int outlen;
@@ -2140,7 +2140,7 @@ context_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
21402140
return NULL;
21412141
}
21422142
self->ctx = ctx;
2143-
#ifdef OPENSSL_NPN_NEGOTIATED
2143+
#if defined(OPENSSL_NPN_NEGOTIATED) && !defined(OPENSSL_NO_NEXTPROTONEG)
21442144
self->npn_protocols = NULL;
21452145
#endif
21462146
#ifdef HAVE_ALPN
@@ -2218,7 +2218,7 @@ context_dealloc(PySSLContext *self)
22182218
PyObject_GC_UnTrack(self);
22192219
context_clear(self);
22202220
SSL_CTX_free(self->ctx);
2221-
#ifdef OPENSSL_NPN_NEGOTIATED
2221+
#if defined(OPENSSL_NPN_NEGOTIATED) && !defined(OPENSSL_NO_NEXTPROTONEG)
22222222
PyMem_FREE(self->npn_protocols);
22232223
#endif
22242224
#ifdef HAVE_ALPN
@@ -2248,7 +2248,7 @@ set_ciphers(PySSLContext *self, PyObject *args)
22482248
Py_RETURN_NONE;
22492249
}
22502250

2251-
#ifdef OPENSSL_NPN_NEGOTIATED
2251+
#if defined(OPENSSL_NPN_NEGOTIATED) && !defined(OPENSSL_NO_NEXTPROTONEG) || defined(HAVE_ALPN)
22522252
static int
22532253
do_protocol_selection(int alpn, unsigned char **out, unsigned char *outlen,
22542254
const unsigned char *server_protocols, unsigned int server_protocols_len,
@@ -2272,7 +2272,9 @@ do_protocol_selection(int alpn, unsigned char **out, unsigned char *outlen,
22722272

22732273
return SSL_TLSEXT_ERR_OK;
22742274
}
2275+
#endif
22752276

2277+
#if defined(OPENSSL_NPN_NEGOTIATED) && !defined(OPENSSL_NO_NEXTPROTONEG)
22762278
/* this callback gets passed to SSL_CTX_set_next_protos_advertise_cb */
22772279
static int
22782280
_advertiseNPN_cb(SSL *s,
@@ -2307,7 +2309,7 @@ _selectNPN_cb(SSL *s,
23072309
static PyObject *
23082310
_set_npn_protocols(PySSLContext *self, PyObject *args)
23092311
{
2310-
#ifdef OPENSSL_NPN_NEGOTIATED
2312+
#if defined(OPENSSL_NPN_NEGOTIATED) && !defined(OPENSSL_NO_NEXTPROTONEG)
23112313
Py_buffer protos;
23122314

23132315
if (!PyArg_ParseTuple(args, "s*:set_npn_protocols", &protos))
@@ -4305,7 +4307,7 @@ init_ssl(void)
43054307
Py_INCREF(r);
43064308
PyModule_AddObject(m, "HAS_ECDH", r);
43074309

4308-
#ifdef OPENSSL_NPN_NEGOTIATED
4310+
#if defined(OPENSSL_NPN_NEGOTIATED) && !defined(OPENSSL_NO_NEXTPROTONEG)
43094311
r = Py_True;
43104312
#else
43114313
r = Py_False;

0 commit comments

Comments
 (0)