How FreeSign works
FreeSign e-signature architecture — privacy-first PDF sealing
The PDF never leaves your browser. The server witnesses the ceremony — it never sees the document.
Drop the PDF
The browser computes document_sha256 locally. The file is never uploaded.
Prove identity
Enter the emailed one-time code — or, for a returning signer, tap a saved passkey.
Sign the payload
WebCrypto ECDSA P-256 signs the canonical consent payload in memory.
Stamp the PDF
A signature revision is appended (revision 2); the browser computes byterange_sha256.
Embed the seal
The CMS is embedded into the signature; a /DSS revision (PAdES-B-LT: CA + CRL) is appended on free-sign.com. Sealed PDF downloaded.
Create the envelope
Stores the document hash and binds the browser's session public key — write-once.
Verify identity
Checks the OTP + Turnstile, or the WebAuthn assertion against the registered passkey.
Record the receipt
Stores the signature receipt and extends the per-envelope audit hash chain.
Run the seal pipeline
Mints an ephemeral leaf cert under the FreeSign CA, builds the CMS (PAdES-B-T), adds an RFC 3161 timestamp, submits OpenTimestamps.
Persist the evidence
Writes the seal, certificates and anchor row to D1. No PDF bytes are ever stored.
Cloudflare D1
Evidence store — envelopes, receipts, the audit chain and anchor rows.
All stepsMailgun + Turnstile
Identity gate — one-time-code email delivery and a bot challenge.
Step 2Google Cloud HSM
Holds the Signing-CA private key; signs each leaf TBSCertificate. The key never leaves the HSM.
Step 4 — sealDigiCert TSA
RFC 3161 trusted timestamp — upgrades the seal to PAdES-B-T.
Step 4 — sealOpenTimestamps
Independent timestamp proof, later upgraded to a Bitcoin block anchor.
Step 4 → 5Drop the PDF
The browser computes document_sha256 locally. The file is never uploaded.
Prove identity
Enter the emailed one-time code — or, for a returning signer, tap a saved passkey.
Sign the payload
WebCrypto ECDSA P-256 signs the canonical consent payload in memory.
Stamp the PDF
A signature revision is appended (revision 2); the browser computes byterange_sha256.
Embed the seal
The CMS is embedded into the signature; a /DSS revision (PAdES-B-LT) is appended on free-sign.com. Sealed PDF downloaded.
Create the envelope
Stores the document hash and binds the browser's session public key — write-once.
Verify identity
Checks the OTP + Turnstile, or the WebAuthn assertion against the registered passkey.
Record the receipt
Stores the signature receipt and extends the per-envelope audit hash chain.
Run the seal pipeline
Mints an ephemeral leaf cert under the FreeSign CA, builds the CMS (PAdES-B-T), adds an RFC 3161 timestamp, submits OpenTimestamps.
Persist the evidence
Writes the seal, certificates and anchor row to D1. No PDF bytes are ever stored.
Cloudflare D1
Evidence store — envelopes, receipts, the audit chain and anchor rows.
All stepsMailgun + Turnstile
Identity gate — one-time-code email delivery and a bot challenge.
Step 2Google Cloud HSM
Holds the Signing-CA private key; signs each leaf TBSCertificate. The key never leaves the HSM.
Step 4 — sealDigiCert TSA
RFC 3161 trusted timestamp — upgrades the seal to PAdES-B-T.
Step 4 — sealOpenTimestamps
Independent timestamp proof, later upgraded to a Bitcoin block anchor.
Step 4 → 5What crosses the trust boundary
Between the browser and the worker: only hashes, payloads, signatures, OTP codes / passkey assertions and the finished CMS. The PDF's bytes never cross — the document is read, hashed, stamped and sealed entirely in the browser.
Why it holds
What you receive
Sealed PDF + evidence
A standard PAdES-B-T PDF. Inside it: the CMS signature, the RFC 3161 timestamp, the per-user certificate chain, the embedded evidence JSON, the OpenTimestamps proof, and — when the CA CRL is configured — a /DSS dictionary for long-term validation. The OpenTimestamps proof also downloads as a separate .ots file.