mirror of
https://github.com/python/cpython.git
synced 2025-08-04 00:48:58 +00:00
[3.11] gh-96931: Fix incorrect results in ssl.SSLSocket.shared_ciphers (GH-96932) (#102918)
gh-96931: Fix incorrect results in ssl.SSLSocket.shared_ciphers (GH-96932)
(cherry picked from commit af9c34f6ef
)
Co-authored-by: Benjamin Fogle <benfogle@gmail.com>
This commit is contained in:
parent
fd43fb6996
commit
e075631f67
4 changed files with 33 additions and 12 deletions
|
@ -2000,24 +2000,44 @@ static PyObject *
|
|||
_ssl__SSLSocket_shared_ciphers_impl(PySSLSocket *self)
|
||||
/*[clinic end generated code: output=3d174ead2e42c4fd input=0bfe149da8fe6306]*/
|
||||
{
|
||||
STACK_OF(SSL_CIPHER) *ciphers;
|
||||
int i;
|
||||
STACK_OF(SSL_CIPHER) *server_ciphers;
|
||||
STACK_OF(SSL_CIPHER) *client_ciphers;
|
||||
int i, len;
|
||||
PyObject *res;
|
||||
const SSL_CIPHER* cipher;
|
||||
|
||||
ciphers = SSL_get_ciphers(self->ssl);
|
||||
if (!ciphers)
|
||||
/* Rather than use SSL_get_shared_ciphers, we use an equivalent algorithm because:
|
||||
|
||||
1) It returns a colon seperated list of strings, in an undefined
|
||||
order, that we would have to post process back into tuples.
|
||||
2) It will return a truncated string with no indication that it has
|
||||
done so, if the buffer is too small.
|
||||
*/
|
||||
|
||||
server_ciphers = SSL_get_ciphers(self->ssl);
|
||||
if (!server_ciphers)
|
||||
Py_RETURN_NONE;
|
||||
res = PyList_New(sk_SSL_CIPHER_num(ciphers));
|
||||
client_ciphers = SSL_get_client_ciphers(self->ssl);
|
||||
if (!client_ciphers)
|
||||
Py_RETURN_NONE;
|
||||
|
||||
res = PyList_New(sk_SSL_CIPHER_num(server_ciphers));
|
||||
if (!res)
|
||||
return NULL;
|
||||
for (i = 0; i < sk_SSL_CIPHER_num(ciphers); i++) {
|
||||
PyObject *tup = cipher_to_tuple(sk_SSL_CIPHER_value(ciphers, i));
|
||||
len = 0;
|
||||
for (i = 0; i < sk_SSL_CIPHER_num(server_ciphers); i++) {
|
||||
cipher = sk_SSL_CIPHER_value(server_ciphers, i);
|
||||
if (sk_SSL_CIPHER_find(client_ciphers, cipher) < 0)
|
||||
continue;
|
||||
|
||||
PyObject *tup = cipher_to_tuple(cipher);
|
||||
if (!tup) {
|
||||
Py_DECREF(res);
|
||||
return NULL;
|
||||
}
|
||||
PyList_SET_ITEM(res, i, tup);
|
||||
PyList_SET_ITEM(res, len++, tup);
|
||||
}
|
||||
Py_SET_SIZE(res, len);
|
||||
return res;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue