Texas Veteran Certified BusinessTexas VetHUB Vendor

ML-DSA-65 hybrid envelopes · Hedera topic 0.0.9001

Hybrid signatures, agent automation, and a public Hedera proof.

One OpenAPI contract for three calls. Request a classical signature or a hybrid ECDSA P-256 + ML-DSA-65 envelope, anchor a SHA-384 (96 hex characters) hybrid of those signatures on Hedera Consensus Service, and read the timestamp back with verify. Agents hold API keys, not signing keys. Every sign request is written to the audit log. A hash shows a document has not changed since it was sealed. It does not prove who signed it.

3
SDK calls to a verified proof
~3s
to Hedera consensus finality
0
private keys handed to agents
HashSign

HashSign ledger

Hedera · topic 0.0.9001

Healthy
  1. 01

    documents.upload()

    Digest computed on-device · 248 KB · contract.pdf

    Draft
  2. 02

    documents.sign()

    pqcMode · hybrid ECDSA + ML-DSA-65 · key_invoice_bot

    Pending Anchor
  3. 03

    documents.verify()

    0.0.45291@1726580598.441002113 · consensus 2.9 s

    Anchored on Hedera

Interactive playground

Three calls. Python, TypeScript, or plain cURL.

The preview opens on a hybrid sign request (pqc_mode=True). Paste a key, switch languages, and run the mock flow to see the SignedPayload and the Hedera proof shape. No live topic submit happens from this page.

sign_contract.py
from hashsign import HashSignClient, HashSignError

client = HashSignClient(api_key="hs_live_your_key")

try:
    # The SHA-384 seal (96 hex characters) is computed in this process. The file stays on the device until you send or share it.
    document = client.documents.upload(
        "contract.pdf",
        metadata={"agentId": "invoice-bot"},
    )
    # pqc_mode requests classical + ML-DSA-65. HCS stores SHA-384 (96 hex characters) of both.
    signed = client.documents.sign(document.id, pqc_mode=True)
    proof = client.documents.verify(document.id)
except HashSignError as exc:
    raise SystemExit(f"signing failed: {exc}")

print(signed.payload.algorithm, signed.payload.signer_key_id)
print(signed.payload.pqc.algorithm, signed.payload.pqc.hybrid_anchor)
print(proof.topic_id, proof.hedera_transaction_id, proof.verified)

SDK payload preview · SignedPayload

Response shape from the OpenAPI contract when pqcMode is set: algorithm hybrid-ecdsa-ml-dsa, plus an ml-dsa-65 object whose hybridAnchor is SHA-384 (96 hex characters) of the two signatures.

{
  "documentId": "doc_01JXYZ",
  "sha384": "47f05d367b0c32e438fb63e6cf4a5f35c2aa2f90dc7543f8a41a0f95ce8a40a313ab5cf36134a2068c4c969cb50db776",
  "signedAt": "2026-09-19T12:00:01.002Z",
  "signerKeyId": "key_invoice_bot",
  "signature": "9c21ed25519c0ffee0123456789abcdeffedcba9876543210abcdef01234567",
  "algorithm": "hybrid-ecdsa-ml-dsa",
  "agentLogoUri": "ipfs://bafybeia008befe96d31f1b2f19c7844c4e98c37bc4bac3df0276669d",
  "agentBrandHash": "a008befe96d31f1b2f19c7844c4e98c37bc4bac3df0276669d9b9f24e24d7812fc0942e3f440df5ff21790e51a1b9af2",
  "pqc": {
    "enabled": true,
    "algorithm": "ml-dsa-65",
    "signature": "d1lthm65abababababababababababababababababababababababababababab",
    "hybridAnchor": "a540d42e455459c4b2cd542f46726f903bcbe8dc9cb7d2ee8ff9cc99dcdf4e1d5765642064ad3c9a1f4d9e6ec63ec171"
  }
}

Live proof simulator

Hash a real file. See the proof Hedera would return.

The document stays on the device until you send or share it. Only the SHA-384 seal (96 hex characters) is anchored. Optional cloud review runs only when you tap it. The consensus receipt on this page is simulated.

Drop any file to hash it

The document stays on the device until you send or share it. Only the SHA-384 seal (96 hex characters) is anchored. Optional cloud review runs only when you tap it.

Click or drag & drop · up to 512 MB

Hedera Consensus Service · simulated

Draft

Your HCS transaction proof will appear here.

Architecture

Three calls, one contract: hybrid signatures, agents, and HCS.

Specified in packages/shared/openapi.yaml and implemented by the Python SDK. The portal preview uses the same payload shape.

Quantum-resistant hybrid signatures

documents.sign accepts pqcMode. With that flag, or a key that sets requirePqcSignatures, the OpenAPI contract returns a classical Ed25519 or ECDSA P-256 signature plus an ML-DSA-65 (Dilithium) signature. Hedera stores a SHA-384 (96 hex characters) hybrid anchor of the two signatures so the topic message stays within the 1024-byte HCS limit. The Python SDK sends the flag; it does not bundle a lattice library.

Autonomous agent signing

Agents authenticate with scoped read, write, and sign keys and call upload, sign, and verify. The SHA-384 seal (96 hex characters) is computed in the agent runtime. The document stays on the device until you send or share it. Only that seal is anchored. Optional cloud review runs only when you tap it. Each signing request is appended to the audit log.

Hedera HCS audit trails

The SHA-384 seal (96 hex characters), or the SHA-384 hybrid anchor when post-quantum mode is on, is submitted to Hedera Consensus Service. The example topic on this page is 0.0.9001. Consensus finality is a few seconds. verify returns the transaction id and timestamp anyone can recompute.