-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdemo.js
More file actions
131 lines (106 loc) · 3.6 KB
/
demo.js
File metadata and controls
131 lines (106 loc) · 3.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
const fs = require("fs");
const path = require("path");
const crypto = require("crypto");
const FIXTURE_DIR = path.join(__dirname, "..", "demo", "fixtures");
const RUNTIME_DIR = path.join(__dirname, "..", "demo", "runtime");
const SOURCE_FILE = path.join(FIXTURE_DIR, "SOC2_Audit_Report.pdf");
const WORKING_FILE = path.join(RUNTIME_DIR, "SOC2_Audit_Report.pdf");
function sleep(ms) {
return new Promise((resolve) => setTimeout(resolve, ms));
}
function ensureDir(dir) {
fs.mkdirSync(dir, { recursive: true });
}
function resetRuntime() {
ensureDir(RUNTIME_DIR);
if (fs.existsSync(WORKING_FILE)) {
fs.unlinkSync(WORKING_FILE);
}
fs.copyFileSync(SOURCE_FILE, WORKING_FILE);
}
function hashFile(filePath) {
const data = fs.readFileSync(filePath);
return crypto.createHash("sha256").update(data).digest("hex");
}
function createReceipt(originalHash) {
return {
receiptId: "TS-DEMO-0001",
timestamp: "2026-03-11T15:00:00Z",
alg: "SHA-256",
hash: originalHash,
issuer: "trustsignal-demo",
};
}
function tamperFile(filePath) {
const tamperNote = "\nTAMPERED: modified after receipt issuance\n";
fs.appendFileSync(filePath, tamperNote, "utf8");
}
function printSection(title) {
console.log(`\n${title}`);
console.log("-".repeat(title.length));
}
async function main() {
try {
resetRuntime();
console.clear();
printSection("TrustSignal Evidence Integrity Demo");
await sleep(1500);
console.log("\nArtifact entering compliance system");
console.log("File: SOC2_Audit_Report.pdf");
await sleep(1800);
console.log("\nGenerating fingerprint...");
const originalHash = hashFile(WORKING_FILE);
await sleep(1800);
console.log(`SHA256: ${originalHash.slice(0, 24)}...`);
await sleep(1800);
console.log("\nIssuing signed receipt...");
const receipt = createReceipt(originalHash);
await sleep(1800);
console.log(`Receipt ID: ${receipt.receiptId}`);
console.log(`Timestamp: ${receipt.timestamp}`);
console.log("Receipt stored and linked to artifact");
await sleep(2200);
printSection("Verification Check");
console.log("Recorded hash matches current file hash");
console.log("\n✓ VERIFIED");
console.log("Document integrity intact");
await sleep(3000);
printSection("Tamper Simulation");
console.log("Modifying artifact after submission...");
tamperFile(WORKING_FILE);
await sleep(2200);
console.log("Re-running verification...");
const tamperedHash = hashFile(WORKING_FILE);
await sleep(1800);
console.log(`\nExpected hash: ${receipt.hash.slice(0, 24)}...`);
console.log(`Current hash: ${tamperedHash.slice(0, 24)}...`);
const integrityOk = receipt.hash === tamperedHash;
await sleep(1800);
if (!integrityOk) {
console.log("\n✗ VERIFICATION FAILED");
console.log("Integrity violation detected");
console.log("Artifact differs from original verified record");
} else {
console.log("\n✓ VERIFIED");
console.log("No integrity drift detected");
}
await sleep(1800);
printSection("Auditor Result");
console.log("Artifact: SOC2_Audit_Report.pdf");
console.log(`Integrity: ${integrityOk ? "VERIFIED" : "FAILED"}`);
console.log("Receipt: VALID");
console.log(
`Conclusion: ${
integrityOk
? "Artifact matches the receipted record"
: "Artifact modified after submission"
}`
);
console.log("\nDemo complete.\n");
} catch (error) {
console.error("\nDemo failed:");
console.error(error instanceof Error ? error.message : error);
process.exit(1);
}
}
main();