Skip to content

Commit a8e3f86

Browse files
committed
Harden replay and provider roadmap
1 parent a1f4c61 commit a8e3f86

3 files changed

Lines changed: 101 additions & 11 deletions

File tree

docs/VERSION_PLAN.md

Lines changed: 76 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,11 @@ continues past the relevant dependency point.
242242
| Threshold quorum safety needed exact mathematics. | Expanded `v0.79.0` with supported fault model, exact quorum formula, weighted-quorum policy, overflow-safe arithmetic, and policy-time rejection of impossible configurations. |
243243
| Provider side-channel wording could admit variable-time signing into high-assurance profiles. | Added provider assurance classes in `v0.28.1` and required high-assurance profiles to admit only constant-time software or appropriately isolated hardware signing providers. |
244244
| Invalid-result caching needed a complete semantic cache key. | Added cache-key requirements to `v0.17.1` covering statement, policy, trust, revocation, conflict, checkpoint, suite, and profile roots. |
245+
| Replay stores could be poisoned before authentication. | Expanded `v0.23.0 - Validity And Atomic Replay Policy` with authenticate-before-commit ordering, bounded reservation semantics, advisory early duplicate checks, and invalid-signature/crash fixtures. |
246+
| Provider threat claims needed a precise trust boundary. | Expanded `v0.28.1 - Provider Assurance Classes` so admitted primitive providers are part of the trusted computing base; provider crashes, format errors, resource abuse, and capability misreporting are defended, but arbitrary false cryptographic success from an admitted compromised provider is a trusted-boundary failure through `v1.0.0`. |
247+
| Verification cacheability needed per-outcome rules. | Expanded `v0.17.1 - Verification Outcome And Receipt Model` with a cacheability matrix for decoding, crypto, policy, revocation, validity time, replay, missing evidence, provider availability, resource exhaustion, capability, delegation, and authority outcomes. |
248+
| Verification receipts needed a nonrecursive signature domain. | Expanded `v0.41.0 - Receipt Model Split` with a distinct receipt-signature domain and direct receipt verification path that does not recursively require another verification receipt. |
249+
| Missing-parent quotas could be bypassed with unauthenticated issuer claims. | Expanded `v0.21.0 - Missing Parent Reconciliation` with unauthenticated global/source quotas and authenticated per-issuer quotas only after issuer authentication. |
245250

246251
## Phase 0: Published Foundation And Direction Pivot
247252

@@ -849,6 +854,20 @@ Deliverables:
849854
- rule that invalid outcomes may be cached only when the cache key includes
850855
every relevant statement, policy, trust, revocation, conflict, checkpoint,
851856
suite, and profile root,
857+
- cacheability matrix by outcome class:
858+
canonical decoding failures are permanently cacheable by object bytes,
859+
cryptographic failures are cacheable by statement, signature, key, suite, and
860+
verifier profile,
861+
policy or revocation failures are cacheable only with the exact policy,
862+
trust, and root snapshot,
863+
not-yet-valid results include evaluation time or expire at the validity
864+
boundary,
865+
expired results are cacheable only under the applicable clock or
866+
evaluation-point policy,
867+
replay or sequence results require replay-store generation or state binding,
868+
missing evidence, provider unavailable, and resource exhausted outcomes are
869+
never cached as invalid, and capability or delegation failures include
870+
capability, delegation, and authority-state roots,
852871
- rule that retrying with a larger locally permitted budget may complete
853872
verification without changing the underlying statement validity,
854873
- unsigned local verification receipts are diagnostics only,
@@ -872,6 +891,8 @@ Verification:
872891
- outcome classification tests,
873892
- cache-behavior tests proving resource exhaustion is not stored as invalid,
874893
- complete invalid-result cache-key tests,
894+
- per-outcome cacheability matrix tests,
895+
- stale contextual cache fixtures,
875896
- retry-with-larger-budget tests,
876897
- verification receipt fixtures,
877898
- unsigned receipt diagnostic-only fixtures,
@@ -1039,7 +1060,11 @@ Deliverables:
10391060
- deterministic reconciliation ordering,
10401061
- recheck of cycles when missing parents arrive,
10411062
- unresolved-parent table size bound,
1042-
- per-issuer orphan count bound,
1063+
- unauthenticated global orphan count bound,
1064+
- unauthenticated transport-peer or source orphan count bound,
1065+
- per-issuer orphan count bound only after issuer authentication,
1066+
- rule that unauthenticated issuer claims cannot consume authenticated issuer
1067+
quota,
10431068
- orphan lifetime and retention policy,
10441069
- fetch attempt and referenced-byte budgets,
10451070
- garbage collection rules that preserve checkpointed evidence,
@@ -1052,6 +1077,7 @@ Verification:
10521077
- late-parent cycle rejection tests,
10531078
- property tests for orphan promotion ordering,
10541079
- orphan table saturation tests,
1080+
- unauthenticated orphan-quota bypass tests,
10551081
- explanation bundle tests for incomplete graphs.
10561082

10571083
Exit criteria:
@@ -1060,7 +1086,9 @@ Exit criteria:
10601086
become available,
10611087
- unresolved objects are staged and not causally usable until deterministic
10621088
promotion succeeds,
1063-
- validly shaped missing-parent references cannot fill storage without bounds.
1089+
- validly shaped missing-parent references cannot fill storage without bounds,
1090+
- unauthenticated missing-parent submissions cannot block authenticated issuer
1091+
capacity.
10641092

10651093
### v0.22.0 - Relationship Semantics And Edge Roles
10661094

@@ -1108,6 +1136,19 @@ Deliverables:
11081136
- offline checkpoint-relative freshness,
11091137
- nonce scope over realm, issuer, audience, operation class, and nonce,
11101138
- atomic `check_and_record` replay store trait,
1139+
- ordering rule: verify signature, key, audience, and basic authority before
1140+
permanent replay-state commit,
1141+
- optional reservation model only with reserve, verify, commit, and abort
1142+
states, opaque reservation tokens, TTLs, crash recovery, and strict
1143+
reservation bounds,
1144+
- rule that failed authentication never permanently consumes nonce or sequence
1145+
replay state,
1146+
- rule that two concurrent valid requests using the same nonce may both perform
1147+
cryptographic work, but only one can atomically commit,
1148+
- rule that early duplicate lookup is advisory only and authoritative replay
1149+
rejection happens during atomic commit,
1150+
- rule that reservations from unauthenticated sources cannot block
1151+
authenticated traffic,
11111152
- crash persistence and rollback behavior,
11121153
- issuer sequence policy,
11131154
- sequence-gap and concurrent-request policy,
@@ -1120,12 +1161,16 @@ Verification:
11201161
- expired statement tests,
11211162
- duplicate nonce and sequence tests,
11221163
- atomic replay race fixtures,
1164+
- invalid-signature replay poisoning fixtures,
1165+
- crash-during-reservation fixtures,
1166+
- advisory early duplicate lookup fixtures,
11231167
- cache saturation tests.
11241168

11251169
Exit criteria:
11261170

11271171
- consequential statements cannot be accepted without atomic replay and
1128-
freshness policy.
1172+
freshness policy,
1173+
- failed authentication cannot permanently consume replay state.
11291174

11301175
### v0.24.0 - Capability Verification
11311176

@@ -1330,6 +1375,18 @@ Deliverables:
13301375
- rule that documented variable-time behavior does not qualify for
13311376
high-assurance consequential signing,
13321377
- verifier-provider adversary model for malicious or compromised providers,
1378+
- admitted primitive providers are part of the trusted computing base through
1379+
`v1.0.0`,
1380+
- defended provider failures: format errors, crashes, resource abuse, and
1381+
capability misreporting,
1382+
- trusted-boundary failure: an admitted compromised provider that returns
1383+
arbitrary false cryptographic success,
1384+
- rule that provider assurance classes are assigned by local policy or
1385+
admission records, never trusted directly from provider self-reported
1386+
metadata,
1387+
- multi-provider runtime agreement is not required through `v1.0.0` and is
1388+
reserved for `v1.1.0 - Multi-Provider Verification Agreement` if BCX admits
1389+
that model after `v1.0.0`,
13331390
- resource-amplification input handling requirements for provider dispatch.
13341391

13351392
Verification:
@@ -1338,12 +1395,16 @@ Verification:
13381395
- high-assurance rejection tests for side-channel-unassessed providers,
13391396
- test-only provider feature-guard tests,
13401397
- malicious verifier provider fixtures,
1398+
- provider self-reported metadata rejection fixtures,
1399+
- trusted-boundary failure documentation check,
13411400
- resource-amplification fixtures.
13421401

13431402
Exit criteria:
13441403

13451404
- provider admission distinguishes documentation from assurance, and
1346-
high-assurance profiles cannot accidentally admit variable-time signing.
1405+
high-assurance profiles cannot accidentally admit variable-time signing,
1406+
- BCX's `v1.0.0` security claim does not tolerate arbitrary Byzantine false
1407+
success from an admitted primitive provider.
13471408

13481409
### v0.29.0 - Signing Provider Boundary
13491410

@@ -1861,20 +1922,27 @@ Deliverables:
18611922
- verification receipt vocabulary from `v0.17.1`,
18621923
- distinction between unsigned local diagnostic receipts and attestable
18631924
verification receipts,
1925+
- distinct verification-receipt signature domain,
1926+
- direct receipt verification path that does not recursively require another
1927+
verification receipt,
18641928
- trusted verifier role requirements for receipt acceptance,
18651929
- policy rule that consumers re-execute verification unless they accept a
18661930
receipt under an explicit trusted verifier role,
18671931
- transparency receipt vocabulary for inclusion, consistency, disclosure, and
18681932
non-inclusion,
18691933
- receipt-to-statement commitment rules,
1870-
- receipt binding to statement ID, verification context, roots, policy epoch,
1871-
`CostScheduleId`, outcome, and completion state where applicable,
1934+
- receipt preimage binding to statement ID, receipt signer identity,
1935+
verification context, verification profile and version, authenticated
1936+
evaluation point, roots, policy epoch, `CostScheduleId`, outcome, and
1937+
completion state where applicable,
18721938
- receipt assurance classification.
18731939

18741940
Verification:
18751941

18761942
- receipt validation fixtures,
18771943
- forged verification receipt fixtures,
1944+
- recursive receipt-verification rejection fixtures,
1945+
- wrong receipt-signature domain fixtures,
18781946
- sender-provided receipt cannot suppress local verification fixtures,
18791947
- cross-root, cross-policy, and cross-checkpoint receipt replay fixtures,
18801948
- wrong receipt class fixtures,
@@ -2945,6 +3013,8 @@ Verification:
29453013
- `cargo test -p bcx-proof-threshold`,
29463014
- signer-set epoch and rotation fixtures,
29473015
- exact quorum-formula fixtures,
3016+
- boundary fixtures for `q = 0`, `q > n`, `f >= n`, and arithmetic at integer
3017+
maxima,
29483018
- overflow-safe arithmetic fixtures,
29493019
- impossible-configuration rejection tests,
29503020
- quorum-intersection fixtures,

docs/security-controls.md

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,10 @@ Required controls from the first production profile:
88
- audience binding,
99
- nonce and expiry,
1010
- issuer sequence numbers,
11-
- atomic replay `check_and_record` with scoped nonce and sequence policy,
11+
- atomic replay `check_and_record` with scoped nonce and sequence policy after
12+
signature, key, audience, and basic authority verification, or bounded
13+
reserve/verify/commit/abort semantics,
14+
- failed authentication never permanently consumes replay state,
1215
- proof-of-possession capabilities,
1316
- canonical policy records and signed policy-evaluation evidence,
1417
- immutable trust snapshots for key, policy, and revocation resolution,
@@ -17,6 +20,8 @@ Required controls from the first production profile:
1720
- production provider admission with provider assurance classes, secret
1821
zeroization, entropy-source health, fault-injection behavior, and external
1922
guarantee boundaries,
23+
- admitted primitive providers treated as trusted computing base for
24+
cryptographic truth through `v1.0.0`,
2025
- hybrid all-component acceptance with composite key lifecycle, epoch,
2126
revocation, expiry, and fail-closed downgrade rules,
2227
- explicit native binding for each consequential carrier, ledger, or storage
@@ -26,15 +31,20 @@ Required controls from the first production profile:
2631
cryptographic verification,
2732
- checked `VerificationBudget` and versioned `VerificationCostSchedule`,
2833
- indeterminate resource-exhaustion outcomes that are not cached as invalid,
34+
- cacheability matrix by outcome class with replay-store generation/state
35+
binding for replay results,
2936
- locally unsupported recognized suites and temporarily unavailable providers
3037
separated from structurally invalid or policy-forbidden suites,
3138
- verification receipts recording cost schedule, consumed units, completion
3239
state, signer role, roots, and policy epoch,
40+
- verification receipts using a distinct receipt-signature domain and direct
41+
receipt verification path,
3342
- sender-provided verification receipts accepted only through explicit local
3443
policy or re-execution,
3544
- bounded WHY depth and node count,
36-
- bounded unresolved-parent staging, orphan retention, fetch attempts, and
37-
referenced bytes,
45+
- bounded unresolved-parent staging, orphan retention, fetch attempts,
46+
referenced bytes, unauthenticated source quotas, and authenticated per-issuer
47+
quotas only after issuer authentication,
3848
- explicit distinction between declared, observed, verified, enforced,
3949
acknowledged, witnessed, settled, contradicted, and unknown or incomplete
4050
evaluation outcomes,

docs/threat-model.md

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,15 @@ internal motive.
2424
evidence.
2525
- Settlement finality overclaims.
2626
- Cross-profile downgrade or replay.
27-
- Malicious or compromised verifier providers.
27+
- Provider format errors, crashes, resource abuse, and capability
28+
misreporting.
29+
- Compromised admitted providers as trusted-boundary failures.
2830
- Resource-amplification inputs that force expensive verification paths.
2931
- Threshold witness equivocation or disjoint-quorum finality claims.
3032
- Forged or replayed verification receipts.
33+
- Replay-store poisoning before authentication.
34+
- Stale contextual verification-cache reuse.
35+
- Unauthenticated orphan-quota bypass.
3136

3237
## Out Of Scope
3338

@@ -41,6 +46,8 @@ internal motive.
4146
underlying systems.
4247
- Proving that an underlying chain or service is honest beyond its configured
4348
finality and evidence model.
49+
- Tolerating arbitrary false cryptographic success from a compromised admitted
50+
primitive provider through `v1.0.0`.
4451

4552
## Security Claims
4653

@@ -64,7 +71,7 @@ BCX must not claim:
6471
offchain business purpose was honest,
6572
- a missing parent does not exist,
6673
- a redacted explanation is complete,
67-
- an HTTP wrapper or blockchain transaction is proof by itself.
74+
- an HTTP wrapper or blockchain transaction is proof by itself,
6875
- a sender-provided verification receipt suppresses required local verification
6976
unless local policy explicitly trusts that verifier role.
7077

@@ -96,4 +103,7 @@ Every WHY query must be authenticated and bounded by:
96103
- verification budget and cost-schedule rules,
97104
- provider assurance policy,
98105
- receipt replay boundaries,
106+
- replay-store authentication-before-commit policy,
107+
- cacheability-by-outcome policy,
108+
- unauthenticated source quota policy,
99109
- threshold quorum-intersection policy.

0 commit comments

Comments
 (0)