A signature should come with an explanation. Here is what Mark binds together, what a verifier checks and where the product stands today.
Technical overview · Reviewed 9 September 2026
01 / The promise
A human vouched for this content.
A personal Mark connects ZOREAL-verified proof of human to a specific statement or file, a stated context and evidence of when the person signed. They choose a site persona or a legal-name credential.
Liveness and biometric verification establish human presence. Hardware-bound keys, PKI certificates and signed presence attestations bind that evidence to the signer and the content they approve. The proof comes from these checks working together; a certificate alone does not establish live human presence.
A Mark does not prove that a human wrote every word, that the content contains no AI, or that a statement is true. It does not by itself establish a job title, platform account ownership or the signer’s freedom from coercion.
02 / The personal signing flow
Your phone holds your signing key.
The extension prepares the content and context, creates a sign order and displays a QR code. Your ZOREAL ID app scans the request, shows what you are signing and asks which identity to use. Biometric approval authorizes that specific personal signature.
The hardware-bound private key stays on the phone. The browser has no standing signing credential. ZOREAL countersigns the device signature hash with a presence attestation; it cannot substitute its countersignature for the holder’s device signature.
A recent liveness capture can cover a 15-minute signing window. Each personal Mark still requires biometric approval. The evidence carries the actual presence grade, such as recent; it must not imply a new liveness capture for each post.
Planned delegated Marks are a different operation: an agent signs under a time-limited human authorization, using a distinct ::ZOREAL-DELEGATED:: marker. They must be identified as agent activity, not personal review of every post.
03 / Identity & privacy
You choose how you are known.
Site persona
The default credential uses a pseudonymous identifier derived for the site’s registrable domain. It stays consistent within that site; other sites receive different personas. This limits direct cross-site linking through the identifier. It does not make the person anonymous to ZOREAL, or prevent people identifying themselves through what they post.
Verified name
A named badge shows the signer’s name without adding email or contact details. The badge is not the entire public record. The included legal-name certificate contains the legal name and document number, and may contain other certificate metadata. This public evidence is more revealing than the compact badge.
A legal-name Mark publishes identity permanently. The signing experience must explain the full disclosure before approval. Planned withdrawal will add a dated status; it will not erase the published name or certificate.
Role and account validation
Application-based validation of a title, position or account association is planned. These will be additional, separately reviewed claims, not conclusions drawn from an ordinary identity certificate.
04 / Verification chain
Check the evidence. Then show the result.
Verification depends on trusted issuer keys, validated certificates and signatures, content matching and context. A site drawing a Mark badge is not performing these checks on behalf of a reader’s trusted tool.
Inline format · Schematic, not a valid Mark
::ZOREAL-MARK::
The statement I stand behind.
::ZOREAL-SIGNATURE:<record-id>::
01
Locate the evidence
Parse the markers and the 24-character Crockford Base32 record ID. The ID locates an evidence bundle; it is not the signature. Retrieve the bundle or a cached copy. If it cannot be retrieved, report “Cannot verify now”.
02
Establish the trusted signer
Validate both the classical and post-quantum certificate chains against pinned root SubjectPublicKeyInfo digests. A root supplied in a record is not trusted merely because it is included. Verify the paired-chain hashes and the holder leaves’ matching public keys. Reject unknown critical extensions.
03
Check certificate purpose and status
Require contentCommitment key usage and id-kp-documentSigning extended key usage. An authentication certificate is insufficient. Validate both embedded Token Status List JWTs and the holder’s status at the trusted signing time; a live status lookup does not replace that historical check.
04
Check the presence attestation
Verify both signatures in the General JWS: ES256 and ML-DSA-65, with the presence-signing certificate purpose and trusted chains. Require the Mark audience, the same order nonce and device key, a native_attested channel, and the stated recent or live presence grade.
05
Verify the phone’s signature
Re-create the canonical payload hash and verify the ECDSA P-256/SHA-256 signature over H(payload) || UTF-8(order) || UTF-8(aud). The device signature is raw r || s, 64 bytes, encoded as base64url. Check payload.cert against the SHA-256 digest of the exact classical leaf certificate DER.
06
Bind presence to this signature
Check that zoreal.countersig_over in the signed presence attestation equals the SHA-256 of the device signature bytes. The attestation’s key thumbprint, subject certificate digest and order must bind to the same request and signer.
07
Validate the independent time evidence
Validate the RFC 3161 timestamp and its TSA chain. Recompute the record’s Merkle inclusion proof and compare SHA-256(root_bytes) with the token’s message imprint. The token’s genTime is authoritative. Check presence expiry and certificate status against that time.
08
Compare the content and its context
Compute the visible content hash using the specified canonicalization and match both payload.visible.hash and payload.data.hash. Compare the normalized page or channel URL, or the specified email context. An absent binding is explicitly labeled. A signature alone does not establish that the surrounding page is the signed content.
Payload, certificate and timestamp encodings
The payload is serialized with RFC 8785 JSON Canonicalization Scheme (JCS), then SHA-256 hashed. payload.cert is the base64url SHA-256 digest of the classical leaf certificate’s DER bytes. The audience is https://zoreal.com/mark.
The immutable record core excludes the fields timestamp, withdrawn, co_signers, reports and log. The timestamp batch uses these hashes:
Inclusion verification uses the leaf index, tree size and audit path. It is a timestamp batch proof; the planned public transparency log is a separate capability.
Two certificate chains. Both checked.
A certificate chain connects the signing key to a root the verifier already trusts. ZOREAL uses two parallel chains: one rooted in classical ECDSA, the other in post-quantum ML-DSA. Each certificate carries one signature. The paired-chain extension links the corresponding certificates by their SHA-256 digests.
Holder certificate paths · simplified
Classical
ZOREAL Root CA 1 · ECDSA P-384
→ Human Identity CA
→ Holder certificate · device P-256 public key
Post-quantum
ZOREAL Post-Quantum Root CA 1 · ML-DSA-87
→ Post-Quantum Human Identity CA
→ Paired holder certificate · same device public key
Both holder certificates contain the same phone public key. Verification follows each chain to its pinned root, checks every certificate signature and validity period, enforces CA constraints and signing purpose, and checks the pairing. A missing or invalid post-quantum chain cannot fall back to a classical-only success.
Presence has its own purpose-specific certificate paths under these roots. The presence service signs the same claims with ES256 and ML-DSA-65. Those claims include the device-key thumbprint, order, audience and hash of the phone’s exact signature. Both presence signatures must verify.
What post-quantum readiness means here
ML-DSA is the post-quantum signature algorithm standardized in NIST FIPS 204. It adds a post-quantum verification path at the certificate-issuer and presence-attestation layers, alongside the classical checks.
The phone’s hardware-bound P-256 signing key remains classical, as does the current timestamping chain. The ML-DSA presence signature binds to the phone’s signature; it does not turn that phone key into a post-quantum key. This is a combined verification design, with the algorithms and their roles available for inspection.
Trust anchors
These trust anchors are compiled into the extension and never fetched from the page or record service. Compare them with the values on the ZOREAL ID app’s About screen and the verifier’s published trust-anchor source.
Each fingerprint below is Base64(SHA-256(DER(SubjectPublicKeyInfo))): a digest of the root’s public-key structure, not of the whole certificate. The timestamping anchor validates the independent time evidence; the ZOREAL roots validate ZOREAL’s certificate chains.
The record address locates the proof. payload.data.url identifies the page the person signed. They serve different purposes: opening a record does not establish that content on some other page matches it.
id · kind
The record identifier and content type. This example is a text Mark.
payload
The signed statement of intent: content hash, page or channel binding, audience, order, certificate digest and chosen identity. The example uses a site persona, rather than a legal name. The text itself is represented by its hash.
presence
The signed human-presence evidence. Its General JWS contains ES256 and ML-DSA-65 signatures. In the example, the claims specify a recent presence grade and native_attested channel, bound to the same order and device signature.
signature.device
The phone’s approval, verified with the holder’s public key. A verifier recalculates the signed bytes; it does not trust an approval label in the JSON.
The classical and post-quantum holder certificate paths. Their roots must match the compiled trust anchors above.
signature.revocation
Both signed Token Status Lists. They establish the holder certificates’ status at the independently confirmed signing time.
assurance
A readable summary of enrollment and key-protection evidence. The verifier derives trusted claims from the signed certificates and attestations, rather than accepting this summary on its own.
timestamp
The RFC 3161 token and Merkle inclusion proof. The example records 2026-09-09T02:49:03Z as its timestamp time. A batch containing one record has an empty audit path; the leaf is already the root. The token’s signature, chain and imprint must still verify.
created_at · withdrawn
The service’s creation time and any withdrawal evidence. Creation time is not the independent signing timestamp. A null withdrawal field means no withdrawal is supplied in that bundle.
Fields such as timestamp.status: "confirmed" describe the record; they are not a substitute for verification. A reader’s tool checks the cryptographic evidence, the actual visible content and its context before showing a result.
Request the evidence as JSON
Clients request the production record without reader credentials. Availability is reported separately from whether the evidence passes verification.
The record ID is a lookup key, not a secret. Moving a signed record between environments does not change its original content or page binding.
05 / What must match
Words, files and their context.
Text: mark-text-v1
Signers and verifiers apply the same normalization before hashing, allowing specified punctuation and spacing changes made by publishing tools:
Extract text between the markers, excluding their single separator spaces.
Apply Unicode NFC normalization.
Fold curly quotes to ASCII quotes; en/em dashes and the minus sign to a hyphen; ellipsis to three dots; Unicode spaces to a normal space.
Collapse consecutive whitespace, including tabs and line breaks, to one space, then trim.
Encode as UTF-8 and hash with SHA-256.
Letters, case, digits and word order are not folded. Formatting and punctuation differences covered by these rules can remain valid; this is a canonical text comparison, not a byte-for-byte comparison of the original text box.
Page context
Normalize the scheme and hostname to lowercase, remove default ports and fragments, remove tracking query parameters (utm_*, fbclid, gclid, si, ref, feature), sort remaining parameters, and remove a trailing slash except at the root. Compare the resulting address with the signed context.
Copying identical signed text within its bound page does not prove which platform account posted it. Moving it to another page produces a different-context result. If a platform removes the markers, a verifier cannot find that Mark.
Files, images, audio and video
The specified file check hashes the exact bytes. Re-encoding an image or clip can break the match even when it looks or sounds similar. A perceptual match, screenshot or listening result must not be presented as a cryptographic content match. Capture-based discovery and embedded stream signatures remain planned work.
06 / A result with context
Different evidence. Different answers.
Verified here
The required evidence checks pass, the content matches and the signed context matches this page.
Verified for another page
The signed content matches, but the current page differs. Show the address it was signed for.
Verified, not bound to a page
The signature has no page binding. Do not present it as verified for this page.
Not verified — text altered
The visible content does not match the signed canonical text.
Time unconfirmed
The timestamp is pending or cannot be validated. The record service’s created_at value is not independent time evidence. Do not display it as a trusted timestamp.
Cannot verify now
The evidence is unreachable and no cached copy is available. This is not evidence of an invalid signature.
No Mark found
There are no usable markers or no correctly formed record ID. A drawn badge alone is insufficient.
Withdrawn by the signer — planned
Verify the signed withdrawal and display its date. Retain the original evidence instead of displaying the usual verified badge.
07 / Implementation status
Available today. What comes next.
Mark is available now. The examples on the product page are illustrative; use the browser extension or verifier to check actual Marks.
Available now
Verifier, Chrome extension and server flow
The verifier library, Chrome extension, sign orders, signed presence evidence, record service and minute timestamping work together to sign content and check its proof. The public record endpoint exists; the reader-facing record page is still planned.
Sign with ZOREAL ID
Personal approval, from phone to post
Real Marks have been signed from the ZOREAL ID app through the Chrome extension and checked with the verifier, including posts created in embedded editors. Use your phone to review the content, choose how to identify yourself and approve each personal Mark.
Planned
More ways to sign and verify
Safari, the dedicated Mark app, capture and listening experiences, embedded media signatures, extended role validation, withdrawal, co-signing, reports, delegated and organization experiences, and the public transparency log.
08 / Our commitment
Explain the mechanism. Make it examinable.
Our transparency commitment is to explain what is signed, how results are reached, what is disclosed and which limitations remain. This guide describes the current protocol and implementation status. The open-source verifier makes the checks themselves available for review.
Mark is designed for verification from an evidence bundle using known trust anchors, without a reader account. The planned append-only transparency log and signed daily archives are not yet operating. Those are additional measures for public scrutiny and evidence availability, not a prerequisite for describing the mechanism honestly today.
Read the code. Run the checks.
The Mark verifier is open source under the MIT license. You are welcome to inspect how it validates certificate chains, binds human presence to a signature, checks timestamps and compares content. The Chrome extension uses this verifier in its background worker, separately from the page displaying the post.
The repository documents how to build and test the verifier, including examples that must fail verification. Open implementation and published trust anchors make the result reproducible and the trust decisions visible.
Underlying standards
Proof of human spans document authentication, biometric presence, protected keys, PKI and content verification. These are the standards behind those layers, with the role of each made explicit. A protocol reference is not a claim that the entire product is certified under that standard.
Government documents, chip access and biometrics9 references
The document establishes an identity source. Face matching and liveness connect that document to the person enrolling in ZOREAL ID.
BAC and PACE establish access and secure messaging. Active Authentication and Chip Authentication provide additional chip evidence where the document supports them.
Passive Authentication checks the signed data against a Document Signer certificate and a trusted Country Signing CA. This government-document chain is separate from ZOREAL’s Mark certificate chains.
The PACE and Chip Authentication protocols used by supported identity documents. Available checks depend on the document; this does not imply access to restricted fingerprint or iris data.
Testing and reporting terminology for evaluating biometric presentation attacks. ZOREAL’s liveness models, capture challenges and decision thresholds are implementation-specific; citing this standard is not a certification claim.
Certificate issuance, purpose and chain validation9 references
Certificates bind a public key to an issuer’s verified claims. A verifier also checks who issued them, which operations they permit and whether their status allowed the signature.
Certificate structure, validity, Basic Constraints, key usage, critical extensions and certification-path validation. Mark also carries signed Token Status Lists for historical holder status.
A reference for identity attribute and biometric-information structures used in certificate profiles. Use of these structures does not make an ordinary Mark a qualified electronic signature.
Signed-data containers used in document security objects and timestamp tokens. The Mark record itself is JSON.
Signing keys, hashes and encryption9 references
Different keys have different jobs: the phone approves the content, certificate authorities issue credentials, and the presence service binds human presence to that exact approval.
Compressed, signed certificate-status evidence carried in the record and checked at the trusted signing time. This specification is still a draft, not a published RFC.
The inclusion-proof algorithm used to check membership in a timestamp batch. This use does not imply the separate public transparency log is already operating.
ZOREAL-specific protocol rules: the Mark markers and record ID, mark-text-v1, page-binding normalization, paired-chain extension, certificate policies, presence grades and countersignature bindings are defined by ZOREAL. Their implementation is available in the verifier source; they should not be mistaken for separate ISO or IETF standards.
For questions about the protocol or a discrepancy in this guide, contact our team.