Low-level access to the QUIC Initial Packet for mimicry purposes, hard fork of quic-go. https://quic.tlsfingerprint.io
Find a file
2023-08-05 14:08:55 -06:00
.github/workflows Update ginkgo_test.yml (#8) 2023-08-05 14:08:55 -06:00
docs docs: minor adjustment 2023-08-03 18:33:55 -06:00
example fix: broken example 2023-08-05 01:21:59 -06:00
fuzzing break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
http3 break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
integrationtests break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
internal break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
logging break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
qlog break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
quicvarint break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
.gitignore add common temporary file patterns to .gitignore 2020-11-30 12:59:35 +07:00
.golangci.yml use the new crypto/tls QUIC Transport (#3860) 2023-07-01 11:15:00 -07:00
buffer_pool.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
buffer_pool_test.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
Changelog.md break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
client.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
client_test.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
closed_conn.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
closed_conn_test.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
codecov.yml use the new crypto/tls QUIC Transport (#3860) 2023-07-01 11:15:00 -07:00
config.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
config_test.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
conn_id_generator.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
conn_id_generator_test.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
conn_id_manager.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
conn_id_manager_test.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
connection.go fix: failed tests due to a bad searching criterion (#5) 2023-08-05 12:29:41 -06:00
connection_test.go fix: failed tests due to a bad searching criterion (#5) 2023-08-05 12:29:41 -06:00
connection_timer.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
connection_timer_test.go migrate to Ginkgo v2 2022-10-11 16:38:44 +04:00
crypto_stream.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
crypto_stream_manager.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
crypto_stream_manager_test.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
crypto_stream_test.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
datagram_queue.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
datagram_queue_test.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
errors.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
frame_sorter.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
frame_sorter_test.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
framer.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
framer_test.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
go.mod fix: broken utls deps 2023-08-05 01:17:25 -06:00
go.sum fix: broken utls deps 2023-08-05 01:17:25 -06:00
interface.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
LICENSE add Google to license file 2016-12-14 11:54:01 +01:00
mock_ack_frame_source_test.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
mock_batch_conn_test.go simplify mockgen usage for private interfaces (#3769) 2023-04-19 07:57:00 -07:00
mock_conn_runner_test.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
mock_crypto_data_handler_test.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
mock_crypto_stream_test.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
mock_frame_source_test.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
mock_mtu_discoverer_test.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
mock_packer_test.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
mock_packet_handler_manager_test.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
mock_packet_handler_test.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
mock_packetconn_test.go update gomock to v1.5.0 2021-02-20 09:33:43 +08:00
mock_quic_conn_test.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
mock_receive_stream_internal_test.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
mock_sealing_manager_test.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
mock_send_conn_test.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
mock_send_stream_internal_test.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
mock_sender_test.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
mock_stream_getter_test.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
mock_stream_internal_test.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
mock_stream_manager_test.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
mock_stream_sender_test.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
mock_token_store_test.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
mock_unknown_packet_handler_test.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
mock_unpacker_test.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
mockgen.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
mtu_discoverer.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
mtu_discoverer_test.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
multiplexer.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
multiplexer_test.go implement the Transport 2023-05-02 15:56:48 +02:00
oss-fuzz.sh break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
packet_handler_map.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
packet_handler_map_test.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
packet_packer.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
packet_packer_test.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
packet_unpacker.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
packet_unpacker_test.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
quic_suite_test.go implement the Transport 2023-05-02 15:56:48 +02:00
README.md bug: ci taking too long to run (#7) 2023-08-05 13:04:13 -06:00
receive_stream.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
receive_stream_test.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
retransmission_queue.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
retransmission_queue_test.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
SECURITY.md break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
send_conn.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
send_conn_test.go embed the packetInfo in the receivedPacket struct 2023-06-03 10:44:16 +03:00
send_queue.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
send_queue_test.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
send_stream.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
send_stream_test.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
server.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
server_test.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
stream.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
stream_test.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
streams_map.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
streams_map_incoming.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
streams_map_incoming_test.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
streams_map_outgoing.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
streams_map_outgoing_test.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
streams_map_test.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
sys_conn.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
sys_conn_buffers.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
sys_conn_buffers_write.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
sys_conn_df.go check for WSAEMSGSIZE errors when receiving UDP packets on Windows (#3982) 2023-07-20 20:31:57 -07:00
sys_conn_df_darwin.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
sys_conn_df_linux.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
sys_conn_df_windows.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
sys_conn_helper_darwin.go check the length of IPv4 packet info control messages, add log message (#3920) 2023-07-01 12:03:00 -07:00
sys_conn_helper_freebsd.go check the length of IPv4 packet info control messages, add log message (#3920) 2023-07-01 12:03:00 -07:00
sys_conn_helper_linux.go check the length of IPv4 packet info control messages, add log message (#3920) 2023-07-01 12:03:00 -07:00
sys_conn_helper_linux_test.go add a function to set the UDP send buffer size 2023-05-08 14:35:21 +03:00
sys_conn_helper_nonlinux.go add a function to set the UDP send buffer size 2023-05-08 14:35:21 +03:00
sys_conn_no_gso.go pack packets into large buffers when GSO is available 2023-06-03 09:21:55 +03:00
sys_conn_no_oob.go use a netip.Addr instead of a net.IP in the packetInfo struct 2023-06-03 10:44:15 +03:00
sys_conn_oob.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
sys_conn_oob_test.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
sys_conn_test.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
sys_conn_windows.go use a netip.Addr instead of a net.IP in the packetInfo struct 2023-06-03 10:44:15 +03:00
sys_conn_windows_test.go only run DPLPMTUD if the connection can send packets with the DF bit set (#3879) 2023-06-02 06:54:34 -07:00
token_store.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
token_store_test.go migrate to Ginkgo v2 2022-10-11 16:38:44 +04:00
tools.go migrate to Ginkgo v2 2022-10-11 16:38:44 +04:00
transport.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
transport_test.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
u_client.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
u_conn_id_manager.go new: uquic 2023-08-02 15:38:16 -06:00
u_connection.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
u_initial_packet_spec.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
u_initial_packet_spec_test.go new: uquic 2023-08-02 15:38:16 -06:00
u_packet_packer.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
u_quic_spec.go new: uquic 2023-08-02 15:38:16 -06:00
u_transport.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
window_update_queue.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00
window_update_queue_test.go break: update repo url [ci skip] 2023-08-03 18:58:52 -06:00

uTLS drawing uQUIC

Go Build Status Ginkgo Test Status godoc

uQUIC is a fork of quic-go, which provides Initial Packet fingerprinting resistance and other features. While the handshake is still performed by quic-go, this library provides interface to customize the unencrypted Initial Packet which may reveal fingerprint-able information.

Golang 1.20+ is required.

If you have any questions, bug reports or contributions, you are welcome to publish those on GitHub. You may also reach out to one of the maintainers via gaukas.wang@colorado.edu.

Development is still in progress and we welcome any contributions adding new features or fixing extant bugs.

Development in Progress

Development Roadmap

  • Customize Initial Packet
    • QUIC Header
    • QUIC Frame (#3)
      • QUIC Crypto Frame
      • QUIC Padding Frame
      • QUIC Ping Frame
      • QUIC ACK Frame
    • TLS ClientHello Message (by uTLS)
      • QUIC Transport Parameters (in a uTLS extension)
  • Customize Initial ACK behavior (#1, quic-go#4007)
  • Customize Initial Retry behavior (#2)
  • Add preset QUIC parrots
    • Google Chrome parrot
    • Mozilla Firefox parrot
    • Apple Safari parrot
    • Microsoft Edge parrot

Features

Initial Packet fingerprinting resistance

uQUIC provides a mechanism to customize the Initial Packet, which is unencrypted and is almost unique to every QUIC client implementation. We provide an interface to customize the Initial Packet and makes the fingerprinting of QUIC clients harder.

Build a QUIC Spec

A QUIC Spec sets parameters and policies for uQUIC in establishing a QUIC connection.

func getQUICSpec() *uquic.QUICSpec {
	return &uquic.QUICSpec{
		InitialPacketSpec: uquic.InitialPacketSpec{
			SrcConnIDLength:        3,
			DestConnIDLength:       8,
			InitPacketNumberLength: 1,
			InitPacketNumber:       1,
			ClientTokenLength:      0,
			FrameOrder: uquic.QUICFrames{
				&uquic.QUICFrameCrypto{
					Offset: 0,
					Length: 0,
				},
			},
		},
		ClientHelloSpec: getClientHelloSpec(),
        UDPDatagramMinSize: 1357,
	}
}

func getClientHelloSpec() *utls.ClientHelloSpec {
	return &utls.ClientHelloSpec{
        // skipped a few mandatory fields, see uTLS for details
		Extensions: []utls.TLSExtension{
			// skipped a few mandatory extensions, see uTLS for details
			&utls.QUICTransportParametersExtension{
				TransportParameters: utls.TransportParameters{
					utls.InitialMaxStreamDataBidiRemote(0x100000),
					utls.InitialMaxStreamsBidi(16),
					utls.MaxDatagramFrameSize(1200),
					utls.MaxIdleTimeout(30000),
					utls.ActiveConnectionIDLimit(8),
					&utls.GREASEQUICBit{},
					&utls.VersionInformation{
						ChoosenVersion: utls.VERSION_1,
						AvailableVersions: []uint32{
							utls.VERSION_GREASE,
							utls.VERSION_1,
						},
						LegacyID: true,
					},
					utls.InitialMaxStreamsUni(16),
					&utls.GREASE{},
					utls.InitialMaxStreamDataBidiLocal(0xc00000),
					utls.InitialMaxStreamDataUni(0x100000),
					utls.InitialSourceConnectionID([]byte{}),
					utls.MaxAckDelay(20),
					utls.InitialMaxData(0x1800000),
					&utls.DisableActiveMigration{},
				},
			},
		},
	}
}