@longarc/mdash 3.1.2 → 3.1.3

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 (172) hide show
  1. package/README.md +86 -23
  2. package/SECURITY.md +254 -0
  3. package/dist/accountability/engine.d.ts +27 -0
  4. package/dist/accountability/engine.d.ts.map +1 -0
  5. package/dist/accountability/engine.js +148 -0
  6. package/dist/accountability/engine.js.map +1 -0
  7. package/dist/accountability/types.d.ts +46 -0
  8. package/dist/accountability/types.d.ts.map +1 -0
  9. package/dist/accountability/types.js +8 -0
  10. package/dist/accountability/types.js.map +1 -0
  11. package/dist/checkpoint/engine.d.ts.map +1 -1
  12. package/dist/checkpoint/engine.js +4 -0
  13. package/dist/checkpoint/engine.js.map +1 -1
  14. package/dist/context/compose.d.ts +62 -0
  15. package/dist/context/compose.d.ts.map +1 -0
  16. package/dist/context/compose.js +286 -0
  17. package/dist/context/compose.js.map +1 -0
  18. package/dist/context/crypto/hash.d.ts +100 -0
  19. package/dist/context/crypto/hash.d.ts.map +1 -0
  20. package/dist/context/crypto/hash.js +248 -0
  21. package/dist/context/crypto/hash.js.map +1 -0
  22. package/dist/context/crypto/hmac.d.ts +80 -0
  23. package/dist/context/crypto/hmac.d.ts.map +1 -0
  24. package/dist/context/crypto/hmac.js +192 -0
  25. package/dist/context/crypto/hmac.js.map +1 -0
  26. package/dist/context/crypto/index.d.ts +7 -0
  27. package/dist/context/crypto/index.d.ts.map +1 -0
  28. package/dist/context/crypto/index.js +7 -0
  29. package/dist/context/crypto/index.js.map +1 -0
  30. package/dist/context/engine-v3.0-backup.d.ts +197 -0
  31. package/dist/context/engine-v3.0-backup.d.ts.map +1 -0
  32. package/dist/context/engine-v3.0-backup.js +392 -0
  33. package/dist/context/engine-v3.0-backup.js.map +1 -0
  34. package/dist/context/fragment.d.ts +99 -0
  35. package/dist/context/fragment.d.ts.map +1 -0
  36. package/dist/context/fragment.js +316 -0
  37. package/dist/context/fragment.js.map +1 -0
  38. package/dist/context/index.d.ts +99 -0
  39. package/dist/context/index.d.ts.map +1 -0
  40. package/dist/context/index.js +180 -0
  41. package/dist/context/index.js.map +1 -0
  42. package/dist/context/provenance.d.ts +80 -0
  43. package/dist/context/provenance.d.ts.map +1 -0
  44. package/dist/context/provenance.js +294 -0
  45. package/dist/context/provenance.js.map +1 -0
  46. package/dist/context/resolve.d.ts +106 -0
  47. package/dist/context/resolve.d.ts.map +1 -0
  48. package/dist/context/resolve.js +440 -0
  49. package/dist/context/resolve.js.map +1 -0
  50. package/dist/context/store.d.ts +156 -0
  51. package/dist/context/store.d.ts.map +1 -0
  52. package/dist/context/store.js +396 -0
  53. package/dist/context/store.js.map +1 -0
  54. package/dist/context/types.d.ts +463 -0
  55. package/dist/context/types.d.ts.map +1 -0
  56. package/dist/context/types.js +94 -0
  57. package/dist/context/types.js.map +1 -0
  58. package/dist/context/utils/atomic.d.ts +76 -0
  59. package/dist/context/utils/atomic.d.ts.map +1 -0
  60. package/dist/context/utils/atomic.js +159 -0
  61. package/dist/context/utils/atomic.js.map +1 -0
  62. package/dist/context/utils/credit.d.ts +65 -0
  63. package/dist/context/utils/credit.d.ts.map +1 -0
  64. package/dist/context/utils/credit.js +164 -0
  65. package/dist/context/utils/credit.js.map +1 -0
  66. package/dist/context/utils/index.d.ts +13 -0
  67. package/dist/context/utils/index.d.ts.map +1 -0
  68. package/dist/context/utils/index.js +13 -0
  69. package/dist/context/utils/index.js.map +1 -0
  70. package/dist/context/utils/utility.d.ts +63 -0
  71. package/dist/context/utils/utility.d.ts.map +1 -0
  72. package/dist/context/utils/utility.js +141 -0
  73. package/dist/context/utils/utility.js.map +1 -0
  74. package/dist/core/commitment.d.ts +25 -2
  75. package/dist/core/commitment.d.ts.map +1 -1
  76. package/dist/core/commitment.js +44 -6
  77. package/dist/core/commitment.js.map +1 -1
  78. package/dist/core/crypto.d.ts +2 -0
  79. package/dist/core/crypto.d.ts.map +1 -1
  80. package/dist/core/crypto.js +12 -0
  81. package/dist/core/crypto.js.map +1 -1
  82. package/dist/index.d.ts +11 -6
  83. package/dist/index.d.ts.map +1 -1
  84. package/dist/index.js +35 -10
  85. package/dist/index.js.map +1 -1
  86. package/dist/mcca/engine.d.ts.map +1 -1
  87. package/dist/mcca/engine.js +5 -4
  88. package/dist/mcca/engine.js.map +1 -1
  89. package/dist/physics/engine.d.ts +1 -0
  90. package/dist/physics/engine.d.ts.map +1 -1
  91. package/dist/physics/engine.js +36 -2
  92. package/dist/physics/engine.js.map +1 -1
  93. package/dist/provenance/api-handler.d.ts +45 -0
  94. package/dist/provenance/api-handler.d.ts.map +1 -0
  95. package/dist/provenance/api-handler.js +223 -0
  96. package/dist/provenance/api-handler.js.map +1 -0
  97. package/dist/provenance/api-types.d.ts +108 -0
  98. package/dist/provenance/api-types.d.ts.map +1 -0
  99. package/dist/provenance/api-types.js +9 -0
  100. package/dist/provenance/api-types.js.map +1 -0
  101. package/dist/provenance/index.d.ts +6 -0
  102. package/dist/provenance/index.d.ts.map +1 -0
  103. package/dist/provenance/index.js +3 -0
  104. package/dist/provenance/index.js.map +1 -0
  105. package/dist/provenance/provenance-engine.d.ts +63 -0
  106. package/dist/provenance/provenance-engine.d.ts.map +1 -0
  107. package/dist/provenance/provenance-engine.js +311 -0
  108. package/dist/provenance/provenance-engine.js.map +1 -0
  109. package/dist/provenance/types.d.ts +193 -0
  110. package/dist/provenance/types.d.ts.map +1 -0
  111. package/dist/provenance/types.js +9 -0
  112. package/dist/provenance/types.js.map +1 -0
  113. package/dist/tee/engine.d.ts.map +1 -1
  114. package/dist/tee/engine.js +14 -0
  115. package/dist/tee/engine.js.map +1 -1
  116. package/dist/warrant/engine.d.ts +24 -1
  117. package/dist/warrant/engine.d.ts.map +1 -1
  118. package/dist/warrant/engine.js +76 -1
  119. package/dist/warrant/engine.js.map +1 -1
  120. package/dist/zk/engine.d.ts.map +1 -1
  121. package/dist/zk/engine.js +7 -4
  122. package/dist/zk/engine.js.map +1 -1
  123. package/docs/SECURITY-PATCHES.md +170 -0
  124. package/package.json +17 -5
  125. package/src/__tests__/accountability.test.ts +308 -0
  126. package/src/__tests__/l1-verification-modes.test.ts +424 -0
  127. package/src/__tests__/phase1.benchmark.test.ts +94 -0
  128. package/src/__tests__/phase1.test.ts +0 -77
  129. package/src/__tests__/phase2-4.benchmark.test.ts +60 -0
  130. package/src/__tests__/phase2-4.test.ts +1 -52
  131. package/src/__tests__/provenance/api-handler.test.ts +356 -0
  132. package/src/__tests__/provenance/provenance-engine.test.ts +628 -0
  133. package/src/__tests__/sa-2026-008.test.ts +45 -0
  134. package/src/__tests__/sa-2026-009.test.ts +86 -0
  135. package/src/__tests__/sa-2026-010.test.ts +72 -0
  136. package/src/__tests__/sa-2026-012.test.ts +65 -0
  137. package/src/__tests__/sa-2026-nfc.test.ts +40 -0
  138. package/src/__tests__/security.test.ts +786 -0
  139. package/src/accountability/engine.ts +230 -0
  140. package/src/accountability/types.ts +58 -0
  141. package/src/checkpoint/engine.ts +4 -0
  142. package/src/context/__tests__/caret-v0.2.0.test.ts +860 -0
  143. package/src/context/__tests__/integration.test.ts +356 -0
  144. package/src/context/compose.ts +388 -0
  145. package/src/context/crypto/hash.ts +277 -0
  146. package/src/context/crypto/hmac.ts +253 -0
  147. package/src/context/crypto/index.ts +29 -0
  148. package/src/context/engine-v3.0-backup.ts +598 -0
  149. package/src/context/fragment.ts +454 -0
  150. package/src/context/index.ts +427 -0
  151. package/src/context/provenance.ts +380 -0
  152. package/src/context/resolve.ts +581 -0
  153. package/src/context/store.ts +503 -0
  154. package/src/context/types.ts +679 -0
  155. package/src/context/utils/atomic.ts +207 -0
  156. package/src/context/utils/credit.ts +224 -0
  157. package/src/context/utils/index.ts +13 -0
  158. package/src/context/utils/utility.ts +200 -0
  159. package/src/core/commitment.ts +129 -67
  160. package/src/core/crypto.ts +13 -0
  161. package/src/index.ts +62 -10
  162. package/src/mcca/engine.ts +5 -4
  163. package/src/physics/engine.ts +40 -3
  164. package/src/provenance/api-handler.ts +248 -0
  165. package/src/provenance/api-types.ts +112 -0
  166. package/src/provenance/index.ts +19 -0
  167. package/src/provenance/provenance-engine.ts +387 -0
  168. package/src/provenance/types.ts +211 -0
  169. package/src/tee/engine.ts +16 -0
  170. package/src/warrant/engine.ts +89 -1
  171. package/src/zk/engine.ts +8 -4
  172. package/tsconfig.json +1 -1
@@ -0,0 +1,248 @@
1
+ /**
2
+ * Caret — Cryptographic Hash Utilities
3
+ * @module @longarcstudios/caret/crypto/hash
4
+ *
5
+ * SHA-256 implementation using Web Crypto API (browser + Node compatible).
6
+ * All hashing is deterministic — same input always produces same output.
7
+ */
8
+ // ============================================================================
9
+ // CONSTANTS
10
+ // ============================================================================
11
+ /** SHA-256 produces 256 bits = 64 hex characters */
12
+ const HASH_LENGTH = 64;
13
+ /** Algorithm identifier for Web Crypto */
14
+ const ALGORITHM = 'SHA-256';
15
+ // ============================================================================
16
+ // TEXT ENCODER
17
+ // ============================================================================
18
+ /**
19
+ * Get TextEncoder instance.
20
+ * Works in both browser and Node.js environments.
21
+ */
22
+ const getEncoder = () => {
23
+ if (typeof TextEncoder !== 'undefined') {
24
+ return new TextEncoder();
25
+ }
26
+ // Node.js fallback (though TextEncoder is available in Node 11+)
27
+ throw new Error('TextEncoder not available');
28
+ };
29
+ // ============================================================================
30
+ // CRYPTO IMPLEMENTATION
31
+ // ============================================================================
32
+ /**
33
+ * Get the crypto implementation for the current environment.
34
+ * Supports browser (window.crypto) and Node.js (crypto.subtle).
35
+ */
36
+ async function getCrypto() {
37
+ // Browser environment
38
+ if (typeof window !== 'undefined' && window.crypto?.subtle) {
39
+ return window.crypto.subtle;
40
+ }
41
+ // Node.js environment
42
+ if (typeof globalThis !== 'undefined' && globalThis.crypto?.subtle) {
43
+ return globalThis.crypto.subtle;
44
+ }
45
+ // Node.js < 19 fallback
46
+ try {
47
+ const crypto = await import('crypto');
48
+ if (crypto.webcrypto?.subtle) {
49
+ return crypto.webcrypto.subtle;
50
+ }
51
+ }
52
+ catch {
53
+ // Import failed
54
+ }
55
+ throw new Error('No crypto implementation available');
56
+ }
57
+ /**
58
+ * Convert ArrayBuffer to hexadecimal string.
59
+ */
60
+ function bufferToHex(buffer) {
61
+ const bytes = new Uint8Array(buffer);
62
+ let hex = '';
63
+ for (let i = 0; i < bytes.length; i++) {
64
+ const byte = bytes[i];
65
+ if (byte !== undefined) {
66
+ hex += byte.toString(16).padStart(2, '0');
67
+ }
68
+ }
69
+ return hex;
70
+ }
71
+ /**
72
+ * Convert hexadecimal string to ArrayBuffer.
73
+ */
74
+ export function hexToBuffer(hex) {
75
+ if (hex.length % 2 !== 0) {
76
+ throw new Error('Invalid hex string length');
77
+ }
78
+ const bytes = new Uint8Array(hex.length / 2);
79
+ for (let i = 0; i < hex.length; i += 2) {
80
+ bytes[i / 2] = parseInt(hex.slice(i, i + 2), 16);
81
+ }
82
+ return bytes.buffer;
83
+ }
84
+ // ============================================================================
85
+ // PUBLIC API
86
+ // ============================================================================
87
+ /**
88
+ * Compute SHA-256 hash of a string.
89
+ *
90
+ * @param input - The string to hash
91
+ * @returns Promise resolving to the hash as a branded Hash type
92
+ *
93
+ * @example
94
+ * ```ts
95
+ * const hash = await sha256('hello world');
96
+ * // => 'b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9'
97
+ * ```
98
+ */
99
+ export async function sha256(input) {
100
+ const crypto = await getCrypto();
101
+ const encoder = getEncoder();
102
+ const data = encoder.encode(input);
103
+ const hashBuffer = await crypto.digest(ALGORITHM, data);
104
+ return bufferToHex(hashBuffer);
105
+ }
106
+ /**
107
+ * Compute SHA-256 hash of binary data.
108
+ *
109
+ * @param data - The binary data to hash
110
+ * @returns Promise resolving to the hash
111
+ */
112
+ export async function sha256Binary(data) {
113
+ const crypto = await getCrypto();
114
+ const buffer = data instanceof Uint8Array ? new Uint8Array(data).buffer : data;
115
+ const hashBuffer = await crypto.digest(ALGORITHM, buffer);
116
+ return bufferToHex(hashBuffer);
117
+ }
118
+ /**
119
+ * Compute SHA-256 hash of a JSON-serializable object.
120
+ * Uses deterministic JSON serialization (sorted keys).
121
+ *
122
+ * @param obj - The object to hash
123
+ * @returns Promise resolving to the hash
124
+ *
125
+ * @example
126
+ * ```ts
127
+ * const hash = await sha256Object({ b: 2, a: 1 });
128
+ * // Same as sha256Object({ a: 1, b: 2 }) — deterministic
129
+ * ```
130
+ */
131
+ export async function sha256Object(obj) {
132
+ const json = deterministicStringify(obj);
133
+ return sha256(json);
134
+ }
135
+ /**
136
+ * Compute a rolling hash combining multiple hashes.
137
+ * Used for chain verification in provenance tracking.
138
+ *
139
+ * @param hashes - Array of hashes to combine
140
+ * @returns Promise resolving to the combined hash
141
+ */
142
+ export async function rollingHash(hashes) {
143
+ if (hashes.length === 0) {
144
+ // Hash of empty string for empty input
145
+ return sha256('');
146
+ }
147
+ if (hashes.length === 1) {
148
+ const first = hashes[0];
149
+ if (!first)
150
+ return sha256('');
151
+ return first;
152
+ }
153
+ // Concatenate all hashes and hash the result
154
+ const combined = hashes.join('');
155
+ return sha256(combined);
156
+ }
157
+ /**
158
+ * Verify that a hash matches expected content.
159
+ *
160
+ * @param content - The content to verify
161
+ * @param expectedHash - The expected hash
162
+ * @returns Promise resolving to boolean
163
+ */
164
+ export async function verifyHash(content, expectedHash) {
165
+ const actualHash = await sha256(content);
166
+ return constantTimeEqual(actualHash, expectedHash);
167
+ }
168
+ /**
169
+ * Verify that an object's hash matches expected.
170
+ *
171
+ * @param obj - The object to verify
172
+ * @param expectedHash - The expected hash
173
+ * @returns Promise resolving to boolean
174
+ */
175
+ export async function verifyObjectHash(obj, expectedHash) {
176
+ const actualHash = await sha256Object(obj);
177
+ return constantTimeEqual(actualHash, expectedHash);
178
+ }
179
+ // ============================================================================
180
+ // UTILITY FUNCTIONS
181
+ // ============================================================================
182
+ /**
183
+ * Deterministic JSON stringify with sorted keys.
184
+ * Ensures same object always produces same string.
185
+ */
186
+ export function deterministicStringify(obj) {
187
+ return JSON.stringify(obj, (_, value) => {
188
+ if (value && typeof value === 'object' && !Array.isArray(value)) {
189
+ // Sort object keys
190
+ const sorted = {};
191
+ const keys = Object.keys(value).sort();
192
+ for (const key of keys) {
193
+ sorted[key] = value[key];
194
+ }
195
+ return sorted;
196
+ }
197
+ return value;
198
+ });
199
+ }
200
+ /**
201
+ * Constant-time string comparison to prevent timing attacks.
202
+ *
203
+ * @param a - First string
204
+ * @param b - Second string
205
+ * @returns true if equal, false otherwise
206
+ */
207
+ export function constantTimeEqual(a, b) {
208
+ // Use the longer length to prevent early exit timing leak
209
+ const len = Math.max(a.length, b.length);
210
+ // Track both the XOR result and length mismatch
211
+ let result = a.length ^ b.length; // Will be non-zero if lengths differ
212
+ for (let i = 0; i < len; i++) {
213
+ // Use 0 for out-of-bounds access (safe because result already tracks length diff)
214
+ const charA = i < a.length ? a.charCodeAt(i) : 0;
215
+ const charB = i < b.length ? b.charCodeAt(i) : 0;
216
+ result |= charA ^ charB;
217
+ }
218
+ return result === 0;
219
+ }
220
+ /**
221
+ * Validate that a string is a valid SHA-256 hash.
222
+ *
223
+ * @param value - The value to validate
224
+ * @returns true if valid hash format
225
+ */
226
+ export function isValidHash(value) {
227
+ return typeof value === 'string' &&
228
+ value.length === HASH_LENGTH &&
229
+ /^[a-f0-9]+$/i.test(value);
230
+ }
231
+ /**
232
+ * Create a Hash type from a raw string (unsafe — no validation).
233
+ * Use only when you've already validated the input.
234
+ */
235
+ export function unsafeHash(value) {
236
+ return value;
237
+ }
238
+ /**
239
+ * Parse a string as a Hash, throwing if invalid.
240
+ */
241
+ export function parseHash(value) {
242
+ if (!isValidHash(value)) {
243
+ // SECURITY: Do not leak input value in error message
244
+ throw new Error('Invalid hash format');
245
+ }
246
+ return value;
247
+ }
248
+ //# sourceMappingURL=hash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash.js","sourceRoot":"","sources":["../../../src/context/crypto/hash.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,+EAA+E;AAC/E,YAAY;AACZ,+EAA+E;AAE/E,oDAAoD;AACpD,MAAM,WAAW,GAAG,EAAE,CAAC;AAEvB,0CAA0C;AAC1C,MAAM,SAAS,GAAG,SAAS,CAAC;AAE5B,+EAA+E;AAC/E,eAAe;AACf,+EAA+E;AAE/E;;;GAGG;AACH,MAAM,UAAU,GAAG,GAAgB,EAAE;IACnC,IAAI,OAAO,WAAW,KAAK,WAAW,EAAE,CAAC;QACvC,OAAO,IAAI,WAAW,EAAE,CAAC;IAC3B,CAAC;IACD,iEAAiE;IACjE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;AAC/C,CAAC,CAAC;AAEF,+EAA+E;AAC/E,wBAAwB;AACxB,+EAA+E;AAE/E;;;GAGG;AACH,KAAK,UAAU,SAAS;IACtB,sBAAsB;IACtB,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;QAC3D,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;IAC9B,CAAC;IAED,sBAAsB;IACtB,IAAI,OAAO,UAAU,KAAK,WAAW,IAAK,UAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;QAC5E,OAAQ,UAAkB,CAAC,MAAM,CAAC,MAAM,CAAC;IAC3C,CAAC;IAED,wBAAwB;IACxB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;QACtC,IAAI,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC;YAC7B,OAAO,MAAM,CAAC,SAAS,CAAC,MAAsB,CAAC;QACjD,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,gBAAgB;IAClB,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;AACxD,CAAC;AAED;;GAEG;AACH,SAAS,WAAW,CAAC,MAAmB;IACtC,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;IACrC,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAC/C,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC7C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,KAAK,CAAC,MAAM,CAAC;AACtB,CAAC;AAED,+EAA+E;AAC/E,aAAa;AACb,+EAA+E;AAE/E;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,KAAa;IACxC,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;IACjC,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACnC,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IACxD,OAAO,WAAW,CAAC,UAAU,CAAS,CAAC;AACzC,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAA8B;IAC/D,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;IACjC,MAAM,MAAM,GAAG,IAAI,YAAY,UAAU,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,MAAqB,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9F,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAC1D,OAAO,WAAW,CAAC,UAAU,CAAS,CAAC;AACzC,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAY;IAC7C,MAAM,IAAI,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAC;IACzC,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;AACtB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAuB;IACvD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,uCAAuC;QACvC,OAAO,MAAM,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACxB,IAAI,CAAC,KAAK;YAAE,OAAO,MAAM,CAAC,EAAE,CAAC,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,6CAA6C;IAC7C,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjC,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC;AAC1B,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAe,EAAE,YAAkB;IAClE,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;IACzC,OAAO,iBAAiB,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;AACrD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,GAAY,EAAE,YAAkB;IACrE,MAAM,UAAU,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC;IAC3C,OAAO,iBAAiB,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;AACrD,CAAC;AAED,+EAA+E;AAC/E,oBAAoB;AACpB,+EAA+E;AAE/E;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,GAAY;IACjD,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE;QACtC,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAChE,mBAAmB;YACnB,MAAM,MAAM,GAA4B,EAAE,CAAC;YAC3C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;YACvC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;YAC3B,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,CAAS,EAAE,CAAS;IACpD,0DAA0D;IAC1D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;IAEzC,gDAAgD;IAChD,IAAI,MAAM,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,qCAAqC;IAEvE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,kFAAkF;QAClF,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACjD,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACjD,MAAM,IAAI,KAAK,GAAG,KAAK,CAAC;IAC1B,CAAC;IAED,OAAO,MAAM,KAAK,CAAC,CAAC;AACtB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,OAAO,OAAO,KAAK,KAAK,QAAQ;QAC9B,KAAK,CAAC,MAAM,KAAK,WAAW;QAC5B,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,KAAa;IACtC,OAAO,KAAa,CAAC;AACvB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,KAAa;IACrC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;QACxB,qDAAqD;QACrD,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Caret — HMAC Seal Utilities
3
+ * @module @longarcstudios/caret/crypto/hmac
4
+ *
5
+ * HMAC-SHA256 implementation for tamper-evident sealing.
6
+ * Seals bind content to a secret key — any modification invalidates the seal.
7
+ */
8
+ import type { Seal, Hash } from '../types.js';
9
+ /**
10
+ * Generate an HMAC-SHA256 seal for content.
11
+ *
12
+ * @param content - The content to seal (will be JSON-stringified)
13
+ * @param key - The secret key
14
+ * @returns Promise resolving to the seal
15
+ *
16
+ * @example
17
+ * ```ts
18
+ * const seal = await hmacSeal({ data: 'sensitive' }, 'secret-key');
19
+ * ```
20
+ */
21
+ export declare function hmacSeal(content: unknown, key: string): Promise<Seal>;
22
+ /**
23
+ * Verify an HMAC seal against content.
24
+ *
25
+ * @param content - The content to verify
26
+ * @param seal - The seal to check
27
+ * @param key - The secret key
28
+ * @returns Promise resolving to boolean
29
+ */
30
+ export declare function hmacVerify(content: unknown, seal: Seal, key: string): Promise<boolean>;
31
+ /**
32
+ * Create a seal binding multiple values together.
33
+ * Useful for sealing a fragment with all its metadata.
34
+ *
35
+ * @param values - Object with named values to seal
36
+ * @param key - The secret key
37
+ * @returns Promise resolving to the seal
38
+ */
39
+ export declare function hmacSealMultiple(values: Record<string, unknown>, key: string): Promise<Seal>;
40
+ /**
41
+ * Generate a seal for a context fragment.
42
+ * Seals all critical fields to detect any tampering.
43
+ *
44
+ * @param fragment - Fragment data to seal (without the seal field)
45
+ * @param key - The secret key
46
+ * @returns Promise resolving to the seal
47
+ */
48
+ export declare function sealFragment(fragment: {
49
+ id: string;
50
+ hash: Hash;
51
+ content: unknown;
52
+ provenance: unknown;
53
+ sealed_at: string;
54
+ constraints: unknown;
55
+ }, key: string): Promise<Seal>;
56
+ /**
57
+ * Verify a fragment's seal.
58
+ *
59
+ * @param fragment - The fragment to verify
60
+ * @param key - The secret key
61
+ * @returns Promise resolving to boolean
62
+ */
63
+ export declare function verifyFragmentSeal(fragment: {
64
+ id: string;
65
+ hash: Hash;
66
+ content: unknown;
67
+ provenance: unknown;
68
+ sealed_at: string;
69
+ constraints: unknown;
70
+ seal: Seal;
71
+ }, key: string): Promise<boolean>;
72
+ /**
73
+ * Validate seal format.
74
+ */
75
+ export declare function isValidSeal(value: string): value is Seal;
76
+ /**
77
+ * Parse a string as a Seal, throwing if invalid.
78
+ */
79
+ export declare function parseSeal(value: string): Seal;
80
+ //# sourceMappingURL=hmac.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hmac.d.ts","sourceRoot":"","sources":["../../../src/context/crypto/hmac.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAgG9C;;;;;;;;;;;GAWG;AACH,wBAAsB,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAU3E;AAED;;;;;;;GAOG;AACH,wBAAsB,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAG5F;AAED;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,IAAI,CAAC,CASf;AAED;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAChC,QAAQ,EAAE;IACR,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,IAAI,CAAC;IACX,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,OAAO,CAAC;CACtB,EACD,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,IAAI,CAAC,CAcf;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE;IACR,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,IAAI,CAAC;IACX,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,OAAO,CAAC;IACrB,IAAI,EAAE,IAAI,CAAC;CACZ,EACD,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,OAAO,CAAC,CAalB;AAMD;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,IAAI,CAIxD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAM7C"}
@@ -0,0 +1,192 @@
1
+ /**
2
+ * Caret — HMAC Seal Utilities
3
+ * @module @longarcstudios/caret/crypto/hmac
4
+ *
5
+ * HMAC-SHA256 implementation for tamper-evident sealing.
6
+ * Seals bind content to a secret key — any modification invalidates the seal.
7
+ */
8
+ import { deterministicStringify, constantTimeEqual } from './hash.js';
9
+ // ============================================================================
10
+ // CONSTANTS
11
+ // ============================================================================
12
+ const ALGORITHM = { name: 'HMAC', hash: 'SHA-256' };
13
+ const KEY_USAGES = ['sign', 'verify'];
14
+ // SECURITY: HKDF_INFO must match core/crypto.ts to ensure cross-module
15
+ // seal verification works. Unified in SA-2026-008 (Feb 13, 2026).
16
+ // Prior value 'caret-seal-v1' caused silent verification failures.
17
+ const HKDF_INFO = new TextEncoder().encode('mdash-seal-v3');
18
+ const HKDF_SALT = new TextEncoder().encode('caret-context-primitive-engine');
19
+ // ============================================================================
20
+ // KEY MANAGEMENT
21
+ // ============================================================================
22
+ /**
23
+ * Derive an HMAC key from a master key using HKDF.
24
+ * SECURITY: Key is bound to 'mdash-seal-v3' context, unified with core/crypto.ts.
25
+ */
26
+ async function deriveKey(masterKey) {
27
+ const crypto = await getCrypto();
28
+ const encoder = new TextEncoder();
29
+ const keyMaterial = encoder.encode(masterKey);
30
+ // Import as raw key material for HKDF
31
+ const baseKey = await crypto.importKey('raw', keyMaterial, 'HKDF', false, ['deriveKey']);
32
+ // Derive HMAC key using HKDF
33
+ return crypto.deriveKey({
34
+ name: 'HKDF',
35
+ hash: 'SHA-256',
36
+ salt: HKDF_SALT,
37
+ info: HKDF_INFO,
38
+ }, baseKey, ALGORITHM, false, // not extractable
39
+ KEY_USAGES);
40
+ }
41
+ /**
42
+ * Get crypto implementation (same as hash.ts).
43
+ */
44
+ async function getCrypto() {
45
+ if (typeof window !== 'undefined' && window.crypto?.subtle) {
46
+ return window.crypto.subtle;
47
+ }
48
+ if (typeof globalThis !== 'undefined' && globalThis.crypto?.subtle) {
49
+ return globalThis.crypto.subtle;
50
+ }
51
+ try {
52
+ const crypto = await import('crypto');
53
+ if (crypto.webcrypto?.subtle) {
54
+ return crypto.webcrypto.subtle;
55
+ }
56
+ }
57
+ catch {
58
+ // Import failed
59
+ }
60
+ throw new Error('No crypto implementation available');
61
+ }
62
+ /**
63
+ * Convert ArrayBuffer to hex string.
64
+ */
65
+ function bufferToHex(buffer) {
66
+ const bytes = new Uint8Array(buffer);
67
+ let hex = '';
68
+ for (let i = 0; i < bytes.length; i++) {
69
+ const byte = bytes[i];
70
+ if (byte !== undefined) {
71
+ hex += byte.toString(16).padStart(2, '0');
72
+ }
73
+ }
74
+ return hex;
75
+ }
76
+ // ============================================================================
77
+ // PUBLIC API
78
+ // ============================================================================
79
+ /**
80
+ * Generate an HMAC-SHA256 seal for content.
81
+ *
82
+ * @param content - The content to seal (will be JSON-stringified)
83
+ * @param key - The secret key
84
+ * @returns Promise resolving to the seal
85
+ *
86
+ * @example
87
+ * ```ts
88
+ * const seal = await hmacSeal({ data: 'sensitive' }, 'secret-key');
89
+ * ```
90
+ */
91
+ export async function hmacSeal(content, key) {
92
+ const crypto = await getCrypto();
93
+ const cryptoKey = await deriveKey(key); // SECURITY: Use HKDF-derived key
94
+ const encoder = new TextEncoder();
95
+ // Deterministic serialization
96
+ const data = encoder.encode(deterministicStringify(content));
97
+ const signature = await crypto.sign(ALGORITHM, cryptoKey, data);
98
+ return bufferToHex(signature);
99
+ }
100
+ /**
101
+ * Verify an HMAC seal against content.
102
+ *
103
+ * @param content - The content to verify
104
+ * @param seal - The seal to check
105
+ * @param key - The secret key
106
+ * @returns Promise resolving to boolean
107
+ */
108
+ export async function hmacVerify(content, seal, key) {
109
+ const expectedSeal = await hmacSeal(content, key);
110
+ return constantTimeEqual(seal, expectedSeal);
111
+ }
112
+ /**
113
+ * Create a seal binding multiple values together.
114
+ * Useful for sealing a fragment with all its metadata.
115
+ *
116
+ * @param values - Object with named values to seal
117
+ * @param key - The secret key
118
+ * @returns Promise resolving to the seal
119
+ */
120
+ export async function hmacSealMultiple(values, key) {
121
+ // Sort keys and create deterministic representation
122
+ const sorted = {};
123
+ const keys = Object.keys(values).sort();
124
+ for (const k of keys) {
125
+ sorted[k] = values[k];
126
+ }
127
+ return hmacSeal(sorted, key);
128
+ }
129
+ /**
130
+ * Generate a seal for a context fragment.
131
+ * Seals all critical fields to detect any tampering.
132
+ *
133
+ * @param fragment - Fragment data to seal (without the seal field)
134
+ * @param key - The secret key
135
+ * @returns Promise resolving to the seal
136
+ */
137
+ export async function sealFragment(fragment, key) {
138
+ // Create canonical representation for sealing
139
+ // SECURITY: _v binds seal to protocol version, preventing downgrade attacks
140
+ const canonical = {
141
+ _v: 1,
142
+ id: fragment.id,
143
+ hash: fragment.hash,
144
+ content: fragment.content,
145
+ provenance: fragment.provenance,
146
+ sealed_at: fragment.sealed_at,
147
+ constraints: fragment.constraints,
148
+ };
149
+ return hmacSeal(canonical, key);
150
+ }
151
+ /**
152
+ * Verify a fragment's seal.
153
+ *
154
+ * @param fragment - The fragment to verify
155
+ * @param key - The secret key
156
+ * @returns Promise resolving to boolean
157
+ */
158
+ export async function verifyFragmentSeal(fragment, key) {
159
+ // SECURITY: Must match _v from sealFragment
160
+ const canonical = {
161
+ _v: 1,
162
+ id: fragment.id,
163
+ hash: fragment.hash,
164
+ content: fragment.content,
165
+ provenance: fragment.provenance,
166
+ sealed_at: fragment.sealed_at,
167
+ constraints: fragment.constraints,
168
+ };
169
+ return hmacVerify(canonical, fragment.seal, key);
170
+ }
171
+ // ============================================================================
172
+ // SEAL UTILITIES
173
+ // ============================================================================
174
+ /**
175
+ * Validate seal format.
176
+ */
177
+ export function isValidSeal(value) {
178
+ return typeof value === 'string' &&
179
+ value.length === 64 &&
180
+ /^[a-f0-9]+$/i.test(value);
181
+ }
182
+ /**
183
+ * Parse a string as a Seal, throwing if invalid.
184
+ */
185
+ export function parseSeal(value) {
186
+ if (!isValidSeal(value)) {
187
+ // SECURITY: Do not leak input value in error message
188
+ throw new Error('Invalid seal format');
189
+ }
190
+ return value;
191
+ }
192
+ //# sourceMappingURL=hmac.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hmac.js","sourceRoot":"","sources":["../../../src/context/crypto/hmac.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Caret — Cryptographic Utilities
3
+ * @module @longarcstudios/caret/crypto
4
+ */
5
+ export { sha256, sha256Object, sha256Binary, rollingHash, verifyHash, verifyObjectHash, isValidHash, parseHash, unsafeHash, hexToBuffer, deterministicStringify, constantTimeEqual, } from './hash.js';
6
+ export { hmacSeal, hmacVerify, hmacSealMultiple, sealFragment, verifyFragmentSeal, isValidSeal, parseSeal, } from './hmac.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/context/crypto/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,MAAM,EACN,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,UAAU,EACV,gBAAgB,EAChB,WAAW,EACX,SAAS,EACT,UAAU,EACV,WAAW,EACX,sBAAsB,EACtB,iBAAiB,GAClB,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,QAAQ,EACR,UAAU,EACV,gBAAgB,EAChB,YAAY,EACZ,kBAAkB,EAClB,WAAW,EACX,SAAS,GACV,MAAM,WAAW,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Caret — Cryptographic Utilities
3
+ * @module @longarcstudios/caret/crypto
4
+ */
5
+ export { sha256, sha256Object, sha256Binary, rollingHash, verifyHash, verifyObjectHash, isValidHash, parseHash, unsafeHash, hexToBuffer, deterministicStringify, constantTimeEqual, } from './hash.js';
6
+ export { hmacSeal, hmacVerify, hmacSealMultiple, sealFragment, verifyFragmentSeal, isValidSeal, parseSeal, } from './hmac.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/context/crypto/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,MAAM,EACN,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,UAAU,EACV,gBAAgB,EAChB,WAAW,EACX,SAAS,EACT,UAAU,EACV,WAAW,EACX,sBAAsB,EACtB,iBAAiB,GAClB,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,QAAQ,EACR,UAAU,EACV,gBAAgB,EAChB,YAAY,EACZ,kBAAkB,EAClB,WAAW,EACX,SAAS,GACV,MAAM,WAAW,CAAC"}