Skip to content

Commit 2d278be

Browse files
committed
Update BCR-2026-004 per reviewer feedback
1 parent 109965f commit 2d278be

1 file changed

Lines changed: 60 additions & 35 deletions

File tree

papers/bcr-2026-004-anchor-predicates.md

Lines changed: 60 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,27 @@ Assertions in Gordian Envelopes may need independent attestation that they exist
4646
- **Signing** — which implies consent or authorship
4747
- **Witnessing** (human) — which implies observation of events
4848

49-
Cryptographic event logs (as in Certificate Transparency, Key Transparency, and CEL) provide append-only structures where independent parties can attest to having observed an assertion, without implying approval.
49+
Cryptographic event logs (as in Certificate Transparency, Key Transparency, and CEL) provide **append-only** structures where independent parties can attest to having observed an assertion, without implying approval.
50+
51+
### Why Anchoring Matters
52+
53+
Anchoring provides **proof of existence and ordering** without requiring trust in the asserter:
54+
55+
1. **Certificate Transparency** — Public logs prove certificates existed at a point in time, enabling detection of misissued certificates even after the fact
56+
2. **Key Transparency** — Append-only logs of key bindings prevent silent key replacement attacks
57+
3. **Software Transparency** — Binary hashes in logs prove what code was distributed, enabling detection of supply chain attacks
58+
59+
In all cases, the value comes from the log's **append-only, publicly auditable nature**. Once an assertion is anchored, it cannot be removed or altered — the log provides permanent evidence that the assertion existed.
60+
61+
### Use Cases
62+
63+
**Timestamp Authority**: An independent service anchors assertions to prove they existed before a certain time — useful for intellectual property, contract precedence, or regulatory compliance.
64+
65+
**Multi-Party Attestation**: Multiple log operators anchor the same assertion (quorum), providing resilience against any single operator being compromised or unavailable.
66+
67+
**Audit Trails**: Anchoring creates tamper-evident records of assertions for compliance, legal discovery, or forensic analysis.
68+
69+
**Revocation Detection**: When combined with `supersedes` (BCR-2026-005), anchoring enables detection of attempts to silently replace assertions — the original anchor remains in the log even after supersession.
5070

5171
### Terminology Distinction
5272

@@ -65,7 +85,7 @@ This specification defines predicates for cryptographic log anchoring:
6585
| `anchoredBy` | Who anchored the assertion |
6686
| `anchors` | What assertion is anchored |
6787
| `anchoredAt` | When it was anchored |
68-
| `anchorHash` | Cryptographic binding |
88+
| `anchorDigest` | Cryptographic binding |
6989
| `anchorLog` | Which log contains the anchor |
7090

7191
Optional extensions for multi-anchor scenarios:
@@ -74,13 +94,15 @@ Optional extensions for multi-anchor scenarios:
7494
| `anchorQuorum` | Minimum anchors required |
7595
| `anchorIndex` | Position in log |
7696

77-
### Inference Source
97+
### Conceptual Foundation
7898

79-
These predicates are derived from concepts in:
99+
These predicates are **Envelope-native vocabulary** for expressing anchoring relationships within Gordian Envelopes, which uses concepts inspired by:
80100
- [Cryptographic Event Logs (CEL)](https://digitalbazaar.github.io/cel-spec/)
81101
- Certificate Transparency (RFC 6962)
82102
- Key Transparency systems
83103

104+
> **Note**: This is not a bridge format or interoperability specification for CT/CEL. Round-trip conversion to/from external log formats would require a separate specification.
105+
84106
## Terminology
85107

86108
**Anchor**: A cryptographic attestation that an assertion exists in a log, without implying consent or approval.
@@ -109,7 +131,7 @@ All proposed codepoints are in the **Core Registry** range (0-99).
109131

110132
```
111133
{
112-
CID(my-assertion) [
134+
Digest(my-assertion) [
113135
'anchoredBy': XID(log-operator)
114136
'anchoredAt': 2026-02-02T12:00:00Z
115137
]
@@ -127,15 +149,15 @@ All proposed codepoints are in the **Core Registry** range (0-99).
127149
**Type**: property
128150
**Definition**: References the assertion that is being anchored.
129151
**Domain**: Anchor assertion
130-
**Range**: CID or URI of the anchored assertion
152+
**Range**: Digest or URI of the anchored assertion
131153
**Usage**: Establishes an explicit, verifiable link between an anchor assertion and the assertion it attests to.
132154

133155
```
134156
{
135-
CID(anchor-assertion) [
136-
'anchors': CID(original-assertion)
157+
Digest(anchor-assertion) [
158+
'anchors': Digest(original-assertion)
137159
'anchoredBy': XID(log-operator)
138-
'anchorHash': "sha256:abc123..."
160+
'anchorDigest': Digest(abc123...)
139161
]
140162
}
141163
```
@@ -156,26 +178,27 @@ All proposed codepoints are in the **Core Registry** range (0-99).
156178

157179
---
158180

159-
#### 90: `anchorHash`
181+
#### 90: `anchorDigest`
160182

161183
**Type**: property
162-
**Definition**: A cryptographic hash of the canonical form of the assertion being anchored.
184+
**Definition**: A cryptographic digest of the canonical form of the assertion being anchored.
163185
**Domain**: Anchor assertion
164-
**Range**: Multihash or hash string
186+
**Range**: Digest
165187
**Usage**: Cryptographically binds the anchor to a specific assertion representation.
166188

167189
```
168190
{
169-
CID(anchor-assertion) [
170-
'anchors': CID(original-assertion)
171-
'anchorHash': "sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
191+
Digest(anchor-assertion) [
192+
'anchors': Digest(original-assertion)
193+
'anchorDigest': Digest(e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855)
172194
]
173195
}
174196
```
175197

176198
**Notes**:
177199
- Enables verification that the anchored content hasn't changed
178-
- Should use the canonical envelope hash
200+
- Uses the native Envelope `Digest` type for type safety
201+
- Should use the canonical envelope digest
179202

180203
---
181204

@@ -189,8 +212,8 @@ All proposed codepoints are in the **Core Registry** range (0-99).
189212

190213
```
191214
{
192-
CID(anchor-assertion) [
193-
'anchors': CID(original-assertion)
215+
Digest(anchor-assertion) [
216+
'anchors': Digest(original-assertion)
194217
'anchorLog': "https://log.example.com/v1"
195218
]
196219
}
@@ -208,7 +231,7 @@ All proposed codepoints are in the **Core Registry** range (0-99).
208231

209232
```
210233
{
211-
CID(high-value-assertion) [
234+
Digest(high-value-assertion) [
212235
'anchorQuorum': 3
213236
]
214237
}
@@ -230,8 +253,8 @@ All proposed codepoints are in the **Core Registry** range (0-99).
230253

231254
```
232255
{
233-
CID(anchor-assertion) [
234-
'anchors': CID(original-assertion)
256+
Digest(anchor-assertion) [
257+
'anchors': Digest(original-assertion)
235258
'anchorLog': "https://log.example.com/v1"
236259
'anchorIndex': 12345
237260
]
@@ -246,11 +269,11 @@ All proposed codepoints are in the **Core Registry** range (0-99).
246269

247270
```
248271
{
249-
CID(anchor-assertion) [
250-
'anchors': CID(original-document)
272+
Digest(anchor-assertion) [
273+
'anchors': Digest(original-document)
251274
'anchoredBy': XID(transparency-log)
252275
'anchoredAt': 2026-02-02T12:00:00Z
253-
'anchorHash': "sha256:..."
276+
'anchorDigest': Digest(...)
254277
'anchorLog': "https://log.example.com/v1"
255278
]
256279
}
@@ -260,42 +283,44 @@ All proposed codepoints are in the **Core Registry** range (0-99).
260283

261284
```
262285
{
263-
CID(important-assertion) [
286+
Digest(important-assertion) [
264287
'anchorQuorum': 2
265288
]
266289
}
267290
268291
// Anchor 1
269292
{
270-
CID(anchor-1) [
271-
'anchors': CID(important-assertion)
293+
Digest(anchor-1) [
294+
'anchors': Digest(important-assertion)
272295
'anchoredBy': XID(log-operator-a)
273296
]
274297
}
275298
276299
// Anchor 2
277300
{
278-
CID(anchor-2) [
279-
'anchors': CID(important-assertion)
301+
Digest(anchor-2) [
302+
'anchors': Digest(important-assertion)
280303
'anchoredBy': XID(log-operator-b)
281304
]
282305
}
283306
```
284307

285-
### Anchor with Revocation
308+
### Anchor with Supersession
286309

287-
Using `supersedes` from BCR-2026-005 (General Assertions):
310+
Using `supersedes` from BCR-2026-005 (General Assertions) to indicate an assertion has been replaced:
288311

289312
```
290313
{
291-
CID(revocation-anchor) [
292-
'anchors': CID(revoked-assertion)
293-
'supersedes': CID(original-anchor)
314+
Digest(supersession-anchor) [
315+
'anchors': Digest(superseding-assertion)
316+
'supersedes': Digest(original-anchor)
294317
'anchoredBy': XID(log-operator)
295318
]
296319
}
297320
```
298321

322+
> **Important**: This creates a **new** anchor entry in the log. The original anchor remains permanently in the append-only log — it is not modified or deleted. The `supersedes` predicate creates a forward reference, allowing verifiers to discover that a newer version exists. This is how Certificate Transparency handles certificate revocation: the original certificate's log entry persists, but a newer entry supersedes it.
323+
299324
## Relationship to Other Predicates
300325

301326
### Core Registry
@@ -332,7 +357,7 @@ The `anchorIndex` predicate supports detection of log equivocation — where a l
332357

333358
### Hash Binding
334359

335-
The `anchorHash` provides cryptographic binding between the anchor and the anchored content. Verifiers should confirm that the hash matches the canonical form of the referenced assertion.
360+
The `anchorDigest` provides cryptographic binding between the anchor and the anchored content. Verifiers should confirm that the hash matches the canonical form of the referenced assertion.
336361

337362
## Open Questions
338363

0 commit comments

Comments
 (0)