@atlasauth/pca-mpc 0.3.0 → 0.4.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 (85) hide show
  1. package/README.md +81 -3
  2. package/dist/beaver.js +4 -0
  3. package/dist/beaver.js.map +1 -1
  4. package/dist/compose.d.ts +9 -2
  5. package/dist/compose.js +24 -1
  6. package/dist/compose.js.map +1 -1
  7. package/dist/ec.d.ts +6 -3
  8. package/dist/ec.js +27 -9
  9. package/dist/ec.js.map +1 -1
  10. package/dist/enc.d.ts +46 -0
  11. package/dist/enc.js +88 -0
  12. package/dist/enc.js.map +1 -0
  13. package/dist/endemic-ot.js +24 -1
  14. package/dist/endemic-ot.js.map +1 -1
  15. package/dist/hybrid-ot.js +3 -0
  16. package/dist/hybrid-ot.js.map +1 -1
  17. package/dist/kem-ot.js +2 -0
  18. package/dist/kem-ot.js.map +1 -1
  19. package/dist/mascot.d.ts +81 -30
  20. package/dist/mascot.js +232 -113
  21. package/dist/mascot.js.map +1 -1
  22. package/dist/net/certs.d.ts +14 -0
  23. package/dist/net/certs.js +30 -0
  24. package/dist/net/certs.js.map +1 -0
  25. package/dist/net/faults.d.ts +49 -0
  26. package/dist/net/faults.js +222 -0
  27. package/dist/net/faults.js.map +1 -0
  28. package/dist/net/forensics.d.ts +81 -0
  29. package/dist/net/forensics.js +181 -0
  30. package/dist/net/forensics.js.map +1 -0
  31. package/dist/net/gadget.d.ts +44 -0
  32. package/dist/net/gadget.js +102 -0
  33. package/dist/net/gadget.js.map +1 -0
  34. package/dist/net/index.d.ts +11 -0
  35. package/dist/net/index.js +28 -0
  36. package/dist/net/index.js.map +1 -0
  37. package/dist/net/launch-local.d.ts +53 -0
  38. package/dist/net/launch-local.js +190 -0
  39. package/dist/net/launch-local.js.map +1 -0
  40. package/dist/net/launch-support.d.ts +6 -0
  41. package/dist/net/launch-support.js +65 -0
  42. package/dist/net/launch-support.js.map +1 -0
  43. package/dist/net/mesh.d.ts +135 -0
  44. package/dist/net/mesh.js +491 -0
  45. package/dist/net/mesh.js.map +1 -0
  46. package/dist/net/offline-net.d.ts +58 -0
  47. package/dist/net/offline-net.js +485 -0
  48. package/dist/net/offline-net.js.map +1 -0
  49. package/dist/net/ot-net.d.ts +42 -0
  50. package/dist/net/ot-net.js +219 -0
  51. package/dist/net/ot-net.js.map +1 -0
  52. package/dist/net/pa.d.ts +65 -0
  53. package/dist/net/pa.js +118 -0
  54. package/dist/net/pa.js.map +1 -0
  55. package/dist/net/party-main.d.ts +48 -0
  56. package/dist/net/party-main.js +146 -0
  57. package/dist/net/party-main.js.map +1 -0
  58. package/dist/net/prep.d.ts +40 -0
  59. package/dist/net/prep.js +12 -0
  60. package/dist/net/prep.js.map +1 -0
  61. package/dist/net/protocol.d.ts +126 -0
  62. package/dist/net/protocol.js +655 -0
  63. package/dist/net/protocol.js.map +1 -0
  64. package/dist/net/wire.d.ts +89 -0
  65. package/dist/net/wire.js +242 -0
  66. package/dist/net/wire.js.map +1 -0
  67. package/dist/ot.d.ts +176 -17
  68. package/dist/ot.js +479 -252
  69. package/dist/ot.js.map +1 -1
  70. package/dist/otx.d.ts +76 -0
  71. package/dist/otx.js +238 -0
  72. package/dist/otx.js.map +1 -0
  73. package/dist/runner.d.ts +1 -1
  74. package/dist/runner.js +6 -1
  75. package/dist/runner.js.map +1 -1
  76. package/dist/sharing.d.ts +2 -0
  77. package/dist/sharing.js +7 -4
  78. package/dist/sharing.js.map +1 -1
  79. package/dist/spdz-runner.d.ts +20 -3
  80. package/dist/spdz-runner.js +21 -3
  81. package/dist/spdz-runner.js.map +1 -1
  82. package/dist/spdz.d.ts +96 -22
  83. package/dist/spdz.js +196 -47
  84. package/dist/spdz.js.map +1 -1
  85. package/package.json +15 -6
@@ -0,0 +1,219 @@
1
+ "use strict";
2
+ /**
3
+ * Pairwise base oblivious transfer OVER THE NETWORK (research prototype), running the WASM-backed
4
+ * primitives on two separate hosts:
5
+ * - 'ec' : the malicious-secure Chou-Orlandi-style base OT on Ed25519 (`@atlasauth/pca-mpc-wasm`,
6
+ * curve25519-dalek constant-time scalar multiplication), with Schnorr proof of knowledge and
7
+ * subgroup validation of every received point.
8
+ * - 'lwe' : the post-quantum ENDEMIC OT of Masny-Rindal over Module-LWE (`@atlasauth/pca-mpc-lwe-ot-wasm`,
9
+ * audited pqc_kyber K-PKE).
10
+ *
11
+ * This is a FUNCTIONAL-CORRECTNESS demonstration: after the protocol the receiver reveals its choice bits
12
+ * and a hash of each received pad (a demo-only step, NOT part of the OT) so the sender can check that the
13
+ * pad the receiver got equals the sender's pad at the receiver's choice, over a real network.
14
+ */
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.hexBig = exports.J = exports.ptJ = exports.unb64 = exports.b64 = void 0;
17
+ exports.jPt = jPt;
18
+ exports.netBinding = netBinding;
19
+ exports.runOtSender = runOtSender;
20
+ exports.runOtReceiver = runOtReceiver;
21
+ const node_crypto_1 = require("node:crypto");
22
+ const ot_1 = require("../ot");
23
+ const ec_1 = require("../ec");
24
+ const endemic_ot_1 = require("../endemic-ot");
25
+ const csprng_1 = require("../csprng");
26
+ const wire_1 = require("./wire");
27
+ const sha = (...p) => {
28
+ const h = (0, node_crypto_1.createHash)('sha256');
29
+ for (const x of p)
30
+ h.update(x);
31
+ return h.digest('hex');
32
+ };
33
+ const b64 = (u) => Buffer.from(u).toString('base64');
34
+ exports.b64 = b64;
35
+ /** @internal exported for the canonical-encoding regression test. Strict: re-encoding must reproduce `s` (no trailing-bit / padding aliases). */
36
+ const unb64 = (s, len) => {
37
+ if (typeof s !== 'string' || !/^[A-Za-z0-9+/]*={0,2}$/.test(s))
38
+ throw new Error('bad base64');
39
+ const b = Buffer.from(s, 'base64');
40
+ if (b.toString('base64') !== s)
41
+ throw new Error('non-canonical base64');
42
+ if (len !== undefined && b.length !== len)
43
+ throw new Error('bad length');
44
+ return new Uint8Array(b);
45
+ };
46
+ exports.unb64 = unb64;
47
+ const ptJ = (p) => {
48
+ const a = (0, ec_1.toAffine)(p);
49
+ return { x: (0, wire_1.hx)(a.x), y: (0, wire_1.hx)(a.y) };
50
+ };
51
+ exports.ptJ = ptJ;
52
+ const FQ = ec_1.Q;
53
+ const J = (v) => typeof v === 'object' && v !== null && !Array.isArray(v);
54
+ exports.J = J;
55
+ /** @internal exported for the canonical-encoding regression test. Canonical lowercase hex, no leading zeros (matches `hx`). */
56
+ const hexBig = (s) => {
57
+ if (typeof s !== 'string' || !/^(0|[1-9a-f][0-9a-f]{0,63})$/.test(s))
58
+ throw new Error('bad field element');
59
+ const v = BigInt('0x' + s);
60
+ if (v >= FQ)
61
+ throw new Error('non-canonical field element');
62
+ return v;
63
+ };
64
+ exports.hexBig = hexBig;
65
+ function jPt(v) {
66
+ if (!(0, exports.J)(v))
67
+ throw new Error('bad point');
68
+ const x = (0, exports.hexBig)(v.x);
69
+ const y = (0, exports.hexBig)(v.y);
70
+ const p = { X: x, Y: y, Z: 1n, T: (0, ec_1.modFq)(x * y) };
71
+ (0, ec_1.assertInSubgroup)(p, 'received point');
72
+ return p;
73
+ }
74
+ /** Wrap peer-supplied data parsing so any failure aborts naming the peer. */
75
+ function parsing(mesh, peer, rd, f) {
76
+ try {
77
+ return f();
78
+ }
79
+ catch (e) {
80
+ const ne = new wire_1.NetAbort('malformed', peer, mesh.selfId, `round '${rd}': ${e.message}`);
81
+ mesh.fail(ne);
82
+ throw ne;
83
+ }
84
+ }
85
+ /** Binding of a base OT on this mesh: session (hashed to a fixed length), who sends, who receives, which round. */
86
+ function netBinding(mesh, senderIndex, receiverIndex, round) {
87
+ const sid = (0, node_crypto_1.createHash)('sha256').update('atlas-pca-mpc/net-session/v2').update(mesh.sessionId).digest();
88
+ return { sessionId: new Uint8Array(sid), senderIndex, receiverIndex, round };
89
+ }
90
+ async function runOtSender(mesh, peer, kind, count) {
91
+ const t0 = performance.now();
92
+ const rng = (0, csprng_1.secureOtRandom)();
93
+ let senderPads;
94
+ if (kind === 'ec') {
95
+ const binding = netBinding(mesh, mesh.selfId, peer, 'ot-ec');
96
+ const setup = (0, ot_1.malBaseOtSenderSetup)(rng, binding);
97
+ mesh.send(peer, 'ot-S', { S: (0, exports.ptJ)(setup.S), U: (0, exports.ptJ)(setup.proof.U), z: (0, wire_1.hx)(setup.proof.z) });
98
+ const rRaw = (await mesh.recv(peer, 'ot-R'));
99
+ const R = parsing(mesh, peer, 'ot-R', () => {
100
+ if (!Array.isArray(rRaw) || rRaw.length !== count)
101
+ throw new Error('bad R array');
102
+ return rRaw.map(jPt);
103
+ });
104
+ try {
105
+ senderPads = (0, ot_1.malBaseOtSenderDerive)(setup.y, setup.T, R, setup.S, binding);
106
+ }
107
+ catch (e) {
108
+ const ne = new wire_1.NetAbort('malformed', peer, mesh.selfId, e.message);
109
+ mesh.fail(ne);
110
+ throw ne;
111
+ }
112
+ }
113
+ else {
114
+ const m = (await mesh.recv(peer, 'ot-recv'));
115
+ const msg = parsing(mesh, peer, 'ot-recv', () => {
116
+ if (!(0, exports.J)(m) || !Array.isArray(m.points) || !Array.isArray(m.rhos) || m.points.length !== count || m.rhos.length !== count) {
117
+ throw new Error('bad receiver message');
118
+ }
119
+ return {
120
+ rn: (0, exports.unb64)(m.rn, 32),
121
+ points: m.points.map((pp) => {
122
+ if (!Array.isArray(pp) || pp.length !== 2)
123
+ throw new Error('bad point pair');
124
+ return [(0, exports.unb64)(pp[0]), (0, exports.unb64)(pp[1])];
125
+ }),
126
+ rhos: m.rhos.map((r) => (0, exports.unb64)(r, 32)),
127
+ };
128
+ });
129
+ let sm;
130
+ try {
131
+ sm = (0, endemic_ot_1.endemicLweSendRandom)(msg, rng);
132
+ }
133
+ catch (e) {
134
+ const ne = new wire_1.NetAbort('malformed', peer, mesh.selfId, `lwe sender: ${e.message}`);
135
+ mesh.fail(ne);
136
+ throw ne;
137
+ }
138
+ senderPads = sm.senderPads;
139
+ mesh.send(peer, 'ot-ct', sm.ciphertexts.map(([a, b]) => [(0, exports.b64)(a), (0, exports.b64)(b)]));
140
+ }
141
+ // demo-only verification: the receiver reveals choices + pad hashes
142
+ const v = (await mesh.recv(peer, 'ot-verify'));
143
+ const ok = parsing(mesh, peer, 'ot-verify', () => {
144
+ if (!(0, exports.J)(v) || !Array.isArray(v.choices) || !Array.isArray(v.padHashes) || v.choices.length !== count || v.padHashes.length !== count) {
145
+ throw new Error('bad verify message');
146
+ }
147
+ return v.choices.every((c, i) => (c === 0 || c === 1) && sha(senderPads[i][c]) === v.padHashes[i]);
148
+ });
149
+ mesh.send(peer, 'ot-done', { matched: ok });
150
+ await mesh.finish();
151
+ return {
152
+ kind,
153
+ role: 'sender',
154
+ count,
155
+ ms: performance.now() - t0,
156
+ wasmCurveActive: (0, ec_1.isWasmCurveActive)(),
157
+ matched: ok,
158
+ padDigest: sha(...senderPads.flatMap(([a, b]) => [a, b])),
159
+ };
160
+ }
161
+ async function runOtReceiver(mesh, peer, kind, count) {
162
+ const t0 = performance.now();
163
+ const rng = (0, csprng_1.secureOtRandom)();
164
+ const choices = Array.from({ length: count }, () => rng.bytes(1)[0] & 1);
165
+ let recvPads;
166
+ if (kind === 'ec') {
167
+ const sRaw = (await mesh.recv(peer, 'ot-S'));
168
+ const { S, proof } = parsing(mesh, peer, 'ot-S', () => {
169
+ if (!(0, exports.J)(sRaw))
170
+ throw new Error('bad S message');
171
+ const proof = { U: jPt(sRaw.U), z: (0, exports.hexBig)(sRaw.z) };
172
+ return { S: jPt(sRaw.S), proof };
173
+ });
174
+ let res;
175
+ try {
176
+ res = (0, ot_1.malBaseOtReceiverRespond)(S, proof, choices, rng, netBinding(mesh, peer, mesh.selfId, 'ot-ec'));
177
+ }
178
+ catch (e) {
179
+ const ne = new wire_1.NetAbort(e instanceof ot_1.BaseOtAbort ? 'commitment' : 'malformed', peer, mesh.selfId, e.message);
180
+ mesh.fail(ne);
181
+ throw ne;
182
+ }
183
+ recvPads = res.recvPads;
184
+ mesh.send(peer, 'ot-R', res.R.map(exports.ptJ));
185
+ }
186
+ else {
187
+ const { message, state } = (0, endemic_ot_1.endemicLweReceive)(choices, rng);
188
+ mesh.send(peer, 'ot-recv', {
189
+ rn: (0, exports.b64)(message.rn),
190
+ points: message.points.map(([a, b]) => [(0, exports.b64)(a), (0, exports.b64)(b)]),
191
+ rhos: message.rhos.map(exports.b64),
192
+ });
193
+ const ctRaw = (await mesh.recv(peer, 'ot-ct'));
194
+ const ciphertexts = parsing(mesh, peer, 'ot-ct', () => {
195
+ if (!Array.isArray(ctRaw) || ctRaw.length !== count)
196
+ throw new Error('bad ciphertext array');
197
+ return ctRaw.map((pp) => {
198
+ if (!Array.isArray(pp) || pp.length !== 2)
199
+ throw new Error('bad ct pair');
200
+ return [(0, exports.unb64)(pp[0]), (0, exports.unb64)(pp[1])];
201
+ });
202
+ });
203
+ recvPads = parsing(mesh, peer, 'ot-ct', () => (0, endemic_ot_1.endemicLweRecoverRandom)(state, { ciphertexts, senderPads: [] }));
204
+ }
205
+ mesh.send(peer, 'ot-verify', { choices, padHashes: recvPads.map((p) => sha(p)) });
206
+ const d = (await mesh.recv(peer, 'ot-done'));
207
+ const matched = (0, exports.J)(d) && d.matched === true;
208
+ await mesh.finish();
209
+ return {
210
+ kind,
211
+ role: 'receiver',
212
+ count,
213
+ ms: performance.now() - t0,
214
+ wasmCurveActive: (0, ec_1.isWasmCurveActive)(),
215
+ matched,
216
+ padDigest: sha(...recvPads),
217
+ };
218
+ }
219
+ //# sourceMappingURL=ot-net.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ot-net.js","sourceRoot":"","sources":["../../src/net/ot-net.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Pairwise-authenticated shares (BDOZ-style information-theoretic MACs on each party's OWN share).
3
+ *
4
+ * This is what makes an abort IDENTIFIABLE in the trusted-dealer mode. A share `x_i` held by party `i` carries,
5
+ * for every other party `j`, a tag `T_ij` that only `i` holds and a key `K_ij` that only `j` holds, with
6
+ *
7
+ * T_ij = K_ij + Δ_j · x_i (Δ_j: party j's secret verification key, one per verifier)
8
+ *
9
+ * When `i` opens `x_i`, it sends the tag `T_ij` to each verifier `j`, who checks the relation locally. A party
10
+ * that lies about its share (or its tag) passes with probability ≤ 1/p per verifier, so an honest verifier that
11
+ * sees the relation fail KNOWS the sender misbehaved (an honest sender's pair is always consistent): first-hand,
12
+ * attributable evidence, with no help from anyone else.
13
+ *
14
+ * Everything is linear, so tags and keys follow the local linear operations of the SPDZ layer for free:
15
+ * add / sub / neg / scale by a public constant: apply the same operation to x, every tag and every key;
16
+ * add a PUBLIC constant c to party 0's share: party 0 changes only x; every other party j re-keys
17
+ * K_0j <- K_0j - Δ_j·c (it holds Δ_j), which restores T_0j = K_0j + Δ_j·(x_0 + c).
18
+ *
19
+ * Untagged mode (no trusted dealer) uses the same type with empty `tag`/`key` arrays; all operations then
20
+ * reduce to plain share arithmetic.
21
+ */
22
+ /** A pairwise-authenticated field share. `tag[j]`: my tag for verifier j; `key[j]`: my key for verifying j's share. */
23
+ export interface PA {
24
+ x: bigint;
25
+ tag: bigint[];
26
+ key: bigint[];
27
+ }
28
+ /** One authenticated value: its value share and one MAC share per global key, each pairwise-authenticated. */
29
+ export interface AW {
30
+ v: PA;
31
+ m: PA[];
32
+ }
33
+ export interface PaEnv {
34
+ id: number;
35
+ n: number;
36
+ /** My verification key Δ_id (0n and unused when untagged). */
37
+ delta: bigint;
38
+ tagged: boolean;
39
+ }
40
+ export declare const paAdd: (a: PA, b: PA) => PA;
41
+ export declare const paSub: (a: PA, b: PA) => PA;
42
+ export declare const paNeg: (a: PA) => PA;
43
+ export declare const paScale: (a: PA, c: bigint) => PA;
44
+ /** Add a PUBLIC constant to party 0's share of `a` (every party applies this same call). */
45
+ export declare function paAddPublic0(env: PaEnv, a: PA, c: bigint): PA;
46
+ export declare const wAdd: (a: AW, b: AW) => AW;
47
+ export declare const wSub: (a: AW, b: AW) => AW;
48
+ export declare const wNeg: (a: AW) => AW;
49
+ export declare const wScale: (a: AW, c: bigint) => AW;
50
+ /**
51
+ * ⟦x⟧ + c for a PUBLIC c: the value share of party 0 moves by c, and EVERY party's MAC share under key l moves
52
+ * by α_i^(l)·c (computed from its own α share, whose pairwise tags are `alpha[l]`).
53
+ */
54
+ export declare function wAddPublic(env: PaEnv, a: AW, c: bigint, alpha: PA[]): AW;
55
+ /** Verify peer `from`'s opened share `x` with tag `tag` against my key for `from`. */
56
+ export declare function paVerify(env: PaEnv, a: PA, from: number, x: bigint, tag: bigint): boolean;
57
+ /** Numbers per pairwise-authenticated share on the wire (x, n-1 tags, n-1 keys; or just x when untagged). */
58
+ export declare const paWidth: (n: number, tagged: boolean) => number;
59
+ /** Flatten a PA for party `id`: x, then tag[j] for j != id ascending, then key[j] for j != id ascending. */
60
+ export declare function paFlat(a: PA, id: number, n: number, tagged: boolean): bigint[];
61
+ /** Inverse of `paFlat`: read one PA starting at `off`. */
62
+ export declare function paParse(nums: readonly bigint[], off: number, id: number, n: number, tagged: boolean): PA;
63
+ export declare const awWidth: (n: number, keys: number, tagged: boolean) => number;
64
+ export declare function awFlat(a: AW, id: number, n: number, tagged: boolean): bigint[];
65
+ export declare function awParse(nums: readonly bigint[], off: number, id: number, n: number, keys: number, tagged: boolean): AW;
package/dist/net/pa.js ADDED
@@ -0,0 +1,118 @@
1
+ "use strict";
2
+ /**
3
+ * Pairwise-authenticated shares (BDOZ-style information-theoretic MACs on each party's OWN share).
4
+ *
5
+ * This is what makes an abort IDENTIFIABLE in the trusted-dealer mode. A share `x_i` held by party `i` carries,
6
+ * for every other party `j`, a tag `T_ij` that only `i` holds and a key `K_ij` that only `j` holds, with
7
+ *
8
+ * T_ij = K_ij + Δ_j · x_i (Δ_j: party j's secret verification key, one per verifier)
9
+ *
10
+ * When `i` opens `x_i`, it sends the tag `T_ij` to each verifier `j`, who checks the relation locally. A party
11
+ * that lies about its share (or its tag) passes with probability ≤ 1/p per verifier, so an honest verifier that
12
+ * sees the relation fail KNOWS the sender misbehaved (an honest sender's pair is always consistent): first-hand,
13
+ * attributable evidence, with no help from anyone else.
14
+ *
15
+ * Everything is linear, so tags and keys follow the local linear operations of the SPDZ layer for free:
16
+ * add / sub / neg / scale by a public constant: apply the same operation to x, every tag and every key;
17
+ * add a PUBLIC constant c to party 0's share: party 0 changes only x; every other party j re-keys
18
+ * K_0j <- K_0j - Δ_j·c (it holds Δ_j), which restores T_0j = K_0j + Δ_j·(x_0 + c).
19
+ *
20
+ * Untagged mode (no trusted dealer) uses the same type with empty `tag`/`key` arrays; all operations then
21
+ * reduce to plain share arithmetic.
22
+ */
23
+ Object.defineProperty(exports, "__esModule", { value: true });
24
+ exports.awWidth = exports.paWidth = exports.wScale = exports.wNeg = exports.wSub = exports.wAdd = exports.paScale = exports.paNeg = exports.paSub = exports.paAdd = void 0;
25
+ exports.paAddPublic0 = paAddPublic0;
26
+ exports.wAddPublic = wAddPublic;
27
+ exports.paVerify = paVerify;
28
+ exports.paFlat = paFlat;
29
+ exports.paParse = paParse;
30
+ exports.awFlat = awFlat;
31
+ exports.awParse = awParse;
32
+ const field_1 = require("../field");
33
+ const zip = (a, b, f) => a.map((x, i) => f(x, b[i]));
34
+ const paAdd = (a, b) => ({ x: (0, field_1.fadd)(a.x, b.x), tag: zip(a.tag, b.tag, field_1.fadd), key: zip(a.key, b.key, field_1.fadd) });
35
+ exports.paAdd = paAdd;
36
+ const paSub = (a, b) => ({ x: (0, field_1.fsub)(a.x, b.x), tag: zip(a.tag, b.tag, field_1.fsub), key: zip(a.key, b.key, field_1.fsub) });
37
+ exports.paSub = paSub;
38
+ const paNeg = (a) => ({ x: (0, field_1.fneg)(a.x), tag: a.tag.map(field_1.fneg), key: a.key.map(field_1.fneg) });
39
+ exports.paNeg = paNeg;
40
+ const paScale = (a, c) => ({ x: (0, field_1.fmul)(a.x, c), tag: a.tag.map((t) => (0, field_1.fmul)(t, c)), key: a.key.map((k) => (0, field_1.fmul)(k, c)) });
41
+ exports.paScale = paScale;
42
+ /** Add a PUBLIC constant to party 0's share of `a` (every party applies this same call). */
43
+ function paAddPublic0(env, a, c) {
44
+ if (env.id === 0)
45
+ return { x: (0, field_1.fadd)(a.x, c), tag: a.tag, key: a.key };
46
+ if (!env.tagged)
47
+ return a;
48
+ const key = a.key.slice();
49
+ key[0] = (0, field_1.fsub)(key[0], (0, field_1.fmul)(env.delta, c));
50
+ return { x: a.x, tag: a.tag, key };
51
+ }
52
+ const wAdd = (a, b) => ({ v: (0, exports.paAdd)(a.v, b.v), m: a.m.map((p, l) => (0, exports.paAdd)(p, b.m[l])) });
53
+ exports.wAdd = wAdd;
54
+ const wSub = (a, b) => ({ v: (0, exports.paSub)(a.v, b.v), m: a.m.map((p, l) => (0, exports.paSub)(p, b.m[l])) });
55
+ exports.wSub = wSub;
56
+ const wNeg = (a) => ({ v: (0, exports.paNeg)(a.v), m: a.m.map(exports.paNeg) });
57
+ exports.wNeg = wNeg;
58
+ const wScale = (a, c) => ({ v: (0, exports.paScale)(a.v, c), m: a.m.map((p) => (0, exports.paScale)(p, c)) });
59
+ exports.wScale = wScale;
60
+ /**
61
+ * ⟦x⟧ + c for a PUBLIC c: the value share of party 0 moves by c, and EVERY party's MAC share under key l moves
62
+ * by α_i^(l)·c (computed from its own α share, whose pairwise tags are `alpha[l]`).
63
+ */
64
+ function wAddPublic(env, a, c, alpha) {
65
+ return {
66
+ v: paAddPublic0(env, a.v, c),
67
+ m: a.m.map((p, l) => (0, exports.paAdd)(p, (0, exports.paScale)(alpha[l], c))),
68
+ };
69
+ }
70
+ /** Verify peer `from`'s opened share `x` with tag `tag` against my key for `from`. */
71
+ function paVerify(env, a, from, x, tag) {
72
+ return (0, field_1.fadd)(a.key[from], (0, field_1.fmul)(env.delta, x)) === tag;
73
+ }
74
+ // ---------------------------------------------------------------------------------------------- codec
75
+ /** Numbers per pairwise-authenticated share on the wire (x, n-1 tags, n-1 keys; or just x when untagged). */
76
+ const paWidth = (n, tagged) => (tagged ? 1 + 2 * (n - 1) : 1);
77
+ exports.paWidth = paWidth;
78
+ /** Flatten a PA for party `id`: x, then tag[j] for j != id ascending, then key[j] for j != id ascending. */
79
+ function paFlat(a, id, n, tagged) {
80
+ const out = [a.x];
81
+ if (tagged) {
82
+ for (let j = 0; j < n; j++)
83
+ if (j !== id)
84
+ out.push(a.tag[j]);
85
+ for (let j = 0; j < n; j++)
86
+ if (j !== id)
87
+ out.push(a.key[j]);
88
+ }
89
+ return out;
90
+ }
91
+ /** Inverse of `paFlat`: read one PA starting at `off`. */
92
+ function paParse(nums, off, id, n, tagged) {
93
+ const x = nums[off];
94
+ if (!tagged)
95
+ return { x, tag: [], key: [] };
96
+ const tag = new Array(n).fill(0n);
97
+ const key = new Array(n).fill(0n);
98
+ let o = off + 1;
99
+ for (let j = 0; j < n; j++)
100
+ if (j !== id)
101
+ tag[j] = nums[o++];
102
+ for (let j = 0; j < n; j++)
103
+ if (j !== id)
104
+ key[j] = nums[o++];
105
+ return { x, tag, key };
106
+ }
107
+ const awWidth = (n, keys, tagged) => (1 + keys) * (0, exports.paWidth)(n, tagged);
108
+ exports.awWidth = awWidth;
109
+ function awFlat(a, id, n, tagged) {
110
+ return [a.v, ...a.m].flatMap((p) => paFlat(p, id, n, tagged));
111
+ }
112
+ function awParse(nums, off, id, n, keys, tagged) {
113
+ const w = (0, exports.paWidth)(n, tagged);
114
+ const v = paParse(nums, off, id, n, tagged);
115
+ const m = Array.from({ length: keys }, (_, l) => paParse(nums, off + (1 + l) * w, id, n, tagged));
116
+ return { v, m };
117
+ }
118
+ //# sourceMappingURL=pa.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pa.js","sourceRoot":"","sources":["../../src/net/pa.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * One MPC node (a party or the dealer) as its OWN OS process, talking to the others only over the TLS
4
+ * mesh. Usage: node party-main.js <config.json> (or: node party-main.js keygen <dir> <cn>)
5
+ * Prints exactly one JSON line (the result or the attributable abort) on stdout.
6
+ */
7
+ import { type FrameFault } from './faults';
8
+ import { type Behavior } from './protocol';
9
+ import type { DecisionVector } from '../party';
10
+ export interface NodeConfig {
11
+ role: 'party' | 'dealer' | 'ot-sender' | 'ot-receiver';
12
+ /** For the ot-* roles: which base OT and how many transfers. */
13
+ ot?: {
14
+ kind: 'ec' | 'lwe';
15
+ count: number;
16
+ };
17
+ id: number;
18
+ n: number;
19
+ Q?: number;
20
+ sessionId: string;
21
+ input?: DecisionVector;
22
+ listenHost?: string;
23
+ nodes: {
24
+ id: number;
25
+ host: string;
26
+ port: number;
27
+ certPath: string;
28
+ }[];
29
+ keyPath: string;
30
+ certPath: string;
31
+ recvTimeoutMs?: number;
32
+ connectTimeoutMs?: number;
33
+ /** TEST ONLY: needs `unsafeTestHooks` AND env PCA_MPC_UNSAFE_TEST_HOOKS=1, else the node refuses to start. */
34
+ behavior?: Behavior;
35
+ /** TEST ONLY: same gating as `behavior`. */
36
+ frameFault?: FrameFault;
37
+ /** Explicit opt-in for the test hooks; never set by production configs. */
38
+ unsafeTestHooks?: boolean;
39
+ dealerSeed?: string;
40
+ /** Which offline phase the parties run (default `trusted-dealer`). With `no-dealer` there is no dealer node. */
41
+ offline?: 'trusted-dealer' | 'no-dealer';
42
+ /** TEST ONLY (dealer role): a lying dealer, `c = a*b + keepCDelta` (decimal string); same gating as `behavior`. */
43
+ dealerFault?: {
44
+ keepCDelta?: string;
45
+ partnerCDelta?: Array<string | null>;
46
+ macFaultAtInput?: number;
47
+ };
48
+ }
@@ -0,0 +1,146 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ /**
4
+ * One MPC node (a party or the dealer) as its OWN OS process, talking to the others only over the TLS
5
+ * mesh. Usage: node party-main.js <config.json> (or: node party-main.js keygen <dir> <cn>)
6
+ * Prints exactly one JSON line (the result or the attributable abort) on stdout.
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ const node_fs_1 = require("node:fs");
43
+ const certs_1 = require("./certs");
44
+ const faults_1 = require("./faults");
45
+ const mesh_1 = require("./mesh");
46
+ const protocol_1 = require("./protocol");
47
+ const wire_1 = require("./wire");
48
+ async function main() {
49
+ const argv = process.argv.slice(2);
50
+ if (argv[0] === 'keygen') {
51
+ const id = (0, certs_1.generateIdentity)(argv[1], argv[2] ?? 'mpc-node');
52
+ process.stdout.write(JSON.stringify(id) + '\n');
53
+ return;
54
+ }
55
+ const cfg = JSON.parse((0, node_fs_1.readFileSync)(argv[0], 'utf8'));
56
+ const hooksRequested = cfg.behavior !== undefined || cfg.frameFault !== undefined || cfg.dealerFault !== undefined;
57
+ if (hooksRequested && !(cfg.unsafeTestHooks === true && process.env.PCA_MPC_UNSAFE_TEST_HOOKS === '1')) {
58
+ out({
59
+ ok: false,
60
+ role: cfg.role,
61
+ id: cfg.id,
62
+ error: { kind: 'local', blamed: null, reporter: cfg.id, message: 'refusing to start: test hooks (behavior/frameFault) are not enabled in this environment' },
63
+ });
64
+ process.exitCode = 3;
65
+ return;
66
+ }
67
+ const nodes = cfg.nodes.map((x) => ({ id: x.id, host: x.host, port: x.port, certPem: (0, certs_1.readPem)(x.certPath) }));
68
+ const linkTo = cfg.role === 'dealer' ? nodes.filter((x) => x.id < cfg.n).map((x) => x.id) : undefined;
69
+ const mesh = new mesh_1.Mesh({
70
+ selfId: cfg.id,
71
+ nodes,
72
+ linkTo,
73
+ keyPem: (0, certs_1.readPem)(cfg.keyPath),
74
+ certPem: (0, certs_1.readPem)(cfg.certPath),
75
+ sessionId: cfg.sessionId,
76
+ listenHost: cfg.listenHost,
77
+ recvTimeoutMs: cfg.recvTimeoutMs,
78
+ connectTimeoutMs: cfg.connectTimeoutMs,
79
+ tamper: cfg.frameFault ? (0, faults_1.tamperFor)(cfg.frameFault) : undefined,
80
+ unsafeTestHooks: hooksRequested ? true : undefined,
81
+ });
82
+ const t0 = Date.now();
83
+ try {
84
+ await mesh.connect();
85
+ const connectMs = Date.now() - t0;
86
+ if (cfg.role === 'dealer') {
87
+ const df = cfg.dealerFault;
88
+ await (0, protocol_1.runDealer)({
89
+ n: cfg.n,
90
+ Q: cfg.Q,
91
+ mesh,
92
+ seed: cfg.dealerSeed ? BigInt(cfg.dealerSeed) : undefined,
93
+ macFaultAtInput: df?.macFaultAtInput,
94
+ fault: df
95
+ ? {
96
+ keepCDelta: df.keepCDelta !== undefined ? BigInt(df.keepCDelta) : undefined,
97
+ partnerCDelta: df.partnerCDelta?.map((x) => (x === null ? undefined : BigInt(x))),
98
+ }
99
+ : undefined,
100
+ });
101
+ out({ ok: true, role: 'dealer', id: cfg.id, connectMs, links: mesh.stats(), events: mesh.events });
102
+ }
103
+ else if (cfg.role === 'ot-sender' || cfg.role === 'ot-receiver') {
104
+ // lazy: pulls in the WASM-backed OT stack only for these roles
105
+ const ot = await Promise.resolve().then(() => __importStar(require('./ot-net')));
106
+ const k = cfg.ot ?? { kind: 'ec', count: 128 };
107
+ const peer = cfg.role === 'ot-sender' ? 1 : 0;
108
+ const r = cfg.role === 'ot-sender' ? await ot.runOtSender(mesh, peer, k.kind, k.count) : await ot.runOtReceiver(mesh, peer, k.kind, k.count);
109
+ out({ ok: true, role: cfg.role, connectMs, result: r, links: mesh.stats(), events: mesh.events });
110
+ }
111
+ else {
112
+ const r = await (0, protocol_1.runParty)({
113
+ id: cfg.id,
114
+ n: cfg.n,
115
+ Q: cfg.Q,
116
+ input: cfg.input,
117
+ mesh,
118
+ offline: cfg.offline,
119
+ behavior: cfg.behavior,
120
+ unsafeTestHooks: hooksRequested ? true : undefined,
121
+ sessionId: cfg.sessionId,
122
+ });
123
+ out({ ok: true, role: 'party', connectMs, result: r, links: mesh.stats(), events: mesh.events });
124
+ }
125
+ }
126
+ catch (e) {
127
+ const ne = e instanceof wire_1.NetAbort ? e : (mesh.failed ?? new wire_1.NetAbort('local', null, cfg.id, e.message));
128
+ out({
129
+ ok: false,
130
+ role: cfg.role,
131
+ id: cfg.id,
132
+ error: { kind: ne.kind, blamed: ne.blamed, reporter: ne.reporter, claimedKind: ne.claimedKind, claimedBlame: ne.claimedBlame, reason: ne.reason, evidence: ne.evidence, deadlineMs: ne.deadlineMs, message: ne.message },
133
+ links: mesh.stats(),
134
+ events: mesh.events,
135
+ });
136
+ process.exitCode = 3;
137
+ }
138
+ // give sockets a moment to flush abort frames, then exit regardless of lingering handles
139
+ setTimeout(() => process.exit(process.exitCode ?? 0), 300).unref();
140
+ }
141
+ function out(o) {
142
+ // BigInt-safe
143
+ process.stdout.write(JSON.stringify(o, (_k, v) => (typeof v === 'bigint' ? v.toString() : v)) + '\n');
144
+ }
145
+ void main();
146
+ //# sourceMappingURL=party-main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"party-main.js","sourceRoot":"","sources":["../../src/net/party-main.ts"],"names":[],"mappings":"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"}