Verification Flow
Verification confirms who signed a document, when, and whether a copy is unchanged. There are two ways to verify, and they prove different things:
- QR scan (phone or browser): proves who signed and when. Needs no account or software installation.
- Desktop Verify (Veylent app): also proves the file in hand is the one that was signed.
QR Code Verification (Mobile)
This is the primary method, designed for zero friction.
How It Works
- Scan -- The verifier scans the QR code on the signed PDF with their phone camera
- Open -- The phone opens the verification URL in a browser, or in the Veylent Verify app
- Lookup -- The signature is looked up on the blockchain by the anchor ID in the URL
- Decrypt -- The key in the URL fragment decrypts the signing record entirely on the device
- Check -- The SHA-256 of the decrypted record must equal the composite hash on the blockchain, and the record must name the same anchor ID
- Display -- The page shows the signer's identity, signing time, and blockchain confirmation
The Key Never Leaves the Browser
The verification URL has two parts:
HTTPS://VERIFY.GETVEYLENT.COM/V/<anchorId>#<encryptionKey>
The #fragment portion of a URL is never sent to any server -- this is a fundamental property of HTTP defined in RFC 3986. The encryption key stays entirely within the browser. The server sees the anchor ID (which is already public on the blockchain) but never the key.
Verification States
| State | Meaning |
|---|---|
| Verified | Anchor found on-chain, record decrypted, its hash matches the on-chain composite hash, and it names this anchor ID |
Partial Verification (no-key) | Anchor found, but the URL has no key (fragment missing or stripped), so the details can't be opened |
Doesn't match (mismatch) | The record doesn't open with the key, doesn't hash to the on-chain composite hash, or names another anchor. Treat it as forged. No details are shown. |
No such signature (not-found) | No anchor with this ID on the blockchain |
Couldn't verify (error) | The link is malformed or the server couldn't be reached |
What Is Displayed
When fully verified:
Signer Information:
- Name, email, type (individual/company)
- Company and position (if applicable)
- How the signer authenticated (trust anchor)
Document Information:
- Document hash
- Signing timestamp
- Geolocation (if captured at signing time)
Blockchain Proof:
- Anchor ID (shown as "Signature ID")
- Transaction hash
- Block time
- Signature chain length
What a Scan Cannot Prove
A scan never sees the document. It shows the document hash that was signed, but it cannot check that the paper or file in front of the verifier matches it. To check a copy, open it in the desktop app.
Desktop Verification
The desktop app checks the file itself:
- Open the signed PDF in the verification tab
- The app finds each signer's layer: the first save whose signing history has that signer's entry last
- For each signer it cuts the file at the end of their layer and computes the SHA-256 of those bytes
- It looks up the signer's anchor and decrypts their record with the key from the QR URL in their history entry
- It checks that the record hashes to the on-chain composite hash, names the same anchor ID, links to the previous signer's anchor ID, and holds exactly the hash computed in step 3
The names and details shown come from the sealed record when it opens and checks out. The signing history in the file is plain and editable, so it is only shown as a fallback.
Document Results
| Status | Meaning |
|---|---|
verified | Every signature checks out and nothing follows the last signer's layer |
changed-after-signing | Every signature checks out, but something other than whitespace was added after the last signer's layer |
failed | At least one signature doesn't match the blockchain or the file |
unchecked | The file looks intact, but the server couldn't be reached |
legacy | Signed with an earlier Veylent format that can't be checked this way |
rewritten | Another app rewrote the whole file after signing, so the signers' layers can't be found |
not-veylent | No Veylent signing history |
Signer Results
| Status | Meaning |
|---|---|
valid | The signer's record matches the blockchain and the file up to their layer |
document-mismatch | The file up to this signature isn't the one that was signed |
record-mismatch | The sealed record doesn't open, doesn't match the on-chain hash, or names another anchor |
not-anchored | No signature with this anchor ID on the blockchain |
out-of-order | The blockchain links this signature to a different previous signature |
unchecked | The server couldn't be reached, or holds no sealed record for this signature |
The app also flags a signer who signed a version that was changed after the previous signature.
Viewing Signed Versions
Because each signed version is a byte prefix of the final file, the app can show any of them. View on a signer opens the file as it was right after that signer's layer. View original opens it as it was before anyone signed.