Skip to content

Commit 73943f4

Browse files
committed
feat(sdk-lib-mpc): upgrade EdDSA WASM libs and add tests
- Bump EdDSA WASM dependencies to 1.0.0-pre.5 - Add EdDSA utility function tests - Add type definitions for DKG session Ticket: WP-8197
1 parent 0b7f453 commit 73943f4

5 files changed

Lines changed: 101 additions & 23 deletions

File tree

modules/sdk-lib-mpc/package.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@
3939
"@noble/curves": "1.8.1",
4040
"@silencelaboratories/dkls-wasm-ll-node": "1.2.0-pre.4",
4141
"@silencelaboratories/dkls-wasm-ll-web": "1.2.0-pre.4",
42-
"@silencelaboratories/eddsa-wasm-ll-node": "1.0.0-pre.3",
43-
"@silencelaboratories/eddsa-wasm-ll-web": "1.0.0-pre.3",
42+
"@silencelaboratories/eddsa-wasm-ll-node": "1.0.0-pre.4",
43+
"@silencelaboratories/eddsa-wasm-ll-web": "1.0.0-pre.4",
4444
"@types/superagent": "4.1.15",
4545
"@wasmer/wasi": "^1.2.2",
4646
"bigint-crypto-utils": "3.1.4",
@@ -56,7 +56,7 @@
5656
"devDependencies": {
5757
"@bitgo/sdk-opensslbytes": "^2.1.0",
5858
"@silencelaboratories/dkls-wasm-ll-bundler": "1.2.0-pre.4",
59-
"@silencelaboratories/eddsa-wasm-ll-bundler": "1.0.0-pre.3",
59+
"@silencelaboratories/eddsa-wasm-ll-bundler": "1.0.0-pre.4",
6060
"@types/lodash": "^4.14.151",
6161
"@types/node": "^24.10.9",
6262
"@types/sjcl": "1.0.34",
@@ -65,7 +65,7 @@
6565
},
6666
"peerDependencies": {
6767
"@silencelaboratories/dkls-wasm-ll-bundler": "1.2.0-pre.4",
68-
"@silencelaboratories/eddsa-wasm-ll-bundler": "1.0.0-pre.3"
68+
"@silencelaboratories/eddsa-wasm-ll-bundler": "1.0.0-pre.4"
6969
},
7070
"peerDependenciesMeta": {
7171
"@silencelaboratories/dkls-wasm-ll-bundler": {

modules/sdk-lib-mpc/src/tss/eddsa-mps/dkg.ts

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
11
import type { EncryptionKeyPair, KeygenSession } from '@silencelaboratories/eddsa-wasm-ll-node';
2-
import { DeserializedBroadcastMessage } from '../ecdsa-dkls/types';
32
import { decode, encode } from 'cbor-x';
4-
import { BundlerWasmer, EddsaMPSWasm, EddsaReducedKeyShare, DkgState } from './types';
3+
import {
4+
BundlerWasmer,
5+
EddsaMPSWasm,
6+
EddsaReducedKeyShare,
7+
DkgState,
8+
DeserializedMessage,
9+
DeserializedMessages,
10+
} from './types';
511

612
/**
713
* EdDSA Distributed Key Generation (DKG) implementation using multi-Party Schnorr protocol
@@ -195,7 +201,7 @@ export class DKG {
195201
*
196202
* @throws {Error} If DKG session is not initialized
197203
*/
198-
getFirstMessage(): DeserializedBroadcastMessage {
204+
getFirstMessage(): DeserializedMessage {
199205
this.ensureDkgSessionInitialized();
200206
const message = this.dkgSession!.createFirstMessage();
201207
const returnMessage = {
@@ -236,7 +242,7 @@ export class DKG {
236242
* @throws {Error} If DKG session is in Init state (must call getFirstMessage first)
237243
* @throws {Error} If number of messages doesn't match expected count (n)
238244
*/
239-
handleIncomingMessages(messagesForIthRound: DeserializedBroadcastMessage[]): DeserializedBroadcastMessage[] {
245+
handleIncomingMessages(messagesForIthRound: DeserializedMessages): DeserializedMessages {
240246
if (this.dkgState === DkgState.Complete) {
241247
throw Error('DKG session already completed');
242248
}

modules/sdk-lib-mpc/src/tss/eddsa-mps/types.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,3 +43,16 @@ export enum DkgState {
4343
/** DKG session has completed successfully and key shares are available */
4444
Complete = 'Complete',
4545
}
46+
47+
export interface Message<T> {
48+
payload: T;
49+
from: number;
50+
}
51+
52+
export type SerializedMessage = Message<string>;
53+
54+
export type SerializedMessages = Message<string>[];
55+
56+
export type DeserializedMessage = Message<Uint8Array>;
57+
58+
export type DeserializedMessages = Message<Uint8Array>[];

modules/sdk-lib-mpc/test/unit/tss/eddsa/eddsa-utils.ts

Lines changed: 60 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,21 @@
11
import assert from 'assert';
2-
import { concatBytes } from '../../../../src/tss/eddsa-mps/util';
2+
import { encode } from 'cbor-x';
3+
import { concatBytes, fetchMaterial } from '../../../../src/tss/eddsa-mps/util';
4+
5+
function makeShareBuffer(overrides: Partial<Record<string, unknown>> = {}): Buffer {
6+
const share = {
7+
threshold: 2,
8+
total_parties: 3,
9+
party_id: 0,
10+
d_i: new Uint8Array([0xaa, 0xbb, 0xcc]),
11+
public_key: new Uint8Array([0x01, 0x02, 0x03, 0x04]),
12+
key_id: new Uint8Array([0x10, 0x20]),
13+
root_chain_code: new Uint8Array([0xde, 0xad, 0xbe, 0xef]),
14+
final_session_id: new Uint8Array([0xff, 0x00]),
15+
...overrides,
16+
};
17+
return Buffer.from(encode(share));
18+
}
319

420
describe('EdDSA Utility Functions', function () {
521
describe('concatBytes', function () {
@@ -14,4 +30,47 @@ describe('EdDSA Utility Functions', function () {
1430
assert.deepStrictEqual(result, expected, 'concatBytes should concatenate arrays correctly');
1531
});
1632
});
33+
34+
describe('fetchMaterial', function () {
35+
it('should return empty array for empty input', function () {
36+
assert.deepStrictEqual(fetchMaterial([]), []);
37+
});
38+
39+
it('should decode a single share and convert byte fields to hex', function () {
40+
const [result] = fetchMaterial([makeShareBuffer()]);
41+
42+
assert.strictEqual(result.threshold, 2);
43+
assert.strictEqual(result.total_parties, 3);
44+
assert.strictEqual(result.party_id, 0);
45+
assert.strictEqual(result.d_i, 'aabbcc');
46+
assert.strictEqual(result.public_key, '01020304');
47+
assert.strictEqual(result.key_id, '1020');
48+
assert.strictEqual(result.root_chain_code, 'deadbeef');
49+
assert.strictEqual(result.final_session_id, 'ff00');
50+
});
51+
52+
it('should decode multiple shares preserving per-party fields', function () {
53+
const share0 = makeShareBuffer({ party_id: 0, d_i: new Uint8Array([0x01]) });
54+
const share1 = makeShareBuffer({ party_id: 1, d_i: new Uint8Array([0x02]) });
55+
const share2 = makeShareBuffer({ party_id: 2, d_i: new Uint8Array([0x03]) });
56+
57+
const results = fetchMaterial([share0, share1, share2]);
58+
59+
assert.strictEqual(results.length, 3);
60+
assert.strictEqual(results[0].party_id, 0);
61+
assert.strictEqual(results[1].party_id, 1);
62+
assert.strictEqual(results[2].party_id, 2);
63+
64+
assert.strictEqual(results[0].d_i, '01');
65+
assert.strictEqual(results[1].d_i, '02');
66+
assert.strictEqual(results[2].d_i, '03');
67+
68+
// Shared fields should be the same across shares
69+
results.forEach((r) => {
70+
assert.strictEqual(r.threshold, 2);
71+
assert.strictEqual(r.total_parties, 3);
72+
assert.strictEqual(r.public_key, '01020304');
73+
});
74+
});
75+
});
1776
});

yarn.lock

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5035,20 +5035,20 @@
50355035
resolved "https://registry.npmjs.org/@silencelaboratories/dkls-wasm-ll-web/-/dkls-wasm-ll-web-1.2.0-pre.4.tgz"
50365036
integrity sha512-RDyGVX6nyABPchnucl4IOV78LWzXBV9QucRiitRNONo3pfO4z375T00lI/wPiId13wXb8YNkB1Ej90hBNUK25A==
50375037

5038-
"@silencelaboratories/eddsa-wasm-ll-bundler@1.0.0-pre.3":
5039-
version "1.0.0-pre.3"
5040-
resolved "https://registry.npmjs.org/@silencelaboratories/eddsa-wasm-ll-bundler/-/eddsa-wasm-ll-bundler-1.0.0-pre.3.tgz#cdc8afaffdd9b2c7a3c99f9da3bdb982d51d31a0"
5041-
integrity sha512-RKzUijwOr4PGDb8/i9A3eFxnuecSnp4M1ILoW5Vl0U1LT096pSpQEkzvzfK61HoFBQMxJjaK45tNcgkCG2a6Pg==
5042-
5043-
"@silencelaboratories/eddsa-wasm-ll-node@1.0.0-pre.3":
5044-
version "1.0.0-pre.3"
5045-
resolved "https://registry.npmjs.org/@silencelaboratories/eddsa-wasm-ll-node/-/eddsa-wasm-ll-node-1.0.0-pre.3.tgz#b3d5a4cf9e1afe0866d3b13d6ed67ad0fec858f9"
5046-
integrity sha512-siVHrc1ixWpqQTPj0V9BXsbg4SLUPF6N0kZgPp+QRTvXxf4MwmmehEZfUdFFEBpUeI8GSduHjAnwLSpyQMyu/g==
5047-
5048-
"@silencelaboratories/eddsa-wasm-ll-web@1.0.0-pre.3":
5049-
version "1.0.0-pre.3"
5050-
resolved "https://registry.npmjs.org/@silencelaboratories/eddsa-wasm-ll-web/-/eddsa-wasm-ll-web-1.0.0-pre.3.tgz#5ad6149fe312db331cc2d428feaa0360f170099b"
5051-
integrity sha512-WB8VizRaPmImYY4BXT9FRemky9WyR65nrEMj7A5EkRl7MPBmnVdpNGVkXuOvtcRB5hchq5HnqEFvrO5aAjZbZQ==
5038+
"@silencelaboratories/eddsa-wasm-ll-bundler@1.0.0-pre.4":
5039+
version "1.0.0-pre.4"
5040+
resolved "https://registry.npmjs.org/@silencelaboratories/eddsa-wasm-ll-bundler/-/eddsa-wasm-ll-bundler-1.0.0-pre.4.tgz#5a5f6136f34a439f599e3eea0d9d0f0dabd11b37"
5041+
integrity sha512-Buqk/NOeLnMj7zCrl5BH2stswI4oeHgwCs7Z3bsNSn8YK7jLC/KangaEFKsVvk+W/u0I6J/GEjbcg1EzsClUPQ==
5042+
5043+
"@silencelaboratories/eddsa-wasm-ll-node@1.0.0-pre.4":
5044+
version "1.0.0-pre.4"
5045+
resolved "https://registry.npmjs.org/@silencelaboratories/eddsa-wasm-ll-node/-/eddsa-wasm-ll-node-1.0.0-pre.4.tgz#fdcc793331a87fbfe8a250924a5c67e629306f2e"
5046+
integrity sha512-92Coxq7bAr7C0cMpucjrTqNsRSS8uDdm18/ESAC1aQG5gFSbD0PIWN1L/RK4uQKUGUdletRGiRNElYN3ocLvWw==
5047+
5048+
"@silencelaboratories/eddsa-wasm-ll-web@1.0.0-pre.4":
5049+
version "1.0.0-pre.4"
5050+
resolved "https://registry.npmjs.org/@silencelaboratories/eddsa-wasm-ll-web/-/eddsa-wasm-ll-web-1.0.0-pre.4.tgz#ba203f73f0847f1ee7d678278f498d3b660e9ae4"
5051+
integrity sha512-VVLbpToU2Y3Cl3+4AtpTRssB5iIff57AOMCWk48F92osuCRsv3Ztxfamhjs6EhofMsPEA7c5ewYI2/t25RkoLA==
50525052

50535053
"@sinclair/typebox@^0.34.0":
50545054
version "0.34.41"

0 commit comments

Comments
 (0)