You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: papers/bcr-2026-004-anchor-predicates.md
+60-35Lines changed: 60 additions & 35 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -46,7 +46,27 @@ Assertions in Gordian Envelopes may need independent attestation that they exist
46
46
-**Signing** — which implies consent or authorship
47
47
-**Witnessing** (human) — which implies observation of events
48
48
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
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.
50
70
51
71
### Terminology Distinction
52
72
@@ -65,7 +85,7 @@ This specification defines predicates for cryptographic log anchoring:
65
85
|`anchoredBy`| Who anchored the assertion |
66
86
|`anchors`| What assertion is anchored |
67
87
|`anchoredAt`| When it was anchored |
68
-
|`anchorHash`| Cryptographic binding |
88
+
|`anchorDigest`| Cryptographic binding |
69
89
|`anchorLog`| Which log contains the anchor |
70
90
71
91
Optional extensions for multi-anchor scenarios:
@@ -74,13 +94,15 @@ Optional extensions for multi-anchor scenarios:
74
94
|`anchorQuorum`| Minimum anchors required |
75
95
|`anchorIndex`| Position in log |
76
96
77
-
### Inference Source
97
+
### Conceptual Foundation
78
98
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:
> **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
+
84
106
## Terminology
85
107
86
108
**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).
109
131
110
132
```
111
133
{
112
-
CID(my-assertion) [
134
+
Digest(my-assertion) [
113
135
'anchoredBy': XID(log-operator)
114
136
'anchoredAt': 2026-02-02T12:00:00Z
115
137
]
@@ -127,15 +149,15 @@ All proposed codepoints are in the **Core Registry** range (0-99).
127
149
**Type**: property
128
150
**Definition**: References the assertion that is being anchored.
129
151
**Domain**: Anchor assertion
130
-
**Range**: CID or URI of the anchored assertion
152
+
**Range**: Digest or URI of the anchored assertion
131
153
**Usage**: Establishes an explicit, verifiable link between an anchor assertion and the assertion it attests to.
132
154
133
155
```
134
156
{
135
-
CID(anchor-assertion) [
136
-
'anchors': CID(original-assertion)
157
+
Digest(anchor-assertion) [
158
+
'anchors': Digest(original-assertion)
137
159
'anchoredBy': XID(log-operator)
138
-
'anchorHash': "sha256:abc123..."
160
+
'anchorDigest': Digest(abc123...)
139
161
]
140
162
}
141
163
```
@@ -156,26 +178,27 @@ All proposed codepoints are in the **Core Registry** range (0-99).
156
178
157
179
---
158
180
159
-
#### 90: `anchorHash`
181
+
#### 90: `anchorDigest`
160
182
161
183
**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.
163
185
**Domain**: Anchor assertion
164
-
**Range**: Multihash or hash string
186
+
**Range**: Digest
165
187
**Usage**: Cryptographically binds the anchor to a specific assertion representation.
- 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
179
202
180
203
---
181
204
@@ -189,8 +212,8 @@ All proposed codepoints are in the **Core Registry** range (0-99).
189
212
190
213
```
191
214
{
192
-
CID(anchor-assertion) [
193
-
'anchors': CID(original-assertion)
215
+
Digest(anchor-assertion) [
216
+
'anchors': Digest(original-assertion)
194
217
'anchorLog': "https://log.example.com/v1"
195
218
]
196
219
}
@@ -208,7 +231,7 @@ All proposed codepoints are in the **Core Registry** range (0-99).
208
231
209
232
```
210
233
{
211
-
CID(high-value-assertion) [
234
+
Digest(high-value-assertion) [
212
235
'anchorQuorum': 3
213
236
]
214
237
}
@@ -230,8 +253,8 @@ All proposed codepoints are in the **Core Registry** range (0-99).
230
253
231
254
```
232
255
{
233
-
CID(anchor-assertion) [
234
-
'anchors': CID(original-assertion)
256
+
Digest(anchor-assertion) [
257
+
'anchors': Digest(original-assertion)
235
258
'anchorLog': "https://log.example.com/v1"
236
259
'anchorIndex': 12345
237
260
]
@@ -246,11 +269,11 @@ All proposed codepoints are in the **Core Registry** range (0-99).
246
269
247
270
```
248
271
{
249
-
CID(anchor-assertion) [
250
-
'anchors': CID(original-document)
272
+
Digest(anchor-assertion) [
273
+
'anchors': Digest(original-document)
251
274
'anchoredBy': XID(transparency-log)
252
275
'anchoredAt': 2026-02-02T12:00:00Z
253
-
'anchorHash': "sha256:..."
276
+
'anchorDigest': Digest(...)
254
277
'anchorLog': "https://log.example.com/v1"
255
278
]
256
279
}
@@ -260,42 +283,44 @@ All proposed codepoints are in the **Core Registry** range (0-99).
260
283
261
284
```
262
285
{
263
-
CID(important-assertion) [
286
+
Digest(important-assertion) [
264
287
'anchorQuorum': 2
265
288
]
266
289
}
267
290
268
291
// Anchor 1
269
292
{
270
-
CID(anchor-1) [
271
-
'anchors': CID(important-assertion)
293
+
Digest(anchor-1) [
294
+
'anchors': Digest(important-assertion)
272
295
'anchoredBy': XID(log-operator-a)
273
296
]
274
297
}
275
298
276
299
// Anchor 2
277
300
{
278
-
CID(anchor-2) [
279
-
'anchors': CID(important-assertion)
301
+
Digest(anchor-2) [
302
+
'anchors': Digest(important-assertion)
280
303
'anchoredBy': XID(log-operator-b)
281
304
]
282
305
}
283
306
```
284
307
285
-
### Anchor with Revocation
308
+
### Anchor with Supersession
286
309
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:
288
311
289
312
```
290
313
{
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)
294
317
'anchoredBy': XID(log-operator)
295
318
]
296
319
}
297
320
```
298
321
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
+
299
324
## Relationship to Other Predicates
300
325
301
326
### Core Registry
@@ -332,7 +357,7 @@ The `anchorIndex` predicate supports detection of log equivocation — where a l
332
357
333
358
### Hash Binding
334
359
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.
0 commit comments