@bcts/frost-hubert 1.0.0-alpha.22 → 1.0.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (174) hide show
  1. package/dist/bin/frost.cjs +347 -75
  2. package/dist/bin/frost.cjs.map +1 -1
  3. package/dist/bin/frost.mjs +347 -75
  4. package/dist/bin/frost.mjs.map +1 -1
  5. package/dist/busy-DkM2jAIZ.mjs +27 -0
  6. package/dist/busy-DkM2jAIZ.mjs.map +1 -0
  7. package/dist/busy-EZU7EKr6.cjs +38 -0
  8. package/dist/busy-EZU7EKr6.cjs.map +1 -0
  9. package/dist/{chunk-uaV2rQ02.cjs → chunk-CZWwpsFl.cjs} +22 -32
  10. package/dist/{chunk-ClPoSABd.mjs → chunk-CjcI7cDX.mjs} +6 -12
  11. package/dist/cmd/index.cjs +46 -43
  12. package/dist/cmd/index.d.cts +2 -4
  13. package/dist/cmd/index.d.mts +2 -4
  14. package/dist/cmd/index.mjs +7 -6
  15. package/dist/cmd-Bw9_i2_f.cjs +130 -0
  16. package/dist/cmd-Bw9_i2_f.cjs.map +1 -0
  17. package/dist/cmd-CS1uJtuD.mjs +113 -0
  18. package/dist/cmd-CS1uJtuD.mjs.map +1 -0
  19. package/dist/common-CvH6dFvQ.mjs +282 -0
  20. package/dist/common-CvH6dFvQ.mjs.map +1 -0
  21. package/dist/common-DUWvtc08.mjs +96 -0
  22. package/dist/common-DUWvtc08.mjs.map +1 -0
  23. package/dist/common-lKP5EzHy.cjs +372 -0
  24. package/dist/common-lKP5EzHy.cjs.map +1 -0
  25. package/dist/common-lThIvJmZ.cjs +114 -0
  26. package/dist/common-lThIvJmZ.cjs.map +1 -0
  27. package/dist/dkg/index.cjs +245 -7
  28. package/dist/dkg/index.cjs.map +1 -0
  29. package/dist/dkg/index.d.cts +2 -2
  30. package/dist/dkg/index.d.mts +2 -2
  31. package/dist/dkg/index.mjs +238 -2
  32. package/dist/dkg/index.mjs.map +1 -0
  33. package/dist/finalize-BRgJK-Xv.cjs +402 -0
  34. package/dist/finalize-BRgJK-Xv.cjs.map +1 -0
  35. package/dist/finalize-BfLgzn8f.cjs +303 -0
  36. package/dist/finalize-BfLgzn8f.cjs.map +1 -0
  37. package/dist/finalize-CNTDj6aS.mjs +389 -0
  38. package/dist/finalize-CNTDj6aS.mjs.map +1 -0
  39. package/dist/finalize-EC3ikHQq.mjs +252 -0
  40. package/dist/finalize-EC3ikHQq.mjs.map +1 -0
  41. package/dist/finalize-IA01t_Qq.mjs +290 -0
  42. package/dist/finalize-IA01t_Qq.mjs.map +1 -0
  43. package/dist/finalize-UPyI1yb1.cjs +265 -0
  44. package/dist/finalize-UPyI1yb1.cjs.map +1 -0
  45. package/dist/frost/index.cjs +8 -9
  46. package/dist/frost/index.cjs.map +1 -1
  47. package/dist/frost/index.mjs +2 -3
  48. package/dist/frost/index.mjs.map +1 -1
  49. package/dist/{group-invite-Dz1Jmiky.d.cts → index-B3c-80VS.d.cts} +25 -2
  50. package/dist/index-B3c-80VS.d.cts.map +1 -0
  51. package/dist/{index-CcvTi5EA.d.cts → index-BgbSGpxn.d.mts} +102 -80
  52. package/dist/index-BgbSGpxn.d.mts.map +1 -0
  53. package/dist/{registry-impl-CE76sTXQ.d.cts → index-C8QeHNwa.d.cts} +46 -2
  54. package/dist/index-C8QeHNwa.d.cts.map +1 -0
  55. package/dist/{group-invite-Wk9CIbHL.d.mts → index-D3QTWkEm.d.mts} +25 -2
  56. package/dist/index-D3QTWkEm.d.mts.map +1 -0
  57. package/dist/{registry-impl-BETn_lEO.d.mts → index-DVbWyOs7.d.mts} +46 -2
  58. package/dist/index-DVbWyOs7.d.mts.map +1 -0
  59. package/dist/{index-DNCPeLNM.d.mts → index-F1iNEAJR.d.cts} +102 -80
  60. package/dist/index-F1iNEAJR.d.cts.map +1 -0
  61. package/dist/index.cjs +72 -68
  62. package/dist/index.cjs.map +1 -1
  63. package/dist/index.d.cts +4 -7
  64. package/dist/index.d.cts.map +1 -1
  65. package/dist/index.d.mts +4 -7
  66. package/dist/index.d.mts.map +1 -1
  67. package/dist/index.mjs +11 -10
  68. package/dist/index.mjs.map +1 -1
  69. package/dist/invite-5277FQVT.cjs +274 -0
  70. package/dist/invite-5277FQVT.cjs.map +1 -0
  71. package/dist/invite-DUTcfTgX.cjs +109 -0
  72. package/dist/invite-DUTcfTgX.cjs.map +1 -0
  73. package/dist/invite-IU4n0dq2.mjs +96 -0
  74. package/dist/invite-IU4n0dq2.mjs.map +1 -0
  75. package/dist/invite-RU-OXTNS.mjs +219 -0
  76. package/dist/invite-RU-OXTNS.mjs.map +1 -0
  77. package/dist/parallel-D1R6ZGlY.cjs +318 -0
  78. package/dist/parallel-D1R6ZGlY.cjs.map +1 -0
  79. package/dist/parallel-D6zc6VW4.mjs +235 -0
  80. package/dist/parallel-D6zc6VW4.mjs.map +1 -0
  81. package/dist/proposed-participant-Dm1Eq6mX.cjs +141 -0
  82. package/dist/proposed-participant-Dm1Eq6mX.cjs.map +1 -0
  83. package/dist/proposed-participant-cWM7iUrO.mjs +129 -0
  84. package/dist/proposed-participant-cWM7iUrO.mjs.map +1 -0
  85. package/dist/receive-CAI-x4II.cjs +213 -0
  86. package/dist/receive-CAI-x4II.cjs.map +1 -0
  87. package/dist/receive-D2Nn68L7.mjs +188 -0
  88. package/dist/receive-D2Nn68L7.mjs.map +1 -0
  89. package/dist/receive-DA_KQEgk.mjs +177 -0
  90. package/dist/receive-DA_KQEgk.mjs.map +1 -0
  91. package/dist/receive-kZMsXhbK.cjs +190 -0
  92. package/dist/receive-kZMsXhbK.cjs.map +1 -0
  93. package/dist/registry/index.cjs +881 -13
  94. package/dist/registry/index.cjs.map +1 -0
  95. package/dist/registry/index.d.cts +1 -1
  96. package/dist/registry/index.d.mts +1 -1
  97. package/dist/registry/index.mjs +867 -2
  98. package/dist/registry/index.mjs.map +1 -0
  99. package/dist/{registry-FMU-ec5K.cjs → registry-9puTaRrD.cjs} +28 -31
  100. package/dist/registry-9puTaRrD.cjs.map +1 -0
  101. package/dist/{registry-BDnNV1Rk.mjs → registry-BpCwtrRt.mjs} +7 -10
  102. package/dist/{registry-BDnNV1Rk.mjs.map → registry-BpCwtrRt.mjs.map} +1 -1
  103. package/dist/round1-4Hyx8w0x.cjs +422 -0
  104. package/dist/round1-4Hyx8w0x.cjs.map +1 -0
  105. package/dist/round1-7v9LlE11.mjs +373 -0
  106. package/dist/round1-7v9LlE11.mjs.map +1 -0
  107. package/dist/round1-BHBjru1m.cjs +465 -0
  108. package/dist/round1-BHBjru1m.cjs.map +1 -0
  109. package/dist/round1-CMLKN2RR.mjs +195 -0
  110. package/dist/round1-CMLKN2RR.mjs.map +1 -0
  111. package/dist/round1-CWSXZx5R.cjs +208 -0
  112. package/dist/round1-CWSXZx5R.cjs.map +1 -0
  113. package/dist/round1-CcQCGlIT.mjs +208 -0
  114. package/dist/round1-CcQCGlIT.mjs.map +1 -0
  115. package/dist/round1-Cgm7j1kI.mjs +452 -0
  116. package/dist/round1-Cgm7j1kI.mjs.map +1 -0
  117. package/dist/round1-DQ0fnc1H.cjs +221 -0
  118. package/dist/round1-DQ0fnc1H.cjs.map +1 -0
  119. package/dist/round2-BWz9SQIi.cjs +305 -0
  120. package/dist/round2-BWz9SQIi.cjs.map +1 -0
  121. package/dist/round2-BkNRCXgS.mjs +292 -0
  122. package/dist/round2-BkNRCXgS.mjs.map +1 -0
  123. package/dist/round2-Bl2uK93U.mjs +450 -0
  124. package/dist/round2-Bl2uK93U.mjs.map +1 -0
  125. package/dist/round2-CdUT-AhH.cjs +499 -0
  126. package/dist/round2-CdUT-AhH.cjs.map +1 -0
  127. package/dist/round2-DOA3rnV-.mjs +280 -0
  128. package/dist/round2-DOA3rnV-.mjs.map +1 -0
  129. package/dist/round2-Dg24w-TU.mjs +397 -0
  130. package/dist/round2-Dg24w-TU.mjs.map +1 -0
  131. package/dist/round2-LylCa84n.cjs +293 -0
  132. package/dist/round2-LylCa84n.cjs.map +1 -0
  133. package/dist/round2-o2Q-GMbX.cjs +410 -0
  134. package/dist/round2-o2Q-GMbX.cjs.map +1 -0
  135. package/dist/storage-B-Gu68-O.cjs +79 -0
  136. package/dist/storage-B-Gu68-O.cjs.map +1 -0
  137. package/dist/storage-Bkkliz0K.mjs +74 -0
  138. package/dist/storage-Bkkliz0K.mjs.map +1 -0
  139. package/package.json +17 -17
  140. package/src/bin/frost.ts +849 -128
  141. package/src/cmd/common.ts +19 -1
  142. package/src/cmd/dkg/common.ts +97 -10
  143. package/src/cmd/dkg/coordinator/invite.ts +5 -2
  144. package/src/cmd/dkg/participant/finalize.ts +52 -18
  145. package/src/cmd/dkg/participant/round1.ts +39 -38
  146. package/src/cmd/dkg/participant/round2.ts +60 -26
  147. package/src/cmd/sign/coordinator/round2.ts +5 -1
  148. package/src/cmd/sign/participant/finalize.ts +6 -2
  149. package/src/cmd/sign/participant/receive.ts +5 -2
  150. package/src/dkg/group-invite.ts +12 -2
  151. package/src/dkg/proposed-participant.ts +33 -5
  152. package/src/frost/index.ts +1 -1
  153. package/src/registry/owner-record.ts +13 -2
  154. package/src/registry/participant-record.ts +36 -4
  155. package/src/registry/registry-impl.ts +74 -18
  156. package/dist/group-invite-CrbOabFL.cjs +0 -368
  157. package/dist/group-invite-CrbOabFL.cjs.map +0 -1
  158. package/dist/group-invite-Dz1Jmiky.d.cts.map +0 -1
  159. package/dist/group-invite-RPElq-fm.mjs +0 -338
  160. package/dist/group-invite-RPElq-fm.mjs.map +0 -1
  161. package/dist/group-invite-Wk9CIbHL.d.mts.map +0 -1
  162. package/dist/index-CcvTi5EA.d.cts.map +0 -1
  163. package/dist/index-DNCPeLNM.d.mts.map +0 -1
  164. package/dist/registry-FMU-ec5K.cjs.map +0 -1
  165. package/dist/registry-impl-BETn_lEO.d.mts.map +0 -1
  166. package/dist/registry-impl-C7w4awTv.cjs +0 -865
  167. package/dist/registry-impl-C7w4awTv.cjs.map +0 -1
  168. package/dist/registry-impl-CE76sTXQ.d.cts.map +0 -1
  169. package/dist/registry-impl-eYXVSPwM.mjs +0 -797
  170. package/dist/registry-impl-eYXVSPwM.mjs.map +0 -1
  171. package/dist/sign-2bOp18Fs.cjs +0 -4875
  172. package/dist/sign-2bOp18Fs.cjs.map +0 -1
  173. package/dist/sign-D8C3HJ4B.mjs +0 -4736
  174. package/dist/sign-D8C3HJ4B.mjs.map +0 -1
@@ -0,0 +1,221 @@
1
+ const require_chunk = require("./chunk-CZWwpsFl.cjs");
2
+ const require_registry_index = require("./registry/index.cjs");
3
+ const require_common = require("./common-lKP5EzHy.cjs");
4
+ const require_busy = require("./busy-EZU7EKr6.cjs");
5
+ const require_storage = require("./storage-B-Gu68-O.cjs");
6
+ const require_frost_index = require("./frost/index.cjs");
7
+ const require_common$1 = require("./common-lThIvJmZ.cjs");
8
+ let _bcts_components = require("@bcts/components");
9
+ let _bcts_dcbor = require("@bcts/dcbor");
10
+ let _bcts_envelope = require("@bcts/envelope");
11
+ let _bcts_gstp = require("@bcts/gstp");
12
+ let node_fs = require("node:fs");
13
+ node_fs = require_chunk.__toESM(node_fs, 1);
14
+ let node_path = require("node:path");
15
+ node_path = require_chunk.__toESM(node_path, 1);
16
+ //#region src/cmd/sign/participant/round1.ts
17
+ /**
18
+ * Copyright © 2023-2026 Blockchain Commons, LLC
19
+ * Copyright © 2025-2026 Parity Technologies
20
+ *
21
+ *
22
+ * Sign participant round 1 command.
23
+ *
24
+ * Port of cmd/sign/participant/round1.rs from frost-hubert-rust.
25
+ *
26
+ * @module
27
+ */
28
+ var round1_exports = /* @__PURE__ */ require_chunk.__exportAll({ round1: () => round1 });
29
+ /**
30
+ * Load receive state from persisted sign_receive.json.
31
+ *
32
+ * Port of `load_receive_state()` from cmd/sign/participant/round1.rs lines 285-411.
33
+ */
34
+ function loadReceiveState(registryPath, sessionId, groupHint, registry) {
35
+ const base = node_path.dirname(registryPath);
36
+ const groupStateDir = node_path.join(base, "group-state");
37
+ let groupDirs;
38
+ if (groupHint !== void 0) groupDirs = [[groupHint, node_path.join(groupStateDir, groupHint.hex())]];
39
+ else {
40
+ groupDirs = [];
41
+ if (node_fs.existsSync(groupStateDir)) {
42
+ for (const entry of node_fs.readdirSync(groupStateDir, { withFileTypes: true })) if (entry.isDirectory()) {
43
+ const dirName = entry.name;
44
+ if (dirName.length === 64 && /^[0-9a-fA-F]+$/.test(dirName)) {
45
+ const groupId = _bcts_components.ARID.fromHex(dirName);
46
+ groupDirs.push([groupId, node_path.join(groupStateDir, dirName)]);
47
+ }
48
+ }
49
+ }
50
+ }
51
+ const candidates = [];
52
+ for (const [groupId, groupDir] of groupDirs) {
53
+ const candidate = node_path.join(groupDir, "signing", sessionId.hex(), "sign_receive.json");
54
+ if (node_fs.existsSync(candidate)) candidates.push([groupId, candidate]);
55
+ }
56
+ if (candidates.length === 0) throw new Error("No sign_receive.json found for this session; run `frost sign participant receive` first");
57
+ if (candidates.length > 1) throw new Error("Multiple groups contain this session; use --group to disambiguate");
58
+ const [groupId, filePath] = candidates[0];
59
+ const raw = JSON.parse(node_fs.readFileSync(filePath, "utf-8"));
60
+ const sessionInState = require_common.parseAridUr(raw.session);
61
+ if (sessionInState.urString() !== sessionId.urString()) throw new Error(`Session ${sessionInState.urString()} in sign_receive.json does not match requested session ${sessionId.urString()}`);
62
+ const responseArid = require_common.parseAridUr(raw.response_arid);
63
+ const targetUr = raw.target;
64
+ const coordinatorUr = raw.coordinator;
65
+ const coordinatorXid = _bcts_components.XID.fromURString(coordinatorUr);
66
+ let coordinatorDoc;
67
+ const participantRecord = registry.participant(coordinatorXid);
68
+ if (participantRecord !== null && participantRecord !== void 0) coordinatorDoc = participantRecord.xidDocument();
69
+ else {
70
+ const owner = registry.owner();
71
+ if (owner?.xid().urString() === coordinatorXid.urString()) coordinatorDoc = owner.xidDocument();
72
+ else throw new Error(`Coordinator ${coordinatorXid.urString()} not found in registry and cannot resolve encryption key`);
73
+ }
74
+ const requestEnvelope = _bcts_envelope.Envelope.fromURString(raw.request_envelope);
75
+ const participants = raw.participants.map((s) => _bcts_components.XID.fromURString(s));
76
+ return {
77
+ groupId,
78
+ coordinatorDoc,
79
+ responseArid,
80
+ targetUr,
81
+ participants,
82
+ requestEnvelope
83
+ };
84
+ }
85
+ /**
86
+ * Validate the commit request from persisted state.
87
+ *
88
+ * Port of request validation in `CommandArgs::exec()` from cmd/sign/participant/round1.rs lines 100-138.
89
+ */
90
+ function validateCommitRequest(receiveState, sessionId, ownerXid, ownerPrivateKeys) {
91
+ const now = _bcts_dcbor.CborDate.now();
92
+ const sealedRequest = _bcts_gstp.SealedRequest.tryFromEnvelope(receiveState.requestEnvelope, void 0, now.datetime(), ownerPrivateKeys);
93
+ if (!sealedRequest.request().function().equals(_bcts_envelope.Function.fromString("signInvite"))) throw new Error(`Unexpected request function: ${String(sealedRequest.request().function())}`);
94
+ if (sealedRequest.request().id().urString() !== sessionId.urString()) throw new Error(`Session ID mismatch (state ${sessionId.urString()}, request ${sealedRequest.request().id().urString()})`);
95
+ const requestGroup = sealedRequest.extractObjectForParameter("group");
96
+ if (requestGroup.urString() !== receiveState.groupId.urString()) throw new Error(`Group ID mismatch (state ${receiveState.groupId.urString()}, request ${requestGroup.urString()})`);
97
+ if (!receiveState.participants.map((p) => p.urString()).includes(ownerXid.urString())) throw new Error("Persisted signInvite request does not include this participant");
98
+ return sealedRequest;
99
+ }
100
+ /**
101
+ * Build the response body envelope.
102
+ *
103
+ * Port of response body building from cmd/sign/participant/round1.rs lines 191-195.
104
+ */
105
+ function buildResponseBody(sessionId, commitments, responseArid) {
106
+ const serializedCommitments = require_frost_index.serializeSigningCommitments(commitments);
107
+ const jsonStr = JSON.stringify(serializedCommitments);
108
+ const jsonBytes = new TextEncoder().encode(jsonStr);
109
+ const commitmentsJson = _bcts_components.JSON.fromData(jsonBytes);
110
+ return _bcts_envelope.Envelope.unit().addType("signRound1Response").addAssertion("session", sessionId).addAssertion("commitments", commitmentsJson.taggedCborData()).addAssertion("response_arid", responseArid);
111
+ }
112
+ /**
113
+ * Persist commit state (nonces and commitments) to disk.
114
+ *
115
+ * Port of `persist_commit_state()` from cmd/sign/participant/round1.rs lines 413-461.
116
+ */
117
+ function persistCommitState(registryPath, groupId, sessionId, receiveState, signingNonces, signingCommitments, targetEnvelope, nextShareArid) {
118
+ const dir = require_common$1.signingStateDir(registryPath, groupId.hex(), sessionId.hex());
119
+ node_fs.mkdirSync(dir, { recursive: true });
120
+ const serializedNonces = require_frost_index.serializeSigningNonces(signingNonces);
121
+ const serializedCommitments = require_frost_index.serializeSigningCommitments(signingCommitments);
122
+ const commitState = {
123
+ session: sessionId.urString(),
124
+ response_arid: receiveState.responseArid.urString(),
125
+ next_share_arid: nextShareArid.urString(),
126
+ target: targetEnvelope.urString(),
127
+ signing_nonces: serializedNonces,
128
+ signing_commitments: serializedCommitments
129
+ };
130
+ node_fs.writeFileSync(node_path.join(dir, "commit.json"), JSON.stringify(commitState, null, 2));
131
+ }
132
+ /**
133
+ * Execute the sign participant round 1 command.
134
+ *
135
+ * Responds to the sign invite with signing commitments.
136
+ *
137
+ * Port of `CommandArgs::exec()` from cmd/sign/participant/round1.rs lines 58-273.
138
+ */
139
+ async function round1(_client, options, cwd) {
140
+ if (options.storageSelection === void 0 && options.preview !== true) throw new Error("Hubert storage is required for sign commit");
141
+ if (options.storageSelection !== void 0 && options.preview === true) throw new Error("--preview cannot be used with Hubert storage options");
142
+ const registryPath = require_registry_index.resolveRegistryPath(options.registryPath, cwd);
143
+ const registry = require_registry_index.Registry.load(registryPath);
144
+ const owner = registry.owner();
145
+ if (!owner) throw new Error("Registry owner is required");
146
+ const sessionId = require_common.parseAridUr(options.sessionId);
147
+ const receiveState = loadReceiveState(registryPath, sessionId, options.groupId !== void 0 ? require_common.parseAridUr(options.groupId) : void 0, registry);
148
+ const groupId = receiveState.groupId;
149
+ const groupRecord = registry.group(groupId);
150
+ if (groupRecord === null || groupRecord === void 0) throw new Error("Group not found in registry");
151
+ const ownerKeys = owner.xidDocument().inceptionPrivateKeys();
152
+ if (ownerKeys === void 0) throw new Error("Owner XID document has no private keys");
153
+ const sealedRequest = validateCommitRequest(receiveState, sessionId, owner.xid(), ownerKeys);
154
+ const contributions = groupRecord.contributions();
155
+ if (contributions === null || contributions === void 0) throw new Error("Key package path not found; did you finish DKG?");
156
+ const keyPackagePath = contributions.keyPackage;
157
+ if (keyPackagePath === void 0) throw new Error("Key package path not found; did you finish DKG?");
158
+ const keyPackage = require_frost_index.deserializeKeyPackage(JSON.parse(node_fs.readFileSync(keyPackagePath, "utf-8")).key_package);
159
+ const targetEnvelope = _bcts_envelope.Envelope.fromURString(receiveState.targetUr);
160
+ const signerPrivateKeys = owner.xidDocument().inceptionPrivateKeys();
161
+ if (signerPrivateKeys === void 0) throw new Error("Owner XID document has no signing keys");
162
+ let sealedResponse;
163
+ let nextShareArid;
164
+ if (options.rejectReason !== void 0) {
165
+ const errorBody = _bcts_envelope.Envelope.new("signCommitReject").addAssertion("group", groupId).addAssertion("session", sessionId).addAssertion("reason", options.rejectReason);
166
+ sealedResponse = _bcts_gstp.SealedResponse.newFailure(sealedRequest.request().id(), owner.xidDocument()).withError(errorBody).withPeerContinuation(sealedRequest.peerContinuation());
167
+ } else {
168
+ const [signingNonces, signingCommitments] = require_frost_index.signingRound1(keyPackage, require_frost_index.createRng());
169
+ const nextShare = _bcts_components.ARID.new();
170
+ nextShareArid = nextShare;
171
+ const responseBody = buildResponseBody(sessionId, signingCommitments, nextShare);
172
+ if (options.preview !== true) {
173
+ persistCommitState(registryPath, groupId, sessionId, receiveState, signingNonces, signingCommitments, targetEnvelope, nextShare);
174
+ const groupRecordMut = registry.group(groupId);
175
+ if (groupRecordMut !== null && groupRecordMut !== void 0) {
176
+ groupRecordMut.setListeningAtArid(nextShare);
177
+ registry.save(registryPath);
178
+ }
179
+ }
180
+ sealedResponse = _bcts_gstp.SealedResponse.newSuccess(sealedRequest.request().id(), owner.xidDocument()).withResult(responseBody).withPeerContinuation(sealedRequest.peerContinuation());
181
+ }
182
+ if (options.preview === true) {
183
+ const envelopeUr = sealedResponse.toEnvelope(void 0, signerPrivateKeys, void 0).urString();
184
+ console.log(envelopeUr);
185
+ return {
186
+ accepted: options.rejectReason === void 0,
187
+ envelopeUr
188
+ };
189
+ }
190
+ const validUntil = new Date(Date.now() + 3600 * 1e3);
191
+ const responseEnvelope = sealedResponse.toEnvelope(validUntil, signerPrivateKeys, receiveState.coordinatorDoc);
192
+ if (options.storageSelection === void 0) throw new Error("Storage selection is required to post response");
193
+ const client = await require_storage.createStorageClient(options.storageSelection);
194
+ if (options.verbose === true) console.error(`Posting signInvite response to ${receiveState.responseArid.urString()}`);
195
+ await require_busy.putWithIndicator(client, receiveState.responseArid, responseEnvelope, "Commitments", options.verbose ?? false);
196
+ if (options.rejectReason !== void 0) {
197
+ const groupRecordMut = registry.group(groupId);
198
+ if (groupRecordMut !== null && groupRecordMut !== void 0) {
199
+ groupRecordMut.clearListeningAtArid();
200
+ registry.save(registryPath);
201
+ }
202
+ }
203
+ const result = { accepted: options.rejectReason === void 0 };
204
+ if (nextShareArid !== void 0) result.listeningArid = nextShareArid.urString();
205
+ return result;
206
+ }
207
+ //#endregion
208
+ Object.defineProperty(exports, "round1", {
209
+ enumerable: true,
210
+ get: function() {
211
+ return round1;
212
+ }
213
+ });
214
+ Object.defineProperty(exports, "round1_exports", {
215
+ enumerable: true,
216
+ get: function() {
217
+ return round1_exports;
218
+ }
219
+ });
220
+
221
+ //# sourceMappingURL=round1-DQ0fnc1H.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"round1-DQ0fnc1H.cjs","names":["path","fs","ARID","parseAridUr","XID","Envelope","CborDate","SealedRequest","EnvelopeFunction","serializeSigningCommitments","JSONWrapper","signingStateDir","serializeSigningNonces","resolveRegistryPath","Registry","deserializeKeyPackage","SealedResponse","signingRound1","createRng","createStorageClient","putWithIndicator"],"sources":["../src/cmd/sign/participant/round1.ts"],"sourcesContent":["/**\n * Copyright © 2023-2026 Blockchain Commons, LLC\n * Copyright © 2025-2026 Parity Technologies\n *\n *\n * Sign participant round 1 command.\n *\n * Port of cmd/sign/participant/round1.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, type PrivateKeys, XID } from \"@bcts/components\";\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 { Registry, resolveRegistryPath } from \"../../../registry/index.js\";\nimport { putWithIndicator } from \"../../busy.js\";\nimport { createStorageClient, type StorageClient, type StorageSelection } from \"../../storage.js\";\nimport { parseAridUr } from \"../../dkg/common.js\";\nimport { signingStateDir } from \"../common.js\";\nimport {\n signingRound1,\n deserializeKeyPackage,\n serializeSigningNonces,\n serializeSigningCommitments,\n createRng,\n type SerializedKeyPackage,\n type SerializedSigningNonces,\n type SerializedSigningCommitments,\n type Ed25519SigningNonces,\n type Ed25519SigningCommitments,\n} from \"../../../frost/index.js\";\n\n/**\n * Options for the sign round1 command.\n */\nexport interface SignRound1Options {\n registryPath?: string;\n sessionId: string;\n groupId?: string;\n preview?: boolean;\n rejectReason?: string;\n storageSelection?: StorageSelection;\n verbose?: boolean;\n}\n\n/**\n * Result of the sign round1 command.\n */\nexport interface SignRound1Result {\n accepted: boolean;\n listeningArid?: string;\n envelopeUr?: string;\n}\n\n/**\n * Persisted receive state from sign_receive.json.\n *\n * Port of `struct ReceiveState` from cmd/sign/participant/round1.rs.\n */\ninterface ReceiveState {\n groupId: ARID;\n coordinatorDoc: XIDDocument;\n responseArid: ARID;\n targetUr: string;\n participants: XID[];\n requestEnvelope: Envelope;\n}\n\n/**\n * Load receive state from persisted sign_receive.json.\n *\n * Port of `load_receive_state()` from cmd/sign/participant/round1.rs lines 285-411.\n */\nfunction loadReceiveState(\n registryPath: string,\n sessionId: ARID,\n groupHint: ARID | undefined,\n registry: Registry,\n): ReceiveState {\n const base = path.dirname(registryPath);\n const groupStateDir = path.join(base, \"group-state\");\n\n // Collect candidate directories\n let groupDirs: [ARID, string][];\n if (groupHint !== undefined) {\n groupDirs = [[groupHint, path.join(groupStateDir, groupHint.hex())]];\n } else {\n groupDirs = [];\n if (fs.existsSync(groupStateDir)) {\n for (const entry of fs.readdirSync(groupStateDir, { withFileTypes: true })) {\n if (entry.isDirectory()) {\n const dirName = entry.name;\n // Check if it's a 64-character hex string (ARID hex)\n if (dirName.length === 64 && /^[0-9a-fA-F]+$/.test(dirName)) {\n const groupId = ARID.fromHex(dirName);\n groupDirs.push([groupId, path.join(groupStateDir, dirName)]);\n }\n }\n }\n }\n }\n\n // Search for sign_receive.json\n const candidates: [ARID, string][] = [];\n for (const [groupId, groupDir] of groupDirs) {\n const candidate = path.join(groupDir, \"signing\", sessionId.hex(), \"sign_receive.json\");\n if (fs.existsSync(candidate)) {\n candidates.push([groupId, candidate]);\n }\n }\n\n if (candidates.length === 0) {\n throw new Error(\n \"No sign_receive.json found for this session; run `frost sign participant receive` first\",\n );\n }\n if (candidates.length > 1) {\n throw new Error(\"Multiple groups contain this session; use --group to disambiguate\");\n }\n\n const [groupId, filePath] = candidates[0];\n\n // Parse the JSON file\n interface SignReceiveJson {\n session: string;\n group: string;\n response_arid: string;\n target: string;\n coordinator: string;\n participants: string[];\n request_envelope: string;\n }\n\n const raw = JSON.parse(fs.readFileSync(filePath, \"utf-8\")) as SignReceiveJson;\n\n // Validate session matches\n const sessionInState = parseAridUr(raw.session);\n if (sessionInState.urString() !== sessionId.urString()) {\n throw new Error(\n `Session ${sessionInState.urString()} in sign_receive.json does not match requested session ${sessionId.urString()}`,\n );\n }\n\n const responseArid = parseAridUr(raw.response_arid);\n const targetUr = raw.target;\n const coordinatorUr = raw.coordinator;\n const coordinatorXid = XID.fromURString(coordinatorUr);\n\n // Resolve coordinator document from registry\n let coordinatorDoc: XIDDocument;\n const participantRecord = registry.participant(coordinatorXid);\n if (participantRecord !== null && participantRecord !== undefined) {\n coordinatorDoc = participantRecord.xidDocument();\n } else {\n const owner = registry.owner();\n if (owner?.xid().urString() === coordinatorXid.urString()) {\n coordinatorDoc = owner.xidDocument();\n } else {\n throw new Error(\n `Coordinator ${coordinatorXid.urString()} not found in registry and cannot resolve encryption key`,\n );\n }\n }\n\n // Parse request envelope\n const requestEnvelope = Envelope.fromURString(raw.request_envelope);\n\n // Parse participants\n const participants: XID[] = raw.participants.map((s: string) => XID.fromURString(s));\n\n return {\n groupId,\n coordinatorDoc,\n responseArid,\n targetUr,\n participants,\n requestEnvelope,\n };\n}\n\n/**\n * Validate the commit request from persisted state.\n *\n * Port of request validation in `CommandArgs::exec()` from cmd/sign/participant/round1.rs lines 100-138.\n */\nfunction validateCommitRequest(\n receiveState: ReceiveState,\n sessionId: ARID,\n ownerXid: XID,\n ownerPrivateKeys: PrivateKeys,\n): SealedRequest {\n const now = CborDate.now();\n\n // Decrypt and parse the request\n const sealedRequest = SealedRequest.tryFromEnvelope(\n receiveState.requestEnvelope,\n undefined,\n now.datetime(),\n ownerPrivateKeys,\n );\n\n // Validate function\n if (!sealedRequest.request().function().equals(EnvelopeFunction.fromString(\"signInvite\"))) {\n throw new Error(`Unexpected request function: ${String(sealedRequest.request().function())}`);\n }\n\n // Validate session ID\n if (sealedRequest.request().id().urString() !== sessionId.urString()) {\n throw new Error(\n `Session ID mismatch (state ${sessionId.urString()}, request ${sealedRequest.request().id().urString()})`,\n );\n }\n\n // Validate group ID\n const requestGroup = sealedRequest.extractObjectForParameter<ARID>(\"group\");\n if (requestGroup.urString() !== receiveState.groupId.urString()) {\n throw new Error(\n `Group ID mismatch (state ${receiveState.groupId.urString()}, request ${requestGroup.urString()})`,\n );\n }\n\n // Validate participant is included\n const participantUrStrings = receiveState.participants.map((p) => p.urString());\n if (!participantUrStrings.includes(ownerXid.urString())) {\n throw new Error(\"Persisted signInvite request does not include this participant\");\n }\n\n return sealedRequest;\n}\n\n/**\n * Build the response body envelope.\n *\n * Port of response body building from cmd/sign/participant/round1.rs lines 191-195.\n */\nfunction buildResponseBody(\n sessionId: ARID,\n commitments: Ed25519SigningCommitments,\n responseArid: ARID,\n): Envelope {\n // Serialize commitments to JSON and wrap as CBOR JSON\n const serializedCommitments = serializeSigningCommitments(commitments);\n const jsonStr = JSON.stringify(serializedCommitments);\n const jsonBytes = new TextEncoder().encode(jsonStr);\n const commitmentsJson = JSONWrapper.fromData(jsonBytes);\n\n // Build response body: unit subject with type and assertions\n return Envelope.unit()\n .addType(\"signRound1Response\")\n .addAssertion(\"session\", sessionId)\n .addAssertion(\"commitments\", commitmentsJson.taggedCborData())\n .addAssertion(\"response_arid\", responseArid);\n}\n\n/**\n * Persist commit state (nonces and commitments) to disk.\n *\n * Port of `persist_commit_state()` from cmd/sign/participant/round1.rs lines 413-461.\n */\nfunction persistCommitState(\n registryPath: string,\n groupId: ARID,\n sessionId: ARID,\n receiveState: ReceiveState,\n signingNonces: Ed25519SigningNonces,\n signingCommitments: Ed25519SigningCommitments,\n targetEnvelope: Envelope,\n nextShareArid: ARID,\n): void {\n const dir = signingStateDir(registryPath, groupId.hex(), sessionId.hex());\n fs.mkdirSync(dir, { recursive: true });\n\n // Serialize nonces and commitments\n const serializedNonces = serializeSigningNonces(signingNonces);\n const serializedCommitments = serializeSigningCommitments(signingCommitments);\n\n // Build commit state JSON\n const commitState: {\n session: string;\n response_arid: string;\n next_share_arid: string;\n target: string;\n signing_nonces: SerializedSigningNonces;\n signing_commitments: SerializedSigningCommitments;\n } = {\n session: sessionId.urString(),\n response_arid: receiveState.responseArid.urString(),\n next_share_arid: nextShareArid.urString(),\n target: targetEnvelope.urString(),\n signing_nonces: serializedNonces,\n signing_commitments: serializedCommitments,\n };\n\n fs.writeFileSync(path.join(dir, \"commit.json\"), JSON.stringify(commitState, null, 2));\n}\n\n/**\n * Execute the sign participant round 1 command.\n *\n * Responds to the sign invite with signing commitments.\n *\n * Port of `CommandArgs::exec()` from cmd/sign/participant/round1.rs lines 58-273.\n */\nexport async function round1(\n _client: StorageClient | undefined,\n options: SignRound1Options,\n cwd: string,\n): Promise<SignRound1Result> {\n // Validate options\n if (options.storageSelection === undefined && options.preview !== true) {\n throw new Error(\"Hubert storage is required for sign commit\");\n }\n if (options.storageSelection !== undefined && options.preview === true) {\n throw new Error(\"--preview cannot be used with Hubert storage options\");\n }\n\n const registryPath = resolveRegistryPath(options.registryPath, cwd);\n const registry = Registry.load(registryPath);\n\n const owner = registry.owner();\n if (!owner) {\n throw new Error(\"Registry owner is required\");\n }\n\n const sessionId = parseAridUr(options.sessionId);\n const groupHint = options.groupId !== undefined ? parseAridUr(options.groupId) : undefined;\n\n // Load receive state\n const receiveState = loadReceiveState(registryPath, sessionId, groupHint, registry);\n const groupId = receiveState.groupId;\n\n // Get group record\n const groupRecord = registry.group(groupId);\n if (groupRecord === null || groupRecord === undefined) {\n throw new Error(\"Group not found in registry\");\n }\n\n // Get owner private keys\n const ownerKeys = owner.xidDocument().inceptionPrivateKeys();\n if (ownerKeys === undefined) {\n throw new Error(\"Owner XID document has no private keys\");\n }\n\n // Validate the commit request\n const sealedRequest = validateCommitRequest(receiveState, sessionId, owner.xid(), ownerKeys);\n\n // Load key package\n const contributions = groupRecord.contributions();\n if (contributions === null || contributions === undefined) {\n throw new Error(\"Key package path not found; did you finish DKG?\");\n }\n const keyPackagePath = contributions.keyPackage;\n if (keyPackagePath === undefined) {\n throw new Error(\"Key package path not found; did you finish DKG?\");\n }\n\n interface KeyPackageFile {\n group: string;\n key_package: SerializedKeyPackage;\n }\n\n const keyPackageFile = JSON.parse(fs.readFileSync(keyPackagePath, \"utf-8\")) as KeyPackageFile;\n const keyPackage = deserializeKeyPackage(keyPackageFile.key_package);\n\n // Parse target envelope\n const targetEnvelope = Envelope.fromURString(receiveState.targetUr);\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 let sealedResponse: SealedResponse;\n let nextShareArid: ARID | undefined;\n\n if (options.rejectReason !== undefined) {\n // Build rejection response\n const errorBody = Envelope.new(\"signCommitReject\")\n .addAssertion(\"group\", groupId)\n .addAssertion(\"session\", sessionId)\n .addAssertion(\"reason\", options.rejectReason);\n\n sealedResponse = SealedResponse.newFailure(sealedRequest.request().id(), owner.xidDocument())\n .withError(errorBody)\n .withPeerContinuation(sealedRequest.peerContinuation());\n } else {\n // Run signing round 1 - generate nonces and commitments\n const rng = createRng();\n const [signingNonces, signingCommitments] = signingRound1(keyPackage, rng);\n\n const nextShare = ARID.new();\n nextShareArid = nextShare;\n\n // Build response body\n const responseBody = buildResponseBody(sessionId, signingCommitments, nextShare);\n\n // Persist commit state (unless preview mode)\n if (options.preview !== true) {\n persistCommitState(\n registryPath,\n groupId,\n sessionId,\n receiveState,\n signingNonces,\n signingCommitments,\n targetEnvelope,\n nextShare,\n );\n\n // Update listening ARID for next request\n const groupRecordMut = registry.group(groupId);\n if (groupRecordMut !== null && groupRecordMut !== undefined) {\n groupRecordMut.setListeningAtArid(nextShare);\n registry.save(registryPath);\n }\n }\n\n sealedResponse = SealedResponse.newSuccess(sealedRequest.request().id(), owner.xidDocument())\n .withResult(responseBody)\n .withPeerContinuation(sealedRequest.peerContinuation());\n }\n\n // Handle preview mode\n if (options.preview === true) {\n const unsealed = sealedResponse.toEnvelope(undefined, signerPrivateKeys, undefined);\n const envelopeUr = unsealed.urString();\n console.log(envelopeUr);\n return {\n accepted: options.rejectReason === undefined,\n envelopeUr,\n };\n }\n\n // Build encrypted response envelope\n const validUntil = new Date(Date.now() + 60 * 60 * 1000); // 1 hour from now\n const responseEnvelope = sealedResponse.toEnvelope(\n validUntil,\n signerPrivateKeys,\n receiveState.coordinatorDoc,\n );\n\n // Post response to Hubert storage\n if (options.storageSelection === undefined) {\n throw new Error(\"Storage selection is required to post response\");\n }\n const client = await createStorageClient(options.storageSelection);\n\n if (options.verbose === true) {\n console.error(`Posting signInvite response to ${receiveState.responseArid.urString()}`);\n }\n\n await putWithIndicator(\n client,\n receiveState.responseArid,\n responseEnvelope,\n \"Commitments\",\n options.verbose ?? false,\n );\n\n // On reject, clear listening ARID\n if (options.rejectReason !== undefined) {\n const groupRecordMut = registry.group(groupId);\n if (groupRecordMut !== null && groupRecordMut !== undefined) {\n groupRecordMut.clearListeningAtArid();\n registry.save(registryPath);\n }\n }\n\n const result: SignRound1Result = {\n accepted: options.rejectReason === undefined,\n };\n if (nextShareArid !== undefined) {\n result.listeningArid = nextShareArid.urString();\n }\n return result;\n}\n"],"mappings":"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"}
@@ -0,0 +1,305 @@
1
+ const require_chunk = require("./chunk-CZWwpsFl.cjs");
2
+ const require_registry_index = require("./registry/index.cjs");
3
+ const require_common = require("./common-lKP5EzHy.cjs");
4
+ const require_busy = require("./busy-EZU7EKr6.cjs");
5
+ const require_frost_index = require("./frost/index.cjs");
6
+ const require_common$1 = require("./common-lThIvJmZ.cjs");
7
+ let _bcts_components = require("@bcts/components");
8
+ let _bcts_dcbor = require("@bcts/dcbor");
9
+ let _bcts_envelope = require("@bcts/envelope");
10
+ let node_fs = require("node:fs");
11
+ node_fs = require_chunk.__toESM(node_fs, 1);
12
+ let node_path = require("node:path");
13
+ node_path = require_chunk.__toESM(node_path, 1);
14
+ let _frosts_ed25519 = require("@frosts/ed25519");
15
+ let _frosts_core = require("@frosts/core");
16
+ //#region src/cmd/sign/participant/round2.ts
17
+ /**
18
+ * Copyright © 2023-2026 Blockchain Commons, LLC
19
+ * Copyright © 2025-2026 Parity Technologies
20
+ *
21
+ *
22
+ * Sign participant round 2 command.
23
+ *
24
+ * Port of cmd/sign/participant/round2.rs from frost-hubert-rust.
25
+ *
26
+ * @module
27
+ */
28
+ var round2_exports = /* @__PURE__ */ require_chunk.__exportAll({ round2: () => round2 });
29
+ /**
30
+ * Load receive state from sign_receive.json.
31
+ *
32
+ * Port of `load_receive_state()` from cmd/sign/participant/round2.rs.
33
+ */
34
+ function loadReceiveState(registryPath, sessionId, groupHint) {
35
+ const base = node_path.dirname(registryPath);
36
+ const groupStateDir = node_path.join(base, "group-state");
37
+ let groupDirs;
38
+ if (groupHint) groupDirs = [[groupHint, node_path.join(groupStateDir, groupHint.hex())]];
39
+ else {
40
+ groupDirs = [];
41
+ if (node_fs.existsSync(groupStateDir)) {
42
+ for (const entry of node_fs.readdirSync(groupStateDir, { withFileTypes: true })) if (entry.isDirectory() && entry.name.length === 64 && /^[0-9a-f]+$/i.test(entry.name)) {
43
+ const groupId = _bcts_components.ARID.fromHex(entry.name);
44
+ groupDirs.push([groupId, node_path.join(groupStateDir, entry.name)]);
45
+ }
46
+ }
47
+ }
48
+ const candidates = [];
49
+ for (const [groupId, groupDir] of groupDirs) {
50
+ const candidate = node_path.join(groupDir, "signing", sessionId.hex(), "sign_receive.json");
51
+ if (node_fs.existsSync(candidate)) candidates.push([groupId, candidate]);
52
+ }
53
+ if (candidates.length === 0) throw new Error("No sign_receive.json found for this session; run `frost sign participant receive` first");
54
+ if (candidates.length > 1) throw new Error("Multiple groups contain this session; use --group to disambiguate");
55
+ const [groupId, statePath] = candidates[0];
56
+ const raw = JSON.parse(node_fs.readFileSync(statePath, "utf-8"));
57
+ const getStr = (key) => {
58
+ const value = raw[key];
59
+ if (typeof value !== "string") throw new Error(`Missing or invalid ${key} in sign_receive.json`);
60
+ return value;
61
+ };
62
+ const sessionInState = require_common.parseAridUr(getStr("session"));
63
+ if (sessionInState.urString() !== sessionId.urString()) throw new Error(`Session ${sessionInState.urString()} in sign_receive.json does not match requested session ${sessionId.urString()}`);
64
+ const groupInState = require_common.parseAridUr(getStr("group"));
65
+ if (groupInState.urString() !== groupId.urString()) throw new Error(`Group ${groupInState.urString()} in sign_receive.json does not match directory group ${groupId.urString()}`);
66
+ const participantsVal = raw["participants"];
67
+ if (!participantsVal || !Array.isArray(participantsVal)) throw new Error("Missing participants in sign_receive.json");
68
+ const participants = [];
69
+ for (const entry of participantsVal) {
70
+ if (typeof entry !== "string") throw new Error("Invalid participant entry in sign_receive.json");
71
+ participants.push(_bcts_components.XID.fromURString(entry));
72
+ }
73
+ const minSigners = raw["min_signers"];
74
+ if (typeof minSigners !== "number") throw new Error("Missing min_signers in sign_receive.json");
75
+ return {
76
+ groupId,
77
+ participants,
78
+ minSigners,
79
+ targetUr: getStr("target")
80
+ };
81
+ }
82
+ /**
83
+ * Load commit state from commit.json (includes nonces).
84
+ *
85
+ * Port of `load_commit_state()` from cmd/sign/participant/round2.rs.
86
+ */
87
+ function loadCommitState(registryPath, groupId, sessionId) {
88
+ const dir = require_common$1.signingStateDir(registryPath, groupId.hex(), sessionId.hex());
89
+ const statePath = node_path.join(dir, "commit.json");
90
+ if (!node_fs.existsSync(statePath)) throw new Error(`Commit state not found at ${statePath}. Run \`frost sign participant commit\` first.`);
91
+ const raw = JSON.parse(node_fs.readFileSync(statePath, "utf-8"));
92
+ const getStr = (key) => {
93
+ const value = raw[key];
94
+ if (typeof value !== "string") throw new Error(`Missing or invalid ${key} in commit.json`);
95
+ return value;
96
+ };
97
+ const sessionInState = require_common.parseAridUr(getStr("session"));
98
+ if (sessionInState.urString() !== sessionId.urString()) throw new Error(`Session ${sessionInState.urString()} in commit.json does not match requested session ${sessionId.urString()}`);
99
+ const nextShareArid = require_common.parseAridUr(getStr("next_share_arid"));
100
+ const targetUr = getStr("target");
101
+ const noncesRaw = raw["signing_nonces"];
102
+ if (!noncesRaw) throw new Error("Missing signing_nonces in commit.json");
103
+ const hidingNonce = _frosts_core.Nonce.deserialize(_frosts_ed25519.Ed25519Sha512, _frosts_ed25519.serde.hexToBytes(noncesRaw["hiding"]));
104
+ const bindingNonce = _frosts_core.Nonce.deserialize(_frosts_ed25519.Ed25519Sha512, _frosts_ed25519.serde.hexToBytes(noncesRaw["binding"]));
105
+ const signingNonces = _frosts_core.SigningNonces.fromNonces(_frosts_ed25519.Ed25519Sha512, hidingNonce, bindingNonce);
106
+ const commitmentsRaw = raw["signing_commitments"];
107
+ if (!commitmentsRaw) throw new Error("Missing signing_commitments in commit.json");
108
+ return {
109
+ nextShareArid,
110
+ targetUr,
111
+ signingNonces,
112
+ signingCommitments: require_frost_index.deserializeSigningCommitments(commitmentsRaw)
113
+ };
114
+ }
115
+ /**
116
+ * Validate the incoming GSTP request.
117
+ *
118
+ * Port of request validation logic from cmd/sign/participant/round2.rs.
119
+ */
120
+ function validateShareRequest(sealedRequest, sessionId, expectedCoordinator) {
121
+ const expectedFunction = _bcts_envelope.Function.fromString("signRound2");
122
+ if (sealedRequest.function().equals(expectedFunction) !== true) throw new Error(`Unexpected request function: ${String(sealedRequest.function())}`);
123
+ if (sealedRequest.id().urString() !== sessionId.urString()) throw new Error(`Session ID mismatch (request ${sealedRequest.id().urString()}, expected ${sessionId.urString()})`);
124
+ if (sealedRequest.sender().xid().urString() !== expectedCoordinator.urString()) throw new Error(`Unexpected request sender: ${sealedRequest.sender().xid().urString()} (expected coordinator ${expectedCoordinator.urString()})`);
125
+ }
126
+ /**
127
+ * Extract all commitments from the signRound2 request.
128
+ *
129
+ * Port of `parse_commitments()` from cmd/sign/participant/round2.rs.
130
+ */
131
+ function extractCommitments(sealedRequest, receiveState) {
132
+ const commitments = /* @__PURE__ */ new Map();
133
+ const commitmentObjects = sealedRequest.objectsForParameter("commitment");
134
+ for (const entry of commitmentObjects) {
135
+ const xid = _bcts_components.XID.fromTaggedCbor(entry.subject().tryLeaf());
136
+ const commitmentsObjects = entry.objectsForPredicate("commitments");
137
+ if (commitmentsObjects.length === 0) throw new Error(`Missing commitments for participant ${xid.urString()}`);
138
+ const commitmentsJson = _bcts_components.JSON.fromTaggedCbor(commitmentsObjects[0].subject().tryLeaf());
139
+ const signingCommitments = require_frost_index.deserializeSigningCommitments(JSON.parse(commitmentsJson.asStr()));
140
+ const xidUr = xid.urString();
141
+ if (commitments.has(xidUr)) throw new Error(`Duplicate commitments for participant ${xidUr}`);
142
+ commitments.set(xidUr, signingCommitments);
143
+ }
144
+ if (commitments.size === 0) throw new Error("signRound2 request contains no commitments");
145
+ const expectedSet = new Set(receiveState.participants.map((p) => p.urString()));
146
+ const actualSet = new Set(commitments.keys());
147
+ const missing = [];
148
+ const extra = [];
149
+ for (const xid of expectedSet) if (!actualSet.has(xid)) missing.push(xid);
150
+ for (const xid of actualSet) if (!expectedSet.has(xid)) extra.push(xid);
151
+ if (missing.length > 0 || extra.length > 0) throw new Error(`signRound2 commitments do not match session participants (missing: ${missing.join(", ")}; extra: ${extra.join(", ")})`);
152
+ return commitments;
153
+ }
154
+ /**
155
+ * Build a map from XID to FROST identifier (sorted participant order).
156
+ *
157
+ * Port of `xid_identifier_map()` from cmd/sign/participant/round2.rs.
158
+ */
159
+ function xidIdentifierMap(participants) {
160
+ const map = /* @__PURE__ */ new Map();
161
+ for (let i = 0; i < participants.length; i++) {
162
+ const identifier = require_frost_index.identifierFromU16(i + 1);
163
+ map.set(participants[i].urString(), identifier);
164
+ }
165
+ return map;
166
+ }
167
+ /**
168
+ * Build signing commitments with identifiers.
169
+ *
170
+ * Port of `commitments_with_identifiers()` from cmd/sign/participant/round2.rs.
171
+ */
172
+ function commitmentsWithIdentifiers(commitments, xidToIdentifier) {
173
+ const mapped = /* @__PURE__ */ new Map();
174
+ for (const [xidUr, commits] of commitments) {
175
+ const identifier = xidToIdentifier.get(xidUr);
176
+ if (!identifier) throw new Error(`Unknown participant ${xidUr}`);
177
+ mapped.set(identifier, commits);
178
+ }
179
+ return mapped;
180
+ }
181
+ /**
182
+ * Build the signRound2Response body envelope.
183
+ *
184
+ * Port of response body construction from cmd/sign/participant/round2.rs.
185
+ */
186
+ function buildResponseBody(sessionId, signatureShare, finalizeArid) {
187
+ const shareHex = require_frost_index.serializeSignatureShare(signatureShare);
188
+ const shareJson = _bcts_components.JSON.fromString(JSON.stringify({ share: shareHex }));
189
+ return _bcts_envelope.Envelope.unit().addType("signRound2Response").addAssertion("session", sessionId).addAssertion("signature_share", shareJson).addAssertion("response_arid", finalizeArid);
190
+ }
191
+ /**
192
+ * Persist share state to share.json.
193
+ *
194
+ * Port of `persist_share_state()` from cmd/sign/participant/round2.rs.
195
+ */
196
+ function persistShareState(registryPath, groupId, sessionId, responseArid, finalizeArid, signatureShare, commitments) {
197
+ const dir = require_common$1.signingStateDir(registryPath, groupId.hex(), sessionId.hex());
198
+ node_fs.mkdirSync(dir, { recursive: true });
199
+ const commitmentsJson = {};
200
+ for (const [xidUr, commits] of commitments) commitmentsJson[xidUr] = require_frost_index.serializeSigningCommitments(commits);
201
+ const root = {
202
+ session: sessionId.urString(),
203
+ response_arid: responseArid.urString(),
204
+ finalize_arid: finalizeArid.urString(),
205
+ signature_share: { share: require_frost_index.serializeSignatureShare(signatureShare) },
206
+ commitments: commitmentsJson
207
+ };
208
+ node_fs.writeFileSync(node_path.join(dir, "share.json"), JSON.stringify(root, null, 2));
209
+ }
210
+ /**
211
+ * Execute the sign participant round 2 command.
212
+ *
213
+ * Receives round 2 request and sends signature share.
214
+ *
215
+ * Port of `CommandArgs::exec()` from cmd/sign/participant/round2.rs.
216
+ */
217
+ async function round2(client, options, cwd) {
218
+ const registryPath = require_registry_index.resolveRegistryPath(options.registryPath, cwd);
219
+ const registry = require_registry_index.Registry.load(registryPath);
220
+ const owner = registry.owner();
221
+ if (!owner) throw new Error("Registry owner is required");
222
+ const ownerXidDocument = owner.xidDocument();
223
+ const sessionId = require_common.parseAridUr(options.sessionId);
224
+ const receiveState = loadReceiveState(registryPath, sessionId, options.groupId ? require_common.parseAridUr(options.groupId) : void 0);
225
+ const groupId = receiveState.groupId;
226
+ const groupRecord = registry.group(groupId);
227
+ if (!groupRecord) throw new Error("Group not found in registry");
228
+ if (groupRecord.minSigners() !== receiveState.minSigners) throw new Error(`Session min_signers ${receiveState.minSigners} does not match registry ${groupRecord.minSigners()}`);
229
+ const registryParticipants = new Set(groupRecord.participants().map((p) => p.xid().urString()));
230
+ const sessionParticipants = new Set(receiveState.participants.map((p) => p.urString()));
231
+ if (registryParticipants.size !== sessionParticipants.size || ![...registryParticipants].every((p) => sessionParticipants.has(p))) throw new Error("Session participants do not match registry group participants");
232
+ if (!sessionParticipants.has(owner.xid().urString())) throw new Error("This participant is not part of the signing session");
233
+ const listeningAtArid = groupRecord.listeningAtArid();
234
+ if (!listeningAtArid) throw new Error("No listening ARID for signRound2. Did you run `frost sign participant commit`?");
235
+ const commitState = loadCommitState(registryPath, groupId, sessionId);
236
+ if (commitState.nextShareArid.urString() !== listeningAtArid.urString()) throw new Error(`Listening ARID in registry (${listeningAtArid.urString()}) does not match persisted commit state (${commitState.nextShareArid.urString()})`);
237
+ if (commitState.targetUr !== receiveState.targetUr) throw new Error("Target envelope in commit state does not match persisted signInvite request");
238
+ const keyPackagePath = groupRecord.contributions().keyPackage;
239
+ if (!keyPackagePath) throw new Error("Key package path not found; did you finish DKG?");
240
+ const keyPackage = require_frost_index.deserializeKeyPackage(JSON.parse(node_fs.readFileSync(keyPackagePath, "utf-8")).key_package);
241
+ const finalizeArid = _bcts_components.ARID.new();
242
+ const targetDigest = _bcts_envelope.Envelope.fromURString(receiveState.targetUr).subject().digest();
243
+ if (options.verbose === true) console.error("Fetching signRound2 request from Hubert...");
244
+ const requestEnvelope = await require_busy.getWithIndicator(client, listeningAtArid, "signRound2 request", options.timeoutSeconds, options.verbose ?? false);
245
+ if (!requestEnvelope) throw new Error("signRound2 request not found in Hubert storage");
246
+ const signerPrivateKeys = ownerXidDocument.inceptionPrivateKeys();
247
+ if (!signerPrivateKeys) throw new Error("Owner XID document has no private keys");
248
+ const { SealedRequest: SealedRequestClass } = require("@bcts/gstp");
249
+ const now = _bcts_dcbor.CborDate.now();
250
+ const sealedRequest = SealedRequestClass.tryFromEnvelope(requestEnvelope, void 0, now, signerPrivateKeys);
251
+ const expectedCoordinator = groupRecord.coordinator().xid();
252
+ validateShareRequest(sealedRequest, sessionId, expectedCoordinator);
253
+ const responseArid = sealedRequest.extractObjectForParameter("response_arid");
254
+ const commitmentsByXid = extractCommitments(sealedRequest, receiveState);
255
+ const myCommitments = commitmentsByXid.get(owner.xid().urString());
256
+ if (!myCommitments) throw new Error("signRound2 request missing commitments for this participant");
257
+ const myCommitmentsSerialized = require_frost_index.serializeSigningCommitments(myCommitments);
258
+ const storedCommitmentsSerialized = require_frost_index.serializeSigningCommitments(commitState.signingCommitments);
259
+ if (myCommitmentsSerialized.hiding !== storedCommitmentsSerialized.hiding || myCommitmentsSerialized.binding !== storedCommitmentsSerialized.binding) throw new Error("signRound2 request commitments do not match locally stored commitments");
260
+ const xidToIdentifier = xidIdentifierMap(receiveState.participants);
261
+ if (!xidToIdentifier.get(owner.xid().urString())) throw new Error("Identifier for participant not found");
262
+ if (keyPackage.minSigners !== receiveState.minSigners) throw new Error(`Key package min_signers ${keyPackage.minSigners} does not match session ${receiveState.minSigners}`);
263
+ if (commitmentsByXid.size < receiveState.minSigners) throw new Error(`signRound2 request contained ${commitmentsByXid.size} commitments but requires at least ${receiveState.minSigners} signers`);
264
+ const signatureShare = require_frost_index.signingRound2(require_frost_index.createSigningPackage(commitmentsWithIdentifiers(commitmentsByXid, xidToIdentifier), targetDigest.data()), commitState.signingNonces, keyPackage);
265
+ const responseBody = buildResponseBody(sessionId, signatureShare, finalizeArid);
266
+ const { SealedResponse: SealedResponseClass } = require("@bcts/gstp");
267
+ const sealedResponse = SealedResponseClass.newSuccess(sealedRequest.id(), ownerXidDocument).withResult(responseBody);
268
+ if (options.preview === true) {
269
+ const unsealed = sealedResponse.toEnvelope(void 0, signerPrivateKeys, void 0);
270
+ console.log(unsealed.urString());
271
+ return { listeningArid: finalizeArid.urString() };
272
+ }
273
+ let coordinatorDoc;
274
+ if (expectedCoordinator.urString() === owner.xid().urString()) coordinatorDoc = ownerXidDocument;
275
+ else {
276
+ const coordinatorRecord = registry.participant(expectedCoordinator);
277
+ if (!coordinatorRecord) throw new Error(`Coordinator ${expectedCoordinator.urString()} not found in registry`);
278
+ coordinatorDoc = coordinatorRecord.xidDocument();
279
+ }
280
+ const expiry = _bcts_dcbor.CborDate.withDurationFromNow(3600);
281
+ await require_busy.putWithIndicator(client, responseArid, sealedResponse.toEnvelope(expiry, signerPrivateKeys, coordinatorDoc), "Signature Share", options.verbose ?? false);
282
+ persistShareState(registryPath, groupId, sessionId, responseArid, finalizeArid, signatureShare, commitmentsByXid);
283
+ const groupRecordMutable = registry.group(groupId);
284
+ if (groupRecordMutable) {
285
+ groupRecordMutable.setListeningAtArid(finalizeArid);
286
+ registry.save(registryPath);
287
+ }
288
+ if (options.verbose === true) console.error(`Posted signature share to ${responseArid.urString()}`);
289
+ return { listeningArid: finalizeArid.urString() };
290
+ }
291
+ //#endregion
292
+ Object.defineProperty(exports, "round2", {
293
+ enumerable: true,
294
+ get: function() {
295
+ return round2;
296
+ }
297
+ });
298
+ Object.defineProperty(exports, "round2_exports", {
299
+ enumerable: true,
300
+ get: function() {
301
+ return round2_exports;
302
+ }
303
+ });
304
+
305
+ //# sourceMappingURL=round2-BWz9SQIi.cjs.map