def test_datagram_received_retry_wrong_destination_cid(self): client, client_transport = create_standalone_client() self.assertEqual(client_transport.sent, 1) client.datagram_received( encode_quic_retry( version=QuicProtocolVersion.DRAFT_20, source_cid=binascii.unhexlify("85abb547bf28be97"), destination_cid=binascii.unhexlify("c98343fe8f5f0ff4"), original_destination_cid=client.peer_cid, retry_token=bytes(16), ), SERVER_ADDR, ) self.assertEqual(client_transport.sent, 1)
def test_receive_datagram_retry_wrong_destination_cid(self): client = create_standalone_client(self) client.receive_datagram( encode_quic_retry( version=QuicProtocolVersion.DRAFT_20, source_cid=binascii.unhexlify("85abb547bf28be97"), destination_cid=binascii.unhexlify("c98343fe8f5f0ff4"), original_destination_cid=client._peer_cid, retry_token=bytes(16), ), SERVER_ADDR, now=time.time(), ) self.assertEqual(drop(client), 0)
def datagram_received(self, data: Union[bytes, Text], addr: NetworkAddress) -> None: data = cast(bytes, data) buf = Buffer(data=data) header = pull_quic_header(buf, host_cid_length=8) # version negotiation if (header.version is not None and header.version not in self._configuration.supported_versions): self._transport.sendto( encode_quic_version_negotiation( source_cid=header.destination_cid, destination_cid=header.source_cid, supported_versions=self._configuration.supported_versions, ), addr, ) return connection = self._connections.get(header.destination_cid, None) original_connection_id: Optional[bytes] = None if connection is None and header.packet_type == PACKET_TYPE_INITIAL: # stateless retry if self._retry is not None: if not header.token: # create a retry token self._transport.sendto( encode_quic_retry( version=header.version, source_cid=os.urandom(8), destination_cid=header.source_cid, original_destination_cid=header.destination_cid, retry_token=self._retry.create_token( addr, header.destination_cid), ), addr, ) return else: # validate retry token try: original_connection_id = self._retry.validate_token( addr, header.token) except ValueError: return # create new connection connection = QuicConnection( configuration=self._configuration, original_connection_id=original_connection_id, session_ticket_fetcher=self._session_ticket_fetcher, session_ticket_handler=self._session_ticket_handler, ) self._connections[header.destination_cid] = connection self._connections[connection.host_cid] = connection if connection is not None: connection.receive_datagram(cast(bytes, data), addr, now=self._loop.time()) self._consume_events(connection)