Contract Date Stamper: before and after
An illustration with sample files; your own files show their own results.
NDA: no proof of date
Lease: no proof of date
50 files: no proof of any
NDA: RFC 3161 timestamp
Lease: RFC 3161 timestamp
50 files, one root hash
Contract Date Stamper — Prove When a Contract Existed
Prove that a contract, NDA or agreement existed in a particular form at a particular moment, without showing it to anyone. Documents are hashed in your browser, a batch is committed to one Merkle root, and only that root is bound to a signed timestamp from an RFC 3161 Timestamp Authority. The receipt and certificate can be verified years later, offline, without trusting you or this website.
Almost everything runs locally, and the one network step carries no document. Hashing, the Merkle tree, the receipt, its signature and the verifier run in your browser; offline mode uses no network. A trusted timestamp sends a request of about sixty bytes (the batch’s 32-byte Merkle root and a random nonce) and nothing else: no filename, no identity, no individual document digest. The request exists only because public RFC 3161 authorities allow no direct browser calls.
The chain of custody
- Streaming multi-digest: the file is read in chunks in a Web Worker and absorbed by incremental SHA-256, SHA-384 and SHA-512, so memory stays flat even for very large files.
- Domain-separated Merkle commitment: leaf = SHA-256(
0x00‖ digest), node = SHA-256(0x01‖ left ‖ right). The distinct prefixes stop an interior node being passed off as a document, and an unpaired node is promoted, not duplicated. - RFC 3161 request: a DER
TimeStampReqis built in the browser from the root and a 63-bit nonce, then relayed to the authority. - Verification before trust: the returned token is checked before it enters a receipt. The imprint must equal our root, the nonce must be echoed, the CMS signature must verify, and the certificate must carry
id-kp-timeStampingas its only extended key usage and have been valid atgenTime. - Signed receipt: a canonical JSON payload (
orilami.poe.v1) with every digest, inclusion path, the raw token and the limits of the claim, signed with Ed25519 or ECDSA P-256 via WebCrypto.
Why a Merkle root instead of one stamp per file
Fifty individual stamps would mean fifty requests and fifty fingerprints disclosed. A tree stamps one value, and each contract keeps a short inclusion path proving it belonged to the batch. The path holds only hashes of other branches, so one document can be proven without revealing or naming the others.
What the proof establishes
A proof of existence binds bytes to a time: the exact document you hashed existed no later than the authority's asserted moment, and any later revision is a different document. It does not establish who wrote it, who agreed to it or whether it is enforceable. Revocation status is not fetched and the authority's chain is not anchored to an operating-system root store, because a web page has access to neither; the receipt says so in its own signed text.
Verifying without this tool
The PDF certificate carries the signed receipt JSON and the raw .tsr token as attachments, so the proof survives independently of this site. The token verifies with standard tooling (openssl ts -verify -token_in), and the receipt's signature verifies with any WebCrypto or JOSE implementation after re-canonicalizing the payload (orilami-jcs-v1).
Frequently asked questions
Is my contract uploaded anywhere?
Does this tool run locally?
What does a proof of existence actually prove?
Why is a timestamp from a Timestamp Authority better than a file date?
How can someone else check the receipt?
What is the Merkle root for?
Can I stamp a document without using a timestamp authority at all?
Does it check whether the authority's certificate was revoked?
Why can't the browser talk to the Timestamp Authority directly?
What stops the authority or the relay returning a token for something else?
Can I prove one contract from a batch without revealing the others?
How large a file can it hash?
Why implement SHA-2 rather than use the browser's own?
Is the PDF a PDF/A archive?
Does verifying cost tokens?
Contract Date Stamper at a glance
| Where it runs | Entirely in your browser. Files are never uploaded. |
|---|---|
| Cost | 200 tokens per contract (about $2.00 at the base rate); larger batches cost less per contract: 6–10 take 10% off the total, rising to 30% off at 41–50 |
| Accepts | Any file: contracts, NDAs, agreements, scans, archives. Up to 50 per batch, any size |
| Produces | A signed proof-of-existence receipt as JSON and a PDF certificate, both carrying the RFC 3161 timestamp token, each document's digests and its Merkle inclusion path. |
| Batch | Up to 50 files per run. |
| Account needed | Only to spend tokens. Browsing and previewing are free. |
| What it does not do | It proves specific bytes existed at a time. It proves nothing about who wrote them, who agreed to them, or whether the agreement is binding. |
