@atlasauth/pca-mpc 0.3.0 → 0.4.1
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 +81 -3
- package/dist/beaver.js +4 -0
- package/dist/beaver.js.map +1 -1
- package/dist/compose.d.ts +9 -2
- package/dist/compose.js +24 -1
- package/dist/compose.js.map +1 -1
- package/dist/ec.d.ts +6 -3
- package/dist/ec.js +27 -9
- package/dist/ec.js.map +1 -1
- package/dist/enc.d.ts +46 -0
- package/dist/enc.js +88 -0
- package/dist/enc.js.map +1 -0
- package/dist/endemic-ot.js +24 -1
- package/dist/endemic-ot.js.map +1 -1
- package/dist/hybrid-ot.js +3 -0
- package/dist/hybrid-ot.js.map +1 -1
- package/dist/kem-ot.js +2 -0
- package/dist/kem-ot.js.map +1 -1
- package/dist/mascot.d.ts +81 -30
- package/dist/mascot.js +232 -113
- package/dist/mascot.js.map +1 -1
- package/dist/net/certs.d.ts +14 -0
- package/dist/net/certs.js +30 -0
- package/dist/net/certs.js.map +1 -0
- package/dist/net/faults.d.ts +49 -0
- package/dist/net/faults.js +222 -0
- package/dist/net/faults.js.map +1 -0
- package/dist/net/forensics.d.ts +81 -0
- package/dist/net/forensics.js +181 -0
- package/dist/net/forensics.js.map +1 -0
- package/dist/net/gadget.d.ts +44 -0
- package/dist/net/gadget.js +102 -0
- package/dist/net/gadget.js.map +1 -0
- package/dist/net/index.d.ts +11 -0
- package/dist/net/index.js +28 -0
- package/dist/net/index.js.map +1 -0
- package/dist/net/launch-local.d.ts +53 -0
- package/dist/net/launch-local.js +190 -0
- package/dist/net/launch-local.js.map +1 -0
- package/dist/net/launch-support.d.ts +6 -0
- package/dist/net/launch-support.js +65 -0
- package/dist/net/launch-support.js.map +1 -0
- package/dist/net/mesh.d.ts +135 -0
- package/dist/net/mesh.js +491 -0
- package/dist/net/mesh.js.map +1 -0
- package/dist/net/offline-net.d.ts +58 -0
- package/dist/net/offline-net.js +485 -0
- package/dist/net/offline-net.js.map +1 -0
- package/dist/net/ot-net.d.ts +42 -0
- package/dist/net/ot-net.js +219 -0
- package/dist/net/ot-net.js.map +1 -0
- package/dist/net/pa.d.ts +65 -0
- package/dist/net/pa.js +118 -0
- package/dist/net/pa.js.map +1 -0
- package/dist/net/party-main.d.ts +48 -0
- package/dist/net/party-main.js +146 -0
- package/dist/net/party-main.js.map +1 -0
- package/dist/net/prep.d.ts +40 -0
- package/dist/net/prep.js +12 -0
- package/dist/net/prep.js.map +1 -0
- package/dist/net/protocol.d.ts +126 -0
- package/dist/net/protocol.js +655 -0
- package/dist/net/protocol.js.map +1 -0
- package/dist/net/wire.d.ts +89 -0
- package/dist/net/wire.js +242 -0
- package/dist/net/wire.js.map +1 -0
- package/dist/ot.d.ts +176 -17
- package/dist/ot.js +479 -252
- package/dist/ot.js.map +1 -1
- package/dist/otx.d.ts +76 -0
- package/dist/otx.js +238 -0
- package/dist/otx.js.map +1 -0
- package/dist/runner.d.ts +1 -1
- package/dist/runner.js +6 -1
- package/dist/runner.js.map +1 -1
- package/dist/sharing.d.ts +2 -0
- package/dist/sharing.js +7 -4
- package/dist/sharing.js.map +1 -1
- package/dist/spdz-runner.d.ts +20 -3
- package/dist/spdz-runner.js +21 -3
- package/dist/spdz-runner.js.map +1 -1
- package/dist/spdz.d.ts +96 -22
- package/dist/spdz.js +196 -47
- package/dist/spdz.js.map +1 -1
- package/package.json +15 -6
|
@@ -0,0 +1,485 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* The NO-DEALER offline phase over the mutual-TLS mesh (research prototype).
|
|
4
|
+
*
|
|
5
|
+
* Each party is its own process holding only its own shares. Nobody is trusted to know the MAC keys, the
|
|
6
|
+
* triples or the inputs: every party samples its own key shares and its own triple shares, and the products
|
|
7
|
+
* needed for the triples and the MACs are computed by Gilboa OT multiplication between every ordered pair of
|
|
8
|
+
* parties (`mascot.ts` is the in-process model of exactly this computation):
|
|
9
|
+
*
|
|
10
|
+
* ob-S / ob-R / ob-C all-to-all the kappa = 128 base OTs of every ordered pair (malicious-secure, session-bound
|
|
11
|
+
* Chou-Orlandi: Schnorr proof of knowledge, point validation, transcript KDF)
|
|
12
|
+
* in-share all-to-all each owner splits every input bit into additive shares and sends one to each peer
|
|
13
|
+
* ox<layer>.<chunk>.u all-to-all OT-extension receiver messages (u matrix + KOS pair) -> KOS correlation check
|
|
14
|
+
* ox<layer>.<chunk>.y all-to-all OT-extension sender ciphertexts
|
|
15
|
+
*
|
|
16
|
+
* Two multiplication layers (plus the tag layer 3): layer 1 = the triple products c = a*b and c-hat = a-hat*b, and the MACs of every
|
|
17
|
+
* value that is known before them (a, b, a-hat, the inputs, the input-check mask); layer 2 = the MACs of the
|
|
18
|
+
* products. The triple SACRIFICE and the input-consistency opening run in the online phase (`protocol.ts`),
|
|
19
|
+
* on top of the same batched MAC-check, so a party that feeds wrong OT inputs yields a wrong triple that the
|
|
20
|
+
* sacrifice catches, and an input whose MAC does not match its value fails the check.
|
|
21
|
+
*
|
|
22
|
+
* Statistical/computational parameters: 2 independent MAC keys (>= 2^-120), 2 sacrifice partners per triple
|
|
23
|
+
* (>= 2^-122), KOS check with SSEC = 128 extra rows (best known attack about 2^-128, argued; see ot.ts), Ed25519 base OTs.
|
|
24
|
+
*
|
|
25
|
+
* PAIRWISE TAGS (identifiable abort): after the MACs are known, a third OT layer gives every share a pairwise tag
|
|
26
|
+
* T_ij = K_ij + Δ_j·x_i for every peer j (one OT product of my x with j's secret Δ_j per item), so the online
|
|
27
|
+
* phase can name a party that lies about a share, a MAC share or a residual (`pa.ts`).
|
|
28
|
+
*
|
|
29
|
+
* SELECTIVE FAILURE (RT-04): receivers do not choose with the bits of their share. Each share they multiply with is the gadget
|
|
30
|
+
* sum `<g, b>` of 61 + 3s = 253 uniform choice bits (s = 64, `enc.ts`), so whether a run aborts is statistically independent of
|
|
31
|
+
* the share (about 2^-63); the gadget is a commit-reveal value contributed by all parties. The tag layer splits its derived operands as `e + d` with an encoded `e`.
|
|
32
|
+
*
|
|
33
|
+
* What is NOT here: any security proof, and attribution of a wrong OT operand in the offline triple products
|
|
34
|
+
* (the sacrifice detects the bad triple, but the tags are computed on the already-wrong value): named only for n = 2.
|
|
35
|
+
*/
|
|
36
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
|
+
exports.runOfflineNet = runOfflineNet;
|
|
38
|
+
const node_crypto_1 = require("node:crypto");
|
|
39
|
+
const csprng_1 = require("../csprng");
|
|
40
|
+
const field_1 = require("../field");
|
|
41
|
+
const enc_1 = require("../enc");
|
|
42
|
+
const ot_1 = require("../ot");
|
|
43
|
+
const ec_1 = require("../ec");
|
|
44
|
+
const thermometer_1 = require("../thermometer");
|
|
45
|
+
const wire_1 = require("./wire");
|
|
46
|
+
const gadget_1 = require("./gadget");
|
|
47
|
+
const ot_net_1 = require("./ot-net");
|
|
48
|
+
const prep_1 = require("./prep");
|
|
49
|
+
/** Most OT rows per extension round (bounds frame size and memory). */
|
|
50
|
+
const ROWS_PER_ROUND = 128 * enc_1.FIELD_BITS;
|
|
51
|
+
const T_M = 3;
|
|
52
|
+
/**
|
|
53
|
+
* The public gadget of the privacy-amplified choice-bit encoding (`enc.ts`) from the parties' contributed seeds:
|
|
54
|
+
* `gadget = H(all seeds in party order || session)` expanded by a hash chain. Every party commits to a fresh random seed
|
|
55
|
+
* before any seed is revealed, so no single party (and no coalition that has not seen the honest seed before committing)
|
|
56
|
+
* can steer the gadget.
|
|
57
|
+
*/
|
|
58
|
+
function gadgetFromSeeds(sessionId, seeds) {
|
|
59
|
+
const h0 = (0, node_crypto_1.createHash)('sha256').update('atlas-pca-mpc/enc-gadget').update(sessionId);
|
|
60
|
+
for (const sd of seeds)
|
|
61
|
+
h0.update(sd);
|
|
62
|
+
const seed = h0.digest();
|
|
63
|
+
let ctr = 0;
|
|
64
|
+
return (0, enc_1.makeGadget)(enc_1.STAT_SEC, () => {
|
|
65
|
+
for (;;) {
|
|
66
|
+
const h = (0, node_crypto_1.createHash)('sha256').update(seed).update(leBytes(BigInt(ctr++), 8)).digest();
|
|
67
|
+
const v = fromLe(h, 0, 8) & ((1n << 61n) - 1n);
|
|
68
|
+
if (v < field_1.PRIME)
|
|
69
|
+
return v;
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
/** Hex of a 128-bit value, canonical. */
|
|
74
|
+
const hex128 = (s) => {
|
|
75
|
+
if (typeof s !== 'string' || !/^(0|[1-9a-f][0-9a-f]{0,31})$/.test(s))
|
|
76
|
+
throw new Error('bad 128-bit value');
|
|
77
|
+
return BigInt('0x' + s);
|
|
78
|
+
};
|
|
79
|
+
function leBytes(v, len) {
|
|
80
|
+
const out = Buffer.alloc(len);
|
|
81
|
+
let x = v;
|
|
82
|
+
for (let i = 0; i < len; i++) {
|
|
83
|
+
out[i] = Number(x & 0xffn);
|
|
84
|
+
x >>= 8n;
|
|
85
|
+
}
|
|
86
|
+
return out;
|
|
87
|
+
}
|
|
88
|
+
function fromLe(b, off, len) {
|
|
89
|
+
let v = 0n;
|
|
90
|
+
for (let i = len - 1; i >= 0; i--)
|
|
91
|
+
v = (v << 8n) | BigInt(b[off + i]);
|
|
92
|
+
return v;
|
|
93
|
+
}
|
|
94
|
+
const encodeU = (msg, mExt) => {
|
|
95
|
+
const cb = Math.ceil(mExt / 8);
|
|
96
|
+
return { u: (0, ot_net_1.b64)(Buffer.concat(msg.u.map((c) => leBytes(c, cb)))), x: msg.x.toString(16), t: msg.tComb.toString(16) };
|
|
97
|
+
};
|
|
98
|
+
function decodeU(raw, mExt) {
|
|
99
|
+
if (!(0, ot_net_1.J)(raw))
|
|
100
|
+
throw new Error('bad extension message');
|
|
101
|
+
const cb = Math.ceil(mExt / 8);
|
|
102
|
+
const bytes = (0, ot_net_1.unb64)(raw.u, ot_1.KAPPA * cb);
|
|
103
|
+
const u = [];
|
|
104
|
+
for (let i = 0; i < ot_1.KAPPA; i++)
|
|
105
|
+
u.push(fromLe(bytes, i * cb, cb));
|
|
106
|
+
return { u, x: hex128(raw.x), tComb: hex128(raw.t) };
|
|
107
|
+
}
|
|
108
|
+
const encodeY = (y0, y1) => ({
|
|
109
|
+
y0: (0, ot_net_1.b64)(Buffer.concat(y0.map((v) => leBytes(v, 8)))),
|
|
110
|
+
y1: (0, ot_net_1.b64)(Buffer.concat(y1.map((v) => leBytes(v, 8)))),
|
|
111
|
+
});
|
|
112
|
+
function decodeY(raw, m) {
|
|
113
|
+
if (!(0, ot_net_1.J)(raw))
|
|
114
|
+
throw new Error('bad ciphertext message');
|
|
115
|
+
const a = (0, ot_net_1.unb64)(raw.y0, m * 8);
|
|
116
|
+
const b = (0, ot_net_1.unb64)(raw.y1, m * 8);
|
|
117
|
+
return { y0: Array.from({ length: m }, (_, i) => fromLe(a, i * 8, 8)), y1: Array.from({ length: m }, (_, i) => fromLe(b, i * 8, 8)) };
|
|
118
|
+
}
|
|
119
|
+
const pairsB64 = (ps) => ps.map(([a, b]) => [(0, ot_net_1.b64)(a), (0, ot_net_1.b64)(b)]);
|
|
120
|
+
function parsePairs(raw, count, len) {
|
|
121
|
+
if (!Array.isArray(raw) || raw.length !== count)
|
|
122
|
+
throw new Error('bad pair array');
|
|
123
|
+
return raw.map((p) => {
|
|
124
|
+
if (!Array.isArray(p) || p.length !== 2)
|
|
125
|
+
throw new Error('bad pair');
|
|
126
|
+
return [(0, ot_net_1.unb64)(p[0], len), (0, ot_net_1.unb64)(p[1], len)];
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
async function runOfflineNet(a) {
|
|
130
|
+
const { mesh, id, n, C, keys: K, partners: P, exchange } = a;
|
|
131
|
+
const others = [];
|
|
132
|
+
for (let i = 0; i < n; i++)
|
|
133
|
+
if (i !== id)
|
|
134
|
+
others.push(i);
|
|
135
|
+
const rng = (0, csprng_1.secureOtRandom)();
|
|
136
|
+
const frng = new csprng_1.SecureFieldRng();
|
|
137
|
+
/** My pairwise verification key Δ (non-zero, secret): the key that verifies every share the peers open to me. */
|
|
138
|
+
let delta = frng.next();
|
|
139
|
+
while (delta === 0n)
|
|
140
|
+
delta = frng.next();
|
|
141
|
+
let gadget = []; // set by the commit-reveal below, before the first OT multiplication
|
|
142
|
+
const sid = new Uint8Array((0, node_crypto_1.createHash)('sha256').update('atlas-pca-mpc/net-session/v2').update(mesh.sessionId).digest());
|
|
143
|
+
/** Binding of the channel whose EXTENSION RECEIVER (= base-OT sender) is `recv` and extension sender is `send`. */
|
|
144
|
+
const chan = (recv, send, round) => ({ sessionId: sid, senderIndex: recv, receiverIndex: send, round });
|
|
145
|
+
/** Run a check that may throw an OT error, turning it into an abort that names `peer`. */
|
|
146
|
+
const otGuard = (peer, what, f) => {
|
|
147
|
+
try {
|
|
148
|
+
return f();
|
|
149
|
+
}
|
|
150
|
+
catch (e) {
|
|
151
|
+
if (e instanceof wire_1.NetAbort)
|
|
152
|
+
throw e;
|
|
153
|
+
const kind = e instanceof ot_1.BaseOtAbort || e instanceof ot_1.MalOtAbort || e instanceof ec_1.PointValidationError ? 'ot-check' : 'malformed';
|
|
154
|
+
const ne = new wire_1.NetAbort(kind, peer, id, `${what}: ${e.message}`);
|
|
155
|
+
mesh.fail(ne);
|
|
156
|
+
throw ne;
|
|
157
|
+
}
|
|
158
|
+
};
|
|
159
|
+
// ------------------------------------------------------------------ base OTs (kappa per ordered pair, both roles)
|
|
160
|
+
const recvCh = new Map(); // I am the extension receiver (base-OT sender) towards `peer`
|
|
161
|
+
const sendCh = new Map(); // I am the extension sender (base-OT receiver) towards `peer`
|
|
162
|
+
const seeds = new Map();
|
|
163
|
+
const mySetup = new Map();
|
|
164
|
+
const selector = new Map();
|
|
165
|
+
for (const p of others) {
|
|
166
|
+
const r = new ot_1.OtExtReceiver(rng, (0, ot_1.bindingBytes)(chan(id, p, 'iknp-kos')));
|
|
167
|
+
seeds.set(p, r.makeSeeds());
|
|
168
|
+
recvCh.set(p, r);
|
|
169
|
+
mySetup.set(p, (0, ot_1.malBaseOtSenderSetup)(rng, chan(id, p, 'offline-kappa')));
|
|
170
|
+
const s = new ot_1.OtExtSender(rng, (0, ot_1.bindingBytes)(chan(p, id, 'iknp-kos')));
|
|
171
|
+
selector.set(p, s.makeSelector());
|
|
172
|
+
sendCh.set(p, s);
|
|
173
|
+
}
|
|
174
|
+
const theirS = await exchange('ob-S', (peer) => {
|
|
175
|
+
const st = mySetup.get(peer);
|
|
176
|
+
return { S: (0, ot_net_1.ptJ)(st.S), U: (0, ot_net_1.ptJ)(st.proof.U), z: (0, wire_1.hx)(a.behavior?.kind === 'ot-proof-lie' ? st.proof.z + 1n : st.proof.z) };
|
|
177
|
+
}, (p, raw) => {
|
|
178
|
+
if (!(0, ot_net_1.J)(raw))
|
|
179
|
+
a.bad(p, 'bad S message');
|
|
180
|
+
const o = raw;
|
|
181
|
+
const proof = { U: (0, ot_net_1.jPt)(o.U), z: (0, ot_net_1.hexBig)(o.z) };
|
|
182
|
+
return { S: (0, ot_net_1.jPt)(o.S), proof };
|
|
183
|
+
});
|
|
184
|
+
const respond = new Map();
|
|
185
|
+
for (const p of others) {
|
|
186
|
+
const st = theirS.get(p);
|
|
187
|
+
respond.set(p, otGuard(p, 'base OT (receiver)', () => (0, ot_1.malBaseOtReceiverRespond)(st.S, st.proof, selector.get(p), rng, chan(p, id, 'offline-kappa'))));
|
|
188
|
+
}
|
|
189
|
+
const theirR = await exchange('ob-R', (peer) => respond.get(peer).R.map(ot_net_1.ptJ), (p, raw) => {
|
|
190
|
+
if (!Array.isArray(raw) || raw.length !== ot_1.KAPPA)
|
|
191
|
+
return a.bad(p, 'bad R array');
|
|
192
|
+
return raw.map(ot_net_1.jPt);
|
|
193
|
+
});
|
|
194
|
+
const enc = new Map();
|
|
195
|
+
for (const p of others) {
|
|
196
|
+
const st = mySetup.get(p);
|
|
197
|
+
enc.set(p, otGuard(p, 'base OT (sender)', () => {
|
|
198
|
+
const pads = (0, ot_1.malBaseOtSenderDerive)(st.y, st.T, theirR.get(p), st.S, chan(id, p, 'offline-kappa'));
|
|
199
|
+
return (0, ot_1.baseOtSenderEncrypt)(seeds.get(p), pads);
|
|
200
|
+
}));
|
|
201
|
+
}
|
|
202
|
+
const theirCt = await exchange('ob-C', (peer) => ({ ct: pairsB64(enc.get(peer).ct), com: pairsB64(enc.get(peer).com) }), (p, raw) => {
|
|
203
|
+
if (!(0, ot_net_1.J)(raw))
|
|
204
|
+
return a.bad(p, 'bad ciphertext message');
|
|
205
|
+
return { ct: parsePairs(raw.ct, ot_1.KAPPA, 16), com: parsePairs(raw.com, ot_1.KAPPA, 32) };
|
|
206
|
+
});
|
|
207
|
+
for (const p of others) {
|
|
208
|
+
const m = theirCt.get(p);
|
|
209
|
+
const got = otGuard(p, 'base OT (receiver)', () => (0, ot_1.baseOtReceiverDecrypt)(selector.get(p), respond.get(p).recvPads, m.ct, m.com));
|
|
210
|
+
sendCh.get(p).setSeeds(got);
|
|
211
|
+
}
|
|
212
|
+
// ------------------------------------------------------------------ the jointly contributed choice-bit gadget
|
|
213
|
+
{
|
|
214
|
+
// R3-16: signed commit / reveal / echo (gadget.ts): one corrupt party cannot give different honest parties different gadgets.
|
|
215
|
+
const seedsAgreed = await (0, gadget_1.agreeGadgetSeeds)(mesh, n, { exchange, bad: a.bad });
|
|
216
|
+
gadget = gadgetFromSeeds(mesh.sessionId, seedsAgreed);
|
|
217
|
+
}
|
|
218
|
+
// ------------------------------------------------------------------ the OT multiplication layer (Gilboa)
|
|
219
|
+
/**
|
|
220
|
+
* The Gilboa OT core. For every peer p: as the OT RECEIVER towards p I choose with the bits of my `xs[t]`
|
|
221
|
+
* and get `recv[p][t] = x_t·y^p_t + Σρ^p_t` (p's operand y^p_t and p's masks ρ); as the OT SENDER towards p I
|
|
222
|
+
* offer `(ρ_k, ρ_k + 2^k·ys[t])` with fresh masks and keep `sendSum[p][t] = Σρ`. So
|
|
223
|
+
* `recv[p][t] − sendSum^{p}[t]` over the pair is an additive sharing of `x_t·y_t`; the tag layer below uses
|
|
224
|
+
* the two halves separately.
|
|
225
|
+
*/
|
|
226
|
+
async function otRows(layer, items, keep) {
|
|
227
|
+
const T = items.length;
|
|
228
|
+
const recv = new Map();
|
|
229
|
+
const sendSum = new Map();
|
|
230
|
+
const kept = { recv: new Map(), rho: new Map() };
|
|
231
|
+
for (const p of others) {
|
|
232
|
+
recv.set(p, new Array(T).fill(0n));
|
|
233
|
+
sendSum.set(p, new Array(T).fill(0n));
|
|
234
|
+
kept.recv.set(p, new Map());
|
|
235
|
+
kept.rho.set(p, new Map());
|
|
236
|
+
}
|
|
237
|
+
if (T === 0 || others.length === 0)
|
|
238
|
+
return { recv, sendSum, kept };
|
|
239
|
+
let rows = 0;
|
|
240
|
+
for (const it of items)
|
|
241
|
+
rows += it.bits.length;
|
|
242
|
+
const rowItem = new Int32Array(rows);
|
|
243
|
+
const choice = new Array(rows);
|
|
244
|
+
const m0 = new Map();
|
|
245
|
+
const m1 = new Map();
|
|
246
|
+
for (const p of others) {
|
|
247
|
+
m0.set(p, new Array(rows));
|
|
248
|
+
m1.set(p, new Array(rows));
|
|
249
|
+
}
|
|
250
|
+
let off = 0;
|
|
251
|
+
const itemOff = new Int32Array(T);
|
|
252
|
+
for (let t = 0; t < T; t++) {
|
|
253
|
+
const it = items[t];
|
|
254
|
+
const len = it.bits.length;
|
|
255
|
+
itemOff[t] = off;
|
|
256
|
+
if (keep?.has(t))
|
|
257
|
+
for (const p of others)
|
|
258
|
+
kept.recv.get(p).set(t, new Array(len).fill(0n));
|
|
259
|
+
for (let k = 0; k < len; k++) {
|
|
260
|
+
choice[off + k] = it.bits[k];
|
|
261
|
+
rowItem[off + k] = t;
|
|
262
|
+
}
|
|
263
|
+
for (const p of others) {
|
|
264
|
+
const a0 = m0.get(p);
|
|
265
|
+
const a1 = m1.get(p);
|
|
266
|
+
const ss = sendSum.get(p);
|
|
267
|
+
let sumRho = 0n;
|
|
268
|
+
for (let k = 0; k < len; k++) {
|
|
269
|
+
const rho = frng.next();
|
|
270
|
+
sumRho = (0, field_1.fadd)(sumRho, rho);
|
|
271
|
+
a0[off + k] = rho;
|
|
272
|
+
a1[off + k] = (0, field_1.fadd)(rho, (0, field_1.fmul)(it.gad[k], it.y));
|
|
273
|
+
}
|
|
274
|
+
ss[t] = sumRho;
|
|
275
|
+
if (keep?.has(t))
|
|
276
|
+
kept.rho.get(p).set(t, a0.slice(off, off + len));
|
|
277
|
+
}
|
|
278
|
+
off += len;
|
|
279
|
+
}
|
|
280
|
+
let chunk = 0;
|
|
281
|
+
for (let start = 0; start < rows; start += ROWS_PER_ROUND, chunk++) {
|
|
282
|
+
const end = Math.min(rows, start + ROWS_PER_ROUND);
|
|
283
|
+
const m = end - start;
|
|
284
|
+
const mExt = m + ot_1.KAPPA + ot_1.SSEC;
|
|
285
|
+
const tag = `ox${layer}.${chunk}`;
|
|
286
|
+
const begun = new Map();
|
|
287
|
+
if (a.behavior?.kind === 'ot-u-lie') {
|
|
288
|
+
// an inconsistent matrix: flip the first row in 64 of the 128 columns only (not a different choice vector)
|
|
289
|
+
for (const p of others)
|
|
290
|
+
recvCh.get(p).tamperU = (u) => { for (let i = 0; i < 64; i++)
|
|
291
|
+
u[i] = u[i] ^ 1n; };
|
|
292
|
+
}
|
|
293
|
+
for (const p of others)
|
|
294
|
+
begun.set(p, recvCh.get(p).begin(choice.slice(start, end)));
|
|
295
|
+
const us = await exchange(`${tag}.u`, (peer) => encodeU(begun.get(peer).msg, mExt), (p, raw) => decodeU(raw, mExt));
|
|
296
|
+
const ys2 = new Map();
|
|
297
|
+
for (const p of others) {
|
|
298
|
+
ys2.set(p, otGuard(p, `OT extension (${tag})`, () => sendCh.get(p).respond(us.get(p), m0.get(p).slice(start, end), m1.get(p).slice(start, end))));
|
|
299
|
+
}
|
|
300
|
+
const cts = await exchange(`${tag}.y`, (peer) => encodeY(ys2.get(peer).y0, ys2.get(peer).y1), (p, raw) => decodeY(raw, m));
|
|
301
|
+
for (const p of others) {
|
|
302
|
+
const got = otGuard(p, `OT extension (${tag})`, () => recvCh.get(p).finish(begun.get(p).pending, cts.get(p).y0, cts.get(p).y1));
|
|
303
|
+
const rv = recv.get(p);
|
|
304
|
+
for (let j = 0; j < m; j++) {
|
|
305
|
+
const t = rowItem[start + j];
|
|
306
|
+
rv[t] = (0, field_1.fadd)(rv[t], (0, field_1.mod)(got[j]));
|
|
307
|
+
if (keep?.has(t))
|
|
308
|
+
kept.recv.get(p).get(t)[start + j - itemOff[t]] = (0, field_1.mod)(got[j]);
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
return { recv, sendSum, kept };
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Given my shares `xs[t]` of X_t and `ys[t]` of Y_t, return my additive share of X_t*Y_t = (sum x)(sum y):
|
|
316
|
+
* the diagonal x_i*y_i locally plus, for every ordered pair, the Gilboa OT product of one party's x with the
|
|
317
|
+
* other's y. Neither party learns the other's operand or share.
|
|
318
|
+
*/
|
|
319
|
+
async function mulLayer(layer, xs, ys, lieAt = -1, keep) {
|
|
320
|
+
const z = xs.map((x, t) => (0, field_1.fmul)(x.value, ys[t]));
|
|
321
|
+
const items = xs.map((x, t) => ({ bits: x.bits, gad: gadget, y: t === lieAt ? (0, field_1.fadd)(ys[t], 1n) : ys[t] }));
|
|
322
|
+
const { recv, sendSum, kept } = await otRows(layer, items, keep);
|
|
323
|
+
for (const p of others) {
|
|
324
|
+
const rv = recv.get(p);
|
|
325
|
+
const ss = sendSum.get(p);
|
|
326
|
+
for (let t = 0; t < z.length; t++)
|
|
327
|
+
z[t] = (0, field_1.fsub)((0, field_1.fadd)(z[t], rv[t]), ss[t]);
|
|
328
|
+
}
|
|
329
|
+
return { z, kept };
|
|
330
|
+
}
|
|
331
|
+
/**
|
|
332
|
+
* Pairwise tags for my shares `xs`: for every peer j, a tag T_ij (mine) and a key K_ji (for verifying j's share
|
|
333
|
+
* of the same item) with T_ij = K_ij + Δ_j·x_i, where Δ_j is j's secret verification key. One OT product of my
|
|
334
|
+
* x with j's Δ per item: I receive T_ij, and j keeps the sum of its masks as K_ij.
|
|
335
|
+
*
|
|
336
|
+
* A tag operand is an arbitrary derived value (a MAC share, a product share), with no uniform choice-bit encoding
|
|
337
|
+
* of its own, so each x is split as x = e + d with a fresh encoded e and d = x - e; both halves are multiplied
|
|
338
|
+
* with Δ and the results added. A sender's selective failure on d reveals bits of d, which is uniform given e.
|
|
339
|
+
*/
|
|
340
|
+
async function tagLayer(layer, xs) {
|
|
341
|
+
const items = [];
|
|
342
|
+
for (const x of xs) {
|
|
343
|
+
const e = (0, enc_1.sampleEnc)(gadget, frng);
|
|
344
|
+
const d = (0, enc_1.plainShare)((0, field_1.fsub)(x, e.value));
|
|
345
|
+
items.push({ bits: e.bits, gad: gadget, y: delta }, { bits: d.bits, gad: enc_1.PLAIN_GADGET, y: delta });
|
|
346
|
+
}
|
|
347
|
+
const { recv, sendSum } = await otRows(layer, items);
|
|
348
|
+
const tag = new Map();
|
|
349
|
+
const key = new Map();
|
|
350
|
+
for (const p of others) {
|
|
351
|
+
const r = recv.get(p);
|
|
352
|
+
const k = sendSum.get(p);
|
|
353
|
+
tag.set(p, xs.map((_, u) => (0, field_1.fadd)(r[2 * u], r[2 * u + 1])));
|
|
354
|
+
key.set(p, xs.map((_, u) => (0, field_1.fadd)(k[2 * u], k[2 * u + 1])));
|
|
355
|
+
}
|
|
356
|
+
return { tag, key };
|
|
357
|
+
}
|
|
358
|
+
// ------------------------------------------------------------------ my randomness and the input sharings
|
|
359
|
+
const alphaEnc = Array.from({ length: K }, () => (0, enc_1.sampleEnc)(gadget, frng));
|
|
360
|
+
const alphaShare = alphaEnc.map((e) => e.value);
|
|
361
|
+
const myBits = [a.input.allow, ...(0, thermometer_1.thermometerEncode)(a.input.t, T_M), ...(0, thermometer_1.thermometerEncode)(a.input.rQuant, a.Q)];
|
|
362
|
+
if (myBits.length !== C)
|
|
363
|
+
throw new wire_1.NetAbort('local', null, id, 'input chain count mismatch');
|
|
364
|
+
// split each of my bits into additive shares: a random share for every peer, the rest is mine
|
|
365
|
+
const outShares = new Map();
|
|
366
|
+
for (const p of others)
|
|
367
|
+
outShares.set(p, Array.from({ length: C }, () => frng.next()));
|
|
368
|
+
const myOwn = myBits.map((b, c) => {
|
|
369
|
+
let s = BigInt(b);
|
|
370
|
+
for (const p of others)
|
|
371
|
+
s = (0, field_1.fsub)(s, outShares.get(p)[c]);
|
|
372
|
+
return s;
|
|
373
|
+
});
|
|
374
|
+
const gotShares = await exchange('in-share', (peer) => outShares.get(peer).map(wire_1.hx), (p, raw) => a.arr(p, raw, C));
|
|
375
|
+
const inputValue = []; // my value share of every (owner, chain)
|
|
376
|
+
for (let o = 0; o < n; o++)
|
|
377
|
+
for (let c = 0; c < C; c++)
|
|
378
|
+
inputValue.push(o === id ? myOwn[c] : gotShares.get(o)[c]);
|
|
379
|
+
const maskShare = frng.next(); // my share of the input-check mask
|
|
380
|
+
const nT = (n - 1) * C;
|
|
381
|
+
const aE = [];
|
|
382
|
+
const bS = [];
|
|
383
|
+
const ahE = [];
|
|
384
|
+
for (let t = 0; t < nT; t++) {
|
|
385
|
+
aE.push((0, enc_1.sampleEnc)(gadget, frng));
|
|
386
|
+
bS.push(frng.next());
|
|
387
|
+
ahE.push(Array.from({ length: P }, () => (0, enc_1.sampleEnc)(gadget, frng)));
|
|
388
|
+
}
|
|
389
|
+
const aS = aE.map((e) => e.value);
|
|
390
|
+
const ahS = ahE.map((row) => row.map((e) => e.value));
|
|
391
|
+
// ------------------------------------------------------------------ layer 1: products and the MACs of known values
|
|
392
|
+
const xs1 = [];
|
|
393
|
+
const ys1 = [];
|
|
394
|
+
const push1 = (x, y) => {
|
|
395
|
+
xs1.push(x);
|
|
396
|
+
ys1.push(y);
|
|
397
|
+
return xs1.length - 1;
|
|
398
|
+
};
|
|
399
|
+
const iC = [];
|
|
400
|
+
const iCh = [];
|
|
401
|
+
const iMa = [];
|
|
402
|
+
const iMb = [];
|
|
403
|
+
const iMah = [];
|
|
404
|
+
for (let t = 0; t < nT; t++) {
|
|
405
|
+
iC.push(push1(aE[t], bS[t]));
|
|
406
|
+
iCh.push(Array.from({ length: P }, (_, r) => push1(ahE[t][r], bS[t])));
|
|
407
|
+
iMa.push(alphaEnc.map((al) => push1(al, aS[t])));
|
|
408
|
+
iMb.push(alphaEnc.map((al) => push1(al, bS[t])));
|
|
409
|
+
iMah.push(Array.from({ length: P }, (_, r) => alphaEnc.map((al) => push1(al, ahS[t][r]))));
|
|
410
|
+
}
|
|
411
|
+
const iIn = inputValue.map((val) => alphaEnc.map((al) => push1(al, val)));
|
|
412
|
+
const iMask = alphaEnc.map((al) => push1(al, maskShare));
|
|
413
|
+
const keepItems = new Set([...iC, ...iCh.flat()]);
|
|
414
|
+
const { z: z1, kept: kept1 } = await mulLayer('1', xs1, ys1, a.behavior?.kind === 'offline-lie' && iC.length > 0 ? iC[0] : -1, keepItems);
|
|
415
|
+
// ------------------------------------------------------------------ layer 2: the MACs of the products
|
|
416
|
+
const cS = iC.map((i) => z1[i]);
|
|
417
|
+
const chS = iCh.map((row) => row.map((i) => z1[i]));
|
|
418
|
+
const xs2 = [];
|
|
419
|
+
const ys2 = [];
|
|
420
|
+
const push2 = (x, y) => {
|
|
421
|
+
xs2.push(x);
|
|
422
|
+
ys2.push(y);
|
|
423
|
+
return xs2.length - 1;
|
|
424
|
+
};
|
|
425
|
+
const iMc = [];
|
|
426
|
+
const iMch = [];
|
|
427
|
+
for (let t = 0; t < nT; t++) {
|
|
428
|
+
iMc.push(alphaEnc.map((al) => push2(al, cS[t])));
|
|
429
|
+
iMch.push(chS[t].map((chv) => alphaEnc.map((al) => push2(al, chv))));
|
|
430
|
+
}
|
|
431
|
+
const { z: z2 } = await mulLayer('2', xs2, ys2);
|
|
432
|
+
// ------------------------------------------------------------------ assemble, then pairwise-tag every share
|
|
433
|
+
const pa = (x) => ({ x, tag: new Array(n).fill(0n), key: new Array(n).fill(0n) });
|
|
434
|
+
const aw = (value, macIdx, z) => ({ v: pa(value), m: macIdx.map((i) => pa(z[i])) });
|
|
435
|
+
const triples = [];
|
|
436
|
+
for (let t = 0; t < nT; t++) {
|
|
437
|
+
const sh = [aw(aS[t], iMa[t], z1), aw(bS[t], iMb[t], z1), aw(cS[t], iMc[t], z2)];
|
|
438
|
+
for (let r = 0; r < P; r++) {
|
|
439
|
+
sh.push(aw(ahS[t][r], iMah[t][r], z1));
|
|
440
|
+
sh.push(aw(chS[t][r], iMch[t][r], z2));
|
|
441
|
+
}
|
|
442
|
+
if (sh.length !== (0, prep_1.sharingsPerTriple)(P))
|
|
443
|
+
throw new wire_1.NetAbort('local', null, id, 'triple assembly mismatch');
|
|
444
|
+
triples.push(sh);
|
|
445
|
+
}
|
|
446
|
+
const inputs = inputValue.map((val, q) => aw(val, iIn[q], z1));
|
|
447
|
+
const checkMask = aw(maskShare, iMask, z1);
|
|
448
|
+
const alpha = alphaShare.map(pa);
|
|
449
|
+
const allPA = [...alpha];
|
|
450
|
+
for (const w of [...triples.flat(), ...inputs, checkMask])
|
|
451
|
+
allPA.push(w.v, ...w.m);
|
|
452
|
+
const tags = await tagLayer('3', allPA.map((x) => x.x));
|
|
453
|
+
allPA.forEach((x, u) => {
|
|
454
|
+
for (const p of others) {
|
|
455
|
+
x.tag[p] = tags.tag.get(p)[u];
|
|
456
|
+
x.key[p] = tags.key.get(p)[u];
|
|
457
|
+
}
|
|
458
|
+
});
|
|
459
|
+
return {
|
|
460
|
+
mode: 'no-dealer',
|
|
461
|
+
tagged: true,
|
|
462
|
+
delta,
|
|
463
|
+
alpha,
|
|
464
|
+
triples,
|
|
465
|
+
inputs,
|
|
466
|
+
myPlain: myBits.map((b) => BigInt(b)),
|
|
467
|
+
checkMask,
|
|
468
|
+
forensics: {
|
|
469
|
+
gadget,
|
|
470
|
+
rows: gadget.length,
|
|
471
|
+
slots: 1 + P,
|
|
472
|
+
disclose: (t) => {
|
|
473
|
+
const slot = (item, x, z) => ({
|
|
474
|
+
bits: x.bits.slice(),
|
|
475
|
+
y: bS[t],
|
|
476
|
+
z,
|
|
477
|
+
recv: new Map(others.map((p) => [p, kept1.recv.get(p).get(item)])),
|
|
478
|
+
rho: new Map(others.map((p) => [p, kept1.rho.get(p).get(item)])),
|
|
479
|
+
});
|
|
480
|
+
return [slot(iC[t], aE[t], cS[t]), ...iCh[t].map((item, r) => slot(item, ahE[t][r], chS[t][r]))];
|
|
481
|
+
},
|
|
482
|
+
},
|
|
483
|
+
};
|
|
484
|
+
}
|
|
485
|
+
//# sourceMappingURL=offline-net.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"offline-net.js","sourceRoot":"","sources":["../../src/net/offline-net.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pairwise base oblivious transfer OVER THE NETWORK (research prototype), running the WASM-backed
|
|
3
|
+
* primitives on two separate hosts:
|
|
4
|
+
* - 'ec' : the malicious-secure Chou-Orlandi-style base OT on Ed25519 (`@atlasauth/pca-mpc-wasm`,
|
|
5
|
+
* curve25519-dalek constant-time scalar multiplication), with Schnorr proof of knowledge and
|
|
6
|
+
* subgroup validation of every received point.
|
|
7
|
+
* - 'lwe' : the post-quantum ENDEMIC OT of Masny-Rindal over Module-LWE (`@atlasauth/pca-mpc-lwe-ot-wasm`,
|
|
8
|
+
* audited pqc_kyber K-PKE).
|
|
9
|
+
*
|
|
10
|
+
* This is a FUNCTIONAL-CORRECTNESS demonstration: after the protocol the receiver reveals its choice bits
|
|
11
|
+
* and a hash of each received pad (a demo-only step, NOT part of the OT) so the sender can check that the
|
|
12
|
+
* pad the receiver got equals the sender's pad at the receiver's choice, over a real network.
|
|
13
|
+
*/
|
|
14
|
+
import { type BaseOtBinding } from '../ot';
|
|
15
|
+
import { type Point } from '../ec';
|
|
16
|
+
import type { Mesh } from './mesh';
|
|
17
|
+
export type OtKind = 'ec' | 'lwe';
|
|
18
|
+
export interface OtNetResult {
|
|
19
|
+
kind: OtKind;
|
|
20
|
+
role: 'sender' | 'receiver';
|
|
21
|
+
count: number;
|
|
22
|
+
ms: number;
|
|
23
|
+
wasmCurveActive: boolean;
|
|
24
|
+
matched: boolean;
|
|
25
|
+
/** Digest over all pads this party holds (sender: both pads; receiver: chosen pads) - evidence, not secrets. */
|
|
26
|
+
padDigest: string;
|
|
27
|
+
}
|
|
28
|
+
export declare const b64: (u: Uint8Array) => string;
|
|
29
|
+
/** @internal exported for the canonical-encoding regression test. Strict: re-encoding must reproduce `s` (no trailing-bit / padding aliases). */
|
|
30
|
+
export declare const unb64: (s: unknown, len?: number) => Uint8Array;
|
|
31
|
+
export declare const ptJ: (p: Point) => {
|
|
32
|
+
x: string;
|
|
33
|
+
y: string;
|
|
34
|
+
};
|
|
35
|
+
export declare const J: (v: unknown) => v is Record<string, unknown>;
|
|
36
|
+
/** @internal exported for the canonical-encoding regression test. Canonical lowercase hex, no leading zeros (matches `hx`). */
|
|
37
|
+
export declare const hexBig: (s: unknown) => bigint;
|
|
38
|
+
export declare function jPt(v: unknown): Point;
|
|
39
|
+
/** Binding of a base OT on this mesh: session (hashed to a fixed length), who sends, who receives, which round. */
|
|
40
|
+
export declare function netBinding(mesh: Mesh, senderIndex: number, receiverIndex: number, round: string): BaseOtBinding;
|
|
41
|
+
export declare function runOtSender(mesh: Mesh, peer: number, kind: OtKind, count: number): Promise<OtNetResult>;
|
|
42
|
+
export declare function runOtReceiver(mesh: Mesh, peer: number, kind: OtKind, count: number): Promise<OtNetResult>;
|