{"id":20209176,"url":"https://github.com/refraction-networking/uquic","last_synced_at":"2025-04-10T13:05:13.770Z","repository":{"id":186446569,"uuid":"674385382","full_name":"refraction-networking/uquic","owner":"refraction-networking","description":"Low-level access to the QUIC Initial Packet for mimicry purposes, hard fork of quic-go.","archived":false,"fork":false,"pushed_at":"2025-04-03T22:52:22.000Z","size":16733,"stargazers_count":57,"open_issues_count":15,"forks_count":3,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-04-03T23:29:01.750Z","etag":null,"topics":["anti-censorship","anticensorship","golang","parrot","quic","utls"],"latest_commit_sha":null,"homepage":"https://quic.tlsfingerprint.io","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/refraction-networking.png","metadata":{"files":{"readme":"README.md","changelog":"Changelog.md","contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":["marten-seemann"],"patreon":null,"open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"otechie":null,"lfx_crowdfunding":null,"custom":null}},"created_at":"2023-08-03T20:22:06.000Z","updated_at":"2025-04-01T15:21:24.000Z","dependencies_parsed_at":"2024-04-05T05:31:52.462Z","dependency_job_id":"33d06675-6ef2-4efa-8d1e-68ca0a319f2c","html_url":"https://github.com/refraction-networking/uquic","commit_stats":null,"previous_names":["refraction-networking/uquic"],"tags_count":6,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/refraction-networking%2Fuquic","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/refraction-networking%2Fuquic/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/refraction-networking%2Fuquic/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/refraction-networking%2Fuquic/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/refraction-networking","download_url":"https://codeload.github.com/refraction-networking/uquic/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248223827,"owners_count":21068069,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["anti-censorship","anticensorship","golang","parrot","quic","utls"],"created_at":"2024-11-14T05:39:08.178Z","updated_at":"2025-04-10T13:05:13.765Z","avatar_url":"https://github.com/refraction-networking.png","language":"Go","funding_links":["https://github.com/sponsors/marten-seemann"],"categories":[],"sub_categories":[],"readme":"# \u003cdiv\u003e \u003cimg style=\"vertical-align:middle\" src=\"docs/uQUIC_nopadding.png\" alt=\"drawing\" width=\"300\"/\u003e \u003cspan style=\"vertical-align:middle\"\u003euQUIC\u003c/span\u003e \u003c/div\u003e\n\n[![Go Build Status](https://github.com/refraction-networking/uquic/actions/workflows/go_build.yml/badge.svg?branch=master)](https://github.com/refraction-networking/uquic/actions/workflows/go_build.yml)\n[![Ginkgo Test Status](https://github.com/refraction-networking/uquic/actions/workflows/ginkgo_test.yml/badge.svg?branch=master)](https://github.com/refraction-networking/uquic/actions/workflows/ginkgo_test.yml)\n[![godoc](https://img.shields.io/badge/godoc-reference-blue.svg)](https://godoc.org/github.com/refraction-networking/uquic)\n\n---\n\nuQUIC is a fork of [quic-go](https://github.com/quic-go/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.\n\nGolang 1.20+ is required.\n\nIf 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.\n\nDevelopment is still in progress and we welcome any contributions adding new features or fixing extant bugs.\n\n# Disclaimer\n\nThis repository belongs to a large research project on how to fingerprint QUIC clients and how to mitigate such fingerprinting. We do not encourage any malicious use of this project's output, including this repository, [uTLS](https://github.com/refraction-networking/utls), and [clienthellod](https://github.com/refraction-networking/clienthellod).\n\nOur research paper is still yet to be published and therefore this repository is neither ready for production use nor peer-reviewed. And the scope of our research is limited that such mimicry backed by this library MAY NOT be realisticly indistinguishable from the real QUIC clients being mimicked, and some misuses of this library MAY lead to easier fingerprinting against the mimic. We welcome any contributions to improve the realism of the mimicry, as well as expanding the scope of this project.\n\nFor anyone intending to use this library for censorship circumvention, please be sure to understand the risks and limitations of this library.\n\nIf you are interested in our research, please stay tuned for our paper.\n\n# Development in Progress\n\n## Development Roadmap\n\n- [ ] Customize Initial Packet\n  - [x] QUIC Header\n  - [x] QUIC Frame (~~[#3](https://github.com/refraction-networking/uquic/issues/3)~~)\n    - [x] QUIC Crypto Frame\n    - [x] QUIC Padding Frame\n    - [x] QUIC Ping Frame\n    - [ ] QUIC ACK Frame (on hold)\n  - [x] TLS ClientHello Message (by [uTLS](https://github.com/refraction-networking/utls))\n    - [x] QUIC Transport Parameters (in a uTLS extension)\n- [ ] Customize Initial ACK behavior ([#1](https://github.com/refraction-networking/uquic/issues/1), [quic-go#4007](https://github.com/quic-go/quic-go/issues/4007))\n- [ ] Customize Initial Retry behavior ([#2](https://github.com/refraction-networking/uquic/issues/2))\n- [ ] Add preset QUIC parrots\n  - [x] Google Chrome parrot (call for parrots w/ `Token/PSK`)\n  - [x] Mozilla Firefox parrot (call for parrots w/ `Token/PSK`)\n  - [ ] Apple Safari parrot\n  - [ ] Microsoft Edge parrot\n\n# Features\n\n## Initial Packet fingerprinting resistance\n\nuQUIC 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.\n\n### Build a QUIC Spec\n\nA QUIC Spec sets parameters and policies for uQUIC in establishing a QUIC connection.\n\nSee `u_parrot.go` for examples of building a QUIC Spec (parrot).\n\n### Use a preset QUIC Spec\n\nWe provide a few preset QUIC Specs (parrots) for popular QUIC clients in `u_parrot.go`.\n\nTo use one, simple invoke `QUICID2Spec(id)`. See below for a complete example of using a preset QUIC Spec in an HTTP3 client.\n\n```go\npackage main\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"io\"\n\t\"log\"\n\t\"net/http\"\n\n\ttls \"github.com/refraction-networking/utls\"\n\n\tquic \"github.com/refraction-networking/uquic\"\n\t\"github.com/refraction-networking/uquic/http3\"\n)\n\nfunc main() {\n\troundTripper := \u0026http3.RoundTripper{\n\t\tTLSClientConfig: \u0026tls.Config{},\n\t\tQuicConfig:      \u0026quic.Config{},\n\t}\n\n\tquicSpec, err := quic.QUICID2Spec(quic.QUICFirefox_116)\n\t// quicSpec, err := quic.QUICID2Spec(quic.QUICChrome_115)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\tuRoundTripper := http3.GetURoundTripper(\n\t\troundTripper,\n\t\t\u0026quicSpec,\n\t\t// getCRQUICSpec(),\n\t\tnil,\n\t)\n\tdefer uRoundTripper.Close()\n\n\th3client := \u0026http.Client{\n\t\tTransport: uRoundTripper,\n\t}\n\n\taddr := \"https://quic.tlsfingerprint.io/qfp/?beautify=true\"\n\n\trsp, err := h3client.Get(addr)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\tfmt.Printf(\"Got response for %s: %#v\", addr, rsp)\n\n\tbody := \u0026bytes.Buffer{}\n\t_, err = io.Copy(body, rsp.Body)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\tfmt.Printf(\"Response Body: %s\", body.Bytes())\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frefraction-networking%2Fuquic","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frefraction-networking%2Fuquic","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frefraction-networking%2Fuquic/lists"}