Jonna247 commited on
Commit
8461295
·
verified ·
1 Parent(s): 2c1eedf

Upload 2 files

Browse files
Files changed (2) hide show
  1. draft-fassbender-scitt-time-anchor-01.txt +1960 -0
  2. model.txt +15 -0
draft-fassbender-scitt-time-anchor-01.txt ADDED
@@ -0,0 +1,1960 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+
3
+
4
+
5
+ Network Working Group J. Fassbender
6
+ Internet-Draft Umarise
7
+ Intended status: Informational 27 April 2026
8
+ Expires: 29 October 2026
9
+
10
+
11
+ External Temporal Anchoring for Transparency Services
12
+ draft-fassbender-scitt-time-anchor-01
13
+
14
+ Abstract
15
+
16
+ This document defines a mechanism for external temporal anchoring of
17
+ digital artifacts by committing cryptographic hashes to an
18
+ independent, publicly verifiable ledger -- specifically, the Bitcoin
19
+ blockchain via the OpenTimestamps protocol. The resulting proof is
20
+ independently verifiable by any party with access to ledger state,
21
+ without reliance on a trusted third party. The SCITT Architecture
22
+ [RFC9943] is used as the primary integration example, but the
23
+ anchoring primitive is applicable to any system requiring externally
24
+ verifiable temporal proof. No changes to the SCITT architecture are
25
+ required.
26
+
27
+ Status of This Memo
28
+
29
+ This Internet-Draft is submitted in full conformance with the
30
+ provisions of BCP 78 and BCP 79.
31
+
32
+ Internet-Drafts are working documents of the Internet Engineering
33
+ Task Force (IETF). Note that other groups may also distribute
34
+ working documents as Internet-Drafts. The list of current Internet-
35
+ Drafts is at https://datatracker.ietf.org/drafts/current/.
36
+
37
+ Internet-Drafts are draft documents valid for a maximum of six months
38
+ and may be updated, replaced, or obsoleted by other documents at any
39
+ time. It is inappropriate to use Internet-Drafts as reference
40
+ material or to cite them other than as "work in progress."
41
+
42
+ This Internet-Draft will expire on 29 October 2026.
43
+
44
+ Copyright Notice
45
+
46
+ Copyright (c) 2026 IETF Trust and the persons identified as the
47
+ document authors. All rights reserved.
48
+
49
+
50
+
51
+
52
+
53
+
54
+
55
+
56
+ Fassbender Expires 29 October 2026 [Page 1]
57
+
58
+ Internet-Draft External Temporal Anchoring April 2026
59
+
60
+
61
+ This document is subject to BCP 78 and the IETF Trust's Legal
62
+ Provisions Relating to IETF Documents (https://trustee.ietf.org/
63
+ license-info) in effect on the date of publication of this document.
64
+ Please review these documents carefully, as they describe your rights
65
+ and restrictions with respect to this document.
66
+
67
+ Table of Contents
68
+
69
+ 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3
70
+ 1.1. Motivating Example . . . . . . . . . . . . . . . . . . . 5
71
+ 1.2. Requirements Language . . . . . . . . . . . . . . . . . . 5
72
+ 1.3. Terminology . . . . . . . . . . . . . . . . . . . . . . . 5
73
+ 2. Anchoring Model . . . . . . . . . . . . . . . . . . . . . . . 5
74
+ 2.1. Overview . . . . . . . . . . . . . . . . . . . . . . . . 6
75
+ 2.2. Statement Anchoring . . . . . . . . . . . . . . . . . . . 7
76
+ 2.3. Log Root Anchoring . . . . . . . . . . . . . . . . . . . 7
77
+ 2.4. Anchor Proof Format . . . . . . . . . . . . . . . . . . . 7
78
+ 2.4.1. Abstract Field Requirements . . . . . . . . . . . . . 8
79
+ 2.4.2. OpenTimestamps Wire Format Mapping . . . . . . . . . 9
80
+ 2.5. Anchor Ledger Requirements . . . . . . . . . . . . . . . 10
81
+ 2.6. Temporal Precision . . . . . . . . . . . . . . . . . . . 10
82
+ 2.6.1. Temporal Claim . . . . . . . . . . . . . . . . . . . 10
83
+ 2.6.2. Assumptions . . . . . . . . . . . . . . . . . . . . . 11
84
+ 2.6.3. Temporal Bound . . . . . . . . . . . . . . . . . . . 11
85
+ 2.6.4. Non-Claims . . . . . . . . . . . . . . . . . . . . . 11
86
+ 2.7. Architectural Overview . . . . . . . . . . . . . . . . . 12
87
+ 2.7.1. Anchoring Flow . . . . . . . . . . . . . . . . . . . 12
88
+ 2.7.2. Verification Flow . . . . . . . . . . . . . . . . . . 12
89
+ 3. Verification Procedure . . . . . . . . . . . . . . . . . . . 13
90
+ 3.1. Verification Algorithm (VERIFY-ANCHOR) . . . . . . . . . 13
91
+ 3.2. Verification Independence . . . . . . . . . . . . . . . . 15
92
+ 3.3. Error Conditions . . . . . . . . . . . . . . . . . . . . 16
93
+ 4. Integration with SCITT Architecture . . . . . . . . . . . . . 16
94
+ 4.1. No Protocol Changes Required . . . . . . . . . . . . . . 16
95
+ 4.2. Metadata Extension . . . . . . . . . . . . . . . . . . . 17
96
+ 4.3. Receipt Association . . . . . . . . . . . . . . . . . . . 17
97
+ 4.4. Relationship to RFC 9921 (COSE Timestamp Headers) . . . . 17
98
+ 5. Formal Security Argument . . . . . . . . . . . . . . . . . . 18
99
+ 5.1. Claim . . . . . . . . . . . . . . . . . . . . . . . . . . 18
100
+ 5.2. Assumptions . . . . . . . . . . . . . . . . . . . . . . . 18
101
+ 5.3. Note on Assumption A4 . . . . . . . . . . . . . . . . . . 19
102
+ 5.4. Proof . . . . . . . . . . . . . . . . . . . . . . . . . . 20
103
+ 5.5. Strength and Limitations . . . . . . . . . . . . . . . . 20
104
+ 5.6. Anchor Proof Integrity . . . . . . . . . . . . . . . . . 21
105
+ 5.7. Hash Algorithm Agility . . . . . . . . . . . . . . . . . 21
106
+ 5.8. Ledger Availability . . . . . . . . . . . . . . . . . . . 21
107
+ 5.9. Equivocation Detection . . . . . . . . . . . . . . . . . 21
108
+ 6. Security Considerations . . . . . . . . . . . . . . . . . . . 22
109
+
110
+
111
+
112
+ Fassbender Expires 29 October 2026 [Page 2]
113
+
114
+ Internet-Draft External Temporal Anchoring April 2026
115
+
116
+
117
+ 6.1. Threat: Hash Collision (Forged Commitment) . . . . . . . 22
118
+ 6.2. Threat: Anchor Ledger Rewrite (51% Attack) . . . . . . . 22
119
+ 6.3. Threat: Calendar Server Equivocation . . . . . . . . . . 23
120
+ 6.4. Threat: Transparency Service Equivocation . . . . . . . . 23
121
+ 6.5. Threat: Temporal Claim Inflation . . . . . . . . . . . . 23
122
+ 6.6. Threat: Anchor Proof Tampering . . . . . . . . . . . . . 23
123
+ 6.7. Threat: Denial of Anchoring Service . . . . . . . . . . . 24
124
+ 6.8. Threat: Long-Term Hash Algorithm Compromise . . . . . . . 24
125
+ 6.9. Trust Boundary: Hash Intake . . . . . . . . . . . . . . . 24
126
+ 6.10. Positive Property: No Long-Term Key Dependency . . . . . 25
127
+ 6.11. Threat: Premature Anchored State (False Finality) . . . . 25
128
+ 6.12. Threat: Batch Integrity Compromise (Merkle Mixing) . . . 26
129
+ 7. Privacy Considerations . . . . . . . . . . . . . . . . . . . 26
130
+ 8. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 27
131
+ 9. Normative References . . . . . . . . . . . . . . . . . . . . 27
132
+ 10. Informative References . . . . . . . . . . . . . . . . . . . 28
133
+ Appendix A. Relationship to Four-Layer Evidence Stack . . . . . 29
134
+ Appendix B. Example: Anchored SCITT Flow . . . . . . . . . . . . 30
135
+ Appendix C. Implementation Status . . . . . . . . . . . . . . . 30
136
+ Appendix D. Acknowledgements . . . . . . . . . . . . . . . . . . 30
137
+ Appendix E. OTS Anchoring Protocol -- Construction and
138
+ Verification . . . . . . . . . . . . . . . . . . . . . . 31
139
+ E.1. D.1. Construction Algorithm (Anchor) . . . . . . . . . . 31
140
+ E.2. D.2. Upgrade Algorithm (Bitcoin Confirmation) . . . . . 32
141
+ E.3. D.3. Batch Anchoring with Merkle Trees . . . . . . . . . 34
142
+ E.4. D.4. Verification Algorithm . . . . . . . . . . . . . . 35
143
+ E.5. D.5. Verification Independence . . . . . . . . . . . . . 35
144
+ Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 35
145
+
146
+ 1. Introduction
147
+
148
+ Cryptographic time-stamping -- proving that a datum existed at or
149
+ before a given point in time -- is a foundational primitive for
150
+ audit, compliance, and non-repudiation on the Internet.
151
+
152
+ RFC 3161 [RFC3161] defines a widely deployed protocol in which a
153
+ trusted Time Stamping Authority (TSA) signs a timestamp token binding
154
+ a hash to a point in time. The security of an RFC 3161 timestamp
155
+ depends on the TSA's private key, its operational continuity, and the
156
+ validity of its certificate chain. If the TSA ceases operations, its
157
+ certificate expires without renewal, or its key is compromised,
158
+ previously issued timestamps may become unverifiable or disputed.
159
+
160
+
161
+
162
+
163
+
164
+
165
+
166
+
167
+
168
+ Fassbender Expires 29 October 2026 [Page 3]
169
+
170
+ Internet-Draft External Temporal Anchoring April 2026
171
+
172
+
173
+ This document defines a complementary mechanism in which temporal
174
+ proof derives from inclusion in a public, append-only ledger
175
+ maintained by computational consensus -- specifically, the Bitcoin
176
+ blockchain. The resulting proof is independently verifiable by any
177
+ party with access to ledger state, without reliance on any single
178
+ authority or certificate chain.
179
+
180
+ The distinction is structural:
181
+
182
+ * RFC 3161: a trusted authority attests to the time of a hash
183
+ commitment. Verification requires trust in that authority.
184
+ * This document: temporal proof is a consequence of ledger
185
+ inclusion. Verification requires only access to public ledger
186
+ state.
187
+
188
+ These approaches are not mutually exclusive. A system MAY use both
189
+ RFC 3161 timestamps and ledger-based anchoring to provide
190
+ complementary assurance under different trust assumptions.
191
+
192
+ The SCITT Architecture [RFC9943] is used as the primary integration
193
+ example throughout this document. SCITT defines a framework for
194
+ Transparency Services that record signed claims about digital
195
+ artifacts. A Transparency Service receives Signed Statements,
196
+ appends them to a verifiable log, and returns cryptographic Receipts
197
+ proving inclusion.
198
+
199
+ SCITT is deliberately ledger-agnostic and does not mandate a specific
200
+ time source. Time is derived from log position -- an internal clock
201
+ controlled by the Transparency Service operator. This creates an
202
+ architectural gap: the system that manages the evidence also manages
203
+ the timeline. The operator can:
204
+
205
+ * Delay recording without detection
206
+ * Backdate entries (within operational constraints)
207
+ * Present different log views to different auditors (equivocation)
208
+
209
+ Furthermore, the Verifier does not need to trust any Calendar Server
210
+ or anchoring intermediary -- the trust root is Bitcoin consensus
211
+ itself. This property, termed "verification independence" in this
212
+ document (Section 3.2), is the primary architectural distinction from
213
+ existing time-stamping mechanisms. SCITT mitigates equivocation
214
+ through consistency proofs, but these proofs are relative to the log
215
+ itself. There is no external reference point.
216
+
217
+ This document defines an OPTIONAL profile that closes this gap by
218
+ anchoring operations to an external, publicly verifiable ledger. The
219
+ anchoring mechanism is generic and applicable beyond SCITT to any
220
+ system requiring externally verifiable temporal proof.
221
+
222
+
223
+
224
+ Fassbender Expires 29 October 2026 [Page 4]
225
+
226
+ Internet-Draft External Temporal Anchoring April 2026
227
+
228
+
229
+ 1.1. Motivating Example
230
+
231
+ An AI research laboratory produces model weights and safety
232
+ evaluations that must be auditable by regulators and the public. The
233
+ lab registers each artifact with a SCITT Transparency Service and
234
+ receives a Receipt. However, regulators ask: "How do we know the lab
235
+ did not register these weights after the safety evaluation was
236
+ already public -- backdating the claim?"
237
+
238
+ With External Temporal Anchoring, the Transparency Service submits
239
+ the SHA-256 hash of the Signed Statement to an anchoring service.
240
+ The anchoring service returns an Anchor Proof -- a portable, self-
241
+ contained cryptographic proof that the hash was committed to the
242
+ Bitcoin blockchain. The proof is independently verifiable by any
243
+ party with access to Bitcoin block headers, without contacting the
244
+ anchoring service or the Transparency Service.
245
+
246
+ Within the next Bitcoin confirmation -- typically 10 to 60 minutes --
247
+ the regulator obtains a temporal guarantee: these model weights
248
+ existed no later than block height H. The anchoring service provides
249
+ proof of existence and time, not claims about authorship, quality, or
250
+ regulatory compliance.
251
+
252
+ 1.2. Requirements Language
253
+
254
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
255
+ "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and
256
+ "OPTIONAL" in this document are to be interpreted as described in BCP
257
+ 14 [RFC2119] [RFC8174] when, and only when, they appear in all
258
+ capitals, as shown here.
259
+
260
+ 1.3. Terminology
261
+
262
+ * *Temporal Anchor*: A cryptographic commitment of a hash value to a
263
+ public, append-only ledger, proving that the hashed content
264
+ existed at or before the ledger's recorded time.
265
+
266
+ * *Anchor Proof*: A portable, self-contained proof object (e.g., an
267
+ OpenTimestamps .ots file) that is independently verifiable without
268
+ contacting the anchoring service.
269
+
270
+ * *Anchor Ledger*: A public, append-only data structure where no
271
+ single controlling authority -- including the proof issuer -- can
272
+ rewrite historical state or timestamps. Bitcoin is the reference
273
+ Anchor Ledger in this document.
274
+
275
+ 2. Anchoring Model
276
+
277
+
278
+
279
+
280
+ Fassbender Expires 29 October 2026 [Page 5]
281
+
282
+ Internet-Draft External Temporal Anchoring April 2026
283
+
284
+
285
+ 2.1. Overview
286
+
287
+ External temporal anchoring adds an independent time reference to
288
+ SCITT operations without modifying the SCITT architecture. A
289
+ Transparency Service that implements this profile MUST anchor
290
+ operations to an Anchor Ledger at one or both of the following
291
+ levels:
292
+
293
+ 1. *Statement Anchoring* (per-statement)
294
+ 2. *Log Root Anchoring* (periodic)
295
+
296
+ The following diagram illustrates the actors and message flow in a
297
+ federated anchoring deployment:
298
+
299
+ Submitter Calendar Servers Bitcoin Miners Verifier
300
+ | (Alice, Bob, Finney) | |
301
+ | | |
302
+ 1. |--SHA-256(A)-->| | |
303
+ | | | |
304
+ 2. | |--aggregate--> Merkle root | |
305
+ | | | |
306
+ 3. | |--OP_RETURN(root)------------>| |
307
+ | | | |
308
+ 4. | | <--block H------| |
309
+ | | (BIP113 MTP) | |
310
+ 5. |<--.ots proof--| | |
311
+ | (pending->anchored) | |
312
+ | | |
313
+ 6. | | <--artifact+.ots
314
+ | | |
315
+ 7. | +-----+ |
316
+ | | Fetch block |
317
+ | | headers directly |
318
+ | | (any full node) |
319
+ | +-----+ |
320
+ 8. | |--valid/invalid
321
+ | | |
322
+
323
+ Figure 1: Federated Anchoring Message Flow
324
+
325
+ Key trust property: the Verifier (step 7) retrieves block headers
326
+ directly from the Bitcoin network. The Verifier does NOT need to
327
+ trust any Calendar Server -- if a Calendar Server equivocated, the
328
+ .ots proof simply fails verification against the blockchain. The
329
+ trust root is Bitcoin's Proof-of-Work consensus, not any
330
+ intermediary.
331
+
332
+
333
+
334
+
335
+
336
+ Fassbender Expires 29 October 2026 [Page 6]
337
+
338
+ Internet-Draft External Temporal Anchoring April 2026
339
+
340
+
341
+ 2.2. Statement Anchoring
342
+
343
+ When a Transparency Service receives a Signed Statement, it MAY
344
+ compute a Temporal Anchor for that statement:
345
+
346
+ anchor_input = SHA-256(SignedStatement)
347
+ anchor_proof = Anchor(anchor_input, AnchorLedger)
348
+
349
+ The resulting Anchor Proof is stored alongside the SCITT Receipt.
350
+ Together, they provide:
351
+
352
+ * *Receipt*: proof of inclusion in the Transparency Service log
353
+ * *Anchor Proof*: proof of existence at or before time T on the
354
+ Anchor Ledger
355
+
356
+ 2.3. Log Root Anchoring
357
+
358
+ A Transparency Service SHOULD periodically anchor the root of its
359
+ verifiable data structure:
360
+
361
+ log_root = MerkleRoot(TransparencyLog)
362
+ anchor_proof = Anchor(log_root, AnchorLedger)
363
+
364
+ This creates an external checkpoint. If the operator later presents
365
+ a different log state, the anchored root provides a publicly
366
+ verifiable commitment against which inconsistencies can be detected.
367
+
368
+ 2.4. Anchor Proof Format
369
+
370
+ An Anchor Proof MUST be:
371
+
372
+ 1. *Self-contained*: Verifiable without contacting the anchoring
373
+ service or the Transparency Service
374
+ 2. *Portable*: A standalone file that travels with the Receipt
375
+ 3. *Deterministic*: Given the same input bytes and ledger state,
376
+ verification MUST produce the same result
377
+
378
+ The verification function is:
379
+
380
+ V(B, P, L) -> { valid | invalid | unverifiable }
381
+
382
+ Where: - *B* = the bytes being verified - *P* = the Anchor Proof -
383
+ *L* = the Anchor Ledger
384
+
385
+ This function is defined in Section 4 of the Anchoring Specification
386
+ [ANCHORING].
387
+
388
+
389
+
390
+
391
+
392
+ Fassbender Expires 29 October 2026 [Page 7]
393
+
394
+ Internet-Draft External Temporal Anchoring April 2026
395
+
396
+
397
+ 2.4.1. Abstract Field Requirements
398
+
399
+ A conformant Anchor Proof MUST encode the following abstract fields,
400
+ regardless of serialization format:
401
+
402
+ +-----+---------------------+----------+---------------------------+
403
+ | # | Field | Required | Description |
404
+ +-----+---------------------+----------+---------------------------+
405
+ | F1 | artifact_hash | MUST | SHA-256 digest of the |
406
+ | | | | anchored byte sequence |
407
+ +-----+---------------------+----------+---------------------------+
408
+ | F2 | hash_algorithm | MUST | Algorithm identifier |
409
+ | | | | (MUST be "sha-256") |
410
+ +-----+---------------------+----------+---------------------------+
411
+ | F3 | merkle_path | MUST | Ordered sequence of |
412
+ | | | | operations linking F1 to |
413
+ | | | | the ledger commitment |
414
+ +-----+---------------------+----------+---------------------------+
415
+ | F4 | ledger_id | MUST | Identifier of the Anchor |
416
+ | | | | Ledger (e.g., "bitcoin- |
417
+ | | | | mainnet") |
418
+ +-----+---------------------+----------+---------------------------+
419
+ | F5 | block_height | MUST | Block number in which the |
420
+ | | | | anchor commitment appears |
421
+ +-----+---------------------+----------+---------------------------+
422
+ | F6 | block_hash | SHOULD | Hash of the block header |
423
+ | | | | for cross-verification |
424
+ +-----+---------------------+----------+---------------------------+
425
+ | F7 | tx_id | SHOULD | Transaction identifier |
426
+ | | | | containing the commitment |
427
+ +-----+---------------------+----------+---------------------------+
428
+ | F8 | block_time | MUST | Timestamp from the block |
429
+ | | | | header (see Section 2.6) |
430
+ +-----+---------------------+----------+---------------------------+
431
+ | F9 | anchor_status | MUST | One of: "submitted", |
432
+ | | | | "pending", "anchored", |
433
+ | | | | "failed" |
434
+ +-----+---------------------+----------+---------------------------+
435
+ | F10 | calendar_url | MAY | URL of the calendar |
436
+ | | | | server used for |
437
+ | | | | submission |
438
+ +-----+---------------------+----------+---------------------------+
439
+
440
+ Table 1: Anchor Proof Abstract Fields
441
+
442
+ Fields F1-F5, F8, and F9 are REQUIRED for a proof with anchor_status
443
+ "anchored". Fields F6-F7 are RECOMMENDED. Field F10 is
444
+ informational.
445
+
446
+
447
+
448
+ Fassbender Expires 29 October 2026 [Page 8]
449
+
450
+ Internet-Draft External Temporal Anchoring April 2026
451
+
452
+
453
+ A proof with anchor_status "pending" MUST contain at minimum F1, F2,
454
+ F9, and a partial merkle_path (F3) sufficient for later upgrade.
455
+
456
+ 2.4.2. OpenTimestamps Wire Format Mapping
457
+
458
+ This profile uses the OpenTimestamps binary format as the reference
459
+ serialization. The mapping from abstract fields to OTS encoding is
460
+ as follows:
461
+
462
+ +-----+---------------------+-------------------------------------+
463
+ | # | Abstract Field | OTS Encoding |
464
+ +-----+---------------------+-------------------------------------+
465
+ | F1 | artifact_hash | Initial hash input to the proof |
466
+ | | | chain |
467
+ +-----+---------------------+-------------------------------------+
468
+ | F2 | hash_algorithm | Implicit: SHA-256 (OTS magic byte |
469
+ | | | 0x08) |
470
+ +-----+---------------------+-------------------------------------+
471
+ | F3 | merkle_path | Sequence of append (0xf0), prepend |
472
+ | | | (0xf1), and hash (0x08) |
473
+ | | | operations |
474
+ +-----+---------------------+-------------------------------------+
475
+ | F4 | ledger_id | Attestation tag: Bitcoin (0x0588960d|
476
+ | | | 73d71901) |
477
+ +-----+---------------------+-------------------------------------+
478
+ | F5 | block_height | Derived: verifier resolves from |
479
+ | | | Bitcoin block headers |
480
+ +-----+---------------------+-------------------------------------+
481
+ | F6 | block_hash | Derived: verifier resolves from |
482
+ | | | Bitcoin block headers |
483
+ +-----+---------------------+-------------------------------------+
484
+ | F7 | tx_id | Derived: verifier resolves from |
485
+ | | | Bitcoin block data |
486
+ +-----+---------------------+-------------------------------------+
487
+ | F8 | block_time | Derived: from block header |
488
+ | | | timestamp field |
489
+ +-----+---------------------+-------------------------------------+
490
+ | F9 | anchor_status | Implicit: presence of attestation |
491
+ | | | tag = "anchored"; absence = |
492
+ | | | "pending" |
493
+ +-----+---------------------+-------------------------------------+
494
+ | F10 | calendar_url | Encoded as pending attestation URL |
495
+ | | | in incomplete proofs |
496
+ +-----+---------------------+-------------------------------------+
497
+
498
+ Table 2: OTS Wire Format Mapping
499
+
500
+
501
+
502
+
503
+
504
+ Fassbender Expires 29 October 2026 [Page 9]
505
+
506
+ Internet-Draft External Temporal Anchoring April 2026
507
+
508
+
509
+ Note: Fields F5-F8 are "derived" in OTS because the binary proof
510
+ encodes the Merkle path to the Bitcoin transaction, not the block
511
+ metadata directly. The verifier extracts these values by replaying
512
+ the proof operations against the Bitcoin blockchain. This is a
513
+ design strength: the proof is compact and self-contained, while the
514
+ ledger provides the authoritative metadata.
515
+
516
+ An implementation MAY use an alternative serialization format
517
+ provided it encodes all REQUIRED abstract fields from Table 1. A
518
+ future specification MAY define a CBOR-based encoding (see
519
+ Section 4.4).
520
+
521
+ 2.5. Anchor Ledger Requirements
522
+
523
+ An Anchor Ledger used with this profile MUST satisfy the properties
524
+ defined in [ANCHORING] Section 7 (Ledger Qualification):
525
+
526
+ 1. *Append-only*: Historical entries cannot be modified or deleted
527
+ 2. *Public*: Any party can read and verify entries without
528
+ permission
529
+ 3. *No single controlling authority*: No single entity -- including
530
+ the proof issuer -- can rewrite historical state or timestamps
531
+ 4. *Independently verifiable*: Verification does not require trust
532
+ in any specific service or operator
533
+
534
+ Bitcoin satisfies all four requirements and is the reference Anchor
535
+ Ledger for this profile.
536
+
537
+ 2.6. Temporal Precision
538
+
539
+ This section formally defines the temporal claim established by a
540
+ verified Anchor Proof, the assumptions under which the claim holds,
541
+ and the bounds on temporal uncertainty.
542
+
543
+ 2.6.1. Temporal Claim
544
+
545
+ Given artifact A and Anchor Proof P verified against Bitcoin block B
546
+ at height H:
547
+
548
+ A existed at or before T_B
549
+
550
+ where T_B is the Median Time Past (MTP) of block B as defined in
551
+ [BIP113]. T_B is a ledger-derived temporal reference; it is not a
552
+ wall-clock creation time and MUST NOT be interpreted as such.
553
+
554
+
555
+
556
+
557
+
558
+
559
+
560
+ Fassbender Expires 29 October 2026 [Page 10]
561
+
562
+ Internet-Draft External Temporal Anchoring April 2026
563
+
564
+
565
+ The claim is exact with respect to T_B: the uncertainty is in T_B
566
+ itself relative to wall-clock time, not in the claim relative to T_B.
567
+ The phrase "at or before" is definitive -- no tighter bound is
568
+ claimed or implied.
569
+
570
+ 2.6.2. Assumptions
571
+
572
+ The temporal claim holds under the following assumptions:
573
+
574
+ ASSUMPTION 1 (Hash Collision Resistance): No second-preimage or
575
+ collision has been found for the hash algorithm identified in P. For
576
+ SHA-256 [RFC6234], this assumption is supported by the current state
577
+ of cryptanalytic research.
578
+
579
+ ASSUMPTION 2 (Ledger Immutability): Block B at height H has not been
580
+ replaced by a competing chain. This assumption strengthens with each
581
+ subsequent confirmation. After six confirmations (~60 minutes),
582
+ reorganization is considered computationally infeasible under current
583
+ network conditions.
584
+
585
+ ASSUMPTION 3 (Timestamp Validity): Bitcoin miners comply with the
586
+ consensus rule that a block's timestamp MUST be strictly greater than
587
+ the MTP of the previous 11 blocks and MUST be less than the network-
588
+ adjusted time plus two hours [BIP113].
589
+
590
+ 2.6.3. Temporal Bound
591
+
592
+ The temporal resolution of the claim is bounded by:
593
+
594
+ * Bitcoin's block interval (~10 minutes average)
595
+ * MTP consensus rules (up to 2 hours of variance from wall-clock
596
+ time)
597
+
598
+ These bounds are inherent to the Anchor Ledger and cannot be reduced
599
+ by the anchoring service or the verifier. For use cases requiring
600
+ sub-minute precision, an additional time source (e.g., RFC 3161) MAY
601
+ be combined with anchoring to provide a complementary, finer-grained
602
+ timestamp.
603
+
604
+ 2.6.4. Non-Claims
605
+
606
+ An Anchor Proof explicitly does NOT establish:
607
+
608
+ * That A was created at T_B (only: existed at or before T_B)
609
+ * That A was created by any specific party
610
+ * That A did not exist before T_B
611
+ * That T_B corresponds to wall-clock time (T_B is consensus-
612
+ accurate, not wall-clock-accurate)
613
+
614
+
615
+
616
+ Fassbender Expires 29 October 2026 [Page 11]
617
+
618
+ Internet-Draft External Temporal Anchoring April 2026
619
+
620
+
621
+ These exclusions are consistent with [ANCHORING] Section 8 (Semantic
622
+ Exclusions) and Section 15 (Non-Retroactivity).
623
+
624
+ 2.7. Architectural Overview
625
+
626
+ This section provides a complete actor-level view of the anchoring
627
+ and verification flows. The role of Bitcoin miners is shown
628
+ explicitly, since miners -- not any intermediary -- are the trust
629
+ anchor that makes the temporal claim binding.
630
+
631
+ 2.7.1. Anchoring Flow
632
+
633
+ ANCHORING FLOW
634
+
635
+ Producer Transparency OTS Bitcoin Bitcoin
636
+ (Artifact) Service Calendar Miners Network
637
+ | | | | |
638
+ |-- SHA-256(A) --->| | | |
639
+ | |-- hash ------>| | |
640
+ | | |-- Merkle root ->| |
641
+ | | | |-- PoW -------->|
642
+ | | | | consensus |
643
+ | | | | |
644
+ | |<-- Receipt --| |<-- Block N ----|
645
+ |<-- Receipt + -- | |<-- .ots proof --| |
646
+ | Anchor Proof | | | |
647
+
648
+ Note: Miners include the Merkle root in a block. The block is
649
+ accepted by the network via proof-of-work consensus. This is the
650
+ moment the temporal anchor becomes binding and independently
651
+ verifiable. Until inclusion in a confirmed block, the Anchor Proof
652
+ carries status "pending" (see F9 in Section 2.4.1) and MUST NOT be
653
+ relied upon as a temporal claim.
654
+
655
+ 2.7.2. Verification Flow
656
+
657
+
658
+
659
+
660
+
661
+
662
+
663
+
664
+
665
+
666
+
667
+
668
+
669
+
670
+
671
+
672
+ Fassbender Expires 29 October 2026 [Page 12]
673
+
674
+ Internet-Draft External Temporal Anchoring April 2026
675
+
676
+
677
+ VERIFICATION FLOW
678
+
679
+ Auditor Bitcoin Bitcoin Transparency
680
+ (Verifier) Network Block N Service
681
+ | | | |
682
+ |-- fetch TX ----->| | |
683
+ |<-- transaction --| | |
684
+ | | | |
685
+ |-- fetch header ->| | |
686
+ |<-- block header -| | |
687
+ | | | |
688
+ |-- walk Merkle path (from .ots proof) ------------>|
689
+ |<-- verify: hash matches OP_RETURN in block N -----|
690
+ | | | |
691
+ | [optional] verify Receipt against Transparency Service
692
+ |---------------------------------------------------------------->|
693
+ |<----------------------------------------------------------------|
694
+ | | | |
695
+ | RESULT: artifact existed at or before T_block
696
+ | No contact with Umarise required.
697
+ | No contact with OTS Calendar required.
698
+ | Only Bitcoin block headers needed.
699
+
700
+ The Verifier's only required trust dependency is the Bitcoin block
701
+ header chain, which can be obtained from any full node or independent
702
+ block explorer. Contact with the Transparency Service is OPTIONAL
703
+ and only relevant if the Verifier wishes to additionally confirm
704
+ SCITT log inclusion. This separation is what allows the Anchor Proof
705
+ to satisfy the self-containment requirement defined in Section 2.4.
706
+
707
+ 3. Verification Procedure
708
+
709
+ This section defines the normative verification algorithm for Anchor
710
+ Proofs produced under this profile. An implementation that claims
711
+ conformance to this profile MUST implement the procedure specified in
712
+ Section 3.1.
713
+
714
+ 3.1. Verification Algorithm (VERIFY-ANCHOR)
715
+
716
+ The verification function V(B, P, L) defined in Section 2.4 is
717
+ instantiated as follows:
718
+
719
+ Algorithm: VERIFY-ANCHOR(artifact_bytes, proof_bundle)
720
+
721
+ Input:
722
+ artifact_bytes -- the original artifact byte sequence
723
+ proof_bundle -- contains: ots_proof (.ots file),
724
+ claimed_hash, origin_id,
725
+
726
+
727
+
728
+ Fassbender Expires 29 October 2026 [Page 13]
729
+
730
+ Internet-Draft External Temporal Anchoring April 2026
731
+
732
+
733
+ bitcoin_block_height (optional)
734
+
735
+ Output:
736
+ { valid, invalid, unverifiable }
737
+
738
+ Steps:
739
+
740
+ 1. RECOMPUTE HASH
741
+ computed_hash <- SHA-256(artifact_bytes)
742
+ The verifier MUST recompute the hash from the original
743
+ bytes. The verifier MUST NOT rely on any claimed hash
744
+ value without independent computation.
745
+
746
+ 2. COMPARE HASH
747
+ IF HEX(computed_hash) != STRIP-PREFIX(
748
+ proof_bundle.claimed_hash):
749
+ RETURN invalid
750
+ // The artifact does not match the anchored hash.
751
+
752
+ 3. PARSE OTS PROOF
753
+ parsed <- OTS-DESERIALIZE(proof_bundle.ots_proof)
754
+ The verifier MUST parse the binary .ots proof according
755
+ to the OpenTimestamps wire format (Section 2.4.2).
756
+ IF parsed IS NULL OR parsed.hash != computed_hash:
757
+ RETURN invalid
758
+
759
+ 4. CHECK PROOF STATUS
760
+ IF parsed contains only a calendar commitment (no
761
+ Bitcoin attestation tag 0x0588960d73d71901):
762
+ RETURN unverifiable
763
+ // The proof has not been upgraded to a Bitcoin
764
+ // anchor. It depends on the Calendar Server.
765
+
766
+ 5. VERIFY BITCOIN MERKLE PATH
767
+ The verifier MUST replay the sequence of append (0xf0),
768
+ prepend (0xf1), and hash (0x08) operations encoded in
769
+ the proof to derive the expected OP_RETURN value.
770
+ tx_id <- OTS-EXTRACT-TX(parsed)
771
+ expected_op_return <- OTS-WALK-MERKLE-PATH(
772
+ parsed, computed_hash)
773
+
774
+ 6. VERIFY AGAINST BITCOIN
775
+ The verifier MUST retrieve the Bitcoin transaction from
776
+ any full node, block explorer, or local block header
777
+ cache. The verifier MUST NOT depend on any single
778
+ service for this lookup.
779
+ bitcoin_tx <- FETCH-TX(tx_id) [NAKAMOTO]
780
+ IF bitcoin_tx IS NULL:
781
+
782
+
783
+
784
+ Fassbender Expires 29 October 2026 [Page 14]
785
+
786
+ Internet-Draft External Temporal Anchoring April 2026
787
+
788
+
789
+ RETURN unverifiable // ledger unavailable
790
+
791
+ IF bitcoin_tx.OP_RETURN != expected_op_return:
792
+ RETURN invalid
793
+
794
+ 7. EXTRACT TEMPORAL BOUND
795
+ block_header <- FETCH-BLOCK-HEADER(
796
+ bitcoin_tx.block_hash)
797
+ prev_headers <- FETCH-PREV-HEADERS(block_header, 11)
798
+ timestamp_T_B <- MEDIAN(prev_headers.timestamp) [BIP113]
799
+ // T_B is the Median Time Past (MTP) of block B.
800
+ // MTP is always strictly less than the actual
801
+ // inclusion time, so "existed at or before T_B"
802
+ // is a conservative, forward-drift-free claim.
803
+ // See Section 2.6.1.
804
+
805
+ 8. RETURN valid
806
+ // The proof demonstrates: these exact bytes existed
807
+ // at or before T_B (the MTP of block B). No
808
+ // authorship, ownership, or identity claim is made.
809
+ // See Section 2.6 (Temporal Precision) for the
810
+ // semantics of T_B.
811
+
812
+ Figure 2: VERIFY-ANCHOR Algorithm
813
+
814
+ 3.2. Verification Independence
815
+
816
+ A conformant verifier MUST be able to complete the VERIFY-ANCHOR
817
+ procedure using ONLY:
818
+
819
+ 1. The artifact bytes (possessed by the verifier)
820
+ 2. The .ots proof file (portable, self-contained)
821
+ 3. Access to Bitcoin block headers (any full node, any block
822
+ explorer, or a local header cache)
823
+
824
+ A conformant verifier MUST NOT require:
825
+
826
+ * Contact with any anchoring service or Transparency Service
827
+ * An API key, account, or authentication credential
828
+ * Trust in any certificate authority
829
+ * The Calendar Server that issued the pending commitment
830
+
831
+ This satisfies the Independence Requirement defined in [ANCHORING]
832
+ Section 9: verification is possible even if the anchoring service
833
+ ceases to exist.
834
+
835
+
836
+
837
+
838
+
839
+
840
+ Fassbender Expires 29 October 2026 [Page 15]
841
+
842
+ Internet-Draft External Temporal Anchoring April 2026
843
+
844
+
845
+ 3.3. Error Conditions
846
+
847
+ The VERIFY-ANCHOR algorithm produces three possible outputs.
848
+ Implementations MUST handle each as follows:
849
+
850
+ +----------------+------------------------------------------+
851
+ | Output | Meaning |
852
+ +----------------+------------------------------------------+
853
+ | valid | The artifact bytes match the anchored |
854
+ | | hash, the Merkle path is correct, and |
855
+ | | the Bitcoin transaction confirms the |
856
+ | | commitment. The artifact existed at or |
857
+ | | before T_B (the MTP of the containing |
858
+ | | block), as defined in Section 2.6.1. |
859
+ +----------------+------------------------------------------+
860
+ | invalid | The artifact does not match the anchored |
861
+ | | hash (step 2), the proof fails to parse |
862
+ | | (step 3), or the Merkle path does not |
863
+ | | match the Bitcoin OP_RETURN (step 6). |
864
+ | | The verifier SHOULD treat this as a |
865
+ | | verification failure. |
866
+ +----------------+------------------------------------------+
867
+ | unverifiable | The proof is pending (step 4) or the |
868
+ | | Bitcoin ledger is unavailable (step 6). |
869
+ | | The verifier SHOULD retry after a delay. |
870
+ | | A pending proof MAY become verifiable |
871
+ | | after Bitcoin confirmation (~2-4 hours). |
872
+ +----------------+------------------------------------------+
873
+
874
+ Table 3: VERIFY-ANCHOR Output Semantics
875
+
876
+ 4. Integration with SCITT Architecture
877
+
878
+ 4.1. No Protocol Changes Required
879
+
880
+ This profile is additive. It does not modify:
881
+
882
+ * The Signed Statement format
883
+ * The Receipt format
884
+ * The Transparency Service API
885
+ * The consistency or inclusion proof mechanisms
886
+
887
+ A Transparency Service operator MAY adopt this profile unilaterally.
888
+ Auditors MAY verify Anchor Proofs independently of the SCITT
889
+ verification flow.
890
+
891
+
892
+
893
+
894
+
895
+
896
+ Fassbender Expires 29 October 2026 [Page 16]
897
+
898
+ Internet-Draft External Temporal Anchoring April 2026
899
+
900
+
901
+ 4.2. Metadata Extension
902
+
903
+ A Transparency Service that implements this profile SHOULD include
904
+ anchor metadata in its service parameters:
905
+
906
+ {
907
+ "anchor_ledger": "bitcoin",
908
+ "anchor_method": "opentimestamps",
909
+ "anchor_level": "log_root",
910
+ "anchor_interval": "batch",
911
+ "anchor_spec": "https://anchoring-spec.org/v1.0/"
912
+ }
913
+
914
+ 4.3. Receipt Association
915
+
916
+ An Anchor Proof MAY be associated with a Receipt by including the
917
+ Anchor Proof hash in the Receipt's metadata, or by co-locating the
918
+ .ots file with the Receipt in a proof bundle.
919
+
920
+ 4.4. Relationship to RFC 9921 (COSE Timestamp Headers)
921
+
922
+ RFC 9921 defines two COSE header parameters -- 3161-ctt and 3161-ttc
923
+ -- for embedding RFC 3161 Time-Stamp Tokens directly inside
924
+ COSE_Sign1 structures [RFC9052]. This establishes a precedent: COSE
925
+ already supports binding external temporal proofs to signed objects
926
+ without modifying the object's payload.
927
+
928
+ This profile extends the same principle to a different trust model:
929
+
930
+ +------------------------------------------------------+
931
+ | RFC 9921 | This Profile |
932
+ +------------------------------------------------------+
933
+ | Trust root: CA | Trust root: Consensus (PoW) |
934
+ | Proof: TST token | Proof: .ots file |
935
+ | Precision: ms | Precision: block (~10 min) |
936
+ | Binding: COSE hdr | Binding: Anchor Proof or hdr |
937
+ | Verifier trusts: | Verifier trusts: |
938
+ | TSA + CA chain | Bitcoin blockchain |
939
+ | Offline verify: | Offline verify: |
940
+ | With CA certs | With block headers |
941
+ +------------------------------------------------------+
942
+
943
+ The two mechanisms are complementary. A Transparency Service MAY
944
+ implement both -- producing a dual-anchored Anchor Proof that
945
+ combines CA-rooted precision (RFC 3161 via RFC 9921) with consensus-
946
+ rooted independence (OpenTimestamps via this profile).
947
+
948
+
949
+
950
+
951
+
952
+ Fassbender Expires 29 October 2026 [Page 17]
953
+
954
+ Internet-Draft External Temporal Anchoring April 2026
955
+
956
+
957
+ A COSE header parameter for OpenTimestamps proofs is out of scope for
958
+ this document but could be defined in a future specification,
959
+ following the pattern established by RFC 9921. Such a specification
960
+ could define a CBOR-based serialization of the abstract fields in
961
+ Section 2.4.1 (Table 1), using COSE_Sign1 as the envelope, analogous
962
+ to how RFC 9921 embeds RFC 3161 TST tokens. The abstract field table
963
+ in this document is designed to facilitate such mapping without
964
+ requiring changes to the anchoring model itself.
965
+
966
+ 5. Formal Security Argument
967
+
968
+ This section provides a formal argument supporting the central claim
969
+ of the External Temporal Anchoring mechanism.
970
+
971
+ 5.1. Claim
972
+
973
+ *Theorem (Existence-at-or-before-T)*: If VERIFY-ANCHOR(A, P) = valid
974
+ (Section 3.1), then the byte sequence A existed at or before time T,
975
+ where T is the timestamp of the Bitcoin block containing the anchor
976
+ commitment.
977
+
978
+ 5.2. Assumptions
979
+
980
+ The proof relies on the following assumptions, each of which is a
981
+ well-established property of the underlying primitives:
982
+
983
+ * *A1 (Collision Resistance)*: SHA-256 is collision-resistant. That
984
+ is, no computationally bounded adversary can find distinct inputs
985
+ x != y such that SHA-256(x) = SHA-256(y) [FIPS180-4].
986
+
987
+ * *A2 (Ledger Immutability)*: The Bitcoin blockchain is append-only
988
+ and infeasible to rewrite for any confirmed block. Specifically,
989
+ a transaction included in block B with k >= 6 confirmations cannot
990
+ be removed or altered without controlling a majority of the
991
+ network's hash power [NAKAMOTO].
992
+
993
+ * *A3 (Temporal Ordering)*: Bitcoin block timestamps are constrained
994
+ by consensus rules. A block's timestamp must be greater than the
995
+ median of the previous 11 blocks [BIP113]. The maximum forward
996
+ drift permitted by nodes is 2 hours. Therefore, for a block with
997
+ timestamp T_b, the block was accepted by the network within the
998
+ interval [T_b - tolerance, T_b + 2h], and any transaction in that
999
+ block was submitted before the block was mined.
1000
+
1001
+
1002
+
1003
+
1004
+
1005
+
1006
+
1007
+
1008
+ Fassbender Expires 29 October 2026 [Page 18]
1009
+
1010
+ Internet-Draft External Temporal Anchoring April 2026
1011
+
1012
+
1013
+ * *A4 (OTS Correctness)*: The OpenTimestamps proof format provides a
1014
+ deterministic chain of hash operations from an input hash H to a
1015
+ value embedded in a Bitcoin transaction's OP_RETURN output [OTS].
1016
+ This chain is publicly verifiable. The normative algorithms for
1017
+ construction and verification are specified in Appendix D of this
1018
+ document; see Section 5.2.1.
1019
+
1020
+ * *A5 (Operator Independence)*: The anchoring service and any
1021
+ intermediary may fail, be compromised, or cease operations without
1022
+ affecting the validity of previously issued proofs. The temporal
1023
+ claim is grounded in Bitcoin consensus, not in the continued
1024
+ operation or trustworthiness of the anchoring service operator.
1025
+ This assumption is supported by the verification independence
1026
+ requirement in Section 3.2: a conformant verifier requires only
1027
+ the artifact bytes, the .ots proof, and access to Bitcoin block
1028
+ headers.
1029
+
1030
+ 5.3. Note on Assumption A4
1031
+
1032
+ OpenTimestamps [OTS] is a deployed open-source protocol with multiple
1033
+ independent implementations and a public project site [OTS-SITE]. It
1034
+ does not, however, have a formal IETF or ISO specification. This
1035
+ profile therefore treats OpenTimestamps as a *reference
1036
+ implementation*, not as a normative dependency.
1037
+
1038
+ The security argument of Section 5.3 does not rely on the correctness
1039
+ of any particular OTS software library. Assumption A4 reduces to the
1040
+ correctness of two well-understood primitives that are fully
1041
+ specified in Appendix D:
1042
+
1043
+ 1. *SHA-256 Merkle tree construction* (Appendix D.1, D.2): Binary
1044
+ hash trees as described in [RFC6962], Section 2.1.
1045
+
1046
+ 2. *Bitcoin transaction parsing and block header verification*
1047
+ (Section 3.1, steps 5-7): OP_RETURN output identification and
1048
+ block confirmation depth checking per [BIP141].
1049
+
1050
+ Both primitives are independently verifiable against the Bitcoin
1051
+ blockchain without reference to any OTS software. Appendix D
1052
+ provides self-contained pseudocode sufficient to implement
1053
+ verification from first principles. If the OTS reference
1054
+ implementation were to become unavailable, the algorithms in
1055
+ Appendix D remain sufficient to verify any proof produced under this
1056
+ profile.
1057
+
1058
+
1059
+
1060
+
1061
+
1062
+
1063
+
1064
+ Fassbender Expires 29 October 2026 [Page 19]
1065
+
1066
+ Internet-Draft External Temporal Anchoring April 2026
1067
+
1068
+
1069
+ 5.4. Proof
1070
+
1071
+ Let A be an artifact (byte sequence), and let P be a proof Anchor
1072
+ Proof for which VERIFY-ANCHOR(A, P) returns valid.
1073
+
1074
+ *Step 1*: By steps 1-2 of the verification algorithm (Section 3.1),
1075
+ SHA-256(A) = H, where H is the hash committed in the Anchor Proof.
1076
+ By assumption A1, A is the unique preimage of H with overwhelming
1077
+ probability (2^-128 security level for second preimage).
1078
+
1079
+ *Step 2*: By steps 3 and 5, the .ots proof contains a deterministic
1080
+ sequence of hash operations linking H to a value V embedded in a
1081
+ Bitcoin transaction TX. By assumption A4, this chain is correct and
1082
+ verifiable: V = f(H) where f is the composition of the Merkle path
1083
+ operations.
1084
+
1085
+ *Step 3*: By step 6, the Bitcoin transaction TX exists in block B and
1086
+ TX.OP_RETURN = V. By assumption A2, TX was included in B at the time
1087
+ B was mined, and this inclusion cannot be retroactively altered.
1088
+
1089
+ *Step 4*: By step 7, block B has Median Time Past T_B, computed per
1090
+ [BIP113] as the median of the timestamps of the 11 blocks preceding
1091
+ B. By assumption A3, Bitcoin consensus requires that the actual time
1092
+ at which B was accepted by the network is strictly greater than T_B
1093
+ (since T_B is the median of prior blocks, it is always behind actual
1094
+ inclusion time). Therefore, transaction TX -- which commits to V,
1095
+ which commits to H, which commits to A -- existed before block B was
1096
+ mined.
1097
+
1098
+ *Step 5*: The hash commitment is causal: to produce H, the artifact A
1099
+ must have existed before H was computed. To include H in the OTS
1100
+ Merkle tree that produces V, H must have existed before TX was
1101
+ broadcast. To include TX in block B, TX must have existed before B
1102
+ was mined.
1103
+
1104
+ *Therefore*: A existed -> H was computed -> TX was broadcast -> B was
1105
+ mined at an actual time strictly greater than T_B. The artifact A
1106
+ existed at or before T_B (the Median Time Past of block B at height
1107
+ H), as defined in Section 2.6.1. No 2-hour tolerance caveat applies:
1108
+ T_B is a conservative lower bound on the actual inclusion time by
1109
+ construction. [end]
1110
+
1111
+ 5.5. Strength and Limitations
1112
+
1113
+ The above argument is a *computational security* argument, not an
1114
+ information-theoretic proof. Its strength is bounded by:
1115
+
1116
+
1117
+
1118
+
1119
+
1120
+ Fassbender Expires 29 October 2026 [Page 20]
1121
+
1122
+ Internet-Draft External Temporal Anchoring April 2026
1123
+
1124
+
1125
+ 1. The collision resistance of SHA-256 (currently 128-bit security
1126
+ level)
1127
+ 2. The cost of a sustained 51% attack on Bitcoin, which depends on
1128
+ then-current network conditions and is external to this
1129
+ specification
1130
+ 3. The 2-hour temporal tolerance inherent to Bitcoin block
1131
+ timestamps
1132
+
1133
+ The argument does NOT prove: - When exactly A was created (only an
1134
+ upper bound on existence) - Who created A (no identity binding) -
1135
+ That A has not been modified since anchoring (only that these
1136
+ specific bytes existed)
1137
+
1138
+ These limitations are inherent to the mechanism and are documented in
1139
+ [ANCHORING] Section 8 (Semantic Exclusions).
1140
+
1141
+ 5.6. Anchor Proof Integrity
1142
+
1143
+ The Anchor Proof does not replace the SCITT Receipt. It provides an
1144
+ independent temporal claim. If the Anchor Proof is lost or
1145
+ corrupted, the Receipt remains valid within the SCITT framework. The
1146
+ temporal independence guarantee is degraded but the claim integrity
1147
+ is unaffected.
1148
+
1149
+ 5.7. Hash Algorithm Agility
1150
+
1151
+ This profile specifies SHA-256 as the hash function for anchor
1152
+ inputs. If SHA-256 is deprecated, the Anchor Ledger requirement
1153
+ (Section 2.5) remains valid with a successor hash function. The
1154
+ anchoring mechanism is hash-agile by design.
1155
+
1156
+ 5.8. Ledger Availability
1157
+
1158
+ Bitcoin's availability characteristics exceed those of any single-
1159
+ operator Transparency Service. However, Anchor Proof verification
1160
+ requires access to the Bitcoin blockchain (or a trusted copy).
1161
+ Offline verification is possible with a local blockchain copy or
1162
+ cached block headers.
1163
+
1164
+ 5.9. Equivocation Detection
1165
+
1166
+ Log Root Anchoring (Section 2.3) enables equivocation detection: if a
1167
+ Transparency Service presents different log states to different
1168
+ parties, the anchored root provides a public commitment that can be
1169
+ compared. This is a strictly stronger guarantee than SCITT provides
1170
+ without external anchoring.
1171
+
1172
+
1173
+
1174
+
1175
+
1176
+ Fassbender Expires 29 October 2026 [Page 21]
1177
+
1178
+ Internet-Draft External Temporal Anchoring April 2026
1179
+
1180
+
1181
+ 6. Security Considerations
1182
+
1183
+ This section follows the guidelines in [RFC3552] for describing
1184
+ threats and mitigations relevant to the External Temporal Anchoring
1185
+ mechanism defined in this document.
1186
+
1187
+ The attacker model assumes the following capabilities:
1188
+
1189
+ * The attacker can observe all network traffic between the
1190
+ submitter, the anchoring service, Calendar Servers, and the Anchor
1191
+ Ledger.
1192
+ * The attacker can operate one or more Calendar Servers.
1193
+ * The attacker can submit arbitrary hashes to the anchoring service.
1194
+ * The attacker cannot find collisions or second pre-images for
1195
+ SHA-256 (Assumption A1, Section 5.2).
1196
+ * The attacker cannot rewrite confirmed Bitcoin blocks with k >= 6
1197
+ confirmations (Assumption A2, Section 5.2).
1198
+ * The attacker cannot control a majority of Bitcoin's network hash
1199
+ power.
1200
+
1201
+ The following subsections enumerate specific threats under this
1202
+ model.
1203
+
1204
+ 6.1. Threat: Hash Collision (Forged Commitment)
1205
+
1206
+ An attacker could construct a second artifact B such that SHA-256(B)
1207
+ = SHA-256(A), thereby claiming that the anchor for artifact A also
1208
+ proves the existence of artifact B.
1209
+
1210
+ This is remediated by the collision resistance of SHA-256
1211
+ [FIPS180-4]. No known practical collision attack exists against
1212
+ SHA-256 as of the date of this document. The Construction Algorithm
1213
+ (Appendix D.1) is hash-algorithm- agile: if SHA-256 is weakened, the
1214
+ hash_algo field permits migration to a successor algorithm without
1215
+ protocol changes.
1216
+
1217
+ 6.2. Threat: Anchor Ledger Rewrite (51% Attack)
1218
+
1219
+ An attacker with majority hash power on the Anchor Ledger could
1220
+ rewrite the block containing the commitment, thereby invalidating or
1221
+ altering the temporal proof.
1222
+
1223
+ This is remediated by the economic cost of sustaining a majority
1224
+ attack on Bitcoin, which is the only Anchor Ledger currently
1225
+ qualified under the Anchoring Specification [ANCHORING] Section 7
1226
+ (Ledger Qualification). The economic and operational cost of
1227
+ producing a competing chain with greater accumulated proof-of-work
1228
+ depends on then-current Bitcoin network conditions and is external to
1229
+
1230
+
1231
+
1232
+ Fassbender Expires 29 October 2026 [Page 22]
1233
+
1234
+ Internet-Draft External Temporal Anchoring April 2026
1235
+
1236
+
1237
+ this specification. The Verification Algorithm (Section 3.1)
1238
+ requires a minimum confirmation depth before accepting an anchor as
1239
+ valid.
1240
+
1241
+ 6.3. Threat: Calendar Server Equivocation
1242
+
1243
+ An attacker operating a compromised OpenTimestamps calendar server
1244
+ could return divergent intermediate commitments to different clients,
1245
+ or withhold a valid commitment entirely.
1246
+
1247
+ This is remediated by the OTS protocol design: multiple independent
1248
+ Calendar Servers provide redundant commitment paths. The final
1249
+ anchor is a Bitcoin transaction, not a calendar assertion. A
1250
+ verifier does not need to trust any Calendar Server -- verification
1251
+ uses only the Bitcoin blockchain (Section 2.1, step 7). A Calendar
1252
+ Server that equivocates produces proofs that fail verification.
1253
+
1254
+ 6.4. Threat: Transparency Service Equivocation
1255
+
1256
+ A malicious Transparency Service operator could present different log
1257
+ states to different relying parties while anchoring only one version.
1258
+
1259
+ This is remediated by Log Root Anchoring (Section 2.3). Because the
1260
+ anchored Merkle root is committed to the public ledger, any party
1261
+ holding a Receipt can independently compute the expected root and
1262
+ compare it against the anchored value. Divergent log states are
1263
+ detectable by any two parties that compare their anchored roots.
1264
+
1265
+ 6.5. Threat: Temporal Claim Inflation
1266
+
1267
+ An attacker could claim that the anchor proves existence at a time
1268
+ earlier than the actual anchoring. For example, asserting that T
1269
+ equals the block timestamp minus an arbitrary margin.
1270
+
1271
+ This is remediated by the formal time semantics defined in
1272
+ Section 5.1. The anchor provides an existence-at-or-before-T
1273
+ guarantee where T is the consensus-confirmed block inclusion time.
1274
+ The protocol does not claim to prove existence at the exact moment of
1275
+ hash creation -- only that the hash existed no later than T.
1276
+ Verifiers MUST NOT interpret T as the creation time of the artifact.
1277
+
1278
+ 6.6. Threat: Anchor Proof Tampering
1279
+
1280
+ An attacker could modify the certificate.json or .ots proof file
1281
+ within an Anchor Proof after generation, for example by altering the
1282
+ captured_at timestamp or substituting a different hash value.
1283
+
1284
+
1285
+
1286
+
1287
+
1288
+ Fassbender Expires 29 October 2026 [Page 23]
1289
+
1290
+ Internet-Draft External Temporal Anchoring April 2026
1291
+
1292
+
1293
+ This is remediated by the cryptographic binding between the
1294
+ components. The .ots proof commits to a specific hash value; any
1295
+ modification to certificate.json that changes the hash breaks the OTS
1296
+ verification chain. The Verification Algorithm (Section 3.1) re-
1297
+ derives the hash from the original artifact bytes and verifies it
1298
+ against the .ots proof independently -- it does not trust the
1299
+ metadata in certificate.json.
1300
+
1301
+ 6.7. Threat: Denial of Anchoring Service
1302
+
1303
+ An attacker could prevent the Transparency Service from submitting
1304
+ commitments to the Anchor Ledger, for example via a denial-of-service
1305
+ attack on the Calendar Servers or the Transparency Service's network
1306
+ connectivity.
1307
+
1308
+ This is remediated by the asynchronous design of the protocol
1309
+ (Section 2.1). Commitments can be retried. The Transparency Service
1310
+ retains the pending .ots proof and resubmits when connectivity is
1311
+ restored. During the outage, existing anchored proofs remain
1312
+ independently verifiable. New Signed Statements are still recorded
1313
+ by the Transparency Service; only their external temporal anchoring
1314
+ is delayed.
1315
+
1316
+ 6.8. Threat: Long-Term Hash Algorithm Compromise
1317
+
1318
+ Over decades, SHA-256 may become vulnerable to collision or pre-image
1319
+ attacks due to advances in computing (including quantum computing).
1320
+
1321
+ This is remediated by the algorithm-agility provision in the
1322
+ protocol. The hash_algo field in the anchor record (Section 2.4.1,
1323
+ field F2) permits migration to a successor hash algorithm. Existing
1324
+ proofs anchored with SHA-256 retain their validity for the period
1325
+ during which SHA-256 was considered secure. The Anchoring
1326
+ Specification [ANCHORING] Section 15 defines the temporal semantics
1327
+ that bound this validity window.
1328
+
1329
+ 6.9. Trust Boundary: Hash Intake
1330
+
1331
+ The anchoring service proves that a given hash existed at or before a
1332
+ certain time. It does not, and cannot, prove the truth, accuracy, or
1333
+ origin of the data that produced that hash.
1334
+
1335
+ An attacker could submit the hash of a fabricated or falsified
1336
+ artifact before anchoring. The resulting proof would be
1337
+ cryptographically valid and temporally bound, yet the underlying data
1338
+ would be false.
1339
+
1340
+
1341
+
1342
+
1343
+
1344
+ Fassbender Expires 29 October 2026 [Page 24]
1345
+
1346
+ Internet-Draft External Temporal Anchoring April 2026
1347
+
1348
+
1349
+ This is not remediated by the protocol. It is an explicit trust
1350
+ boundary: the anchoring service guarantees temporal existence of a
1351
+ hash commitment, not the integrity or authenticity of the pre-image
1352
+ data. Consumers of anchor proofs MUST apply independent verification
1353
+ of the artifact content, authorship, and provenance outside the scope
1354
+ of this specification.
1355
+
1356
+ 6.10. Positive Property: No Long-Term Key Dependency
1357
+
1358
+ Unlike certificate-based timestamping mechanisms (e.g., RFC 3161),
1359
+ Anchor Proofs do not depend on any signing key, certificate chain, or
1360
+ key management infrastructure. The proof's validity derives from the
1361
+ mathematical properties of hash functions and the computational
1362
+ consensus of the Anchor Ledger.
1363
+
1364
+ This eliminates three threat categories that apply to key-based
1365
+ timestamping:
1366
+
1367
+ * *Key compromise*: There is no private key that, if exposed, would
1368
+ allow an attacker to forge timestamps.
1369
+ * *Certificate expiration*: There is no certificate whose expiry
1370
+ would invalidate existing proofs.
1371
+ * *Authority revocation*: There is no trusted authority whose
1372
+ revocation would render proofs unverifiable.
1373
+
1374
+ An Anchor Proof verified today remains verifiable indefinitely,
1375
+ provided SHA-256 retains its collision resistance (Section 6.8) and
1376
+ the Anchor Ledger remains accessible (Section 6.7).
1377
+
1378
+ 6.11. Threat: Premature Anchored State (False Finality)
1379
+
1380
+ An attacker -- or a faulty implementation -- could mark a proof as
1381
+ "anchored" before the Bitcoin transaction has reached a durable
1382
+ confirmation depth. A relying party that accepts an "anchored"
1383
+ status asserted by the anchoring service could be misled into relying
1384
+ on a temporal proof that is subsequently invalidated by a chain
1385
+ reorganization.
1386
+
1387
+
1388
+
1389
+
1390
+
1391
+
1392
+
1393
+
1394
+
1395
+
1396
+
1397
+
1398
+
1399
+
1400
+ Fassbender Expires 29 October 2026 [Page 25]
1401
+
1402
+ Internet-Draft External Temporal Anchoring April 2026
1403
+
1404
+
1405
+ This is remediated by two independent controls. First, the
1406
+ Verification Algorithm (Section 3.1) requires the verifier to
1407
+ independently retrieve the Bitcoin transaction and confirm block
1408
+ inclusion -- the verifier does not rely on any status field asserted
1409
+ by the anchoring service. Second, Assumption A2 (Section 5.2)
1410
+ specifies that a minimum of six confirmations (~60 minutes) must be
1411
+ reached before the immutability assumption is considered
1412
+ computationally sound. Implementations MUST NOT promote a proof from
1413
+ "pending" to "anchored" (field F9, Section 2.4.1) until the
1414
+ transaction has reached the minimum confirmation depth required by
1415
+ their deployment policy.
1416
+
1417
+ 6.12. Threat: Batch Integrity Compromise (Merkle Mixing)
1418
+
1419
+ In the batch anchoring mode (Appendix D.3), an implementation error
1420
+ in the Merkle tree construction could incorrectly associate hashes
1421
+ from different submitters within the same batch. A defective batch
1422
+ could produce a valid-appearing Anchor Proof that binds a hash to an
1423
+ incorrect Merkle position, undermining the evidence integrity of all
1424
+ origins in the batch.
1425
+
1426
+ This is remediated by the Batch Anchoring algorithm (Appendix D.3),
1427
+ which specifies deterministic leaf ordering (lexicographic sort
1428
+ before concatenation) and requires individual origin records per hash
1429
+ in addition to the shared Merkle root anchor. A verifier can
1430
+ independently recompute the Merkle path from a leaf hash to the root
1431
+ and confirm correct positioning. Post-batch verification sampling
1432
+ SHOULD be performed by implementations to detect systematic
1433
+ construction errors before they are exposed to relying parties.
1434
+
1435
+ 7. Privacy Considerations
1436
+
1437
+ The External Temporal Anchoring mechanism operates on cryptographic
1438
+ hashes only. No artifact content, personal data, or identity
1439
+ information is transmitted to or stored on the Anchor Ledger.
1440
+
1441
+ However, the following privacy-relevant properties apply:
1442
+
1443
+ * The hash of an artifact is a unique identifier. An observer who
1444
+ independently possesses the artifact can confirm whether it was
1445
+ anchored by computing the hash and searching for a matching
1446
+ commitment.
1447
+
1448
+ * Bitcoin transactions are publicly visible and permanent. An
1449
+ anchored hash cannot be removed from the ledger.
1450
+
1451
+ * The temporal ordering of anchored hashes is public. An observer
1452
+ can determine that hash A was anchored before hash B.
1453
+
1454
+
1455
+
1456
+ Fassbender Expires 29 October 2026 [Page 26]
1457
+
1458
+ Internet-Draft External Temporal Anchoring April 2026
1459
+
1460
+
1461
+ Implementations that anchor hashes of privacy-sensitive artifacts
1462
+ SHOULD inform users that the hash becomes a permanent, publicly
1463
+ queryable identifier on the anchor ledger.
1464
+
1465
+ In multi-tenant deployments, anchored hashes from different tenants
1466
+ appear on the same public ledger within the same Bitcoin blocks. An
1467
+ observer with access to hashes from multiple tenants can determine
1468
+ temporal ordering relationships across tenants -- including whether
1469
+ two artifacts were anchored in the same batch -- even when no
1470
+ artifact content is disclosed. Implementations that anchor on behalf
1471
+ of multiple tenants SHOULD be aware that the public ledger creates a
1472
+ permanent, cross-tenant ordering record. The 2-hour maximum forward
1473
+ drift in Bitcoin block timestamps (Section 2.6.3, Assumption A3)
1474
+ defines the worst-case window within which ordering observations are
1475
+ unreliable; within a single confirmed block (~10 minutes), ordering
1476
+ between co-batched hashes is not preserved by the protocol.
1477
+
1478
+ 8. IANA Considerations
1479
+
1480
+ This document has no IANA actions.
1481
+
1482
+ 9. Normative References
1483
+
1484
+ [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
1485
+ Requirement Levels", BCP 14, RFC 2119,
1486
+ DOI 10.17487/RFC2119, March 1997,
1487
+ <https://www.rfc-editor.org/info/rfc2119>.
1488
+
1489
+ [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC
1490
+ 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174,
1491
+ May 2017, <https://www.rfc-editor.org/info/rfc8174>.
1492
+
1493
+ [FIPS180-4]
1494
+ National Institute of Standards and Technology, "Secure
1495
+ Hash Standard (SHS)", FIPS PUB 180-4,
1496
+ DOI 10.6028/NIST.FIPS.180-4, August 2015,
1497
+ <https://doi.org/10.6028/NIST.FIPS.180-4>.
1498
+
1499
+ [ANCHORING]
1500
+ Fassbender, J., "Anchoring Specification (IEC), Version
1501
+ 1.0", DOI 10.5281/zenodo.19537321, February 2026,
1502
+ <https://doi.org/10.5281/zenodo.19537321>.
1503
+
1504
+ [RFC3552] Rescorla, E. and B. Korver, "Guidelines for Writing RFC
1505
+ Text on Security Considerations", BCP 72, RFC 3552,
1506
+ DOI 10.17487/RFC3552, July 2003,
1507
+ <https://www.rfc-editor.org/info/rfc3552>.
1508
+
1509
+
1510
+
1511
+
1512
+ Fassbender Expires 29 October 2026 [Page 27]
1513
+
1514
+ Internet-Draft External Temporal Anchoring April 2026
1515
+
1516
+
1517
+ 10. Informative References
1518
+
1519
+ [RFC3161] Adams, C., Cain, P., Pinkas, D., and R. Zuccherato,
1520
+ "Internet X.509 Public Key Infrastructure Time-Stamp
1521
+ Protocol (TSP)", RFC 3161, DOI 10.17487/RFC3161, August
1522
+ 2001, <https://www.rfc-editor.org/info/rfc3161>.
1523
+
1524
+ [RFC9052] Schaad, J., "CBOR Object Signing and Encryption (COSE):
1525
+ Structures and Process", RFC 9052, DOI 10.17487/RFC9052,
1526
+ August 2022, <https://www.rfc-editor.org/info/rfc9052>.
1527
+
1528
+ [RFC9921] Pinkas, D., Jones, M., and K. Yasuda, "CBOR Object Signing
1529
+ and Encryption (COSE) Header Parameter for Carrying and
1530
+ Conveying a Timestamp Token", RFC 9921,
1531
+ DOI 10.17487/RFC9921, February 2025,
1532
+ <https://www.rfc-editor.org/info/rfc9921>.
1533
+
1534
+ [RFC9162] Laurie, B., Messeri, E., and R. Stradling, "Certificate
1535
+ Transparency Version 2.0", RFC 9162, DOI 10.17487/RFC9162,
1536
+ December 2021, <https://www.rfc-editor.org/info/rfc9162>.
1537
+
1538
+ [RFC9943] Birkholz, H., Delignat-Lavaud, A., Fournet, C., Deshpande,
1539
+ Y., and S. Lasker, "An Architecture for Trustworthy and
1540
+ Transparent Digital Supply Chains", RFC 9943,
1541
+ DOI 10.17487/RFC9943, March 2026,
1542
+ <https://www.rfc-editor.org/info/rfc9943>.
1543
+
1544
+ [OTS] Todd, P., "OpenTimestamps: Scalable, Trust-Minimized,
1545
+ Distributed Timestamping with Bitcoin (Reference
1546
+ Implementation, Release v0.4.3)", November 2022,
1547
+ <https://github.com/opentimestamps/python-
1548
+ opentimestamps/tree/python-opentimestamps-v0.4.3>.
1549
+
1550
+ [OTS-SITE] Todd, P., "OpenTimestamps (Project Site)", 2016,
1551
+ <https://opentimestamps.org>.
1552
+
1553
+ [OTS-DESIGN]
1554
+ Todd, P., "OpenTimestamps Announcement", September 2016,
1555
+ <https://petertodd.org/2016/opentimestamps-announcement>.
1556
+
1557
+ [NAKAMOTO] Nakamoto, S., "Bitcoin: A Peer-to-Peer Electronic Cash
1558
+ System", DOI 10.2139/ssrn.3440802, October 2008,
1559
+ <https://doi.org/10.2139/ssrn.3440802>.
1560
+
1561
+
1562
+
1563
+
1564
+
1565
+
1566
+
1567
+
1568
+ Fassbender Expires 29 October 2026 [Page 28]
1569
+
1570
+ Internet-Draft External Temporal Anchoring April 2026
1571
+
1572
+
1573
+ [BIP113] Kerin, T. and M. Friedenbach, "Median time-past as
1574
+ endpoint for lock-time calculations (BIP 113, Status:
1575
+ Deployed)", August 2015, <https://github.com/bitcoin/bips/
1576
+ blob/24e96e870fffaa257b465ce1f0370c14aac588e8/bip-
1577
+ 0113.mediawiki>.
1578
+
1579
+ [RFC6234] Eastlake 3rd, D. and T. Hansen, "US Secure Hash Algorithms
1580
+ (SHA and SHA-based HMAC and HKDF)", RFC 6234,
1581
+ DOI 10.17487/RFC6234, May 2011,
1582
+ <https://www.rfc-editor.org/info/rfc6234>.
1583
+
1584
+ [RFC6962] Laurie, B., Langley, A., and E. Kasper, "Certificate
1585
+ Transparency", RFC 6962, DOI 10.17487/RFC6962, June 2013,
1586
+ <https://www.rfc-editor.org/info/rfc6962>.
1587
+
1588
+ [BIP141] Lombrozo, E., Lau, J., and P. Wuille, "Segregated Witness
1589
+ (Consensus layer) (BIP 141, Status: Deployed)", December
1590
+ 2015, <https://github.com/bitcoin/bips/
1591
+ blob/1f0b563738199ca60d32b4ba779797fc97d040fe/bip-
1592
+ 0141.mediawiki>.
1593
+
1594
+ [MERKLE] Merkle, R., "A Digital Signature Based on a Conventional
1595
+ Encryption Function", Advances in Cryptology - CRYPTO '87,
1596
+ Lecture Notes in Computer Science, vol 293, Springer,
1597
+ DOI 10.1007/3-540-48184-2_32, 1988,
1598
+ <https://doi.org/10.1007/3-540-48184-2_32>.
1599
+
1600
+ Appendix A. Relationship to Four-Layer Evidence Stack
1601
+
1602
+ +---------------------------------------------+
1603
+ | L4 Evidence Format (Partner/SCITT) |
1604
+ | Signed Statements, manifests, SBOMs |
1605
+ +---------------------------------------------+
1606
+ | L3 Signing & Identity (Partner/TSA) |
1607
+ | SCITT Receipts, X.509, passkeys |
1608
+ +---------------------------------------------+
1609
+ | L2 Anchor Primitive (This Profile) |
1610
+ | SHA-256 -> .ots -> Bitcoin |
1611
+ +---------------------------------------------+
1612
+ | L1 Consensus Layer (Bitcoin) |
1613
+ | Proof-of-work, append-only |
1614
+ +---------------------------------------------+
1615
+
1616
+ SCITT operates at L3-L4. This profile defines the L2 integration.
1617
+ L1 is the Bitcoin consensus layer. The layers are independent: each
1618
+ can be verified without the others.
1619
+
1620
+
1621
+
1622
+
1623
+
1624
+ Fassbender Expires 29 October 2026 [Page 29]
1625
+
1626
+ Internet-Draft External Temporal Anchoring April 2026
1627
+
1628
+
1629
+ Appendix B. Example: Anchored SCITT Flow
1630
+
1631
+ 1. Producer creates artifact A
1632
+ 2. Producer signs Signed Statement S about A
1633
+ 3. Transparency Service receives S
1634
+ 4. Transparency Service appends S to log -> Receipt R
1635
+ 5. Transparency Service computes SHA-256(S) -> H
1636
+ 6. Transparency Service submits H to anchoring service
1637
+ 7. Anchoring service returns Anchor Proof P (.ots)
1638
+ 8. Transparency Service stores (R, P) together
1639
+
1640
+ Verification (by any auditor):
1641
+ a. Verify R against Transparency Service log -> SCITT valid
1642
+ b. Verify P against Bitcoin -> Temporal valid
1643
+ c. Compare: H in P == SHA-256(S) -> Binding valid
1644
+
1645
+ Note: If the Transparency Service is no longer available, step (a)
1646
+ cannot be performed -- steps (b) and (c) remain independently valid.
1647
+ The temporal and binding proofs do not depend on the continued
1648
+ operation of the log.
1649
+
1650
+ Appendix C. Implementation Status
1651
+
1652
+ As of March 2026, the following implementations exist:
1653
+
1654
+ * *Umarise Core API*: Production anchoring service implementing the
1655
+ Anchoring Specification, with Merkle-tree batching and
1656
+ OpenTimestamps anchoring. RFC 3161 TSA integration is planned.
1657
+ 253,000+ attestations anchored.
1658
+
1659
+ * *verify-anchoring.org*: 100% client-side verification tool. Zero
1660
+ API contact, zero tracking. Public domain.
1661
+
1662
+ * *@umarise/cli*: Node.js CLI for automated anchoring. Published on
1663
+ npm.
1664
+
1665
+ * *anchor-action*: GitHub Actions integration for CI/CD pipeline
1666
+ anchoring. Published on GitHub Marketplace.
1667
+
1668
+ Appendix D. Acknowledgements
1669
+
1670
+ The authors thank Eliot Lear (Independent Submissions Editor) for his
1671
+ detailed review of the initial submission and his concrete guidance
1672
+ on strengthening the formal security argument, algorithmic
1673
+ specification, and Security Considerations structure.
1674
+
1675
+
1676
+
1677
+
1678
+
1679
+
1680
+ Fassbender Expires 29 October 2026 [Page 30]
1681
+
1682
+ Internet-Draft External Temporal Anchoring April 2026
1683
+
1684
+
1685
+ The authors thank Nicole Bates (Microsoft, SCITT Working Group Chair)
1686
+ for her review of the SCITT integration approach and her assessment
1687
+ that the mechanism requires no changes to existing SCITT protocols.
1688
+
1689
+ The OpenTimestamps protocol was designed by Peter Todd, whose
1690
+ reference implementation [OTS] underpins the anchoring mechanism
1691
+ described in this document.
1692
+
1693
+ The Merkle tree construction in Appendix D.3 follows the conventions
1694
+ established in RFC 6962 (Certificate Transparency).
1695
+
1696
+ _Author's Address:_
1697
+
1698
+ Jonna Fassbender
1699
+ Umarise
1700
+ The Netherlands
1701
+
1702
+ Email: j.fassbender@umarise.com
1703
+ URI: https://umarise.com
1704
+
1705
+ Appendix E. OTS Anchoring Protocol -- Construction and Verification
1706
+
1707
+ Sections D.1 through D.3 are informative examples of a compliant
1708
+ construction. Sections D.4 and D.5 have been promoted to the
1709
+ normative main body (Section 3) and are retained here as cross-
1710
+ references only. This appendix supports Assumption A4 (Section 5.2).
1711
+ It defines the construction algorithms for OpenTimestamps-based
1712
+ anchoring as used in this document. The algorithms are presented in
1713
+ pseudocode and are self-contained: they can be implemented
1714
+ independently of any OpenTimestamps software library. They
1715
+ correspond to the reference implementation described in Appendix C,
1716
+ but do not depend on it.
1717
+
1718
+ For background on the OpenTimestamps protocol design, see [OTS-SITE]
1719
+ and [OTS-DESIGN].
1720
+
1721
+ E.1. D.1. Construction Algorithm (Anchor)
1722
+
1723
+
1724
+
1725
+
1726
+
1727
+
1728
+
1729
+
1730
+
1731
+
1732
+
1733
+
1734
+
1735
+
1736
+ Fassbender Expires 29 October 2026 [Page 31]
1737
+
1738
+ Internet-Draft External Temporal Anchoring April 2026
1739
+
1740
+
1741
+ Algorithm: CONSTRUCT-ANCHOR(artifact_bytes)
1742
+
1743
+ Input:
1744
+ artifact_bytes -- arbitrary byte sequence (the artifact)
1745
+
1746
+ Output:
1747
+ origin_record -- {origin_id, hash, captured_at, proof_status}
1748
+ pending_proof -- serialised OTS pending proof (.ots file)
1749
+
1750
+ Steps:
1751
+
1752
+ 1. HASH COMPUTATION
1753
+ hash_value <- SHA-256(artifact_bytes) // [FIPS180-4]
1754
+ hash_string <- "sha256:" || HEX(hash_value) // canonical form
1755
+
1756
+ 2. TIMESTAMP CAPTURE
1757
+ captured_at <- NOW() // UTC ISO 8601
1758
+
1759
+ 3. ORIGIN REGISTRATION
1760
+ origin_id <- UUID-v4() // unique identifier
1761
+ short_token <- RANDOM-ALPHANUMERIC(8) // human-readable ref
1762
+ INSERT origin_attestations {
1763
+ origin_id, hash: hash_string, hash_algo: "sha256",
1764
+ captured_at, short_token
1765
+ }
1766
+
1767
+ 4. OTS CALENDAR SUBMISSION
1768
+ // Submit hash to >=1 OpenTimestamps Calendar Server(s) [OTS]
1769
+ FOR EACH calendar IN configured_calendars:
1770
+ pending_commitment <- HTTP-POST(calendar.url, hash_value)
1771
+ STORE pending_commitment
1772
+
1773
+ 5. PENDING PROOF ASSEMBLY
1774
+ // The .ots file at this stage contains calendar commitment(s)
1775
+ // but NOT a Bitcoin anchor. It is NOT independently verifiable.
1776
+ pending_proof <- OTS-SERIALIZE(hash_value, pending_commitments)
1777
+ INSERT core_ots_proofs {
1778
+ origin_id, ots_proof: pending_proof, status: "pending"
1779
+ }
1780
+
1781
+ 6. RETURN {origin_id, hash_string, captured_at, proof_status: "pending"}
1782
+
1783
+ E.2. D.2. Upgrade Algorithm (Bitcoin Confirmation)
1784
+
1785
+
1786
+
1787
+
1788
+
1789
+
1790
+
1791
+
1792
+ Fassbender Expires 29 October 2026 [Page 32]
1793
+
1794
+ Internet-Draft External Temporal Anchoring April 2026
1795
+
1796
+
1797
+ Algorithm: UPGRADE-PENDING-PROOFS()
1798
+
1799
+ // Runs periodically (e.g. every 15 minutes) as a background worker.
1800
+ // Converts calendar-level commitments to Bitcoin-level proofs.
1801
+
1802
+ Input:
1803
+ none (reads from core_ots_proofs WHERE status = "pending")
1804
+
1805
+ Steps:
1806
+
1807
+ 1. pending_proofs <- SELECT * FROM core_ots_proofs
1808
+ WHERE status = "pending"
1809
+ AND created_at < NOW() - INTERVAL '2 hours'
1810
+
1811
+ 2. FOR EACH proof IN pending_proofs:
1812
+
1813
+ 2a. CONTACT CALENDAR
1814
+ upgraded_proof <- OTS-UPGRADE(proof.ots_proof)
1815
+ // OTS-UPGRADE contacts the Calendar Server that issued
1816
+ // the pending commitment and requests the Bitcoin
1817
+ // Merkle path if available.
1818
+
1819
+ 2b. IF upgraded_proof IS NULL:
1820
+ // Bitcoin transaction not yet confirmed, or calendar
1821
+ // not yet merged into a block. Retry next cycle.
1822
+ CONTINUE
1823
+
1824
+ 2c. EXTRACT BITCOIN BINDING
1825
+ block_height <- OTS-EXTRACT-BLOCK-HEIGHT(upgraded_proof)
1826
+ block_time <- OTS-EXTRACT-BLOCK-TIME(upgraded_proof)
1827
+
1828
+ 2d. VERIFY LOCALLY
1829
+ // Verify the Merkle path from hash -> Bitcoin OP_RETURN
1830
+ valid <- OTS-VERIFY(upgraded_proof, proof.origin_hash)
1831
+ IF NOT valid:
1832
+ LOG-ERROR("Upgrade verification failed", proof.origin_id)
1833
+ CONTINUE
1834
+
1835
+ 2e. PERSIST UPGRADED PROOF
1836
+ UPDATE core_ots_proofs SET
1837
+ ots_proof = upgraded_proof,
1838
+ status = "anchored",
1839
+ bitcoin_block_height = block_height,
1840
+ anchored_at = block_time,
1841
+ upgraded_at = NOW()
1842
+ WHERE origin_id = proof.origin_id
1843
+
1844
+
1845
+
1846
+
1847
+
1848
+ Fassbender Expires 29 October 2026 [Page 33]
1849
+
1850
+ Internet-Draft External Temporal Anchoring April 2026
1851
+
1852
+
1853
+ E.3. D.3. Batch Anchoring with Merkle Trees
1854
+
1855
+ Algorithm: BATCH-ANCHOR(hash_list)
1856
+
1857
+ // For high-volume partners (>1,000 hashes per request).
1858
+ // Anchors a single Merkle root instead of N individual hashes.
1859
+
1860
+ Input:
1861
+ hash_list -- ordered list of SHA-256 hashes [h_0 ... h_{n-1}]
1862
+
1863
+ Output:
1864
+ batch_record -- {batch_id, merkle_root, merkle_origin_id, origins[]}
1865
+
1866
+ Steps:
1867
+
1868
+ 1. VALIDATE
1869
+ ASSERT 1 <= |hash_list| <= 1000
1870
+ FOR EACH h IN hash_list:
1871
+ ASSERT h matches /^(sha256:)?[0-9a-f]{64}$/
1872
+
1873
+ 2. COMPUTE MERKLE ROOT // [RFC9162] Section 2.1
1874
+ // Canonical leaf ordering: strip "sha256:" prefix, sort pairs
1875
+ // lexicographically before concatenation.
1876
+ level <- [STRIP-PREFIX(h) FOR h IN hash_list]
1877
+ WHILE |level| > 1:
1878
+ next_level <- []
1879
+ FOR i <- 0 TO |level|-1 STEP 2:
1880
+ IF i+1 < |level|:
1881
+ pair <- SORT([level[i], level[i+1]])
1882
+ next_level.APPEND(SHA-256(pair[0] || pair[1]))
1883
+ ELSE:
1884
+ next_level.APPEND(level[i]) // odd element: promote
1885
+ level <- next_level
1886
+ merkle_root <- "sha256:" || level[0]
1887
+
1888
+ 3. CREATE INDIVIDUAL ORIGINS
1889
+ FOR EACH h IN hash_list:
1890
+ CALL CONSTRUCT-ANCHOR-RECORD(h) // DB insert only, no OTS
1891
+
1892
+ 4. ANCHOR MERKLE ROOT
1893
+ // Only the root is submitted to OTS calendar(s).
1894
+ // This reduces N OTS operations to 1.
1895
+ CALL CONSTRUCT-ANCHOR(merkle_root)
1896
+
1897
+ 5. LINK BATCH
1898
+ INSERT batch_submissions {
1899
+ batch_id, merkle_root, merkle_origin_id,
1900
+ hashes: hash_list, origin_ids: [per-hash origin_ids]
1901
+
1902
+
1903
+
1904
+ Fassbender Expires 29 October 2026 [Page 34]
1905
+
1906
+ Internet-Draft External Temporal Anchoring April 2026
1907
+
1908
+
1909
+ }
1910
+
1911
+ 6. RETURN batch_record
1912
+
1913
+ E.4. D.4. Verification Algorithm
1914
+
1915
+ The normative verification algorithm has been promoted to Section 3.1
1916
+ of this document. This appendix section is retained as a cross-
1917
+ reference for continuity.
1918
+
1919
+ See Section 3.1 (VERIFY-ANCHOR) for the full eight-step verification
1920
+ procedure with MUST/SHOULD requirements.
1921
+
1922
+ E.5. D.5. Verification Independence
1923
+
1924
+ The normative verification independence requirements have been
1925
+ promoted to Section 3.2 of this document.
1926
+
1927
+ See Section 3.2 for the definitive statement of what a conformant
1928
+ verifier requires and what it MUST NOT depend on.
1929
+
1930
+ Author's Address
1931
+
1932
+ Jonna Fassbender
1933
+ Umarise
1934
+ Email: j.fassbender@umarise.com
1935
+
1936
+
1937
+
1938
+
1939
+
1940
+
1941
+
1942
+
1943
+
1944
+
1945
+
1946
+
1947
+
1948
+
1949
+
1950
+
1951
+
1952
+
1953
+
1954
+
1955
+
1956
+
1957
+
1958
+
1959
+
1960
+ Fassbender Expires 29 October 2026 [Page 35]
model.txt ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Umarise Smoke Test Model
2
+ ========================
3
+
4
+ This is a placeholder artefact used to demonstrate verifiable provenance
5
+ for ML model files via cryptographic anchoring.
6
+
7
+ The file you are reading now will be hashed (SHA-256) and that hash
8
+ will be anchored into the Bitcoin blockchain via OpenTimestamps.
9
+
10
+ After anchoring, anyone can independently prove that this exact byte
11
+ sequence existed at or before the timestamp recorded in the .ots proof,
12
+ without needing to trust Umarise or Hugging Face.
13
+
14
+ Replace this file with your actual model artefact (weights, config,
15
+ tokenizer) when running the POC against a real model.