Skip to content

gh-63284: Add support for TLS-PSK (pre-shared key) to the ssl module #103181

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 22 commits into from
Nov 27, 2023
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
9d0f6dc
gh-63284: Add support for TLS-PSK (pre-shared key) to the ssl module
grantramsay Mar 29, 2023
cfddf7b
Fix TLS-PSK for TLS 1.3
grantramsay Apr 3, 2023
603eeef
Merge branch 'main' into fix-issue-63284
arhadthedev May 14, 2023
18302e3
Decode TLS-PSK identities as UTF-8 rather than ASCII
grantramsay Jun 4, 2023
2efc876
Change TLS-PSK version added from 3.12 to 3.13
grantramsay Jun 4, 2023
a56784c
ReSTify NEWS.
gpshead Jun 5, 2023
7a1963d
Merge branch 'main' into fix-issue-63284
gpshead Jul 14, 2023
6f4100c
Set python exceptions raised during C callbacks as unraisable
grantramsay Jul 15, 2023
e4a97ec
Add NULL check for defensive coding
grantramsay Jul 15, 2023
3d75982
Get single value using PyBytes_AsStringAndSize
grantramsay Jul 15, 2023
539ed1f
Do not raise a decode exception if remote side sends invalid UTF-8 du…
grantramsay Jul 16, 2023
4634fc3
Free TLS-PSK callbacks when SSL context is deallocated
grantramsay Jul 16, 2023
d21c322
Use Py_XINCREF and Py_XDECREF for tidier NULL checking
grantramsay Jul 16, 2023
03fac4d
Check return value of SSL_CTX_use_psk_identity_hint
grantramsay Jul 16, 2023
3db3921
Update TLS-PSK documentation
grantramsay Jul 16, 2023
a75f3a7
Regenerate news entry to update the timestamp
grantramsay Jul 16, 2023
851a1e5
Merge branch 'main' into fix-issue-63284
gpshead Nov 26, 2023
4c68974
Update example key strings in the doc.
gpshead Nov 26, 2023
0fb8a3e
Update TLS-PSK documentation
grantramsay Nov 26, 2023
7788589
Regenerate news entry to update the timestamp
grantramsay Nov 26, 2023
11735b9
Code defensively around `z#` vs NULL and 0 length.
gpshead Nov 27, 2023
ad8b249
Merge branch 'fix-issue-63284' of https://github.com/grantramsay/cpyt…
gpshead Nov 27, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Fix TLS-PSK for TLS 1.3
SSL_CTX_set_session_id_context() is a server-side only operation.
Using this on the client-side is causing authentication errors
  • Loading branch information
grantramsay committed Apr 3, 2023
commit cfddf7b858716c7dc1520e38c29d5cb6773a4ba2
9 changes: 9 additions & 0 deletions Doc/library/ssl.rst
Original file line number Diff line number Diff line change
Expand Up @@ -2003,6 +2003,12 @@ to speed up repeated connections from the same clients.

Setting ``callback`` to :const:`None` removes any existing callback.

.. note::
When using TLS 1.3:

- the ``hint`` parameter is always :const:`None`.
- client-identity must be a non-empty string.

Example usage::

context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
Expand Down Expand Up @@ -2041,6 +2047,9 @@ to speed up repeated connections from the same clients.

The parameter ``identity_hint`` is an optional identity hint sent to the client.

.. note::
When using TLS 1.3 the ``identity_hint`` parameter is not sent to the client.

Example usage::

context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
Expand Down
32 changes: 32 additions & 0 deletions Lib/test/test_ssl.py
Original file line number Diff line number Diff line change
Expand Up @@ -4259,6 +4259,38 @@ def server_callback(identity):
with self.assertRaisesRegex(ssl.SSLError, 'Cannot add PSK client callback'):
server_context.set_psk_client_callback(client_callback)

@requires_tls_version('TLSv1_3')
def test_psk_tls1_3(self):
psk = bytes.fromhex('deadbeef')
identity_hint = 'identity-hint'
client_identity = 'client-identity'

def client_callback(hint):
# identity_hint is not sent to the client in TLS 1.3
self.assertIsNone(hint)
return client_identity, psk

def server_callback(identity):
self.assertEqual(identity, client_identity)
return psk

client_context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
client_context.check_hostname = False
client_context.verify_mode = ssl.CERT_NONE
client_context.minimum_version = ssl.TLSVersion.TLSv1_3
client_context.set_ciphers('PSK')
client_context.set_psk_client_callback(client_callback)

server_context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
server_context.minimum_version = ssl.TLSVersion.TLSv1_3
server_context.set_ciphers('PSK')
server_context.set_psk_server_callback(server_callback, identity_hint)

server = ThreadedEchoServer(context=server_context)
with server:
with client_context.wrap_socket(socket.socket()) as s:
s.connect((HOST, server.port))


@unittest.skipUnless(has_tls_version('TLSv1_3'), "Test needs TLS 1.3")
class TestPostHandshakeAuth(unittest.TestCase):
Expand Down
8 changes: 6 additions & 2 deletions Modules/_ssl.c
Original file line number Diff line number Diff line change
Expand Up @@ -3171,10 +3171,14 @@ _ssl__SSLContext_impl(PyTypeObject *type, int proto_version)
usage for no cost at all. */
SSL_CTX_set_mode(self->ctx, SSL_MODE_RELEASE_BUFFERS);

/* Setting the session id context is a server-side only operation.
* It can cause unexpected behaviour on client-side connections. */
if (proto_version == PY_SSL_VERSION_TLS_SERVER) {
#define SID_CTX "Python"
SSL_CTX_set_session_id_context(self->ctx, (const unsigned char *) SID_CTX,
sizeof(SID_CTX));
SSL_CTX_set_session_id_context(self->ctx, (const unsigned char *) SID_CTX,
sizeof(SID_CTX));
#undef SID_CTX
}

params = SSL_CTX_get0_param(self->ctx);
/* Improve trust chain building when cross-signed intermediate
Expand Down
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy