# Chrome 142-148 Fingerprint Certification

This document records the source evidence for Specter's implemented Chrome desktop macOS fingerprint profiles.

## Scope

Specter implements Chrome `142`, `143`, `144`, `145`, `146`, `147`, and `148` across:

- Rust `FingerprintProfile` variants and TLS/HTTP/2/HTTP/3 profile mappings.
- Static navigation, AJAX, and form header presets.
- Node.js `FingerprintProfile` binding enum.
- Python `FingerprintProfile` binding enum and type stubs.

`Chrome148` is the latest implemented profile. `OrderedHeaders::chrome_navigation()` defaults to Chrome 148, while the other milestones remain available for deterministic replay of older browser flows.

## Certification Boundary

This is source-level certification against Chromium and Chrome Releases evidence. The version-specific pieces are reduced User-Agent, `Sec-Ch-Ua`, and `Sec-Ch-Ua-Full-Version-List`; the transport pieces are intentionally shared across Chrome 142-148 because the implemented Chrome TLS, HTTP/2, and HTTP/3 fingerprints do not vary by milestone in Specter.

## UA-CH GREASE Algorithm

`Sec-Ch-Ua` and `Sec-Ch-Ua-Full-Version-List` use Chromium's seeded UA-CH GREASE algorithm from `components/embedder_support/user_agent_utils.cc`:

- GREASE brand: `Not` + `greasey_chars[major % 11]` + `A` + `greasey_chars[(major + 1) % 11]` + `Brand`.
- GREASE version: `['8', '99', '24'][major % 3]`.
- Brand order: Chromium shuffles `[GREASE, Chromium, Google Chrome]` using the `major % 6` permutation table.

Source: https://chromium.googlesource.com/chromium/src/+/refs/heads/main/components/embedder_support/user_agent_utils.cc

## Desktop macOS Full Versions

| Chrome | macOS full version used | Chrome Releases source |
| --- | --- | --- |
| 142 | `142.0.7444.176` | https://chromereleases.googleblog.com/2025/11/stable-channel-update-for-desktop_17.html |
| 143 | `143.0.7499.193` | https://chromereleases.googleblog.com/2026/01/stable-channel-update-for-desktop.html |
| 144 | `144.0.7559.133` | https://chromereleases.googleblog.com/2026/02/stable-channel-update-for-desktop.html |
| 145 | `145.0.7632.117` | https://chromereleases.googleblog.com/2026/02/stable-channel-update-for-desktop_23.html |
| 146 | `146.0.7680.165` | https://chromereleases.googleblog.com/2026/03/stable-channel-update-for-desktop_23.html |
| 147 | `147.0.7727.138` | https://chromereleases.googleblog.com/2026/04/stable-channel-update-for-desktop_28.html |
| 148 | `148.0.7778.179` | https://chromereleases.googleblog.com/2026/05/stable-channel-update-for-desktop_0841193308.html |

## API Surface

| Chrome | Rust profile | Header presets |
| --- | --- | --- |
| 142 | `FingerprintProfile::Chrome142` | `chrome_142_headers`, `chrome_142_ajax_headers`, `chrome_142_form_headers` |
| 143 | `FingerprintProfile::Chrome143` | `chrome_143_headers`, `chrome_143_ajax_headers`, `chrome_143_form_headers` |
| 144 | `FingerprintProfile::Chrome144` | `chrome_144_headers`, `chrome_144_ajax_headers`, `chrome_144_form_headers` |
| 145 | `FingerprintProfile::Chrome145` | `chrome_145_headers`, `chrome_145_ajax_headers`, `chrome_145_form_headers` |
| 146 | `FingerprintProfile::Chrome146` | `chrome_146_headers`, `chrome_146_ajax_headers`, `chrome_146_form_headers` |
| 147 | `FingerprintProfile::Chrome147` | `chrome_147_headers`, `chrome_147_ajax_headers`, `chrome_147_form_headers` |
| 148 | `FingerprintProfile::Chrome148` | `chrome_148_headers`, `chrome_148_ajax_headers`, `chrome_148_form_headers` |

## Verification

The source-level certification is enforced by `tests/chrome_versions.rs`:

- All seven Chrome profiles expose the correct reduced User-Agent major version.
- All seven Chrome profiles map to the shared Chrome TLS, HTTP/2, and HTTP/3 fingerprints.
- All seven navigation presets match the Chromium UA-CH GREASE brand order exactly.
- All seven full-version-list presets match the desktop macOS full versions above exactly.
- Navigation, AJAX, and form presets exist for every implemented Chrome version.
- Version-specific TLS constructor aliases exist through `TlsFingerprint::chrome_148()`.

Run the certification checks with:

```bash
cargo test --test chrome_versions -- --nocapture
cargo test --test h3_fingerprint_config -- --nocapture
cargo check --tests
cargo check --manifest-path bindings/node/Cargo.toml --locked
cargo check --manifest-path bindings/python/Cargo.toml --locked
```
