This folder holds the verifiable core of the audit: the evidence documents behind the numbers, and the script that recomputes their identifiers. Nothing here needs our tooling: plain Node, no dependencies.
evidence_id isEvery observation carries an identifier like ev_9ec17cfc…. It is not an
invented label: it is a cryptographic digest of the evidence itself.
evidence_id = "ev_" + sha256( canonicalJson( semanticProjection(evidence) ) )
| Parte | Qué es |
|---|---|
semanticProjection |
The identity-bearing subset of the document: subject (digest, format, architecture) · provider · analysis_profile · predicate_type · operation · parameters · raw_result · normalized_result · confidence · authority · environment · limitations · relationship_coverage · locations · evidence_links |
canonicalJson |
Deterministic JSON: keys sorted, undefined/symbols dropped, same escaping as JSON.stringify |
sha256 |
Standard SHA-256 over those bytes |
The same document always produces the same id, and a different document never collides with it.
# 1. get the evidence
git clone https://github.com/albrth647-png/electron-security-audit.git
cd electron-security-audit/evidence/raw
# 2. check the bytes of what is published (SHA-256 of every file)
sha256sum -c MANIFEST.raw.sha256
# 3. uncompress and recompute the ids (no dependencies, no install)
gunzip -k *.gz
cd ../.. && node evidence/verify-evidence.mjs evidence/raw/*.json
Expected output (verified on 2026-10-20):
COINCIDE evidencia-nativa.json
declarado: ev_9ec17cfca1a869df4352fd6e5db03285c014f0efc2024a30ec924c337c7a22f0
calculado: ev_9ec17cfca1a869df4352fd6e5db03285c014f0efc2024a30ec924c337c7a22f0
| Fichero | Qué es |
|---|---|
verify-evidence.mjs |
The recomputation script (plain Node, no dependencies). |
evidence-summary.json |
Index of the three analysis executions (runs, scope, result, evidence_id). |
evidence-run1-asar.json |
Compact extract of the asar analysis (run 1). Compact = node/edge arrays omitted for size. |
evidence-run2-main.json |
Compact extract of the main process analysis (run 2). |
evidence-native-ghidra.json |
The native analysis evidence (Ghidra, run 3) — published in full. |
raw/ |
The raw evidence documents (gzipped) for the runs whose document survived, plus MANIFEST.raw.sha256 (SHA-256 of every published file) and the SBOM of the audited package. |
package-drawio-32.4.1.json, run2-job-summary.json |
The analysed package manifest and the job summary of run 2. |
evidence_id |
Run | ¿Se puede recomputar? | Cómo |
|---|---|---|---|
ev_9ec17cfc… |
3 — native (Ghidra) | ✅ sí, desde el documento crudo | node evidence/verify-evidence.mjs evidence/raw/…nativa.json.gz |
ev_f0e4202c… |
2 — main process | ✅ sí, desde el documento crudo | ídem |
ev_a94efae8… |
1 — asar completo | ⚠️ el documento crudo no se conserva: aquel run terminó en error (límite de 300 s) y lo que hay en el artifact es el documento de error (137 MB) | re-ejecutando el pipeline público (rea-audit.yml, artefactos de los runs enlazados arriba) |
The compact extracts in this folder (evidence-run*.json) are summaries:
the node/edge arrays were omitted for size, so their evidence_id cannot be
recomputed from the extract itself — that is what raw/ and the public runs are
for. We would rather say that plainly than publish an identifier that nobody
can check.
The pipeline is public and free: rea-audit.yml
in albrth647-png/Ghidra. Given the same artifact and the same tool version, it
produces the same evidence_ids. The artifact itself is pinned by its SHA-256,
checked against the publisher’s own hash file
(Files-SHA256-Hashes.txt of the upstream release) — not against ours.
Verified 2026-10-20 with evidence/verify-evidence.mjs.