@agentaos/engine 1.2.0 → 2.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": "
|
|
3
|
+
"version": "2.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": "
|
|
45
|
-
"@agentaos/crypto": "
|
|
44
|
+
"@agentaos/core": "2.0.0",
|
|
45
|
+
"@agentaos/crypto": "2.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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"}
|