Skip to transparency guide
ZOREAL
ZOREAL MarkThe evidence behind the Mark

Proof you
can inspect.

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>::
  1. 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”.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

  6. 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.

  7. 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.

  8. 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:

core_hash = SHA-256(JCS(core))
leaf = SHA-256(0x00 || UTF-8(id) || core_hash)
node = SHA-256(0x01 || left || right)
TSA imprint = SHA-256(root_bytes)

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.

ZOREAL Root CA 1
Classical certificate chains · ECDSA P-384Q6N1FDet9QG5T9UztVKbsXvQylB3eNiN5UIKxDp1p3k=
ZOREAL Post-Quantum Root CA 1
Post-quantum certificate chains · ML-DSA-87rxr4sieLvSvCB/jCnoA56LaZQdqNuC7nq01uHuDnm/0=
DigiCert Trusted Root G4
Independent timestamping chainWd8xe/qfTwq3ylFNd3IpaqLHZbh2ZNCLluVzmeNkcpw=

Inside a Mark record

The short ID after ::ZOREAL-SIGNATURE: points to a public evidence bundle. The production address follows this format:

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.
signature.certificate_chain
signature.paired_chain
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.

curl --header 'Accept: application/json' \
  'https://zoreal.com/mark/XCTZ18HAB05B5RJB938NB20J'

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:

  1. Extract text between the markers, excluding their single separator spaces.
  2. Apply Unicode NFC normalization.
  3. 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.
  4. Collapse consecutive whitespace, including tabs and line breaks, to one space, then trim.
  5. 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.

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.

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.

Presence attestations and certificate status9 references

Signed presence evidence links the device key, content approval, audience and order. Both the classical and post-quantum signatures must pass.

Content, encoding and independent time8 references

A reader must calculate the same bytes and hashes as the signer. Independent time evidence makes the signing-time check reproducible.

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.

Explore ZOREAL Mark