@attestplane/attestplane 0.0.1 → 0.0.3-alpha

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 (106) hide show
  1. package/README.md +23 -9
  2. package/dist/adapter_conformance.d.ts +46 -0
  3. package/dist/adapter_conformance.d.ts.map +1 -0
  4. package/dist/adapter_conformance.js +160 -0
  5. package/dist/adapter_conformance.js.map +1 -0
  6. package/dist/adapters/langfuse.d.ts +51 -0
  7. package/dist/adapters/langfuse.d.ts.map +1 -0
  8. package/dist/adapters/langfuse.js +157 -0
  9. package/dist/adapters/langfuse.js.map +1 -0
  10. package/dist/adapters/langsmith.d.ts +53 -0
  11. package/dist/adapters/langsmith.d.ts.map +1 -0
  12. package/dist/adapters/langsmith.js +173 -0
  13. package/dist/adapters/langsmith.js.map +1 -0
  14. package/dist/adapters.d.ts +88 -0
  15. package/dist/adapters.d.ts.map +1 -0
  16. package/dist/adapters.js +109 -0
  17. package/dist/adapters.js.map +1 -0
  18. package/dist/anchoring.d.ts +119 -0
  19. package/dist/anchoring.d.ts.map +1 -0
  20. package/dist/anchoring.js +340 -0
  21. package/dist/anchoring.js.map +1 -0
  22. package/dist/canonical.d.ts +11 -2
  23. package/dist/canonical.d.ts.map +1 -1
  24. package/dist/canonical.js +44 -31
  25. package/dist/canonical.js.map +1 -1
  26. package/dist/canonical_text.d.ts +30 -0
  27. package/dist/canonical_text.d.ts.map +1 -0
  28. package/dist/canonical_text.js +100 -0
  29. package/dist/canonical_text.js.map +1 -0
  30. package/dist/der.d.ts +55 -0
  31. package/dist/der.d.ts.map +1 -0
  32. package/dist/der.js +200 -0
  33. package/dist/der.js.map +1 -0
  34. package/dist/event_payloads.d.ts +118 -0
  35. package/dist/event_payloads.d.ts.map +1 -0
  36. package/dist/event_payloads.js +348 -0
  37. package/dist/event_payloads.js.map +1 -0
  38. package/dist/event_types.d.ts +47 -0
  39. package/dist/event_types.d.ts.map +1 -0
  40. package/dist/event_types.js +63 -0
  41. package/dist/event_types.js.map +1 -0
  42. package/dist/hashchain.d.ts +1 -0
  43. package/dist/hashchain.d.ts.map +1 -1
  44. package/dist/hashchain.js +25 -1
  45. package/dist/hashchain.js.map +1 -1
  46. package/dist/index.d.ts +23 -2
  47. package/dist/index.d.ts.map +1 -1
  48. package/dist/index.js +24 -2
  49. package/dist/index.js.map +1 -1
  50. package/dist/index_version.d.ts +9 -0
  51. package/dist/index_version.d.ts.map +1 -0
  52. package/dist/index_version.js +11 -0
  53. package/dist/index_version.js.map +1 -0
  54. package/dist/intoto.d.ts +48 -0
  55. package/dist/intoto.d.ts.map +1 -0
  56. package/dist/intoto.js +106 -0
  57. package/dist/intoto.js.map +1 -0
  58. package/dist/obligations.d.ts +41 -0
  59. package/dist/obligations.d.ts.map +1 -0
  60. package/dist/obligations.js +312 -0
  61. package/dist/obligations.js.map +1 -0
  62. package/dist/proof_bundle.d.ts +186 -0
  63. package/dist/proof_bundle.d.ts.map +1 -0
  64. package/dist/proof_bundle.js +299 -0
  65. package/dist/proof_bundle.js.map +1 -0
  66. package/dist/reason_codes.d.ts +38 -0
  67. package/dist/reason_codes.d.ts.map +1 -0
  68. package/dist/reason_codes.js +97 -0
  69. package/dist/reason_codes.js.map +1 -0
  70. package/dist/replay_verifier.d.ts +43 -0
  71. package/dist/replay_verifier.d.ts.map +1 -0
  72. package/dist/replay_verifier.js +98 -0
  73. package/dist/replay_verifier.js.map +1 -0
  74. package/dist/rfc3161.d.ts +52 -0
  75. package/dist/rfc3161.d.ts.map +1 -0
  76. package/dist/rfc3161.js +480 -0
  77. package/dist/rfc3161.js.map +1 -0
  78. package/dist/settlement_verifier.d.ts +34 -0
  79. package/dist/settlement_verifier.d.ts.map +1 -0
  80. package/dist/settlement_verifier.js +139 -0
  81. package/dist/settlement_verifier.js.map +1 -0
  82. package/dist/signing/base.d.ts +101 -0
  83. package/dist/signing/base.d.ts.map +1 -0
  84. package/dist/signing/base.js +144 -0
  85. package/dist/signing/base.js.map +1 -0
  86. package/dist/signing/providers.d.ts +113 -0
  87. package/dist/signing/providers.d.ts.map +1 -0
  88. package/dist/signing/providers.js +230 -0
  89. package/dist/signing/providers.js.map +1 -0
  90. package/dist/signing/signer.d.ts +66 -0
  91. package/dist/signing/signer.d.ts.map +1 -0
  92. package/dist/signing/signer.js +146 -0
  93. package/dist/signing/signer.js.map +1 -0
  94. package/dist/signing/trust_roots.d.ts +71 -0
  95. package/dist/signing/trust_roots.d.ts.map +1 -0
  96. package/dist/signing/trust_roots.js +267 -0
  97. package/dist/signing/trust_roots.js.map +1 -0
  98. package/dist/signing/verifier_ext.d.ts +77 -0
  99. package/dist/signing/verifier_ext.d.ts.map +1 -0
  100. package/dist/signing/verifier_ext.js +340 -0
  101. package/dist/signing/verifier_ext.js.map +1 -0
  102. package/dist/verifier.d.ts +39 -0
  103. package/dist/verifier.d.ts.map +1 -0
  104. package/dist/verifier.js +374 -0
  105. package/dist/verifier.js.map +1 -0
  106. package/package.json +2 -2
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Replay-manifest verifier — read-only walker, NEVER re-executes.
3
+ *
4
+ * ADR-0009 A.9 + P1.1. Given a `ReplayManifest` describing which
5
+ * original chain segment was replayed and what observed booleans the
6
+ * external replay runner reported, this function checks the manifest
7
+ * is internally consistent against the chain provided by the caller.
8
+ *
9
+ * **Hard constraint** (per ADR-0009 § B.6 + invariant 7): this module
10
+ * NEVER re-executes the workload. Replay execution lives in REDLINE
11
+ * C.13 `aios-replay-runner`. We only walk the provided chain.
12
+ */
13
+ export type ReplayCoverage = 'deterministic' | 'non_deterministic' | 'no_replay_event';
14
+ export interface ReplayManifest {
15
+ readonly replay_run_id: string;
16
+ readonly original_run_id: string;
17
+ /** The runner's claimed outcome; the verifier checks the chain agrees. */
18
+ readonly expected_deterministic: boolean;
19
+ readonly snapshot_id_ref?: string;
20
+ }
21
+ export interface ReplayVerificationResult {
22
+ readonly ok: boolean;
23
+ readonly coverage: ReplayCoverage;
24
+ /** The chain seq of the matching `replay_event`, or null. */
25
+ readonly matching_seq: number | null;
26
+ readonly reason: string | null;
27
+ }
28
+ /** Minimal chain-event shape this verifier needs. Matches the JSONL
29
+ * backend's serialised form and the ProofBundle wire format. */
30
+ export interface ChainEventForReplay {
31
+ readonly seq: number;
32
+ readonly event_type: string;
33
+ readonly payload: Record<string, unknown>;
34
+ }
35
+ /**
36
+ * Check that `chainEvents` contains a `replay_event` matching `manifest`.
37
+ *
38
+ * Read-only. Pure function. Never re-executes. Never modifies anything.
39
+ */
40
+ export declare function verifyReplayManifest(chainEvents: readonly ChainEventForReplay[], manifest: ReplayManifest, options?: {
41
+ readonly verification_time?: Date;
42
+ }): ReplayVerificationResult;
43
+ //# sourceMappingURL=replay_verifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replay_verifier.d.ts","sourceRoot":"","sources":["../src/replay_verifier.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AAIH,MAAM,MAAM,cAAc,GAAG,eAAe,GAAG,mBAAmB,GAAG,iBAAiB,CAAC;AAEvF,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,0EAA0E;IAC1E,QAAQ,CAAC,sBAAsB,EAAE,OAAO,CAAC;IACzC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;CACnC;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAClC,6DAA6D;IAC7D,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED;iEACiE;AACjE,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC3C;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,SAAS,mBAAmB,EAAE,EAC3C,QAAQ,EAAE,cAAc,EACxB,OAAO,GAAE;IAAE,QAAQ,CAAC,iBAAiB,CAAC,EAAE,IAAI,CAAA;CAAO,GAClD,wBAAwB,CAkF1B"}
@@ -0,0 +1,98 @@
1
+ // SPDX-FileCopyrightText: 2026 The Attestplane Authors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ /**
4
+ * Replay-manifest verifier — read-only walker, NEVER re-executes.
5
+ *
6
+ * ADR-0009 A.9 + P1.1. Given a `ReplayManifest` describing which
7
+ * original chain segment was replayed and what observed booleans the
8
+ * external replay runner reported, this function checks the manifest
9
+ * is internally consistent against the chain provided by the caller.
10
+ *
11
+ * **Hard constraint** (per ADR-0009 § B.6 + invariant 7): this module
12
+ * NEVER re-executes the workload. Replay execution lives in REDLINE
13
+ * C.13 `aios-replay-runner`. We only walk the provided chain.
14
+ */
15
+ import { validateReplayEventPayload } from './event_payloads.js';
16
+ /**
17
+ * Check that `chainEvents` contains a `replay_event` matching `manifest`.
18
+ *
19
+ * Read-only. Pure function. Never re-executes. Never modifies anything.
20
+ */
21
+ export function verifyReplayManifest(chainEvents, manifest, options = {}) {
22
+ if (!Array.isArray(chainEvents)) {
23
+ return {
24
+ ok: false,
25
+ coverage: 'no_replay_event',
26
+ matching_seq: null,
27
+ reason: `chainEvents must be array, got ${typeof chainEvents}`,
28
+ };
29
+ }
30
+ if (options.verification_time !== undefined &&
31
+ Number.isNaN(options.verification_time.getTime())) {
32
+ return {
33
+ ok: false,
34
+ coverage: 'no_replay_event',
35
+ matching_seq: null,
36
+ reason: 'verification_time must be a valid Date',
37
+ };
38
+ }
39
+ const candidates = [];
40
+ for (const ev of chainEvents) {
41
+ if (ev === null || typeof ev !== 'object')
42
+ continue;
43
+ if (ev.event_type !== 'replay_event')
44
+ continue;
45
+ if (ev.payload === null || typeof ev.payload !== 'object')
46
+ continue;
47
+ const payload = ev.payload;
48
+ if (payload.replay_run_id !== manifest.replay_run_id)
49
+ continue;
50
+ if (payload.original_run_id !== manifest.original_run_id)
51
+ continue;
52
+ if (manifest.snapshot_id_ref !== undefined &&
53
+ payload.snapshot_id_ref !== manifest.snapshot_id_ref) {
54
+ continue;
55
+ }
56
+ if (typeof ev.seq !== 'number' || !Number.isInteger(ev.seq))
57
+ continue;
58
+ candidates.push({ seq: ev.seq, payload });
59
+ }
60
+ if (candidates.length === 0) {
61
+ return {
62
+ ok: false,
63
+ coverage: 'no_replay_event',
64
+ matching_seq: null,
65
+ reason: `no replay_event payload found with replay_run_id=${JSON.stringify(manifest.replay_run_id)}`,
66
+ };
67
+ }
68
+ candidates.sort((a, b) => a.seq - b.seq);
69
+ const latest = candidates[candidates.length - 1];
70
+ const { seq, payload } = latest;
71
+ try {
72
+ validateReplayEventPayload(payload);
73
+ }
74
+ catch (exc) {
75
+ return {
76
+ ok: false,
77
+ coverage: 'no_replay_event',
78
+ matching_seq: seq,
79
+ reason: `matching replay_event payload failed validation: ${exc.message}`,
80
+ };
81
+ }
82
+ const actualDet = Boolean(payload.deterministic_result);
83
+ if (manifest.expected_deterministic !== actualDet) {
84
+ return {
85
+ ok: false,
86
+ coverage: actualDet ? 'deterministic' : 'non_deterministic',
87
+ matching_seq: seq,
88
+ reason: `manifest expected deterministic_result=${manifest.expected_deterministic}, chain payload reports ${actualDet}`,
89
+ };
90
+ }
91
+ return {
92
+ ok: true,
93
+ coverage: actualDet ? 'deterministic' : 'non_deterministic',
94
+ matching_seq: seq,
95
+ reason: null,
96
+ };
97
+ }
98
+ //# sourceMappingURL=replay_verifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replay_verifier.js","sourceRoot":"","sources":["../src/replay_verifier.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * RFC-3161 TimeStampResp parsing + TimeStampToken signature verification
3
+ * (TypeScript port of `sdk/python/src/attestplane/anchoring/rfc3161.py`).
4
+ *
5
+ * Built on `src/der.ts` (hand-rolled DER reader) + Node's stdlib
6
+ * `crypto.verify` for RSA-PKCS1v15-SHA256. No additional npm
7
+ * dependencies — the TypeScript SDK keeps the same lean dep tree as
8
+ * v0.0.1-alpha while gaining real signature verification.
9
+ *
10
+ * The parser handles the specific structures defined in RFC-3161,
11
+ * RFC-5652 (CMS SignedData), and the X.509 subset needed to extract
12
+ * the RSA public key from a leaf cert's SubjectPublicKeyInfo.
13
+ *
14
+ * Cross-language conformance: TS reproduces Python's
15
+ * parse_timestamp_response semantics byte-for-byte. The
16
+ * anchor_vectors.json fixtures verify in both languages.
17
+ */
18
+ /** Subset of TSTInfo + SignerInfo extracted from a TimeStampResp. */
19
+ export interface ParsedTimestampTs {
20
+ readonly policyOid: string;
21
+ readonly hashAlgorithm: string;
22
+ readonly messageImprint: Uint8Array;
23
+ readonly genTime: Date;
24
+ readonly serialNumber: bigint;
25
+ readonly nonce: bigint | null;
26
+ readonly leafCertDer: Uint8Array;
27
+ readonly signedAttrsDer: Uint8Array;
28
+ readonly signature: Uint8Array;
29
+ readonly digestAlgorithmOid: string;
30
+ readonly signatureAlgorithmOid: string;
31
+ }
32
+ /** Parse a DER-encoded TimeStampResp into the substantive fields we verify. */
33
+ export declare function parseTimestampResponse(responseDer: Uint8Array): ParsedTimestampTs;
34
+ export interface VerifyTimestampOptions {
35
+ readonly expectedDigest: Uint8Array;
36
+ readonly trustRootsDer: readonly Uint8Array[];
37
+ readonly intermediatesDer?: readonly Uint8Array[];
38
+ readonly verificationTime?: Date;
39
+ readonly maxChainDepth?: number;
40
+ }
41
+ /**
42
+ * Verify a parsed TimeStampToken against the expected message digest +
43
+ * trust roots + intermediates.
44
+ *
45
+ * Mirrors the Python `verify_timestamp_token` API including multi-hop
46
+ * intermediate chain walking, time-validity checks at every cert, and
47
+ * BasicConstraints.cA enforcement on each intermediate.
48
+ *
49
+ * Throws `AnchorVerificationError` on any failure.
50
+ */
51
+ export declare function verifyTimestampToken(parsed: ParsedTimestampTs, options: VerifyTimestampOptions): void;
52
+ //# sourceMappingURL=rfc3161.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rfc3161.d.ts","sourceRoot":"","sources":["../src/rfc3161.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;GAgBG;AAuBH,qEAAqE;AACrE,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,cAAc,EAAE,UAAU,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC;IACvB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,WAAW,EAAE,UAAU,CAAC;IACjC,QAAQ,CAAC,cAAc,EAAE,UAAU,CAAC;IACpC,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAC;IAC/B,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;CACxC;AAwBD,+EAA+E;AAC/E,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,UAAU,GAAG,iBAAiB,CAgNjF;AAuJD,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,cAAc,EAAE,UAAU,CAAC;IACpC,QAAQ,CAAC,aAAa,EAAE,SAAS,UAAU,EAAE,CAAC;IAC9C,QAAQ,CAAC,gBAAgB,CAAC,EAAE,SAAS,UAAU,EAAE,CAAC;IAClD,QAAQ,CAAC,gBAAgB,CAAC,EAAE,IAAI,CAAC;IACjC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC;AAED;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,iBAAiB,EACzB,OAAO,EAAE,sBAAsB,GAC9B,IAAI,CA0GN"}