@bcts/frost-hubert 1.0.0-alpha.23 → 1.0.0-beta.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 +1 -1
- package/dist/bin/frost.cjs +344 -72
- package/dist/bin/frost.cjs.map +1 -1
- package/dist/bin/frost.mjs +344 -71
- package/dist/bin/frost.mjs.map +1 -1
- package/dist/busy-B_h0bNAJ.cjs +38 -0
- package/dist/busy-B_h0bNAJ.cjs.map +1 -0
- package/dist/busy-BlU8_pS2.mjs +27 -0
- package/dist/busy-BlU8_pS2.mjs.map +1 -0
- package/dist/cmd/index.cjs +27 -22
- package/dist/cmd/index.d.cts +2 -2
- package/dist/cmd/index.d.mts +2 -2
- package/dist/cmd/index.mjs +6 -3
- package/dist/cmd-CCVhHzG7.cjs +129 -0
- package/dist/cmd-CCVhHzG7.cjs.map +1 -0
- package/dist/cmd-DNsHd19v.mjs +112 -0
- package/dist/cmd-DNsHd19v.mjs.map +1 -0
- package/dist/common-7-BOgaTt.cjs +113 -0
- package/dist/common-7-BOgaTt.cjs.map +1 -0
- package/dist/common-Cf1UvJaP.mjs +282 -0
- package/dist/common-Cf1UvJaP.mjs.map +1 -0
- package/dist/common-CnvAUC2b.cjs +372 -0
- package/dist/common-CnvAUC2b.cjs.map +1 -0
- package/dist/common-DNrD_-EI.mjs +96 -0
- package/dist/common-DNrD_-EI.mjs.map +1 -0
- package/dist/dkg/index.cjs +6 -103
- package/dist/dkg/index.cjs.map +1 -1
- package/dist/dkg/index.d.cts +2 -2
- package/dist/dkg/index.d.mts +2 -2
- package/dist/dkg/index.mjs +4 -101
- package/dist/dkg/index.mjs.map +1 -1
- package/dist/finalize-BpC0rz93.mjs +389 -0
- package/dist/finalize-BpC0rz93.mjs.map +1 -0
- package/dist/finalize-Cb0obTSo.cjs +402 -0
- package/dist/finalize-Cb0obTSo.cjs.map +1 -0
- package/dist/finalize-DHEnKobp.cjs +303 -0
- package/dist/finalize-DHEnKobp.cjs.map +1 -0
- package/dist/finalize-DQ0VGUHO.cjs +265 -0
- package/dist/finalize-DQ0VGUHO.cjs.map +1 -0
- package/dist/finalize-DtRxHZ7H.mjs +290 -0
- package/dist/finalize-DtRxHZ7H.mjs.map +1 -0
- package/dist/finalize-T83Ko8nG.mjs +252 -0
- package/dist/finalize-T83Ko8nG.mjs.map +1 -0
- package/dist/frost/index.cjs +1 -1
- package/dist/frost/index.cjs.map +1 -1
- package/dist/frost/index.d.cts.map +1 -1
- package/dist/frost/index.d.mts.map +1 -1
- package/dist/frost/index.mjs +1 -1
- package/dist/frost/index.mjs.map +1 -1
- package/dist/{index-BJlwbPYu.d.cts → index-BErX9AZF.d.cts} +101 -79
- package/dist/index-BErX9AZF.d.cts.map +1 -0
- package/dist/{index-BkqLimZT.d.mts → index-BaUVw4b1.d.mts} +25 -2
- package/dist/index-BaUVw4b1.d.mts.map +1 -0
- package/dist/{index-BMbPgH0W.d.cts → index-CD50Qtgw.d.cts} +46 -2
- package/dist/index-CD50Qtgw.d.cts.map +1 -0
- package/dist/{index-DoV5HFvV.d.mts → index-CD50Qtgw.d.mts} +46 -2
- package/dist/index-CD50Qtgw.d.mts.map +1 -0
- package/dist/{index-Dzm1v4_4.d.mts → index-Drklne-Y.d.mts} +101 -79
- package/dist/index-Drklne-Y.d.mts.map +1 -0
- package/dist/{index-DmxfT59Y.d.cts → index-gkmZzEuD.d.cts} +25 -2
- package/dist/index-gkmZzEuD.d.cts.map +1 -0
- package/dist/index.cjs +30 -23
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +4 -4
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +4 -4
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +8 -4
- package/dist/index.mjs.map +1 -1
- package/dist/invite-1tzg0B0P.cjs +274 -0
- package/dist/invite-1tzg0B0P.cjs.map +1 -0
- package/dist/invite-BLwtexAu.cjs +109 -0
- package/dist/invite-BLwtexAu.cjs.map +1 -0
- package/dist/invite-Be2v2SVc.mjs +96 -0
- package/dist/invite-Be2v2SVc.mjs.map +1 -0
- package/dist/invite-D8mQSnFz.mjs +219 -0
- package/dist/invite-D8mQSnFz.mjs.map +1 -0
- package/dist/parallel-PZiwHZT8.mjs +235 -0
- package/dist/parallel-PZiwHZT8.mjs.map +1 -0
- package/dist/parallel-szwYx-bi.cjs +318 -0
- package/dist/parallel-szwYx-bi.cjs.map +1 -0
- package/dist/proposed-participant-BvHNnpcZ.cjs +140 -0
- package/dist/proposed-participant-BvHNnpcZ.cjs.map +1 -0
- package/dist/proposed-participant-Detb823_.mjs +129 -0
- package/dist/proposed-participant-Detb823_.mjs.map +1 -0
- package/dist/receive-BR-knnGv.cjs +213 -0
- package/dist/receive-BR-knnGv.cjs.map +1 -0
- package/dist/receive-D_r4Mryr.cjs +190 -0
- package/dist/receive-D_r4Mryr.cjs.map +1 -0
- package/dist/receive-dkSCSGpl.mjs +188 -0
- package/dist/receive-dkSCSGpl.mjs.map +1 -0
- package/dist/receive-g8EhZF2Y.mjs +177 -0
- package/dist/receive-g8EhZF2Y.mjs.map +1 -0
- package/dist/registry/index.cjs +86 -11
- package/dist/registry/index.cjs.map +1 -1
- package/dist/registry/index.d.cts +1 -1
- package/dist/registry/index.d.mts +1 -1
- package/dist/registry/index.mjs +85 -10
- package/dist/registry/index.mjs.map +1 -1
- package/dist/{registry-loI1_Mh1.cjs → registry-CkIbA7nt.cjs} +79 -2
- package/dist/registry-CkIbA7nt.cjs.map +1 -0
- package/dist/{registry-CgrCZ4En.mjs → registry-DGjs4qDK.mjs} +74 -3
- package/dist/registry-DGjs4qDK.mjs.map +1 -0
- package/dist/round1-9FAqFvL5.cjs +465 -0
- package/dist/round1-9FAqFvL5.cjs.map +1 -0
- package/dist/round1-B8haiMM8.mjs +208 -0
- package/dist/round1-B8haiMM8.mjs.map +1 -0
- package/dist/round1-BOIE1E4O.mjs +452 -0
- package/dist/round1-BOIE1E4O.mjs.map +1 -0
- package/dist/round1-Bq0vweyQ.cjs +422 -0
- package/dist/round1-Bq0vweyQ.cjs.map +1 -0
- package/dist/round1-CXkXoVQU.cjs +208 -0
- package/dist/round1-CXkXoVQU.cjs.map +1 -0
- package/dist/round1-D8t7EzIo.mjs +373 -0
- package/dist/round1-D8t7EzIo.mjs.map +1 -0
- package/dist/round1-DriPu15x.cjs +221 -0
- package/dist/round1-DriPu15x.cjs.map +1 -0
- package/dist/round1-Y2kcVwnR.mjs +195 -0
- package/dist/round1-Y2kcVwnR.mjs.map +1 -0
- package/dist/round2-AMDYMUIg.cjs +305 -0
- package/dist/round2-AMDYMUIg.cjs.map +1 -0
- package/dist/round2-BHQKVJFo.cjs +410 -0
- package/dist/round2-BHQKVJFo.cjs.map +1 -0
- package/dist/round2-BfetYacV.mjs +450 -0
- package/dist/round2-BfetYacV.mjs.map +1 -0
- package/dist/round2-Cf5CJc_8.mjs +397 -0
- package/dist/round2-Cf5CJc_8.mjs.map +1 -0
- package/dist/round2-CvrmylN1.cjs +293 -0
- package/dist/round2-CvrmylN1.cjs.map +1 -0
- package/dist/round2-Dk_w97nl.cjs +499 -0
- package/dist/round2-Dk_w97nl.cjs.map +1 -0
- package/dist/round2-Z2JhMwxc.mjs +292 -0
- package/dist/round2-Z2JhMwxc.mjs.map +1 -0
- package/dist/round2-mF6UlkT-.mjs +280 -0
- package/dist/round2-mF6UlkT-.mjs.map +1 -0
- package/package.json +14 -14
- package/src/bin/frost.ts +849 -128
- package/src/cmd/common.ts +19 -1
- package/src/cmd/dkg/common.ts +97 -10
- package/src/cmd/dkg/coordinator/invite.ts +5 -2
- package/src/cmd/dkg/participant/finalize.ts +51 -17
- package/src/cmd/dkg/participant/round1.ts +39 -38
- package/src/cmd/dkg/participant/round2.ts +60 -26
- package/src/cmd/sign/coordinator/round2.ts +5 -1
- package/src/cmd/sign/participant/finalize.ts +6 -2
- package/src/cmd/sign/participant/receive.ts +5 -2
- package/src/dkg/group-invite.ts +12 -2
- package/src/dkg/proposed-participant.ts +32 -3
- package/src/registry/owner-record.ts +12 -0
- package/src/registry/participant-record.ts +35 -2
- package/src/registry/registry-impl.ts +74 -18
- package/dist/cmd-5yLeC_QL.mjs +0 -4708
- package/dist/cmd-5yLeC_QL.mjs.map +0 -1
- package/dist/cmd-BfZjC3Uh.cjs +0 -4847
- package/dist/cmd-BfZjC3Uh.cjs.map +0 -1
- package/dist/index-BJlwbPYu.d.cts.map +0 -1
- package/dist/index-BMbPgH0W.d.cts.map +0 -1
- package/dist/index-BkqLimZT.d.mts.map +0 -1
- package/dist/index-DmxfT59Y.d.cts.map +0 -1
- package/dist/index-DoV5HFvV.d.mts.map +0 -1
- package/dist/index-Dzm1v4_4.d.mts.map +0 -1
- package/dist/registry-CgrCZ4En.mjs.map +0 -1
- package/dist/registry-loI1_Mh1.cjs.map +0 -1
- /package/dist/{chunk-CZWwpsFl.cjs → chunk-DakpK96I.cjs} +0 -0
- /package/dist/{chunk-CjcI7cDX.mjs → chunk-z9aeyW2b.mjs} +0 -0
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
import { t as __exportAll } from "./chunk-z9aeyW2b.mjs";
|
|
2
|
+
import { n as compareXidBytes } from "./proposed-participant-Detb823_.mjs";
|
|
3
|
+
import { Registry, resolveRegistryPath } from "./registry/index.mjs";
|
|
4
|
+
import { c as parseAridUr, h as signingKeyFromVerifying, n as isVerbose, t as groupStateDir } from "./common-Cf1UvJaP.mjs";
|
|
5
|
+
import { n as putWithIndicator, t as getWithIndicator } from "./busy-BlU8_pS2.mjs";
|
|
6
|
+
import { i as createStorageClient } from "./registry-DGjs4qDK.mjs";
|
|
7
|
+
import { bytesToHex, dkgPart3, hexToBytes, identifierFromU16, identifierToHex, serializeKeyPackage, serializePublicKeyPackage } from "./frost/index.mjs";
|
|
8
|
+
import { ARID, JSON as JSON$1, XID } from "@bcts/components";
|
|
9
|
+
import { CborDate } from "@bcts/dcbor";
|
|
10
|
+
import { Envelope, Function } from "@bcts/envelope";
|
|
11
|
+
import { SealedRequest, SealedResponse } from "@bcts/gstp";
|
|
12
|
+
import * as fs from "node:fs";
|
|
13
|
+
import * as path from "node:path";
|
|
14
|
+
import { Ed25519Sha512, serde } from "@frosts/ed25519";
|
|
15
|
+
import { CoefficientCommitment, VerifiableSecretSharingCommitment, round2 } from "@frosts/core";
|
|
16
|
+
//#region src/cmd/dkg/participant/finalize.ts
|
|
17
|
+
/**
|
|
18
|
+
* Copyright © 2023-2026 Blockchain Commons, LLC
|
|
19
|
+
* Copyright © 2025-2026 Parity Technologies
|
|
20
|
+
*
|
|
21
|
+
*
|
|
22
|
+
* DKG participant finalize command.
|
|
23
|
+
*
|
|
24
|
+
* Port of cmd/dkg/participant/finalize.rs from frost-hubert-rust.
|
|
25
|
+
*
|
|
26
|
+
* @module
|
|
27
|
+
*/
|
|
28
|
+
var finalize_exports = /* @__PURE__ */ __exportAll({ finalize: () => finalize });
|
|
29
|
+
/**
|
|
30
|
+
* Load persisted round 2 state from disk.
|
|
31
|
+
*
|
|
32
|
+
* Port of round2_secret loading from cmd/dkg/participant/finalize.rs lines 82-106.
|
|
33
|
+
*/
|
|
34
|
+
function loadRound2State(registryPath, groupId) {
|
|
35
|
+
const stateDir = groupStateDir(registryPath, groupId.hex());
|
|
36
|
+
const round2SecretPath = path.join(stateDir, "round2_secret.json");
|
|
37
|
+
if (!fs.existsSync(round2SecretPath)) throw new Error(`Round 2 secret not found at ${round2SecretPath}. Did you run round2?`);
|
|
38
|
+
const secretJson = JSON.parse(fs.readFileSync(round2SecretPath, "utf-8"));
|
|
39
|
+
const idBytes = hexToBytes(secretJson.identifier);
|
|
40
|
+
let identifierU16 = 1;
|
|
41
|
+
if (idBytes.length >= 2) identifierU16 = idBytes[0] | idBytes[1] << 8;
|
|
42
|
+
if (identifierU16 === 0) identifierU16 = 1;
|
|
43
|
+
const identifier = identifierFromU16(identifierU16);
|
|
44
|
+
const commitment = new VerifiableSecretSharingCommitment(Ed25519Sha512, secretJson.commitment.map((hex) => CoefficientCommitment.deserialize(Ed25519Sha512, hexToBytes(hex))));
|
|
45
|
+
const secretShareScalar = Ed25519Sha512.deserializeScalar(hexToBytes(secretJson.secret_share));
|
|
46
|
+
const secretPackage = new round2.SecretPackage(Ed25519Sha512, identifier, commitment, secretShareScalar, secretJson.min_signers, secretJson.max_signers);
|
|
47
|
+
const round1Path = path.join(stateDir, "collected_round1.json");
|
|
48
|
+
if (!fs.existsSync(round1Path)) throw new Error(`Round 1 packages not found at ${round1Path}. Did you receive earlier phases?`);
|
|
49
|
+
const round1Json = JSON.parse(fs.readFileSync(round1Path, "utf-8"));
|
|
50
|
+
const round1Packages = /* @__PURE__ */ new Map();
|
|
51
|
+
for (const [xidStr, value] of Object.entries(round1Json)) {
|
|
52
|
+
const packageJson = value;
|
|
53
|
+
const pkg = serde.round1PackageFromJson(packageJson);
|
|
54
|
+
round1Packages.set(xidStr, pkg);
|
|
55
|
+
}
|
|
56
|
+
return {
|
|
57
|
+
secretPackage,
|
|
58
|
+
round1Packages
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Validate the finalize request from the coordinator.
|
|
63
|
+
*
|
|
64
|
+
* Port of request validation from cmd/dkg/participant/finalize.rs lines 139-161.
|
|
65
|
+
*/
|
|
66
|
+
function validateFinalizeRequest(sealedRequest, groupId, expectedCoordinator) {
|
|
67
|
+
if (!sealedRequest.function().equals(Function.fromString("dkgFinalize"))) throw new Error(`Unexpected request function: ${sealedRequest.function().toString()}`);
|
|
68
|
+
if (sealedRequest.sender().xid().urString() !== expectedCoordinator.urString()) throw new Error(`Unexpected request sender: ${sealedRequest.sender().xid().urString()} (expected coordinator ${expectedCoordinator.urString()})`);
|
|
69
|
+
const requestGroupIdEnvelope = sealedRequest.objectForParameter("group");
|
|
70
|
+
if (requestGroupIdEnvelope === void 0) throw new Error("Request missing group parameter");
|
|
71
|
+
const requestGroupId = requestGroupIdEnvelope.extractSubject((cbor) => ARID.fromTaggedCbor(cbor));
|
|
72
|
+
if (requestGroupId.urString() !== groupId.urString()) throw new Error(`Request group ID ${requestGroupId.urString()} does not match expected ${groupId.urString()}`);
|
|
73
|
+
const responseAridEnvelope = sealedRequest.objectForParameter("responseArid");
|
|
74
|
+
if (responseAridEnvelope === void 0) throw new Error("Request missing responseArid parameter");
|
|
75
|
+
return responseAridEnvelope.extractSubject((cbor) => ARID.fromTaggedCbor(cbor));
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Extract round 2 packages from the finalize request.
|
|
79
|
+
*
|
|
80
|
+
* Port of round2 package extraction from cmd/dkg/participant/finalize.rs lines 209-229.
|
|
81
|
+
*/
|
|
82
|
+
function extractFinalizePackages(request, groupRecord, ownerXid) {
|
|
83
|
+
const sortedXids = groupRecord.participants().map((p) => p.xid());
|
|
84
|
+
const ownerUrString = ownerXid.urString();
|
|
85
|
+
if (!sortedXids.some((xid) => xid.urString() === ownerUrString)) sortedXids.push(ownerXid);
|
|
86
|
+
sortedXids.sort((a, b) => compareXidBytes(a.toData(), b.toData()));
|
|
87
|
+
const deduped = [];
|
|
88
|
+
for (const xid of sortedXids) if (deduped.length === 0 || deduped[deduped.length - 1].urString() !== xid.urString()) deduped.push(xid);
|
|
89
|
+
const xidToIdentifier = /* @__PURE__ */ new Map();
|
|
90
|
+
for (let i = 0; i < deduped.length; i++) {
|
|
91
|
+
const identifier = identifierFromU16(i + 1);
|
|
92
|
+
xidToIdentifier.set(deduped[i].urString(), identifier);
|
|
93
|
+
}
|
|
94
|
+
const myXidStr = ownerXid.urString();
|
|
95
|
+
const packages = /* @__PURE__ */ new Map();
|
|
96
|
+
const packageEnvelopes = request.objectsForParameter("round2Package");
|
|
97
|
+
for (const packageEnvelope of packageEnvelopes) {
|
|
98
|
+
const senderEnvelope = packageEnvelope.objectForPredicate("sender");
|
|
99
|
+
if (senderEnvelope === void 0) throw new Error("round2Package missing sender predicate");
|
|
100
|
+
const senderXid = senderEnvelope.extractSubject((cbor) => XID.fromTaggedCbor(cbor));
|
|
101
|
+
if (senderXid.urString() === myXidStr) continue;
|
|
102
|
+
const identifier = xidToIdentifier.get(senderXid.urString());
|
|
103
|
+
if (identifier === void 0) throw new Error(`Unknown sender XID in round2Package: ${senderXid.urString()}`);
|
|
104
|
+
const packageJson = packageEnvelope.extractSubject((cbor) => JSON$1.fromTaggedCbor(cbor));
|
|
105
|
+
const packageData = JSON.parse(new TextDecoder().decode(packageJson.toData()));
|
|
106
|
+
const pkg = serde.round2PackageFromJson(packageData);
|
|
107
|
+
packages.set(identifierToHex(identifier), pkg);
|
|
108
|
+
}
|
|
109
|
+
return packages;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Build the response body for the finalize response.
|
|
113
|
+
*
|
|
114
|
+
* Port of `build_response_body()` from cmd/dkg/participant/finalize.rs lines 344-359.
|
|
115
|
+
*/
|
|
116
|
+
function buildResponseBody(groupId, participantXid, keyPackage, publicKeyPackage) {
|
|
117
|
+
const keyPackageJson = serializeKeyPackage(keyPackage);
|
|
118
|
+
const publicKeyPackageJson = serializePublicKeyPackage(publicKeyPackage);
|
|
119
|
+
const keyJsonBytes = new TextEncoder().encode(JSON.stringify(keyPackageJson));
|
|
120
|
+
const keyJsonWrapper = JSON$1.fromData(keyJsonBytes);
|
|
121
|
+
const pubJsonBytes = new TextEncoder().encode(JSON.stringify(publicKeyPackageJson));
|
|
122
|
+
const pubJsonWrapper = JSON$1.fromData(pubJsonBytes);
|
|
123
|
+
return Envelope.unit().addType("dkgFinalizeResponse").addAssertion("group", groupId).addAssertion("participant", participantXid).addAssertion("key_package", keyJsonWrapper).addAssertion("public_key_package", pubJsonWrapper);
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Persist finalize state (key packages) to disk.
|
|
127
|
+
*
|
|
128
|
+
* Port of key package persistence from cmd/dkg/participant/finalize.rs lines 251-257.
|
|
129
|
+
*/
|
|
130
|
+
function persistFinalizeState(registryPath, groupId, keyPackage, publicKeyPackage) {
|
|
131
|
+
const stateDir = groupStateDir(registryPath, groupId.hex());
|
|
132
|
+
fs.mkdirSync(stateDir, { recursive: true });
|
|
133
|
+
const serializedKeyPackage = serializeKeyPackage(keyPackage);
|
|
134
|
+
const keyPackagePath = path.join(stateDir, "key_package.json");
|
|
135
|
+
fs.writeFileSync(keyPackagePath, JSON.stringify(serializedKeyPackage, null, 2));
|
|
136
|
+
const serializedPublicKeyPackage = serializePublicKeyPackage(publicKeyPackage);
|
|
137
|
+
const publicKeyPackagePath = path.join(stateDir, "public_key_package.json");
|
|
138
|
+
fs.writeFileSync(publicKeyPackagePath, JSON.stringify(serializedPublicKeyPackage, null, 2));
|
|
139
|
+
return {
|
|
140
|
+
keyPackagePath,
|
|
141
|
+
publicKeyPackagePath
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Execute the DKG participant finalize command.
|
|
146
|
+
*
|
|
147
|
+
* Responds to the finalize request from the coordinator, runs FROST DKG part3
|
|
148
|
+
* to generate the final key package, and posts the response back.
|
|
149
|
+
*
|
|
150
|
+
* Port of `CommandArgs::exec()` from cmd/dkg/participant/finalize.rs lines 52-341.
|
|
151
|
+
*/
|
|
152
|
+
async function finalize(_client, options, cwd) {
|
|
153
|
+
if (options.storageSelection === void 0) throw new Error("Hubert storage is required for finalize respond");
|
|
154
|
+
const registryPath = resolveRegistryPath(options.registryPath, cwd);
|
|
155
|
+
const registry = Registry.load(registryPath);
|
|
156
|
+
const owner = registry.owner();
|
|
157
|
+
if (owner === void 0) throw new Error("Registry owner is required");
|
|
158
|
+
const groupId = parseAridUr(options.groupId);
|
|
159
|
+
const groupRecord = registry.group(groupId);
|
|
160
|
+
if (groupRecord === void 0) throw new Error("Group not found in registry");
|
|
161
|
+
const listeningAtArid = groupRecord.listeningAtArid();
|
|
162
|
+
if (listeningAtArid === void 0) throw new Error("No listening ARID for this group. Did you receive finalize send?");
|
|
163
|
+
const round2State = loadRound2State(registryPath, groupId);
|
|
164
|
+
if (isVerbose() || options.verbose === true) console.error("Fetching finalize request from Hubert...");
|
|
165
|
+
const client = await createStorageClient(options.storageSelection);
|
|
166
|
+
const requestEnvelope = await getWithIndicator(client, listeningAtArid, "Finalize request", options.timeoutSeconds, options.verbose ?? false);
|
|
167
|
+
if (requestEnvelope === null || requestEnvelope === void 0) throw new Error("Finalize request not found in Hubert storage");
|
|
168
|
+
const ownerPrivateKeys = owner.xidDocument().inceptionPrivateKeys();
|
|
169
|
+
if (ownerPrivateKeys === void 0) throw new Error("Owner XID document has no private keys");
|
|
170
|
+
const now = CborDate.now().datetime();
|
|
171
|
+
const sealedRequest = SealedRequest.tryFromEnvelope(requestEnvelope, void 0, now, ownerPrivateKeys);
|
|
172
|
+
const responseArid = validateFinalizeRequest(sealedRequest, groupId, groupRecord.coordinator().xid());
|
|
173
|
+
const sortedXids = groupRecord.participants().map((p) => p.xid());
|
|
174
|
+
const ownerUrString = owner.xid().urString();
|
|
175
|
+
if (!sortedXids.some((xid) => xid.urString() === ownerUrString)) sortedXids.push(owner.xid());
|
|
176
|
+
sortedXids.sort((a, b) => compareXidBytes(a.toData(), b.toData()));
|
|
177
|
+
const deduped = [];
|
|
178
|
+
for (const xid of sortedXids) if (deduped.length === 0 || deduped[deduped.length - 1].urString() !== xid.urString()) deduped.push(xid);
|
|
179
|
+
const xidToIdentifier = /* @__PURE__ */ new Map();
|
|
180
|
+
for (let i = 0; i < deduped.length; i++) {
|
|
181
|
+
const identifier = identifierFromU16(i + 1);
|
|
182
|
+
xidToIdentifier.set(deduped[i].urString(), identifier);
|
|
183
|
+
}
|
|
184
|
+
const round1PackagesById = /* @__PURE__ */ new Map();
|
|
185
|
+
for (const [xidStr, pkg] of round2State.round1Packages) {
|
|
186
|
+
if (xidStr === ownerUrString) continue;
|
|
187
|
+
const identifier = xidToIdentifier.get(xidStr);
|
|
188
|
+
if (identifier === void 0) throw new Error(`Unknown participant XID ${xidStr}`);
|
|
189
|
+
round1PackagesById.set(identifierToHex(identifier), pkg);
|
|
190
|
+
}
|
|
191
|
+
const round2PackagesById = extractFinalizePackages(sealedRequest, groupRecord, owner.xid());
|
|
192
|
+
if (isVerbose() || options.verbose === true) console.error(`Received ${round2PackagesById.size} Round 2 packages. Running DKG part3...`);
|
|
193
|
+
const [keyPackage, publicKeyPackage] = await dkgPart3(round2State.secretPackage, round1PackagesById, round2PackagesById);
|
|
194
|
+
const verifyingKeyBytes = publicKeyPackage.verifyingKey;
|
|
195
|
+
const groupVerifyingKey = signingKeyFromVerifying(verifyingKeyBytes);
|
|
196
|
+
if (isVerbose() || options.verbose === true) console.error("Generated key package and public key package.");
|
|
197
|
+
const { keyPackagePath, publicKeyPackagePath } = persistFinalizeState(registryPath, groupId, keyPackage, publicKeyPackage);
|
|
198
|
+
const responseBody = buildResponseBody(groupId, owner.xid(), keyPackage, publicKeyPackage);
|
|
199
|
+
const signerPrivateKeys = owner.xidDocument().inceptionPrivateKeys();
|
|
200
|
+
if (signerPrivateKeys === void 0) throw new Error("Owner XID document has no signing keys");
|
|
201
|
+
const coordinatorXid = groupRecord.coordinator().xid();
|
|
202
|
+
const coordinatorRecord = registry.participant(coordinatorXid);
|
|
203
|
+
let coordinatorDoc;
|
|
204
|
+
if (coordinatorRecord !== void 0) coordinatorDoc = coordinatorRecord.xidDocument();
|
|
205
|
+
else if (owner.xid().urString() === coordinatorXid.urString()) coordinatorDoc = owner.xidDocument();
|
|
206
|
+
else throw new Error(`Coordinator ${coordinatorXid.urString()} not found in registry`);
|
|
207
|
+
const peerContinuation = sealedRequest.peerContinuation();
|
|
208
|
+
let sealed = SealedResponse.newSuccess(sealedRequest.id(), owner.xidDocument()).withResult(responseBody);
|
|
209
|
+
if (peerContinuation !== void 0) sealed = sealed.withPeerContinuation(peerContinuation);
|
|
210
|
+
if (options.preview === true) {
|
|
211
|
+
if (isVerbose() || options.verbose === true) {
|
|
212
|
+
const verifyingKeyWithUrString = groupVerifyingKey;
|
|
213
|
+
if (typeof verifyingKeyWithUrString.urString === "function") console.error(verifyingKeyWithUrString.urString());
|
|
214
|
+
}
|
|
215
|
+
const unsealedEnvelope = sealed.toEnvelope(void 0, signerPrivateKeys, void 0);
|
|
216
|
+
console.log(unsealedEnvelope.urString());
|
|
217
|
+
return {
|
|
218
|
+
verifyingKey: bytesToHex(verifyingKeyBytes),
|
|
219
|
+
keyPackagePath,
|
|
220
|
+
publicKeyPackagePath
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
await putWithIndicator(client, responseArid, sealed.toEnvelope(void 0, signerPrivateKeys, coordinatorDoc), "Finalize Response", options.verbose ?? false);
|
|
224
|
+
const updatedGroupRecord = registry.group(groupId);
|
|
225
|
+
if (updatedGroupRecord !== void 0) {
|
|
226
|
+
const contributions = updatedGroupRecord.contributions();
|
|
227
|
+
contributions.keyPackage = keyPackagePath;
|
|
228
|
+
updatedGroupRecord.setContributions(contributions);
|
|
229
|
+
updatedGroupRecord.clearListeningAtArid();
|
|
230
|
+
const recordWithVerifyingKey = updatedGroupRecord;
|
|
231
|
+
if (typeof recordWithVerifyingKey.setVerifyingKey === "function") recordWithVerifyingKey.setVerifyingKey(groupVerifyingKey);
|
|
232
|
+
registry.save(registryPath);
|
|
233
|
+
}
|
|
234
|
+
const verifyingKeyHex = bytesToHex(verifyingKeyBytes);
|
|
235
|
+
if (isVerbose() || options.verbose === true) {
|
|
236
|
+
console.error(`Posted finalize response to ${responseArid.urString()}`);
|
|
237
|
+
const verifyingKeyWithUrString = groupVerifyingKey;
|
|
238
|
+
if (typeof verifyingKeyWithUrString.urString === "function") console.error(verifyingKeyWithUrString.urString());
|
|
239
|
+
} else {
|
|
240
|
+
const verifyingKeyWithUrString = groupVerifyingKey;
|
|
241
|
+
if (typeof verifyingKeyWithUrString.urString === "function") console.log(verifyingKeyWithUrString.urString());
|
|
242
|
+
}
|
|
243
|
+
return {
|
|
244
|
+
verifyingKey: verifyingKeyHex,
|
|
245
|
+
keyPackagePath,
|
|
246
|
+
publicKeyPackagePath
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
//#endregion
|
|
250
|
+
export { finalize_exports as n, finalize as t };
|
|
251
|
+
|
|
252
|
+
//# sourceMappingURL=finalize-T83Ko8nG.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"finalize-T83Ko8nG.mjs","names":["EnvelopeFunction","JSONWrapper"],"sources":["../src/cmd/dkg/participant/finalize.ts"],"sourcesContent":["/**\n * Copyright © 2023-2026 Blockchain Commons, LLC\n * Copyright © 2025-2026 Parity Technologies\n *\n *\n * DKG participant finalize command.\n *\n * Port of cmd/dkg/participant/finalize.rs from frost-hubert-rust.\n *\n * @module\n */\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\n\nimport { ARID, JSON as JSONWrapper, XID } from \"@bcts/components\";\nimport { compareXidBytes } from \"../../../dkg/proposed-participant.js\";\nimport { CborDate } from \"@bcts/dcbor\";\nimport { Envelope, Function as EnvelopeFunction } from \"@bcts/envelope\";\nimport { SealedRequest, SealedResponse } from \"@bcts/gstp\";\nimport type { XIDDocument } from \"@bcts/xid\";\n\nimport { type GroupRecord, Registry, resolveRegistryPath } from \"../../../registry/index.js\";\nimport { getWithIndicator, putWithIndicator } from \"../../busy.js\";\nimport { groupStateDir, isVerbose } from \"../../common.js\";\nimport { createStorageClient, type StorageClient, type StorageSelection } from \"../../storage.js\";\nimport { parseAridUr, signingKeyFromVerifying } from \"../common.js\";\nimport {\n dkgPart3,\n identifierFromU16,\n identifierToHex,\n hexToBytes,\n bytesToHex,\n serializeKeyPackage,\n serializePublicKeyPackage,\n type DkgRound1Package,\n type DkgRound2Package,\n type DkgRound2SecretPackage,\n type FrostIdentifier,\n type FrostKeyPackage,\n type FrostPublicKeyPackage,\n} from \"../../../frost/index.js\";\nimport { Ed25519Sha512, serde } from \"@frosts/ed25519\";\nimport { round2, CoefficientCommitment, VerifiableSecretSharingCommitment } from \"@frosts/core\";\n\n/**\n * Options for the DKG finalize command.\n */\nexport interface DkgFinalizeOptions {\n registryPath?: string;\n groupId: string;\n timeoutSeconds?: number;\n preview?: boolean;\n storageSelection?: StorageSelection;\n verbose?: boolean;\n}\n\n/**\n * Result of the DKG finalize command.\n */\nexport interface DkgFinalizeResult {\n verifyingKey: string;\n keyPackagePath: string;\n publicKeyPackagePath: string;\n}\n\n/**\n * Persisted round 2 state loaded from disk.\n */\ninterface Round2State {\n secretPackage: DkgRound2SecretPackage;\n round1Packages: Map<string, DkgRound1Package>;\n}\n\n/**\n * Load persisted round 2 state from disk.\n *\n * Port of round2_secret loading from cmd/dkg/participant/finalize.rs lines 82-106.\n */\nfunction loadRound2State(registryPath: string, groupId: ARID): Round2State {\n const stateDir = groupStateDir(registryPath, groupId.hex());\n\n // Load Round 2 secret\n const round2SecretPath = path.join(stateDir, \"round2_secret.json\");\n if (!fs.existsSync(round2SecretPath)) {\n throw new Error(`Round 2 secret not found at ${round2SecretPath}. Did you run round2?`);\n }\n\n // Mirrors Rust `frost::keys::dkg::round2::SecretPackage` JSON\n // (`frost-rust/frost-core/src/keys/dkg.rs:269-287`):\n //\n // {\n // \"identifier\": \"<lowercase hex scalar>\",\n // \"commitment\": [\"<hex>\", \"<hex>\", ...],\n // \"secret_share\": \"<hex>\",\n // \"min_signers\": <u16>,\n // \"max_signers\": <u16>\n // }\n //\n // The struct is `#[serde(deny_unknown_fields)]` and the\n // `commitment` is a `VerifiableSecretSharingCommitment` (a\n // single-field tuple struct over `Vec<CoefficientCommitment>`),\n // which serde flattens to a bare JSON array. The earlier port\n // emitted camelCase keys plus a nested `commitment.coefficients`\n // shape and a numeric `identifier`, which Rust would reject and\n // which had no chance of being read by Rust's standard derive.\n const secretJson = JSON.parse(fs.readFileSync(round2SecretPath, \"utf-8\")) as {\n identifier: string;\n commitment: string[];\n secret_share: string;\n min_signers: number;\n max_signers: number;\n };\n\n // Identifier hex → little-endian u16 (the FROST 1-indexed\n // participant position). The scalar bytes are 32-LE for Ed25519, so\n // the first two bytes hold the u16 value when the identifier is in\n // the small-integer range (1..=N) used by the DKG.\n const idBytes = hexToBytes(secretJson.identifier);\n let identifierU16 = 1;\n if (idBytes.length >= 2) {\n identifierU16 = idBytes[0] | (idBytes[1] << 8);\n }\n if (identifierU16 === 0) {\n identifierU16 = 1;\n }\n const identifier = identifierFromU16(identifierU16);\n\n const coefficientCommitments = secretJson.commitment.map((hex) =>\n CoefficientCommitment.deserialize(Ed25519Sha512, hexToBytes(hex)),\n );\n\n const commitment = new VerifiableSecretSharingCommitment(Ed25519Sha512, coefficientCommitments);\n\n const secretShareScalar = Ed25519Sha512.deserializeScalar(hexToBytes(secretJson.secret_share));\n\n const secretPackage: DkgRound2SecretPackage = new round2.SecretPackage(\n Ed25519Sha512,\n identifier,\n commitment,\n secretShareScalar,\n secretJson.min_signers,\n secretJson.max_signers,\n );\n\n // Load collected Round 1 packages (from round2 phase)\n const round1Path = path.join(stateDir, \"collected_round1.json\");\n if (!fs.existsSync(round1Path)) {\n throw new Error(`Round 1 packages not found at ${round1Path}. Did you receive earlier phases?`);\n }\n\n const round1Json = JSON.parse(fs.readFileSync(round1Path, \"utf-8\")) as Record<string, unknown>;\n\n // Convert to Map<string, DkgRound1Package> - keyed by XID UR string\n const round1Packages = new Map<string, DkgRound1Package>();\n for (const [xidStr, value] of Object.entries(round1Json)) {\n const packageJson = value as {\n header: { version: number; ciphersuite: string };\n commitment: string[];\n proof_of_knowledge: string;\n };\n const pkg = serde.round1PackageFromJson(packageJson);\n round1Packages.set(xidStr, pkg);\n }\n\n return { secretPackage, round1Packages };\n}\n\n/**\n * Validate the finalize request from the coordinator.\n *\n * Port of request validation from cmd/dkg/participant/finalize.rs lines 139-161.\n */\nfunction validateFinalizeRequest(\n sealedRequest: SealedRequest,\n groupId: ARID,\n expectedCoordinator: XID,\n): ARID {\n // Validate the request function\n if (!sealedRequest.function().equals(EnvelopeFunction.fromString(\"dkgFinalize\"))) {\n throw new Error(`Unexpected request function: ${sealedRequest.function().toString()}`);\n }\n\n // Validate the sender is the expected coordinator\n if (sealedRequest.sender().xid().urString() !== expectedCoordinator.urString()) {\n throw new Error(\n `Unexpected request sender: ${sealedRequest.sender().xid().urString()} ` +\n `(expected coordinator ${expectedCoordinator.urString()})`,\n );\n }\n\n // Validate the group ID matches\n const requestGroupIdEnvelope = sealedRequest.objectForParameter(\"group\");\n if (requestGroupIdEnvelope === undefined) {\n throw new Error(\"Request missing group parameter\");\n }\n const requestGroupId = requestGroupIdEnvelope.extractSubject((cbor) => ARID.fromTaggedCbor(cbor));\n if (requestGroupId.urString() !== groupId.urString()) {\n throw new Error(\n `Request group ID ${requestGroupId.urString()} does not match expected ${groupId.urString()}`,\n );\n }\n\n // Extract where we should post our response\n const responseAridEnvelope = sealedRequest.objectForParameter(\"responseArid\");\n if (responseAridEnvelope === undefined) {\n throw new Error(\"Request missing responseArid parameter\");\n }\n const responseArid = responseAridEnvelope.extractSubject((cbor) => ARID.fromTaggedCbor(cbor));\n\n return responseArid;\n}\n\n/**\n * Extract round 2 packages from the finalize request.\n *\n * Port of round2 package extraction from cmd/dkg/participant/finalize.rs lines 209-229.\n */\nfunction extractFinalizePackages(\n request: SealedRequest,\n groupRecord: GroupRecord,\n ownerXid: XID,\n): Map<string, DkgRound2Package> {\n // Build XID -> Identifier mapping based on sorted participant order\n const sortedXids: XID[] = groupRecord.participants().map((p) => p.xid());\n\n // Add owner if not already in list\n const ownerUrString = ownerXid.urString();\n if (!sortedXids.some((xid) => xid.urString() === ownerUrString)) {\n sortedXids.push(ownerXid);\n }\n\n // Sort by XID byte order — mirrors Rust `XID::cmp` (raw 32-byte\n // lex compare). The earlier port used `urString().localeCompare(...)`,\n // which differs from byte order for any byte ≥ 0x80 and is locale-\n // aware, producing different FROST identifier assignments than Rust.\n sortedXids.sort((a, b) => compareXidBytes(a.toData(), b.toData()));\n\n // Deduplicate\n const deduped: XID[] = [];\n for (const xid of sortedXids) {\n if (deduped.length === 0 || deduped[deduped.length - 1].urString() !== xid.urString()) {\n deduped.push(xid);\n }\n }\n\n // Build XID -> Identifier mapping (1-indexed)\n const xidToIdentifier = new Map<string, FrostIdentifier>();\n for (let i = 0; i < deduped.length; i++) {\n const identifier = identifierFromU16(i + 1);\n xidToIdentifier.set(deduped[i].urString(), identifier);\n }\n\n const myXidStr = ownerXid.urString();\n\n // Extract all round2Package parameters\n const packages = new Map<string, DkgRound2Package>();\n\n const packageEnvelopes = request.objectsForParameter(\"round2Package\");\n for (const packageEnvelope of packageEnvelopes) {\n // Extract sender XID from the envelope\n const senderEnvelope = packageEnvelope.objectForPredicate(\"sender\");\n if (senderEnvelope === undefined) {\n throw new Error(\"round2Package missing sender predicate\");\n }\n const senderXid = senderEnvelope.extractSubject((cbor) => XID.fromTaggedCbor(cbor));\n\n // Skip our own package\n if (senderXid.urString() === myXidStr) {\n continue;\n }\n\n // Get the identifier for this sender\n const identifier = xidToIdentifier.get(senderXid.urString());\n if (identifier === undefined) {\n throw new Error(`Unknown sender XID in round2Package: ${senderXid.urString()}`);\n }\n\n // Extract the package bytes (stored as JSON tag)\n const packageJson = packageEnvelope.extractSubject((cbor) => JSONWrapper.fromTaggedCbor(cbor));\n const packageData = JSON.parse(new TextDecoder().decode(packageJson.toData())) as {\n header: { version: number; ciphersuite: string };\n signing_share: string;\n };\n\n const pkg = serde.round2PackageFromJson(packageData);\n packages.set(identifierToHex(identifier), pkg);\n }\n\n return packages;\n}\n\n/**\n * Build the response body for the finalize response.\n *\n * Port of `build_response_body()` from cmd/dkg/participant/finalize.rs lines 344-359.\n */\nfunction buildResponseBody(\n groupId: ARID,\n participantXid: XID,\n keyPackage: FrostKeyPackage,\n publicKeyPackage: FrostPublicKeyPackage,\n): Envelope {\n // Serialize key packages to JSON\n const keyPackageJson = serializeKeyPackage(keyPackage);\n const publicKeyPackageJson = serializePublicKeyPackage(publicKeyPackage);\n\n const keyJsonBytes = new TextEncoder().encode(JSON.stringify(keyPackageJson));\n const keyJsonWrapper = JSONWrapper.fromData(keyJsonBytes);\n\n const pubJsonBytes = new TextEncoder().encode(JSON.stringify(publicKeyPackageJson));\n const pubJsonWrapper = JSONWrapper.fromData(pubJsonBytes);\n\n return Envelope.unit()\n .addType(\"dkgFinalizeResponse\")\n .addAssertion(\"group\", groupId)\n .addAssertion(\"participant\", participantXid)\n .addAssertion(\"key_package\", keyJsonWrapper)\n .addAssertion(\"public_key_package\", pubJsonWrapper);\n}\n\n/**\n * Persist finalize state (key packages) to disk.\n *\n * Port of key package persistence from cmd/dkg/participant/finalize.rs lines 251-257.\n */\nfunction persistFinalizeState(\n registryPath: string,\n groupId: ARID,\n keyPackage: FrostKeyPackage,\n publicKeyPackage: FrostPublicKeyPackage,\n): { keyPackagePath: string; publicKeyPackagePath: string } {\n const stateDir = groupStateDir(registryPath, groupId.hex());\n fs.mkdirSync(stateDir, { recursive: true });\n\n // Serialize and save key package\n const serializedKeyPackage = serializeKeyPackage(keyPackage);\n const keyPackagePath = path.join(stateDir, \"key_package.json\");\n fs.writeFileSync(keyPackagePath, JSON.stringify(serializedKeyPackage, null, 2));\n\n // Serialize and save public key package\n const serializedPublicKeyPackage = serializePublicKeyPackage(publicKeyPackage);\n const publicKeyPackagePath = path.join(stateDir, \"public_key_package.json\");\n fs.writeFileSync(publicKeyPackagePath, JSON.stringify(serializedPublicKeyPackage, null, 2));\n\n return { keyPackagePath, publicKeyPackagePath };\n}\n\n/**\n * Execute the DKG participant finalize command.\n *\n * Responds to the finalize request from the coordinator, runs FROST DKG part3\n * to generate the final key package, and posts the response back.\n *\n * Port of `CommandArgs::exec()` from cmd/dkg/participant/finalize.rs lines 52-341.\n */\nexport async function finalize(\n _client: StorageClient | undefined,\n options: DkgFinalizeOptions,\n cwd: string,\n): Promise<DkgFinalizeResult> {\n if (options.storageSelection === undefined) {\n throw new Error(\"Hubert storage is required for finalize respond\");\n }\n\n const registryPath = resolveRegistryPath(options.registryPath, cwd);\n const registry = Registry.load(registryPath);\n\n const owner = registry.owner();\n if (owner === undefined) {\n throw new Error(\"Registry owner is required\");\n }\n\n const groupId = parseAridUr(options.groupId);\n const groupRecord = registry.group(groupId);\n if (groupRecord === undefined) {\n throw new Error(\"Group not found in registry\");\n }\n\n // Get the ARID where we're listening for the finalize request\n const listeningAtArid = groupRecord.listeningAtArid();\n if (listeningAtArid === undefined) {\n throw new Error(\"No listening ARID for this group. Did you receive finalize send?\");\n }\n\n // Load Round 2 state (secret and collected round1 packages)\n const round2State = loadRound2State(registryPath, groupId);\n\n if (isVerbose() || options.verbose === true) {\n console.error(\"Fetching finalize request from Hubert...\");\n }\n\n const client = await createStorageClient(options.storageSelection);\n\n // Fetch the finalize request from where we're listening\n const requestEnvelope = await getWithIndicator(\n client,\n listeningAtArid,\n \"Finalize request\",\n options.timeoutSeconds,\n options.verbose ?? false,\n );\n\n if (requestEnvelope === null || requestEnvelope === undefined) {\n throw new Error(\"Finalize request not found in Hubert storage\");\n }\n\n // Decrypt and validate the request\n const ownerPrivateKeys = owner.xidDocument().inceptionPrivateKeys();\n if (ownerPrivateKeys === undefined) {\n throw new Error(\"Owner XID document has no private keys\");\n }\n\n const now = CborDate.now().datetime();\n const sealedRequest = SealedRequest.tryFromEnvelope(\n requestEnvelope,\n undefined,\n now,\n ownerPrivateKeys,\n );\n\n // Validate the request and extract response ARID\n const expectedCoordinator = groupRecord.coordinator().xid();\n const responseArid = validateFinalizeRequest(sealedRequest, groupId, expectedCoordinator);\n\n // Build identifier mapping for round1 packages (XID UR -> Identifier hex)\n const sortedXids: XID[] = groupRecord.participants().map((p) => p.xid());\n\n // Add owner if not already in list\n const ownerUrString = owner.xid().urString();\n if (!sortedXids.some((xid) => xid.urString() === ownerUrString)) {\n sortedXids.push(owner.xid());\n }\n\n // Sort by XID byte order — mirrors Rust `XID::cmp` (raw 32-byte\n // lex compare). The earlier port used `urString().localeCompare(...)`,\n // which differs from byte order for any byte ≥ 0x80 and is locale-\n // aware, producing different FROST identifier assignments than Rust.\n sortedXids.sort((a, b) => compareXidBytes(a.toData(), b.toData()));\n\n // Deduplicate\n const deduped: XID[] = [];\n for (const xid of sortedXids) {\n if (deduped.length === 0 || deduped[deduped.length - 1].urString() !== xid.urString()) {\n deduped.push(xid);\n }\n }\n\n // Build XID -> Identifier mapping (1-indexed)\n const xidToIdentifier = new Map<string, FrostIdentifier>();\n for (let i = 0; i < deduped.length; i++) {\n const identifier = identifierFromU16(i + 1);\n xidToIdentifier.set(deduped[i].urString(), identifier);\n }\n\n // Convert round1 packages from XID-keyed to identifier-keyed (exclude self)\n const round1PackagesById = new Map<string, DkgRound1Package>();\n for (const [xidStr, pkg] of round2State.round1Packages) {\n if (xidStr === ownerUrString) {\n continue;\n }\n const identifier = xidToIdentifier.get(xidStr);\n if (identifier === undefined) {\n throw new Error(`Unknown participant XID ${xidStr}`);\n }\n round1PackagesById.set(identifierToHex(identifier), pkg);\n }\n\n // Extract Round 2 packages from the request (exclude self)\n const round2PackagesById = extractFinalizePackages(sealedRequest, groupRecord, owner.xid());\n\n if (isVerbose() || options.verbose === true) {\n console.error(`Received ${round2PackagesById.size} Round 2 packages. Running DKG part3...`);\n }\n\n // Run FROST DKG part3 (finalize)\n const [keyPackage, publicKeyPackage] = await dkgPart3(\n round2State.secretPackage,\n round1PackagesById,\n round2PackagesById,\n );\n\n // Get the group verifying key\n const verifyingKeyBytes = publicKeyPackage.verifyingKey;\n const groupVerifyingKey = signingKeyFromVerifying(verifyingKeyBytes);\n\n if (isVerbose() || options.verbose === true) {\n console.error(\"Generated key package and public key package.\");\n }\n\n // Persist key packages\n const { keyPackagePath, publicKeyPackagePath } = persistFinalizeState(\n registryPath,\n groupId,\n keyPackage,\n publicKeyPackage,\n );\n\n // Build response body\n const responseBody = buildResponseBody(groupId, owner.xid(), keyPackage, publicKeyPackage);\n\n const signerPrivateKeys = owner.xidDocument().inceptionPrivateKeys();\n if (signerPrivateKeys === undefined) {\n throw new Error(\"Owner XID document has no signing keys\");\n }\n\n // Get coordinator's XID document for encryption\n const coordinatorXid = groupRecord.coordinator().xid();\n const coordinatorRecord = registry.participant(coordinatorXid);\n let coordinatorDoc: XIDDocument;\n if (coordinatorRecord !== undefined) {\n coordinatorDoc = coordinatorRecord.xidDocument();\n } else {\n // Check if coordinator is the owner\n if (owner.xid().urString() === coordinatorXid.urString()) {\n coordinatorDoc = owner.xidDocument();\n } else {\n throw new Error(`Coordinator ${coordinatorXid.urString()} not found in registry`);\n }\n }\n\n // Get peer continuation from the request\n const peerContinuation = sealedRequest.peerContinuation();\n\n let sealed = SealedResponse.newSuccess(sealedRequest.id(), owner.xidDocument()).withResult(\n responseBody,\n );\n\n if (peerContinuation !== undefined) {\n sealed = sealed.withPeerContinuation(peerContinuation);\n }\n\n if (options.preview === true) {\n // Show the response envelope structure without encryption\n if (isVerbose() || options.verbose === true) {\n // Cast to access urString method\n const verifyingKeyWithUrString = groupVerifyingKey as { urString?: () => string };\n if (typeof verifyingKeyWithUrString.urString === \"function\") {\n console.error(verifyingKeyWithUrString.urString());\n }\n }\n const unsealedEnvelope = sealed.toEnvelope(\n undefined, // No expiration for responses\n signerPrivateKeys,\n undefined,\n );\n console.log(unsealedEnvelope.urString());\n\n return {\n verifyingKey: bytesToHex(verifyingKeyBytes),\n keyPackagePath,\n publicKeyPackagePath,\n };\n }\n\n const responseEnvelope = sealed.toEnvelope(\n undefined, // No expiration for responses\n signerPrivateKeys,\n coordinatorDoc,\n );\n\n // Post the response\n await putWithIndicator(\n client,\n responseArid,\n responseEnvelope,\n \"Finalize Response\",\n options.verbose ?? false,\n );\n\n // Update registry: contributions and verifying key\n const updatedGroupRecord = registry.group(groupId);\n if (updatedGroupRecord !== undefined) {\n const contributions = updatedGroupRecord.contributions();\n contributions.keyPackage = keyPackagePath;\n updatedGroupRecord.setContributions(contributions);\n updatedGroupRecord.clearListeningAtArid();\n\n // Set verifying key if the method exists\n const recordWithVerifyingKey = updatedGroupRecord as {\n setVerifyingKey?: (key: unknown) => void;\n };\n if (typeof recordWithVerifyingKey.setVerifyingKey === \"function\") {\n recordWithVerifyingKey.setVerifyingKey(groupVerifyingKey);\n }\n\n registry.save(registryPath);\n }\n\n // Get verifying key for output\n const verifyingKeyHex = bytesToHex(verifyingKeyBytes);\n\n if (isVerbose() || options.verbose === true) {\n console.error(`Posted finalize response to ${responseArid.urString()}`);\n // Cast to access urString method\n const verifyingKeyWithUrString = groupVerifyingKey as { urString?: () => string };\n if (typeof verifyingKeyWithUrString.urString === \"function\") {\n console.error(verifyingKeyWithUrString.urString());\n }\n } else {\n // Cast to access urString method\n const verifyingKeyWithUrString = groupVerifyingKey as { urString?: () => string };\n if (typeof verifyingKeyWithUrString.urString === \"function\") {\n console.log(verifyingKeyWithUrString.urString());\n }\n }\n\n return {\n verifyingKey: verifyingKeyHex,\n keyPackagePath,\n publicKeyPackagePath,\n };\n}\n"],"mappings":"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"}
|
package/dist/frost/index.cjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
const require_chunk = require("../chunk-
|
|
2
|
+
const require_chunk = require("../chunk-DakpK96I.cjs");
|
|
3
3
|
let _frosts_ed25519 = require("@frosts/ed25519");
|
|
4
4
|
let _frosts_core = require("@frosts/core");
|
|
5
5
|
//#region src/frost/index.ts
|
package/dist/frost/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["Identifier","Ed25519Sha512","keys","SigningPackageImpl","serde"],"sources":["../../src/frost/index.ts"],"sourcesContent":["/**\n * Copyright © 2023-2026 Blockchain Commons, LLC\n * Copyright © 2025-2026 Parity Technologies\n *\n *\n * FROST cryptographic operations module.\n *\n * This module wraps the @frosts/ed25519 library to provide FROST\n * threshold signature operations for DKG and signing.\n *\n * @module\n */\n\nimport {\n Ed25519Sha512,\n Identifier,\n keys,\n serde,\n commitRound1,\n signRound2,\n aggregate,\n type Ed25519SigningNonces,\n type Ed25519SigningCommitments,\n type Ed25519SignatureShare,\n type Ed25519Signature,\n type KeyPackage,\n type PublicKeyPackage,\n type SigningShare,\n} from \"@frosts/ed25519\";\n\nimport { type SigningPackage, SigningPackageImpl, type RandomSource } from \"@frosts/core\";\n\n// Re-export types for convenience\nexport type {\n Ed25519SigningNonces,\n Ed25519SigningCommitments,\n Ed25519SignatureShare,\n Ed25519Signature,\n KeyPackage,\n PublicKeyPackage,\n RandomSource,\n};\n\nexport { Ed25519Sha512, Identifier, keys };\n\n// Type aliases for frost-hubert\nexport type FrostIdentifier = Identifier<typeof Ed25519Sha512>;\nexport type FrostKeyPackage = KeyPackage<typeof Ed25519Sha512>;\nexport type FrostPublicKeyPackage = PublicKeyPackage<typeof Ed25519Sha512>;\nexport type FrostSigningPackage = SigningPackage<typeof Ed25519Sha512>;\nexport type FrostSigningShare = SigningShare<typeof Ed25519Sha512>;\n\n// DKG round types - use the namespaced types from keys.dkg\nexport type DkgRound1Package = keys.dkg.round1.Package;\nexport type DkgRound1SecretPackage = keys.dkg.round1.SecretPackage;\nexport type DkgRound2Package = keys.dkg.round2.Package;\nexport type DkgRound2SecretPackage = keys.dkg.round2.SecretPackage;\n\n/**\n * Cryptographically secure random number generator using Web Crypto API.\n */\nexport class SecureRng implements RandomSource {\n fill(array: Uint8Array): void {\n globalThis.crypto.getRandomValues(array as Uint8Array<ArrayBuffer>);\n }\n}\n\n/**\n * Create a new secure random number generator.\n */\nexport function createRng(): RandomSource {\n return new SecureRng();\n}\n\n/**\n * Create an identifier from a number (1-indexed participant ID).\n */\nexport function identifierFromU16(id: number): FrostIdentifier {\n return Identifier.fromU16(Ed25519Sha512, id);\n}\n\n/**\n * Serialize an identifier to bytes.\n */\nexport function serializeIdentifier(id: FrostIdentifier): Uint8Array {\n return id.serialize();\n}\n\n/**\n * Deserialize an identifier from bytes.\n */\nexport function deserializeIdentifier(bytes: Uint8Array): FrostIdentifier {\n return Identifier.deserialize(Ed25519Sha512, bytes);\n}\n\n/**\n * Convert an identifier to a hex string for use as a map key.\n */\nexport function identifierToHex(id: FrostIdentifier): string {\n return bytesToHex(id.serialize());\n}\n\n// =============================================================================\n// DKG Operations\n// =============================================================================\n\n/**\n * Execute DKG round 1 (part1) - Generate commitment and proof of knowledge.\n *\n * @param identifier - This participant's identifier\n * @param maxSigners - Total number of participants\n * @param minSigners - Threshold (minimum signers required)\n * @param rng - Random number generator\n * @returns Tuple of [SecretPackage, Package] where Package is broadcast to all\n */\nexport function dkgPart1(\n identifier: FrostIdentifier,\n maxSigners: number,\n minSigners: number,\n rng: RandomSource = createRng(),\n): [DkgRound1SecretPackage, DkgRound1Package] {\n return keys.dkg.part1(Ed25519Sha512, identifier, maxSigners, minSigners, rng);\n}\n\n/**\n * Execute DKG round 2 (part2) - Process round 1 packages and generate shares.\n *\n * @param secretPackage - The secret package from part1\n * @param round1Packages - Map of identifier hex to round1 packages from other participants\n * @returns Tuple of [Round2SecretPackage, Map of round2 packages to send]\n */\nexport function dkgPart2(\n secretPackage: DkgRound1SecretPackage,\n round1Packages: Map<string, DkgRound1Package>,\n): [DkgRound2SecretPackage, Map<string, DkgRound2Package>] {\n return keys.dkg.part2(Ed25519Sha512, secretPackage, round1Packages);\n}\n\n/**\n * Execute DKG round 3 (part3/finalize) - Compute final key package.\n *\n * @param round2SecretPackage - The secret package from part2\n * @param round1Packages - Map of identifier hex to round1 packages\n * @param round2Packages - Map of identifier hex to round2 packages received\n * @returns Promise of tuple [KeyPackage, PublicKeyPackage]\n */\nexport async function dkgPart3(\n round2SecretPackage: DkgRound2SecretPackage,\n round1Packages: Map<string, DkgRound1Package>,\n round2Packages: Map<string, DkgRound2Package>,\n): Promise<[FrostKeyPackage, FrostPublicKeyPackage]> {\n return keys.dkg.part3(Ed25519Sha512, round2SecretPackage, round1Packages, round2Packages);\n}\n\n// =============================================================================\n// Signing Operations\n// =============================================================================\n\n/**\n * Execute signing round 1 - Generate nonces and commitments.\n *\n * @param keyPackage - The participant's key package from DKG\n * @param rng - Random number generator\n * @returns Tuple of [SigningNonces, SigningCommitments]\n */\nexport function signingRound1(\n keyPackage: FrostKeyPackage,\n rng: RandomSource = createRng(),\n): [Ed25519SigningNonces, Ed25519SigningCommitments] {\n return commitRound1(keyPackage.signingShare, rng);\n}\n\n/**\n * Create a signing package from commitments and message.\n *\n * @param commitments - Map of identifier to signing commitments\n * @param message - The message to sign\n * @returns SigningPackage for round 2\n */\nexport function createSigningPackage(\n commitments: Map<FrostIdentifier, Ed25519SigningCommitments>,\n message: Uint8Array,\n): FrostSigningPackage {\n return new SigningPackageImpl(Ed25519Sha512, commitments, message);\n}\n\n/**\n * Execute signing round 2 - Generate signature share.\n *\n * @param signingPackage - The signing package with all commitments\n * @param nonces - This participant's nonces from round 1\n * @param keyPackage - This participant's key package\n * @returns Signature share\n */\nexport function signingRound2(\n signingPackage: FrostSigningPackage,\n nonces: Ed25519SigningNonces,\n keyPackage: FrostKeyPackage,\n): Ed25519SignatureShare {\n return signRound2(signingPackage, nonces, keyPackage);\n}\n\n/**\n * Aggregate signature shares into a final signature.\n *\n * @param signingPackage - The signing package used for round 2\n * @param signatureShares - Map of identifier to signature shares\n * @param publicKeyPackage - The group's public key package\n * @returns The aggregated signature\n */\nexport function aggregateSignatures(\n signingPackage: FrostSigningPackage,\n signatureShares: Map<FrostIdentifier, Ed25519SignatureShare>,\n publicKeyPackage: FrostPublicKeyPackage,\n): Ed25519Signature {\n return aggregate(signingPackage, signatureShares, publicKeyPackage);\n}\n\n// =============================================================================\n// Serialization Helpers - Using @frosts/ed25519 serde module\n// =============================================================================\n\n/**\n * Serialize a DKG round 1 package to JSON-compatible format.\n */\nexport function serializeDkgRound1Package(pkg: DkgRound1Package): SerializedDkgRound1Package {\n const json = serde.round1PackageToJson(pkg);\n return {\n commitment: {\n coefficients: json.commitment,\n },\n proofOfKnowledge: json.proof_of_knowledge,\n };\n}\n\n/**\n * Deserialize a DKG round 1 package from JSON format.\n */\nexport function deserializeDkgRound1Package(data: SerializedDkgRound1Package): DkgRound1Package {\n const json = {\n header: serde.DEFAULT_HEADER,\n commitment: data.commitment.coefficients,\n proof_of_knowledge: data.proofOfKnowledge,\n };\n return serde.round1PackageFromJson(json);\n}\n\n/**\n * Serialize a DKG round 2 package to JSON-compatible format.\n */\nexport function serializeDkgRound2Package(pkg: DkgRound2Package): SerializedDkgRound2Package {\n const json = serde.round2PackageToJson(pkg);\n return {\n signingShare: json.signing_share,\n };\n}\n\n/**\n * Deserialize a DKG round 2 package from JSON format.\n */\nexport function deserializeDkgRound2Package(data: SerializedDkgRound2Package): DkgRound2Package {\n const json = {\n header: serde.DEFAULT_HEADER,\n signing_share: data.signingShare,\n };\n return serde.round2PackageFromJson(json);\n}\n\n/**\n * Serialize a key package to JSON-compatible format.\n */\nexport function serializeKeyPackage(keyPackage: FrostKeyPackage): SerializedKeyPackage {\n const json = serde.keyPackageToJson(keyPackage);\n return {\n identifier: json.identifier,\n signingShare: json.signing_share,\n verifyingShare: json.verifying_share,\n verifyingKey: json.verifying_key,\n minSigners: json.min_signers,\n };\n}\n\n/**\n * Deserialize a key package from JSON format.\n */\nexport function deserializeKeyPackage(data: SerializedKeyPackage): FrostKeyPackage {\n const json = {\n header: serde.DEFAULT_HEADER,\n identifier: data.identifier,\n signing_share: data.signingShare,\n verifying_share: data.verifyingShare,\n verifying_key: data.verifyingKey,\n min_signers: data.minSigners,\n };\n return serde.keyPackageFromJson(json);\n}\n\n/**\n * Serialize a public key package to JSON-compatible format.\n */\nexport function serializePublicKeyPackage(pkg: FrostPublicKeyPackage): SerializedPublicKeyPackage {\n const json = serde.publicKeyPackageToJson(pkg);\n return {\n verifyingKey: json.verifying_key,\n verifyingShares: json.verifying_shares,\n // minSigners may be undefined in older packages\n ...(json.min_signers !== undefined ? { minSigners: json.min_signers } : {}),\n };\n}\n\n/**\n * Deserialize a public key package from JSON format.\n */\nexport function deserializePublicKeyPackage(\n data: SerializedPublicKeyPackage,\n): FrostPublicKeyPackage {\n const json = {\n header: serde.DEFAULT_HEADER,\n verifying_key: data.verifyingKey,\n verifying_shares: data.verifyingShares,\n min_signers: data.minSigners,\n };\n return serde.publicKeyPackageFromJson(json);\n}\n\n/**\n * Serialize signing nonces to JSON-compatible format.\n */\nexport function serializeSigningNonces(nonces: Ed25519SigningNonces): SerializedSigningNonces {\n // Access the internal properties of the nonces\n return {\n hiding: bytesToHex(nonces.hiding.serialize()),\n binding: bytesToHex(nonces.binding.serialize()),\n commitments: {\n hiding: bytesToHex(nonces.commitments.hiding.serialize()),\n binding: bytesToHex(nonces.commitments.binding.serialize()),\n },\n };\n}\n\n/**\n * Serialize signing commitments to JSON-compatible format.\n */\nexport function serializeSigningCommitments(\n commitments: Ed25519SigningCommitments,\n): SerializedSigningCommitments {\n const json = serde.signingCommitmentsToJson(commitments);\n return {\n hiding: json.hiding,\n binding: json.binding,\n };\n}\n\n/**\n * Deserialize signing commitments from JSON format.\n */\nexport function deserializeSigningCommitments(\n data: SerializedSigningCommitments,\n): Ed25519SigningCommitments {\n const json = {\n header: serde.DEFAULT_HEADER,\n hiding: data.hiding,\n binding: data.binding,\n };\n return serde.signingCommitmentsFromJson(json);\n}\n\n/**\n * Serialize a signature share to hex string.\n */\nexport function serializeSignatureShare(share: Ed25519SignatureShare): string {\n const json = serde.signatureShareToJson(share);\n return json.share;\n}\n\n/**\n * Deserialize a signature share from hex string.\n */\nexport function deserializeSignatureShare(hex: string): Ed25519SignatureShare {\n const json = {\n header: serde.DEFAULT_HEADER,\n share: hex,\n };\n return serde.signatureShareFromJson(json);\n}\n\n/**\n * Serialize a signature to bytes.\n */\nexport function serializeSignature(sig: Ed25519Signature): Uint8Array {\n return sig.serialize(Ed25519Sha512);\n}\n\n/**\n * Serialize a signature to hex string.\n */\nexport function serializeSignatureHex(sig: Ed25519Signature): string {\n return bytesToHex(sig.serialize(Ed25519Sha512));\n}\n\n// =============================================================================\n// Serialized Type Definitions\n// =============================================================================\n\nexport interface SerializedDkgRound1Package {\n commitment: {\n coefficients: string[]; // hex-encoded coefficient commitments\n };\n proofOfKnowledge: string; // hex-encoded proof of knowledge\n}\n\nexport interface SerializedDkgRound2Package {\n signingShare: string; // hex-encoded signing share\n}\n\nexport interface SerializedKeyPackage {\n identifier: string;\n signingShare: string;\n verifyingShare: string;\n verifyingKey: string;\n minSigners: number;\n}\n\nexport interface SerializedPublicKeyPackage {\n verifyingKey: string;\n verifyingShares: Record<string, string>; // identifier hex -> verifying share hex\n minSigners?: number;\n}\n\nexport interface SerializedSigningNonces {\n hiding: string;\n binding: string;\n commitments: {\n hiding: string;\n binding: string;\n };\n}\n\nexport interface SerializedSigningCommitments {\n hiding: string;\n binding: string;\n}\n\n// =============================================================================\n// Utility Functions - Re-export from serde\n// =============================================================================\n\n/**\n * Convert bytes to hex string.\n */\nexport function bytesToHex(bytes: Uint8Array): string {\n return serde.bytesToHex(bytes);\n}\n\n/**\n * Convert hex string to bytes.\n */\nexport function hexToBytes(hex: string): Uint8Array {\n return serde.hexToBytes(hex);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["Identifier","Ed25519Sha512","keys","SigningPackageImpl","serde"],"sources":["../../src/frost/index.ts"],"sourcesContent":["/**\n * Copyright © 2023-2026 Blockchain Commons, LLC\n * Copyright © 2025-2026 Parity Technologies\n *\n *\n * FROST cryptographic operations module.\n *\n * This module wraps the @frosts/ed25519 library to provide FROST\n * threshold signature operations for DKG and signing.\n *\n * @module\n */\n\nimport {\n Ed25519Sha512,\n Identifier,\n keys,\n serde,\n commitRound1,\n signRound2,\n aggregate,\n type Ed25519SigningNonces,\n type Ed25519SigningCommitments,\n type Ed25519SignatureShare,\n type Ed25519Signature,\n type KeyPackage,\n type PublicKeyPackage,\n type SigningShare,\n} from \"@frosts/ed25519\";\n\nimport { type SigningPackage, SigningPackageImpl, type RandomSource } from \"@frosts/core\";\n\n// Re-export types for convenience\nexport type {\n Ed25519SigningNonces,\n Ed25519SigningCommitments,\n Ed25519SignatureShare,\n Ed25519Signature,\n KeyPackage,\n PublicKeyPackage,\n RandomSource,\n};\n\nexport { Ed25519Sha512, Identifier, keys };\n\n// Type aliases for frost-hubert\nexport type FrostIdentifier = Identifier<typeof Ed25519Sha512>;\nexport type FrostKeyPackage = KeyPackage<typeof Ed25519Sha512>;\nexport type FrostPublicKeyPackage = PublicKeyPackage<typeof Ed25519Sha512>;\nexport type FrostSigningPackage = SigningPackage<typeof Ed25519Sha512>;\nexport type FrostSigningShare = SigningShare<typeof Ed25519Sha512>;\n\n// DKG round types - use the namespaced types from keys.dkg\nexport type DkgRound1Package = keys.dkg.round1.Package;\nexport type DkgRound1SecretPackage = keys.dkg.round1.SecretPackage;\nexport type DkgRound2Package = keys.dkg.round2.Package;\nexport type DkgRound2SecretPackage = keys.dkg.round2.SecretPackage;\n\n/**\n * Cryptographically secure random number generator using Web Crypto API.\n */\nexport class SecureRng implements RandomSource {\n fill(array: Uint8Array): void {\n globalThis.crypto.getRandomValues(array as Uint8Array<ArrayBuffer>);\n }\n}\n\n/**\n * Create a new secure random number generator.\n */\nexport function createRng(): RandomSource {\n return new SecureRng();\n}\n\n/**\n * Create an identifier from a number (1-indexed participant ID).\n */\nexport function identifierFromU16(id: number): FrostIdentifier {\n return Identifier.fromU16(Ed25519Sha512, id);\n}\n\n/**\n * Serialize an identifier to bytes.\n */\nexport function serializeIdentifier(id: FrostIdentifier): Uint8Array {\n return id.serialize();\n}\n\n/**\n * Deserialize an identifier from bytes.\n */\nexport function deserializeIdentifier(bytes: Uint8Array): FrostIdentifier {\n return Identifier.deserialize(Ed25519Sha512, bytes);\n}\n\n/**\n * Convert an identifier to a hex string for use as a map key.\n */\nexport function identifierToHex(id: FrostIdentifier): string {\n return bytesToHex(id.serialize());\n}\n\n// =============================================================================\n// DKG Operations\n// =============================================================================\n\n/**\n * Execute DKG round 1 (part1) - Generate commitment and proof of knowledge.\n *\n * @param identifier - This participant's identifier\n * @param maxSigners - Total number of participants\n * @param minSigners - Threshold (minimum signers required)\n * @param rng - Random number generator\n * @returns Tuple of [SecretPackage, Package] where Package is broadcast to all\n */\nexport function dkgPart1(\n identifier: FrostIdentifier,\n maxSigners: number,\n minSigners: number,\n rng: RandomSource = createRng(),\n): [DkgRound1SecretPackage, DkgRound1Package] {\n return keys.dkg.part1(Ed25519Sha512, identifier, maxSigners, minSigners, rng);\n}\n\n/**\n * Execute DKG round 2 (part2) - Process round 1 packages and generate shares.\n *\n * @param secretPackage - The secret package from part1\n * @param round1Packages - Map of identifier hex to round1 packages from other participants\n * @returns Tuple of [Round2SecretPackage, Map of round2 packages to send]\n */\nexport function dkgPart2(\n secretPackage: DkgRound1SecretPackage,\n round1Packages: Map<string, DkgRound1Package>,\n): [DkgRound2SecretPackage, Map<string, DkgRound2Package>] {\n return keys.dkg.part2(Ed25519Sha512, secretPackage, round1Packages);\n}\n\n/**\n * Execute DKG round 3 (part3/finalize) - Compute final key package.\n *\n * @param round2SecretPackage - The secret package from part2\n * @param round1Packages - Map of identifier hex to round1 packages\n * @param round2Packages - Map of identifier hex to round2 packages received\n * @returns Promise of tuple [KeyPackage, PublicKeyPackage]\n */\nexport async function dkgPart3(\n round2SecretPackage: DkgRound2SecretPackage,\n round1Packages: Map<string, DkgRound1Package>,\n round2Packages: Map<string, DkgRound2Package>,\n): Promise<[FrostKeyPackage, FrostPublicKeyPackage]> {\n return keys.dkg.part3(Ed25519Sha512, round2SecretPackage, round1Packages, round2Packages);\n}\n\n// =============================================================================\n// Signing Operations\n// =============================================================================\n\n/**\n * Execute signing round 1 - Generate nonces and commitments.\n *\n * @param keyPackage - The participant's key package from DKG\n * @param rng - Random number generator\n * @returns Tuple of [SigningNonces, SigningCommitments]\n */\nexport function signingRound1(\n keyPackage: FrostKeyPackage,\n rng: RandomSource = createRng(),\n): [Ed25519SigningNonces, Ed25519SigningCommitments] {\n return commitRound1(keyPackage.signingShare, rng);\n}\n\n/**\n * Create a signing package from commitments and message.\n *\n * @param commitments - Map of identifier to signing commitments\n * @param message - The message to sign\n * @returns SigningPackage for round 2\n */\nexport function createSigningPackage(\n commitments: Map<FrostIdentifier, Ed25519SigningCommitments>,\n message: Uint8Array,\n): FrostSigningPackage {\n return new SigningPackageImpl(Ed25519Sha512, commitments, message);\n}\n\n/**\n * Execute signing round 2 - Generate signature share.\n *\n * @param signingPackage - The signing package with all commitments\n * @param nonces - This participant's nonces from round 1\n * @param keyPackage - This participant's key package\n * @returns Signature share\n */\nexport function signingRound2(\n signingPackage: FrostSigningPackage,\n nonces: Ed25519SigningNonces,\n keyPackage: FrostKeyPackage,\n): Ed25519SignatureShare {\n return signRound2(signingPackage, nonces, keyPackage);\n}\n\n/**\n * Aggregate signature shares into a final signature.\n *\n * @param signingPackage - The signing package used for round 2\n * @param signatureShares - Map of identifier to signature shares\n * @param publicKeyPackage - The group's public key package\n * @returns The aggregated signature\n */\nexport function aggregateSignatures(\n signingPackage: FrostSigningPackage,\n signatureShares: Map<FrostIdentifier, Ed25519SignatureShare>,\n publicKeyPackage: FrostPublicKeyPackage,\n): Ed25519Signature {\n return aggregate(signingPackage, signatureShares, publicKeyPackage);\n}\n\n// =============================================================================\n// Serialization Helpers - Using @frosts/ed25519 serde module\n// =============================================================================\n\n/**\n * Serialize a DKG round 1 package to JSON-compatible format.\n */\nexport function serializeDkgRound1Package(pkg: DkgRound1Package): SerializedDkgRound1Package {\n const json = serde.round1PackageToJson(pkg);\n return {\n commitment: {\n coefficients: json.commitment,\n },\n proofOfKnowledge: json.proof_of_knowledge,\n };\n}\n\n/**\n * Deserialize a DKG round 1 package from JSON format.\n */\nexport function deserializeDkgRound1Package(data: SerializedDkgRound1Package): DkgRound1Package {\n const json = {\n header: serde.DEFAULT_HEADER,\n commitment: data.commitment.coefficients,\n proof_of_knowledge: data.proofOfKnowledge,\n };\n return serde.round1PackageFromJson(json);\n}\n\n/**\n * Serialize a DKG round 2 package to JSON-compatible format.\n */\nexport function serializeDkgRound2Package(pkg: DkgRound2Package): SerializedDkgRound2Package {\n const json = serde.round2PackageToJson(pkg);\n return {\n signingShare: json.signing_share,\n };\n}\n\n/**\n * Deserialize a DKG round 2 package from JSON format.\n */\nexport function deserializeDkgRound2Package(data: SerializedDkgRound2Package): DkgRound2Package {\n const json = {\n header: serde.DEFAULT_HEADER,\n signing_share: data.signingShare,\n };\n return serde.round2PackageFromJson(json);\n}\n\n/**\n * Serialize a key package to JSON-compatible format.\n */\nexport function serializeKeyPackage(keyPackage: FrostKeyPackage): SerializedKeyPackage {\n const json = serde.keyPackageToJson(keyPackage);\n return {\n identifier: json.identifier,\n signingShare: json.signing_share,\n verifyingShare: json.verifying_share,\n verifyingKey: json.verifying_key,\n minSigners: json.min_signers,\n };\n}\n\n/**\n * Deserialize a key package from JSON format.\n */\nexport function deserializeKeyPackage(data: SerializedKeyPackage): FrostKeyPackage {\n const json = {\n header: serde.DEFAULT_HEADER,\n identifier: data.identifier,\n signing_share: data.signingShare,\n verifying_share: data.verifyingShare,\n verifying_key: data.verifyingKey,\n min_signers: data.minSigners,\n };\n return serde.keyPackageFromJson(json);\n}\n\n/**\n * Serialize a public key package to JSON-compatible format.\n */\nexport function serializePublicKeyPackage(pkg: FrostPublicKeyPackage): SerializedPublicKeyPackage {\n const json = serde.publicKeyPackageToJson(pkg);\n return {\n verifyingKey: json.verifying_key,\n verifyingShares: json.verifying_shares,\n // minSigners may be undefined in older packages\n ...(json.min_signers !== undefined ? { minSigners: json.min_signers } : {}),\n };\n}\n\n/**\n * Deserialize a public key package from JSON format.\n */\nexport function deserializePublicKeyPackage(\n data: SerializedPublicKeyPackage,\n): FrostPublicKeyPackage {\n const json = {\n header: serde.DEFAULT_HEADER,\n verifying_key: data.verifyingKey,\n verifying_shares: data.verifyingShares,\n min_signers: data.minSigners,\n };\n return serde.publicKeyPackageFromJson(json);\n}\n\n/**\n * Serialize signing nonces to JSON-compatible format.\n */\nexport function serializeSigningNonces(nonces: Ed25519SigningNonces): SerializedSigningNonces {\n // Access the internal properties of the nonces\n return {\n hiding: bytesToHex(nonces.hiding.serialize()),\n binding: bytesToHex(nonces.binding.serialize()),\n commitments: {\n hiding: bytesToHex(nonces.commitments.hiding.serialize()),\n binding: bytesToHex(nonces.commitments.binding.serialize()),\n },\n };\n}\n\n/**\n * Serialize signing commitments to JSON-compatible format.\n */\nexport function serializeSigningCommitments(\n commitments: Ed25519SigningCommitments,\n): SerializedSigningCommitments {\n const json = serde.signingCommitmentsToJson(commitments);\n return {\n hiding: json.hiding,\n binding: json.binding,\n };\n}\n\n/**\n * Deserialize signing commitments from JSON format.\n */\nexport function deserializeSigningCommitments(\n data: SerializedSigningCommitments,\n): Ed25519SigningCommitments {\n const json = {\n header: serde.DEFAULT_HEADER,\n hiding: data.hiding,\n binding: data.binding,\n };\n return serde.signingCommitmentsFromJson(json);\n}\n\n/**\n * Serialize a signature share to hex string.\n */\nexport function serializeSignatureShare(share: Ed25519SignatureShare): string {\n const json = serde.signatureShareToJson(share);\n return json.share;\n}\n\n/**\n * Deserialize a signature share from hex string.\n */\nexport function deserializeSignatureShare(hex: string): Ed25519SignatureShare {\n const json = {\n header: serde.DEFAULT_HEADER,\n share: hex,\n };\n return serde.signatureShareFromJson(json);\n}\n\n/**\n * Serialize a signature to bytes.\n */\nexport function serializeSignature(sig: Ed25519Signature): Uint8Array {\n return sig.serialize(Ed25519Sha512);\n}\n\n/**\n * Serialize a signature to hex string.\n */\nexport function serializeSignatureHex(sig: Ed25519Signature): string {\n return bytesToHex(sig.serialize(Ed25519Sha512));\n}\n\n// =============================================================================\n// Serialized Type Definitions\n// =============================================================================\n\nexport interface SerializedDkgRound1Package {\n commitment: {\n coefficients: string[]; // hex-encoded coefficient commitments\n };\n proofOfKnowledge: string; // hex-encoded proof of knowledge\n}\n\nexport interface SerializedDkgRound2Package {\n signingShare: string; // hex-encoded signing share\n}\n\nexport interface SerializedKeyPackage {\n identifier: string;\n signingShare: string;\n verifyingShare: string;\n verifyingKey: string;\n minSigners: number;\n}\n\nexport interface SerializedPublicKeyPackage {\n verifyingKey: string;\n verifyingShares: Record<string, string>; // identifier hex -> verifying share hex\n minSigners?: number;\n}\n\nexport interface SerializedSigningNonces {\n hiding: string;\n binding: string;\n commitments: {\n hiding: string;\n binding: string;\n };\n}\n\nexport interface SerializedSigningCommitments {\n hiding: string;\n binding: string;\n}\n\n// =============================================================================\n// Utility Functions - Re-export from serde\n// =============================================================================\n\n/**\n * Convert bytes to hex string.\n */\nexport function bytesToHex(bytes: Uint8Array): string {\n return serde.bytesToHex(bytes);\n}\n\n/**\n * Convert hex string to bytes.\n */\nexport function hexToBytes(hex: string): Uint8Array {\n return serde.hexToBytes(hex);\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.cts","names":[],"sources":["../../src/frost/index.ts"],"mappings":";;;;;;;KA8CY,eAAA,GAAkB,
|
|
1
|
+
{"version":3,"file":"index.d.cts","names":[],"sources":["../../src/frost/index.ts"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../../src/frost/index.ts"],"mappings":";;;;;;;KA8CY,eAAA,GAAkB,
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../../src/frost/index.ts"],"mappings":";;;;;;;KA8CY,eAAA,GAAkB,UAAU,QAAQ,aAAA;AAAA,KACpC,eAAA,GAAkB,UAAU,QAAQ,aAAA;AAAA,KACpC,qBAAA,GAAwB,gBAAgB,QAAQ,aAAA;AAAA,KAChD,mBAAA,GAAsB,cAAc,QAAQ,aAAA;AAAA,KAC5C,iBAAA,GAAoB,YAAY,QAAQ,aAAA;AAAA,KAGxC,gBAAA,GAAmB,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,OAAO;AAAA,KAC1C,sBAAA,GAAyB,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,aAAa;AAAA,KACtD,gBAAA,GAAmB,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,OAAO;AAAA,KAC1C,sBAAA,GAAyB,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,aAAa;;;;cAKrD,SAAA,YAAqB,YAAY;EAC5C,IAAA,CAAK,KAAA,EAAO,UAAA;AAAA;;;;iBAQE,SAAA,CAAA,GAAa,YAAY;;;;iBAOzB,iBAAA,CAAkB,EAAA,WAAa,eAAe;;;;iBAO9C,mBAAA,CAAoB,EAAA,EAAI,eAAA,GAAkB,UAAU;;;;iBAOpD,qBAAA,CAAsB,KAAA,EAAO,UAAA,GAAa,eAAe;;;;iBAOzD,eAAA,CAAgB,EAAmB,EAAf,eAAe;;;;;;;;;;iBAiBnC,QAAA,CACd,UAAA,EAAY,eAAA,EACZ,UAAA,UACA,UAAA,UACA,GAAA,GAAK,YAAA,IACH,sBAAA,EAAwB,gBAAA;;AA1E5B;;;;AAA6D;AAC7D;iBAoFgB,QAAA,CACd,aAAA,EAAe,sBAAA,EACf,cAAA,EAAgB,GAAA,SAAY,gBAAA,KAC1B,sBAAA,EAAwB,GAAA,SAAY,gBAAA;;;AAvFqB;AAC7D;;;;AAAyE;iBAkGnD,QAAA,CACpB,mBAAA,EAAqB,sBAAA,EACrB,cAAA,EAAgB,GAAA,SAAY,gBAAA,GAC5B,cAAA,EAAgB,GAAA,SAAY,gBAAA,IAC3B,OAAA,EAAS,eAAA,EAAiB,qBAAA;;;;AArGwC;AACrE;;;iBAmHgB,aAAA,CACd,UAAA,EAAY,eAAA,EACZ,GAAA,GAAK,YAAA,IACH,oBAAA,EAAsB,yBAAA;AAtHuC;AAGjE;;;;;;AAHiE,iBAiIjD,oBAAA,CACd,WAAA,EAAa,GAAA,CAAI,eAAA,EAAiB,yBAAA,GAClC,OAAA,EAAS,UAAA,GACR,mBAAA;;;AAjImD;AACtD;;;;;iBA4IgB,aAAA,CACd,cAAA,EAAgB,mBAAA,EAChB,MAAA,EAAQ,oBAAA,EACR,UAAA,EAAY,eAAA,GACX,qBAAA;;;;AAhJ+D;AAClE;;;;iBA2JgB,mBAAA,CACd,cAAA,EAAgB,mBAAA,EAChB,eAAA,EAAiB,GAAA,CAAI,eAAA,EAAiB,qBAAA,GACtC,gBAAA,EAAkB,qBAAA,GACjB,gBAAA;;;;iBAWa,yBAAA,CAA0B,GAAA,EAAK,gBAAA,GAAmB,0BAA0B;AA1KtC;AACtD;;AADsD,iBAuLtC,2BAAA,CAA4B,IAAA,EAAM,0BAAA,GAA6B,gBAAgB;;;;iBAY/E,yBAAA,CAA0B,GAAA,EAAK,gBAAA,GAAmB,0BAA0B;;;AAlM1B;iBA4MlD,2BAAA,CAA4B,IAAA,EAAM,0BAAA,GAA6B,gBAAgB;;;;iBAW/E,mBAAA,CAAoB,UAAA,EAAY,eAAA,GAAkB,oBAAoB;;;;iBActE,qBAAA,CAAsB,IAAA,EAAM,oBAAA,GAAuB,eAAe;AA/N1D;AAQxB;;AARwB,iBA8OR,yBAAA,CAA0B,GAAA,EAAK,qBAAA,GAAwB,0BAA0B;;AAtOxD;AAOzC;iBA4OgB,2BAAA,CACd,IAAA,EAAM,0BAAA,GACL,qBAAqB;;;AA9OsC;iBA2P9C,sBAAA,CAAuB,MAAA,EAAQ,oBAAA,GAAuB,uBAAuB;;;;iBAe7E,2BAAA,CACd,WAAA,EAAa,yBAAA,GACZ,4BAA4B;;;;iBAWf,6BAAA,CACd,IAAA,EAAM,4BAAA,GACL,yBAAyB;AA3Q5B;;;AAAA,iBAuRgB,uBAAA,CAAwB,KAA4B,EAArB,qBAAqB;;;;iBAQpD,yBAAA,CAA0B,GAAA,WAAc,qBAAqB;AA/RJ;AAOzE;;AAPyE,iBA0SzD,kBAAA,CAAmB,GAAA,EAAK,gBAAA,GAAmB,UAAU;;AAnSlB;AAiBnD;iBAyRgB,qBAAA,CAAsB,GAAqB,EAAhB,gBAAgB;AAAA,UAQ1C,0BAAA;EACf,UAAA;IACE,YAAA;EAAA;EAEF,gBAAA;AAAA;AAAA,UAGe,0BAAA;EACf,YAAY;AAAA;AAAA,UAGG,oBAAA;EACf,UAAA;EACA,YAAA;EACA,cAAA;EACA,YAAA;EACA,UAAA;AAAA;AAAA,UAGe,0BAAA;EACf,YAAA;EACA,eAAA,EAAiB,MAAM;EACvB,UAAA;AAAA;AAAA,UAGe,uBAAA;EACf,MAAA;EACA,OAAA;EACA,WAAA;IACE,MAAA;IACA,OAAA;EAAA;AAAA;AAAA,UAIa,4BAAA;EACf,MAAA;EACA,OAAO;AAAA;;;;iBAUO,UAAA,CAAW,KAAiB,EAAV,UAAU;AA5TY;AAYxD;;AAZwD,iBAmUxC,UAAA,CAAW,GAAA,WAAc,UAAU"}
|
package/dist/frost/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as __exportAll } from "../chunk-
|
|
1
|
+
import { t as __exportAll } from "../chunk-z9aeyW2b.mjs";
|
|
2
2
|
import { Ed25519Sha512, Identifier, aggregate, commitRound1, keys, serde, signRound2 } from "@frosts/ed25519";
|
|
3
3
|
import { SigningPackageImpl } from "@frosts/core";
|
|
4
4
|
//#region src/frost/index.ts
|
package/dist/frost/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":[],"sources":["../../src/frost/index.ts"],"sourcesContent":["/**\n * Copyright © 2023-2026 Blockchain Commons, LLC\n * Copyright © 2025-2026 Parity Technologies\n *\n *\n * FROST cryptographic operations module.\n *\n * This module wraps the @frosts/ed25519 library to provide FROST\n * threshold signature operations for DKG and signing.\n *\n * @module\n */\n\nimport {\n Ed25519Sha512,\n Identifier,\n keys,\n serde,\n commitRound1,\n signRound2,\n aggregate,\n type Ed25519SigningNonces,\n type Ed25519SigningCommitments,\n type Ed25519SignatureShare,\n type Ed25519Signature,\n type KeyPackage,\n type PublicKeyPackage,\n type SigningShare,\n} from \"@frosts/ed25519\";\n\nimport { type SigningPackage, SigningPackageImpl, type RandomSource } from \"@frosts/core\";\n\n// Re-export types for convenience\nexport type {\n Ed25519SigningNonces,\n Ed25519SigningCommitments,\n Ed25519SignatureShare,\n Ed25519Signature,\n KeyPackage,\n PublicKeyPackage,\n RandomSource,\n};\n\nexport { Ed25519Sha512, Identifier, keys };\n\n// Type aliases for frost-hubert\nexport type FrostIdentifier = Identifier<typeof Ed25519Sha512>;\nexport type FrostKeyPackage = KeyPackage<typeof Ed25519Sha512>;\nexport type FrostPublicKeyPackage = PublicKeyPackage<typeof Ed25519Sha512>;\nexport type FrostSigningPackage = SigningPackage<typeof Ed25519Sha512>;\nexport type FrostSigningShare = SigningShare<typeof Ed25519Sha512>;\n\n// DKG round types - use the namespaced types from keys.dkg\nexport type DkgRound1Package = keys.dkg.round1.Package;\nexport type DkgRound1SecretPackage = keys.dkg.round1.SecretPackage;\nexport type DkgRound2Package = keys.dkg.round2.Package;\nexport type DkgRound2SecretPackage = keys.dkg.round2.SecretPackage;\n\n/**\n * Cryptographically secure random number generator using Web Crypto API.\n */\nexport class SecureRng implements RandomSource {\n fill(array: Uint8Array): void {\n globalThis.crypto.getRandomValues(array as Uint8Array<ArrayBuffer>);\n }\n}\n\n/**\n * Create a new secure random number generator.\n */\nexport function createRng(): RandomSource {\n return new SecureRng();\n}\n\n/**\n * Create an identifier from a number (1-indexed participant ID).\n */\nexport function identifierFromU16(id: number): FrostIdentifier {\n return Identifier.fromU16(Ed25519Sha512, id);\n}\n\n/**\n * Serialize an identifier to bytes.\n */\nexport function serializeIdentifier(id: FrostIdentifier): Uint8Array {\n return id.serialize();\n}\n\n/**\n * Deserialize an identifier from bytes.\n */\nexport function deserializeIdentifier(bytes: Uint8Array): FrostIdentifier {\n return Identifier.deserialize(Ed25519Sha512, bytes);\n}\n\n/**\n * Convert an identifier to a hex string for use as a map key.\n */\nexport function identifierToHex(id: FrostIdentifier): string {\n return bytesToHex(id.serialize());\n}\n\n// =============================================================================\n// DKG Operations\n// =============================================================================\n\n/**\n * Execute DKG round 1 (part1) - Generate commitment and proof of knowledge.\n *\n * @param identifier - This participant's identifier\n * @param maxSigners - Total number of participants\n * @param minSigners - Threshold (minimum signers required)\n * @param rng - Random number generator\n * @returns Tuple of [SecretPackage, Package] where Package is broadcast to all\n */\nexport function dkgPart1(\n identifier: FrostIdentifier,\n maxSigners: number,\n minSigners: number,\n rng: RandomSource = createRng(),\n): [DkgRound1SecretPackage, DkgRound1Package] {\n return keys.dkg.part1(Ed25519Sha512, identifier, maxSigners, minSigners, rng);\n}\n\n/**\n * Execute DKG round 2 (part2) - Process round 1 packages and generate shares.\n *\n * @param secretPackage - The secret package from part1\n * @param round1Packages - Map of identifier hex to round1 packages from other participants\n * @returns Tuple of [Round2SecretPackage, Map of round2 packages to send]\n */\nexport function dkgPart2(\n secretPackage: DkgRound1SecretPackage,\n round1Packages: Map<string, DkgRound1Package>,\n): [DkgRound2SecretPackage, Map<string, DkgRound2Package>] {\n return keys.dkg.part2(Ed25519Sha512, secretPackage, round1Packages);\n}\n\n/**\n * Execute DKG round 3 (part3/finalize) - Compute final key package.\n *\n * @param round2SecretPackage - The secret package from part2\n * @param round1Packages - Map of identifier hex to round1 packages\n * @param round2Packages - Map of identifier hex to round2 packages received\n * @returns Promise of tuple [KeyPackage, PublicKeyPackage]\n */\nexport async function dkgPart3(\n round2SecretPackage: DkgRound2SecretPackage,\n round1Packages: Map<string, DkgRound1Package>,\n round2Packages: Map<string, DkgRound2Package>,\n): Promise<[FrostKeyPackage, FrostPublicKeyPackage]> {\n return keys.dkg.part3(Ed25519Sha512, round2SecretPackage, round1Packages, round2Packages);\n}\n\n// =============================================================================\n// Signing Operations\n// =============================================================================\n\n/**\n * Execute signing round 1 - Generate nonces and commitments.\n *\n * @param keyPackage - The participant's key package from DKG\n * @param rng - Random number generator\n * @returns Tuple of [SigningNonces, SigningCommitments]\n */\nexport function signingRound1(\n keyPackage: FrostKeyPackage,\n rng: RandomSource = createRng(),\n): [Ed25519SigningNonces, Ed25519SigningCommitments] {\n return commitRound1(keyPackage.signingShare, rng);\n}\n\n/**\n * Create a signing package from commitments and message.\n *\n * @param commitments - Map of identifier to signing commitments\n * @param message - The message to sign\n * @returns SigningPackage for round 2\n */\nexport function createSigningPackage(\n commitments: Map<FrostIdentifier, Ed25519SigningCommitments>,\n message: Uint8Array,\n): FrostSigningPackage {\n return new SigningPackageImpl(Ed25519Sha512, commitments, message);\n}\n\n/**\n * Execute signing round 2 - Generate signature share.\n *\n * @param signingPackage - The signing package with all commitments\n * @param nonces - This participant's nonces from round 1\n * @param keyPackage - This participant's key package\n * @returns Signature share\n */\nexport function signingRound2(\n signingPackage: FrostSigningPackage,\n nonces: Ed25519SigningNonces,\n keyPackage: FrostKeyPackage,\n): Ed25519SignatureShare {\n return signRound2(signingPackage, nonces, keyPackage);\n}\n\n/**\n * Aggregate signature shares into a final signature.\n *\n * @param signingPackage - The signing package used for round 2\n * @param signatureShares - Map of identifier to signature shares\n * @param publicKeyPackage - The group's public key package\n * @returns The aggregated signature\n */\nexport function aggregateSignatures(\n signingPackage: FrostSigningPackage,\n signatureShares: Map<FrostIdentifier, Ed25519SignatureShare>,\n publicKeyPackage: FrostPublicKeyPackage,\n): Ed25519Signature {\n return aggregate(signingPackage, signatureShares, publicKeyPackage);\n}\n\n// =============================================================================\n// Serialization Helpers - Using @frosts/ed25519 serde module\n// =============================================================================\n\n/**\n * Serialize a DKG round 1 package to JSON-compatible format.\n */\nexport function serializeDkgRound1Package(pkg: DkgRound1Package): SerializedDkgRound1Package {\n const json = serde.round1PackageToJson(pkg);\n return {\n commitment: {\n coefficients: json.commitment,\n },\n proofOfKnowledge: json.proof_of_knowledge,\n };\n}\n\n/**\n * Deserialize a DKG round 1 package from JSON format.\n */\nexport function deserializeDkgRound1Package(data: SerializedDkgRound1Package): DkgRound1Package {\n const json = {\n header: serde.DEFAULT_HEADER,\n commitment: data.commitment.coefficients,\n proof_of_knowledge: data.proofOfKnowledge,\n };\n return serde.round1PackageFromJson(json);\n}\n\n/**\n * Serialize a DKG round 2 package to JSON-compatible format.\n */\nexport function serializeDkgRound2Package(pkg: DkgRound2Package): SerializedDkgRound2Package {\n const json = serde.round2PackageToJson(pkg);\n return {\n signingShare: json.signing_share,\n };\n}\n\n/**\n * Deserialize a DKG round 2 package from JSON format.\n */\nexport function deserializeDkgRound2Package(data: SerializedDkgRound2Package): DkgRound2Package {\n const json = {\n header: serde.DEFAULT_HEADER,\n signing_share: data.signingShare,\n };\n return serde.round2PackageFromJson(json);\n}\n\n/**\n * Serialize a key package to JSON-compatible format.\n */\nexport function serializeKeyPackage(keyPackage: FrostKeyPackage): SerializedKeyPackage {\n const json = serde.keyPackageToJson(keyPackage);\n return {\n identifier: json.identifier,\n signingShare: json.signing_share,\n verifyingShare: json.verifying_share,\n verifyingKey: json.verifying_key,\n minSigners: json.min_signers,\n };\n}\n\n/**\n * Deserialize a key package from JSON format.\n */\nexport function deserializeKeyPackage(data: SerializedKeyPackage): FrostKeyPackage {\n const json = {\n header: serde.DEFAULT_HEADER,\n identifier: data.identifier,\n signing_share: data.signingShare,\n verifying_share: data.verifyingShare,\n verifying_key: data.verifyingKey,\n min_signers: data.minSigners,\n };\n return serde.keyPackageFromJson(json);\n}\n\n/**\n * Serialize a public key package to JSON-compatible format.\n */\nexport function serializePublicKeyPackage(pkg: FrostPublicKeyPackage): SerializedPublicKeyPackage {\n const json = serde.publicKeyPackageToJson(pkg);\n return {\n verifyingKey: json.verifying_key,\n verifyingShares: json.verifying_shares,\n // minSigners may be undefined in older packages\n ...(json.min_signers !== undefined ? { minSigners: json.min_signers } : {}),\n };\n}\n\n/**\n * Deserialize a public key package from JSON format.\n */\nexport function deserializePublicKeyPackage(\n data: SerializedPublicKeyPackage,\n): FrostPublicKeyPackage {\n const json = {\n header: serde.DEFAULT_HEADER,\n verifying_key: data.verifyingKey,\n verifying_shares: data.verifyingShares,\n min_signers: data.minSigners,\n };\n return serde.publicKeyPackageFromJson(json);\n}\n\n/**\n * Serialize signing nonces to JSON-compatible format.\n */\nexport function serializeSigningNonces(nonces: Ed25519SigningNonces): SerializedSigningNonces {\n // Access the internal properties of the nonces\n return {\n hiding: bytesToHex(nonces.hiding.serialize()),\n binding: bytesToHex(nonces.binding.serialize()),\n commitments: {\n hiding: bytesToHex(nonces.commitments.hiding.serialize()),\n binding: bytesToHex(nonces.commitments.binding.serialize()),\n },\n };\n}\n\n/**\n * Serialize signing commitments to JSON-compatible format.\n */\nexport function serializeSigningCommitments(\n commitments: Ed25519SigningCommitments,\n): SerializedSigningCommitments {\n const json = serde.signingCommitmentsToJson(commitments);\n return {\n hiding: json.hiding,\n binding: json.binding,\n };\n}\n\n/**\n * Deserialize signing commitments from JSON format.\n */\nexport function deserializeSigningCommitments(\n data: SerializedSigningCommitments,\n): Ed25519SigningCommitments {\n const json = {\n header: serde.DEFAULT_HEADER,\n hiding: data.hiding,\n binding: data.binding,\n };\n return serde.signingCommitmentsFromJson(json);\n}\n\n/**\n * Serialize a signature share to hex string.\n */\nexport function serializeSignatureShare(share: Ed25519SignatureShare): string {\n const json = serde.signatureShareToJson(share);\n return json.share;\n}\n\n/**\n * Deserialize a signature share from hex string.\n */\nexport function deserializeSignatureShare(hex: string): Ed25519SignatureShare {\n const json = {\n header: serde.DEFAULT_HEADER,\n share: hex,\n };\n return serde.signatureShareFromJson(json);\n}\n\n/**\n * Serialize a signature to bytes.\n */\nexport function serializeSignature(sig: Ed25519Signature): Uint8Array {\n return sig.serialize(Ed25519Sha512);\n}\n\n/**\n * Serialize a signature to hex string.\n */\nexport function serializeSignatureHex(sig: Ed25519Signature): string {\n return bytesToHex(sig.serialize(Ed25519Sha512));\n}\n\n// =============================================================================\n// Serialized Type Definitions\n// =============================================================================\n\nexport interface SerializedDkgRound1Package {\n commitment: {\n coefficients: string[]; // hex-encoded coefficient commitments\n };\n proofOfKnowledge: string; // hex-encoded proof of knowledge\n}\n\nexport interface SerializedDkgRound2Package {\n signingShare: string; // hex-encoded signing share\n}\n\nexport interface SerializedKeyPackage {\n identifier: string;\n signingShare: string;\n verifyingShare: string;\n verifyingKey: string;\n minSigners: number;\n}\n\nexport interface SerializedPublicKeyPackage {\n verifyingKey: string;\n verifyingShares: Record<string, string>; // identifier hex -> verifying share hex\n minSigners?: number;\n}\n\nexport interface SerializedSigningNonces {\n hiding: string;\n binding: string;\n commitments: {\n hiding: string;\n binding: string;\n };\n}\n\nexport interface SerializedSigningCommitments {\n hiding: string;\n binding: string;\n}\n\n// =============================================================================\n// Utility Functions - Re-export from serde\n// =============================================================================\n\n/**\n * Convert bytes to hex string.\n */\nexport function bytesToHex(bytes: Uint8Array): string {\n return serde.bytesToHex(bytes);\n}\n\n/**\n * Convert hex string to bytes.\n */\nexport function hexToBytes(hex: string): Uint8Array {\n return serde.hexToBytes(hex);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../../src/frost/index.ts"],"sourcesContent":["/**\n * Copyright © 2023-2026 Blockchain Commons, LLC\n * Copyright © 2025-2026 Parity Technologies\n *\n *\n * FROST cryptographic operations module.\n *\n * This module wraps the @frosts/ed25519 library to provide FROST\n * threshold signature operations for DKG and signing.\n *\n * @module\n */\n\nimport {\n Ed25519Sha512,\n Identifier,\n keys,\n serde,\n commitRound1,\n signRound2,\n aggregate,\n type Ed25519SigningNonces,\n type Ed25519SigningCommitments,\n type Ed25519SignatureShare,\n type Ed25519Signature,\n type KeyPackage,\n type PublicKeyPackage,\n type SigningShare,\n} from \"@frosts/ed25519\";\n\nimport { type SigningPackage, SigningPackageImpl, type RandomSource } from \"@frosts/core\";\n\n// Re-export types for convenience\nexport type {\n Ed25519SigningNonces,\n Ed25519SigningCommitments,\n Ed25519SignatureShare,\n Ed25519Signature,\n KeyPackage,\n PublicKeyPackage,\n RandomSource,\n};\n\nexport { Ed25519Sha512, Identifier, keys };\n\n// Type aliases for frost-hubert\nexport type FrostIdentifier = Identifier<typeof Ed25519Sha512>;\nexport type FrostKeyPackage = KeyPackage<typeof Ed25519Sha512>;\nexport type FrostPublicKeyPackage = PublicKeyPackage<typeof Ed25519Sha512>;\nexport type FrostSigningPackage = SigningPackage<typeof Ed25519Sha512>;\nexport type FrostSigningShare = SigningShare<typeof Ed25519Sha512>;\n\n// DKG round types - use the namespaced types from keys.dkg\nexport type DkgRound1Package = keys.dkg.round1.Package;\nexport type DkgRound1SecretPackage = keys.dkg.round1.SecretPackage;\nexport type DkgRound2Package = keys.dkg.round2.Package;\nexport type DkgRound2SecretPackage = keys.dkg.round2.SecretPackage;\n\n/**\n * Cryptographically secure random number generator using Web Crypto API.\n */\nexport class SecureRng implements RandomSource {\n fill(array: Uint8Array): void {\n globalThis.crypto.getRandomValues(array as Uint8Array<ArrayBuffer>);\n }\n}\n\n/**\n * Create a new secure random number generator.\n */\nexport function createRng(): RandomSource {\n return new SecureRng();\n}\n\n/**\n * Create an identifier from a number (1-indexed participant ID).\n */\nexport function identifierFromU16(id: number): FrostIdentifier {\n return Identifier.fromU16(Ed25519Sha512, id);\n}\n\n/**\n * Serialize an identifier to bytes.\n */\nexport function serializeIdentifier(id: FrostIdentifier): Uint8Array {\n return id.serialize();\n}\n\n/**\n * Deserialize an identifier from bytes.\n */\nexport function deserializeIdentifier(bytes: Uint8Array): FrostIdentifier {\n return Identifier.deserialize(Ed25519Sha512, bytes);\n}\n\n/**\n * Convert an identifier to a hex string for use as a map key.\n */\nexport function identifierToHex(id: FrostIdentifier): string {\n return bytesToHex(id.serialize());\n}\n\n// =============================================================================\n// DKG Operations\n// =============================================================================\n\n/**\n * Execute DKG round 1 (part1) - Generate commitment and proof of knowledge.\n *\n * @param identifier - This participant's identifier\n * @param maxSigners - Total number of participants\n * @param minSigners - Threshold (minimum signers required)\n * @param rng - Random number generator\n * @returns Tuple of [SecretPackage, Package] where Package is broadcast to all\n */\nexport function dkgPart1(\n identifier: FrostIdentifier,\n maxSigners: number,\n minSigners: number,\n rng: RandomSource = createRng(),\n): [DkgRound1SecretPackage, DkgRound1Package] {\n return keys.dkg.part1(Ed25519Sha512, identifier, maxSigners, minSigners, rng);\n}\n\n/**\n * Execute DKG round 2 (part2) - Process round 1 packages and generate shares.\n *\n * @param secretPackage - The secret package from part1\n * @param round1Packages - Map of identifier hex to round1 packages from other participants\n * @returns Tuple of [Round2SecretPackage, Map of round2 packages to send]\n */\nexport function dkgPart2(\n secretPackage: DkgRound1SecretPackage,\n round1Packages: Map<string, DkgRound1Package>,\n): [DkgRound2SecretPackage, Map<string, DkgRound2Package>] {\n return keys.dkg.part2(Ed25519Sha512, secretPackage, round1Packages);\n}\n\n/**\n * Execute DKG round 3 (part3/finalize) - Compute final key package.\n *\n * @param round2SecretPackage - The secret package from part2\n * @param round1Packages - Map of identifier hex to round1 packages\n * @param round2Packages - Map of identifier hex to round2 packages received\n * @returns Promise of tuple [KeyPackage, PublicKeyPackage]\n */\nexport async function dkgPart3(\n round2SecretPackage: DkgRound2SecretPackage,\n round1Packages: Map<string, DkgRound1Package>,\n round2Packages: Map<string, DkgRound2Package>,\n): Promise<[FrostKeyPackage, FrostPublicKeyPackage]> {\n return keys.dkg.part3(Ed25519Sha512, round2SecretPackage, round1Packages, round2Packages);\n}\n\n// =============================================================================\n// Signing Operations\n// =============================================================================\n\n/**\n * Execute signing round 1 - Generate nonces and commitments.\n *\n * @param keyPackage - The participant's key package from DKG\n * @param rng - Random number generator\n * @returns Tuple of [SigningNonces, SigningCommitments]\n */\nexport function signingRound1(\n keyPackage: FrostKeyPackage,\n rng: RandomSource = createRng(),\n): [Ed25519SigningNonces, Ed25519SigningCommitments] {\n return commitRound1(keyPackage.signingShare, rng);\n}\n\n/**\n * Create a signing package from commitments and message.\n *\n * @param commitments - Map of identifier to signing commitments\n * @param message - The message to sign\n * @returns SigningPackage for round 2\n */\nexport function createSigningPackage(\n commitments: Map<FrostIdentifier, Ed25519SigningCommitments>,\n message: Uint8Array,\n): FrostSigningPackage {\n return new SigningPackageImpl(Ed25519Sha512, commitments, message);\n}\n\n/**\n * Execute signing round 2 - Generate signature share.\n *\n * @param signingPackage - The signing package with all commitments\n * @param nonces - This participant's nonces from round 1\n * @param keyPackage - This participant's key package\n * @returns Signature share\n */\nexport function signingRound2(\n signingPackage: FrostSigningPackage,\n nonces: Ed25519SigningNonces,\n keyPackage: FrostKeyPackage,\n): Ed25519SignatureShare {\n return signRound2(signingPackage, nonces, keyPackage);\n}\n\n/**\n * Aggregate signature shares into a final signature.\n *\n * @param signingPackage - The signing package used for round 2\n * @param signatureShares - Map of identifier to signature shares\n * @param publicKeyPackage - The group's public key package\n * @returns The aggregated signature\n */\nexport function aggregateSignatures(\n signingPackage: FrostSigningPackage,\n signatureShares: Map<FrostIdentifier, Ed25519SignatureShare>,\n publicKeyPackage: FrostPublicKeyPackage,\n): Ed25519Signature {\n return aggregate(signingPackage, signatureShares, publicKeyPackage);\n}\n\n// =============================================================================\n// Serialization Helpers - Using @frosts/ed25519 serde module\n// =============================================================================\n\n/**\n * Serialize a DKG round 1 package to JSON-compatible format.\n */\nexport function serializeDkgRound1Package(pkg: DkgRound1Package): SerializedDkgRound1Package {\n const json = serde.round1PackageToJson(pkg);\n return {\n commitment: {\n coefficients: json.commitment,\n },\n proofOfKnowledge: json.proof_of_knowledge,\n };\n}\n\n/**\n * Deserialize a DKG round 1 package from JSON format.\n */\nexport function deserializeDkgRound1Package(data: SerializedDkgRound1Package): DkgRound1Package {\n const json = {\n header: serde.DEFAULT_HEADER,\n commitment: data.commitment.coefficients,\n proof_of_knowledge: data.proofOfKnowledge,\n };\n return serde.round1PackageFromJson(json);\n}\n\n/**\n * Serialize a DKG round 2 package to JSON-compatible format.\n */\nexport function serializeDkgRound2Package(pkg: DkgRound2Package): SerializedDkgRound2Package {\n const json = serde.round2PackageToJson(pkg);\n return {\n signingShare: json.signing_share,\n };\n}\n\n/**\n * Deserialize a DKG round 2 package from JSON format.\n */\nexport function deserializeDkgRound2Package(data: SerializedDkgRound2Package): DkgRound2Package {\n const json = {\n header: serde.DEFAULT_HEADER,\n signing_share: data.signingShare,\n };\n return serde.round2PackageFromJson(json);\n}\n\n/**\n * Serialize a key package to JSON-compatible format.\n */\nexport function serializeKeyPackage(keyPackage: FrostKeyPackage): SerializedKeyPackage {\n const json = serde.keyPackageToJson(keyPackage);\n return {\n identifier: json.identifier,\n signingShare: json.signing_share,\n verifyingShare: json.verifying_share,\n verifyingKey: json.verifying_key,\n minSigners: json.min_signers,\n };\n}\n\n/**\n * Deserialize a key package from JSON format.\n */\nexport function deserializeKeyPackage(data: SerializedKeyPackage): FrostKeyPackage {\n const json = {\n header: serde.DEFAULT_HEADER,\n identifier: data.identifier,\n signing_share: data.signingShare,\n verifying_share: data.verifyingShare,\n verifying_key: data.verifyingKey,\n min_signers: data.minSigners,\n };\n return serde.keyPackageFromJson(json);\n}\n\n/**\n * Serialize a public key package to JSON-compatible format.\n */\nexport function serializePublicKeyPackage(pkg: FrostPublicKeyPackage): SerializedPublicKeyPackage {\n const json = serde.publicKeyPackageToJson(pkg);\n return {\n verifyingKey: json.verifying_key,\n verifyingShares: json.verifying_shares,\n // minSigners may be undefined in older packages\n ...(json.min_signers !== undefined ? { minSigners: json.min_signers } : {}),\n };\n}\n\n/**\n * Deserialize a public key package from JSON format.\n */\nexport function deserializePublicKeyPackage(\n data: SerializedPublicKeyPackage,\n): FrostPublicKeyPackage {\n const json = {\n header: serde.DEFAULT_HEADER,\n verifying_key: data.verifyingKey,\n verifying_shares: data.verifyingShares,\n min_signers: data.minSigners,\n };\n return serde.publicKeyPackageFromJson(json);\n}\n\n/**\n * Serialize signing nonces to JSON-compatible format.\n */\nexport function serializeSigningNonces(nonces: Ed25519SigningNonces): SerializedSigningNonces {\n // Access the internal properties of the nonces\n return {\n hiding: bytesToHex(nonces.hiding.serialize()),\n binding: bytesToHex(nonces.binding.serialize()),\n commitments: {\n hiding: bytesToHex(nonces.commitments.hiding.serialize()),\n binding: bytesToHex(nonces.commitments.binding.serialize()),\n },\n };\n}\n\n/**\n * Serialize signing commitments to JSON-compatible format.\n */\nexport function serializeSigningCommitments(\n commitments: Ed25519SigningCommitments,\n): SerializedSigningCommitments {\n const json = serde.signingCommitmentsToJson(commitments);\n return {\n hiding: json.hiding,\n binding: json.binding,\n };\n}\n\n/**\n * Deserialize signing commitments from JSON format.\n */\nexport function deserializeSigningCommitments(\n data: SerializedSigningCommitments,\n): Ed25519SigningCommitments {\n const json = {\n header: serde.DEFAULT_HEADER,\n hiding: data.hiding,\n binding: data.binding,\n };\n return serde.signingCommitmentsFromJson(json);\n}\n\n/**\n * Serialize a signature share to hex string.\n */\nexport function serializeSignatureShare(share: Ed25519SignatureShare): string {\n const json = serde.signatureShareToJson(share);\n return json.share;\n}\n\n/**\n * Deserialize a signature share from hex string.\n */\nexport function deserializeSignatureShare(hex: string): Ed25519SignatureShare {\n const json = {\n header: serde.DEFAULT_HEADER,\n share: hex,\n };\n return serde.signatureShareFromJson(json);\n}\n\n/**\n * Serialize a signature to bytes.\n */\nexport function serializeSignature(sig: Ed25519Signature): Uint8Array {\n return sig.serialize(Ed25519Sha512);\n}\n\n/**\n * Serialize a signature to hex string.\n */\nexport function serializeSignatureHex(sig: Ed25519Signature): string {\n return bytesToHex(sig.serialize(Ed25519Sha512));\n}\n\n// =============================================================================\n// Serialized Type Definitions\n// =============================================================================\n\nexport interface SerializedDkgRound1Package {\n commitment: {\n coefficients: string[]; // hex-encoded coefficient commitments\n };\n proofOfKnowledge: string; // hex-encoded proof of knowledge\n}\n\nexport interface SerializedDkgRound2Package {\n signingShare: string; // hex-encoded signing share\n}\n\nexport interface SerializedKeyPackage {\n identifier: string;\n signingShare: string;\n verifyingShare: string;\n verifyingKey: string;\n minSigners: number;\n}\n\nexport interface SerializedPublicKeyPackage {\n verifyingKey: string;\n verifyingShares: Record<string, string>; // identifier hex -> verifying share hex\n minSigners?: number;\n}\n\nexport interface SerializedSigningNonces {\n hiding: string;\n binding: string;\n commitments: {\n hiding: string;\n binding: string;\n };\n}\n\nexport interface SerializedSigningCommitments {\n hiding: string;\n binding: string;\n}\n\n// =============================================================================\n// Utility Functions - Re-export from serde\n// =============================================================================\n\n/**\n * Convert bytes to hex string.\n */\nexport function bytesToHex(bytes: Uint8Array): string {\n return serde.bytesToHex(bytes);\n}\n\n/**\n * Convert hex string to bytes.\n */\nexport function hexToBytes(hex: string): Uint8Array {\n return serde.hexToBytes(hex);\n}\n"],"mappings":"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"}
|