@e-sig/supabase 0.1.0 → 0.3.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.
@@ -0,0 +1,40 @@
1
+ import type { SupabaseClient } from "@supabase/supabase-js";
2
+ export interface VerifyAuditChainOptions {
3
+ /** Tenant whose chain to verify. */
4
+ tenantId: string;
5
+ /** Table name. Default `esig_audit_log`. */
6
+ table?: string;
7
+ /** Tenant key column. Default `tenant_id`. */
8
+ tenantColumn?: string;
9
+ /** Rows fetched per request. Default 1000 (PostgREST's usual max). */
10
+ pageSize?: number;
11
+ }
12
+ export interface AuditChainFailure {
13
+ /** `seq` of the offending row (falls back to the row's position when seq itself is unusable). */
14
+ seq: number;
15
+ /** Row id. */
16
+ id: string;
17
+ /** Human-readable description of what broke. */
18
+ reason: string;
19
+ }
20
+ export interface VerifyAuditChainResult {
21
+ /** True iff every row checked out. Vacuously true for an empty chain. */
22
+ ok: boolean;
23
+ /** Number of rows fetched and checked. */
24
+ checkedRows: number;
25
+ /** seq of the first failing row, when any failed. */
26
+ firstBrokenSeq?: number;
27
+ /** One entry per detected problem, in chain order. */
28
+ failures: AuditChainFailure[];
29
+ }
30
+ /**
31
+ * Verify a tenant's esig_audit_log hash chain (migration 0002). Per row:
32
+ * (a) seq is contiguous from 0,
33
+ * (b) prev_hash equals the previous row's row_hash (linkage),
34
+ * (c) row_hash = sha256(prev_hash|payload_canonical) (self-consistency),
35
+ * (d) payload_canonical's scalar fields match the row's actual columns.
36
+ * Read access to the chain columns is required (service key, or a member
37
+ * session if your esig_tenant_member() grants SELECT).
38
+ */
39
+ export declare function verifyAuditChain(client: SupabaseClient, opts: VerifyAuditChainOptions): Promise<VerifyAuditChainResult>;
40
+ //# sourceMappingURL=audit-chain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit-chain.d.ts","sourceRoot":"","sources":["../src/audit-chain.ts"],"names":[],"mappings":"AAkCA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,WAAW,uBAAuB;IACtC,oCAAoC;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,4CAA4C;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8CAA8C;IAC9C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,sEAAsE;IACtE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,iGAAiG;IACjG,GAAG,EAAE,MAAM,CAAC;IACZ,cAAc;IACd,EAAE,EAAE,MAAM,CAAC;IACX,gDAAgD;IAChD,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,sBAAsB;IACrC,yEAAyE;IACzE,EAAE,EAAE,OAAO,CAAC;IACZ,0CAA0C;IAC1C,WAAW,EAAE,MAAM,CAAC;IACpB,qDAAqD;IACrD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,sDAAsD;IACtD,QAAQ,EAAE,iBAAiB,EAAE,CAAC;CAC/B;AAkED;;;;;;;;GAQG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,uBAAuB,GAC5B,OAAO,CAAC,sBAAsB,CAAC,CA6HjC"}
@@ -0,0 +1,210 @@
1
+ // @e-sig/supabase — verifyAuditChain
2
+ //
3
+ // Client-side tamper-evidence verifier for the esig_audit_log hash chain
4
+ // installed by migrations/0002_esig_audit_hashchain.sql. Fetches one tenant's
5
+ // rows in seq order, re-derives the SHA-256 linkage from payload_canonical,
6
+ // and cross-checks the canonical's scalar fields against the row's actual
7
+ // columns — so edited columns, edited canonicals, deleted/reordered rows and
8
+ // re-hashed suffixes all surface as failures.
9
+ //
10
+ // ==================================================================
11
+ // CANONICAL PAYLOAD SPEC v1 — MUST match migrations/0002 byte-for-byte
12
+ // ==================================================================
13
+ // payload_canonical =
14
+ // 'v1'
15
+ // || '|' || tenant_id::text (lowercase uuid text)
16
+ // || '|' || action
17
+ // || '|' || coalesce(actor_user_id::text, '') ('' when NULL)
18
+ // || '|' || coalesce(target_table, '') ('' when NULL)
19
+ // || '|' || coalesce(target_id::text, '') ('' when NULL)
20
+ // || '|' || epoch MICROseconds of created_at, as integer text
21
+ // || '|' || md5(metadata::text) (32 lowercase hex)
22
+ //
23
+ // row_hash = sha256hex(utf8((prev_hash ?? "") + "|" + payload_canonical))
24
+ // seq = 0-origin, contiguous per tenant
25
+ // prev_hash = previous row's row_hash (null at seq 0)
26
+ //
27
+ // jsonb normalization is PG-side: md5(metadata::text) hashes Postgres's
28
+ // canonical jsonb rendering (its key ordering / spacing / numeric scale),
29
+ // which JS cannot reproduce reliably. The md5 therefore travels inside
30
+ // payload_canonical and is integrity-protected by the chain itself; this
31
+ // verifier cross-checks the SCALAR fields column-by-column and validates
32
+ // only the md5's shape.
33
+ import { createHash } from "node:crypto";
34
+ const MD5_HEX = /^[0-9a-f]{32}$/;
35
+ function sha256Hex(input) {
36
+ return createHash("sha256").update(input, "utf8").digest("hex");
37
+ }
38
+ /**
39
+ * Epoch microseconds of a Postgres/PostgREST timestamptz text value — mirrors
40
+ * `(extract(epoch from created_at) * 1000000)::bigint`. Accepts
41
+ * `2026-07-03T12:34:56.789012+00:00` (PostgREST), the space-separated PG text
42
+ * form, `Z`, and 2-digit offsets; fractional seconds may be 0-6 digits (PG
43
+ * trims trailing zeros). Exact in a float64 until far beyond year 2200.
44
+ */
45
+ function timestamptzToEpochMicros(value) {
46
+ const m = /^(\d{4}-\d{2}-\d{2})[T ](\d{2}:\d{2}:\d{2})(?:\.(\d{1,6}))?(Z|[+-]\d{2}(?::?\d{2})?)$/.exec(value);
47
+ if (!m)
48
+ throw new Error(`unparseable timestamptz "${value}"`);
49
+ let offset = m[4];
50
+ if (/^[+-]\d{2}$/.test(offset))
51
+ offset += ":00";
52
+ else if (/^[+-]\d{4}$/.test(offset))
53
+ offset = `${offset.slice(0, 3)}:${offset.slice(3)}`;
54
+ const baseMs = Date.parse(`${m[1]}T${m[2]}${offset}`);
55
+ if (Number.isNaN(baseMs))
56
+ throw new Error(`unparseable timestamptz "${value}"`);
57
+ return baseMs * 1000 + Number((m[3] ?? "0").padEnd(6, "0"));
58
+ }
59
+ const CANONICAL_FIELDS = [
60
+ "version",
61
+ "tenant_id",
62
+ "action",
63
+ "actor_user_id",
64
+ "target_table",
65
+ "target_id",
66
+ "created_at_epoch_us",
67
+ "metadata_md5",
68
+ ];
69
+ /** Names the disagreeing fields when both strings split into the v1 shape. */
70
+ function describeCanonicalMismatch(expected, actual) {
71
+ const e = expected.split("|");
72
+ const a = actual.split("|");
73
+ if (e.length === CANONICAL_FIELDS.length && a.length === CANONICAL_FIELDS.length) {
74
+ const diff = CANONICAL_FIELDS.filter((_, i) => e[i] !== a[i]);
75
+ if (diff.length > 0) {
76
+ return `payload_canonical disagrees with row columns on: ${diff.join(", ")}`;
77
+ }
78
+ }
79
+ return "payload_canonical disagrees with row columns";
80
+ }
81
+ /**
82
+ * Verify a tenant's esig_audit_log hash chain (migration 0002). Per row:
83
+ * (a) seq is contiguous from 0,
84
+ * (b) prev_hash equals the previous row's row_hash (linkage),
85
+ * (c) row_hash = sha256(prev_hash|payload_canonical) (self-consistency),
86
+ * (d) payload_canonical's scalar fields match the row's actual columns.
87
+ * Read access to the chain columns is required (service key, or a member
88
+ * session if your esig_tenant_member() grants SELECT).
89
+ */
90
+ export async function verifyAuditChain(client, opts) {
91
+ const table = opts.table ?? "esig_audit_log";
92
+ const tenantColumn = opts.tenantColumn ?? "tenant_id";
93
+ const pageSize = opts.pageSize ?? 1000;
94
+ const columns = [
95
+ "id",
96
+ "seq",
97
+ "prev_hash",
98
+ "row_hash",
99
+ "payload_canonical",
100
+ "action",
101
+ "actor_user_id",
102
+ "target_table",
103
+ "target_id",
104
+ "created_at",
105
+ tenantColumn,
106
+ ].join(", ");
107
+ const rows = [];
108
+ let serverTotal = null;
109
+ for (let from = 0;; from += pageSize) {
110
+ // count:'exact' on the first page guards against a PostgREST max-rows cap
111
+ // below pageSize: a short page would otherwise read as end-of-chain and
112
+ // silently verify only a prefix.
113
+ const { data, error, count } = await client
114
+ .from(table)
115
+ .select(columns, from === 0 ? { count: "exact" } : undefined)
116
+ .eq(tenantColumn, opts.tenantId)
117
+ .order("seq", { ascending: true })
118
+ .range(from, from + pageSize - 1);
119
+ if (error)
120
+ throw new Error(`verifyAuditChain: ${error.message}`);
121
+ if (from === 0 && typeof count === "number")
122
+ serverTotal = count;
123
+ const page = (data ?? []);
124
+ rows.push(...page);
125
+ if (page.length < pageSize)
126
+ break;
127
+ }
128
+ if (serverTotal !== null && rows.length !== serverTotal) {
129
+ return {
130
+ ok: false,
131
+ checkedRows: rows.length,
132
+ failures: [
133
+ {
134
+ seq: rows.length,
135
+ id: "",
136
+ reason: `fetched ${rows.length} rows but the server reports ${serverTotal} — ` +
137
+ "a row cap (e.g. PostgREST max-rows) is truncating pages; lower pageSize below the cap",
138
+ },
139
+ ],
140
+ };
141
+ }
142
+ const failures = [];
143
+ let firstBrokenSeq;
144
+ let expectedPrev = null;
145
+ rows.forEach((row, i) => {
146
+ const seqNum = row.seq === null ? Number.NaN : Number(row.seq);
147
+ const reportSeq = Number.isFinite(seqNum) ? seqNum : i;
148
+ const fail = (reason) => {
149
+ failures.push({ seq: reportSeq, id: row.id, reason });
150
+ if (firstBrokenSeq === undefined)
151
+ firstBrokenSeq = reportSeq;
152
+ };
153
+ if (row.seq === null || row.row_hash === null || row.payload_canonical === null) {
154
+ fail("chain columns missing (row predates the 0002 backfill, or was nulled out)");
155
+ expectedPrev = row.row_hash;
156
+ return;
157
+ }
158
+ // (a) seq continuity — 0-origin, no gaps, no duplicates.
159
+ if (seqNum !== i)
160
+ fail(`seq discontinuity: expected ${i}, found ${row.seq}`);
161
+ // (b) linkage — stored prev_hash must equal the previous row's row_hash.
162
+ if ((row.prev_hash ?? null) !== expectedPrev) {
163
+ fail("prev_hash does not match the previous row_hash (chain broken: row deleted, reordered, or suffix re-hashed)");
164
+ }
165
+ // (c) self-consistency — row_hash must re-derive from this row's own fields.
166
+ const recomputed = sha256Hex(`${row.prev_hash ?? ""}|${row.payload_canonical}`);
167
+ if (recomputed !== row.row_hash) {
168
+ fail(`row_hash mismatch: stored ${row.row_hash}, recomputed ${recomputed}`);
169
+ }
170
+ // (d) scalar cross-check — rebuild the canonical from the row's columns
171
+ // (spec v1 above), carrying over only the PG-side metadata md5 tail.
172
+ const md5Start = row.payload_canonical.lastIndexOf("|") + 1;
173
+ const md5Part = md5Start > 0 ? row.payload_canonical.slice(md5Start) : "";
174
+ if (!MD5_HEX.test(md5Part)) {
175
+ fail("malformed payload_canonical: missing metadata md5 tail");
176
+ }
177
+ else {
178
+ let epochField = null;
179
+ try {
180
+ epochField = String(timestamptzToEpochMicros(row.created_at));
181
+ }
182
+ catch {
183
+ fail(`unparseable created_at "${row.created_at}" — cannot cross-check payload_canonical`);
184
+ }
185
+ if (epochField !== null) {
186
+ const expected = [
187
+ "v1",
188
+ String(row[tenantColumn] ?? ""),
189
+ row.action,
190
+ row.actor_user_id ?? "",
191
+ row.target_table ?? "",
192
+ row.target_id ?? "",
193
+ epochField,
194
+ md5Part,
195
+ ].join("|");
196
+ if (expected !== row.payload_canonical) {
197
+ fail(describeCanonicalMismatch(expected, row.payload_canonical));
198
+ }
199
+ }
200
+ }
201
+ expectedPrev = row.row_hash;
202
+ });
203
+ return {
204
+ ok: failures.length === 0,
205
+ checkedRows: rows.length,
206
+ firstBrokenSeq,
207
+ failures,
208
+ };
209
+ }
210
+ //# sourceMappingURL=audit-chain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit-chain.js","sourceRoot":"","sources":["../src/audit-chain.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  // @e-sig/supabase — SupabaseAuditLogStore
2
2
  //
3
3
  // Append-only AuditLogStore backed by a Postgres table (default `esig_audit_log`)
4
- // via supabase-js. Tenant key column defaults to `tenant_id` (Opendelphi: `org_id`).
4
+ // via supabase-js. Tenant key column defaults to `tenant_id` (override for e.g. `org_id`).
5
5
  export class SupabaseAuditLogStore {
6
6
  sb;
7
7
  table;
@@ -1 +1 @@
1
- {"version":3,"file":"audit-store.js","sourceRoot":"","sources":["../src/audit-store.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAC1C,EAAE;AACF,kFAAkF;AAClF,qFAAqF;AAYrF,MAAM,OAAO,qBAAqB;IAGZ;IAFZ,KAAK,CAAS;IACd,YAAY,CAAS;IAC7B,YAAoB,EAAkB,EAAE,OAAqC,EAAE;QAA3D,OAAE,GAAF,EAAE,CAAgB;QACpC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,gBAAgB,CAAC;QAC5C,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,IAAI,WAAW,CAAC;IACvD,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAoB;QAC/B,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,EAAE;aAClC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;aAChB,MAAM,CAAC;YACN,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,KAAK,CAAC,QAAQ;YACnC,aAAa,EAAE,KAAK,CAAC,WAAW,IAAI,IAAI;YACxC,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,YAAY,EAAE,KAAK,CAAC,WAAW,IAAI,IAAI;YACvC,SAAS,EAAE,KAAK,CAAC,QAAQ,IAAI,IAAI;YACjC,OAAO,EAAE,KAAK,CAAC,MAAM,IAAI,IAAI;YAC7B,gBAAgB,EAAE,KAAK,CAAC,eAAe,IAAI,IAAI;YAC/C,EAAE,EAAE,KAAK,CAAC,EAAE,IAAI,IAAI;YACpB,UAAU,EAAE,KAAK,CAAC,SAAS,IAAI,IAAI;YACnC,UAAU,EAAE,KAAK,CAAC,SAAS,IAAI,IAAI;YACnC,cAAc,EAAE,KAAK,CAAC,YAAY,IAAI,IAAI;YAC1C,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,EAAE;SAC/B,CAAC;aACD,MAAM,CAAC,gBAAgB,CAAC;aACxB,MAAM,EAAE,CAAC;QACZ,IAAI,KAAK,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QACvF,OAAO,EAAE,EAAE,EAAE,IAAI,CAAC,EAAY,EAAE,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,UAAoB,CAAC,EAAE,CAAC;IACnF,CAAC;CACF"}
1
+ {"version":3,"file":"audit-store.js","sourceRoot":"","sources":["../src/audit-store.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAC1C,EAAE;AACF,kFAAkF;AAClF,2FAA2F;AAY3F,MAAM,OAAO,qBAAqB;IAGZ;IAFZ,KAAK,CAAS;IACd,YAAY,CAAS;IAC7B,YAAoB,EAAkB,EAAE,OAAqC,EAAE;QAA3D,OAAE,GAAF,EAAE,CAAgB;QACpC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,gBAAgB,CAAC;QAC5C,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,IAAI,WAAW,CAAC;IACvD,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAoB;QAC/B,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,EAAE;aAClC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;aAChB,MAAM,CAAC;YACN,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,KAAK,CAAC,QAAQ;YACnC,aAAa,EAAE,KAAK,CAAC,WAAW,IAAI,IAAI;YACxC,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,YAAY,EAAE,KAAK,CAAC,WAAW,IAAI,IAAI;YACvC,SAAS,EAAE,KAAK,CAAC,QAAQ,IAAI,IAAI;YACjC,OAAO,EAAE,KAAK,CAAC,MAAM,IAAI,IAAI;YAC7B,gBAAgB,EAAE,KAAK,CAAC,eAAe,IAAI,IAAI;YAC/C,EAAE,EAAE,KAAK,CAAC,EAAE,IAAI,IAAI;YACpB,UAAU,EAAE,KAAK,CAAC,SAAS,IAAI,IAAI;YACnC,UAAU,EAAE,KAAK,CAAC,SAAS,IAAI,IAAI;YACnC,cAAc,EAAE,KAAK,CAAC,YAAY,IAAI,IAAI;YAC1C,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,EAAE;SAC/B,CAAC;aACD,MAAM,CAAC,gBAAgB,CAAC;aACxB,MAAM,EAAE,CAAC;QACZ,IAAI,KAAK,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QACvF,OAAO,EAAE,EAAE,EAAE,IAAI,CAAC,EAAY,EAAE,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,UAAoB,CAAC,EAAE,CAAC;IACnF,CAAC;CACF"}
@@ -3,7 +3,7 @@
3
3
  // CertStore backed by a Postgres table (default `org_signing_certs`) via
4
4
  // supabase-js. Matches the schema in migrations/0001_esig_self_contained.sql.
5
5
  // The tenant key column is `tenant_id` in the bundled migration; pass
6
- // `tenantColumn` if yours differs (Opendelphi uses `org_id`).
6
+ // `tenantColumn` if yours differs (e.g. an existing `org_id` column).
7
7
  function toStoredCert(r, tenantColumn) {
8
8
  // Postgres bytea comes back from PostgREST as a `\x<hex>` string. Decode to
9
9
  // bytes. Legacy rows may be JSON-Buffer-wrapped (`{"type":"Buffer",...}`) by
@@ -1 +1 @@
1
- {"version":3,"file":"cert-store.js","sourceRoot":"","sources":["../src/cert-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cert-store.js","sourceRoot":"","sources":["../src/cert-store.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,EAAE;AACF,yEAAyE;AACzE,8EAA8E;AAC9E,sEAAsE;AACtE,sEAAsE;AA0BtE,SAAS,YAAY,CAAC,CAAa,EAAE,YAAoB;IACvD,4EAA4E;IAC5E,6EAA6E;IAC7E,8EAA8E;IAC9E,kDAAkD;IAClD,IAAI,QAAoB,CAAC;IACzB,MAAM,GAAG,GAAG,CAAC,CAAC,iBAAiB,CAAC;IAChC,IAAI,GAAG,YAAY,UAAU,EAAE,CAAC;QAC9B,QAAQ,GAAG,GAAG,CAAC;IACjB,CAAC;SAAM,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5D,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAC5C,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,SAAS,EAAE,CAAC;YAC1D,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;gBAClE,IAAI,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;oBACrE,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBACtC,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,oCAAoC;YACtC,CAAC;QACH,CAAC;IACH,CAAC;SAAM,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QACnC,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACxC,CAAC;SAAM,CAAC;QACN,QAAQ,GAAG,IAAI,UAAU,EAAE,CAAC;IAC9B,CAAC;IACD,MAAM,QAAQ,GAAI,CAAC,CAAC,YAAgC,CAAY,IAAI,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC;IAClG,OAAO;QACL,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,QAAQ;QACR,OAAO,EAAE,CAAC,CAAC,QAAQ;QACnB,eAAe,EAAE,QAAQ;QACzB,eAAe,EAAE,CAAC,CAAC,gBAAgB;QACnC,SAAS,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC;QACjC,QAAQ,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;QAC/B,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,aAAa,EAAE,CAAC,CAAC,YAAY;QAC7B,SAAS,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC;KAClC,CAAC;AACJ,CAAC;AAED,MAAM,OAAO,iBAAiB;IAGR;IAFZ,KAAK,CAAS;IACd,YAAY,CAAS;IAC7B,YAAoB,EAAkB,EAAE,OAAiC,EAAE;QAAvD,OAAE,GAAF,EAAE,CAAgB;QACpC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,mBAAmB,CAAC;QAC/C,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,IAAI,WAAW,CAAC;IACvD,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,QAAgB;QAC/B,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,EAAE;aAClC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;aAChB,MAAM,CAAC,GAAG,CAAC;aACX,EAAE,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC;aAC/B,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC;aAClB,WAAW,EAAE,CAAC;QACjB,IAAI,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7E,OAAO,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,IAAkB,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC3E,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAKZ;QACC,2EAA2E;QAC3E,0EAA0E;QAC1E,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,eAAe,CAAC;YAClD,CAAC,CAAC,KAAK,CAAC,eAAe;YACvB,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QACvC,MAAM,UAAU,GAAG,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACjD,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,EAAE;aAClC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;aAChB,MAAM,CAAC;YACN,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,KAAK,CAAC,QAAQ;YACnC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC,OAAO;YACjC,iBAAiB,EAAE,UAAU;YAC7B,gBAAgB,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW;YAC7C,UAAU,EAAE,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,WAAW,EAAE;YACnD,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE;YACjD,YAAY,EAAE,KAAK,CAAC,aAAa,IAAI,IAAI;SAC1C,CAAC;aACD,MAAM,EAAE;aACR,MAAM,EAAE,CAAC;QACZ,IAAI,KAAK,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QACnF,OAAO,YAAY,CAAC,IAAkB,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IAC7D,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,EAAU;QACzB,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACxF,IAAI,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAC/E,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,UAAkB;QACnC,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,GAAG,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;QAC5E,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,EAAE;aAClC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;aAChB,MAAM,CAAC,GAAG,CAAC;aACX,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC;aAClB,GAAG,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAC7B,IAAI,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/E,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAe,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;IACnF,CAAC;CACF"}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,6 @@
1
1
  export { SupabaseCertStore, type SupabaseCertStoreOptions, } from "./cert-store.js";
2
+ export { SupabasePqKeyStore, type SupabasePqKeyStoreOptions, } from "./pq-key-store.js";
2
3
  export { SupabaseAuditLogStore, type SupabaseAuditLogStoreOptions, } from "./audit-store.js";
3
4
  export { SupabasePdfStorageStore, type SupabasePdfStorageStoreOptions, } from "./storage.js";
5
+ export { verifyAuditChain, type VerifyAuditChainOptions, type VerifyAuditChainResult, type AuditChainFailure, } from "./audit-chain.js";
4
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAOA,OAAO,EACL,iBAAiB,EACjB,KAAK,wBAAwB,GAC9B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,qBAAqB,EACrB,KAAK,4BAA4B,GAClC,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,uBAAuB,EACvB,KAAK,8BAA8B,GACpC,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AASA,OAAO,EACL,iBAAiB,EACjB,KAAK,wBAAwB,GAC9B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,kBAAkB,EAClB,KAAK,yBAAyB,GAC/B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,qBAAqB,EACrB,KAAK,4BAA4B,GAClC,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,uBAAuB,EACvB,KAAK,8BAA8B,GACpC,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,gBAAgB,EAChB,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,GACvB,MAAM,kBAAkB,CAAC"}
package/dist/index.js CHANGED
@@ -1,10 +1,14 @@
1
1
  // @e-sig/supabase
2
2
  //
3
3
  // Supabase reference implementations of the @e-sig/core persistence
4
- // interfaces (CertStore, AuditLogStore, PdfStorageStore). Pair with the bundled
5
- // migration (migrations/0001_esig_self_contained.sql). Table/bucket/tenant-column
6
- // names are configurable so you can map onto your existing schema.
4
+ // interfaces (CertStore, PqKeyStore, AuditLogStore, PdfStorageStore), plus the
5
+ // verifyAuditChain() tamper-evidence checker for the audit hash chain. Pair
6
+ // with the bundled migrations (migrations/0001_esig_self_contained.sql +
7
+ // 0002_esig_audit_hashchain.sql + 0003_esig_pq_keys.sql). Table/bucket/
8
+ // tenant-column names are configurable so you can map onto your existing schema.
7
9
  export { SupabaseCertStore, } from "./cert-store.js";
10
+ export { SupabasePqKeyStore, } from "./pq-key-store.js";
8
11
  export { SupabaseAuditLogStore, } from "./audit-store.js";
9
12
  export { SupabasePdfStorageStore, } from "./storage.js";
13
+ export { verifyAuditChain, } from "./audit-chain.js";
10
14
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,kBAAkB;AAClB,EAAE;AACF,oEAAoE;AACpE,gFAAgF;AAChF,kFAAkF;AAClF,mEAAmE;AAEnE,OAAO,EACL,iBAAiB,GAElB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,qBAAqB,GAEtB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,uBAAuB,GAExB,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,kBAAkB;AAClB,EAAE;AACF,oEAAoE;AACpE,+EAA+E;AAC/E,4EAA4E;AAC5E,yEAAyE;AACzE,wEAAwE;AACxE,iFAAiF;AAEjF,OAAO,EACL,iBAAiB,GAElB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,kBAAkB,GAEnB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,qBAAqB,GAEtB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,uBAAuB,GAExB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,gBAAgB,GAIjB,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,23 @@
1
+ import type { SupabaseClient } from "@supabase/supabase-js";
2
+ import type { PqKeyStore, StoredPqKeys, PqPublicMaterial } from "@e-sig/core";
3
+ export interface SupabasePqKeyStoreOptions {
4
+ /** Table name. Default `org_pq_keys`. */
5
+ table?: string;
6
+ /** Tenant key column. Default `tenant_id`. */
7
+ tenantColumn?: string;
8
+ }
9
+ export declare class SupabasePqKeyStore implements PqKeyStore {
10
+ private sb;
11
+ private table;
12
+ private tenantColumn;
13
+ constructor(sb: SupabaseClient, opts?: SupabasePqKeyStoreOptions);
14
+ findActive(tenantId: string): Promise<StoredPqKeys | null>;
15
+ insert(input: {
16
+ tenantId: string;
17
+ keyBundleEncrypted: Uint8Array;
18
+ public: PqPublicMaterial;
19
+ rotatedFromId?: string | null;
20
+ }): Promise<StoredPqKeys>;
21
+ deactivate(id: string): Promise<void>;
22
+ }
23
+ //# sourceMappingURL=pq-key-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pq-key-store.d.ts","sourceRoot":"","sources":["../src/pq-key-store.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAgB9E,MAAM,WAAW,yBAAyB;IACxC,yCAAyC;IACzC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8CAA8C;IAC9C,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AA0BD,qBAAa,kBAAmB,YAAW,UAAU;IAGvC,OAAO,CAAC,EAAE;IAFtB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,YAAY,CAAS;gBACT,EAAE,EAAE,cAAc,EAAE,IAAI,GAAE,yBAA8B;IAKtE,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAW1D,MAAM,CAAC,KAAK,EAAE;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,kBAAkB,EAAE,UAAU,CAAC;QAC/B,MAAM,EAAE,gBAAgB,CAAC;QACzB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;KAC/B,GAAG,OAAO,CAAC,YAAY,CAAC;IAwBnB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAI5C"}
@@ -0,0 +1,82 @@
1
+ // @e-sig/supabase — SupabasePqKeyStore
2
+ //
3
+ // PqKeyStore backed by a Postgres table (default `org_pq_keys`) via supabase-js.
4
+ // Matches migrations/0003_esig_pq_keys.sql. Drive it with ensureActivePqKeys /
5
+ // rotatePqKeys from @e-sig/core. Mirrors SupabaseCertStore, including the bytea
6
+ // `\x<hex>` wire-encoding workaround for the encrypted bundle.
7
+ /** Decode a Postgres bytea (`\x<hex>` from PostgREST, or already-bytes) to a Uint8Array. */
8
+ function decodeBytea(raw) {
9
+ if (raw instanceof Uint8Array)
10
+ return raw;
11
+ if (typeof raw === "string" && raw.startsWith("\\x"))
12
+ return Buffer.from(raw.slice(2), "hex");
13
+ if (typeof raw === "string")
14
+ return Buffer.from(raw, "base64");
15
+ return new Uint8Array();
16
+ }
17
+ function toStoredPqKeys(r, tenantColumn) {
18
+ const tenantId = r[tenantColumn] ?? r.tenant_id ?? r.org_id ?? "";
19
+ return {
20
+ id: r.id,
21
+ tenantId,
22
+ keyBundleEncrypted: decodeBytea(r.key_bundle_encrypted),
23
+ ed25519Public: r.ed25519_public,
24
+ mldsa65Public: r.mldsa65_public,
25
+ mldsa65Fpr: r.mldsa65_fpr,
26
+ keyId: r.key_id,
27
+ active: r.active,
28
+ rotatedFromId: r.rotated_from,
29
+ createdAt: new Date(r.created_at),
30
+ };
31
+ }
32
+ export class SupabasePqKeyStore {
33
+ sb;
34
+ table;
35
+ tenantColumn;
36
+ constructor(sb, opts = {}) {
37
+ this.sb = sb;
38
+ this.table = opts.table ?? "org_pq_keys";
39
+ this.tenantColumn = opts.tenantColumn ?? "tenant_id";
40
+ }
41
+ async findActive(tenantId) {
42
+ const { data, error } = await this.sb
43
+ .from(this.table)
44
+ .select("*")
45
+ .eq(this.tenantColumn, tenantId)
46
+ .eq("active", true)
47
+ .maybeSingle();
48
+ if (error)
49
+ throw new Error(`SupabasePqKeyStore.findActive: ${error.message}`);
50
+ return data ? toStoredPqKeys(data, this.tenantColumn) : null;
51
+ }
52
+ async insert(input) {
53
+ // bytea wire encoding: supabase-js JSON-stringifies a Uint8Array, mangling
54
+ // the round-trip. Pre-encode as Postgres bytea-in hex form `\x<hex>`.
55
+ const bytes = Buffer.isBuffer(input.keyBundleEncrypted)
56
+ ? input.keyBundleEncrypted
57
+ : Buffer.from(input.keyBundleEncrypted);
58
+ const hexEncoded = "\\x" + bytes.toString("hex");
59
+ const { data, error } = await this.sb
60
+ .from(this.table)
61
+ .insert({
62
+ [this.tenantColumn]: input.tenantId,
63
+ key_bundle_encrypted: hexEncoded,
64
+ ed25519_public: input.public.ed25519,
65
+ mldsa65_public: input.public.mldsa65,
66
+ mldsa65_fpr: input.public.mldsa65Fpr,
67
+ key_id: input.public.keyId,
68
+ rotated_from: input.rotatedFromId ?? null,
69
+ })
70
+ .select()
71
+ .single();
72
+ if (error || !data)
73
+ throw new Error(`SupabasePqKeyStore.insert: ${error?.message}`);
74
+ return toStoredPqKeys(data, this.tenantColumn);
75
+ }
76
+ async deactivate(id) {
77
+ const { error } = await this.sb.from(this.table).update({ active: false }).eq("id", id);
78
+ if (error)
79
+ throw new Error(`SupabasePqKeyStore.deactivate: ${error.message}`);
80
+ }
81
+ }
82
+ //# sourceMappingURL=pq-key-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pq-key-store.js","sourceRoot":"","sources":["../src/pq-key-store.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@e-sig/supabase",
3
- "version": "0.1.0",
3
+ "version": "0.3.0",
4
4
  "description": "Supabase adapters (CertStore / AuditLogStore / PdfStorageStore) for @e-sig/core — self-contained PDF e-signature persistence on Supabase Postgres + Storage.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -22,7 +22,10 @@
22
22
  "scripts": {
23
23
  "build": "tsc -p tsconfig.build.json",
24
24
  "clean": "rm -rf dist",
25
- "prepublishOnly": "npm run clean && npm run build"
25
+ "prepublishOnly": "npm run clean && npm run build",
26
+ "pretest": "npm run build",
27
+ "test": "vitest run",
28
+ "test:watch": "vitest"
26
29
  },
27
30
  "engines": {
28
31
  "node": ">=20"
@@ -45,13 +48,14 @@
45
48
  "homepage": "https://github.com/vmvtech/esig-suite/tree/main/packages/esig-supabase#readme",
46
49
  "peerDependencies": {
47
50
  "@supabase/supabase-js": ">=2",
48
- "@e-sig/core": "^0.4.0"
51
+ "@e-sig/core": "^0.4.0 || ^0.5.0 || ^0.6.0"
49
52
  },
50
53
  "devDependencies": {
51
54
  "@supabase/supabase-js": "^2.98.0",
52
55
  "@types/node": "^22.0.0",
53
- "@e-sig/core": "^0.4.0",
54
- "typescript": "^5.4.0"
56
+ "@e-sig/core": "^0.6.0",
57
+ "typescript": "^5.4.0",
58
+ "vitest": "^2.1.9"
55
59
  },
56
60
  "publishConfig": {
57
61
  "registry": "https://registry.npmjs.org",