@longarc/mdash 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/README.md +278 -0
  2. package/dist/checkpoint/engine.d.ts +208 -0
  3. package/dist/checkpoint/engine.d.ts.map +1 -0
  4. package/dist/checkpoint/engine.js +369 -0
  5. package/dist/checkpoint/engine.js.map +1 -0
  6. package/dist/context/engine.d.ts +197 -0
  7. package/dist/context/engine.d.ts.map +1 -0
  8. package/dist/context/engine.js +392 -0
  9. package/dist/context/engine.js.map +1 -0
  10. package/dist/core/commitment.d.ts +154 -0
  11. package/dist/core/commitment.d.ts.map +1 -0
  12. package/dist/core/commitment.js +305 -0
  13. package/dist/core/commitment.js.map +1 -0
  14. package/dist/core/crypto.d.ts +100 -0
  15. package/dist/core/crypto.d.ts.map +1 -0
  16. package/dist/core/crypto.js +243 -0
  17. package/dist/core/crypto.js.map +1 -0
  18. package/dist/index.d.ts +121 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +234 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/mcca/engine.d.ts +260 -0
  23. package/dist/mcca/engine.d.ts.map +1 -0
  24. package/dist/mcca/engine.js +518 -0
  25. package/dist/mcca/engine.js.map +1 -0
  26. package/dist/physics/engine.d.ts +165 -0
  27. package/dist/physics/engine.d.ts.map +1 -0
  28. package/dist/physics/engine.js +371 -0
  29. package/dist/physics/engine.js.map +1 -0
  30. package/dist/tee/engine.d.ts +285 -0
  31. package/dist/tee/engine.d.ts.map +1 -0
  32. package/dist/tee/engine.js +505 -0
  33. package/dist/tee/engine.js.map +1 -0
  34. package/dist/warrant/engine.d.ts +195 -0
  35. package/dist/warrant/engine.d.ts.map +1 -0
  36. package/dist/warrant/engine.js +409 -0
  37. package/dist/warrant/engine.js.map +1 -0
  38. package/dist/zk/engine.d.ts +243 -0
  39. package/dist/zk/engine.d.ts.map +1 -0
  40. package/dist/zk/engine.js +489 -0
  41. package/dist/zk/engine.js.map +1 -0
  42. package/package.json +25 -0
  43. package/src/__tests__/phase1.test.ts +1120 -0
  44. package/src/__tests__/phase2-4.test.ts +898 -0
  45. package/src/checkpoint/engine.ts +532 -0
  46. package/src/context/engine.ts +598 -0
  47. package/src/core/commitment.ts +438 -0
  48. package/src/core/crypto.ts +304 -0
  49. package/src/index.ts +320 -0
  50. package/src/mcca/engine.ts +778 -0
  51. package/src/physics/engine.ts +563 -0
  52. package/src/tee/engine.ts +810 -0
  53. package/src/warrant/engine.ts +625 -0
  54. package/src/zk/engine.ts +730 -0
  55. package/tsconfig.json +21 -0
@@ -0,0 +1,505 @@
1
+ /**
2
+ * mdash v3.0 - L2 TEE Attestation Layer
3
+ *
4
+ * Hardware-rooted attestation for real-time compliance.
5
+ * Handles 99% of attestation needs with <10ms latency.
6
+ *
7
+ * Supported TEE Platforms:
8
+ * - AWS Nitro Enclaves (primary)
9
+ * - Intel SGX (secondary)
10
+ * - Simulated mode (development/testing)
11
+ *
12
+ * Architecture:
13
+ * - L1 provides instant commitment (<1ms)
14
+ * - L2 adds hardware attestation (<10ms)
15
+ * - L3 provides ZK proofs for disputes (async)
16
+ *
17
+ * @version 3.0.0
18
+ */
19
+ import { generateTimestamp, sha256, sha256Object, hmacSeal, deriveKey, } from '../core/crypto.js';
20
+ export const PLATFORM_CAPABILITIES = {
21
+ nitro: {
22
+ memoryEncryption: true,
23
+ remoteAttestation: true,
24
+ keySealing: true,
25
+ pcrSupport: true,
26
+ quoteGeneration: false,
27
+ maxEnclaveSize: 8192, // 8GB
28
+ },
29
+ sgx: {
30
+ memoryEncryption: true,
31
+ remoteAttestation: true,
32
+ keySealing: true,
33
+ pcrSupport: false,
34
+ quoteGeneration: true,
35
+ maxEnclaveSize: 256, // 256MB EPC
36
+ },
37
+ simulated: {
38
+ memoryEncryption: false,
39
+ remoteAttestation: true, // Simulated
40
+ keySealing: true, // HMAC-based
41
+ pcrSupport: true, // Simulated
42
+ quoteGeneration: true, // Simulated
43
+ maxEnclaveSize: Infinity,
44
+ },
45
+ };
46
+ const DEFAULT_CONFIG = {
47
+ platform: 'simulated',
48
+ attestationTTL: 60 * 1000, // 1 minute
49
+ enableCache: true,
50
+ cacheTTL: 30 * 1000, // 30 seconds
51
+ rateLimit: 1000, // 1000/sec
52
+ nitro: {
53
+ pcrs: [0, 1, 2, 4, 8],
54
+ nsmDevice: '/dev/nsm',
55
+ },
56
+ };
57
+ class AttestationCache {
58
+ cache = new Map();
59
+ ttl;
60
+ constructor(ttlMs) {
61
+ this.ttl = ttlMs;
62
+ }
63
+ set(key, document) {
64
+ this.cache.set(key, {
65
+ document,
66
+ cachedAt: Date.now(),
67
+ });
68
+ }
69
+ get(key) {
70
+ const entry = this.cache.get(key);
71
+ if (!entry)
72
+ return null;
73
+ if (Date.now() - entry.cachedAt > this.ttl) {
74
+ this.cache.delete(key);
75
+ return null;
76
+ }
77
+ return entry.document;
78
+ }
79
+ invalidate(key) {
80
+ this.cache.delete(key);
81
+ }
82
+ clear() {
83
+ this.cache.clear();
84
+ }
85
+ getStats() {
86
+ return {
87
+ size: this.cache.size,
88
+ hitRate: 0, // Would track in production
89
+ };
90
+ }
91
+ }
92
+ // ============================================================================
93
+ // TEE ATTESTATION ENGINE
94
+ // ============================================================================
95
+ export class TEEAttestationEngine {
96
+ key = null;
97
+ config;
98
+ commitmentEngine;
99
+ cache;
100
+ documents = new Map();
101
+ // Rate limiting
102
+ requestCount = 0;
103
+ requestWindowStart = Date.now();
104
+ // Metrics
105
+ metrics = {
106
+ attestations: 0,
107
+ cacheHits: 0,
108
+ cacheMisses: 0,
109
+ failures: 0,
110
+ totalLatencyMs: 0,
111
+ };
112
+ constructor(commitmentEngine, config = {}) {
113
+ this.commitmentEngine = commitmentEngine;
114
+ this.config = { ...DEFAULT_CONFIG, ...config };
115
+ this.cache = new AttestationCache(this.config.cacheTTL);
116
+ }
117
+ /**
118
+ * Initialize the TEE engine
119
+ */
120
+ async initialize(sealKey) {
121
+ this.key = await deriveKey(sealKey);
122
+ // Platform-specific initialization
123
+ if (this.config.platform === 'nitro') {
124
+ await this.initializeNitro();
125
+ }
126
+ else if (this.config.platform === 'sgx') {
127
+ await this.initializeSGX();
128
+ }
129
+ }
130
+ /**
131
+ * Initialize AWS Nitro Enclaves
132
+ */
133
+ async initializeNitro() {
134
+ // In production, this would:
135
+ // 1. Open /dev/nsm device
136
+ // 2. Verify enclave environment
137
+ // 3. Generate enclave key pair
138
+ console.log('[TEE] Nitro Enclaves initialized (simulated)');
139
+ }
140
+ /**
141
+ * Initialize Intel SGX
142
+ */
143
+ async initializeSGX() {
144
+ // In production, this would:
145
+ // 1. Initialize SGX SDK
146
+ // 2. Load enclave
147
+ // 3. Establish IAS connection
148
+ console.log('[TEE] Intel SGX initialized (simulated)');
149
+ }
150
+ /**
151
+ * Attest data with hardware TEE
152
+ * Target: <10ms latency
153
+ *
154
+ * @param data - Data to attest
155
+ * @param commitmentId - L1 commitment reference
156
+ * @returns Attestation document
157
+ */
158
+ async attest(data, commitmentId) {
159
+ if (!this.key) {
160
+ throw new Error('TEE engine not initialized');
161
+ }
162
+ const startTime = performance.now();
163
+ // Rate limiting
164
+ this.checkRateLimit();
165
+ // Generate cache key
166
+ const dataHash = await sha256Object(data);
167
+ const cacheKey = `${dataHash}:${commitmentId}`;
168
+ // Check cache
169
+ if (this.config.enableCache) {
170
+ const cached = this.cache.get(cacheKey);
171
+ if (cached && cached.status === 'verified') {
172
+ this.metrics.cacheHits++;
173
+ return cached;
174
+ }
175
+ this.metrics.cacheMisses++;
176
+ }
177
+ // Generate attestation based on platform
178
+ let platformAttestation;
179
+ let measurement;
180
+ switch (this.config.platform) {
181
+ case 'nitro':
182
+ const nitroResult = await this.attestNitro(data, dataHash);
183
+ platformAttestation = nitroResult.document;
184
+ measurement = nitroResult.measurement;
185
+ break;
186
+ case 'sgx':
187
+ const sgxResult = await this.attestSGX(data, dataHash);
188
+ platformAttestation = sgxResult.quote;
189
+ measurement = sgxResult.measurement;
190
+ break;
191
+ case 'simulated':
192
+ default:
193
+ const simResult = await this.attestSimulated(data, dataHash);
194
+ platformAttestation = simResult.attestation;
195
+ measurement = simResult.measurement;
196
+ }
197
+ const now = generateTimestamp();
198
+ const expiresAt = new Date(Date.now() + this.config.attestationTTL).toISOString();
199
+ // Create attestation document
200
+ const docData = {
201
+ id: `att-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,
202
+ platform: this.config.platform,
203
+ timestamp: now,
204
+ measurement,
205
+ attested_data: dataHash,
206
+ platform_attestation: platformAttestation,
207
+ commitment_id: commitmentId,
208
+ status: 'verified',
209
+ expires_at: expiresAt,
210
+ };
211
+ // Seal the document
212
+ const seal = await hmacSeal(docData, this.key);
213
+ const document = {
214
+ ...docData,
215
+ seal,
216
+ };
217
+ // Store and cache
218
+ this.documents.set(document.id, document);
219
+ if (this.config.enableCache) {
220
+ this.cache.set(cacheKey, document);
221
+ }
222
+ // Commit to L1
223
+ await this.commitmentEngine.commit(document, `tee:${document.id}`);
224
+ // Track metrics
225
+ const elapsed = performance.now() - startTime;
226
+ this.metrics.attestations++;
227
+ this.metrics.totalLatencyMs += elapsed;
228
+ if (elapsed > 10) {
229
+ console.warn(`[TEE] Attestation exceeded 10ms target: ${elapsed.toFixed(2)}ms`);
230
+ }
231
+ return document;
232
+ }
233
+ /**
234
+ * AWS Nitro Enclaves attestation
235
+ */
236
+ async attestNitro(data, dataHash) {
237
+ // In production, this would call /dev/nsm to get attestation document
238
+ // Simulating the NSM response structure
239
+ const nonce = crypto.randomUUID();
240
+ // Generate PCR values (simulated)
241
+ const pcrs = {};
242
+ for (const pcr of this.config.nitro?.pcrs || [0, 1, 2]) {
243
+ pcrs[pcr] = await sha256(`pcr-${pcr}-${dataHash}`);
244
+ }
245
+ // Module ID is the enclave image measurement
246
+ const moduleId = await sha256(`nitro-enclave-image-v3.0.0`);
247
+ const document = {
248
+ module_id: moduleId,
249
+ timestamp: Date.now(),
250
+ digest: 'SHA384',
251
+ pcrs,
252
+ certificate: 'simulated-nitro-certificate',
253
+ cabundle: ['simulated-ca-root'],
254
+ user_data: Buffer.from(dataHash).toString('base64').slice(0, 512),
255
+ nonce,
256
+ };
257
+ return {
258
+ document,
259
+ measurement: moduleId,
260
+ };
261
+ }
262
+ /**
263
+ * Intel SGX attestation
264
+ */
265
+ async attestSGX(data, dataHash) {
266
+ // In production, this would:
267
+ // 1. Call sgx_create_report
268
+ // 2. Send to QE (Quoting Enclave)
269
+ // 3. Get signed quote
270
+ // 4. Optionally verify with IAS
271
+ const mrEnclave = await sha256(`sgx-enclave-v3.0.0`);
272
+ const mrSigner = await sha256(`long-arc-studios-signing-key`);
273
+ const quote = {
274
+ signature: await sha256(`sgx-quote-sig-${dataHash}-${Date.now()}`),
275
+ report_body: {
276
+ mr_enclave: mrEnclave,
277
+ mr_signer: mrSigner,
278
+ isv_prod_id: 1,
279
+ isv_svn: 1,
280
+ report_data: dataHash,
281
+ attributes: '0x0000000000000007', // Debug=0, Mode64=1, Init=1, Prov=1
282
+ },
283
+ qe_certification: {
284
+ type: 5, // PPID_RSA3072_ENCRYPTED
285
+ data: 'simulated-qe-cert-data',
286
+ },
287
+ };
288
+ return {
289
+ quote,
290
+ measurement: mrEnclave,
291
+ };
292
+ }
293
+ /**
294
+ * Simulated attestation (development/testing)
295
+ */
296
+ async attestSimulated(data, dataHash) {
297
+ const measurement = await sha256(`simulated-enclave-v3.0.0`);
298
+ const nonce = crypto.randomUUID();
299
+ // Generate simulated PCRs
300
+ const pcrs = {};
301
+ for (let i = 0; i < 16; i++) {
302
+ pcrs[i] = await sha256(`sim-pcr-${i}-${dataHash}`);
303
+ }
304
+ const attestation = {
305
+ type: 'simulated',
306
+ measurement_hash: measurement,
307
+ nonce,
308
+ simulated_pcrs: pcrs,
309
+ signature: await sha256(`sim-sig-${dataHash}-${nonce}`),
310
+ };
311
+ return {
312
+ attestation,
313
+ measurement: measurement,
314
+ };
315
+ }
316
+ /**
317
+ * Verify an attestation document
318
+ */
319
+ async verify(document) {
320
+ if (!this.key) {
321
+ throw new Error('TEE engine not initialized');
322
+ }
323
+ const errors = [];
324
+ // 1. Check expiry
325
+ if (new Date(document.expires_at) < new Date()) {
326
+ errors.push('Attestation document expired');
327
+ }
328
+ // 2. Verify seal
329
+ const docWithoutSeal = { ...document };
330
+ delete docWithoutSeal.seal;
331
+ const expectedSeal = await hmacSeal(docWithoutSeal, this.key);
332
+ if (expectedSeal !== document.seal) {
333
+ errors.push('Invalid document seal');
334
+ }
335
+ // 3. Verify L1 commitment exists
336
+ const commitment = this.commitmentEngine.getCommitment(`tee:${document.id}`);
337
+ if (!commitment) {
338
+ errors.push('L1 commitment not found');
339
+ }
340
+ // 4. Platform-specific verification
341
+ switch (document.platform) {
342
+ case 'nitro':
343
+ // Would verify certificate chain with AWS root
344
+ break;
345
+ case 'sgx':
346
+ // Would verify quote with IAS or DCAP
347
+ break;
348
+ case 'simulated':
349
+ // Just verify signature format
350
+ break;
351
+ }
352
+ return {
353
+ valid: errors.length === 0,
354
+ errors,
355
+ };
356
+ }
357
+ /**
358
+ * Get attestation document by ID
359
+ */
360
+ get(id) {
361
+ return this.documents.get(id) || null;
362
+ }
363
+ /**
364
+ * Rate limiting check
365
+ */
366
+ checkRateLimit() {
367
+ const now = Date.now();
368
+ // Reset window every second
369
+ if (now - this.requestWindowStart > 1000) {
370
+ this.requestCount = 0;
371
+ this.requestWindowStart = now;
372
+ }
373
+ this.requestCount++;
374
+ if (this.requestCount > this.config.rateLimit) {
375
+ throw new Error('TEE attestation rate limit exceeded');
376
+ }
377
+ }
378
+ /**
379
+ * Get platform capabilities
380
+ */
381
+ getCapabilities() {
382
+ return PLATFORM_CAPABILITIES[this.config.platform];
383
+ }
384
+ /**
385
+ * Get engine statistics
386
+ */
387
+ getStats() {
388
+ return {
389
+ platform: this.config.platform,
390
+ attestations: this.metrics.attestations,
391
+ cacheHits: this.metrics.cacheHits,
392
+ cacheMisses: this.metrics.cacheMisses,
393
+ failures: this.metrics.failures,
394
+ avgLatencyMs: this.metrics.attestations > 0
395
+ ? this.metrics.totalLatencyMs / this.metrics.attestations
396
+ : 0,
397
+ cacheStats: this.cache.getStats(),
398
+ };
399
+ }
400
+ }
401
+ // ============================================================================
402
+ // TEE VERIFIER (Remote Attestation Verification)
403
+ // ============================================================================
404
+ /**
405
+ * Verifies attestation documents from external sources
406
+ * Used for cross-enclave or remote attestation scenarios
407
+ */
408
+ export class TEEVerifier {
409
+ trustedMeasurements = new Set();
410
+ trustedSigners = new Set();
411
+ /**
412
+ * Add a trusted enclave measurement
413
+ */
414
+ trustMeasurement(measurement) {
415
+ this.trustedMeasurements.add(measurement);
416
+ }
417
+ /**
418
+ * Add a trusted signer (for SGX)
419
+ */
420
+ trustSigner(signer) {
421
+ this.trustedSigners.add(signer);
422
+ }
423
+ /**
424
+ * Verify remote attestation
425
+ */
426
+ async verifyRemote(document) {
427
+ const reasons = [];
428
+ // Check measurement is trusted
429
+ if (!this.trustedMeasurements.has(document.measurement)) {
430
+ reasons.push(`Unknown enclave measurement: ${document.measurement}`);
431
+ }
432
+ // Platform-specific checks
433
+ if (document.platform === 'sgx') {
434
+ const quote = document.platform_attestation;
435
+ if (!this.trustedSigners.has(quote.report_body.mr_signer)) {
436
+ reasons.push(`Unknown signer: ${quote.report_body.mr_signer}`);
437
+ }
438
+ }
439
+ // Check expiry
440
+ if (new Date(document.expires_at) < new Date()) {
441
+ reasons.push('Document expired');
442
+ }
443
+ return {
444
+ trusted: reasons.length === 0,
445
+ reasons,
446
+ };
447
+ }
448
+ }
449
+ // ============================================================================
450
+ // ATTESTATION BRIDGE (L1 <-> L2)
451
+ // ============================================================================
452
+ /**
453
+ * Bridges L1 commitments with L2 attestations
454
+ * Ensures cryptographic continuity between layers
455
+ */
456
+ export class AttestationBridge {
457
+ teeEngine;
458
+ commitmentEngine;
459
+ constructor(teeEngine, commitmentEngine) {
460
+ this.teeEngine = teeEngine;
461
+ this.commitmentEngine = commitmentEngine;
462
+ }
463
+ /**
464
+ * Commit and attest in one operation
465
+ * Returns both L1 seal and L2 attestation
466
+ */
467
+ async commitAndAttest(data, operationId) {
468
+ // L1: Commit first (<1ms)
469
+ const commitment = await this.commitmentEngine.commit(data, operationId);
470
+ // L2: Attest with reference to L1 (<10ms)
471
+ const attestation = await this.teeEngine.attest(data, operationId);
472
+ return {
473
+ commitment,
474
+ attestation,
475
+ };
476
+ }
477
+ /**
478
+ * Verify both layers
479
+ */
480
+ async verifyBoth(commitment, attestation) {
481
+ const errors = [];
482
+ // Verify L1
483
+ const l1Result = await this.commitmentEngine.verify(commitment);
484
+ if (!l1Result) {
485
+ errors.push('L1 commitment verification failed');
486
+ }
487
+ // Verify L2
488
+ const l2Result = await this.teeEngine.verify(attestation);
489
+ if (!l2Result.valid) {
490
+ errors.push(...l2Result.errors);
491
+ }
492
+ // Cross-layer verification
493
+ const crossLayerValid = attestation.commitment_id === commitment.operationId;
494
+ if (!crossLayerValid) {
495
+ errors.push('Cross-layer reference mismatch');
496
+ }
497
+ return {
498
+ l1Valid: l1Result,
499
+ l2Valid: l2Result.valid,
500
+ crossLayerValid,
501
+ errors,
502
+ };
503
+ }
504
+ }
505
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/tee/engine.ts"],"names":[],"mappings":"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"}