ATL Protocol Specification (v1.0.0)
Author: Dmitrii Zatona (Evidentum Labs, Inc.)
Status: Draft Standard
Version: 1.0.0
Date: January 2026This document specifies the Anchored Transparency Log (ATL) Protocol version 1.0.
Abstract
It defines a cryptographic protocol for maintaining a privacy-preserving, verifiable, append-only log of facts and evidence from across the digital and physical domains.
Unlike traditional transparency logs which require public disclosure of all entries, ATL employs a Selective Disclosure model. This allows a log operator to prove the existence, integrity, and timestamp of specific entries to a verifier without revealing the contents of other entries in the log. The protocol utilizes Merkle Trees (RFC 6962) , Consistency Proofs (RFC 9162) , JSON Canonicalization Scheme (RFC 8785) , Ed25519 Signatures (RFC 8032) , SHA-256 (RFC 6234) , and RFC 3161 Time-Stamps with detached Evidence Receipts to enable offline verification.
1. Introduction
In modern digital infrastructure, proving the integrity and temporal existence of data is critical for auditability, compliance, and dispute resolution. Traditional solutions rely on centralized trusted third parties or fully public transparency logs (like Certificate Transparency).
Centralized solutions introduce a single point of failure and trust. Fully public logs, while verifiable, are unsuitable for sensitive business data or personally identifiable information (PII) due to data leakage risks.
The Anchored Transparency Log (ATL) Protocol addresses these limitations by decoupling the verification of the log’s integrity from the visibility of its contents.
1.1. Core Philosophy
The ATL Protocol is built upon the principle of Selective Disclosure.
- Private Storage: The full dataset and the Merkle Tree structure are stored privately by the Log Operator.
- Public Anchoring: Only the cryptographic root of the Merkle Tree (the “Checkpoint”) is made public or anchored in a trusted timestamping service.
- Portable Evidence: Verification is performed using a “Receipt” — a self-contained cryptographic proof that links a specific private entry to the public anchor.
1.2. Terminology
The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “NOT RECOMMENDED”, “MAY”, and “OPTIONAL” in this document are to be interpreted as described in BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here.
- Log Operator: The entity maintaining the append-only log.
- Entry: A data record submitted to the log.
- Checkpoint: A signed data structure attesting to the state of the Merkle Tree (Root Hash + Tree Size) at a specific point in time. Also known as Signed Tree Head (STH).
- Receipt: A file containing the Entry, an Inclusion Proof, and a Checkpoint, allowing offline verification.
- Anchor: An external timestamping token (e.g., RFC 3161 or Bitcoin transaction) proving the Checkpoint existed at a specific time.
- Consistency Proof: A cryptographic proof that demonstrates the append-only property of the log by proving that an earlier tree state is a prefix of a later tree state. This prevents the Log Operator from rewriting history (Split-View attacks).
2. Cryptographic Primitives
To ensure interoperability and security, implementations MUST adhere to the following cryptographic standards.
2.1. Hashing Algorithm
All hashing operations MUST use SHA-256 [RFC6234].
In text representations (JSON), hashes MUST be encoded as lowercase hexadecimal strings prefixed with sha256:.
Example: "sha256:a1b2c3d4..."2.2. Digital Signatures
Signatures for Checkpoints MUST use Ed25519 (EdDSA over Curve25519) [RFC8032].
In text representations (JSON), signatures MUST be encoded as standard Base64 strings prefixed with base64:.
Example: "base64:SGVsbG8gV29ybGQ..."2.3. Canonicalization
To ensure deterministic hashing of structured metadata, all JSON objects MUST be canonicalized according to the JSON Canonicalization Scheme (JCS) [RFC8785] before being hashed.
3. Merkle Tree Structure
The ATL Protocol uses a binary Merkle Tree structure consistent with [RFC6962] (Certificate Transparency), with specific modifications for leaf construction.
3.1. Leaf Hash Calculation
The input to the Merkle Tree leaves is not just the payload, but a composite structure including metadata.
The hash of a leaf entry $L$ is calculated as:
LeafHash = SHA256( 0x00 || PayloadHash || MetadataHash )Where:
0x00is a single byte prefix to prevent second-preimage attacks (distinct from node prefix).PayloadHashis the 32-byte SHA-256 hash of the original document/data.MetadataHashis the 32-byte SHA-256 hash of the JCS-canonicalized metadata JSON.
3.2. Internal Node Hash Calculation
The hash of an internal node $N$ is calculated as:
NodeHash = SHA256( 0x01 || LeftChildHash || RightChildHash )Where:
0x01is a single byte prefix.LeftChildHashandRightChildHashare the 32-byte hashes of the children.
4. Data Structures
4.1. Checkpoint (Wire Format)
To avoid parser ambiguities and ensure byte-for-byte signing consistency, the Checkpoint MUST be constructed as a fixed-length binary blob of exactly 98 bytes before signing.
Offset Size Field Encoding
------ ---- ----- --------
0 18 Magic Bytes "ATL-Protocol-v1-CP" (ASCII)
18 32 Origin ID SHA256 of Instance UUID (binary)
50 8 Tree Size u64 little-endian
58 8 Timestamp u64 little-endian (Unix nanoseconds)
66 32 Root Hash SHA256 root of Merkle tree (binary)
------ ----
Total: 98 bytes4.2. Evidence Receipt (JSON)
The Evidence Receipt allows an offline verifier to prove that an entry exists in the log.
{
"spec_version": "1.0.0",
"entry": {
"id": "<UUID>",
"payload_hash": "sha256:<hex>",
"metadata": { ... }
},
"proof": {
"tree_size": <integer>,
"root_hash": "sha256:<hex>",
"inclusion_path": [ "sha256:<hex>", ... ],
"leaf_index": <integer>,
"checkpoint": {
"origin": "sha256:<hex>",
"tree_size": <integer>,
"root_hash": "sha256:<hex>",
"timestamp": <integer_nanos>,
"key_id": "sha256:<hex>",
"signature": "base64:<string>"
},
"consistency_proof": {
"from_tree_size": <integer>,
"path": [ "sha256:<hex>", ... ]
}
},
"anchors": [
{
"type": "rfc3161",
"timestamp": "<ISO8601>",
"token_der": "base64:<string>"
}
]
}5. Verification Algorithm
A Verifier, possessing only the Evidence Receipt and the Log Operator’s trusted Public Key, MUST perform the following steps:
Step 1. Reconstruct Leaf Hash
Decode payload_hash, canonicalize metadata, and compute:
LeafHash = SHA256(0x00 || PayloadHash || MetadataHash)Step 2. Verify Checkpoint Signature
Reconstruct the 98-byte binary blob from the checkpoint fields and verify the Ed25519 signature using the trusted Public Key.
Step 3. Verify Inclusion Proof
Execute the Merkle Inclusion Proof algorithm (RFC 6962) using LeafHash, leaf_index, tree_size, and inclusion_path. The result must match the root_hash.
Step 4. Verify Consistency Proof (Conditional)
If a consistency_proof is present in the receipt, the Verifier MUST verify it to ensure the log’s append-only property. This step is REQUIRED when verifying receipts against a previously known tree state.
- Retrieve the previously trusted Checkpoint (from local storage or prior verification).
- Verify that
consistency_proof.from_tree_sizematches the previously trustedtree_size. - Execute the Merkle Consistency Proof verification algorithm (as defined in RFC 9162, Section 2.1.4) using:
from_tree_size(the previously trusted tree size)to_tree_size(currentproof.tree_size)from_root_hash(the previously trusted root hash)to_root_hash(currentproof.root_hash)consistency_proof.path
- The algorithm MUST confirm that the old tree is a prefix of the new tree.
Note: If the Verifier has no prior knowledge of the log state (first-time verification), this step MAY be skipped. However, for ongoing monitoring scenarios, Verifiers SHOULD maintain a local record of the last verified Checkpoint.
Step 5. Verify Anchors (Optional)
If anchors are present, the Verifier SHOULD verify them to establish independent temporal proof.
- RFC 3161:
- Decode
token_der(ASN.1 DER). - Verify the cryptographic signature of the Time Stamping Authority (TSA).
- Verify that the
MessageImprintwithin the token matchesproof.root_hash.
- Decode
6. Security Considerations
6.1. Hash Collisions
The security of the log depends on the collision resistance of SHA-256.
6.2. Key Management
The integrity of the Checkpoints relies entirely on the secrecy of the Log Operator’s private key. Implementations SHOULD support key rotation mechanisms.
6.3. Privacy
By design, the Inclusion Proof reveals O(log n) intermediate hashes. The probability of guessing the content of a sibling hash is negligible (2^-256).
6.4. Log Integrity and Split-View Attack Prevention
A malicious Log Operator could attempt to present different views of the log to different parties (a “Split-View” or “Fork” attack). ATL employs a layered defense:
-
Consistency Proofs: Verifiers who maintain state can detect forks by requiring Consistency Proofs between successive Checkpoints. If a Log Operator attempts to present inconsistent tree states, the Consistency Proof verification will fail.
-
External Anchoring: By anchoring Checkpoints in immutable external systems (RFC 3161 TSAs, Bitcoin blockchain), the Log Operator commits to a specific tree state at a specific time. Any attempt to present an alternative history will conflict with the anchored commitment.
-
Gossip Protocols: For high-assurance scenarios, Verifiers MAY implement gossip protocols to compare Checkpoints with other parties.