@emilia-protocol/gate 0.11.0 → 0.13.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 (419) hide show
  1. package/CHANGELOG.md +58 -0
  2. package/README.md +252 -0
  3. package/action-control-manifest.js +3 -268
  4. package/action-escrow-custodian.js +3 -394
  5. package/action-escrow-evidence.js +3 -858
  6. package/action-escrow-package.js +3 -1668
  7. package/action-escrow-postgres.js +3 -337
  8. package/action-escrow-state.js +3 -396
  9. package/action-escrow-verifiers.js +3 -331
  10. package/action-escrow.js +3 -2447
  11. package/action-packs.js +3 -140
  12. package/adapters/_kit.js +3 -104
  13. package/adapters/aws.js +3 -108
  14. package/adapters/cloudflare.js +3 -54
  15. package/adapters/gcp.js +3 -70
  16. package/adapters/github.js +3 -109
  17. package/adapters/jira.js +3 -55
  18. package/adapters/k8s.js +3 -70
  19. package/adapters/linear.js +3 -55
  20. package/adapters/salesforce.js +3 -55
  21. package/adapters/stripe.js +3 -81
  22. package/adapters/supabase.js +3 -121
  23. package/adapters/terraform.js +3 -59
  24. package/adapters/vercel.js +3 -84
  25. package/aec-execution.js +3 -312
  26. package/breakglass.js +3 -582
  27. package/capability-receipt.js +4 -0
  28. package/cf1-conformance.js +3 -106
  29. package/challenge-store.js +3 -69
  30. package/control-plane.js +3 -340
  31. package/coverage.js +3 -721
  32. package/demo.mjs +1 -1
  33. package/deployment-attestation.js +3 -247
  34. package/dist/action-control-manifest.d.ts +82 -0
  35. package/dist/action-control-manifest.d.ts.map +1 -0
  36. package/dist/action-control-manifest.js +422 -0
  37. package/dist/action-control-manifest.js.map +1 -0
  38. package/dist/action-escrow-custodian.d.ts +74 -0
  39. package/dist/action-escrow-custodian.d.ts.map +1 -0
  40. package/dist/action-escrow-custodian.js +363 -0
  41. package/dist/action-escrow-custodian.js.map +1 -0
  42. package/dist/action-escrow-evidence.d.ts +130 -0
  43. package/dist/action-escrow-evidence.d.ts.map +1 -0
  44. package/dist/action-escrow-evidence.js +1012 -0
  45. package/dist/action-escrow-evidence.js.map +1 -0
  46. package/dist/action-escrow-package.d.ts +10 -0
  47. package/dist/action-escrow-package.d.ts.map +1 -0
  48. package/dist/action-escrow-package.js +1583 -0
  49. package/dist/action-escrow-package.js.map +1 -0
  50. package/dist/action-escrow-postgres.d.ts +62 -0
  51. package/dist/action-escrow-postgres.d.ts.map +1 -0
  52. package/dist/action-escrow-postgres.js +339 -0
  53. package/dist/action-escrow-postgres.js.map +1 -0
  54. package/dist/action-escrow-state.d.ts +141 -0
  55. package/dist/action-escrow-state.d.ts.map +1 -0
  56. package/dist/action-escrow-state.js +413 -0
  57. package/dist/action-escrow-state.js.map +1 -0
  58. package/dist/action-escrow-verifiers.d.ts +65 -0
  59. package/dist/action-escrow-verifiers.d.ts.map +1 -0
  60. package/dist/action-escrow-verifiers.js +421 -0
  61. package/dist/action-escrow-verifiers.js.map +1 -0
  62. package/dist/action-escrow.d.ts +112 -0
  63. package/dist/action-escrow.d.ts.map +1 -0
  64. package/dist/action-escrow.js +2661 -0
  65. package/dist/action-escrow.js.map +1 -0
  66. package/dist/action-packs.d.ts +54 -0
  67. package/dist/action-packs.d.ts.map +1 -0
  68. package/dist/action-packs.js +143 -0
  69. package/dist/action-packs.js.map +1 -0
  70. package/dist/adapters/_kit.d.ts +50 -0
  71. package/dist/adapters/_kit.d.ts.map +1 -0
  72. package/dist/adapters/_kit.js +98 -0
  73. package/dist/adapters/_kit.js.map +1 -0
  74. package/dist/adapters/aws.d.ts +158 -0
  75. package/dist/adapters/aws.d.ts.map +1 -0
  76. package/dist/adapters/aws.js +136 -0
  77. package/dist/adapters/aws.js.map +1 -0
  78. package/dist/adapters/cloudflare.d.ts +116 -0
  79. package/dist/adapters/cloudflare.d.ts.map +1 -0
  80. package/dist/adapters/cloudflare.js +75 -0
  81. package/dist/adapters/cloudflare.js.map +1 -0
  82. package/dist/adapters/gcp.d.ts +139 -0
  83. package/dist/adapters/gcp.d.ts.map +1 -0
  84. package/dist/adapters/gcp.js +69 -0
  85. package/dist/adapters/gcp.js.map +1 -0
  86. package/dist/adapters/github.d.ts +123 -0
  87. package/dist/adapters/github.d.ts.map +1 -0
  88. package/dist/adapters/github.js +105 -0
  89. package/dist/adapters/github.js.map +1 -0
  90. package/dist/adapters/jira.d.ts +109 -0
  91. package/dist/adapters/jira.d.ts.map +1 -0
  92. package/dist/adapters/jira.js +54 -0
  93. package/dist/adapters/jira.js.map +1 -0
  94. package/dist/adapters/k8s.d.ts +139 -0
  95. package/dist/adapters/k8s.d.ts.map +1 -0
  96. package/dist/adapters/k8s.js +69 -0
  97. package/dist/adapters/k8s.js.map +1 -0
  98. package/dist/adapters/linear.d.ts +109 -0
  99. package/dist/adapters/linear.d.ts.map +1 -0
  100. package/dist/adapters/linear.js +54 -0
  101. package/dist/adapters/linear.js.map +1 -0
  102. package/dist/adapters/salesforce.d.ts +109 -0
  103. package/dist/adapters/salesforce.d.ts.map +1 -0
  104. package/dist/adapters/salesforce.js +54 -0
  105. package/dist/adapters/salesforce.js.map +1 -0
  106. package/dist/adapters/stripe.d.ts +116 -0
  107. package/dist/adapters/stripe.d.ts.map +1 -0
  108. package/dist/adapters/stripe.js +77 -0
  109. package/dist/adapters/stripe.js.map +1 -0
  110. package/dist/adapters/supabase.d.ts +127 -0
  111. package/dist/adapters/supabase.d.ts.map +1 -0
  112. package/dist/adapters/supabase.js +112 -0
  113. package/dist/adapters/supabase.js.map +1 -0
  114. package/dist/adapters/terraform.d.ts +109 -0
  115. package/dist/adapters/terraform.d.ts.map +1 -0
  116. package/dist/adapters/terraform.js +58 -0
  117. package/dist/adapters/terraform.js.map +1 -0
  118. package/dist/adapters/vercel.d.ts +114 -0
  119. package/dist/adapters/vercel.d.ts.map +1 -0
  120. package/dist/adapters/vercel.js +81 -0
  121. package/dist/adapters/vercel.js.map +1 -0
  122. package/dist/aec-execution.d.ts +107 -0
  123. package/dist/aec-execution.d.ts.map +1 -0
  124. package/dist/aec-execution.js +334 -0
  125. package/dist/aec-execution.js.map +1 -0
  126. package/dist/breakglass.d.ts +205 -0
  127. package/dist/breakglass.d.ts.map +1 -0
  128. package/dist/breakglass.js +627 -0
  129. package/dist/breakglass.js.map +1 -0
  130. package/dist/capability-receipt.d.ts +601 -0
  131. package/dist/capability-receipt.d.ts.map +1 -0
  132. package/dist/capability-receipt.js +1177 -0
  133. package/dist/capability-receipt.js.map +1 -0
  134. package/dist/cf1-conformance.d.ts +83 -0
  135. package/dist/cf1-conformance.d.ts.map +1 -0
  136. package/dist/cf1-conformance.js +94 -0
  137. package/dist/cf1-conformance.js.map +1 -0
  138. package/dist/challenge-store.d.ts +20 -0
  139. package/dist/challenge-store.d.ts.map +1 -0
  140. package/dist/challenge-store.js +62 -0
  141. package/dist/challenge-store.js.map +1 -0
  142. package/dist/control-plane.d.ts +136 -0
  143. package/dist/control-plane.d.ts.map +1 -0
  144. package/dist/control-plane.js +349 -0
  145. package/dist/control-plane.js.map +1 -0
  146. package/dist/coverage.d.ts +156 -0
  147. package/dist/coverage.d.ts.map +1 -0
  148. package/dist/coverage.js +768 -0
  149. package/dist/coverage.js.map +1 -0
  150. package/dist/deployment-attestation.d.ts +93 -0
  151. package/dist/deployment-attestation.d.ts.map +1 -0
  152. package/dist/deployment-attestation.js +262 -0
  153. package/dist/deployment-attestation.js.map +1 -0
  154. package/dist/eg1-conformance.d.ts +286 -0
  155. package/dist/eg1-conformance.d.ts.map +1 -0
  156. package/dist/eg1-conformance.js +379 -0
  157. package/dist/eg1-conformance.js.map +1 -0
  158. package/dist/enterprise.d.ts +88 -0
  159. package/dist/enterprise.d.ts.map +1 -0
  160. package/dist/enterprise.js +194 -0
  161. package/dist/enterprise.js.map +1 -0
  162. package/dist/evidence-postgres.d.ts +123 -0
  163. package/dist/evidence-postgres.d.ts.map +1 -0
  164. package/dist/evidence-postgres.js +343 -0
  165. package/dist/evidence-postgres.js.map +1 -0
  166. package/dist/evidence.d.ts +113 -0
  167. package/dist/evidence.d.ts.map +1 -0
  168. package/dist/evidence.js +369 -0
  169. package/dist/evidence.js.map +1 -0
  170. package/dist/execution-binding.d.ts +49 -0
  171. package/dist/execution-binding.d.ts.map +1 -0
  172. package/dist/execution-binding.js +243 -0
  173. package/dist/execution-binding.js.map +1 -0
  174. package/dist/formal-runtime-map.d.ts +42 -0
  175. package/dist/formal-runtime-map.d.ts.map +1 -0
  176. package/dist/formal-runtime-map.js +23 -0
  177. package/dist/formal-runtime-map.js.map +1 -0
  178. package/dist/index.d.ts +1002 -0
  179. package/dist/index.d.ts.map +1 -0
  180. package/dist/index.js +1736 -0
  181. package/dist/index.js.map +1 -0
  182. package/dist/key-registry.d.ts +60 -0
  183. package/dist/key-registry.d.ts.map +1 -0
  184. package/dist/key-registry.js +144 -0
  185. package/dist/key-registry.js.map +1 -0
  186. package/dist/mcp.d.ts +53 -0
  187. package/dist/mcp.d.ts.map +1 -0
  188. package/dist/mcp.js +112 -0
  189. package/dist/mcp.js.map +1 -0
  190. package/dist/metering.d.ts +80 -0
  191. package/dist/metering.d.ts.map +1 -0
  192. package/dist/metering.js +227 -0
  193. package/dist/metering.js.map +1 -0
  194. package/dist/metrics.d.ts +68 -0
  195. package/dist/metrics.d.ts.map +1 -0
  196. package/dist/metrics.js +242 -0
  197. package/dist/metrics.js.map +1 -0
  198. package/dist/network-witness.d.ts +167 -0
  199. package/dist/network-witness.d.ts.map +1 -0
  200. package/dist/network-witness.js +520 -0
  201. package/dist/network-witness.js.map +1 -0
  202. package/dist/protocol-state.d.ts +141 -0
  203. package/dist/protocol-state.d.ts.map +1 -0
  204. package/dist/protocol-state.js +106 -0
  205. package/dist/protocol-state.js.map +1 -0
  206. package/dist/receipt-program.d.ts +59 -0
  207. package/dist/receipt-program.d.ts.map +1 -0
  208. package/dist/receipt-program.js +1053 -0
  209. package/dist/receipt-program.js.map +1 -0
  210. package/dist/reliance-kernel.d.ts +66 -0
  211. package/dist/reliance-kernel.d.ts.map +1 -0
  212. package/dist/reliance-kernel.js +103 -0
  213. package/dist/reliance-kernel.js.map +1 -0
  214. package/dist/reliance-packet.d.ts +67 -0
  215. package/dist/reliance-packet.d.ts.map +1 -0
  216. package/dist/reliance-packet.js +176 -0
  217. package/dist/reliance-packet.js.map +1 -0
  218. package/dist/remedy-program-postgres.d.ts +37 -0
  219. package/dist/remedy-program-postgres.d.ts.map +1 -0
  220. package/dist/remedy-program-postgres.js +291 -0
  221. package/dist/remedy-program-postgres.js.map +1 -0
  222. package/dist/remedy-program-receipt.d.ts +97 -0
  223. package/dist/remedy-program-receipt.d.ts.map +1 -0
  224. package/dist/remedy-program-receipt.js +817 -0
  225. package/dist/remedy-program-receipt.js.map +1 -0
  226. package/dist/remedy-program.d.ts +76 -0
  227. package/dist/remedy-program.d.ts.map +1 -0
  228. package/dist/remedy-program.js +1346 -0
  229. package/dist/remedy-program.js.map +1 -0
  230. package/dist/reports/art14.d.ts +101 -0
  231. package/dist/reports/art14.d.ts.map +1 -0
  232. package/dist/reports/art14.js +340 -0
  233. package/dist/reports/art14.js.map +1 -0
  234. package/dist/reports/assurance-package.d.ts +197 -0
  235. package/dist/reports/assurance-package.d.ts.map +1 -0
  236. package/dist/reports/assurance-package.js +313 -0
  237. package/dist/reports/assurance-package.js.map +1 -0
  238. package/dist/reports/auditor-workpaper.d.ts +194 -0
  239. package/dist/reports/auditor-workpaper.d.ts.map +1 -0
  240. package/dist/reports/auditor-workpaper.js +545 -0
  241. package/dist/reports/auditor-workpaper.js.map +1 -0
  242. package/dist/reports/external-verification.d.ts +76 -0
  243. package/dist/reports/external-verification.d.ts.map +1 -0
  244. package/dist/reports/external-verification.js +209 -0
  245. package/dist/reports/external-verification.js.map +1 -0
  246. package/dist/reports/reperform.d.ts +122 -0
  247. package/dist/reports/reperform.d.ts.map +1 -0
  248. package/dist/reports/reperform.js +432 -0
  249. package/dist/reports/reperform.js.map +1 -0
  250. package/dist/reports/underwriter.d.ts +127 -0
  251. package/dist/reports/underwriter.d.ts.map +1 -0
  252. package/dist/reports/underwriter.js +348 -0
  253. package/dist/reports/underwriter.js.map +1 -0
  254. package/dist/retention.d.ts +88 -0
  255. package/dist/retention.d.ts.map +1 -0
  256. package/dist/retention.js +90 -0
  257. package/dist/retention.js.map +1 -0
  258. package/dist/roster.d.ts +113 -0
  259. package/dist/roster.d.ts.map +1 -0
  260. package/dist/roster.js +261 -0
  261. package/dist/roster.js.map +1 -0
  262. package/dist/runtime-monitor.d.ts +132 -0
  263. package/dist/runtime-monitor.d.ts.map +1 -0
  264. package/dist/runtime-monitor.js +197 -0
  265. package/dist/runtime-monitor.js.map +1 -0
  266. package/dist/settlement.d.ts +68 -0
  267. package/dist/settlement.d.ts.map +1 -0
  268. package/dist/settlement.js +306 -0
  269. package/dist/settlement.js.map +1 -0
  270. package/dist/siem.d.ts +261 -0
  271. package/dist/siem.d.ts.map +1 -0
  272. package/dist/siem.js +247 -0
  273. package/dist/siem.js.map +1 -0
  274. package/dist/store-postgres.d.ts +107 -0
  275. package/dist/store-postgres.d.ts.map +1 -0
  276. package/dist/store-postgres.js +152 -0
  277. package/dist/store-postgres.js.map +1 -0
  278. package/dist/store.d.ts +95 -0
  279. package/dist/store.d.ts.map +1 -0
  280. package/dist/store.js +202 -0
  281. package/dist/store.js.map +1 -0
  282. package/dist/strict-json.d.ts +14 -0
  283. package/dist/strict-json.d.ts.map +1 -0
  284. package/dist/strict-json.js +132 -0
  285. package/dist/strict-json.js.map +1 -0
  286. package/dist/trust-program-adapters.d.ts +122 -0
  287. package/dist/trust-program-adapters.d.ts.map +1 -0
  288. package/dist/trust-program-adapters.js +802 -0
  289. package/dist/trust-program-adapters.js.map +1 -0
  290. package/dist/trust-program-postgres.d.ts +41 -0
  291. package/dist/trust-program-postgres.d.ts.map +1 -0
  292. package/dist/trust-program-postgres.js +346 -0
  293. package/dist/trust-program-postgres.js.map +1 -0
  294. package/dist/trust-program-revocation.d.ts +206 -0
  295. package/dist/trust-program-revocation.d.ts.map +1 -0
  296. package/dist/trust-program-revocation.js +600 -0
  297. package/dist/trust-program-revocation.js.map +1 -0
  298. package/dist/trust-program.d.ts +197 -0
  299. package/dist/trust-program.d.ts.map +1 -0
  300. package/dist/trust-program.js +1351 -0
  301. package/dist/trust-program.js.map +1 -0
  302. package/dist/witness-postgres.d.ts +43 -0
  303. package/dist/witness-postgres.d.ts.map +1 -0
  304. package/dist/witness-postgres.js +92 -0
  305. package/dist/witness-postgres.js.map +1 -0
  306. package/dist/zk-range-proof.d.ts +78 -0
  307. package/dist/zk-range-proof.d.ts.map +1 -0
  308. package/dist/zk-range-proof.js +228 -0
  309. package/dist/zk-range-proof.js.map +1 -0
  310. package/eg1-conformance.js +3 -404
  311. package/enterprise.js +3 -180
  312. package/ep-assure.mjs +1 -0
  313. package/evidence-postgres.js +3 -356
  314. package/evidence.js +4 -360
  315. package/execution-binding.js +3 -212
  316. package/formal-runtime-map.js +4 -0
  317. package/index.js +4 -1249
  318. package/key-registry.js +3 -134
  319. package/mcp.js +3 -109
  320. package/metering.js +3 -226
  321. package/metrics.js +3 -231
  322. package/network-witness.js +3 -499
  323. package/package.json +31 -2
  324. package/receipt-program.js +4 -0
  325. package/reliance-kernel.js +3 -112
  326. package/reliance-packet.js +3 -175
  327. package/remedy-program-postgres.js +4 -0
  328. package/remedy-program-receipt.js +4 -0
  329. package/remedy-program.js +4 -0
  330. package/reports/art14.js +0 -0
  331. package/reports/assurance-package.js +2 -312
  332. package/reports/auditor-workpaper.js +3 -537
  333. package/reports/external-verification.js +3 -222
  334. package/reports/reperform.js +3 -424
  335. package/reports/underwriter.js +3 -339
  336. package/retention.js +3 -84
  337. package/roster.js +3 -264
  338. package/runtime-monitor.js +4 -0
  339. package/settlement.js +3 -299
  340. package/siem.js +3 -235
  341. package/src/action-control-manifest.ts +424 -0
  342. package/src/action-escrow-custodian.ts +427 -0
  343. package/src/action-escrow-evidence.ts +1178 -0
  344. package/src/action-escrow-package.ts +1821 -0
  345. package/src/action-escrow-postgres.ts +366 -0
  346. package/src/action-escrow-state.ts +498 -0
  347. package/src/action-escrow-verifiers.ts +484 -0
  348. package/src/action-escrow.ts +3039 -0
  349. package/src/action-packs.ts +170 -0
  350. package/src/adapters/_kit.ts +117 -0
  351. package/src/adapters/aws.ts +142 -0
  352. package/src/adapters/cloudflare.ts +78 -0
  353. package/src/adapters/gcp.ts +71 -0
  354. package/src/adapters/github.ts +110 -0
  355. package/src/adapters/jira.ts +56 -0
  356. package/src/adapters/k8s.ts +71 -0
  357. package/src/adapters/linear.ts +56 -0
  358. package/src/adapters/salesforce.ts +56 -0
  359. package/src/adapters/stripe.ts +82 -0
  360. package/src/adapters/supabase.ts +122 -0
  361. package/src/adapters/terraform.ts +60 -0
  362. package/src/adapters/vercel.ts +85 -0
  363. package/src/aec-execution.ts +354 -0
  364. package/src/breakglass.ts +647 -0
  365. package/src/capability-receipt.ts +1258 -0
  366. package/src/cf1-conformance.ts +120 -0
  367. package/src/challenge-store.ts +70 -0
  368. package/src/control-plane.ts +374 -0
  369. package/src/coverage.ts +832 -0
  370. package/src/deployment-attestation.ts +259 -0
  371. package/src/eg1-conformance.ts +471 -0
  372. package/src/enterprise.ts +195 -0
  373. package/src/evidence-postgres.ts +374 -0
  374. package/src/evidence.ts +367 -0
  375. package/src/execution-binding.ts +236 -0
  376. package/src/formal-runtime-map.ts +24 -0
  377. package/src/index.ts +2122 -0
  378. package/src/key-registry.ts +150 -0
  379. package/src/mcp.ts +120 -0
  380. package/src/metering.ts +237 -0
  381. package/src/metrics.ts +232 -0
  382. package/src/network-witness.ts +585 -0
  383. package/src/protocol-state.ts +143 -0
  384. package/src/protocol-state.typecheck.ts +94 -0
  385. package/src/receipt-program.ts +1105 -0
  386. package/src/reliance-kernel.ts +119 -0
  387. package/src/reliance-packet.ts +206 -0
  388. package/src/remedy-program-postgres.ts +367 -0
  389. package/src/remedy-program-receipt.ts +891 -0
  390. package/src/remedy-program.ts +1388 -0
  391. package/src/reports/art14.ts +361 -0
  392. package/src/reports/assurance-package.ts +330 -0
  393. package/src/reports/auditor-workpaper.ts +558 -0
  394. package/src/reports/external-verification.ts +232 -0
  395. package/src/reports/reperform.ts +441 -0
  396. package/src/reports/underwriter.ts +356 -0
  397. package/src/retention.ts +100 -0
  398. package/src/roster.ts +273 -0
  399. package/src/runtime-monitor.ts +217 -0
  400. package/src/settlement.ts +313 -0
  401. package/src/siem.ts +247 -0
  402. package/src/store-postgres.ts +167 -0
  403. package/src/store.ts +214 -0
  404. package/src/strict-json.ts +115 -0
  405. package/src/trust-program-adapters.ts +847 -0
  406. package/src/trust-program-postgres.ts +429 -0
  407. package/src/trust-program-revocation.ts +751 -0
  408. package/src/trust-program.ts +1460 -0
  409. package/src/witness-postgres.ts +106 -0
  410. package/src/zk-range-proof.ts +250 -0
  411. package/store-postgres.js +3 -161
  412. package/store.js +4 -198
  413. package/strict-json.js +3 -102
  414. package/trust-program-adapters.js +4 -0
  415. package/trust-program-postgres.js +4 -0
  416. package/trust-program-revocation.js +4 -0
  417. package/trust-program.js +4 -0
  418. package/witness-postgres.js +3 -96
  419. package/zk-range-proof.js +4 -0
@@ -0,0 +1,209 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ /**
3
+ * EP-EXTERNAL-VERIFICATION-STATEMENT-v1.
4
+ *
5
+ * A signed statement a NON-EMILIA verifier can issue after it re-performs an
6
+ * evidence log, replays an admissibility profile, or runs a conformance harness.
7
+ * This is the missing adoption rail between "our verifier works" and "an
8
+ * outside party says exactly what they checked."
9
+ *
10
+ * Scope is intentionally narrow:
11
+ * - the statement signs a procedure, inputs, result, and limitations;
12
+ * - it does NOT authorize an action;
13
+ * - it does NOT certify business correctness;
14
+ * - acceptance is by a relying party pinning the external verifier key.
15
+ */
16
+ import crypto from 'node:crypto';
17
+ // In-package canonicalize (byte-identical to lib/canonical-json.js): reports must
18
+ // never import outside the package root or the published tarball cannot resolve it.
19
+ import { canonicalize } from '../execution-binding.js';
20
+ export const EXTERNAL_VERIFICATION_STATEMENT_VERSION = 'EP-EXTERNAL-VERIFICATION-STATEMENT-v1';
21
+ export const EXTERNAL_VERIFICATION_DOMAIN = 'EP-EXTERNAL-VERIFICATION-STATEMENT-v1\0';
22
+ const SHA256_RE = /^sha256:[0-9a-f]{64}$/i;
23
+ function sha256hex(bytes) {
24
+ return crypto.createHash('sha256').update(bytes).digest('hex');
25
+ }
26
+ function publicKeyToB64u(key) {
27
+ return crypto.createPublicKey(key).export({ type: 'spki', format: 'der' }).toString('base64url');
28
+ }
29
+ function keyIdFor(publicKeyB64u) {
30
+ return `ep:external-verifier-key:sha256:${sha256hex(Buffer.from(publicKeyB64u, 'base64url')).slice(0, 16)}`;
31
+ }
32
+ function signingBytes(unsignedStatement) {
33
+ return Buffer.from(EXTERNAL_VERIFICATION_DOMAIN + canonicalize(unsignedStatement), 'utf8');
34
+ }
35
+ function unsigned(statement) {
36
+ if (!statement || typeof statement !== 'object' || Array.isArray(statement)) {
37
+ throw new Error('statement must be an object');
38
+ }
39
+ const { signature: _signature, ...body } = statement;
40
+ return body;
41
+ }
42
+ /** Digest of the signed statement body, excluding the signature envelope. */
43
+ export function externalVerificationDigest(statement) {
44
+ return `sha256:${sha256hex(signingBytes(unsigned(statement)))}`;
45
+ }
46
+ function normalizeChecks(checks) {
47
+ if (!Array.isArray(checks))
48
+ return [];
49
+ return checks.map((c) => ({
50
+ id: String(c?.id ?? ''),
51
+ ok: c?.ok === true,
52
+ ...(c?.detail !== undefined ? { detail: c.detail } : {}),
53
+ })).filter((c) => c.id);
54
+ }
55
+ /**
56
+ * Build and sign an external-verifier statement.
57
+ *
58
+ * @param {object} args
59
+ * @param {object} args.verifier {id, name?, organization?}
60
+ * @param {object} args.subject what was checked, e.g. {kind:'evidence_log', head:'sha256:...'}
61
+ * @param {object} args.procedure {id, version?, tool?, command?}
62
+ * @param {object} args.result {status, checks?, artifact_digest?}
63
+ * @param {object} [args.inputs] stable digests/ids the procedure consumed
64
+ * @param {string[]} [args.limitations] honest non-claims
65
+ * @param {string|number} [args.generated_at] ISO or epoch millis
66
+ * @param {crypto.KeyObject} privateKey Ed25519 private key
67
+ */
68
+ export function signExternalVerificationStatement(args, privateKey) {
69
+ if (!privateKey)
70
+ throw new Error('privateKey is required');
71
+ const generatedAt = args?.generated_at !== undefined
72
+ ? new Date(args.generated_at).toISOString()
73
+ : new Date().toISOString();
74
+ const publicKey = publicKeyToB64u(privateKey);
75
+ const body = {
76
+ '@version': EXTERNAL_VERIFICATION_STATEMENT_VERSION,
77
+ generated_at: generatedAt,
78
+ verifier: {
79
+ id: args?.verifier?.id ?? keyIdFor(publicKey),
80
+ ...(args?.verifier?.name ? { name: args.verifier.name } : {}),
81
+ ...(args?.verifier?.organization ? { organization: args.verifier.organization } : {}),
82
+ },
83
+ subject: args?.subject ?? {},
84
+ procedure: args?.procedure ?? {},
85
+ inputs: args?.inputs ?? {},
86
+ result: {
87
+ status: String(args?.result?.status ?? 'unknown'),
88
+ checks: normalizeChecks(args?.result?.checks),
89
+ ...(args?.result?.artifact_digest ? { artifact_digest: args.result.artifact_digest } : {}),
90
+ },
91
+ limitations: Array.isArray(args?.limitations) && args.limitations.length
92
+ ? args.limitations.map(String)
93
+ : [
94
+ 'This statement records the external verifier procedure and result; it does not authorize the action.',
95
+ 'It does not certify business correctness, legal compliance, or human wisdom.',
96
+ 'Acceptance depends on the relying party pinning the verifier key out of band.',
97
+ 'The statement carries no expiry and no consumer binding; it is replayable verbatim, and generated_at is asserted by the signer, not verified.',
98
+ ],
99
+ };
100
+ const digest = externalVerificationDigest(body);
101
+ const sig = crypto.sign(null, signingBytes(body), privateKey).toString('base64url');
102
+ return Object.freeze({
103
+ ...body,
104
+ signature: {
105
+ algorithm: 'Ed25519',
106
+ key_id: keyIdFor(publicKey),
107
+ public_key: publicKey,
108
+ statement_digest: digest,
109
+ signature_b64u: sig,
110
+ },
111
+ });
112
+ }
113
+ /**
114
+ * Verify a signed external-verifier statement against pinned verifier keys.
115
+ *
116
+ * @param {object} statement
117
+ * @param {{pinnedVerifierKeys?:Array<{verifier_id?:string,key_id?:string,public_key:string}>}} [opts]
118
+ */
119
+ export function verifyExternalVerificationStatement(statement, opts = {}) {
120
+ const fail = (reason, extra = {}) => ({
121
+ verified: false,
122
+ accepted: false,
123
+ checks: {
124
+ version: statement?.['@version'] === EXTERNAL_VERIFICATION_STATEMENT_VERSION,
125
+ signature: false,
126
+ pinned_verifier_key: false,
127
+ statement_digest: false,
128
+ },
129
+ reason,
130
+ ...extra,
131
+ });
132
+ if (statement?.['@version'] !== EXTERNAL_VERIFICATION_STATEMENT_VERSION) {
133
+ return fail('unsupported_version');
134
+ }
135
+ const sig = statement.signature;
136
+ if (!sig || sig.algorithm !== 'Ed25519' || typeof sig.public_key !== 'string' || typeof sig.signature_b64u !== 'string') {
137
+ return fail('signature_missing_or_malformed');
138
+ }
139
+ if (typeof sig.statement_digest !== 'string' || !SHA256_RE.test(sig.statement_digest)) {
140
+ return fail('statement_digest_missing_or_malformed');
141
+ }
142
+ let digest;
143
+ try {
144
+ digest = externalVerificationDigest(statement);
145
+ }
146
+ catch {
147
+ return fail('statement_uncanonicalizable');
148
+ }
149
+ if (digest !== sig.statement_digest) {
150
+ return fail('statement_digest_mismatch', { statement_digest: digest });
151
+ }
152
+ const pinned = Array.isArray(opts.pinnedVerifierKeys) ? opts.pinnedVerifierKeys : [];
153
+ const verifierId = statement.verifier?.id ?? null;
154
+ // key_id is always DERIVED from the carried public key. The envelope's key_id is
155
+ // outside the signed bytes, so it is attacker-malleable; if present it must match
156
+ // the derived value or the statement is refused.
157
+ const keyId = keyIdFor(sig.public_key);
158
+ if (sig.key_id !== undefined && sig.key_id !== keyId) {
159
+ return fail('key_id_mismatch', { statement_digest: digest });
160
+ }
161
+ // A pin grants an identity, not just a key: every usable pin entry must name the
162
+ // verifier_id it vouches for. A pin that matches the key but omits verifier_id
163
+ // (or names a different one) never binds the statement's claimed identity.
164
+ const keyMatched = pinned.filter((k) => k?.public_key === sig.public_key
165
+ && (k.key_id === undefined || k.key_id === keyId));
166
+ const pin = keyMatched.find((k) => typeof k.verifier_id === 'string' && k.verifier_id === verifierId);
167
+ if (!pin) {
168
+ return {
169
+ verified: false,
170
+ accepted: false,
171
+ checks: { version: true, signature: false, pinned_verifier_key: false, statement_digest: true },
172
+ reason: keyMatched.length ? 'pin_missing_or_mismatched_verifier_id' : 'verifier_key_not_pinned',
173
+ statement_digest: digest,
174
+ };
175
+ }
176
+ let ok = false;
177
+ try {
178
+ const publicKey = crypto.createPublicKey({ key: Buffer.from(sig.public_key, 'base64url'), type: 'spki', format: 'der' });
179
+ ok = crypto.verify(null, signingBytes(unsigned(statement)), publicKey, Buffer.from(sig.signature_b64u, 'base64url'));
180
+ }
181
+ catch {
182
+ ok = false;
183
+ }
184
+ if (!ok) {
185
+ return {
186
+ verified: false,
187
+ accepted: false,
188
+ checks: { version: true, signature: false, pinned_verifier_key: true, statement_digest: true },
189
+ reason: 'signature_invalid',
190
+ statement_digest: digest,
191
+ };
192
+ }
193
+ return {
194
+ verified: true,
195
+ accepted: true,
196
+ checks: { version: true, signature: true, pinned_verifier_key: true, statement_digest: true },
197
+ verifier_id: verifierId,
198
+ key_id: keyId,
199
+ statement_digest: digest,
200
+ };
201
+ }
202
+ export default {
203
+ EXTERNAL_VERIFICATION_STATEMENT_VERSION,
204
+ EXTERNAL_VERIFICATION_DOMAIN,
205
+ externalVerificationDigest,
206
+ signExternalVerificationStatement,
207
+ verifyExternalVerificationStatement,
208
+ };
209
+ //# sourceMappingURL=external-verification.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"external-verification.js","sourceRoot":"","sources":["../../src/reports/external-verification.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,122 @@
1
+ export declare const REPERFORMANCE_VERSION = "EP-GATE-REPERFORMANCE-v1";
2
+ /**
3
+ * Re-perform the evidence: rebuild the chain, re-verify carried cryptographic
4
+ * material, recompute the counts. Async because the chain is rebuilt through
5
+ * the evidence log's own (async) record().
6
+ *
7
+ * The entries MUST be the complete log from genesis (`evidence.all()` or a
8
+ * full export). A partial slice fails the chain (fail closed) because its
9
+ * first link cannot chain from 'genesis'.
10
+ *
11
+ * Chain method — drives evidence.js's REAL verify(), twice over:
12
+ * 1. every supplied entry body (its own seq/prev_hash included, its hash
13
+ * stripped) is re-recorded into a fresh createEvidenceLog(), which
14
+ * recomputes the canonical-JSON sha256 for that exact body; a recomputed
15
+ * hash that differs from the SUPPLIED hash is a tampered/forged entry —
16
+ * broken from that point;
17
+ * 2. the rebuilt log's own verify() then walks the whole chain, catching
18
+ * link-level attacks the per-entry recompute cannot (a removed entry, or
19
+ * an entry rewritten WITH a consistently recomputed hash — its successor's
20
+ * prev_hash no longer matches).
21
+ *
22
+ * @param {Array<object>} entries the full evidence log (evidence.all())
23
+ * @param {object} [o]
24
+ * @param {string[]} [o.issuerKeys=[]] pinned base64url SPKI issuer keys, sourced
25
+ * by the AUDITOR out of band — never from the entries themselves
26
+ * @param {number|function} [o.now=Date.now] clock for generated_at (pin for determinism)
27
+ * @param {object} [o.approverKeys={}] auditor-pinned identity-bound approver keys
28
+ * @param {string|null} [o.rpId] bind carried WebAuthn assertions to this relying-party id
29
+ * @param {string[]} [o.allowedOrigins=[]] exact accepted WebAuthn origins
30
+ * @param {object} [o.quorumPolicy] auditor-pinned global organizational quorum rule
31
+ * @param {object} [o.quorumPolicies] action_type -> auditor-pinned quorum rule
32
+ * @returns {Promise<object>} EP-GATE-REPERFORMANCE-v1 document:
33
+ * { chain: {ok, entries, head}, receipts: {reverified, failed, not_reverifiable},
34
+ * counts: {allows, denies, replays_blocked, by_action_type}, ... }
35
+ */
36
+ export declare function reperformEvidence(entries?: any[], { issuerKeys, approverKeys, now, rpId, allowedOrigins, quorumPolicy, quorumPolicies, }?: {
37
+ issuerKeys?: string[];
38
+ approverKeys?: Record<string, any>;
39
+ now?: number | (() => number);
40
+ rpId?: string | null;
41
+ allowedOrigins?: string[];
42
+ quorumPolicy?: any;
43
+ quorumPolicies?: Record<string, any>;
44
+ }): Promise<{
45
+ '@version': string;
46
+ product: string;
47
+ generated_at: string;
48
+ honesty: {
49
+ reperforms: string;
50
+ does_not_establish: string[];
51
+ status: string;
52
+ };
53
+ input: {
54
+ entries_supplied: number;
55
+ issuer_keys_pinned: number;
56
+ approver_keys_pinned: number;
57
+ relying_party_scope_pinned: boolean;
58
+ quorum_policies_pinned: number;
59
+ expects: string;
60
+ };
61
+ chain: {
62
+ broken_at?: number | null | undefined;
63
+ broken_seq?: number | null | undefined;
64
+ reason?: string | undefined;
65
+ ok: boolean;
66
+ entries: number;
67
+ head: string | null;
68
+ };
69
+ receipts: {
70
+ reverified: number;
71
+ failed: {
72
+ hash: string | null;
73
+ reason: string;
74
+ }[];
75
+ not_reverifiable: number;
76
+ no_receipt_presented: number;
77
+ };
78
+ counts: {
79
+ allows: number;
80
+ denies: number;
81
+ replays_blocked: number;
82
+ by_action_type: {};
83
+ };
84
+ integrity_warnings: {
85
+ index: number;
86
+ reason: string;
87
+ }[];
88
+ }>;
89
+ /**
90
+ * Diff recomputed counts against a reported pack — the auditor's tie-out.
91
+ *
92
+ * Accepts an EP-GATE-USAGE-v1 pack (meterUsage output or the signed-ready
93
+ * buildUsageStatement body) or an EP-GATE-UNDERWRITER-ATTESTATION-v1 pack.
94
+ * Only the OVERLAPPING NUMERIC fields are compared; an unknown pack @version
95
+ * is refused (fail closed), never fuzzily matched. A reported field that is
96
+ * missing or non-numeric is itself a named drift — a stripped pack can never
97
+ * silently match.
98
+ *
99
+ * The comparison is meaningful only when the recomputation ran over exactly
100
+ * the entries the reported pack was built from (same slice, same window);
101
+ * scoping the slice is the auditor's procedure, not this function's.
102
+ *
103
+ * @param {object} recomputed reperformEvidence() result (or its .counts)
104
+ * @param {object} reportedPack usage or underwriter pack
105
+ * @returns {{match: boolean, pack_version: string, drift: Array<{field, reported, recomputed}>}}
106
+ */
107
+ export declare function compareToReported(recomputed: any, reportedPack: any): {
108
+ match: boolean;
109
+ pack_version: any;
110
+ drift: {
111
+ field: string;
112
+ reported: any;
113
+ recomputed: any;
114
+ }[];
115
+ };
116
+ declare const _default: {
117
+ REPERFORMANCE_VERSION: string;
118
+ reperformEvidence: typeof reperformEvidence;
119
+ compareToReported: typeof compareToReported;
120
+ };
121
+ export default _default;
122
+ //# sourceMappingURL=reperform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reperform.d.ts","sourceRoot":"","sources":["../../src/reports/reperform.ts"],"names":[],"mappings":"AA4CA,eAAO,MAAM,qBAAqB,6BAA6B,CAAC;AA6HhE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,GAAE,GAAG,EAAO,EAAE,EAC3D,UAAe,EACf,YAAiB,EACjB,GAAc,EACd,IAAW,EACX,cAAmB,EACnB,YAAmB,EACnB,cAAmB,GACpB,GAAE;IACD,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACnC,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,CAAC;IAC9B,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,YAAY,CAAC,EAAE,GAAG,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CACjC;;;;;;;;;;;;;;;;;;;;;;;;;;oBAuCU,MAAM;gBACV;YAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,EAAE;0BAC/B,MAAM;8BACF,MAAM;;;;;;;;;eAEL,MAAM;gBAAU,MAAM;;GA+FhD;AAoBD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,KAAA,EAAE,YAAY,KAAA;;;;eAMlC,MAAM;kBAAY,GAAG;oBAAc,GAAG;;EAoC7D;;;;;;AAED,wBAA+E"}