@bitgo-beta/sdk-lib-mpc 8.2.0-beta.209 → 8.2.0-beta.2091
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/dist/src/curves/ed25519.d.ts +0 -1
- package/dist/src/curves/ed25519.d.ts.map +1 -1
- package/dist/src/curves/ed25519.js +12 -12
- package/dist/src/curves/ed25519Bip32HdTree.js +14 -14
- package/dist/src/curves/index.js +6 -2
- package/dist/src/curves/secp256k1.d.ts +0 -1
- package/dist/src/curves/secp256k1.d.ts.map +1 -1
- package/dist/src/curves/secp256k1.js +22 -38
- package/dist/src/curves/secp256k1Bip32HdTree.js +10 -10
- package/dist/src/curves/types.d.ts +2 -3
- package/dist/src/curves/types.d.ts.map +1 -1
- package/dist/src/curves/util.d.ts +2 -0
- package/dist/src/curves/util.d.ts.map +1 -1
- package/dist/src/curves/util.js +34 -3
- package/dist/src/hashCommitment.d.ts +0 -1
- package/dist/src/hashCommitment.d.ts.map +1 -1
- package/dist/src/hashCommitment.js +7 -8
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +24 -10
- package/dist/src/openssl/index.js +6 -2
- package/dist/src/openssl/openssl.d.ts +1 -2
- package/dist/src/openssl/openssl.d.ts.map +1 -1
- package/dist/src/openssl/openssl.js +4 -12
- package/dist/src/safePrime.d.ts +3 -0
- package/dist/src/safePrime.d.ts.map +1 -0
- package/dist/src/safePrime.js +19 -0
- package/dist/src/schnorrProof.d.ts +0 -1
- package/dist/src/schnorrProof.d.ts.map +1 -1
- package/dist/src/schnorrProof.js +8 -9
- package/dist/src/shamir/index.js +6 -2
- package/dist/src/shamir/shamir.js +2 -2
- package/dist/src/shamir/types.d.ts +1 -1
- package/dist/src/shamir/types.d.ts.map +1 -1
- package/dist/src/tss/dkls-vrf/dkg.d.ts +91 -0
- package/dist/src/tss/dkls-vrf/dkg.d.ts.map +1 -0
- package/dist/src/tss/dkls-vrf/dkg.js +278 -0
- package/dist/src/tss/dkls-vrf/index.d.ts +4 -0
- package/dist/src/tss/dkls-vrf/index.d.ts.map +1 -0
- package/dist/src/tss/dkls-vrf/index.js +40 -0
- package/dist/src/tss/dkls-vrf/types.d.ts +28 -0
- package/dist/src/tss/dkls-vrf/types.d.ts.map +1 -0
- package/dist/src/tss/dkls-vrf/types.js +23 -0
- package/dist/src/tss/dkls-vrf/util.d.ts +29 -0
- package/dist/src/tss/dkls-vrf/util.d.ts.map +1 -0
- package/dist/src/tss/dkls-vrf/util.js +113 -0
- package/dist/src/tss/ecdsa/index.js +23 -9
- package/dist/src/tss/ecdsa/paillierproof.js +10 -10
- package/dist/src/tss/ecdsa/rangeproof.d.ts +1 -2
- package/dist/src/tss/ecdsa/rangeproof.d.ts.map +1 -1
- package/dist/src/tss/ecdsa/rangeproof.js +108 -118
- package/dist/src/tss/ecdsa/types.d.ts +28 -17
- package/dist/src/tss/ecdsa/types.d.ts.map +1 -1
- package/dist/src/tss/ecdsa/types.js +29 -31
- package/dist/src/tss/ecdsa/zkVProof.d.ts +0 -1
- package/dist/src/tss/ecdsa/zkVProof.d.ts.map +1 -1
- package/dist/src/tss/ecdsa/zkVProof.js +9 -10
- package/dist/src/tss/ecdsa-dkls/commsLayer.d.ts +69 -0
- package/dist/src/tss/ecdsa-dkls/commsLayer.d.ts.map +1 -0
- package/dist/src/tss/ecdsa-dkls/commsLayer.js +268 -0
- package/dist/src/tss/ecdsa-dkls/derive.d.ts +111 -0
- package/dist/src/tss/ecdsa-dkls/derive.d.ts.map +1 -0
- package/dist/src/tss/ecdsa-dkls/derive.js +329 -0
- package/dist/src/tss/ecdsa-dkls/dkg.d.ts +64 -0
- package/dist/src/tss/ecdsa-dkls/dkg.d.ts.map +1 -0
- package/dist/src/tss/ecdsa-dkls/dkg.js +334 -0
- package/dist/src/tss/ecdsa-dkls/dsg.d.ts +47 -0
- package/dist/src/tss/ecdsa-dkls/dsg.d.ts.map +1 -0
- package/dist/src/tss/ecdsa-dkls/dsg.js +271 -0
- package/dist/src/tss/ecdsa-dkls/index.d.ts +7 -0
- package/dist/src/tss/ecdsa-dkls/index.d.ts.map +1 -0
- package/dist/src/tss/ecdsa-dkls/index.js +43 -0
- package/dist/src/tss/ecdsa-dkls/types.d.ts +128 -0
- package/dist/src/tss/ecdsa-dkls/types.d.ts.map +1 -0
- package/dist/src/tss/ecdsa-dkls/types.js +175 -0
- package/dist/src/tss/ecdsa-dkls/util.d.ts +26 -0
- package/dist/src/tss/ecdsa-dkls/util.d.ts.map +1 -0
- package/dist/src/tss/ecdsa-dkls/util.js +276 -0
- package/dist/src/tss/eddsa-mps/commsLayer.d.ts +30 -0
- package/dist/src/tss/eddsa-mps/commsLayer.d.ts.map +1 -0
- package/dist/src/tss/eddsa-mps/commsLayer.js +96 -0
- package/dist/src/tss/eddsa-mps/derive.d.ts +34 -0
- package/dist/src/tss/eddsa-mps/derive.d.ts.map +1 -0
- package/dist/src/tss/eddsa-mps/derive.js +198 -0
- package/dist/src/tss/eddsa-mps/dkg.d.ts +109 -0
- package/dist/src/tss/eddsa-mps/dkg.d.ts.map +1 -0
- package/dist/src/tss/eddsa-mps/dkg.js +303 -0
- package/dist/src/tss/eddsa-mps/dsg.d.ts +96 -0
- package/dist/src/tss/eddsa-mps/dsg.d.ts.map +1 -0
- package/dist/src/tss/eddsa-mps/dsg.js +346 -0
- package/dist/src/tss/eddsa-mps/index.d.ts +8 -0
- package/dist/src/tss/eddsa-mps/index.d.ts.map +1 -0
- package/dist/src/tss/eddsa-mps/index.js +43 -0
- package/dist/src/tss/eddsa-mps/types.d.ts +76 -0
- package/dist/src/tss/eddsa-mps/types.d.ts.map +1 -0
- package/dist/src/tss/eddsa-mps/types.js +105 -0
- package/dist/src/tss/eddsa-mps/util.d.ts +33 -0
- package/dist/src/tss/eddsa-mps/util.d.ts.map +1 -0
- package/dist/src/tss/eddsa-mps/util.js +94 -0
- package/dist/src/tss/eddsa-mps-vrf/dkg.d.ts +65 -0
- package/dist/src/tss/eddsa-mps-vrf/dkg.d.ts.map +1 -0
- package/dist/src/tss/eddsa-mps-vrf/dkg.js +246 -0
- package/dist/src/tss/eddsa-mps-vrf/index.d.ts +4 -0
- package/dist/src/tss/eddsa-mps-vrf/index.d.ts.map +1 -0
- package/dist/src/tss/eddsa-mps-vrf/index.js +40 -0
- package/dist/src/tss/eddsa-mps-vrf/types.d.ts +31 -0
- package/dist/src/tss/eddsa-mps-vrf/types.d.ts.map +1 -0
- package/dist/src/tss/eddsa-mps-vrf/types.js +97 -0
- package/dist/src/tss/eddsa-mps-vrf/util.d.ts +9 -0
- package/dist/src/tss/eddsa-mps-vrf/util.d.ts.map +1 -0
- package/dist/src/tss/eddsa-mps-vrf/util.js +36 -0
- package/dist/src/tss/index.d.ts +5 -0
- package/dist/src/tss/index.d.ts.map +1 -1
- package/dist/src/tss/index.js +11 -2
- package/dist/src/tss/redpallas-mps/commsLayer.d.ts +34 -0
- package/dist/src/tss/redpallas-mps/commsLayer.d.ts.map +1 -0
- package/dist/src/tss/redpallas-mps/commsLayer.js +100 -0
- package/dist/src/tss/redpallas-mps/dkg.d.ts +103 -0
- package/dist/src/tss/redpallas-mps/dkg.d.ts.map +1 -0
- package/dist/src/tss/redpallas-mps/dkg.js +285 -0
- package/dist/src/tss/redpallas-mps/dsg.d.ts +108 -0
- package/dist/src/tss/redpallas-mps/dsg.d.ts.map +1 -0
- package/dist/src/tss/redpallas-mps/dsg.js +355 -0
- package/dist/src/tss/redpallas-mps/index.d.ts +7 -0
- package/dist/src/tss/redpallas-mps/index.d.ts.map +1 -0
- package/dist/src/tss/redpallas-mps/index.js +42 -0
- package/dist/src/tss/redpallas-mps/types.d.ts +85 -0
- package/dist/src/tss/redpallas-mps/types.d.ts.map +1 -0
- package/dist/src/tss/redpallas-mps/types.js +112 -0
- package/dist/src/tss/redpallas-mps/util.d.ts +43 -0
- package/dist/src/tss/redpallas-mps/util.d.ts.map +1 -0
- package/dist/src/tss/redpallas-mps/util.js +147 -0
- package/dist/src/types.d.ts +0 -1
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/util.d.ts +0 -1
- package/dist/src/util.d.ts.map +1 -1
- package/dist/src/util.js +21 -22
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +42 -5
- package/.eslintignore +0 -5
- package/CHANGELOG.md +0 -340
- package/dist/src/openssl/opensslbytes.d.ts +0 -4
- package/dist/src/openssl/opensslbytes.d.ts.map +0 -1
- package/dist/src/openssl/opensslbytes.js +0 -20
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.SIGNATURE_DATE_TOLERANCE_MS = void 0;
|
|
37
|
+
exports.detachSignData = detachSignData;
|
|
38
|
+
exports.encryptAndDetachSignData = encryptAndDetachSignData;
|
|
39
|
+
exports.decryptAndVerifySignedData = decryptAndVerifySignedData;
|
|
40
|
+
exports.verifySignedData = verifySignedData;
|
|
41
|
+
exports.decryptAndVerifyIncomingMessages = decryptAndVerifyIncomingMessages;
|
|
42
|
+
exports.encryptAndAuthOutgoingMessages = encryptAndAuthOutgoingMessages;
|
|
43
|
+
const pgp = __importStar(require("openpgp"));
|
|
44
|
+
/**
|
|
45
|
+
* Tolerance window for OpenPGP date-based key validity checks (24 hours).
|
|
46
|
+
*
|
|
47
|
+
* Background: OpenPGP.js uses the `date` parameter to check key expiry at a
|
|
48
|
+
* given point in time. We previously passed `date: null` to disable this check
|
|
49
|
+
* entirely (see HSM-706) because OVC cold-signing flows for trust and SMC
|
|
50
|
+
* clients can involve significant clock skew between the signing device and the
|
|
51
|
+
* server — the device may be air-gapped and its clock can drift by hours.
|
|
52
|
+
*
|
|
53
|
+
* Note: this GPG expiry check is not strictly required for replay protection.
|
|
54
|
+
* The DKLS protocol has its own mechanism for preventing replay attacks
|
|
55
|
+
* (session-bound commitments and round-specific message validation), so the
|
|
56
|
+
* OpenPGP date check is a defense-in-depth measure rather than the primary
|
|
57
|
+
* replay mitigation.
|
|
58
|
+
*
|
|
59
|
+
* OpenPGP's `date` parameter shifts the reference time for ALL temporal
|
|
60
|
+
* checks simultaneously (key expiry, self-signature validity, signature
|
|
61
|
+
* freshness). This means a single shifted date cannot independently relax
|
|
62
|
+
* key-expiry checks without breaking self-signature validation on fresh keys.
|
|
63
|
+
*
|
|
64
|
+
* Therefore:
|
|
65
|
+
* - encrypt/decrypt omit `date` (use default = current time) for normal key
|
|
66
|
+
* expiry checking and self-signature validation.
|
|
67
|
+
* - verify uses `now + tolerance` so that signatures from OVC devices whose
|
|
68
|
+
* clocks are up to 24 hours ahead are not rejected as "from the future".
|
|
69
|
+
*/
|
|
70
|
+
exports.SIGNATURE_DATE_TOLERANCE_MS = 24 * 60 * 60 * 1000;
|
|
71
|
+
/**
|
|
72
|
+
* Detach signs a binary and encodes it in base64
|
|
73
|
+
* @param data binary to encode in base64 and sign
|
|
74
|
+
* @param privateArmor private key to sign with
|
|
75
|
+
*/
|
|
76
|
+
async function detachSignData(data, privateArmor) {
|
|
77
|
+
const message = await pgp.createMessage({ binary: data });
|
|
78
|
+
const privateKey = await pgp.readPrivateKey({ armoredKey: privateArmor });
|
|
79
|
+
const signature = await pgp.sign({
|
|
80
|
+
message,
|
|
81
|
+
signingKeys: privateKey,
|
|
82
|
+
format: 'armored',
|
|
83
|
+
detached: true,
|
|
84
|
+
config: {
|
|
85
|
+
rejectCurves: new Set(),
|
|
86
|
+
showVersion: false,
|
|
87
|
+
showComment: false,
|
|
88
|
+
},
|
|
89
|
+
});
|
|
90
|
+
return {
|
|
91
|
+
message: data.toString('base64'),
|
|
92
|
+
signature: signature,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Encrypts and detach signs a binary
|
|
97
|
+
* @param data binary to encrypt and sign
|
|
98
|
+
* @param publicArmor public key to encrypt with
|
|
99
|
+
* @param privateArmor private key to sign with
|
|
100
|
+
*/
|
|
101
|
+
async function encryptAndDetachSignData(data, publicArmor, privateArmor) {
|
|
102
|
+
const message = await pgp.createMessage({ binary: data });
|
|
103
|
+
const publicKey = await pgp.readKey({ armoredKey: publicArmor });
|
|
104
|
+
const privateKey = await pgp.readPrivateKey({ armoredKey: privateArmor });
|
|
105
|
+
const encryptedMessage = await pgp.encrypt({
|
|
106
|
+
message,
|
|
107
|
+
encryptionKeys: publicKey,
|
|
108
|
+
format: 'armored',
|
|
109
|
+
config: {
|
|
110
|
+
rejectCurves: new Set(),
|
|
111
|
+
showVersion: false,
|
|
112
|
+
showComment: false,
|
|
113
|
+
},
|
|
114
|
+
});
|
|
115
|
+
const signature = await pgp.sign({
|
|
116
|
+
message,
|
|
117
|
+
signingKeys: privateKey,
|
|
118
|
+
format: 'armored',
|
|
119
|
+
detached: true,
|
|
120
|
+
config: {
|
|
121
|
+
rejectCurves: new Set(),
|
|
122
|
+
showVersion: false,
|
|
123
|
+
showComment: false,
|
|
124
|
+
},
|
|
125
|
+
});
|
|
126
|
+
return {
|
|
127
|
+
encryptedMessage: encryptedMessage,
|
|
128
|
+
signature: signature,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Decrypts and verifies signature on a binary
|
|
133
|
+
* @param encryptedAndSignedMessage message to decrypt and verify
|
|
134
|
+
* @param publicArmor public key to verify signature with
|
|
135
|
+
* @param privateArmor private key to decrypt with
|
|
136
|
+
*/
|
|
137
|
+
async function decryptAndVerifySignedData(encryptedAndSignedMessage, publicArmor, privateArmor) {
|
|
138
|
+
const publicKey = await pgp.readKey({ armoredKey: publicArmor });
|
|
139
|
+
const privateKey = await pgp.readPrivateKey({ armoredKey: privateArmor });
|
|
140
|
+
const decryptedMessage = await pgp.decrypt({
|
|
141
|
+
message: await pgp.readMessage({ armoredMessage: encryptedAndSignedMessage.encryptedMessage }),
|
|
142
|
+
decryptionKeys: [privateKey],
|
|
143
|
+
config: {
|
|
144
|
+
rejectCurves: new Set(),
|
|
145
|
+
showVersion: false,
|
|
146
|
+
showComment: false,
|
|
147
|
+
},
|
|
148
|
+
format: 'binary',
|
|
149
|
+
});
|
|
150
|
+
const verificationResult = await pgp.verify({
|
|
151
|
+
message: await pgp.createMessage({ binary: decryptedMessage.data }),
|
|
152
|
+
signature: await pgp.readSignature({ armoredSignature: encryptedAndSignedMessage.signature }),
|
|
153
|
+
verificationKeys: publicKey,
|
|
154
|
+
date: new Date(Date.now() + exports.SIGNATURE_DATE_TOLERANCE_MS),
|
|
155
|
+
});
|
|
156
|
+
await verificationResult.signatures[0].verified;
|
|
157
|
+
return Buffer.from(decryptedMessage.data).toString('base64');
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Verifies signature on a binary (message passed should be encoded in base64).
|
|
161
|
+
* @param signedMessage message to verify
|
|
162
|
+
* @param publicArmor public key to verify signature with
|
|
163
|
+
*/
|
|
164
|
+
async function verifySignedData(signedMessage, publicArmor) {
|
|
165
|
+
const publicKey = await pgp.readKey({ armoredKey: publicArmor });
|
|
166
|
+
const verificationResult = await pgp.verify({
|
|
167
|
+
message: await pgp.createMessage({ binary: Buffer.from(signedMessage.message, 'base64') }),
|
|
168
|
+
signature: await pgp.readSignature({ armoredSignature: signedMessage.signature }),
|
|
169
|
+
verificationKeys: publicKey,
|
|
170
|
+
date: new Date(Date.now() + exports.SIGNATURE_DATE_TOLERANCE_MS),
|
|
171
|
+
});
|
|
172
|
+
try {
|
|
173
|
+
await verificationResult.signatures[0].verified;
|
|
174
|
+
return true;
|
|
175
|
+
}
|
|
176
|
+
catch (e) {
|
|
177
|
+
return false;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Decrypts and verifies p2p messages + verifies broadcast messages
|
|
182
|
+
* @param messages message to decrypt and verify
|
|
183
|
+
* @param pubVerificationGpgKeys public keys to verify signatures with
|
|
184
|
+
* @param prvDecryptionGpgKeys private keys to decrypt with
|
|
185
|
+
*/
|
|
186
|
+
async function decryptAndVerifyIncomingMessages(messages, pubVerificationGpgKeys, prvDecryptionGpgKeys) {
|
|
187
|
+
return {
|
|
188
|
+
p2pMessages: await Promise.all(messages.p2pMessages.map(async (m) => {
|
|
189
|
+
const pubGpgKey = pubVerificationGpgKeys.find((k) => k.partyId === m.from);
|
|
190
|
+
const prvGpgKey = prvDecryptionGpgKeys.find((k) => k.partyId === m.to);
|
|
191
|
+
if (!pubGpgKey) {
|
|
192
|
+
throw Error(`No public key provided for sender with ID: ${m.from}`);
|
|
193
|
+
}
|
|
194
|
+
if (!prvGpgKey) {
|
|
195
|
+
throw Error(`No private key provided for recepient with ID: ${m.to}`);
|
|
196
|
+
}
|
|
197
|
+
return {
|
|
198
|
+
to: m.to,
|
|
199
|
+
from: m.from,
|
|
200
|
+
payload: await decryptAndVerifySignedData(m.payload, pubGpgKey.gpgKey, prvGpgKey.gpgKey),
|
|
201
|
+
commitment: m.commitment,
|
|
202
|
+
};
|
|
203
|
+
})),
|
|
204
|
+
broadcastMessages: await Promise.all(messages.broadcastMessages.map(async (m) => {
|
|
205
|
+
const pubGpgKey = pubVerificationGpgKeys.find((k) => k.partyId === m.from);
|
|
206
|
+
if (!pubGpgKey) {
|
|
207
|
+
throw Error(`No public key provided for sender with ID: ${m.from}`);
|
|
208
|
+
}
|
|
209
|
+
if (!(await verifySignedData(m.payload, pubGpgKey.gpgKey))) {
|
|
210
|
+
throw Error(`Failed to authenticate broadcast message from party: ${m.from}`);
|
|
211
|
+
}
|
|
212
|
+
if (m.signatureR !== undefined) {
|
|
213
|
+
if (!(await verifySignedData(m.signatureR, pubGpgKey.gpgKey))) {
|
|
214
|
+
throw Error(`Failed to authenticate signatureR in broadcast message from party: ${m.from}`);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
return {
|
|
218
|
+
from: m.from,
|
|
219
|
+
payload: m.payload.message,
|
|
220
|
+
signatureR: m.signatureR?.message,
|
|
221
|
+
};
|
|
222
|
+
})),
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Encrypts and signs p2p messages + signs broadcast messages
|
|
227
|
+
* @param messages messages to encrypt and sign
|
|
228
|
+
* @param pubEncryptionGpgKey public keys to encrypt data to
|
|
229
|
+
* @param prvAuthenticationGpgKey private keys to sign with
|
|
230
|
+
*/
|
|
231
|
+
async function encryptAndAuthOutgoingMessages(messages, pubEncryptionGpgKeys, prvAuthenticationGpgKeys) {
|
|
232
|
+
return {
|
|
233
|
+
p2pMessages: await Promise.all(messages.p2pMessages.map(async (m) => {
|
|
234
|
+
const pubGpgKey = pubEncryptionGpgKeys.find((k) => k.partyId === m.to);
|
|
235
|
+
const prvGpgKey = prvAuthenticationGpgKeys.find((k) => k.partyId === m.from);
|
|
236
|
+
if (!pubGpgKey) {
|
|
237
|
+
throw Error(`No public key provided for recipient with ID: ${m.to}`);
|
|
238
|
+
}
|
|
239
|
+
if (!prvGpgKey) {
|
|
240
|
+
throw Error(`No private key provided for sender with ID: ${m.from}`);
|
|
241
|
+
}
|
|
242
|
+
return {
|
|
243
|
+
to: m.to,
|
|
244
|
+
from: m.from,
|
|
245
|
+
payload: await encryptAndDetachSignData(Buffer.from(m.payload, 'base64'), pubGpgKey.gpgKey, prvGpgKey.gpgKey),
|
|
246
|
+
commitment: m.commitment,
|
|
247
|
+
};
|
|
248
|
+
})),
|
|
249
|
+
broadcastMessages: await Promise.all(messages.broadcastMessages.map(async (m) => {
|
|
250
|
+
const prvGpgKey = prvAuthenticationGpgKeys.find((k) => k.partyId === m.from);
|
|
251
|
+
if (!prvGpgKey) {
|
|
252
|
+
throw Error(`No private key provided for sender with ID: ${m.from}`);
|
|
253
|
+
}
|
|
254
|
+
const [signedPayload, signedSignatureR] = await Promise.all([
|
|
255
|
+
detachSignData(Buffer.from(m.payload, 'base64'), prvGpgKey.gpgKey),
|
|
256
|
+
m.signatureR
|
|
257
|
+
? detachSignData(Buffer.from(m.signatureR, 'base64'), prvGpgKey.gpgKey)
|
|
258
|
+
: Promise.resolve(undefined),
|
|
259
|
+
]);
|
|
260
|
+
return {
|
|
261
|
+
from: m.from,
|
|
262
|
+
payload: signedPayload,
|
|
263
|
+
signatureR: signedSignatureR,
|
|
264
|
+
};
|
|
265
|
+
})),
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbXNMYXllci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy90c3MvZWNkc2EtZGtscy9jb21tc0xheWVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9DQSx3Q0FrQkM7QUFRRCw0REFpQ0M7QUFRRCxnRUF5QkM7QUFPRCw0Q0FjQztBQVFELDRFQThDQztBQVFELHdFQTRDQztBQTlQRCw2Q0FBK0I7QUFFL0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F5Qkc7QUFDVSxRQUFBLDJCQUEyQixHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUUvRDs7OztHQUlHO0FBQ0ksS0FBSyxVQUFVLGNBQWMsQ0FBQyxJQUFZLEVBQUUsWUFBb0I7SUFDckUsTUFBTSxPQUFPLEdBQUcsTUFBTSxHQUFHLENBQUMsYUFBYSxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDMUQsTUFBTSxVQUFVLEdBQUcsTUFBTSxHQUFHLENBQUMsY0FBYyxDQUFDLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUM7SUFDMUUsTUFBTSxTQUFTLEdBQUcsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDO1FBQy9CLE9BQU87UUFDUCxXQUFXLEVBQUUsVUFBVTtRQUN2QixNQUFNLEVBQUUsU0FBUztRQUNqQixRQUFRLEVBQUUsSUFBSTtRQUNkLE1BQU0sRUFBRTtZQUNOLFlBQVksRUFBRSxJQUFJLEdBQUcsRUFBRTtZQUN2QixXQUFXLEVBQUUsS0FBSztZQUNsQixXQUFXLEVBQUUsS0FBSztTQUNuQjtLQUNGLENBQUMsQ0FBQztJQUNILE9BQU87UUFDTCxPQUFPLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7UUFDaEMsU0FBUyxFQUFFLFNBQVM7S0FDckIsQ0FBQztBQUNKLENBQUM7QUFFRDs7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QUMsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUM7Z0JBQzFELGNBQWMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQztnQkFDbEUsQ0FBQyxDQUFDLFVBQVU7b0JBQ1YsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQztvQkFDdkUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDO2FBQy9CLENBQUMsQ0FBQztZQUNILE9BQU87Z0JBQ0wsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJO2dCQUNaLE9BQU8sRUFBRSxhQUFhO2dCQUN0QixVQUFVLEVBQUUsZ0JBQWdCO2FBQzdCLENBQUM7UUFDSixDQUFDLENBQUMsQ0FDSDtLQUNGLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2VyaWFsaXplZE1lc3NhZ2VzLCBBdXRoRW5jTWVzc2FnZSwgQXV0aEVuY01lc3NhZ2VzLCBQYXJ0eUdwZ0tleSwgQXV0aE1lc3NhZ2UgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCAqIGFzIHBncCBmcm9tICdvcGVucGdwJztcblxuLyoqXG4gKiBUb2xlcmFuY2Ugd2luZG93IGZvciBPcGVuUEdQIGRhdGUtYmFzZWQga2V5IHZhbGlkaXR5IGNoZWNrcyAoMjQgaG91cnMpLlxuICpcbiAqIEJhY2tncm91bmQ6IE9wZW5QR1AuanMgdXNlcyB0aGUgYGRhdGVgIHBhcmFtZXRlciB0byBjaGVjayBrZXkgZXhwaXJ5IGF0IGFcbiAqIGdpdmVuIHBvaW50IGluIHRpbWUuIFdlIHByZXZpb3VzbHkgcGFzc2VkIGBkYXRlOiBudWxsYCB0byBkaXNhYmxlIHRoaXMgY2hlY2tcbiAqIGVudGlyZWx5IChzZWUgSFNNLTcwNikgYmVjYXVzZSBPVkMgY29sZC1zaWduaW5nIGZsb3dzIGZvciB0cnVzdCBhbmQgU01DXG4gKiBjbGllbnRzIGNhbiBpbnZvbHZlIHNpZ25pZmljYW50IGNsb2NrIHNrZXcgYmV0d2VlbiB0aGUgc2lnbmluZyBkZXZpY2UgYW5kIHRoZVxuICogc2VydmVyIOKAlCB0aGUgZGV2aWNlIG1heSBiZSBhaXItZ2FwcGVkIGFuZCBpdHMgY2xvY2sgY2FuIGRyaWZ0IGJ5IGhvdXJzLlxuICpcbiAqIE5vdGU6IHRoaXMgR1BHIGV4cGlyeSBjaGVjayBpcyBub3Qgc3RyaWN0bHkgcmVxdWlyZWQgZm9yIHJlcGxheSBwcm90ZWN0aW9uLlxuICogVGhlIERLTFMgcHJvdG9jb2wgaGFzIGl0cyBvd24gbWVjaGFuaXNtIGZvciBwcmV2ZW50aW5nIHJlcGxheSBhdHRhY2tzXG4gKiAoc2Vzc2lvbi1ib3VuZCBjb21taXRtZW50cyBhbmQgcm91bmQtc3BlY2lmaWMgbWVzc2FnZSB2YWxpZGF0aW9uKSwgc28gdGhlXG4gKiBPcGVuUEdQIGRhdGUgY2hlY2sgaXMgYSBkZWZlbnNlLWluLWRlcHRoIG1lYXN1cmUgcmF0aGVyIHRoYW4gdGhlIHByaW1hcnlcbiAqIHJlcGxheSBtaXRpZ2F0aW9uLlxuICpcbiAqIE9wZW5QR1AncyBgZGF0ZWAgcGFyYW1ldGVyIHNoaWZ0cyB0aGUgcmVmZXJlbmNlIHRpbWUgZm9yIEFMTCB0ZW1wb3JhbFxuICogY2hlY2tzIHNpbXVsdGFuZW91c2x5IChrZXkgZXhwaXJ5LCBzZWxmLXNpZ25hdHVyZSB2YWxpZGl0eSwgc2lnbmF0dXJlXG4gKiBmcmVzaG5lc3MpLiBUaGlzIG1lYW5zIGEgc2luZ2xlIHNoaWZ0ZWQgZGF0ZSBjYW5ub3QgaW5kZXBlbmRlbnRseSByZWxheFxuICoga2V5LWV4cGlyeSBjaGVja3Mgd2l0aG91dCBicmVha2luZyBzZWxmLXNpZ25hdHVyZSB2YWxpZGF0aW9uIG9uIGZyZXNoIGtleXMuXG4gKlxuICogVGhlcmVmb3JlOlxuICogLSBlbmNyeXB0L2RlY3J5cHQgb21pdCBgZGF0ZWAgKHVzZSBkZWZhdWx0ID0gY3VycmVudCB0aW1lKSBmb3Igbm9ybWFsIGtleVxuICogICBleHBpcnkgY2hlY2tpbmcgYW5kIHNlbGYtc2lnbmF0dXJlIHZhbGlkYXRpb24uXG4gKiAtIHZlcmlmeSB1c2VzIGBub3cgKyB0b2xlcmFuY2VgIHNvIHRoYXQgc2lnbmF0dXJlcyBmcm9tIE9WQyBkZXZpY2VzIHdob3NlXG4gKiAgIGNsb2NrcyBhcmUgdXAgdG8gMjQgaG91cnMgYWhlYWQgYXJlIG5vdCByZWplY3RlZCBhcyBcImZyb20gdGhlIGZ1dHVyZVwiLlxuICovXG5leHBvcnQgY29uc3QgU0lHTkFUVVJFX0RBVEVfVE9MRVJBTkNFX01TID0gMjQgKiA2MCAqIDYwICogMTAwMDtcblxuLyoqXG4gKiBEZXRhY2ggc2lnbnMgYSBiaW5hcnkgYW5kIGVuY29kZXMgaXQgaW4gYmFzZTY0XG4gKiBAcGFyYW0gZGF0YSBiaW5hcnkgdG8gZW5jb2RlIGluIGJhc2U2NCBhbmQgc2lnblxuICogQHBhcmFtIHByaXZhdGVBcm1vciBwcml2YXRlIGtleSB0byBzaWduIHdpdGhcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRldGFjaFNpZ25EYXRhKGRhdGE6IEJ1ZmZlciwgcHJpdmF0ZUFybW9yOiBzdHJpbmcpOiBQcm9taXNlPEF1dGhNZXNzYWdlPiB7XG4gIGNvbnN0IG1lc3NhZ2UgPSBhd2FpdCBwZ3AuY3JlYXRlTWVzc2FnZSh7IGJpbmFyeTogZGF0YSB9KTtcbiAgY29uc3QgcHJpdmF0ZUtleSA9IGF3YWl0IHBncC5yZWFkUHJpdmF0ZUtleSh7IGFybW9yZWRLZXk6IHByaXZhdGVBcm1vciB9KTtcbiAgY29uc3Qgc2lnbmF0dXJlID0gYXdhaXQgcGdwLnNpZ24oe1xuICAgIG1lc3NhZ2UsXG4gICAgc2lnbmluZ0tleXM6IHByaXZhdGVLZXksXG4gICAgZm9ybWF0OiAnYXJtb3JlZCcsXG4gICAgZGV0YWNoZWQ6IHRydWUsXG4gICAgY29uZmlnOiB7XG4gICAgICByZWplY3RDdXJ2ZXM6IG5ldyBTZXQoKSxcbiAgICAgIHNob3dWZXJzaW9uOiBmYWxzZSxcbiAgICAgIHNob3dDb21tZW50OiBmYWxzZSxcbiAgICB9LFxuICB9KTtcbiAgcmV0dXJuIHtcbiAgICBtZXNzYWdlOiBkYXRhLnRvU3RyaW5nKCdiYXNlNjQnKSxcbiAgICBzaWduYXR1cmU6IHNpZ25hdHVyZSxcbiAgfTtcbn1cblxuLyoqXG4gKiBFbmNyeXB0cyBhbmQgZGV0YWNoIHNpZ25zIGEgYmluYXJ5XG4gKiBAcGFyYW0gZGF0YSBiaW5hcnkgdG8gZW5jcnlwdCBhbmQgc2lnblxuICogQHBhcmFtIHB1YmxpY0FybW9yIHB1YmxpYyBrZXkgdG8gZW5jcnlwdCB3aXRoXG4gKiBAcGFyYW0gcHJpdmF0ZUFybW9yIHByaXZhdGUga2V5IHRvIHNpZ24gd2l0aFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5jcnlwdEFuZERldGFjaFNpZ25EYXRhKFxuICBkYXRhOiBCdWZmZXIsXG4gIHB1YmxpY0FybW9yOiBzdHJpbmcsXG4gIHByaXZhdGVBcm1vcjogc3RyaW5nXG4pOiBQcm9taXNlPEF1dGhFbmNNZXNzYWdlPiB7XG4gIGNvbnN0IG1lc3NhZ2UgPSBhd2FpdCBwZ3AuY3JlYXRlTWVzc2FnZSh7IGJpbmFyeTogZGF0YSB9KTtcbiAgY29uc3QgcHVibGljS2V5ID0gYXdhaXQgcGdwLnJlYWRLZXkoeyBhcm1vcmVkS2V5OiBwdWJsaWNBcm1vciB9KTtcbiAgY29uc3QgcHJpdmF0ZUtleSA9IGF3YWl0IHBncC5yZWFkUHJpdmF0ZUtleSh7IGFybW9yZWRLZXk6IHByaXZhdGVBcm1vciB9KTtcbiAgY29uc3QgZW5jcnlwdGVkTWVzc2FnZSA9IGF3YWl0IHBncC5lbmNyeXB0KHtcbiAgICBtZXNzYWdlLFxuICAgIGVuY3J5cHRpb25LZXlzOiBwdWJsaWNLZXksXG4gICAgZm9ybWF0OiAnYXJtb3JlZCcsXG4gICAgY29uZmlnOiB7XG4gICAgICByZWplY3RDdXJ2ZXM6IG5ldyBTZXQoKSxcbiAgICAgIHNob3dWZXJzaW9uOiBmYWxzZSxcbiAgICAgIHNob3dDb21tZW50OiBmYWxzZSxcbiAgICB9LFxuICB9KTtcbiAgY29uc3Qgc2lnbmF0dXJlID0gYXdhaXQgcGdwLnNpZ24oe1xuICAgIG1lc3NhZ2UsXG4gICAgc2lnbmluZ0tleXM6IHByaXZhdGVLZXksXG4gICAgZm9ybWF0OiAnYXJtb3JlZCcsXG4gICAgZGV0YWNoZWQ6IHRydWUsXG4gICAgY29uZmlnOiB7XG4gICAgICByZWplY3RDdXJ2ZXM6IG5ldyBTZXQoKSxcbiAgICAgIHNob3dWZXJzaW9uOiBmYWxzZSxcbiAgICAgIHNob3dDb21tZW50OiBmYWxzZSxcbiAgICB9LFxuICB9KTtcbiAgcmV0dXJuIHtcbiAgICBlbmNyeXB0ZWRNZXNzYWdlOiBlbmNyeXB0ZWRNZXNzYWdlLFxuICAgIHNpZ25hdHVyZTogc2lnbmF0dXJlLFxuICB9O1xufVxuXG4vKipcbiAqIERlY3J5cHRzIGFuZCB2ZXJpZmllcyBzaWduYXR1cmUgb24gYSBiaW5hcnlcbiAqIEBwYXJhbSBlbmNyeXB0ZWRBbmRTaWduZWRNZXNzYWdlIG1lc3NhZ2UgdG8gZGVjcnlwdCBhbmQgdmVyaWZ5XG4gKiBAcGFyYW0gcHVibGljQXJtb3IgcHVibGljIGtleSB0byB2ZXJpZnkgc2lnbmF0dXJlIHdpdGhcbiAqIEBwYXJhbSBwcml2YXRlQXJtb3IgcHJpdmF0ZSBrZXkgdG8gZGVjcnlwdCB3aXRoXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWNyeXB0QW5kVmVyaWZ5U2lnbmVkRGF0YShcbiAgZW5jcnlwdGVkQW5kU2lnbmVkTWVzc2FnZTogQXV0aEVuY01lc3NhZ2UsXG4gIHB1YmxpY0FybW9yOiBzdHJpbmcsXG4gIHByaXZhdGVBcm1vcjogc3RyaW5nXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBwdWJsaWNLZXkgPSBhd2FpdCBwZ3AucmVhZEtleSh7IGFybW9yZWRLZXk6IHB1YmxpY0FybW9yIH0pO1xuICBjb25zdCBwcml2YXRlS2V5ID0gYXdhaXQgcGdwLnJlYWRQcml2YXRlS2V5KHsgYXJtb3JlZEtleTogcHJpdmF0ZUFybW9yIH0pO1xuICBjb25zdCBkZWNyeXB0ZWRNZXNzYWdlID0gYXdhaXQgcGdwLmRlY3J5cHQoe1xuICAgIG1lc3NhZ2U6IGF3YWl0IHBncC5yZWFkTWVzc2FnZSh7IGFybW9yZWRNZXNzYWdlOiBlbmNyeXB0ZWRBbmRTaWduZWRNZXNzYWdlLmVuY3J5cHRlZE1lc3NhZ2UgfSksXG4gICAgZGVjcnlwdGlvbktleXM6IFtwcml2YXRlS2V5XSxcbiAgICBjb25maWc6IHtcbiAgICAgIHJlamVjdEN1cnZlczogbmV3IFNldCgpLFxuICAgICAgc2hvd1ZlcnNpb246IGZhbHNlLFxuICAgICAgc2hvd0NvbW1lbnQ6IGZhbHNlLFxuICAgIH0sXG4gICAgZm9ybWF0OiAnYmluYXJ5JyxcbiAgfSk7XG4gIGNvbnN0IHZlcmlmaWNhdGlvblJlc3VsdCA9IGF3YWl0IHBncC52ZXJpZnkoe1xuICAgIG1lc3NhZ2U6IGF3YWl0IHBncC5jcmVhdGVNZXNzYWdlKHsgYmluYXJ5OiBkZWNyeXB0ZWRNZXNzYWdlLmRhdGEgfSksXG4gICAgc2lnbmF0dXJlOiBhd2FpdCBwZ3AucmVhZFNpZ25hdHVyZSh7IGFybW9yZWRTaWduYXR1cmU6IGVuY3J5cHRlZEFuZFNpZ25lZE1lc3NhZ2Uuc2lnbmF0dXJlIH0pLFxuICAgIHZlcmlmaWNhdGlvbktleXM6IHB1YmxpY0tleSxcbiAgICBkYXRlOiBuZXcgRGF0ZShEYXRlLm5vdygpICsgU0lHTkFUVVJFX0RBVEVfVE9MRVJBTkNFX01TKSxcbiAgfSk7XG4gIGF3YWl0IHZlcmlmaWNhdGlvblJlc3VsdC5zaWduYXR1cmVzWzBdLnZlcmlmaWVkO1xuICByZXR1cm4gQnVmZmVyLmZyb20oZGVjcnlwdGVkTWVzc2FnZS5kYXRhKS50b1N0cmluZygnYmFzZTY0Jyk7XG59XG5cbi8qKlxuICogVmVyaWZpZXMgc2lnbmF0dXJlIG9uIGEgYmluYXJ5IChtZXNzYWdlIHBhc3NlZCBzaG91bGQgYmUgZW5jb2RlZCBpbiBiYXNlNjQpLlxuICogQHBhcmFtIHNpZ25lZE1lc3NhZ2UgbWVzc2FnZSB0byB2ZXJpZnlcbiAqIEBwYXJhbSBwdWJsaWNBcm1vciBwdWJsaWMga2V5IHRvIHZlcmlmeSBzaWduYXR1cmUgd2l0aFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdmVyaWZ5U2lnbmVkRGF0YShzaWduZWRNZXNzYWdlOiBBdXRoTWVzc2FnZSwgcHVibGljQXJtb3I6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBwdWJsaWNLZXkgPSBhd2FpdCBwZ3AucmVhZEtleSh7IGFybW9yZWRLZXk6IHB1YmxpY0FybW9yIH0pO1xuICBjb25zdCB2ZXJpZmljYXRpb25SZXN1bHQgPSBhd2FpdCBwZ3AudmVyaWZ5KHtcbiAgICBtZXNzYWdlOiBhd2FpdCBwZ3AuY3JlYXRlTWVzc2FnZSh7IGJpbmFyeTogQnVmZmVyLmZyb20oc2lnbmVkTWVzc2FnZS5tZXNzYWdlLCAnYmFzZTY0JykgfSksXG4gICAgc2lnbmF0dXJlOiBhd2FpdCBwZ3AucmVhZFNpZ25hdHVyZSh7IGFybW9yZWRTaWduYXR1cmU6IHNpZ25lZE1lc3NhZ2Uuc2lnbmF0dXJlIH0pLFxuICAgIHZlcmlmaWNhdGlvbktleXM6IHB1YmxpY0tleSxcbiAgICBkYXRlOiBuZXcgRGF0ZShEYXRlLm5vdygpICsgU0lHTkFUVVJFX0RBVEVfVE9MRVJBTkNFX01TKSxcbiAgfSk7XG4gIHRyeSB7XG4gICAgYXdhaXQgdmVyaWZpY2F0aW9uUmVzdWx0LnNpZ25hdHVyZXNbMF0udmVyaWZpZWQ7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBEZWNyeXB0cyBhbmQgdmVyaWZpZXMgcDJwIG1lc3NhZ2VzICsgdmVyaWZpZXMgYnJvYWRjYXN0IG1lc3NhZ2VzXG4gKiBAcGFyYW0gbWVzc2FnZXMgbWVzc2FnZSB0byBkZWNyeXB0IGFuZCB2ZXJpZnlcbiAqIEBwYXJhbSBwdWJWZXJpZmljYXRpb25HcGdLZXlzIHB1YmxpYyBrZXlzIHRvIHZlcmlmeSBzaWduYXR1cmVzIHdpdGhcbiAqIEBwYXJhbSBwcnZEZWNyeXB0aW9uR3BnS2V5cyBwcml2YXRlIGtleXMgdG8gZGVjcnlwdCB3aXRoXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWNyeXB0QW5kVmVyaWZ5SW5jb21pbmdNZXNzYWdlcyhcbiAgbWVzc2FnZXM6IEF1dGhFbmNNZXNzYWdlcyxcbiAgcHViVmVyaWZpY2F0aW9uR3BnS2V5czogUGFydHlHcGdLZXlbXSxcbiAgcHJ2RGVjcnlwdGlvbkdwZ0tleXM6IFBhcnR5R3BnS2V5W11cbik6IFByb21pc2U8U2VyaWFsaXplZE1lc3NhZ2VzPiB7XG4gIHJldHVybiB7XG4gICAgcDJwTWVzc2FnZXM6IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbWVzc2FnZXMucDJwTWVzc2FnZXMubWFwKGFzeW5jIChtKSA9PiB7XG4gICAgICAgIGNvbnN0IHB1YkdwZ0tleSA9IHB1YlZlcmlmaWNhdGlvbkdwZ0tleXMuZmluZCgoaykgPT4gay5wYXJ0eUlkID09PSBtLmZyb20pO1xuICAgICAgICBjb25zdCBwcnZHcGdLZXkgPSBwcnZEZWNyeXB0aW9uR3BnS2V5cy5maW5kKChrKSA9PiBrLnBhcnR5SWQgPT09IG0udG8pO1xuICAgICAgICBpZiAoIXB1YkdwZ0tleSkge1xuICAgICAgICAgIHRocm93IEVycm9yKGBObyBwdWJsaWMga2V5IHByb3ZpZGVkIGZvciBzZW5kZXIgd2l0aCBJRDogJHttLmZyb219YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFwcnZHcGdLZXkpIHtcbiAgICAgICAgICB0aHJvdyBFcnJvcihgTm8gcHJpdmF0ZSBrZXkgcHJvdmlkZWQgZm9yIHJlY2VwaWVudCB3aXRoIElEOiAke20udG99YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0bzogbS50byxcbiAgICAgICAgICBmcm9tOiBtLmZyb20sXG4gICAgICAgICAgcGF5bG9hZDogYXdhaXQgZGVjcnlwdEFuZFZlcmlmeVNpZ25lZERhdGEobS5wYXlsb2FkLCBwdWJHcGdLZXkuZ3BnS2V5LCBwcnZHcGdLZXkuZ3BnS2V5KSxcbiAgICAgICAgICBjb21taXRtZW50OiBtLmNvbW1pdG1lbnQsXG4gICAgICAgIH07XG4gICAgICB9KVxuICAgICksXG4gICAgYnJvYWRjYXN0TWVzc2FnZXM6IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbWVzc2FnZXMuYnJvYWRjYXN0TWVzc2FnZXMubWFwKGFzeW5jIChtKSA9PiB7XG4gICAgICAgIGNvbnN0IHB1YkdwZ0tleSA9IHB1YlZlcmlmaWNhdGlvbkdwZ0tleXMuZmluZCgoaykgPT4gay5wYXJ0eUlkID09PSBtLmZyb20pO1xuICAgICAgICBpZiAoIXB1YkdwZ0tleSkge1xuICAgICAgICAgIHRocm93IEVycm9yKGBObyBwdWJsaWMga2V5IHByb3ZpZGVkIGZvciBzZW5kZXIgd2l0aCBJRDogJHttLmZyb219YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEoYXdhaXQgdmVyaWZ5U2lnbmVkRGF0YShtLnBheWxvYWQsIHB1YkdwZ0tleS5ncGdLZXkpKSkge1xuICAgICAgICAgIHRocm93IEVycm9yKGBGYWlsZWQgdG8gYXV0aGVudGljYXRlIGJyb2FkY2FzdCBtZXNzYWdlIGZyb20gcGFydHk6ICR7bS5mcm9tfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtLnNpZ25hdHVyZVIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmICghKGF3YWl0IHZlcmlmeVNpZ25lZERhdGEobS5zaWduYXR1cmVSLCBwdWJHcGdLZXkuZ3BnS2V5KSkpIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKGBGYWlsZWQgdG8gYXV0aGVudGljYXRlIHNpZ25hdHVyZVIgaW4gYnJvYWRjYXN0IG1lc3NhZ2UgZnJvbSBwYXJ0eTogJHttLmZyb219YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZnJvbTogbS5mcm9tLFxuICAgICAgICAgIHBheWxvYWQ6IG0ucGF5bG9hZC5tZXNzYWdlLFxuICAgICAgICAgIHNpZ25hdHVyZVI6IG0uc2lnbmF0dXJlUj8ubWVzc2FnZSxcbiAgICAgICAgfTtcbiAgICAgIH0pXG4gICAgKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBFbmNyeXB0cyBhbmQgc2lnbnMgcDJwIG1lc3NhZ2VzICsgc2lnbnMgYnJvYWRjYXN0IG1lc3NhZ2VzXG4gKiBAcGFyYW0gbWVzc2FnZXMgbWVzc2FnZXMgdG8gZW5jcnlwdCBhbmQgc2lnblxuICogQHBhcmFtIHB1YkVuY3J5cHRpb25HcGdLZXkgcHVibGljIGtleXMgdG8gZW5jcnlwdCBkYXRhIHRvXG4gKiBAcGFyYW0gcHJ2QXV0aGVudGljYXRpb25HcGdLZXkgcHJpdmF0ZSBrZXlzIHRvIHNpZ24gd2l0aFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5jcnlwdEFuZEF1dGhPdXRnb2luZ01lc3NhZ2VzKFxuICBtZXNzYWdlczogU2VyaWFsaXplZE1lc3NhZ2VzLFxuICBwdWJFbmNyeXB0aW9uR3BnS2V5czogUGFydHlHcGdLZXlbXSxcbiAgcHJ2QXV0aGVudGljYXRpb25HcGdLZXlzOiBQYXJ0eUdwZ0tleVtdXG4pOiBQcm9taXNlPEF1dGhFbmNNZXNzYWdlcz4ge1xuICByZXR1cm4ge1xuICAgIHAycE1lc3NhZ2VzOiBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIG1lc3NhZ2VzLnAycE1lc3NhZ2VzLm1hcChhc3luYyAobSkgPT4ge1xuICAgICAgICBjb25zdCBwdWJHcGdLZXkgPSBwdWJFbmNyeXB0aW9uR3BnS2V5cy5maW5kKChrKSA9PiBrLnBhcnR5SWQgPT09IG0udG8pO1xuICAgICAgICBjb25zdCBwcnZHcGdLZXkgPSBwcnZBdXRoZW50aWNhdGlvbkdwZ0tleXMuZmluZCgoaykgPT4gay5wYXJ0eUlkID09PSBtLmZyb20pO1xuICAgICAgICBpZiAoIXB1YkdwZ0tleSkge1xuICAgICAgICAgIHRocm93IEVycm9yKGBObyBwdWJsaWMga2V5IHByb3ZpZGVkIGZvciByZWNpcGllbnQgd2l0aCBJRDogJHttLnRvfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcHJ2R3BnS2V5KSB7XG4gICAgICAgICAgdGhyb3cgRXJyb3IoYE5vIHByaXZhdGUga2V5IHByb3ZpZGVkIGZvciBzZW5kZXIgd2l0aCBJRDogJHttLmZyb219YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0bzogbS50byxcbiAgICAgICAgICBmcm9tOiBtLmZyb20sXG4gICAgICAgICAgcGF5bG9hZDogYXdhaXQgZW5jcnlwdEFuZERldGFjaFNpZ25EYXRhKEJ1ZmZlci5mcm9tKG0ucGF5bG9hZCwgJ2Jhc2U2NCcpLCBwdWJHcGdLZXkuZ3BnS2V5LCBwcnZHcGdLZXkuZ3BnS2V5KSxcbiAgICAgICAgICBjb21taXRtZW50OiBtLmNvbW1pdG1lbnQsXG4gICAgICAgIH07XG4gICAgICB9KVxuICAgICksXG4gICAgYnJvYWRjYXN0TWVzc2FnZXM6IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbWVzc2FnZXMuYnJvYWRjYXN0TWVzc2FnZXMubWFwKGFzeW5jIChtKSA9PiB7XG4gICAgICAgIGNvbnN0IHBydkdwZ0tleSA9IHBydkF1dGhlbnRpY2F0aW9uR3BnS2V5cy5maW5kKChrKSA9PiBrLnBhcnR5SWQgPT09IG0uZnJvbSk7XG4gICAgICAgIGlmICghcHJ2R3BnS2V5KSB7XG4gICAgICAgICAgdGhyb3cgRXJyb3IoYE5vIHByaXZhdGUga2V5IHByb3ZpZGVkIGZvciBzZW5kZXIgd2l0aCBJRDogJHttLmZyb219YCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgW3NpZ25lZFBheWxvYWQsIHNpZ25lZFNpZ25hdHVyZVJdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgIGRldGFjaFNpZ25EYXRhKEJ1ZmZlci5mcm9tKG0ucGF5bG9hZCwgJ2Jhc2U2NCcpLCBwcnZHcGdLZXkuZ3BnS2V5KSxcbiAgICAgICAgICBtLnNpZ25hdHVyZVJcbiAgICAgICAgICAgID8gZGV0YWNoU2lnbkRhdGEoQnVmZmVyLmZyb20obS5zaWduYXR1cmVSLCAnYmFzZTY0JyksIHBydkdwZ0tleS5ncGdLZXkpXG4gICAgICAgICAgICA6IFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpLFxuICAgICAgICBdKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBmcm9tOiBtLmZyb20sXG4gICAgICAgICAgcGF5bG9hZDogc2lnbmVkUGF5bG9hZCxcbiAgICAgICAgICBzaWduYXR1cmVSOiBzaWduZWRTaWduYXR1cmVSLFxuICAgICAgICB9O1xuICAgICAgfSlcbiAgICApLFxuICB9O1xufVxuIl19
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import type { HardDeriveSession as DklsHardDeriveSession, VrfKeygenSession as DklsVrfKeygenSession } from '@silencelaboratories/dkls-wasm-ll-vrf-node';
|
|
2
|
+
import type { HardDeriveSession as DklsVrfWebHardDeriveSession, VrfKeygenSession as DklsVrfWebKeygenSession } from '@silencelaboratories/dkls-wasm-ll-vrf-web';
|
|
3
|
+
import { Buffer } from 'buffer';
|
|
4
|
+
import { DeserializedBroadcastMessage, DeserializedMessages } from './types';
|
|
5
|
+
type NodeVrfWasmer = typeof import('@silencelaboratories/dkls-wasm-ll-vrf-node');
|
|
6
|
+
type WebVrfWasmer = typeof import('@silencelaboratories/dkls-wasm-ll-vrf-web');
|
|
7
|
+
type BundlerVrfWasmer = typeof import('@silencelaboratories/dkls-wasm-ll-vrf-bundler');
|
|
8
|
+
type VrfWasm = NodeVrfWasmer | WebVrfWasmer | BundlerVrfWasmer;
|
|
9
|
+
export type { DklsHardDeriveSession, DklsVrfWebHardDeriveSession, DklsVrfKeygenSession, DklsVrfWebKeygenSession };
|
|
10
|
+
export declare enum DeriveState {
|
|
11
|
+
Uninitialized = 0,
|
|
12
|
+
Round1 = 1,
|
|
13
|
+
Round2 = 2,
|
|
14
|
+
Complete = 3,
|
|
15
|
+
InvalidState = 4
|
|
16
|
+
}
|
|
17
|
+
export interface DeriveSessionData {
|
|
18
|
+
deriveSessionBytes: Uint8Array;
|
|
19
|
+
deriveState: DeriveState;
|
|
20
|
+
keyShareBuff?: Buffer;
|
|
21
|
+
ownMsg1?: Uint8Array;
|
|
22
|
+
ownMsg2?: Uint8Array;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Round driver for the DKLS23 hard-derivation protocol (Ristretto VRF backed),
|
|
26
|
+
* which derives a child signing keyshare from a root keyshare and its VRF keyshare.
|
|
27
|
+
*
|
|
28
|
+
* Each session is a 2-party threshold protocol between this party and one partner:
|
|
29
|
+
* every round accepts exactly two broadcast messages — this party's own (created by
|
|
30
|
+
* `initDerive()` and re-fed automatically) and the partner's. A ceremony runs one
|
|
31
|
+
* `Derive` per SDK party, each paired with the BitGo party:
|
|
32
|
+
*
|
|
33
|
+
* - Round 1 (`WaitMsg1`): consume `{own msg1, partner msg1}`, emit own broadcast msg2.
|
|
34
|
+
* - Round 2 (`WaitMsg2`): consume `{own msg2, partner msg2}`, finalize the session
|
|
35
|
+
* and extract the derived DKLS `Keyshare`.
|
|
36
|
+
*
|
|
37
|
+
* The session is seeded from the decrypted root blob: the DKLS signing keyshare and
|
|
38
|
+
* the Ristretto VRF keyshare produced by root keygen, plus the child's hardened
|
|
39
|
+
* derivation path.
|
|
40
|
+
*
|
|
41
|
+
* Party indices follow the MPCv2 convention: 0 = user, 1 = backup, 2 = bitgo.
|
|
42
|
+
*/
|
|
43
|
+
export declare class Derive {
|
|
44
|
+
protected deriveSession: DklsHardDeriveSession | DklsVrfWebHardDeriveSession | undefined;
|
|
45
|
+
protected deriveSessionBytes: Uint8Array;
|
|
46
|
+
protected keyShareBuff: Buffer | undefined;
|
|
47
|
+
protected n: number;
|
|
48
|
+
protected t: number;
|
|
49
|
+
protected partyIdx: number;
|
|
50
|
+
protected rootKeyShare: Buffer;
|
|
51
|
+
protected vrfKeyShare: Buffer;
|
|
52
|
+
protected path: Uint8Array;
|
|
53
|
+
protected seed: Buffer | undefined;
|
|
54
|
+
protected deriveState: DeriveState;
|
|
55
|
+
protected vrfWasm: VrfWasm | null;
|
|
56
|
+
protected ownMsg1: Uint8Array | undefined;
|
|
57
|
+
protected ownMsg2: Uint8Array | undefined;
|
|
58
|
+
constructor(n: number, t: number, partyIdx: number, rootKeyShare: Buffer, vrfKeyShare: Buffer, path: Uint8Array, seed?: Buffer, vrfWasm?: BundlerVrfWasmer);
|
|
59
|
+
private loadVrfWasm;
|
|
60
|
+
private getVrfWasm;
|
|
61
|
+
private _restoreSession;
|
|
62
|
+
/**
|
|
63
|
+
* Re-derive the round state from the wasm session bytes instead of trusting a
|
|
64
|
+
* caller-supplied enum. The wasm embeds the round tag (`WaitMsg1`/`WaitMsg2`,
|
|
65
|
+
* then a `Share` payload once finalized) for exactly this reason.
|
|
66
|
+
*/
|
|
67
|
+
private _deserializeState;
|
|
68
|
+
/**
|
|
69
|
+
* Create this party's first hard-derive message (broadcast). Seeds the wasm
|
|
70
|
+
* session from the root keyshare, VRF keyshare and derivation path.
|
|
71
|
+
*/
|
|
72
|
+
initDerive(): Promise<DeserializedBroadcastMessage>;
|
|
73
|
+
/**
|
|
74
|
+
* Process the messages this party holds for the current round and return this
|
|
75
|
+
* party's messages for the next round. Callers pass the partner's broadcast
|
|
76
|
+
* message only; this party's own message is re-fed automatically because the
|
|
77
|
+
* wasm session validates the sender set as `{self, partner}`.
|
|
78
|
+
*
|
|
79
|
+
* - Round 1 (WaitMsg1): consumes `{own msg1, partner msg1}` and emits this
|
|
80
|
+
* party's broadcast msg2.
|
|
81
|
+
* - Round 2 (WaitMsg2): consumes `{own msg2, partner msg2}` and finalizes the
|
|
82
|
+
* session, returning no messages.
|
|
83
|
+
*/
|
|
84
|
+
handleIncomingMessages(messagesForIthRound: DeserializedMessages): DeserializedMessages;
|
|
85
|
+
/**
|
|
86
|
+
* Get the derived DKLS keyshare bytes (CBOR `Keyshare`) once the derive is
|
|
87
|
+
* complete. This buffer is private key material.
|
|
88
|
+
*/
|
|
89
|
+
getKeyShare(): Buffer;
|
|
90
|
+
/**
|
|
91
|
+
* Returns a CBOR-encoded ReducedKeyShare buffer containing the derived party's
|
|
92
|
+
* private scalar (s_i) in the `prv` field. This buffer is private key material;
|
|
93
|
+
* the caller encrypts it as `reducedEncryptedPrv`, matching `Dkg.getReducedKeyShare`.
|
|
94
|
+
*/
|
|
95
|
+
getReducedKeyShare(): Buffer;
|
|
96
|
+
/**
|
|
97
|
+
* Get the current session data that can be used to restore the session later.
|
|
98
|
+
*
|
|
99
|
+
* The returned session bytes are secret key material — they carry this party's
|
|
100
|
+
* root keyshares. They must never be logged or persisted in the clear; the
|
|
101
|
+
* caller encrypts them exactly like the key share itself.
|
|
102
|
+
*/
|
|
103
|
+
getSessionData(): DeriveSessionData;
|
|
104
|
+
/**
|
|
105
|
+
* Restore a session snapshot captured after initDerive() or round 1 processing.
|
|
106
|
+
* Do not call this before initDerive() has created session bytes.
|
|
107
|
+
* The round state is re-derived from the wasm session bytes, not the caller enum.
|
|
108
|
+
*/
|
|
109
|
+
static restoreSession(n: number, t: number, partyIdx: number, rootKeyShare: Buffer, vrfKeyShare: Buffer, path: Uint8Array, sessionData: DeriveSessionData, seed?: Buffer, vrfWasm?: BundlerVrfWasmer): Promise<Derive>;
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=derive.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"derive.d.ts","sourceRoot":"","sources":["../../../../src/tss/ecdsa-dkls/derive.ts"],"names":[],"mappings":"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"}
|