@solana/keychain-dfns 0.6.1 → 1.0.1
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/__tests__/dfns-signer.test.js +136 -1
- package/dist/__tests__/dfns-signer.test.js.map +1 -1
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +131 -11
- package/dist/auth.js.map +1 -1
- package/dist/dfns-signer.d.ts +7 -0
- package/dist/dfns-signer.d.ts.map +1 -1
- package/dist/dfns-signer.js +67 -6
- package/dist/dfns-signer.js.map +1 -1
- package/package.json +3 -3
- package/src/__tests__/dfns-signer.test.ts +182 -1
- package/src/auth.ts +166 -13
- package/src/dfns-signer.ts +79 -5
|
@@ -1,7 +1,17 @@
|
|
|
1
|
+
import * as nodeCrypto from 'node:crypto';
|
|
1
2
|
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
2
3
|
vi.mock('@solana/keychain-core', async (importOriginal) => {
|
|
3
4
|
const mod = await importOriginal();
|
|
4
|
-
return {
|
|
5
|
+
return {
|
|
6
|
+
...mod,
|
|
7
|
+
assertSignatureValid: vi.fn(),
|
|
8
|
+
sanitizeRemoteErrorResponse: mod.sanitizeRemoteErrorResponse ??
|
|
9
|
+
((text) => `${text
|
|
10
|
+
.replace(/[\u0000-\u0008\u000B\u000C\u000E-\u001F\u007F]/g, ' ')
|
|
11
|
+
.replace(/\s+/g, ' ')
|
|
12
|
+
.trim()
|
|
13
|
+
.slice(0, 256)} [truncated]`),
|
|
14
|
+
};
|
|
5
15
|
});
|
|
6
16
|
import { DfnsSigner } from '../dfns-signer.js';
|
|
7
17
|
import { TEST_AUTH_TOKEN, TEST_CRED_ID, TEST_ED25519_PEM, TEST_WALLET_ID, createSignatureResponse, createUserActionInitResponse, createUserActionResponse, createWalletResponse, } from './setup.js';
|
|
@@ -42,6 +52,21 @@ describe('DfnsSigner', () => {
|
|
|
42
52
|
it('throws error for missing walletId', async () => {
|
|
43
53
|
await expect(DfnsSigner.create({ ...defaultConfig, walletId: '' })).rejects.toThrow('Missing required walletId field');
|
|
44
54
|
});
|
|
55
|
+
it('throws CONFIG_ERROR when apiBaseUrl is not a valid URL', async () => {
|
|
56
|
+
await expect(DfnsSigner.create({ ...defaultConfig, apiBaseUrl: 'not-a-url' })).rejects.toMatchObject({
|
|
57
|
+
code: 'SIGNER_CONFIG_ERROR',
|
|
58
|
+
message: expect.stringContaining('apiBaseUrl is not a valid URL'),
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
it('throws CONFIG_ERROR when apiBaseUrl does not use HTTPS', async () => {
|
|
62
|
+
await expect(DfnsSigner.create({
|
|
63
|
+
...defaultConfig,
|
|
64
|
+
apiBaseUrl: 'http://api.dfns.test',
|
|
65
|
+
})).rejects.toMatchObject({
|
|
66
|
+
code: 'SIGNER_CONFIG_ERROR',
|
|
67
|
+
message: expect.stringContaining('apiBaseUrl must use HTTPS'),
|
|
68
|
+
});
|
|
69
|
+
});
|
|
45
70
|
it('throws error for inactive wallet', async () => {
|
|
46
71
|
mockWalletFetch({ status: 'Inactive' });
|
|
47
72
|
await expect(DfnsSigner.create(defaultConfig)).rejects.toThrow('not active');
|
|
@@ -57,6 +82,16 @@ describe('DfnsSigner', () => {
|
|
|
57
82
|
});
|
|
58
83
|
await expect(DfnsSigner.create(defaultConfig)).rejects.toThrow();
|
|
59
84
|
});
|
|
85
|
+
it('throws PARSING_ERROR for malformed wallet response shape', async () => {
|
|
86
|
+
mockFetch.mockResolvedValueOnce({
|
|
87
|
+
json: async () => ({}),
|
|
88
|
+
ok: true,
|
|
89
|
+
});
|
|
90
|
+
await expect(DfnsSigner.create(defaultConfig)).rejects.toMatchObject({
|
|
91
|
+
code: 'SIGNER_PARSING_ERROR',
|
|
92
|
+
message: expect.stringContaining('Unexpected Dfns wallet response shape'),
|
|
93
|
+
});
|
|
94
|
+
});
|
|
60
95
|
it('throws error for negative requestDelayMs', async () => {
|
|
61
96
|
await expect(DfnsSigner.create({ ...defaultConfig, requestDelayMs: -1 })).rejects.toThrow('requestDelayMs must not be negative');
|
|
62
97
|
});
|
|
@@ -109,6 +144,58 @@ describe('DfnsSigner', () => {
|
|
|
109
144
|
const sig = result[0][signer.address];
|
|
110
145
|
expect(sig.length).toBe(64);
|
|
111
146
|
});
|
|
147
|
+
it('accepts escaped-newline PEM keys for auth challenge signing', async () => {
|
|
148
|
+
const rHex = '11'.repeat(32);
|
|
149
|
+
const sHex = '22'.repeat(32);
|
|
150
|
+
mockWalletFetch();
|
|
151
|
+
mockFetch.mockResolvedValueOnce({
|
|
152
|
+
json: async () => createUserActionInitResponse(),
|
|
153
|
+
ok: true,
|
|
154
|
+
});
|
|
155
|
+
mockFetch.mockResolvedValueOnce({
|
|
156
|
+
json: async () => createUserActionResponse(),
|
|
157
|
+
ok: true,
|
|
158
|
+
});
|
|
159
|
+
mockFetch.mockResolvedValueOnce({
|
|
160
|
+
json: async () => createSignatureResponse(rHex, sHex),
|
|
161
|
+
ok: true,
|
|
162
|
+
});
|
|
163
|
+
const signer = await DfnsSigner.create({
|
|
164
|
+
...defaultConfig,
|
|
165
|
+
privateKeyPem: TEST_ED25519_PEM.replace(/\n/g, '\\n'),
|
|
166
|
+
});
|
|
167
|
+
const result = await signer.signMessages([{ content: new Uint8Array([1, 2, 3]), signatures: {} }]);
|
|
168
|
+
expect(result).toHaveLength(1);
|
|
169
|
+
const sig = result[0][signer.address];
|
|
170
|
+
expect(sig.length).toBe(64);
|
|
171
|
+
});
|
|
172
|
+
it('supports SEC1 PEM keys for auth challenge signing', async () => {
|
|
173
|
+
const { privateKey } = nodeCrypto.generateKeyPairSync('ec', { namedCurve: 'prime256v1' });
|
|
174
|
+
const sec1Pem = privateKey.export({ format: 'pem', type: 'sec1' }).toString();
|
|
175
|
+
const rHex = '11'.repeat(32);
|
|
176
|
+
const sHex = '22'.repeat(32);
|
|
177
|
+
mockWalletFetch();
|
|
178
|
+
mockFetch.mockResolvedValueOnce({
|
|
179
|
+
json: async () => createUserActionInitResponse(),
|
|
180
|
+
ok: true,
|
|
181
|
+
});
|
|
182
|
+
mockFetch.mockResolvedValueOnce({
|
|
183
|
+
json: async () => createUserActionResponse(),
|
|
184
|
+
ok: true,
|
|
185
|
+
});
|
|
186
|
+
mockFetch.mockResolvedValueOnce({
|
|
187
|
+
json: async () => createSignatureResponse(rHex, sHex),
|
|
188
|
+
ok: true,
|
|
189
|
+
});
|
|
190
|
+
const signer = await DfnsSigner.create({
|
|
191
|
+
...defaultConfig,
|
|
192
|
+
privateKeyPem: sec1Pem,
|
|
193
|
+
});
|
|
194
|
+
const result = await signer.signMessages([{ content: new Uint8Array([1, 2, 3]), signatures: {} }]);
|
|
195
|
+
expect(result).toHaveLength(1);
|
|
196
|
+
const sig = result[0][signer.address];
|
|
197
|
+
expect(sig.length).toBe(64);
|
|
198
|
+
});
|
|
112
199
|
it('left-pads short signature components', async () => {
|
|
113
200
|
// r is 31 bytes (short by 1), s is 32 bytes
|
|
114
201
|
const rHex = 'ff'.repeat(31);
|
|
@@ -134,6 +221,54 @@ describe('DfnsSigner', () => {
|
|
|
134
221
|
expect(sig[0]).toBe(0x00);
|
|
135
222
|
expect(sig[1]).toBe(0xff);
|
|
136
223
|
});
|
|
224
|
+
it('throws PARSING_ERROR for malformed auth challenge response shape', async () => {
|
|
225
|
+
mockWalletFetch();
|
|
226
|
+
mockFetch.mockResolvedValueOnce({
|
|
227
|
+
json: async () => ({}),
|
|
228
|
+
ok: true,
|
|
229
|
+
});
|
|
230
|
+
const signer = await DfnsSigner.create(defaultConfig);
|
|
231
|
+
await expect(signer.signMessages([{ content: new Uint8Array([1, 2, 3]), signatures: {} }])).rejects.toMatchObject({
|
|
232
|
+
code: 'SIGNER_PARSING_ERROR',
|
|
233
|
+
message: expect.stringContaining('Unexpected Dfns auth challenge response shape'),
|
|
234
|
+
});
|
|
235
|
+
});
|
|
236
|
+
it('throws PARSING_ERROR for malformed signature response shape', async () => {
|
|
237
|
+
mockWalletFetch();
|
|
238
|
+
mockFetch.mockResolvedValueOnce({
|
|
239
|
+
json: async () => createUserActionInitResponse(),
|
|
240
|
+
ok: true,
|
|
241
|
+
});
|
|
242
|
+
mockFetch.mockResolvedValueOnce({
|
|
243
|
+
json: async () => createUserActionResponse(),
|
|
244
|
+
ok: true,
|
|
245
|
+
});
|
|
246
|
+
mockFetch.mockResolvedValueOnce({
|
|
247
|
+
json: async () => ({}),
|
|
248
|
+
ok: true,
|
|
249
|
+
});
|
|
250
|
+
const signer = await DfnsSigner.create(defaultConfig);
|
|
251
|
+
await expect(signer.signMessages([{ content: new Uint8Array([1, 2, 3]), signatures: {} }])).rejects.toMatchObject({
|
|
252
|
+
code: 'SIGNER_PARSING_ERROR',
|
|
253
|
+
message: expect.stringContaining('Unexpected Dfns signature response shape'),
|
|
254
|
+
});
|
|
255
|
+
});
|
|
256
|
+
it('throws PARSING_ERROR for malformed auth action response shape', async () => {
|
|
257
|
+
mockWalletFetch();
|
|
258
|
+
mockFetch.mockResolvedValueOnce({
|
|
259
|
+
json: async () => createUserActionInitResponse(),
|
|
260
|
+
ok: true,
|
|
261
|
+
});
|
|
262
|
+
mockFetch.mockResolvedValueOnce({
|
|
263
|
+
json: async () => ({}),
|
|
264
|
+
ok: true,
|
|
265
|
+
});
|
|
266
|
+
const signer = await DfnsSigner.create(defaultConfig);
|
|
267
|
+
await expect(signer.signMessages([{ content: new Uint8Array([1, 2, 3]), signatures: {} }])).rejects.toMatchObject({
|
|
268
|
+
code: 'SIGNER_PARSING_ERROR',
|
|
269
|
+
message: expect.stringContaining('Unexpected Dfns auth action response shape'),
|
|
270
|
+
});
|
|
271
|
+
});
|
|
137
272
|
});
|
|
138
273
|
describe('isAvailable', () => {
|
|
139
274
|
it('returns true when API responds', async () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dfns-signer.test.js","sourceRoot":"","sources":["../../src/__tests__/dfns-signer.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAE9D,EAAE,CAAC,IAAI,CAAC,uBAAuB,EAAE,KAAK,EAAC,cAAc,EAAC,EAAE;IACpD,MAAM,GAAG,GAAG,MAAM,cAAc,EAA0C,CAAC;IAC3E,OAAO,EAAE,GAAG,GAAG,EAAE,oBAAoB,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;AACrD,CAAC,CAAC,CAAC;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EACH,eAAe,EACf,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,uBAAuB,EACvB,4BAA4B,EAC5B,wBAAwB,EACxB,oBAAoB,GACvB,MAAM,YAAY,CAAC;AAEpB,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;AACvB,MAAM,SAAS,GAAG,MAAM,CAAC,KAAiC,CAAC;AAE3D,MAAM,aAAa,GAAG;IAClB,SAAS,EAAE,eAAe;IAC1B,MAAM,EAAE,YAAY;IACpB,aAAa,EAAE,gBAAgB;IAC/B,QAAQ,EAAE,cAAc;CAC3B,CAAC;AAEF,SAAS,eAAe,CAAC,SAAsD;IAC3E,SAAS,CAAC,qBAAqB,CAAC;QAC5B,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,oBAAoB,CAAC,SAAS,CAAC;QACjD,EAAE,EAAE,IAAI;KACX,CAAC,CAAC;AACP,CAAC;AAED,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IACxB,UAAU,CAAC,GAAG,EAAE;QACZ,EAAE,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;QACpB,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;YACpD,eAAe,EAAE,CAAC;YAClB,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;YACtD,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;YAC7B,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;YAChD,MAAM,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,GAAG,aAAa,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAChF,kCAAkC,CACrC,CAAC;QACN,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;YAC7C,MAAM,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,GAAG,aAAa,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAC7E,+BAA+B,CAClC,CAAC;QACN,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;YACpD,MAAM,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,GAAG,aAAa,EAAE,aAAa,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CACpF,sCAAsC,CACzC,CAAC;QACN,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;YAC/C,MAAM,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,GAAG,aAAa,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAC/E,iCAAiC,CACpC,CAAC;QACN,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;YAC9C,eAAe,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;YACxC,MAAM,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QACjF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;YAC/C,eAAe,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;YACrC,MAAM,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;QAC7F,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;YAC1C,SAAS,CAAC,qBAAqB,CAAC;gBAC5B,EAAE,EAAE,KAAK;gBACT,MAAM,EAAE,GAAG;aACd,CAAC,CAAC;YACH,MAAM,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACrE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;YACtD,MAAM,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,GAAG,aAAa,EAAE,cAAc,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CACrF,qCAAqC,CACxC,CAAC;QACN,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;YAC3C,MAAM,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YACvE,eAAe,EAAE,CAAC;YAClB,MAAM,UAAU,CAAC,MAAM,CAAC,EAAE,GAAG,aAAa,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC;YACpE,MAAM,CAAC,OAAO,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,gBAAgB,CAAC,uCAAuC,CAAC,CAAC,CAAC;YACvG,OAAO,CAAC,WAAW,EAAE,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;YAC9D,SAAS,CAAC,qBAAqB,CAAC,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC;YAC9D,MAAM,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC;gBACjE,IAAI,EAAE,mBAAmB;gBACzB,OAAO,EAAE,MAAM,CAAC,gBAAgB,CAAC,6BAA6B,CAAC;aAClE,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;QAC1B,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;YAC/D,eAAe,EAAE,CAAC;YAClB,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;YAEtD,sDAAsD;YACtD,SAAS,CAAC,qBAAqB,CAAC,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC;YAE9D,MAAM,MAAM,CACR,MAAM,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC,CAChF,CAAC,OAAO,CAAC,aAAa,CAAC;gBACpB,IAAI,EAAE,mBAAmB;gBACzB,OAAO,EAAE,MAAM,CAAC,gBAAgB,CAAC,6BAA6B,CAAC;aAClE,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;YAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAE7B,eAAe,EAAE,CAAC;YAElB,SAAS,CAAC,qBAAqB,CAAC;gBAC5B,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,4BAA4B,EAAE;gBAChD,EAAE,EAAE,IAAI;aACX,CAAC,CAAC;YAEH,SAAS,CAAC,qBAAqB,CAAC;gBAC5B,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,wBAAwB,EAAE;gBAC5C,EAAE,EAAE,IAAI;aACX,CAAC,CAAC;YAEH,SAAS,CAAC,qBAAqB,CAAC;gBAC5B,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,uBAAuB,CAAC,IAAI,EAAE,IAAI,CAAC;gBACrD,EAAE,EAAE,IAAI;aACX,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;YAEtD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;YAEnG,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAC/B,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;YAElD,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC,MAAM,CAAC,OAAO,CAAE,CAAC;YACxC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;YAClD,4CAA4C;YAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAE7B,eAAe,EAAE,CAAC;YAElB,SAAS,CAAC,qBAAqB,CAAC;gBAC5B,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,4BAA4B,EAAE;gBAChD,EAAE,EAAE,IAAI;aACX,CAAC,CAAC;YAEH,SAAS,CAAC,qBAAqB,CAAC;gBAC5B,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,wBAAwB,EAAE;gBAC5C,EAAE,EAAE,IAAI;aACX,CAAC,CAAC;YAEH,SAAS,CAAC,qBAAqB,CAAC;gBAC5B,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,uBAAuB,CAAC,IAAI,EAAE,IAAI,CAAC;gBACrD,EAAE,EAAE,IAAI;aACX,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;YAEtD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;YAEnG,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC,MAAM,CAAC,OAAO,CAAE,CAAC;YACxC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC5B,8DAA8D;YAC9D,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1B,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QACzB,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;YAC5C,eAAe,EAAE,CAAC;YAClB,mEAAmE;YACnE,eAAe,EAAE,CAAC,CAAC,2BAA2B;YAC9C,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;YACtD,MAAM,CAAC,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;YAC1C,eAAe,EAAE,CAAC,CAAC,eAAe;YAClC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;YAEtD,SAAS,CAAC,qBAAqB,CAAC;gBAC5B,EAAE,EAAE,KAAK;gBACT,MAAM,EAAE,GAAG;aACd,CAAC,CAAC;YACH,MAAM,CAAC,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"dfns-signer.test.js","sourceRoot":"","sources":["../../src/__tests__/dfns-signer.test.ts"],"names":[],"mappings":"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"}
|
package/dist/auth.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAYA;;;;GAIG;AACH,wBAAsB,cAAc,CAChC,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,CAwHjB"}
|
package/dist/auth.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { base64UrlDecoder, SignerErrorCode, throwSignerError } from '@solana/keychain-core';
|
|
1
|
+
import { getBase64Encoder } from '@solana/codecs-strings';
|
|
2
|
+
import { base64UrlDecoder, sanitizeRemoteErrorResponse, SignerErrorCode, throwSignerError, } from '@solana/keychain-core';
|
|
3
|
+
let base64Encoder;
|
|
3
4
|
/**
|
|
4
5
|
* Perform the Dfns User Action Signing flow. For more details, see https://docs.dfns.co/api-reference/auth/signing-flows#asymetric-keys-signing-flow
|
|
5
6
|
*
|
|
@@ -35,13 +36,13 @@ export async function signUserAction(apiBaseUrl, authToken, credId, privateKeyPe
|
|
|
35
36
|
const errorText = await initResponse.text().catch(() => 'Failed to read error response');
|
|
36
37
|
throwSignerError(SignerErrorCode.REMOTE_API_ERROR, {
|
|
37
38
|
message: `Dfns auth/action/init failed: ${initResponse.status}`,
|
|
38
|
-
response: errorText,
|
|
39
|
+
response: sanitizeRemoteErrorResponse(errorText),
|
|
39
40
|
status: initResponse.status,
|
|
40
41
|
});
|
|
41
42
|
}
|
|
42
|
-
let
|
|
43
|
+
let rawChallenge;
|
|
43
44
|
try {
|
|
44
|
-
|
|
45
|
+
rawChallenge = await initResponse.json();
|
|
45
46
|
}
|
|
46
47
|
catch (error) {
|
|
47
48
|
throwSignerError(SignerErrorCode.PARSING_ERROR, {
|
|
@@ -49,8 +50,9 @@ export async function signUserAction(apiBaseUrl, authToken, credId, privateKeyPe
|
|
|
49
50
|
message: 'Failed to parse Dfns auth challenge response',
|
|
50
51
|
});
|
|
51
52
|
}
|
|
53
|
+
const challenge = parseUserActionInitResponse(rawChallenge);
|
|
52
54
|
// Verify credential is allowed
|
|
53
|
-
const allowed = challenge.allowCredentials.key.some(c => c.id === credId);
|
|
55
|
+
const allowed = challenge.allowCredentials.key.some(c => isObject(c) && typeof c.id === 'string' && c.id === credId);
|
|
54
56
|
if (!allowed) {
|
|
55
57
|
throwSignerError(SignerErrorCode.CONFIG_ERROR, {
|
|
56
58
|
message: `Credential ${credId} not in allowed credentials`,
|
|
@@ -61,9 +63,8 @@ export async function signUserAction(apiBaseUrl, authToken, credId, privateKeyPe
|
|
|
61
63
|
challenge: challenge.challenge,
|
|
62
64
|
type: 'key.get',
|
|
63
65
|
}));
|
|
64
|
-
const signature = crypto.sign(undefined, clientData, privateKeyPem);
|
|
65
66
|
const clientDataB64 = base64UrlDecoder(clientData);
|
|
66
|
-
const signatureB64 = base64UrlDecoder(
|
|
67
|
+
const signatureB64 = base64UrlDecoder(await signClientData(clientData, privateKeyPem));
|
|
67
68
|
// Submit the signed challenge
|
|
68
69
|
const actionUrl = `${apiBaseUrl}/auth/action`;
|
|
69
70
|
let signResponse;
|
|
@@ -98,13 +99,13 @@ export async function signUserAction(apiBaseUrl, authToken, credId, privateKeyPe
|
|
|
98
99
|
const errorText = await signResponse.text().catch(() => 'Failed to read error response');
|
|
99
100
|
throwSignerError(SignerErrorCode.REMOTE_API_ERROR, {
|
|
100
101
|
message: `Dfns auth/action failed: ${signResponse.status}`,
|
|
101
|
-
response: errorText,
|
|
102
|
+
response: sanitizeRemoteErrorResponse(errorText),
|
|
102
103
|
status: signResponse.status,
|
|
103
104
|
});
|
|
104
105
|
}
|
|
105
|
-
let
|
|
106
|
+
let rawActionResponse;
|
|
106
107
|
try {
|
|
107
|
-
|
|
108
|
+
rawActionResponse = await signResponse.json();
|
|
108
109
|
}
|
|
109
110
|
catch (error) {
|
|
110
111
|
throwSignerError(SignerErrorCode.PARSING_ERROR, {
|
|
@@ -112,6 +113,125 @@ export async function signUserAction(apiBaseUrl, authToken, credId, privateKeyPe
|
|
|
112
113
|
message: 'Failed to parse Dfns auth action response',
|
|
113
114
|
});
|
|
114
115
|
}
|
|
116
|
+
const actionResponse = parseUserActionResponse(rawActionResponse);
|
|
115
117
|
return actionResponse.userAction;
|
|
116
118
|
}
|
|
119
|
+
function parseUserActionInitResponse(raw) {
|
|
120
|
+
if (!isObject(raw) || !isObject(raw.allowCredentials) || !Array.isArray(raw.allowCredentials.key)) {
|
|
121
|
+
throwSignerError(SignerErrorCode.PARSING_ERROR, {
|
|
122
|
+
message: 'Unexpected Dfns auth challenge response shape',
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
if (typeof raw.challenge !== 'string' || typeof raw.challengeIdentifier !== 'string') {
|
|
126
|
+
throwSignerError(SignerErrorCode.PARSING_ERROR, {
|
|
127
|
+
message: 'Unexpected Dfns auth challenge response shape',
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
return raw;
|
|
131
|
+
}
|
|
132
|
+
function parseUserActionResponse(raw) {
|
|
133
|
+
if (!isObject(raw) || typeof raw.userAction !== 'string') {
|
|
134
|
+
throwSignerError(SignerErrorCode.PARSING_ERROR, {
|
|
135
|
+
message: 'Unexpected Dfns auth action response shape',
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
return raw;
|
|
139
|
+
}
|
|
140
|
+
function isObject(value) {
|
|
141
|
+
return typeof value === 'object' && value !== null;
|
|
142
|
+
}
|
|
143
|
+
async function signClientData(clientData, privateKeyPem) {
|
|
144
|
+
const normalizedPem = normalizePrivateKeyPem(privateKeyPem);
|
|
145
|
+
let latestError;
|
|
146
|
+
const subtle = globalThis.crypto?.subtle;
|
|
147
|
+
if (subtle) {
|
|
148
|
+
try {
|
|
149
|
+
const signature = await signClientDataWithWebCrypto(subtle, clientData, normalizedPem);
|
|
150
|
+
if (signature) {
|
|
151
|
+
return signature;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
catch (error) {
|
|
155
|
+
latestError = error;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
try {
|
|
159
|
+
const signature = await signClientDataWithNodeCrypto(clientData, normalizedPem);
|
|
160
|
+
if (signature) {
|
|
161
|
+
return signature;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
latestError = error;
|
|
166
|
+
}
|
|
167
|
+
throwSignerError(SignerErrorCode.SIGNING_FAILED, {
|
|
168
|
+
cause: latestError,
|
|
169
|
+
message: 'Failed to sign Dfns auth challenge',
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
function normalizePrivateKeyPem(privateKeyPem) {
|
|
173
|
+
// CI secrets are often stored as single-line values with escaped newlines.
|
|
174
|
+
return privateKeyPem.replace(/\\n/g, '\n').replace(/\r/g, '').trim();
|
|
175
|
+
}
|
|
176
|
+
async function signClientDataWithWebCrypto(subtle, clientData, privateKeyPem) {
|
|
177
|
+
const privateKeyDer = toArrayBuffer(pemToDer(privateKeyPem));
|
|
178
|
+
const input = toArrayBuffer(clientData);
|
|
179
|
+
const attempts = [
|
|
180
|
+
{ importAlgorithm: 'Ed25519', signAlgorithm: 'Ed25519' },
|
|
181
|
+
{
|
|
182
|
+
importAlgorithm: { name: 'ECDSA', namedCurve: 'P-256' },
|
|
183
|
+
signAlgorithm: { hash: 'SHA-256', name: 'ECDSA' },
|
|
184
|
+
},
|
|
185
|
+
{
|
|
186
|
+
importAlgorithm: { hash: 'SHA-256', name: 'RSASSA-PKCS1-v1_5' },
|
|
187
|
+
signAlgorithm: 'RSASSA-PKCS1-v1_5',
|
|
188
|
+
},
|
|
189
|
+
];
|
|
190
|
+
for (const attempt of attempts) {
|
|
191
|
+
try {
|
|
192
|
+
const privateKey = await subtle.importKey('pkcs8', privateKeyDer, attempt.importAlgorithm, false, ['sign']);
|
|
193
|
+
const signature = await subtle.sign(attempt.signAlgorithm, privateKey, input);
|
|
194
|
+
return new Uint8Array(signature);
|
|
195
|
+
}
|
|
196
|
+
catch {
|
|
197
|
+
// Try the next key algorithm.
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return undefined;
|
|
201
|
+
}
|
|
202
|
+
async function signClientDataWithNodeCrypto(clientData, privateKeyPem) {
|
|
203
|
+
try {
|
|
204
|
+
const nodeCrypto = await import('node:crypto');
|
|
205
|
+
const signature = nodeCrypto.sign(undefined, clientData, privateKeyPem);
|
|
206
|
+
return new Uint8Array(signature);
|
|
207
|
+
}
|
|
208
|
+
catch {
|
|
209
|
+
return undefined;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
function pemToDer(privateKeyPem) {
|
|
213
|
+
const normalizedPem = normalizePrivateKeyPem(privateKeyPem);
|
|
214
|
+
const pemBody = normalizedPem
|
|
215
|
+
.replace(/-----BEGIN [^-]+-----/g, '')
|
|
216
|
+
.replace(/-----END [^-]+-----/g, '')
|
|
217
|
+
.replace(/\s+/g, '');
|
|
218
|
+
if (!pemBody) {
|
|
219
|
+
throwSignerError(SignerErrorCode.CONFIG_ERROR, {
|
|
220
|
+
message: 'privateKeyPem must be a non-empty PEM key',
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
try {
|
|
224
|
+
base64Encoder || (base64Encoder = getBase64Encoder());
|
|
225
|
+
return new Uint8Array(base64Encoder.encode(pemBody));
|
|
226
|
+
}
|
|
227
|
+
catch (error) {
|
|
228
|
+
throwSignerError(SignerErrorCode.CONFIG_ERROR, {
|
|
229
|
+
cause: error,
|
|
230
|
+
message: 'privateKeyPem must be a valid PEM key',
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
function toArrayBuffer(bytes) {
|
|
235
|
+
return Uint8Array.from(bytes).buffer;
|
|
236
|
+
}
|
|
117
237
|
//# sourceMappingURL=auth.js.map
|
package/dist/auth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
|
package/dist/dfns-signer.d.ts
CHANGED
|
@@ -3,6 +3,13 @@ import { SolanaSigner } from '@solana/keychain-core';
|
|
|
3
3
|
import { SignableMessage, SignatureDictionary } from '@solana/signers';
|
|
4
4
|
import { Transaction, TransactionWithinSizeLimit, TransactionWithLifetime } from '@solana/transactions';
|
|
5
5
|
import type { DfnsSignerConfig } from './types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Create and initialize a Dfns-backed signer.
|
|
8
|
+
*
|
|
9
|
+
* @throws {SignerError} `SIGNER_CONFIG_ERROR` when required config is missing or invalid.
|
|
10
|
+
* @throws {SignerError} `SIGNER_HTTP_ERROR`, `SIGNER_REMOTE_API_ERROR`, `SIGNER_PARSING_ERROR`,
|
|
11
|
+
* or `SIGNER_INVALID_PUBLIC_KEY` when initialization fails.
|
|
12
|
+
*/
|
|
6
13
|
export declare function createDfnsSigner<TAddress extends string = string>(config: DfnsSignerConfig): Promise<SolanaSigner<TAddress>>;
|
|
7
14
|
/**
|
|
8
15
|
* Dfns-based signer for Solana transactions.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dfns-signer.d.ts","sourceRoot":"","sources":["../src/dfns-signer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAmB,MAAM,mBAAmB,CAAC;AAE7D,OAAO,
|
|
1
|
+
{"version":3,"file":"dfns-signer.d.ts","sourceRoot":"","sources":["../src/dfns-signer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAmB,MAAM,mBAAmB,CAAC;AAE7D,OAAO,EAKH,YAAY,EAEf,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,EAEH,WAAW,EACX,0BAA0B,EAC1B,uBAAuB,EAC1B,MAAM,sBAAsB,CAAC;AAG9B,OAAO,KAAK,EACR,gBAAgB,EAInB,MAAM,YAAY,CAAC;AAEpB;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CAAC,QAAQ,SAAS,MAAM,GAAG,MAAM,EACnE,MAAM,EAAE,gBAAgB,GACzB,OAAO,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAEjC;AAuBD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,qBAAa,UAAU,CAAC,QAAQ,SAAS,MAAM,GAAG,MAAM,CAAE,YAAW,YAAY,CAAC,QAAQ,CAAC;IACvF,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IACpC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAE/B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IAExC,OAAO;IAoBP;;;;;;OAMG;WACU,MAAM,CAAC,QAAQ,SAAS,MAAM,GAAG,MAAM,EAAE,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YAsFhG,KAAK;IAMnB;;OAEG;IACG,YAAY,CAAC,QAAQ,EAAE,SAAS,eAAe,EAAE,GAAG,OAAO,CAAC,SAAS,mBAAmB,EAAE,CAAC;IAyBjG;;OAEG;IACG,gBAAgB,CAClB,YAAY,EAAE,SAAS,CAAC,WAAW,GAAG,0BAA0B,GAAG,uBAAuB,CAAC,EAAE,GAC9F,OAAO,CAAC,SAAS,mBAAmB,EAAE,CAAC;IAwB1C;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IASrC;;OAEG;YACW,oBAAoB;CA2ErC"}
|
package/dist/dfns-signer.js
CHANGED
|
@@ -1,8 +1,15 @@
|
|
|
1
1
|
import { assertIsAddress } from '@solana/addresses';
|
|
2
2
|
import { getBase16Decoder, getBase16Encoder, getBase58Decoder } from '@solana/codecs-strings';
|
|
3
|
-
import { assertSignatureValid, createSignatureDictionary, SignerErrorCode, throwSignerError, } from '@solana/keychain-core';
|
|
3
|
+
import { assertSignatureValid, createSignatureDictionary, sanitizeRemoteErrorResponse, SignerErrorCode, throwSignerError, } from '@solana/keychain-core';
|
|
4
4
|
import { getTransactionEncoder, } from '@solana/transactions';
|
|
5
5
|
import { signUserAction } from './auth.js';
|
|
6
|
+
/**
|
|
7
|
+
* Create and initialize a Dfns-backed signer.
|
|
8
|
+
*
|
|
9
|
+
* @throws {SignerError} `SIGNER_CONFIG_ERROR` when required config is missing or invalid.
|
|
10
|
+
* @throws {SignerError} `SIGNER_HTTP_ERROR`, `SIGNER_REMOTE_API_ERROR`, `SIGNER_PARSING_ERROR`,
|
|
11
|
+
* or `SIGNER_INVALID_PUBLIC_KEY` when initialization fails.
|
|
12
|
+
*/
|
|
6
13
|
export async function createDfnsSigner(config) {
|
|
7
14
|
return await DfnsSigner.create(config);
|
|
8
15
|
}
|
|
@@ -85,6 +92,7 @@ export class DfnsSigner {
|
|
|
85
92
|
});
|
|
86
93
|
}
|
|
87
94
|
const apiBaseUrl = config.apiBaseUrl ?? DEFAULT_API_BASE_URL;
|
|
95
|
+
validateHttpsApiBaseUrl(apiBaseUrl);
|
|
88
96
|
const requestDelayMs = config.requestDelayMs ?? 0;
|
|
89
97
|
if (requestDelayMs < 0) {
|
|
90
98
|
throwSignerError(SignerErrorCode.CONFIG_ERROR, {
|
|
@@ -230,13 +238,13 @@ export class DfnsSigner {
|
|
|
230
238
|
const errorText = await response.text().catch(() => 'Failed to read error response');
|
|
231
239
|
throwSignerError(SignerErrorCode.REMOTE_API_ERROR, {
|
|
232
240
|
message: `Dfns signing API error: ${response.status}`,
|
|
233
|
-
response: errorText,
|
|
241
|
+
response: sanitizeRemoteErrorResponse(errorText),
|
|
234
242
|
status: response.status,
|
|
235
243
|
});
|
|
236
244
|
}
|
|
237
|
-
let
|
|
245
|
+
let rawSigResponse;
|
|
238
246
|
try {
|
|
239
|
-
|
|
247
|
+
rawSigResponse = await response.json();
|
|
240
248
|
}
|
|
241
249
|
catch (error) {
|
|
242
250
|
throwSignerError(SignerErrorCode.PARSING_ERROR, {
|
|
@@ -244,6 +252,7 @@ export class DfnsSigner {
|
|
|
244
252
|
message: 'Failed to parse Dfns signature response',
|
|
245
253
|
});
|
|
246
254
|
}
|
|
255
|
+
const sigResponse = parseSignatureResponse(rawSigResponse);
|
|
247
256
|
if (sigResponse.status === 'Failed') {
|
|
248
257
|
throwSignerError(SignerErrorCode.SIGNING_FAILED, {
|
|
249
258
|
message: 'Dfns signing failed',
|
|
@@ -287,12 +296,13 @@ async function fetchWallet(apiBaseUrl, authToken, walletId) {
|
|
|
287
296
|
const errorText = await response.text().catch(() => 'Failed to read error response');
|
|
288
297
|
throwSignerError(SignerErrorCode.REMOTE_API_ERROR, {
|
|
289
298
|
message: `Dfns API error: ${response.status}`,
|
|
290
|
-
response: errorText,
|
|
299
|
+
response: sanitizeRemoteErrorResponse(errorText),
|
|
291
300
|
status: response.status,
|
|
292
301
|
});
|
|
293
302
|
}
|
|
303
|
+
let rawWalletResponse;
|
|
294
304
|
try {
|
|
295
|
-
|
|
305
|
+
rawWalletResponse = await response.json();
|
|
296
306
|
}
|
|
297
307
|
catch (error) {
|
|
298
308
|
throwSignerError(SignerErrorCode.PARSING_ERROR, {
|
|
@@ -300,6 +310,57 @@ async function fetchWallet(apiBaseUrl, authToken, walletId) {
|
|
|
300
310
|
message: 'Failed to parse Dfns wallet response',
|
|
301
311
|
});
|
|
302
312
|
}
|
|
313
|
+
return parseWalletResponse(rawWalletResponse);
|
|
314
|
+
}
|
|
315
|
+
function validateHttpsApiBaseUrl(apiBaseUrl) {
|
|
316
|
+
let parsedUrl;
|
|
317
|
+
try {
|
|
318
|
+
parsedUrl = new URL(apiBaseUrl);
|
|
319
|
+
}
|
|
320
|
+
catch {
|
|
321
|
+
throwSignerError(SignerErrorCode.CONFIG_ERROR, {
|
|
322
|
+
message: 'apiBaseUrl is not a valid URL',
|
|
323
|
+
});
|
|
324
|
+
}
|
|
325
|
+
if (parsedUrl.protocol !== 'https:') {
|
|
326
|
+
throwSignerError(SignerErrorCode.CONFIG_ERROR, {
|
|
327
|
+
message: 'apiBaseUrl must use HTTPS',
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
function parseSignatureResponse(raw) {
|
|
332
|
+
if (!isObject(raw) || typeof raw.status !== 'string') {
|
|
333
|
+
throwSignerError(SignerErrorCode.PARSING_ERROR, {
|
|
334
|
+
message: 'Unexpected Dfns signature response shape',
|
|
335
|
+
});
|
|
336
|
+
}
|
|
337
|
+
if (raw.signature !== undefined) {
|
|
338
|
+
if (!isObject(raw.signature) || typeof raw.signature.r !== 'string' || typeof raw.signature.s !== 'string') {
|
|
339
|
+
throwSignerError(SignerErrorCode.PARSING_ERROR, {
|
|
340
|
+
message: 'Unexpected Dfns signature components shape',
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
return raw;
|
|
345
|
+
}
|
|
346
|
+
function parseWalletResponse(raw) {
|
|
347
|
+
if (!isObject(raw) || typeof raw.status !== 'string' || !isObject(raw.signingKey)) {
|
|
348
|
+
throwSignerError(SignerErrorCode.PARSING_ERROR, {
|
|
349
|
+
message: 'Unexpected Dfns wallet response shape',
|
|
350
|
+
});
|
|
351
|
+
}
|
|
352
|
+
if (typeof raw.signingKey.id !== 'string' ||
|
|
353
|
+
typeof raw.signingKey.scheme !== 'string' ||
|
|
354
|
+
typeof raw.signingKey.curve !== 'string' ||
|
|
355
|
+
typeof raw.signingKey.publicKey !== 'string') {
|
|
356
|
+
throwSignerError(SignerErrorCode.PARSING_ERROR, {
|
|
357
|
+
message: 'Unexpected Dfns wallet signing key shape',
|
|
358
|
+
});
|
|
359
|
+
}
|
|
360
|
+
return raw;
|
|
361
|
+
}
|
|
362
|
+
function isObject(value) {
|
|
363
|
+
return typeof value === 'object' && value !== null;
|
|
303
364
|
}
|
|
304
365
|
/**
|
|
305
366
|
* Pad signature component to exactly 32 bytes.
|
package/dist/dfns-signer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dfns-signer.js","sourceRoot":"","sources":["../src/dfns-signer.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"dfns-signer.js","sourceRoot":"","sources":["../src/dfns-signer.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@solana/keychain-dfns",
|
|
3
3
|
"author": "Solana Foundation",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "1.0.1",
|
|
5
5
|
"description": "Dfns-based signer for Solana transactions",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"repository": "https://github.com/solana-foundation/solana-keychain",
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
"src"
|
|
29
29
|
],
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@solana/keychain-core": "0.
|
|
31
|
+
"@solana/keychain-core": "1.0.1"
|
|
32
32
|
},
|
|
33
33
|
"peerDependencies": {
|
|
34
34
|
"@solana/addresses": ">=6.0.1",
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
"@solana/signers": "^6.0.1",
|
|
46
46
|
"@solana/transactions": "^6.0.1",
|
|
47
47
|
"dotenv": "^17.2.3",
|
|
48
|
-
"@solana/keychain-test-utils": "0.
|
|
48
|
+
"@solana/keychain-test-utils": "1.0.1"
|
|
49
49
|
},
|
|
50
50
|
"publishConfig": {
|
|
51
51
|
"access": "public"
|
|
@@ -1,8 +1,21 @@
|
|
|
1
|
+
import * as nodeCrypto from 'node:crypto';
|
|
2
|
+
|
|
1
3
|
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
2
4
|
|
|
3
5
|
vi.mock('@solana/keychain-core', async importOriginal => {
|
|
4
6
|
const mod = await importOriginal<typeof import('@solana/keychain-core')>();
|
|
5
|
-
return {
|
|
7
|
+
return {
|
|
8
|
+
...mod,
|
|
9
|
+
assertSignatureValid: vi.fn(),
|
|
10
|
+
sanitizeRemoteErrorResponse:
|
|
11
|
+
mod.sanitizeRemoteErrorResponse ??
|
|
12
|
+
((text: string) =>
|
|
13
|
+
`${text
|
|
14
|
+
.replace(/[\u0000-\u0008\u000B\u000C\u000E-\u001F\u007F]/g, ' ')
|
|
15
|
+
.replace(/\s+/g, ' ')
|
|
16
|
+
.trim()
|
|
17
|
+
.slice(0, 256)} [truncated]`),
|
|
18
|
+
};
|
|
6
19
|
});
|
|
7
20
|
|
|
8
21
|
import { DfnsSigner } from '../dfns-signer.js';
|
|
@@ -71,6 +84,25 @@ describe('DfnsSigner', () => {
|
|
|
71
84
|
);
|
|
72
85
|
});
|
|
73
86
|
|
|
87
|
+
it('throws CONFIG_ERROR when apiBaseUrl is not a valid URL', async () => {
|
|
88
|
+
await expect(DfnsSigner.create({ ...defaultConfig, apiBaseUrl: 'not-a-url' })).rejects.toMatchObject({
|
|
89
|
+
code: 'SIGNER_CONFIG_ERROR',
|
|
90
|
+
message: expect.stringContaining('apiBaseUrl is not a valid URL'),
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
it('throws CONFIG_ERROR when apiBaseUrl does not use HTTPS', async () => {
|
|
95
|
+
await expect(
|
|
96
|
+
DfnsSigner.create({
|
|
97
|
+
...defaultConfig,
|
|
98
|
+
apiBaseUrl: 'http://api.dfns.test',
|
|
99
|
+
}),
|
|
100
|
+
).rejects.toMatchObject({
|
|
101
|
+
code: 'SIGNER_CONFIG_ERROR',
|
|
102
|
+
message: expect.stringContaining('apiBaseUrl must use HTTPS'),
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
|
|
74
106
|
it('throws error for inactive wallet', async () => {
|
|
75
107
|
mockWalletFetch({ status: 'Inactive' });
|
|
76
108
|
await expect(DfnsSigner.create(defaultConfig)).rejects.toThrow('not active');
|
|
@@ -89,6 +121,18 @@ describe('DfnsSigner', () => {
|
|
|
89
121
|
await expect(DfnsSigner.create(defaultConfig)).rejects.toThrow();
|
|
90
122
|
});
|
|
91
123
|
|
|
124
|
+
it('throws PARSING_ERROR for malformed wallet response shape', async () => {
|
|
125
|
+
mockFetch.mockResolvedValueOnce({
|
|
126
|
+
json: async () => ({}),
|
|
127
|
+
ok: true,
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
await expect(DfnsSigner.create(defaultConfig)).rejects.toMatchObject({
|
|
131
|
+
code: 'SIGNER_PARSING_ERROR',
|
|
132
|
+
message: expect.stringContaining('Unexpected Dfns wallet response shape'),
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
|
|
92
136
|
it('throws error for negative requestDelayMs', async () => {
|
|
93
137
|
await expect(DfnsSigner.create({ ...defaultConfig, requestDelayMs: -1 })).rejects.toThrow(
|
|
94
138
|
'requestDelayMs must not be negative',
|
|
@@ -160,6 +204,74 @@ describe('DfnsSigner', () => {
|
|
|
160
204
|
expect(sig.length).toBe(64);
|
|
161
205
|
});
|
|
162
206
|
|
|
207
|
+
it('accepts escaped-newline PEM keys for auth challenge signing', async () => {
|
|
208
|
+
const rHex = '11'.repeat(32);
|
|
209
|
+
const sHex = '22'.repeat(32);
|
|
210
|
+
|
|
211
|
+
mockWalletFetch();
|
|
212
|
+
|
|
213
|
+
mockFetch.mockResolvedValueOnce({
|
|
214
|
+
json: async () => createUserActionInitResponse(),
|
|
215
|
+
ok: true,
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
mockFetch.mockResolvedValueOnce({
|
|
219
|
+
json: async () => createUserActionResponse(),
|
|
220
|
+
ok: true,
|
|
221
|
+
});
|
|
222
|
+
|
|
223
|
+
mockFetch.mockResolvedValueOnce({
|
|
224
|
+
json: async () => createSignatureResponse(rHex, sHex),
|
|
225
|
+
ok: true,
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
const signer = await DfnsSigner.create({
|
|
229
|
+
...defaultConfig,
|
|
230
|
+
privateKeyPem: TEST_ED25519_PEM.replace(/\n/g, '\\n'),
|
|
231
|
+
});
|
|
232
|
+
|
|
233
|
+
const result = await signer.signMessages([{ content: new Uint8Array([1, 2, 3]), signatures: {} }]);
|
|
234
|
+
|
|
235
|
+
expect(result).toHaveLength(1);
|
|
236
|
+
const sig = result[0]![signer.address]!;
|
|
237
|
+
expect(sig.length).toBe(64);
|
|
238
|
+
});
|
|
239
|
+
|
|
240
|
+
it('supports SEC1 PEM keys for auth challenge signing', async () => {
|
|
241
|
+
const { privateKey } = nodeCrypto.generateKeyPairSync('ec', { namedCurve: 'prime256v1' });
|
|
242
|
+
const sec1Pem = privateKey.export({ format: 'pem', type: 'sec1' }).toString();
|
|
243
|
+
const rHex = '11'.repeat(32);
|
|
244
|
+
const sHex = '22'.repeat(32);
|
|
245
|
+
|
|
246
|
+
mockWalletFetch();
|
|
247
|
+
|
|
248
|
+
mockFetch.mockResolvedValueOnce({
|
|
249
|
+
json: async () => createUserActionInitResponse(),
|
|
250
|
+
ok: true,
|
|
251
|
+
});
|
|
252
|
+
|
|
253
|
+
mockFetch.mockResolvedValueOnce({
|
|
254
|
+
json: async () => createUserActionResponse(),
|
|
255
|
+
ok: true,
|
|
256
|
+
});
|
|
257
|
+
|
|
258
|
+
mockFetch.mockResolvedValueOnce({
|
|
259
|
+
json: async () => createSignatureResponse(rHex, sHex),
|
|
260
|
+
ok: true,
|
|
261
|
+
});
|
|
262
|
+
|
|
263
|
+
const signer = await DfnsSigner.create({
|
|
264
|
+
...defaultConfig,
|
|
265
|
+
privateKeyPem: sec1Pem,
|
|
266
|
+
});
|
|
267
|
+
|
|
268
|
+
const result = await signer.signMessages([{ content: new Uint8Array([1, 2, 3]), signatures: {} }]);
|
|
269
|
+
|
|
270
|
+
expect(result).toHaveLength(1);
|
|
271
|
+
const sig = result[0]![signer.address]!;
|
|
272
|
+
expect(sig.length).toBe(64);
|
|
273
|
+
});
|
|
274
|
+
|
|
163
275
|
it('left-pads short signature components', async () => {
|
|
164
276
|
// r is 31 bytes (short by 1), s is 32 bytes
|
|
165
277
|
const rHex = 'ff'.repeat(31);
|
|
@@ -192,6 +304,75 @@ describe('DfnsSigner', () => {
|
|
|
192
304
|
expect(sig[0]).toBe(0x00);
|
|
193
305
|
expect(sig[1]).toBe(0xff);
|
|
194
306
|
});
|
|
307
|
+
|
|
308
|
+
it('throws PARSING_ERROR for malformed auth challenge response shape', async () => {
|
|
309
|
+
mockWalletFetch();
|
|
310
|
+
|
|
311
|
+
mockFetch.mockResolvedValueOnce({
|
|
312
|
+
json: async () => ({}),
|
|
313
|
+
ok: true,
|
|
314
|
+
});
|
|
315
|
+
|
|
316
|
+
const signer = await DfnsSigner.create(defaultConfig);
|
|
317
|
+
|
|
318
|
+
await expect(
|
|
319
|
+
signer.signMessages([{ content: new Uint8Array([1, 2, 3]), signatures: {} }]),
|
|
320
|
+
).rejects.toMatchObject({
|
|
321
|
+
code: 'SIGNER_PARSING_ERROR',
|
|
322
|
+
message: expect.stringContaining('Unexpected Dfns auth challenge response shape'),
|
|
323
|
+
});
|
|
324
|
+
});
|
|
325
|
+
|
|
326
|
+
it('throws PARSING_ERROR for malformed signature response shape', async () => {
|
|
327
|
+
mockWalletFetch();
|
|
328
|
+
|
|
329
|
+
mockFetch.mockResolvedValueOnce({
|
|
330
|
+
json: async () => createUserActionInitResponse(),
|
|
331
|
+
ok: true,
|
|
332
|
+
});
|
|
333
|
+
|
|
334
|
+
mockFetch.mockResolvedValueOnce({
|
|
335
|
+
json: async () => createUserActionResponse(),
|
|
336
|
+
ok: true,
|
|
337
|
+
});
|
|
338
|
+
|
|
339
|
+
mockFetch.mockResolvedValueOnce({
|
|
340
|
+
json: async () => ({}),
|
|
341
|
+
ok: true,
|
|
342
|
+
});
|
|
343
|
+
|
|
344
|
+
const signer = await DfnsSigner.create(defaultConfig);
|
|
345
|
+
|
|
346
|
+
await expect(
|
|
347
|
+
signer.signMessages([{ content: new Uint8Array([1, 2, 3]), signatures: {} }]),
|
|
348
|
+
).rejects.toMatchObject({
|
|
349
|
+
code: 'SIGNER_PARSING_ERROR',
|
|
350
|
+
message: expect.stringContaining('Unexpected Dfns signature response shape'),
|
|
351
|
+
});
|
|
352
|
+
});
|
|
353
|
+
|
|
354
|
+
it('throws PARSING_ERROR for malformed auth action response shape', async () => {
|
|
355
|
+
mockWalletFetch();
|
|
356
|
+
|
|
357
|
+
mockFetch.mockResolvedValueOnce({
|
|
358
|
+
json: async () => createUserActionInitResponse(),
|
|
359
|
+
ok: true,
|
|
360
|
+
});
|
|
361
|
+
|
|
362
|
+
mockFetch.mockResolvedValueOnce({
|
|
363
|
+
json: async () => ({}),
|
|
364
|
+
ok: true,
|
|
365
|
+
});
|
|
366
|
+
|
|
367
|
+
const signer = await DfnsSigner.create(defaultConfig);
|
|
368
|
+
|
|
369
|
+
await expect(
|
|
370
|
+
signer.signMessages([{ content: new Uint8Array([1, 2, 3]), signatures: {} }]),
|
|
371
|
+
).rejects.toMatchObject({
|
|
372
|
+
code: 'SIGNER_PARSING_ERROR',
|
|
373
|
+
message: expect.stringContaining('Unexpected Dfns auth action response shape'),
|
|
374
|
+
});
|
|
375
|
+
});
|
|
195
376
|
});
|
|
196
377
|
|
|
197
378
|
describe('isAvailable', () => {
|
package/src/auth.ts
CHANGED
|
@@ -1,9 +1,15 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import { getBase64Encoder } from '@solana/codecs-strings';
|
|
2
|
+
import {
|
|
3
|
+
base64UrlDecoder,
|
|
4
|
+
sanitizeRemoteErrorResponse,
|
|
5
|
+
SignerErrorCode,
|
|
6
|
+
throwSignerError,
|
|
7
|
+
} from '@solana/keychain-core';
|
|
4
8
|
|
|
5
9
|
import type { UserActionInitResponse, UserActionResponse } from './types.js';
|
|
6
10
|
|
|
11
|
+
let base64Encoder: ReturnType<typeof getBase64Encoder> | undefined;
|
|
12
|
+
|
|
7
13
|
/**
|
|
8
14
|
* Perform the Dfns User Action Signing flow. For more details, see https://docs.dfns.co/api-reference/auth/signing-flows#asymetric-keys-signing-flow
|
|
9
15
|
*
|
|
@@ -47,14 +53,14 @@ export async function signUserAction(
|
|
|
47
53
|
const errorText = await initResponse.text().catch(() => 'Failed to read error response');
|
|
48
54
|
throwSignerError(SignerErrorCode.REMOTE_API_ERROR, {
|
|
49
55
|
message: `Dfns auth/action/init failed: ${initResponse.status}`,
|
|
50
|
-
response: errorText,
|
|
56
|
+
response: sanitizeRemoteErrorResponse(errorText),
|
|
51
57
|
status: initResponse.status,
|
|
52
58
|
});
|
|
53
59
|
}
|
|
54
60
|
|
|
55
|
-
let
|
|
61
|
+
let rawChallenge: unknown;
|
|
56
62
|
try {
|
|
57
|
-
|
|
63
|
+
rawChallenge = await initResponse.json();
|
|
58
64
|
} catch (error) {
|
|
59
65
|
throwSignerError(SignerErrorCode.PARSING_ERROR, {
|
|
60
66
|
cause: error,
|
|
@@ -62,8 +68,12 @@ export async function signUserAction(
|
|
|
62
68
|
});
|
|
63
69
|
}
|
|
64
70
|
|
|
71
|
+
const challenge = parseUserActionInitResponse(rawChallenge);
|
|
72
|
+
|
|
65
73
|
// Verify credential is allowed
|
|
66
|
-
const allowed = challenge.allowCredentials.key.some(
|
|
74
|
+
const allowed = challenge.allowCredentials.key.some(
|
|
75
|
+
c => isObject(c) && typeof c.id === 'string' && c.id === credId,
|
|
76
|
+
);
|
|
67
77
|
if (!allowed) {
|
|
68
78
|
throwSignerError(SignerErrorCode.CONFIG_ERROR, {
|
|
69
79
|
message: `Credential ${credId} not in allowed credentials`,
|
|
@@ -78,10 +88,8 @@ export async function signUserAction(
|
|
|
78
88
|
}),
|
|
79
89
|
);
|
|
80
90
|
|
|
81
|
-
const signature = crypto.sign(undefined, clientData, privateKeyPem);
|
|
82
|
-
|
|
83
91
|
const clientDataB64 = base64UrlDecoder(clientData);
|
|
84
|
-
const signatureB64 = base64UrlDecoder(
|
|
92
|
+
const signatureB64 = base64UrlDecoder(await signClientData(clientData, privateKeyPem));
|
|
85
93
|
|
|
86
94
|
// Submit the signed challenge
|
|
87
95
|
const actionUrl = `${apiBaseUrl}/auth/action`;
|
|
@@ -117,14 +125,14 @@ export async function signUserAction(
|
|
|
117
125
|
const errorText = await signResponse.text().catch(() => 'Failed to read error response');
|
|
118
126
|
throwSignerError(SignerErrorCode.REMOTE_API_ERROR, {
|
|
119
127
|
message: `Dfns auth/action failed: ${signResponse.status}`,
|
|
120
|
-
response: errorText,
|
|
128
|
+
response: sanitizeRemoteErrorResponse(errorText),
|
|
121
129
|
status: signResponse.status,
|
|
122
130
|
});
|
|
123
131
|
}
|
|
124
132
|
|
|
125
|
-
let
|
|
133
|
+
let rawActionResponse: unknown;
|
|
126
134
|
try {
|
|
127
|
-
|
|
135
|
+
rawActionResponse = await signResponse.json();
|
|
128
136
|
} catch (error) {
|
|
129
137
|
throwSignerError(SignerErrorCode.PARSING_ERROR, {
|
|
130
138
|
cause: error,
|
|
@@ -132,5 +140,150 @@ export async function signUserAction(
|
|
|
132
140
|
});
|
|
133
141
|
}
|
|
134
142
|
|
|
143
|
+
const actionResponse = parseUserActionResponse(rawActionResponse);
|
|
144
|
+
|
|
135
145
|
return actionResponse.userAction;
|
|
136
146
|
}
|
|
147
|
+
|
|
148
|
+
function parseUserActionInitResponse(raw: unknown): UserActionInitResponse {
|
|
149
|
+
if (!isObject(raw) || !isObject(raw.allowCredentials) || !Array.isArray(raw.allowCredentials.key)) {
|
|
150
|
+
throwSignerError(SignerErrorCode.PARSING_ERROR, {
|
|
151
|
+
message: 'Unexpected Dfns auth challenge response shape',
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
if (typeof raw.challenge !== 'string' || typeof raw.challengeIdentifier !== 'string') {
|
|
156
|
+
throwSignerError(SignerErrorCode.PARSING_ERROR, {
|
|
157
|
+
message: 'Unexpected Dfns auth challenge response shape',
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
return raw as unknown as UserActionInitResponse;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
function parseUserActionResponse(raw: unknown): UserActionResponse {
|
|
165
|
+
if (!isObject(raw) || typeof raw.userAction !== 'string') {
|
|
166
|
+
throwSignerError(SignerErrorCode.PARSING_ERROR, {
|
|
167
|
+
message: 'Unexpected Dfns auth action response shape',
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
return raw as unknown as UserActionResponse;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
function isObject(value: unknown): value is Record<string, unknown> {
|
|
175
|
+
return typeof value === 'object' && value !== null;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
async function signClientData(clientData: Uint8Array, privateKeyPem: string): Promise<Uint8Array> {
|
|
179
|
+
const normalizedPem = normalizePrivateKeyPem(privateKeyPem);
|
|
180
|
+
|
|
181
|
+
let latestError: unknown;
|
|
182
|
+
const subtle = globalThis.crypto?.subtle;
|
|
183
|
+
if (subtle) {
|
|
184
|
+
try {
|
|
185
|
+
const signature = await signClientDataWithWebCrypto(subtle, clientData, normalizedPem);
|
|
186
|
+
if (signature) {
|
|
187
|
+
return signature;
|
|
188
|
+
}
|
|
189
|
+
} catch (error) {
|
|
190
|
+
latestError = error;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
try {
|
|
195
|
+
const signature = await signClientDataWithNodeCrypto(clientData, normalizedPem);
|
|
196
|
+
if (signature) {
|
|
197
|
+
return signature;
|
|
198
|
+
}
|
|
199
|
+
} catch (error) {
|
|
200
|
+
latestError = error;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
throwSignerError(SignerErrorCode.SIGNING_FAILED, {
|
|
204
|
+
cause: latestError,
|
|
205
|
+
message: 'Failed to sign Dfns auth challenge',
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
function normalizePrivateKeyPem(privateKeyPem: string): string {
|
|
210
|
+
// CI secrets are often stored as single-line values with escaped newlines.
|
|
211
|
+
return privateKeyPem.replace(/\\n/g, '\n').replace(/\r/g, '').trim();
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
async function signClientDataWithWebCrypto(
|
|
215
|
+
subtle: SubtleCrypto,
|
|
216
|
+
clientData: Uint8Array,
|
|
217
|
+
privateKeyPem: string,
|
|
218
|
+
): Promise<Uint8Array | undefined> {
|
|
219
|
+
const privateKeyDer = toArrayBuffer(pemToDer(privateKeyPem));
|
|
220
|
+
const input = toArrayBuffer(clientData);
|
|
221
|
+
|
|
222
|
+
const attempts: ReadonlyArray<{
|
|
223
|
+
importAlgorithm: AlgorithmIdentifier | EcKeyImportParams | RsaHashedImportParams;
|
|
224
|
+
signAlgorithm: AlgorithmIdentifier | EcdsaParams;
|
|
225
|
+
}> = [
|
|
226
|
+
{ importAlgorithm: 'Ed25519', signAlgorithm: 'Ed25519' },
|
|
227
|
+
{
|
|
228
|
+
importAlgorithm: { name: 'ECDSA', namedCurve: 'P-256' },
|
|
229
|
+
signAlgorithm: { hash: 'SHA-256', name: 'ECDSA' },
|
|
230
|
+
},
|
|
231
|
+
{
|
|
232
|
+
importAlgorithm: { hash: 'SHA-256', name: 'RSASSA-PKCS1-v1_5' },
|
|
233
|
+
signAlgorithm: 'RSASSA-PKCS1-v1_5',
|
|
234
|
+
},
|
|
235
|
+
];
|
|
236
|
+
|
|
237
|
+
for (const attempt of attempts) {
|
|
238
|
+
try {
|
|
239
|
+
const privateKey = await subtle.importKey('pkcs8', privateKeyDer, attempt.importAlgorithm, false, ['sign']);
|
|
240
|
+
const signature = await subtle.sign(attempt.signAlgorithm, privateKey, input);
|
|
241
|
+
return new Uint8Array(signature);
|
|
242
|
+
} catch {
|
|
243
|
+
// Try the next key algorithm.
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
return undefined;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
async function signClientDataWithNodeCrypto(
|
|
251
|
+
clientData: Uint8Array,
|
|
252
|
+
privateKeyPem: string,
|
|
253
|
+
): Promise<Uint8Array | undefined> {
|
|
254
|
+
try {
|
|
255
|
+
const nodeCrypto = await import('node:crypto');
|
|
256
|
+
const signature = nodeCrypto.sign(undefined, clientData, privateKeyPem);
|
|
257
|
+
return new Uint8Array(signature);
|
|
258
|
+
} catch {
|
|
259
|
+
return undefined;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
function pemToDer(privateKeyPem: string): Uint8Array {
|
|
264
|
+
const normalizedPem = normalizePrivateKeyPem(privateKeyPem);
|
|
265
|
+
const pemBody = normalizedPem
|
|
266
|
+
.replace(/-----BEGIN [^-]+-----/g, '')
|
|
267
|
+
.replace(/-----END [^-]+-----/g, '')
|
|
268
|
+
.replace(/\s+/g, '');
|
|
269
|
+
|
|
270
|
+
if (!pemBody) {
|
|
271
|
+
throwSignerError(SignerErrorCode.CONFIG_ERROR, {
|
|
272
|
+
message: 'privateKeyPem must be a non-empty PEM key',
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
try {
|
|
277
|
+
base64Encoder ||= getBase64Encoder();
|
|
278
|
+
return new Uint8Array(base64Encoder.encode(pemBody));
|
|
279
|
+
} catch (error) {
|
|
280
|
+
throwSignerError(SignerErrorCode.CONFIG_ERROR, {
|
|
281
|
+
cause: error,
|
|
282
|
+
message: 'privateKeyPem must be a valid PEM key',
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
function toArrayBuffer(bytes: Uint8Array): ArrayBuffer {
|
|
288
|
+
return Uint8Array.from(bytes).buffer;
|
|
289
|
+
}
|
package/src/dfns-signer.ts
CHANGED
|
@@ -3,6 +3,7 @@ import { getBase16Decoder, getBase16Encoder, getBase58Decoder } from '@solana/co
|
|
|
3
3
|
import {
|
|
4
4
|
assertSignatureValid,
|
|
5
5
|
createSignatureDictionary,
|
|
6
|
+
sanitizeRemoteErrorResponse,
|
|
6
7
|
SignerErrorCode,
|
|
7
8
|
SolanaSigner,
|
|
8
9
|
throwSignerError,
|
|
@@ -24,6 +25,13 @@ import type {
|
|
|
24
25
|
GetWalletResponse,
|
|
25
26
|
} from './types.js';
|
|
26
27
|
|
|
28
|
+
/**
|
|
29
|
+
* Create and initialize a Dfns-backed signer.
|
|
30
|
+
*
|
|
31
|
+
* @throws {SignerError} `SIGNER_CONFIG_ERROR` when required config is missing or invalid.
|
|
32
|
+
* @throws {SignerError} `SIGNER_HTTP_ERROR`, `SIGNER_REMOTE_API_ERROR`, `SIGNER_PARSING_ERROR`,
|
|
33
|
+
* or `SIGNER_INVALID_PUBLIC_KEY` when initialization fails.
|
|
34
|
+
*/
|
|
27
35
|
export async function createDfnsSigner<TAddress extends string = string>(
|
|
28
36
|
config: DfnsSignerConfig,
|
|
29
37
|
): Promise<SolanaSigner<TAddress>> {
|
|
@@ -137,6 +145,7 @@ export class DfnsSigner<TAddress extends string = string> implements SolanaSigne
|
|
|
137
145
|
}
|
|
138
146
|
|
|
139
147
|
const apiBaseUrl = config.apiBaseUrl ?? DEFAULT_API_BASE_URL;
|
|
148
|
+
validateHttpsApiBaseUrl(apiBaseUrl);
|
|
140
149
|
const requestDelayMs = config.requestDelayMs ?? 0;
|
|
141
150
|
|
|
142
151
|
if (requestDelayMs < 0) {
|
|
@@ -312,14 +321,14 @@ export class DfnsSigner<TAddress extends string = string> implements SolanaSigne
|
|
|
312
321
|
const errorText = await response.text().catch(() => 'Failed to read error response');
|
|
313
322
|
throwSignerError(SignerErrorCode.REMOTE_API_ERROR, {
|
|
314
323
|
message: `Dfns signing API error: ${response.status}`,
|
|
315
|
-
response: errorText,
|
|
324
|
+
response: sanitizeRemoteErrorResponse(errorText),
|
|
316
325
|
status: response.status,
|
|
317
326
|
});
|
|
318
327
|
}
|
|
319
328
|
|
|
320
|
-
let
|
|
329
|
+
let rawSigResponse: unknown;
|
|
321
330
|
try {
|
|
322
|
-
|
|
331
|
+
rawSigResponse = await response.json();
|
|
323
332
|
} catch (error) {
|
|
324
333
|
throwSignerError(SignerErrorCode.PARSING_ERROR, {
|
|
325
334
|
cause: error,
|
|
@@ -327,6 +336,8 @@ export class DfnsSigner<TAddress extends string = string> implements SolanaSigne
|
|
|
327
336
|
});
|
|
328
337
|
}
|
|
329
338
|
|
|
339
|
+
const sigResponse = parseSignatureResponse(rawSigResponse);
|
|
340
|
+
|
|
330
341
|
if (sigResponse.status === 'Failed') {
|
|
331
342
|
throwSignerError(SignerErrorCode.SIGNING_FAILED, {
|
|
332
343
|
message: 'Dfns signing failed',
|
|
@@ -374,19 +385,82 @@ async function fetchWallet(apiBaseUrl: string, authToken: string, walletId: stri
|
|
|
374
385
|
const errorText = await response.text().catch(() => 'Failed to read error response');
|
|
375
386
|
throwSignerError(SignerErrorCode.REMOTE_API_ERROR, {
|
|
376
387
|
message: `Dfns API error: ${response.status}`,
|
|
377
|
-
response: errorText,
|
|
388
|
+
response: sanitizeRemoteErrorResponse(errorText),
|
|
378
389
|
status: response.status,
|
|
379
390
|
});
|
|
380
391
|
}
|
|
381
392
|
|
|
393
|
+
let rawWalletResponse: unknown;
|
|
382
394
|
try {
|
|
383
|
-
|
|
395
|
+
rawWalletResponse = await response.json();
|
|
384
396
|
} catch (error) {
|
|
385
397
|
throwSignerError(SignerErrorCode.PARSING_ERROR, {
|
|
386
398
|
cause: error,
|
|
387
399
|
message: 'Failed to parse Dfns wallet response',
|
|
388
400
|
});
|
|
389
401
|
}
|
|
402
|
+
|
|
403
|
+
return parseWalletResponse(rawWalletResponse);
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
function validateHttpsApiBaseUrl(apiBaseUrl: string): void {
|
|
407
|
+
let parsedUrl: URL;
|
|
408
|
+
try {
|
|
409
|
+
parsedUrl = new URL(apiBaseUrl);
|
|
410
|
+
} catch {
|
|
411
|
+
throwSignerError(SignerErrorCode.CONFIG_ERROR, {
|
|
412
|
+
message: 'apiBaseUrl is not a valid URL',
|
|
413
|
+
});
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
if (parsedUrl.protocol !== 'https:') {
|
|
417
|
+
throwSignerError(SignerErrorCode.CONFIG_ERROR, {
|
|
418
|
+
message: 'apiBaseUrl must use HTTPS',
|
|
419
|
+
});
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
function parseSignatureResponse(raw: unknown): GenerateSignatureResponse {
|
|
424
|
+
if (!isObject(raw) || typeof raw.status !== 'string') {
|
|
425
|
+
throwSignerError(SignerErrorCode.PARSING_ERROR, {
|
|
426
|
+
message: 'Unexpected Dfns signature response shape',
|
|
427
|
+
});
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
if (raw.signature !== undefined) {
|
|
431
|
+
if (!isObject(raw.signature) || typeof raw.signature.r !== 'string' || typeof raw.signature.s !== 'string') {
|
|
432
|
+
throwSignerError(SignerErrorCode.PARSING_ERROR, {
|
|
433
|
+
message: 'Unexpected Dfns signature components shape',
|
|
434
|
+
});
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
return raw as unknown as GenerateSignatureResponse;
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
function parseWalletResponse(raw: unknown): GetWalletResponse {
|
|
442
|
+
if (!isObject(raw) || typeof raw.status !== 'string' || !isObject(raw.signingKey)) {
|
|
443
|
+
throwSignerError(SignerErrorCode.PARSING_ERROR, {
|
|
444
|
+
message: 'Unexpected Dfns wallet response shape',
|
|
445
|
+
});
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
if (
|
|
449
|
+
typeof raw.signingKey.id !== 'string' ||
|
|
450
|
+
typeof raw.signingKey.scheme !== 'string' ||
|
|
451
|
+
typeof raw.signingKey.curve !== 'string' ||
|
|
452
|
+
typeof raw.signingKey.publicKey !== 'string'
|
|
453
|
+
) {
|
|
454
|
+
throwSignerError(SignerErrorCode.PARSING_ERROR, {
|
|
455
|
+
message: 'Unexpected Dfns wallet signing key shape',
|
|
456
|
+
});
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
return raw as unknown as GetWalletResponse;
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
function isObject(value: unknown): value is Record<string, unknown> {
|
|
463
|
+
return typeof value === 'object' && value !== null;
|
|
390
464
|
}
|
|
391
465
|
|
|
392
466
|
/**
|