This commit is contained in:
2026-08-09 12:55:45 +02:00
parent a02c5b3c85
commit 49159988a3
+8 -8
View File
@@ -31,7 +31,7 @@ not three partially compatible protocol generations.
| Area | Decision | User-visible result | | Area | Decision | User-visible result |
|---|---|---| |---|---|---|
| Filesystem safety | Validate the complete destination manifest before any mutation and confine it to one catalog game root. | A hostile peer cannot overwrite another game, `local/`, saves, or transaction state. | | Filesystem safety | Validate the complete destination manifest before any mutation and confine it to one catalog game root. | A hostile peer cannot overwrite another game, `local/`, saves, or transaction state. |
| Content authority | Ship SHA-256 file and chunk hashes from the same bundled catalog authority as `game.db`. | Every eligible nearby peer is usable automatically; wrong bytes are rejected and retried elsewhere. | | Content authority | Ship BLAKE3 file and chunk hashes from the same bundled catalog authority as `game.db`. | Every eligible nearby peer is usable automatically; wrong bytes are rejected and retried elsewhere. |
| Peer identity | Use one installation-local TLS key and derive `PeerId` from that TLS public key. | Identity works silently and survives ordinary restarts when possible; users do not manage it. | | Peer identity | Use one installation-local TLS key and derive `PeerId` from that TLS public key. | Identity works silently and survives ordinary restarts when possible; users do not manage it. |
| Transport | Pin every outbound QUIC connection to the expected `PeerId`. | An address spoof or MITM cannot impersonate the peer selected as a source. | | Transport | Pin every outbound QUIC connection to the expected `PeerId`. | An address spoof or MITM cannot impersonate the peer selected as a source. |
| Control messages | Use ordinary bounded protocol messages inside TLS. Treat unauthenticated inbound change notifications only as hints that trigger a pinned pull. | No signed-envelope layer, nonce ledger, or message-signing overhead. | | Control messages | Use ordinary bounded protocol messages inside TLS. Treat unauthenticated inbound change notifications only as hints that trigger a pinned pull. | No signed-envelope layer, nonce ledger, or message-signing overhead. |
@@ -45,7 +45,7 @@ The resulting data flow is intentionally small:
mDNS candidate -> responder-pinned TLS -> peer-owned snapshot or file bytes mDNS candidate -> responder-pinned TLS -> peer-owned snapshot or file bytes
bundled content manifest -> validated local download plan bundled content manifest -> validated local download plan
-> SHA-256 check for every received chunk -> BLAKE3 check for every received chunk
-> version.ini commit only after complete success -> version.ini commit only after complete success
local Call to Play change -> cheap invalidation hint to known peers local Call to Play change -> cheap invalidation hint to known peers
@@ -164,16 +164,16 @@ CatalogContentManifest {
game_version game_version
chunk_size chunk_size
files: [ files: [
{ canonical_path, kind, size, file_sha256, chunk_sha256[] } { canonical_path, kind, size, file_blake3, chunk_blake3[] }
] ]
streamed_install_files: [ streamed_install_files: [
{ canonical_path, kind, size, file_sha256 } { canonical_path, kind, size, file_blake3 }
] ]
content_id content_id
} }
``` ```
Entries are sorted by canonical path. `content_id` is SHA-256 over a Entries are sorted by canonical path. `content_id` is BLAKE3 over a
versioned, length-delimited encoding of all preceding manifest fields and versioned, length-delimited encoding of all preceding manifest fields and
hashes, excluding the `content_id` field itself; it is not the current hashes, excluding the `content_id` field itself; it is not the current
noncryptographic `u64 manifest_hash`. Golden tests freeze that encoding. The noncryptographic `u64 manifest_hash`. Golden tests freeze that encoding. The
@@ -221,7 +221,7 @@ files” progress, not a security decision.
Streamed install needs a catalog-owned extracted-file manifest because the Streamed install needs a catalog-owned extracted-file manifest because the
sender controls both today's RAR CRC32 metadata and extracted bytes. The sender controls both today's RAR CRC32 metadata and extracted bytes. The
receiver accepts exactly the expected path set, sizes, and SHA-256 values in receiver accepts exactly the expected path set, sizes, and BLAKE3 values in
isolated staging, then applies the documented local account/language rewrite isolated staging, then applies the documented local account/language rewrite
and promotes the transaction. CRC32 may remain as an early corruption check, and promotes the transaction. CRC32 may remain as an early corruption check,
but it is not the security boundary. A game without a verified extracted but it is not the security boundary. A game without a verified extracted
@@ -244,7 +244,7 @@ not exposed as a user credential.
responder-verification path. Otherwise use one supported P-256 TLS key. Do not responder-verification path. Otherwise use one supported P-256 TLS key. Do not
add a second signing identity or a custom certificate-extension binding. add a second signing identity or a custom certificate-extension binding.
- Define `PeerId` as lowercase unpadded base32 of - Define `PeerId` as lowercase unpadded base32 of
`SHA-256(canonical DER SubjectPublicKeyInfo)` from the actual TLS key. The `BLAKE3(canonical DER SubjectPublicKeyInfo)` from the actual TLS key. The
same key is therefore both the identity and the TLS proof-of-possession key. same key is therefore both the identity and the TLS proof-of-possession key.
- Validate on load that the private key, certificate SPKI, and derived ID - Validate on load that the private key, certificate SPKI, and derived ID
agree. Never log private material. agree. Never log private material.
@@ -497,7 +497,7 @@ reported as Windows proof.
Add the reproducible content-manifest generator and fixture manifests. Freeze Add the reproducible content-manifest generator and fixture manifests. Freeze
the versioned manifest/content-ID encoding with golden tests. Extend local the versioned manifest/content-ID encoding with golden tests. Extend local
catalog state, build download plans only from that state, implement streaming catalog state, build download plans only from that state, implement streaming
SHA-256 checks and source quarantine, and implement verified extracted BLAKE3 checks and source quarantine, and implement verified extracted
manifests for Stream Install. manifests for Stream Install.
Do not claim completion from test fixtures alone: production catalog packages Do not claim completion from test fixtures alone: production catalog packages