@agentaos/engine 1.2.0 → 3.0.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agentaos/engine",
3
- "version": "1.2.0",
3
+ "version": "3.0.0",
4
4
  "description": "CGGMP24 threshold ECDSA signing scheme (WASM)",
5
5
  "license": "Apache-2.0",
6
6
  "author": "AgentaOS <hello@agentaos.ai>",
@@ -41,12 +41,14 @@
41
41
  "dependencies": {
42
42
  "@noble/curves": "^2.0.1",
43
43
  "viem": "^2.21.0",
44
- "@agentaos/core": "1.2.0",
45
- "@agentaos/crypto": "1.2.0"
44
+ "@agentaos/core": "3.0.0",
45
+ "@agentaos/crypto": "3.0.0"
46
+ },
47
+ "devDependencies": {
48
+ "@types/node": "^20.0.0"
46
49
  },
47
- "devDependencies": {},
48
50
  "scripts": {
49
- "build": "tsc",
51
+ "build": "tsc -p tsconfig.build.json",
50
52
  "lint": "biome check src/",
51
53
  "test": "vitest run --passWithNoTests --exclude='**/*.integration.test.*'",
52
54
  "test:integration": "vitest run --testPathPattern=integration",
@@ -1,15 +0,0 @@
1
- /**
2
- * Integration test: User+Server signing path (parties [1,2]).
3
- *
4
- * This test simulates the browser signing flow in Node.js to isolate
5
- * whether the "signing protocol error: signing protocol failed" error
6
- * comes from the WASM protocol itself or from the browser transport layer.
7
- *
8
- * Compares:
9
- * - CLI path: Signer(0) + Server(1) — known working
10
- * - Browser path: Server(1) + User(2) — currently failing in browser
11
- *
12
- * Requires: native binary (for DKG) + WASM module (for signing)
13
- */
14
- export {};
15
- //# sourceMappingURL=user-server-sign.integration.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"user-server-sign.integration.test.d.ts","sourceRoot":"","sources":["../../src/cggmp24/user-server-sign.integration.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG"}
@@ -1,229 +0,0 @@
1
- /**
2
- * Integration test: User+Server signing path (parties [1,2]).
3
- *
4
- * This test simulates the browser signing flow in Node.js to isolate
5
- * whether the "signing protocol error: signing protocol failed" error
6
- * comes from the WASM protocol itself or from the browser transport layer.
7
- *
8
- * Compares:
9
- * - CLI path: Signer(0) + Server(1) — known working
10
- * - Browser path: Server(1) + User(2) — currently failing in browser
11
- *
12
- * Requires: native binary (for DKG) + WASM module (for signing)
13
- */
14
- import { keccak256, toHex } from 'viem';
15
- import { beforeAll, describe, expect, it } from 'vitest';
16
- import { CGGMP24Scheme } from './cggmp24.scheme.js';
17
- // Shared DKG result across all tests (DKG is expensive ~1-15s)
18
- let dkgResult;
19
- let scheme;
20
- let hasNativeBinary = false;
21
- describe('User+Server signing path (integration)', () => {
22
- beforeAll(async () => {
23
- scheme = new CGGMP24Scheme();
24
- // Check if native binary is available (required for DKG)
25
- const binaryPath = await scheme.resolveNativeBinaryPath?.();
26
- if (!binaryPath) {
27
- console.log('[TEST] Native DKG binary not found — skipping integration tests');
28
- return;
29
- }
30
- hasNativeBinary = true;
31
- // Initialize WASM for signing
32
- await scheme.initWasm();
33
- // Run DKG to get 3 shares: share[0]=signer, share[1]=server, share[2]=user
34
- console.log('[TEST] Running DKG (3-of-2)...');
35
- dkgResult = await scheme.runDkg(3, 2);
36
- console.log(`[TEST] DKG complete. Address: ${scheme.deriveAddress(dkgResult.publicKey)}`);
37
- console.log(`[TEST] Shares: ${dkgResult.shares.length}`);
38
- }, 300_000); // 5 min timeout for cold-start DKG
39
- it('CLI path: Signer(0) + Server(1) signs successfully', async () => {
40
- if (!hasNativeBinary)
41
- return; // skip — no native binary in CI
42
- // This path works — use as baseline
43
- const messageHash = makeMessageHash('hello from CLI');
44
- const eid = randomEid();
45
- const serverScheme = new CGGMP24Scheme();
46
- await serverScheme.initWasm();
47
- const clientScheme = new CGGMP24Scheme();
48
- await clientScheme.initWasm();
49
- // Create sessions — same as CLI ThresholdSigner + InteractiveSignService
50
- const serverSession = await serverScheme.createSignSession([dkgResult.shares[1].coreShare, dkgResult.shares[1].auxInfo], messageHash, { partyIndex: 1, partiesAtKeygen: [0, 1], eid, forceWasm: true });
51
- const clientSession = await clientScheme.createSignSession([dkgResult.shares[0].coreShare, dkgResult.shares[0].auxInfo], messageHash, { partyIndex: 0, partiesAtKeygen: [0, 1], eid, forceWasm: true });
52
- console.log(`[CLI] Server first msgs: ${serverSession.firstMessages.length}`);
53
- console.log(`[CLI] Client first msgs: ${clientSession.firstMessages.length}`);
54
- // Exchange messages — simulate the round loop
55
- const result = await exchangeRounds(serverScheme, serverSession.sessionId, serverSession.firstMessages, clientScheme, clientSession.sessionId, clientSession.firstMessages);
56
- expect(result.serverComplete).toBe(true);
57
- expect(result.clientComplete).toBe(true);
58
- // Finalize both
59
- const serverSig = await serverScheme.finalizeSign(serverSession.sessionId);
60
- const clientSig = await clientScheme.finalizeSign(clientSession.sessionId);
61
- console.log(`[CLI] Server sig: r=${toHex(serverSig.r).slice(0, 10)}... v=${serverSig.v}`);
62
- console.log(`[CLI] Client sig: r=${toHex(clientSig.r).slice(0, 10)}... v=${clientSig.v}`);
63
- // Both should produce the same signature
64
- expect(toHex(serverSig.r)).toBe(toHex(clientSig.r));
65
- expect(toHex(serverSig.s)).toBe(toHex(clientSig.s));
66
- }, 120_000);
67
- it('Browser path: Server(1) + User(2) signs successfully', async () => {
68
- if (!hasNativeBinary)
69
- return; // skip — no native binary in CI
70
- // This is the path that fails in the browser
71
- const messageHash = makeMessageHash('hello from browser');
72
- const eid = randomEid();
73
- const serverScheme = new CGGMP24Scheme();
74
- await serverScheme.initWasm();
75
- const browserScheme = new CGGMP24Scheme();
76
- await browserScheme.initWasm();
77
- // Create sessions — same as InteractiveSignService (USER_SERVER path)
78
- // Server: party 1, Browser: party 2, partiesAtKeygen: [1, 2]
79
- const serverSession = await serverScheme.createSignSession([dkgResult.shares[1].coreShare, dkgResult.shares[1].auxInfo], messageHash, { partyIndex: 1, partiesAtKeygen: [1, 2], eid, forceWasm: true });
80
- const browserSession = await browserScheme.createSignSession([dkgResult.shares[2].coreShare, dkgResult.shares[2].auxInfo], messageHash, { partyIndex: 2, partiesAtKeygen: [1, 2], eid, forceWasm: true });
81
- console.log(`[Browser] Server first msgs: ${serverSession.firstMessages.length}`);
82
- console.log(`[Browser] Browser first msgs: ${browserSession.firstMessages.length}`);
83
- // Exchange messages — simulate the round loop
84
- const result = await exchangeRounds(serverScheme, serverSession.sessionId, serverSession.firstMessages, browserScheme, browserSession.sessionId, browserSession.firstMessages);
85
- expect(result.serverComplete).toBe(true);
86
- expect(result.clientComplete).toBe(true);
87
- // Finalize both
88
- const serverSig = await serverScheme.finalizeSign(serverSession.sessionId);
89
- const browserSig = await browserScheme.finalizeSign(browserSession.sessionId);
90
- console.log(`[Browser] Server sig: r=${toHex(serverSig.r).slice(0, 10)}... v=${serverSig.v}`);
91
- console.log(`[Browser] Browser sig: r=${toHex(browserSig.r).slice(0, 10)}... v=${browserSig.v}`);
92
- // Both should produce the same signature
93
- expect(toHex(serverSig.r)).toBe(toHex(browserSig.r));
94
- expect(toHex(serverSig.s)).toBe(toHex(browserSig.s));
95
- }, 120_000);
96
- it('Browser path with HTTP-style base64 serialization roundtrip', async () => {
97
- if (!hasNativeBinary)
98
- return; // skip — no native binary in CI
99
- // Simulate the EXACT serialization path used by browser-signer.ts ↔ signing.controller.ts
100
- const messageHash = makeMessageHash('hello with base64 roundtrip');
101
- const eid = randomEid();
102
- const serverScheme = new CGGMP24Scheme();
103
- await serverScheme.initWasm();
104
- const browserScheme = new CGGMP24Scheme();
105
- await browserScheme.initWasm();
106
- // Server creates session
107
- const serverSession = await serverScheme.createSignSession([dkgResult.shares[1].coreShare, dkgResult.shares[1].auxInfo], messageHash, { partyIndex: 1, partiesAtKeygen: [1, 2], eid, forceWasm: true });
108
- // Controller serializes firstMessages to base64 (as done in signing.controller.ts)
109
- const serverFirstMessagesBase64 = serverSession.firstMessages.map(bytesToBase64);
110
- // Browser receives base64, decodes, parses JSON to WasmSignMessage[]
111
- const serverFirstParsed = serverFirstMessagesBase64.map((b64) => {
112
- const bytes = base64ToBytes(b64);
113
- return JSON.parse(new TextDecoder().decode(bytes));
114
- });
115
- // Browser creates its own session (same as browser-signer.ts)
116
- const browserSession = await browserScheme.createSignSession([dkgResult.shares[2].coreShare, dkgResult.shares[2].auxInfo], messageHash, { partyIndex: 2, partiesAtKeygen: [1, 2], eid, forceWasm: true });
117
- // Browser serializes its first messages to WasmSignMessage[]
118
- const browserFirstParsed = browserSession.firstMessages.map((bytes) => JSON.parse(new TextDecoder().decode(bytes)));
119
- // Browser processes server's first messages via WASM
120
- // First re-serialize for processSignRound (expects Uint8Array[])
121
- const serverFirstBytes = serverFirstParsed.map((msg) => new TextEncoder().encode(JSON.stringify(msg)));
122
- const processResult = await browserScheme.processSignRound(browserSession.sessionId, serverFirstBytes);
123
- console.log(`[B64] Browser processResult: complete=${processResult.complete} outgoing=${processResult.outgoingMessages.length}`);
124
- // Combine browser first messages + processResult messages (as browser-signer.ts does)
125
- const browserFirstBytes = browserFirstParsed.map((msg) => new TextEncoder().encode(JSON.stringify(msg)));
126
- let outgoing = [...browserFirstBytes, ...processResult.outgoingMessages];
127
- // Round loop (simulating browser-signer.ts round exchange)
128
- const MAX_ROUNDS = 20;
129
- let serverComplete = false;
130
- let roundCount = 0;
131
- while (!serverComplete) {
132
- if (++roundCount > MAX_ROUNDS) {
133
- throw new Error(`Protocol did not complete after ${MAX_ROUNDS} rounds`);
134
- }
135
- // Browser → base64 → Server (as browser-signer.ts + signing.controller.ts)
136
- const outgoingBase64 = outgoing.map(bytesToBase64);
137
- const incomingForServer = outgoingBase64.map(base64ToBytes);
138
- // Server processes
139
- const serverResult = await serverScheme.processSignRound(serverSession.sessionId, incomingForServer);
140
- serverComplete = serverResult.complete;
141
- console.log(`[B64] Round ${roundCount}: server complete=${serverComplete} outgoing=${serverResult.outgoingMessages.length}`);
142
- if (serverResult.outgoingMessages.length > 0 && !serverComplete) {
143
- // Server → base64 → Browser
144
- const serverOutBase64 = serverResult.outgoingMessages.map(bytesToBase64);
145
- const incomingForBrowser = serverOutBase64.map((b64) => new TextEncoder().encode(JSON.stringify(JSON.parse(new TextDecoder().decode(base64ToBytes(b64))))));
146
- const browserResult = await browserScheme.processSignRound(browserSession.sessionId, incomingForBrowser);
147
- outgoing = browserResult.outgoingMessages;
148
- console.log(`[B64] Round ${roundCount}: browser complete=${browserResult.complete} outgoing=${browserResult.outgoingMessages.length}`);
149
- }
150
- else {
151
- outgoing = [];
152
- }
153
- }
154
- // Finalize
155
- const serverSig = await serverScheme.finalizeSign(serverSession.sessionId);
156
- console.log(`[B64] Server sig: r=${toHex(serverSig.r).slice(0, 10)}... v=${serverSig.v}`);
157
- expect(serverSig.v).toBeGreaterThanOrEqual(27);
158
- expect(serverSig.v).toBeLessThanOrEqual(28);
159
- expect(serverSig.r.length).toBe(32);
160
- expect(serverSig.s.length).toBe(32);
161
- }, 120_000);
162
- });
163
- // ---------------------------------------------------------------------------
164
- // Helpers
165
- // ---------------------------------------------------------------------------
166
- function makeMessageHash(msg) {
167
- const hex = keccak256(toHex(new TextEncoder().encode(msg)));
168
- return new Uint8Array(Buffer.from(hex.slice(2), 'hex'));
169
- }
170
- function randomEid() {
171
- const eid = new Uint8Array(32);
172
- crypto.getRandomValues(eid);
173
- return eid;
174
- }
175
- function bytesToBase64(bytes) {
176
- return Buffer.from(bytes).toString('base64');
177
- }
178
- function base64ToBytes(b64) {
179
- return new Uint8Array(Buffer.from(b64, 'base64'));
180
- }
181
- /**
182
- * Exchange messages between two scheme instances until both complete.
183
- * Simulates the round loop in both the CLI and browser paths.
184
- */
185
- async function exchangeRounds(schemeA, sessionIdA, firstMessagesA, schemeB, sessionIdB, firstMessagesB) {
186
- // Each side processes the other's first messages
187
- const resultA = await schemeA.processSignRound(sessionIdA, firstMessagesB);
188
- const resultB = await schemeB.processSignRound(sessionIdB, firstMessagesA);
189
- let outgoingA = resultA.outgoingMessages;
190
- let outgoingB = resultB.outgoingMessages;
191
- let completeA = resultA.complete;
192
- let completeB = resultB.complete;
193
- console.log(` Round 0: A complete=${completeA} outA=${outgoingA.length} | B complete=${completeB} outB=${outgoingB.length}`);
194
- const MAX_ROUNDS = 20;
195
- let round = 0;
196
- while (!completeA || !completeB) {
197
- if (++round > MAX_ROUNDS) {
198
- throw new Error(`Protocol did not complete after ${MAX_ROUNDS} rounds`);
199
- }
200
- // Save previous outgoing before processing (both sides process simultaneously)
201
- const prevOutA = outgoingA;
202
- const prevOutB = outgoingB;
203
- // A processes B's previous messages
204
- if (prevOutB.length > 0 && !completeA) {
205
- const resA = await schemeA.processSignRound(sessionIdA, prevOutB);
206
- outgoingA = resA.outgoingMessages;
207
- completeA = resA.complete;
208
- }
209
- else {
210
- outgoingA = [];
211
- }
212
- // B processes A's previous messages (not the new ones from this round!)
213
- if (prevOutA.length > 0 && !completeB) {
214
- const resB = await schemeB.processSignRound(sessionIdB, prevOutA);
215
- outgoingB = resB.outgoingMessages;
216
- completeB = resB.complete;
217
- }
218
- else {
219
- outgoingB = [];
220
- }
221
- console.log(` Round ${round}: A complete=${completeA} outA=${outgoingA.length} | B complete=${completeB} outB=${outgoingB.length}`);
222
- // Safety: if both have no outgoing and neither is complete, we're stuck
223
- if (outgoingA.length === 0 && outgoingB.length === 0 && (!completeA || !completeB)) {
224
- throw new Error(`Protocol stuck at round ${round}: A=${completeA} B=${completeB}`);
225
- }
226
- }
227
- return { serverComplete: completeA, clientComplete: completeB, rounds: round };
228
- }
229
- //# sourceMappingURL=user-server-sign.integration.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"user-server-sign.integration.test.js","sourceRoot":"","sources":["../../src/cggmp24/user-server-sign.integration.test.ts"],"names":[],"mappings":"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"}