{
  "bundle_version": "1.0",
  "generated_at": "2026-10-09T20:06:00Z",
  "generator": "Ledger Core evidence export",
  "record": {
    "payload_hash": "77e0d6ef8c262ec05e92a0cb7a71fd2e45a01b25c5d4a401972bcd3930278578b233e722e4177f329ab77cdce4b82e6e7511525e97d84dfc799628f6573d6cdd",
    "hash_alg": "sha3-512",
    "signer_id": "did:ledger:d1b1e5440ee8044a3a3b55f39bedd9d6",
    "delegation_id": null,
    "timestamp": "2026-10-09T20:06:00Z",
    "suite_id": "ed25519+sha3-512:v1",
    "record_id": "29ac8ab5a07c046b5092ba4a6f00e7e82d44c02cea36915db568419d661b7f1f7ec64c77da4ed503c3e3785d339a3430285be111556adf2ade137d6b178de123",
    "signature": {
      "suite_id": "ed25519+sha3-512:v1",
      "suite_version": 1,
      "public_key": "vPjDVXeuAh+FUVIvvlsbZLGhWKAwBbLxdKiOV4EeiPA=",
      "signature": "UH/IOrrbBbm4swjEHuRljxrWZXseU882CJi1j+UKyhHacTdDjZOPNhRyzUkOsyCcGZFzOAuJR083+tEKdUsDDQ==",
      "signed_at": "2026-10-09T20:06:00Z"
    }
  },
  "signer_identity": {
    "id": "did:ledger:d1b1e5440ee8044a3a3b55f39bedd9d6",
    "type": "organization",
    "name": "Azienda Demo S.r.l.",
    "public_key": "vPjDVXeuAh+FUVIvvlsbZLGhWKAwBbLxdKiOV4EeiPA=",
    "fingerprint": "d1b1e5440ee8044a3a3b55f39bedd9d611e1aa6624c9c5826e7e803ed950aea33582169dd067e2d4412aca10845ed84f07c8ffb73e3eadad344aa126fea71b5d",
    "suite_id": "ed25519+sha3-512:v1",
    "created_at": "2026-10-09T20:06:00Z",
    "parent_id": null
  },
  "delegation": null,
  "payload": {
    "present": true,
    "content": {
      "declaration": "Il firmatario dichiara l'esistenza e l'integrità del documento identificato dalle impronte alla data dell'ancoraggio.",
      "document": {
        "filename": "Contratto di fornitura — esempio.pdf",
        "media_type": "application/pdf",
        "sha256": "ed22585fb0acff50056b585eb562e455cc027f77fc9ecfa0822bf251a5151f82",
        "sha3_512": "e4a180e0b9f96b18bbfce008f14a05d3e253d4bac6af12ef12b5b74b9aaec3b90f5027b0451ea481671e7f29c35a703718d9a94e258ddb6a348ba4814db81434",
        "size_bytes": 989
      },
      "holder_identity": "did:ledger:d1b1e5440ee8044a3a3b55f39bedd9d6",
      "kind": "ledger-public-certification",
      "title": "Contratto di fornitura — esempio",
      "version": "1.0"
    },
    "note": "contenuto off-chain incluso nel fascicolo"
  },
  "block": {
    "height": 0,
    "block_hash": "78b025c129816159a60e7f923fbd1754293a1bf8590bc5afe7c83f4e7349b8a570f081b5462d21d29bdcefdfeac6e379dc8e065c1719c3f69e0a48fdde37d250",
    "prev_hash": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
    "merkle_root": "29ac8ab5a07c046b5092ba4a6f00e7e82d44c02cea36915db568419d661b7f1f7ec64c77da4ed503c3e3785d339a3430285be111556adf2ade137d6b178de123",
    "timestamp": "2026-10-09T20:06:00Z",
    "validator": "FVqVm6cVVyKHUxS4u1r0E7PDO67fId4vgl5ebhobe5k=",
    "suite_id": "ed25519+sha3-512:v1",
    "record_ids": [
      "29ac8ab5a07c046b5092ba4a6f00e7e82d44c02cea36915db568419d661b7f1f7ec64c77da4ed503c3e3785d339a3430285be111556adf2ade137d6b178de123"
    ],
    "signature": {
      "suite_id": "ed25519+sha3-512:v1",
      "suite_version": 1,
      "public_key": "FVqVm6cVVyKHUxS4u1r0E7PDO67fId4vgl5ebhobe5k=",
      "signature": "btKaplLEBM3HBX2en9se9Ve0QO8rIuZt5Wn+AAO5i8d47KgIeUK10DYdTCEOOjWlSAhV1KtKQ7tHDU/nvBK9DQ==",
      "signed_at": "2026-10-09T20:06:00Z"
    },
    "commit_cert": null,
    "timestamp_token": null,
    "seal": null,
    "timestamp_source": "interno"
  },
  "merkle_proof": [],
  "bft_validators": null,
  "bft_chain_id": null,
  "verification": {
    "instructions": [
      "1. Ricalcolare payload_hash: canonicalizzare il contenuto in payload.content secondo JCS (RFC 8785) e calcolare sha3-512 in esadecimale; il risultato deve coincidere con record.payload_hash. Per i record in modalita commitment questo passo non si applica: la piattaforma conserva solo l'hash con chiave dichiarato in record.payload_hash e il contenuto resta al cliente.",
      "2. Ricalcolare record_id: canonicalizzare secondo JCS il record senza i campi record_id, signature e countersignature e calcolare sha3-512 in esadecimale; il risultato deve coincidere con record.record_id.",
      "3. Verificare la firma Ed25519 del firmatario: record.signature e' calcolata sullo sha3-512 dei byte canonici del record (passo 2) e si verifica con la chiave pubblica in signer_identity.public_key. Se presente, verificare allo stesso modo record.countersignature (controfirma della piattaforma sui medesimi byte canonici).",
      "4. Verificare l'inclusione Merkle: partire da record_id come foglia e applicare in ordine gli step di merkle_proof (sha3-512 della concatenazione dei due hash, nell'ordine indicato da position); il risultato finale deve coincidere con block.merkle_root.",
      "5. Ricalcolare block_hash: canonicalizzare secondo JCS il blocco con i soli campi height, prev_hash, merkle_root, timestamp, record_ids, validator e suite_id (escludendo block_hash e i metadati signature, commit_cert, timestamp_token e seal) e calcolare sha3-512 in esadecimale; il risultato deve coincidere con block.block_hash.",
      "6. Se presente block.commit_cert, verificare il certificato di commit BFT: ricostruire i sign-bytes CanonicalVote (CometBFT/Tendermint 0.34) di ciascun precommit, verificare le firme Ed25519 con le chiavi pubbliche in bft_validators e controllare che i firmatari distinti validi raggiungano il quorum >= 2f+1 (quorum = n - (n-1)//3 sul set dei validatori), che cert.height coincida con block.height e che, se presente, cert.app_block_hash coincida con block.block_hash.",
      "7. Se presente block.timestamp_token, verificare la marca temporale RFC 3161: decodificare token_b64 in base64, estrarre il TSTInfo e controllare che il messageImprint sia lo sha256 dei byte dell'hash del blocco (bytes.fromhex(block.block_hash)). La verifica completa della catena CMS del token si esegue con openssl ts -verify, con il certificato della TSA."
    ],
    "notes": [
      "Cosa prova questo fascicolo: l'integrita' del payload e del record (gli hash ricalcolati coincidono con quelli ancorati), l'anteriorita' dell'ancoraggio rispetto al timestamp del blocco e, se presente, alla marca temporale RFC 3161 sul block_hash, e l'attribuzione al firmatario (firma Ed25519 verificabile con la chiave pubblica inclusa nel fascicolo).",
      "Cosa NON prova questo fascicolo: la veridicita' del contenuto dichiarato nel payload. La piattaforma ancora hash e firme di quanto dichiarato dal firmatario, senza certificare che il contenuto corrisponda al vero.",
      "La marca temporale eventualmente inclusa e' un token RFC 3161 emesso dal provider configurato: e' una marca qualificata solo se tale provider e' un QTSP iscritto nella EU Trusted List per il servizio di marca temporale qualificata. Il fascicolo riporta il token e la sua fonte (block.timestamp_source), senza presumere la qualifica del provider.",
      "La riverifica e' possibile senza la piattaforma, usando solo questo file e le istruzioni nella sezione verification."
    ]
  }
}