@zanii/subprocessor 0.2.1 → 0.2.2
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.
- package/README.md +4 -0
- package/dist/dpa.d.ts +176 -0
- package/dist/dpa.d.ts.map +1 -0
- package/dist/dpa.js +147 -0
- package/dist/dpa.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/src/dpa.ts +166 -0
- package/src/index.ts +1 -0
package/README.md
CHANGED
|
@@ -36,3 +36,7 @@ breach. dpa/scc transfers with no agreement id are flagged too. Composes
|
|
|
36
36
|
Proves the transfers that were **recorded**. It cannot prove an off-record leak — a
|
|
37
37
|
processor that received plaintext and emitted nothing (that's the enclave/broker problem).
|
|
38
38
|
An agreement id is a reference, not a guarantee the counterparty honored it.
|
|
39
|
+
|
|
40
|
+
## Changelog
|
|
41
|
+
|
|
42
|
+
- **0.2.2** — Model-provider transfers with zero-retention flag, signed DPA versions, Art. 28(3) clause check, Art. 28(2) change notices and objections, fourth-party declarations, transfer impact assessments, AI Act roles, per-object breach propagation, trust-center feed, regulator export.
|
package/dist/dpa.d.ts
ADDED
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The onward-transfer chain in contracts and operations: model-provider calls as
|
|
3
|
+
* transfers, signed DPAs and change notices (Art. 28(2)), fourth-party declarations,
|
|
4
|
+
* transfer impact assessments, AI Act roles, breach propagation, Art. 28(3) clause checks,
|
|
5
|
+
* a trust-center feed and a regulator export. All read the same `Transfer` records.
|
|
6
|
+
*/
|
|
7
|
+
import { type SignedObject } from '@zanii/core';
|
|
8
|
+
import { type Transfer } from './index.js';
|
|
9
|
+
/** Record a call to a model provider as a transfer, flagging zero data retention. */
|
|
10
|
+
export declare function modelProviderTransfer(input: {
|
|
11
|
+
from: string;
|
|
12
|
+
provider: string;
|
|
13
|
+
model: string;
|
|
14
|
+
zeroRetention: boolean;
|
|
15
|
+
dpaId?: string;
|
|
16
|
+
region?: string;
|
|
17
|
+
ref?: string;
|
|
18
|
+
ts: string;
|
|
19
|
+
}): {
|
|
20
|
+
target: string;
|
|
21
|
+
payload: Record<string, unknown>;
|
|
22
|
+
};
|
|
23
|
+
export type SignedDpa = SignedObject<{
|
|
24
|
+
v: 1;
|
|
25
|
+
type: 'subprocessor.dpa';
|
|
26
|
+
processor: string;
|
|
27
|
+
version: string;
|
|
28
|
+
effective: string;
|
|
29
|
+
clauses: string[];
|
|
30
|
+
document: string;
|
|
31
|
+
}>;
|
|
32
|
+
/** A DPA version, signed by the controller, naming the document by hash. */
|
|
33
|
+
export declare function signDpa(input: {
|
|
34
|
+
processor: string;
|
|
35
|
+
version: string;
|
|
36
|
+
effective: string;
|
|
37
|
+
clauses: string[];
|
|
38
|
+
documentHash: string;
|
|
39
|
+
}, privateKey: Uint8Array): SignedDpa;
|
|
40
|
+
/** The DPA in force for a processor at a time: the latest valid version effective by then. */
|
|
41
|
+
export declare function dpaInForce(dpas: SignedDpa[], processor: string, at: string, trustedSigners?: string[]): SignedDpa | null;
|
|
42
|
+
/** Art. 28(3) GDPR: what a processor contract must cover. */
|
|
43
|
+
export declare const ART28_CLAUSES: readonly ["documented-instructions", "confidentiality", "security-art32", "subprocessor-conditions", "data-subject-assistance", "controller-assistance-art32-36", "deletion-or-return", "audit-rights"];
|
|
44
|
+
export declare function contractualMinimums(clauses: string[], required?: readonly string[]): {
|
|
45
|
+
ok: boolean;
|
|
46
|
+
missing: string[];
|
|
47
|
+
};
|
|
48
|
+
export type ChangeNotice = SignedObject<{
|
|
49
|
+
v: 1;
|
|
50
|
+
type: 'subprocessor.change_notice';
|
|
51
|
+
subprocessor: string;
|
|
52
|
+
purpose: string;
|
|
53
|
+
region?: string;
|
|
54
|
+
effective: string;
|
|
55
|
+
ts: string;
|
|
56
|
+
}>;
|
|
57
|
+
export type Objection = SignedObject<{
|
|
58
|
+
v: 1;
|
|
59
|
+
type: 'subprocessor.objection';
|
|
60
|
+
notice: string;
|
|
61
|
+
reason: string;
|
|
62
|
+
ts: string;
|
|
63
|
+
}>;
|
|
64
|
+
/** The processor gives prior notice of a new subprocessor; it takes effect after `noticeDays`. */
|
|
65
|
+
export declare function changeNotice(input: {
|
|
66
|
+
subprocessor: string;
|
|
67
|
+
purpose: string;
|
|
68
|
+
region?: string;
|
|
69
|
+
noticeDays?: number;
|
|
70
|
+
ts?: string;
|
|
71
|
+
}, processorPrivateKey: Uint8Array): ChangeNotice;
|
|
72
|
+
/** A customer objects within the notice period. */
|
|
73
|
+
export declare function objectTo(notice: ChangeNotice, reason: string, customerPrivateKey: Uint8Array, ts?: string): Objection;
|
|
74
|
+
/** Where a change stands: in its notice period, objected to in time, or effective. */
|
|
75
|
+
export declare function changeStatus(notice: ChangeNotice, objections: Objection[], now?: string): {
|
|
76
|
+
status: "invalid";
|
|
77
|
+
objectors: string[];
|
|
78
|
+
} | {
|
|
79
|
+
status: "objected";
|
|
80
|
+
objectors: string[];
|
|
81
|
+
} | {
|
|
82
|
+
status: "notice-period" | "effective";
|
|
83
|
+
objectors: string[];
|
|
84
|
+
};
|
|
85
|
+
export type SubprocessorDeclaration = SignedObject<{
|
|
86
|
+
v: 1;
|
|
87
|
+
type: 'subprocessor.declaration';
|
|
88
|
+
subprocessors: string[];
|
|
89
|
+
ts: string;
|
|
90
|
+
}>;
|
|
91
|
+
/** A provider declares its own subprocessors, signed with its DID. */
|
|
92
|
+
export declare function declareSubprocessors(subprocessors: string[], providerPrivateKey: Uint8Array, ts?: string): SubprocessorDeclaration;
|
|
93
|
+
/** The supply chain from a root through signed declarations, with each party's depth. Parties without a declaration are leaves. */
|
|
94
|
+
export declare function supplyChain(root: string, declarations: SubprocessorDeclaration[], maxDepth?: number): {
|
|
95
|
+
parties: {
|
|
96
|
+
[k: string]: number;
|
|
97
|
+
};
|
|
98
|
+
edges: {
|
|
99
|
+
from: string;
|
|
100
|
+
to: string;
|
|
101
|
+
}[];
|
|
102
|
+
undeclaredBelow: string[];
|
|
103
|
+
};
|
|
104
|
+
export declare const SUPPLEMENTARY_MEASURES: readonly ["exporter-held-keys", "pseudonymisation", "split-processing", "transparency-reporting", "challenge-requests"];
|
|
105
|
+
/**
|
|
106
|
+
* A recorded transfer impact assessment (after Schrems II). Where public-authority access risk
|
|
107
|
+
* is high, a technical measure that keeps data unintelligible to the importer is needed to
|
|
108
|
+
* proceed. A structured record of the assessment, not legal advice.
|
|
109
|
+
*/
|
|
110
|
+
export declare function transferImpactAssessment(input: {
|
|
111
|
+
destination: string;
|
|
112
|
+
mechanism: 'scc' | 'bcr' | 'adequacy' | 'derogation';
|
|
113
|
+
accessRisk: 'low' | 'medium' | 'high';
|
|
114
|
+
measures: string[];
|
|
115
|
+
assessedBy: string;
|
|
116
|
+
ts: string;
|
|
117
|
+
}): {
|
|
118
|
+
hash: string;
|
|
119
|
+
outcome: string;
|
|
120
|
+
destination: string;
|
|
121
|
+
mechanism: "scc" | "bcr" | "adequacy" | "derogation";
|
|
122
|
+
accessRisk: "low" | "medium" | "high";
|
|
123
|
+
measures: string[];
|
|
124
|
+
assessedBy: string;
|
|
125
|
+
ts: string;
|
|
126
|
+
v: number;
|
|
127
|
+
type: string;
|
|
128
|
+
};
|
|
129
|
+
export type AiActRole = 'provider' | 'deployer' | 'importer' | 'distributor' | 'authorised-representative';
|
|
130
|
+
/** Annotate each transfer edge with the parties' AI Act roles; edges with an unknown role are listed. */
|
|
131
|
+
export declare function aiActRoles(transfers: Transfer[], roles: Record<string, AiActRole>): {
|
|
132
|
+
edges: {
|
|
133
|
+
from: string;
|
|
134
|
+
to: string;
|
|
135
|
+
fromRole: AiActRole | null;
|
|
136
|
+
toRole: AiActRole | null;
|
|
137
|
+
}[];
|
|
138
|
+
unknown: string[];
|
|
139
|
+
};
|
|
140
|
+
/**
|
|
141
|
+
* After a breach at one party: which data objects had reached it, and through which senders.
|
|
142
|
+
* Traced per object (`ref`), so another object that merely shared an intermediary is not
|
|
143
|
+
* implicated; transfers without a ref are traced together as one group.
|
|
144
|
+
*/
|
|
145
|
+
export declare function breachPropagation(transfers: Transfer[], breached: string): {
|
|
146
|
+
upstream: string[];
|
|
147
|
+
objects: string[];
|
|
148
|
+
};
|
|
149
|
+
/** A public subprocessor list from recorded transfers: first and last seen per declared party, plus declared-but-unused. */
|
|
150
|
+
export declare function trustCenterFeed(transfers: Transfer[], declared: Array<{
|
|
151
|
+
name: string;
|
|
152
|
+
purpose: string;
|
|
153
|
+
region?: string;
|
|
154
|
+
}>): {
|
|
155
|
+
subprocessors: {
|
|
156
|
+
inUse: boolean;
|
|
157
|
+
firstSeen: string | null;
|
|
158
|
+
lastSeen: string | null;
|
|
159
|
+
name: string;
|
|
160
|
+
purpose: string;
|
|
161
|
+
region?: string;
|
|
162
|
+
}[];
|
|
163
|
+
generatedFrom: number;
|
|
164
|
+
};
|
|
165
|
+
/** One export for a supervisor: nodes, edges, verdict and a hash over all of it. */
|
|
166
|
+
export declare function regulatorExport(transfers: Transfer[], declared: string[], controller: string): {
|
|
167
|
+
hash: string;
|
|
168
|
+
v: number;
|
|
169
|
+
type: string;
|
|
170
|
+
controller: string;
|
|
171
|
+
declared: string[];
|
|
172
|
+
graph: import("./index.js").SubprocessorGraph;
|
|
173
|
+
verdict: import("./index.js").TransferCheck;
|
|
174
|
+
transfers: string[];
|
|
175
|
+
};
|
|
176
|
+
//# sourceMappingURL=dpa.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dpa.d.ts","sourceRoot":"","sources":["../src/dpa.ts"],"names":[],"mappings":"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"}
|
package/dist/dpa.js
ADDED
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The onward-transfer chain in contracts and operations: model-provider calls as
|
|
3
|
+
* transfers, signed DPAs and change notices (Art. 28(2)), fourth-party declarations,
|
|
4
|
+
* transfer impact assessments, AI Act roles, breach propagation, Art. 28(3) clause checks,
|
|
5
|
+
* a trust-center feed and a regulator export. All read the same `Transfer` records.
|
|
6
|
+
*/
|
|
7
|
+
import { jcsHash, signObject, verifySignedObject } from '@zanii/core';
|
|
8
|
+
import { buildTransfer, subprocessorGraph, verifyTransfers } from './index.js';
|
|
9
|
+
// ------------------------------------------------------------------------------ //
|
|
10
|
+
// Transfers and agreements
|
|
11
|
+
// ------------------------------------------------------------------------------ //
|
|
12
|
+
/** Record a call to a model provider as a transfer, flagging zero data retention. */
|
|
13
|
+
export function modelProviderTransfer(input) {
|
|
14
|
+
return buildTransfer({ from: input.from, to: input.provider, agreement: input.zeroRetention ? { type: 'zero-retention', id: input.dpaId } : { type: 'dpa', id: input.dpaId }, ts: input.ts, junction: `model:${input.model}`, ...(input.region ? { region: input.region } : {}), ...(input.ref ? { ref: input.ref } : {}) });
|
|
15
|
+
}
|
|
16
|
+
/** A DPA version, signed by the controller, naming the document by hash. */
|
|
17
|
+
export function signDpa(input, privateKey) {
|
|
18
|
+
return signObject({ v: 1, type: 'subprocessor.dpa', processor: input.processor, version: input.version, effective: input.effective, clauses: input.clauses, document: input.documentHash }, privateKey);
|
|
19
|
+
}
|
|
20
|
+
/** The DPA in force for a processor at a time: the latest valid version effective by then. */
|
|
21
|
+
export function dpaInForce(dpas, processor, at, trustedSigners) {
|
|
22
|
+
return dpas.filter((d) => d.processor === processor && d.effective <= at && verifySignedObject(d) && (!trustedSigners || trustedSigners.includes(d.signer))).sort((a, b) => a.effective.localeCompare(b.effective)).at(-1) ?? null;
|
|
23
|
+
}
|
|
24
|
+
/** Art. 28(3) GDPR: what a processor contract must cover. */
|
|
25
|
+
export const ART28_CLAUSES = ['documented-instructions', 'confidentiality', 'security-art32', 'subprocessor-conditions', 'data-subject-assistance', 'controller-assistance-art32-36', 'deletion-or-return', 'audit-rights'];
|
|
26
|
+
export function contractualMinimums(clauses, required = ART28_CLAUSES) {
|
|
27
|
+
const missing = required.filter((c) => !clauses.includes(c));
|
|
28
|
+
return { ok: missing.length === 0, missing };
|
|
29
|
+
}
|
|
30
|
+
/** The processor gives prior notice of a new subprocessor; it takes effect after `noticeDays`. */
|
|
31
|
+
export function changeNotice(input, processorPrivateKey) {
|
|
32
|
+
const ts = input.ts ?? new Date().toISOString();
|
|
33
|
+
return signObject({ v: 1, type: 'subprocessor.change_notice', subprocessor: input.subprocessor, purpose: input.purpose, ...(input.region ? { region: input.region } : {}), effective: new Date(Date.parse(ts) + (input.noticeDays ?? 30) * 86_400_000).toISOString(), ts }, processorPrivateKey);
|
|
34
|
+
}
|
|
35
|
+
/** A customer objects within the notice period. */
|
|
36
|
+
export function objectTo(notice, reason, customerPrivateKey, ts = new Date().toISOString()) {
|
|
37
|
+
return signObject({ v: 1, type: 'subprocessor.objection', notice: jcsHash(notice), reason, ts }, customerPrivateKey);
|
|
38
|
+
}
|
|
39
|
+
/** Where a change stands: in its notice period, objected to in time, or effective. */
|
|
40
|
+
export function changeStatus(notice, objections, now = new Date().toISOString()) {
|
|
41
|
+
if (!verifySignedObject(notice))
|
|
42
|
+
return { status: 'invalid', objectors: [] };
|
|
43
|
+
const timely = objections.filter((o) => o.notice === jcsHash(notice) && o.ts < notice.effective && verifySignedObject(o));
|
|
44
|
+
const objectors = [...new Set(timely.map((o) => o.signer))];
|
|
45
|
+
if (objectors.length)
|
|
46
|
+
return { status: 'objected', objectors };
|
|
47
|
+
return { status: now < notice.effective ? 'notice-period' : 'effective', objectors };
|
|
48
|
+
}
|
|
49
|
+
/** A provider declares its own subprocessors, signed with its DID. */
|
|
50
|
+
export function declareSubprocessors(subprocessors, providerPrivateKey, ts = new Date().toISOString()) {
|
|
51
|
+
return signObject({ v: 1, type: 'subprocessor.declaration', subprocessors: [...subprocessors].sort(), ts }, providerPrivateKey);
|
|
52
|
+
}
|
|
53
|
+
/** The supply chain from a root through signed declarations, with each party's depth. Parties without a declaration are leaves. */
|
|
54
|
+
export function supplyChain(root, declarations, maxDepth = 6) {
|
|
55
|
+
const latest = new Map();
|
|
56
|
+
for (const d of declarations.filter(verifySignedObject))
|
|
57
|
+
if (!latest.has(d.signer) || latest.get(d.signer).ts < d.ts)
|
|
58
|
+
latest.set(d.signer, d);
|
|
59
|
+
const depth = new Map([[root, 0]]);
|
|
60
|
+
const edges = [];
|
|
61
|
+
const queue = [root];
|
|
62
|
+
while (queue.length) {
|
|
63
|
+
const p = queue.shift();
|
|
64
|
+
const d = depth.get(p);
|
|
65
|
+
if (d >= maxDepth)
|
|
66
|
+
continue;
|
|
67
|
+
for (const s of latest.get(p)?.subprocessors ?? []) {
|
|
68
|
+
edges.push({ from: p, to: s });
|
|
69
|
+
if (!depth.has(s)) {
|
|
70
|
+
depth.set(s, d + 1);
|
|
71
|
+
queue.push(s);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return { parties: Object.fromEntries(depth), edges, undeclaredBelow: [...depth.keys()].filter((p) => p !== root && !latest.has(p)) };
|
|
76
|
+
}
|
|
77
|
+
export const SUPPLEMENTARY_MEASURES = ['exporter-held-keys', 'pseudonymisation', 'split-processing', 'transparency-reporting', 'challenge-requests'];
|
|
78
|
+
/**
|
|
79
|
+
* A recorded transfer impact assessment (after Schrems II). Where public-authority access risk
|
|
80
|
+
* is high, a technical measure that keeps data unintelligible to the importer is needed to
|
|
81
|
+
* proceed. A structured record of the assessment, not legal advice.
|
|
82
|
+
*/
|
|
83
|
+
export function transferImpactAssessment(input) {
|
|
84
|
+
const technical = input.measures.some((m) => m === 'exporter-held-keys' || m === 'pseudonymisation' || m === 'split-processing');
|
|
85
|
+
const outcome = input.mechanism === 'adequacy' || input.accessRisk === 'low' ? 'proceed' : input.accessRisk === 'medium' ? (input.measures.length ? 'proceed-with-measures' : 'review') : technical ? 'proceed-with-measures' : 'suspend';
|
|
86
|
+
const record = { v: 1, type: 'subprocessor.tia', ...input, outcome };
|
|
87
|
+
return { ...record, hash: jcsHash(record) };
|
|
88
|
+
}
|
|
89
|
+
/** Annotate each transfer edge with the parties' AI Act roles; edges with an unknown role are listed. */
|
|
90
|
+
export function aiActRoles(transfers, roles) {
|
|
91
|
+
const edges = transfers.map((t) => ({ from: t.from, to: t.to, fromRole: roles[t.from] ?? null, toRole: roles[t.to] ?? null }));
|
|
92
|
+
return { edges, unknown: [...new Set(edges.flatMap((e) => [...(e.fromRole ? [] : [e.from]), ...(e.toRole ? [] : [e.to])]))].sort() };
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* After a breach at one party: which data objects had reached it, and through which senders.
|
|
96
|
+
* Traced per object (`ref`), so another object that merely shared an intermediary is not
|
|
97
|
+
* implicated; transfers without a ref are traced together as one group.
|
|
98
|
+
*/
|
|
99
|
+
export function breachPropagation(transfers, breached) {
|
|
100
|
+
const groups = new Map();
|
|
101
|
+
for (const t of transfers)
|
|
102
|
+
groups.set(t.ref ?? '', [...(groups.get(t.ref ?? '') ?? []), t]);
|
|
103
|
+
const upstream = new Set();
|
|
104
|
+
const objects = new Set();
|
|
105
|
+
for (const [ref, ts] of groups) {
|
|
106
|
+
const reached = new Set([breached]);
|
|
107
|
+
let grew = true;
|
|
108
|
+
while (grew) {
|
|
109
|
+
grew = false;
|
|
110
|
+
for (const t of ts)
|
|
111
|
+
if (reached.has(t.to) && !reached.has(t.from)) {
|
|
112
|
+
reached.add(t.from);
|
|
113
|
+
grew = true;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
reached.delete(breached);
|
|
117
|
+
if (reached.size === 0)
|
|
118
|
+
continue;
|
|
119
|
+
reached.forEach((p) => upstream.add(p));
|
|
120
|
+
if (ref)
|
|
121
|
+
objects.add(ref);
|
|
122
|
+
}
|
|
123
|
+
return { upstream: [...upstream].sort(), objects: [...objects].sort() };
|
|
124
|
+
}
|
|
125
|
+
// ------------------------------------------------------------------------------ //
|
|
126
|
+
// Publishing
|
|
127
|
+
// ------------------------------------------------------------------------------ //
|
|
128
|
+
/** A public subprocessor list from recorded transfers: first and last seen per declared party, plus declared-but-unused. */
|
|
129
|
+
export function trustCenterFeed(transfers, declared) {
|
|
130
|
+
const seen = new Map();
|
|
131
|
+
for (const t of transfers) {
|
|
132
|
+
const s = seen.get(t.to);
|
|
133
|
+
seen.set(t.to, s ? { first: s.first < t.ts ? s.first : t.ts, last: s.last > t.ts ? s.last : t.ts, count: s.count + 1 } : { first: t.ts, last: t.ts, count: 1 });
|
|
134
|
+
}
|
|
135
|
+
return {
|
|
136
|
+
subprocessors: declared.map((d) => ({ ...d, inUse: seen.has(d.name), firstSeen: seen.get(d.name)?.first ?? null, lastSeen: seen.get(d.name)?.last ?? null })),
|
|
137
|
+
generatedFrom: transfers.length,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
/** One export for a supervisor: nodes, edges, verdict and a hash over all of it. */
|
|
141
|
+
export function regulatorExport(transfers, declared, controller) {
|
|
142
|
+
const graph = subprocessorGraph(transfers, declared, { controller });
|
|
143
|
+
const verdict = verifyTransfers(transfers, declared, { controller });
|
|
144
|
+
const body = { v: 1, type: 'subprocessor.regulator_export', controller, declared: [...declared].sort(), graph, verdict, transfers: transfers.map((t) => jcsHash(t)) };
|
|
145
|
+
return { ...body, hash: jcsHash(body) };
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=dpa.js.map
|
package/dist/dpa.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dpa.js","sourceRoot":"","sources":["../src/dpa.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAuBA,MAAM,WAAW,SAAS;IACxB,0EAA0E;IAC1E,IAAI,EAAE,gBAAgB,GAAG,KAAK,GAAG,KAAK,GAAG,OAAO,CAAC;IACjD,0CAA0C;IAC1C,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,QAAQ;IACvB,CAAC,EAAE,CAAC,CAAC;IACL,IAAI,EAAE,uBAAuB,CAAC;IAC9B,4EAA4E;IAC5E,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,sDAAsD;IACtD,IAAI,EAAE,MAAM,CAAC;IACb,uEAAuE;IACvE,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,SAAS,CAAC;IACrB,qEAAqE;IACrE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iFAAiF;IACjF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,SAAS,CAAC;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAQD,mGAAmG;AACnG,wBAAgB,aAAa,CAAC,KAAK,EAAE,aAAa,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAiBxG;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,QAAQ,GAAG,MAAM,CAEhD;AAED,MAAM,WAAW,iBAAiB;IAChC,wDAAwD;IACxD,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,yBAAyB;IACzB,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,SAAS,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC7E,wEAAwE;IACxE,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,sEAAsE;IACtE,oBAAoB,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxD,6FAA6F;IAC7F,SAAS,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACrD;AAWD;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,iBAAiB,CA6B9H;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,aAAa,CAOxH"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAuBA,MAAM,WAAW,SAAS;IACxB,0EAA0E;IAC1E,IAAI,EAAE,gBAAgB,GAAG,KAAK,GAAG,KAAK,GAAG,OAAO,CAAC;IACjD,0CAA0C;IAC1C,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,QAAQ;IACvB,CAAC,EAAE,CAAC,CAAC;IACL,IAAI,EAAE,uBAAuB,CAAC;IAC9B,4EAA4E;IAC5E,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,sDAAsD;IACtD,IAAI,EAAE,MAAM,CAAC;IACb,uEAAuE;IACvE,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,SAAS,CAAC;IACrB,qEAAqE;IACrE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iFAAiF;IACjF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,SAAS,CAAC;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAQD,mGAAmG;AACnG,wBAAgB,aAAa,CAAC,KAAK,EAAE,aAAa,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAiBxG;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,QAAQ,GAAG,MAAM,CAEhD;AAED,MAAM,WAAW,iBAAiB;IAChC,wDAAwD;IACxD,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,yBAAyB;IACzB,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,SAAS,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC7E,wEAAwE;IACxE,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,sEAAsE;IACtE,oBAAoB,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxD,6FAA6F;IAC7F,SAAS,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACrD;AAWD;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,iBAAiB,CA6B9H;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,aAAa,CAOxH;AACD,cAAc,UAAU,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -124,4 +124,5 @@ export function verifyTransfers(transfers, declared, opts) {
|
|
|
124
124
|
reasons.push(`transfer to '${m.to}' at ${m.ts} has no agreement id (dpa/scc requires one)`);
|
|
125
125
|
return { ok: reasons.length === 0, reasons };
|
|
126
126
|
}
|
|
127
|
+
export * from './dpa.js';
|
|
127
128
|
//# 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":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zanii/subprocessor",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.2",
|
|
4
4
|
"description": "Prove the onward-transfer chain - which downstream processors actually saw the data, under which agreement (zero-retention, DPA id), tied to the junction/settlement. Answers the exact GDPR Art. 28 question every AI DPA raises: 'you sent my data to OpenAI, who sent it where?' A transfer to a party not in the declared subprocessor list is a provable, flagged violation. Proves recorded transfers; an off-record leak needs an attested enclave.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"homepage": "https://ledger.zanii.agency",
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
"vitest": "^3.0.9"
|
|
32
32
|
},
|
|
33
33
|
"dependencies": {
|
|
34
|
-
"@zanii/core": "^0.5.
|
|
34
|
+
"@zanii/core": "^0.5.4"
|
|
35
35
|
},
|
|
36
36
|
"scripts": {
|
|
37
37
|
"build": "tsc -p tsconfig.build.json",
|
package/src/dpa.ts
ADDED
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The onward-transfer chain in contracts and operations: model-provider calls as
|
|
3
|
+
* transfers, signed DPAs and change notices (Art. 28(2)), fourth-party declarations,
|
|
4
|
+
* transfer impact assessments, AI Act roles, breach propagation, Art. 28(3) clause checks,
|
|
5
|
+
* a trust-center feed and a regulator export. All read the same `Transfer` records.
|
|
6
|
+
*/
|
|
7
|
+
import { jcsHash, signObject, verifySignedObject, type SignedObject } from '@zanii/core';
|
|
8
|
+
import { buildTransfer, subprocessorGraph, verifyTransfers, type Transfer } from './index.js';
|
|
9
|
+
|
|
10
|
+
// ------------------------------------------------------------------------------ //
|
|
11
|
+
// Transfers and agreements
|
|
12
|
+
// ------------------------------------------------------------------------------ //
|
|
13
|
+
|
|
14
|
+
/** Record a call to a model provider as a transfer, flagging zero data retention. */
|
|
15
|
+
export function modelProviderTransfer(input: { from: string; provider: string; model: string; zeroRetention: boolean; dpaId?: string; region?: string; ref?: string; ts: string }) {
|
|
16
|
+
return buildTransfer({ from: input.from, to: input.provider, agreement: input.zeroRetention ? { type: 'zero-retention', id: input.dpaId } : { type: 'dpa', id: input.dpaId }, ts: input.ts, junction: `model:${input.model}`, ...(input.region ? { region: input.region } : {}), ...(input.ref ? { ref: input.ref } : {}) });
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export type SignedDpa = SignedObject<{ v: 1; type: 'subprocessor.dpa'; processor: string; version: string; effective: string; clauses: string[]; document: string }>;
|
|
20
|
+
|
|
21
|
+
/** A DPA version, signed by the controller, naming the document by hash. */
|
|
22
|
+
export function signDpa(input: { processor: string; version: string; effective: string; clauses: string[]; documentHash: string }, privateKey: Uint8Array): SignedDpa {
|
|
23
|
+
return signObject({ v: 1 as const, type: 'subprocessor.dpa' as const, processor: input.processor, version: input.version, effective: input.effective, clauses: input.clauses, document: input.documentHash }, privateKey);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/** The DPA in force for a processor at a time: the latest valid version effective by then. */
|
|
27
|
+
export function dpaInForce(dpas: SignedDpa[], processor: string, at: string, trustedSigners?: string[]): SignedDpa | null {
|
|
28
|
+
return dpas.filter((d) => d.processor === processor && d.effective <= at && verifySignedObject(d) && (!trustedSigners || trustedSigners.includes(d.signer))).sort((a, b) => a.effective.localeCompare(b.effective)).at(-1) ?? null;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/** Art. 28(3) GDPR: what a processor contract must cover. */
|
|
32
|
+
export const ART28_CLAUSES = ['documented-instructions', 'confidentiality', 'security-art32', 'subprocessor-conditions', 'data-subject-assistance', 'controller-assistance-art32-36', 'deletion-or-return', 'audit-rights'] as const;
|
|
33
|
+
|
|
34
|
+
export function contractualMinimums(clauses: string[], required: readonly string[] = ART28_CLAUSES) {
|
|
35
|
+
const missing = required.filter((c) => !clauses.includes(c));
|
|
36
|
+
return { ok: missing.length === 0, missing };
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// ------------------------------------------------------------------------------ //
|
|
40
|
+
// Change notices and objections (Art. 28(2))
|
|
41
|
+
// ------------------------------------------------------------------------------ //
|
|
42
|
+
|
|
43
|
+
export type ChangeNotice = SignedObject<{ v: 1; type: 'subprocessor.change_notice'; subprocessor: string; purpose: string; region?: string; effective: string; ts: string }>;
|
|
44
|
+
export type Objection = SignedObject<{ v: 1; type: 'subprocessor.objection'; notice: string; reason: string; ts: string }>;
|
|
45
|
+
|
|
46
|
+
/** The processor gives prior notice of a new subprocessor; it takes effect after `noticeDays`. */
|
|
47
|
+
export function changeNotice(input: { subprocessor: string; purpose: string; region?: string; noticeDays?: number; ts?: string }, processorPrivateKey: Uint8Array): ChangeNotice {
|
|
48
|
+
const ts = input.ts ?? new Date().toISOString();
|
|
49
|
+
return signObject({ v: 1 as const, type: 'subprocessor.change_notice' as const, subprocessor: input.subprocessor, purpose: input.purpose, ...(input.region ? { region: input.region } : {}), effective: new Date(Date.parse(ts) + (input.noticeDays ?? 30) * 86_400_000).toISOString(), ts }, processorPrivateKey);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/** A customer objects within the notice period. */
|
|
53
|
+
export function objectTo(notice: ChangeNotice, reason: string, customerPrivateKey: Uint8Array, ts = new Date().toISOString()): Objection {
|
|
54
|
+
return signObject({ v: 1 as const, type: 'subprocessor.objection' as const, notice: jcsHash(notice), reason, ts }, customerPrivateKey);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/** Where a change stands: in its notice period, objected to in time, or effective. */
|
|
58
|
+
export function changeStatus(notice: ChangeNotice, objections: Objection[], now = new Date().toISOString()) {
|
|
59
|
+
if (!verifySignedObject(notice)) return { status: 'invalid' as const, objectors: [] as string[] };
|
|
60
|
+
const timely = objections.filter((o) => o.notice === jcsHash(notice) && o.ts < notice.effective && verifySignedObject(o));
|
|
61
|
+
const objectors = [...new Set(timely.map((o) => o.signer))];
|
|
62
|
+
if (objectors.length) return { status: 'objected' as const, objectors };
|
|
63
|
+
return { status: now < notice.effective ? ('notice-period' as const) : ('effective' as const), objectors };
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// ------------------------------------------------------------------------------ //
|
|
67
|
+
// Fourth parties, assessments, roles
|
|
68
|
+
// ------------------------------------------------------------------------------ //
|
|
69
|
+
|
|
70
|
+
export type SubprocessorDeclaration = SignedObject<{ v: 1; type: 'subprocessor.declaration'; subprocessors: string[]; ts: string }>;
|
|
71
|
+
|
|
72
|
+
/** A provider declares its own subprocessors, signed with its DID. */
|
|
73
|
+
export function declareSubprocessors(subprocessors: string[], providerPrivateKey: Uint8Array, ts = new Date().toISOString()): SubprocessorDeclaration {
|
|
74
|
+
return signObject({ v: 1 as const, type: 'subprocessor.declaration' as const, subprocessors: [...subprocessors].sort(), ts }, providerPrivateKey);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/** The supply chain from a root through signed declarations, with each party's depth. Parties without a declaration are leaves. */
|
|
78
|
+
export function supplyChain(root: string, declarations: SubprocessorDeclaration[], maxDepth = 6) {
|
|
79
|
+
const latest = new Map<string, SubprocessorDeclaration>();
|
|
80
|
+
for (const d of declarations.filter(verifySignedObject)) if (!latest.has(d.signer) || latest.get(d.signer)!.ts < d.ts) latest.set(d.signer, d);
|
|
81
|
+
const depth = new Map<string, number>([[root, 0]]);
|
|
82
|
+
const edges: Array<{ from: string; to: string }> = [];
|
|
83
|
+
const queue = [root];
|
|
84
|
+
while (queue.length) {
|
|
85
|
+
const p = queue.shift()!;
|
|
86
|
+
const d = depth.get(p)!;
|
|
87
|
+
if (d >= maxDepth) continue;
|
|
88
|
+
for (const s of latest.get(p)?.subprocessors ?? []) {
|
|
89
|
+
edges.push({ from: p, to: s });
|
|
90
|
+
if (!depth.has(s)) { depth.set(s, d + 1); queue.push(s); }
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return { parties: Object.fromEntries(depth), edges, undeclaredBelow: [...depth.keys()].filter((p) => p !== root && !latest.has(p)) };
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export const SUPPLEMENTARY_MEASURES = ['exporter-held-keys', 'pseudonymisation', 'split-processing', 'transparency-reporting', 'challenge-requests'] as const;
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* A recorded transfer impact assessment (after Schrems II). Where public-authority access risk
|
|
100
|
+
* is high, a technical measure that keeps data unintelligible to the importer is needed to
|
|
101
|
+
* proceed. A structured record of the assessment, not legal advice.
|
|
102
|
+
*/
|
|
103
|
+
export function transferImpactAssessment(input: { destination: string; mechanism: 'scc' | 'bcr' | 'adequacy' | 'derogation'; accessRisk: 'low' | 'medium' | 'high'; measures: string[]; assessedBy: string; ts: string }) {
|
|
104
|
+
const technical = input.measures.some((m) => m === 'exporter-held-keys' || m === 'pseudonymisation' || m === 'split-processing');
|
|
105
|
+
const outcome = input.mechanism === 'adequacy' || input.accessRisk === 'low' ? 'proceed' : input.accessRisk === 'medium' ? (input.measures.length ? 'proceed-with-measures' : 'review') : technical ? 'proceed-with-measures' : 'suspend';
|
|
106
|
+
const record = { v: 1, type: 'subprocessor.tia', ...input, outcome };
|
|
107
|
+
return { ...record, hash: jcsHash(record) };
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
export type AiActRole = 'provider' | 'deployer' | 'importer' | 'distributor' | 'authorised-representative';
|
|
111
|
+
|
|
112
|
+
/** Annotate each transfer edge with the parties' AI Act roles; edges with an unknown role are listed. */
|
|
113
|
+
export function aiActRoles(transfers: Transfer[], roles: Record<string, AiActRole>) {
|
|
114
|
+
const edges = transfers.map((t) => ({ from: t.from, to: t.to, fromRole: roles[t.from] ?? null, toRole: roles[t.to] ?? null }));
|
|
115
|
+
return { edges, unknown: [...new Set(edges.flatMap((e) => [...(e.fromRole ? [] : [e.from]), ...(e.toRole ? [] : [e.to])]))].sort() };
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* After a breach at one party: which data objects had reached it, and through which senders.
|
|
120
|
+
* Traced per object (`ref`), so another object that merely shared an intermediary is not
|
|
121
|
+
* implicated; transfers without a ref are traced together as one group.
|
|
122
|
+
*/
|
|
123
|
+
export function breachPropagation(transfers: Transfer[], breached: string) {
|
|
124
|
+
const groups = new Map<string, Transfer[]>();
|
|
125
|
+
for (const t of transfers) groups.set(t.ref ?? '', [...(groups.get(t.ref ?? '') ?? []), t]);
|
|
126
|
+
const upstream = new Set<string>();
|
|
127
|
+
const objects = new Set<string>();
|
|
128
|
+
for (const [ref, ts] of groups) {
|
|
129
|
+
const reached = new Set([breached]);
|
|
130
|
+
let grew = true;
|
|
131
|
+
while (grew) {
|
|
132
|
+
grew = false;
|
|
133
|
+
for (const t of ts) if (reached.has(t.to) && !reached.has(t.from)) { reached.add(t.from); grew = true; }
|
|
134
|
+
}
|
|
135
|
+
reached.delete(breached);
|
|
136
|
+
if (reached.size === 0) continue;
|
|
137
|
+
reached.forEach((p) => upstream.add(p));
|
|
138
|
+
if (ref) objects.add(ref);
|
|
139
|
+
}
|
|
140
|
+
return { upstream: [...upstream].sort(), objects: [...objects].sort() };
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// ------------------------------------------------------------------------------ //
|
|
144
|
+
// Publishing
|
|
145
|
+
// ------------------------------------------------------------------------------ //
|
|
146
|
+
|
|
147
|
+
/** A public subprocessor list from recorded transfers: first and last seen per declared party, plus declared-but-unused. */
|
|
148
|
+
export function trustCenterFeed(transfers: Transfer[], declared: Array<{ name: string; purpose: string; region?: string }>) {
|
|
149
|
+
const seen = new Map<string, { first: string; last: string; count: number }>();
|
|
150
|
+
for (const t of transfers) {
|
|
151
|
+
const s = seen.get(t.to);
|
|
152
|
+
seen.set(t.to, s ? { first: s.first < t.ts ? s.first : t.ts, last: s.last > t.ts ? s.last : t.ts, count: s.count + 1 } : { first: t.ts, last: t.ts, count: 1 });
|
|
153
|
+
}
|
|
154
|
+
return {
|
|
155
|
+
subprocessors: declared.map((d) => ({ ...d, inUse: seen.has(d.name), firstSeen: seen.get(d.name)?.first ?? null, lastSeen: seen.get(d.name)?.last ?? null })),
|
|
156
|
+
generatedFrom: transfers.length,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/** One export for a supervisor: nodes, edges, verdict and a hash over all of it. */
|
|
161
|
+
export function regulatorExport(transfers: Transfer[], declared: string[], controller: string) {
|
|
162
|
+
const graph = subprocessorGraph(transfers, declared, { controller });
|
|
163
|
+
const verdict = verifyTransfers(transfers, declared, { controller });
|
|
164
|
+
const body = { v: 1, type: 'subprocessor.regulator_export', controller, declared: [...declared].sort(), graph, verdict, transfers: transfers.map((t) => jcsHash(t as never)) };
|
|
165
|
+
return { ...body, hash: jcsHash(body) };
|
|
166
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -167,3 +167,4 @@ export function verifyTransfers(transfers: Transfer[], declared: string[], opts?
|
|
|
167
167
|
for (const m of g.missing_agreement_id) reasons.push(`transfer to '${m.to}' at ${m.ts} has no agreement id (dpa/scc requires one)`);
|
|
168
168
|
return { ok: reasons.length === 0, reasons };
|
|
169
169
|
}
|
|
170
|
+
export * from './dpa.js';
|