simplify sigchain http distribution
Some checks failed
CI / fmt, clippy, docs (push) Failing after 5s
CI / test (ubuntu-latest) (push) Failing after 5s
CI / iroh integration smoke tests (push) Failing after 4s
CodeQL / Analyze Rust (push) Failing after 5s
Security / RustSec cargo-audit (push) Failing after 4s
CI / test (macos-latest) (push) Has been cancelled
CI / test (windows-latest) (push) Has been cancelled
Some checks failed
CI / fmt, clippy, docs (push) Failing after 5s
CI / test (ubuntu-latest) (push) Failing after 5s
CI / iroh integration smoke tests (push) Failing after 4s
CodeQL / Analyze Rust (push) Failing after 5s
Security / RustSec cargo-audit (push) Failing after 4s
CI / test (macos-latest) (push) Has been cancelled
CI / test (windows-latest) (push) Has been cancelled
This commit is contained in:
parent
decff4b995
commit
538b52bdb6
12 changed files with 66 additions and 72 deletions
|
|
@ -41,7 +41,8 @@ SSHSIGCHAIN v1 is redesigned before deployment:
|
|||
discloseable payloads, claims, and receipts without embedding root trust;
|
||||
- JSONL is noncanonical human-facing interchange; and
|
||||
- distribution backends return untrusted bundle bytes through one interface,
|
||||
with a static HTTP profile that requires no server application.
|
||||
with a single-file static HTTP profile at an exact operator-configured URL
|
||||
that requires no server application, well-known discovery, or TOFU.
|
||||
|
||||
The generic core defines backend interfaces and deterministic policy behavior,
|
||||
not Nostr, HTTP, blockchain, or transparency-log clients. Those adapters belong
|
||||
|
|
|
|||
|
|
@ -496,10 +496,11 @@ SSHSIGCHAIN's canonical `.sscb` bundle is the portable on-disk and full-snapshot
|
|||
distribution boundary. It deterministically stores signed record objects,
|
||||
separate disclosures, head claims, and anchor receipts without embedding the
|
||||
root key. JSONL remains inspection/interchange only. Bundle sources implement a
|
||||
backend-neutral untrusted fetch interface; the static HTTP profile publishes
|
||||
the same bytes below `/.well-known/sshsigchain/v1/<chain-id>/chain.sscb`.
|
||||
Fetching never grants trust or selects a head. Geth may use Iroh rather than
|
||||
HTTP operationally without changing the format or verification path.
|
||||
backend-neutral untrusted fetch interface; the static HTTP profile fetches the
|
||||
same single file from an exact operator-configured URL. It defines no
|
||||
well-known path or discovery rule. Fetching never grants trust or selects a
|
||||
head. Geth may use Iroh rather than HTTP operationally without changing the
|
||||
format or verification path.
|
||||
|
||||
New devices can use the node enrollment flow instead of hand-editing keychain
|
||||
state. `geth node enroll join` explicitly imports an owner admin public key as
|
||||
|
|
|
|||
|
|
@ -584,9 +584,9 @@ resource-scoped capability decisions.
|
|||
clearly preserving claims/receipts only in the canonical bundle.
|
||||
- `[x]` `verify-sigchain` auto-detects JSONL or canonical bundles and binds
|
||||
a bundle's namespace and chain ID to local trust.
|
||||
- `[x]` Specify the backend-neutral distribution-source contract and a static
|
||||
HTTP full-snapshot profile at
|
||||
`/.well-known/sshsigchain/v1/<chain-id>/chain.sscb`.
|
||||
- `[x]` Specify the backend-neutral distribution-source contract and a
|
||||
single-file static HTTP full-snapshot profile at an arbitrary, explicitly
|
||||
configured URL, without well-known discovery or URL-based trust.
|
||||
- `[ ]` Implement automatic distribution fetchers.
|
||||
- Acceptance criteria: an HTTP fetcher enforces streaming limits,
|
||||
conditional caching, redirect policy, trust-tuple matching, accepted-head
|
||||
|
|
|
|||
|
|
@ -114,11 +114,11 @@ geth keychain bundle-extract --in chain.sscb --out chain.jsonl
|
|||
|
||||
The canonical bundle keeps disclosures separate from signed record objects and
|
||||
sorts every object class deterministically. Adding a disclosure changes the
|
||||
bundle hash but not the chain head. The same file is the simple static HTTP
|
||||
distribution artifact at
|
||||
`/.well-known/sshsigchain/v1/<chain-id>/chain.sscb`. Distribution is untrusted:
|
||||
the configured root, authority replay, anchor policy, locally accepted head,
|
||||
and fork checks still decide acceptance.
|
||||
bundle hash but not the chain head. The same single file is the static HTTP
|
||||
distribution artifact at any explicitly configured URL; there is no well-known
|
||||
path, URL derivation, or trust-on-first-use. Distribution is untrusted: the
|
||||
configured root, authority replay, anchor policy, locally accepted head, and
|
||||
fork checks still decide acceptance.
|
||||
|
||||
## Local commands
|
||||
|
||||
|
|
|
|||
|
|
@ -446,12 +446,12 @@ anchoring, cached-head, and fork checks.
|
|||
|
||||
### 10.1 Static HTTP profile
|
||||
|
||||
The static HTTP profile needs no server application or directory listing. For
|
||||
chain ID `<lowercase-chain-id>`, publish the bundle at:
|
||||
|
||||
```text
|
||||
/.well-known/sshsigchain/v1/<lowercase-chain-id>/chain.sscb
|
||||
```
|
||||
The static HTTP profile needs no server application, directory listing,
|
||||
well-known path, or discovery protocol. Its `locator` is the exact arbitrary
|
||||
HTTP(S) URL of one canonical `.sscb` file. Implementations MUST NOT derive the
|
||||
URL from the chain ID, treat a URL as root-key discovery, or use a successful
|
||||
fetch as trust-on-first-use. The chain ID, namespace, and root public key are
|
||||
already pinned independently of the URL.
|
||||
|
||||
The response media type SHOULD be:
|
||||
|
||||
|
|
@ -459,23 +459,29 @@ The response media type SHOULD be:
|
|||
application/vnd.sshsigchain.bundle.v1
|
||||
```
|
||||
|
||||
A client performs an ordinary `GET`, accepts a successful full response, caps
|
||||
bytes while streaming, decodes the canonical bundle, requires its chain ID and
|
||||
namespace to match local trust, verifies the chain, verifies applicable head
|
||||
claims and receipts, then applies cached-head/fork rules. `404` means the source
|
||||
currently has no bundle. Servers SHOULD replace `chain.sscb` atomically.
|
||||
A client performs an ordinary `GET` of the exact configured URL, accepts a
|
||||
successful full response, caps bytes while streaming, decodes the canonical
|
||||
bundle, requires its chain ID and namespace to match local trust, verifies the
|
||||
chain, verifies applicable head claims and receipts, then applies
|
||||
cached-head/fork rules. `404` means the source currently has no bundle. Servers
|
||||
SHOULD replace the file atomically.
|
||||
|
||||
Servers MAY expose the lowercase bundle hash as a strong `ETag`; clients MAY use
|
||||
`If-None-Match`. HTTP cache validators are performance hints, not trust. HTTPS
|
||||
protects privacy, locators, and availability against network interference, but
|
||||
SSHSIGCHAIN verification remains mandatory even over authenticated HTTPS.
|
||||
Plain HTTP remains integrity-safe only in the narrow sense that tampering is
|
||||
detected; it offers no confidentiality or reliable availability.
|
||||
Servers SHOULD expose the lowercase bundle hash as a strong `ETag`; clients
|
||||
SHOULD use `If-None-Match`. A mutable latest-version URL SHOULD use
|
||||
`Cache-Control: no-cache` or a suitably short freshness lifetime so ordinary
|
||||
HTTP caches and CDNs can store the file and revalidate it. HTTP cache validators
|
||||
are performance hints, not trust. HTTPS protects privacy, locators, and
|
||||
availability against network interference, but SSHSIGCHAIN verification
|
||||
remains mandatory even over authenticated HTTPS. Plain HTTP remains
|
||||
integrity-safe only in the narrow sense that tampering is detected; it offers
|
||||
no confidentiality or reliable availability.
|
||||
|
||||
This full-snapshot profile intentionally favors deployment with a static file
|
||||
server. A later chunked profile may add immutable hash-addressed objects and a
|
||||
small mutable manifest, but it must preserve the object encodings and all
|
||||
verification rules above.
|
||||
Servers MAY support byte ranges, and clients MAY use them to resume or
|
||||
parallelize transfer of the single file. The v1 bundle has no authenticated
|
||||
random-access index: a client MUST assemble, decode, hash, and verify the
|
||||
complete canonical bundle before accepting any state. A `206 Partial Content`
|
||||
response is therefore a download optimization, not a partial-chain or
|
||||
per-object protocol. This profile deliberately remains one file.
|
||||
|
||||
## 11. JSONL interchange
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue