diff options
Diffstat (limited to 'packages/meshbay-node/src/meshbay_node/transport/quic_server.py')
| -rw-r--r-- | packages/meshbay-node/src/meshbay_node/transport/quic_server.py | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/packages/meshbay-node/src/meshbay_node/transport/quic_server.py b/packages/meshbay-node/src/meshbay_node/transport/quic_server.py index 036574b..96cd752 100644 --- a/packages/meshbay-node/src/meshbay_node/transport/quic_server.py +++ b/packages/meshbay-node/src/meshbay_node/transport/quic_server.py @@ -41,6 +41,7 @@ from meshbay_common.handshake import ( ROLE_NODE, HandshakeError, authorize_token, + challenge_transcript, check_version, handshake_transcript, make_proof, @@ -313,11 +314,23 @@ class _MNPServerProtocol(QuicConnectionProtocol): # Decoded but NOT authenticated: authentication is the GEK proof below. self._pending = peer self._gek_challenge = os.urandom(NONCE_LEN) + # The same announcement and signature as WebRTC's challenge (MNP 3.4), + # so the two transports stay one handshake. The binding is the node's + # certificate, which is known here as it is at the proof. + sig = {} + cert = self._ctx.get("server_cert_der") + if cert: + transcript = challenge_transcript( + peer.group_id, self._nonce_client, self._gek_challenge, + quic_binding(cert)) + sig = {"sig": base64.b64encode(self._ctx["sk_node"].sign(transcript)).decode()} self._send(stream_id, { - "type": MNP.HANDSHAKE_CHALLENGE, - "v": MNP_VERSION, - "v_min": MNP_MIN_SUPPORTED, - "nonce": base64.b64encode(self._gek_challenge).decode(), + "type": MNP.HANDSHAKE_CHALLENGE, + "v": MNP_VERSION, + "v_min": MNP_MIN_SUPPORTED, + "nonce": base64.b64encode(self._gek_challenge).decode(), + "node_pk": pk_to_b64(self._ctx["sk_node"].public_key()), + **sig, }) def _do_handshake_response_sync(self, stream_id: int, msg: dict) -> None: |