Upload 2 files
Browse files- draft-fassbender-scitt-time-anchor-01.txt +1960 -0
- 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.
|