@emilia-protocol/gate 0.11.0 → 0.14.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 (425) hide show
  1. package/CHANGELOG.md +80 -0
  2. package/README.md +310 -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 +1003 -0
  179. package/dist/index.d.ts.map +1 -0
  180. package/dist/index.js +1737 -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/proposal-to-effect.d.ts +146 -0
  203. package/dist/proposal-to-effect.d.ts.map +1 -0
  204. package/dist/proposal-to-effect.js +427 -0
  205. package/dist/proposal-to-effect.js.map +1 -0
  206. package/dist/protocol-state.d.ts +141 -0
  207. package/dist/protocol-state.d.ts.map +1 -0
  208. package/dist/protocol-state.js +106 -0
  209. package/dist/protocol-state.js.map +1 -0
  210. package/dist/receipt-program.d.ts +59 -0
  211. package/dist/receipt-program.d.ts.map +1 -0
  212. package/dist/receipt-program.js +1053 -0
  213. package/dist/receipt-program.js.map +1 -0
  214. package/dist/reliance-kernel.d.ts +66 -0
  215. package/dist/reliance-kernel.d.ts.map +1 -0
  216. package/dist/reliance-kernel.js +103 -0
  217. package/dist/reliance-kernel.js.map +1 -0
  218. package/dist/reliance-packet.d.ts +67 -0
  219. package/dist/reliance-packet.d.ts.map +1 -0
  220. package/dist/reliance-packet.js +176 -0
  221. package/dist/reliance-packet.js.map +1 -0
  222. package/dist/remedy-program-postgres.d.ts +37 -0
  223. package/dist/remedy-program-postgres.d.ts.map +1 -0
  224. package/dist/remedy-program-postgres.js +291 -0
  225. package/dist/remedy-program-postgres.js.map +1 -0
  226. package/dist/remedy-program-receipt.d.ts +97 -0
  227. package/dist/remedy-program-receipt.d.ts.map +1 -0
  228. package/dist/remedy-program-receipt.js +817 -0
  229. package/dist/remedy-program-receipt.js.map +1 -0
  230. package/dist/remedy-program.d.ts +76 -0
  231. package/dist/remedy-program.d.ts.map +1 -0
  232. package/dist/remedy-program.js +1346 -0
  233. package/dist/remedy-program.js.map +1 -0
  234. package/dist/reports/art14.d.ts +101 -0
  235. package/dist/reports/art14.d.ts.map +1 -0
  236. package/dist/reports/art14.js +340 -0
  237. package/dist/reports/art14.js.map +1 -0
  238. package/dist/reports/assurance-package.d.ts +197 -0
  239. package/dist/reports/assurance-package.d.ts.map +1 -0
  240. package/dist/reports/assurance-package.js +313 -0
  241. package/dist/reports/assurance-package.js.map +1 -0
  242. package/dist/reports/auditor-workpaper.d.ts +194 -0
  243. package/dist/reports/auditor-workpaper.d.ts.map +1 -0
  244. package/dist/reports/auditor-workpaper.js +545 -0
  245. package/dist/reports/auditor-workpaper.js.map +1 -0
  246. package/dist/reports/external-verification.d.ts +76 -0
  247. package/dist/reports/external-verification.d.ts.map +1 -0
  248. package/dist/reports/external-verification.js +209 -0
  249. package/dist/reports/external-verification.js.map +1 -0
  250. package/dist/reports/reperform.d.ts +122 -0
  251. package/dist/reports/reperform.d.ts.map +1 -0
  252. package/dist/reports/reperform.js +432 -0
  253. package/dist/reports/reperform.js.map +1 -0
  254. package/dist/reports/underwriter.d.ts +127 -0
  255. package/dist/reports/underwriter.d.ts.map +1 -0
  256. package/dist/reports/underwriter.js +348 -0
  257. package/dist/reports/underwriter.js.map +1 -0
  258. package/dist/retention.d.ts +88 -0
  259. package/dist/retention.d.ts.map +1 -0
  260. package/dist/retention.js +90 -0
  261. package/dist/retention.js.map +1 -0
  262. package/dist/roster.d.ts +113 -0
  263. package/dist/roster.d.ts.map +1 -0
  264. package/dist/roster.js +261 -0
  265. package/dist/roster.js.map +1 -0
  266. package/dist/runtime-monitor.d.ts +132 -0
  267. package/dist/runtime-monitor.d.ts.map +1 -0
  268. package/dist/runtime-monitor.js +197 -0
  269. package/dist/runtime-monitor.js.map +1 -0
  270. package/dist/settlement.d.ts +68 -0
  271. package/dist/settlement.d.ts.map +1 -0
  272. package/dist/settlement.js +306 -0
  273. package/dist/settlement.js.map +1 -0
  274. package/dist/siem.d.ts +261 -0
  275. package/dist/siem.d.ts.map +1 -0
  276. package/dist/siem.js +247 -0
  277. package/dist/siem.js.map +1 -0
  278. package/dist/store-postgres.d.ts +107 -0
  279. package/dist/store-postgres.d.ts.map +1 -0
  280. package/dist/store-postgres.js +152 -0
  281. package/dist/store-postgres.js.map +1 -0
  282. package/dist/store.d.ts +95 -0
  283. package/dist/store.d.ts.map +1 -0
  284. package/dist/store.js +202 -0
  285. package/dist/store.js.map +1 -0
  286. package/dist/strict-json.d.ts +14 -0
  287. package/dist/strict-json.d.ts.map +1 -0
  288. package/dist/strict-json.js +132 -0
  289. package/dist/strict-json.js.map +1 -0
  290. package/dist/trust-program-adapters.d.ts +122 -0
  291. package/dist/trust-program-adapters.d.ts.map +1 -0
  292. package/dist/trust-program-adapters.js +802 -0
  293. package/dist/trust-program-adapters.js.map +1 -0
  294. package/dist/trust-program-postgres.d.ts +41 -0
  295. package/dist/trust-program-postgres.d.ts.map +1 -0
  296. package/dist/trust-program-postgres.js +346 -0
  297. package/dist/trust-program-postgres.js.map +1 -0
  298. package/dist/trust-program-revocation.d.ts +206 -0
  299. package/dist/trust-program-revocation.d.ts.map +1 -0
  300. package/dist/trust-program-revocation.js +600 -0
  301. package/dist/trust-program-revocation.js.map +1 -0
  302. package/dist/trust-program.d.ts +197 -0
  303. package/dist/trust-program.d.ts.map +1 -0
  304. package/dist/trust-program.js +1351 -0
  305. package/dist/trust-program.js.map +1 -0
  306. package/dist/witness-postgres.d.ts +43 -0
  307. package/dist/witness-postgres.d.ts.map +1 -0
  308. package/dist/witness-postgres.js +92 -0
  309. package/dist/witness-postgres.js.map +1 -0
  310. package/dist/zk-range-proof.d.ts +78 -0
  311. package/dist/zk-range-proof.d.ts.map +1 -0
  312. package/dist/zk-range-proof.js +228 -0
  313. package/dist/zk-range-proof.js.map +1 -0
  314. package/eg1-conformance.js +3 -404
  315. package/enterprise.js +3 -180
  316. package/ep-assure.mjs +1 -0
  317. package/evidence-postgres.js +3 -356
  318. package/evidence.js +4 -360
  319. package/execution-binding.js +3 -212
  320. package/formal-runtime-map.js +4 -0
  321. package/index.js +4 -1249
  322. package/key-registry.js +3 -134
  323. package/mcp.js +3 -109
  324. package/metering.js +3 -226
  325. package/metrics.js +3 -231
  326. package/network-witness.js +3 -499
  327. package/package.json +35 -4
  328. package/proposal-to-effect.js +4 -0
  329. package/receipt-program.js +4 -0
  330. package/reliance-kernel.js +3 -112
  331. package/reliance-packet.js +3 -175
  332. package/remedy-program-postgres.js +4 -0
  333. package/remedy-program-receipt.js +4 -0
  334. package/remedy-program.js +4 -0
  335. package/reports/art14.js +0 -0
  336. package/reports/assurance-package.js +2 -312
  337. package/reports/auditor-workpaper.js +3 -537
  338. package/reports/external-verification.js +3 -222
  339. package/reports/reperform.js +3 -424
  340. package/reports/underwriter.js +3 -339
  341. package/retention.js +3 -84
  342. package/roster.js +3 -264
  343. package/runtime-monitor.js +4 -0
  344. package/settlement.js +3 -299
  345. package/siem.js +3 -235
  346. package/src/action-control-manifest.ts +424 -0
  347. package/src/action-escrow-custodian.ts +427 -0
  348. package/src/action-escrow-evidence.ts +1178 -0
  349. package/src/action-escrow-package.ts +1821 -0
  350. package/src/action-escrow-postgres.ts +366 -0
  351. package/src/action-escrow-state.ts +498 -0
  352. package/src/action-escrow-verifiers.ts +484 -0
  353. package/src/action-escrow.ts +3039 -0
  354. package/src/action-packs.ts +170 -0
  355. package/src/adapters/_kit.ts +117 -0
  356. package/src/adapters/aws.ts +142 -0
  357. package/src/adapters/cloudflare.ts +78 -0
  358. package/src/adapters/gcp.ts +71 -0
  359. package/src/adapters/github.ts +110 -0
  360. package/src/adapters/jira.ts +56 -0
  361. package/src/adapters/k8s.ts +71 -0
  362. package/src/adapters/linear.ts +56 -0
  363. package/src/adapters/salesforce.ts +56 -0
  364. package/src/adapters/stripe.ts +82 -0
  365. package/src/adapters/supabase.ts +122 -0
  366. package/src/adapters/terraform.ts +60 -0
  367. package/src/adapters/vercel.ts +85 -0
  368. package/src/aec-execution.ts +354 -0
  369. package/src/breakglass.ts +647 -0
  370. package/src/capability-receipt.ts +1258 -0
  371. package/src/cf1-conformance.ts +120 -0
  372. package/src/challenge-store.ts +70 -0
  373. package/src/control-plane.ts +374 -0
  374. package/src/coverage.ts +832 -0
  375. package/src/deployment-attestation.ts +259 -0
  376. package/src/eg1-conformance.ts +471 -0
  377. package/src/enterprise.ts +195 -0
  378. package/src/evidence-postgres.ts +374 -0
  379. package/src/evidence.ts +367 -0
  380. package/src/execution-binding.ts +236 -0
  381. package/src/formal-runtime-map.ts +24 -0
  382. package/src/index.ts +2127 -0
  383. package/src/key-registry.ts +150 -0
  384. package/src/mcp.ts +120 -0
  385. package/src/metering.ts +237 -0
  386. package/src/metrics.ts +232 -0
  387. package/src/network-witness.ts +585 -0
  388. package/src/proposal-to-effect.ts +571 -0
  389. package/src/protocol-state.ts +143 -0
  390. package/src/protocol-state.typecheck.ts +94 -0
  391. package/src/receipt-program.ts +1105 -0
  392. package/src/reliance-kernel.ts +119 -0
  393. package/src/reliance-packet.ts +206 -0
  394. package/src/remedy-program-postgres.ts +367 -0
  395. package/src/remedy-program-receipt.ts +891 -0
  396. package/src/remedy-program.ts +1388 -0
  397. package/src/reports/art14.ts +361 -0
  398. package/src/reports/assurance-package.ts +330 -0
  399. package/src/reports/auditor-workpaper.ts +558 -0
  400. package/src/reports/external-verification.ts +232 -0
  401. package/src/reports/reperform.ts +441 -0
  402. package/src/reports/underwriter.ts +356 -0
  403. package/src/retention.ts +100 -0
  404. package/src/roster.ts +273 -0
  405. package/src/runtime-monitor.ts +217 -0
  406. package/src/settlement.ts +313 -0
  407. package/src/siem.ts +247 -0
  408. package/src/store-postgres.ts +167 -0
  409. package/src/store.ts +214 -0
  410. package/src/strict-json.ts +115 -0
  411. package/src/trust-program-adapters.ts +847 -0
  412. package/src/trust-program-postgres.ts +429 -0
  413. package/src/trust-program-revocation.ts +751 -0
  414. package/src/trust-program.ts +1460 -0
  415. package/src/witness-postgres.ts +106 -0
  416. package/src/zk-range-proof.ts +250 -0
  417. package/store-postgres.js +3 -161
  418. package/store.js +4 -198
  419. package/strict-json.js +3 -102
  420. package/trust-program-adapters.js +4 -0
  421. package/trust-program-postgres.js +4 -0
  422. package/trust-program-revocation.js +4 -0
  423. package/trust-program.js +4 -0
  424. package/witness-postgres.js +3 -96
  425. 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"}