@bitgo/passkey-crypto 0.2.0 → 0.3.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/src/attachPasskeyToWallet.d.ts +11 -0
- package/dist/src/attachPasskeyToWallet.d.ts.map +1 -0
- package/dist/src/attachPasskeyToWallet.js +63 -0
- package/dist/src/base64url.d.ts +16 -0
- package/dist/src/base64url.d.ts.map +1 -0
- package/dist/src/base64url.js +27 -0
- package/dist/src/deriveEnterpriseSalt.d.ts +7 -1
- package/dist/src/deriveEnterpriseSalt.d.ts.map +1 -1
- package/dist/src/deriveEnterpriseSalt.js +12 -42
- package/dist/src/derivePasskeyPrfKey.d.ts +15 -0
- package/dist/src/derivePasskeyPrfKey.d.ts.map +1 -0
- package/dist/src/derivePasskeyPrfKey.js +68 -0
- package/dist/src/index.d.ts +5 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +12 -2
- package/dist/src/prfHelpers.d.ts.map +1 -1
- package/dist/src/prfHelpers.js +19 -4
- package/dist/src/registerPasskey.d.ts +10 -0
- package/dist/src/registerPasskey.d.ts.map +1 -0
- package/dist/src/registerPasskey.js +93 -0
- package/dist/src/removePasskeyFromAccount.d.ts +11 -0
- package/dist/src/removePasskeyFromAccount.d.ts.map +1 -0
- package/dist/src/removePasskeyFromAccount.js +15 -0
- package/dist/src/removePasskeyFromWallet.d.ts +10 -0
- package/dist/src/removePasskeyFromWallet.d.ts.map +1 -0
- package/dist/src/removePasskeyFromWallet.js +22 -0
- package/dist/test/integration/helpers/fixtures.d.ts +12 -0
- package/dist/test/integration/helpers/fixtures.d.ts.map +1 -0
- package/dist/test/integration/helpers/fixtures.js +15 -0
- package/dist/test/integration/helpers/mockBitGo.d.ts +27 -0
- package/dist/test/integration/helpers/mockBitGo.d.ts.map +1 -0
- package/dist/test/integration/helpers/mockBitGo.js +148 -0
- package/dist/test/integration/helpers/mockProvider.d.ts +5 -0
- package/dist/test/integration/helpers/mockProvider.d.ts.map +1 -0
- package/dist/test/integration/helpers/mockProvider.js +37 -0
- package/dist/test/integration/passkeyLifecycle.test.d.ts +2 -0
- package/dist/test/integration/passkeyLifecycle.test.d.ts.map +1 -0
- package/dist/test/integration/passkeyLifecycle.test.js +153 -0
- package/dist/test/unit/attachPasskeyToWallet.test.d.ts +2 -0
- package/dist/test/unit/attachPasskeyToWallet.test.d.ts.map +1 -0
- package/dist/test/unit/attachPasskeyToWallet.test.js +205 -0
- package/dist/test/unit/base64url.test.d.ts +2 -0
- package/dist/test/unit/base64url.test.d.ts.map +1 -0
- package/dist/test/unit/base64url.test.js +75 -0
- package/dist/test/unit/deriveEnterpriseSalt.test.js +8 -4
- package/dist/test/unit/derivePasskeyPrfKey.test.d.ts +2 -0
- package/dist/test/unit/derivePasskeyPrfKey.test.d.ts.map +1 -0
- package/dist/test/unit/derivePasskeyPrfKey.test.js +152 -0
- package/dist/test/unit/registerPasskey.test.d.ts +2 -0
- package/dist/test/unit/registerPasskey.test.d.ts.map +1 -0
- package/dist/test/unit/registerPasskey.test.js +155 -0
- package/dist/test/unit/removePasskeyFromAccount.test.d.ts +2 -0
- package/dist/test/unit/removePasskeyFromAccount.test.d.ts.map +1 -0
- package/dist/test/unit/removePasskeyFromAccount.test.js +88 -0
- package/dist/test/unit/removePasskeyFromWallet.test.d.ts +2 -0
- package/dist/test/unit/removePasskeyFromWallet.test.d.ts.map +1 -0
- package/dist/test/unit/removePasskeyFromWallet.test.js +170 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +7 -5
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.removePasskeyFromAccount = removePasskeyFromAccount;
|
|
4
|
+
/**
|
|
5
|
+
* Permanently removes a passkey credential from the user's account.
|
|
6
|
+
* Call removePasskeyFromWallet() for all affected wallets before calling this.
|
|
7
|
+
*/
|
|
8
|
+
async function removePasskeyFromAccount(params) {
|
|
9
|
+
const { bitgo, device } = params;
|
|
10
|
+
if (!device.id) {
|
|
11
|
+
throw new Error('device.id is required to remove a passkey from the account');
|
|
12
|
+
}
|
|
13
|
+
await bitgo.del(bitgo.url(`/user/otp/${device.id}`)).result();
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVtb3ZlUGFzc2tleUZyb21BY2NvdW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3JlbW92ZVBhc3NrZXlGcm9tQWNjb3VudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQU9BLDREQU1DO0FBVkQ7OztHQUdHO0FBQ0ksS0FBSyxVQUFVLHdCQUF3QixDQUFDLE1BQXVEO0lBQ3BHLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDO0lBQ2pDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDZixNQUFNLElBQUksS0FBSyxDQUFDLDREQUE0RCxDQUFDLENBQUM7SUFDaEYsQ0FBQztJQUNELE1BQU0sS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLGFBQWEsTUFBTSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztBQUNoRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQml0R29CYXNlIH0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCB0eXBlIHsgV2ViQXV0aG5PdHBEZXZpY2UgfSBmcm9tICdAYml0Z28vcHVibGljLXR5cGVzJztcblxuLyoqXG4gKiBQZXJtYW5lbnRseSByZW1vdmVzIGEgcGFzc2tleSBjcmVkZW50aWFsIGZyb20gdGhlIHVzZXIncyBhY2NvdW50LlxuICogQ2FsbCByZW1vdmVQYXNza2V5RnJvbVdhbGxldCgpIGZvciBhbGwgYWZmZWN0ZWQgd2FsbGV0cyBiZWZvcmUgY2FsbGluZyB0aGlzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVtb3ZlUGFzc2tleUZyb21BY2NvdW50KHBhcmFtczogeyBiaXRnbzogQml0R29CYXNlOyBkZXZpY2U6IFdlYkF1dGhuT3RwRGV2aWNlIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBiaXRnbywgZGV2aWNlIH0gPSBwYXJhbXM7XG4gIGlmICghZGV2aWNlLmlkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdkZXZpY2UuaWQgaXMgcmVxdWlyZWQgdG8gcmVtb3ZlIGEgcGFzc2tleSBmcm9tIHRoZSBhY2NvdW50Jyk7XG4gIH1cbiAgYXdhaXQgYml0Z28uZGVsKGJpdGdvLnVybChgL3VzZXIvb3RwLyR7ZGV2aWNlLmlkfWApKS5yZXN1bHQoKTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { BitGoBase } from '@bitgo/sdk-core';
|
|
2
|
+
import { WebAuthnOtpDevice } from './webAuthnTypes';
|
|
3
|
+
export declare function removePasskeyFromWallet(params: {
|
|
4
|
+
bitgo: BitGoBase;
|
|
5
|
+
coin: string;
|
|
6
|
+
walletId: string;
|
|
7
|
+
device: WebAuthnOtpDevice;
|
|
8
|
+
walletPassphrase: string;
|
|
9
|
+
}): Promise<void>;
|
|
10
|
+
//# sourceMappingURL=removePasskeyFromWallet.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"removePasskeyFromWallet.d.ts","sourceRoot":"","sources":["../../src/removePasskeyFromWallet.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAA6B,MAAM,iBAAiB,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEpD,wBAAsB,uBAAuB,CAAC,MAAM,EAAE;IACpD,KAAK,EAAE,SAAS,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,iBAAiB,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;CAC1B,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBhB"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.removePasskeyFromWallet = removePasskeyFromWallet;
|
|
4
|
+
const sdk_core_1 = require("@bitgo/sdk-core");
|
|
5
|
+
async function removePasskeyFromWallet(params) {
|
|
6
|
+
const { bitgo, coin: coinName, walletId, device, walletPassphrase } = params;
|
|
7
|
+
if (!device.id) {
|
|
8
|
+
throw new Error('device.id is required to remove a passkey from the wallet');
|
|
9
|
+
}
|
|
10
|
+
const baseCoin = bitgo.coin(coinName);
|
|
11
|
+
const wallet = await baseCoin.wallets().get({ id: walletId });
|
|
12
|
+
const keychainId = wallet.keyIds()[0];
|
|
13
|
+
const keychain = await baseCoin.keychains().get({ id: keychainId });
|
|
14
|
+
// Verify passphrase before any mutation
|
|
15
|
+
const decrypted = (0, sdk_core_1.decryptKeychainPrivateKey)(bitgo, keychain, walletPassphrase);
|
|
16
|
+
if (!decrypted) {
|
|
17
|
+
throw new Error('Incorrect wallet passphrase. Passkey removal aborted to prevent lockout.');
|
|
18
|
+
}
|
|
19
|
+
// No sdk-core abstraction for this endpoint; raw DELETE is required
|
|
20
|
+
await bitgo.del(bitgo.url(`/key/${keychainId}/webauthndevice/${device.id}`, 2)).result();
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVtb3ZlUGFzc2tleUZyb21XYWxsZXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcmVtb3ZlUGFzc2tleUZyb21XYWxsZXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFHQSwwREEwQkM7QUE3QkQsOENBQXVFO0FBR2hFLEtBQUssVUFBVSx1QkFBdUIsQ0FBQyxNQU03QztJQUNDLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLGdCQUFnQixFQUFFLEdBQUcsTUFBTSxDQUFDO0lBRTdFLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDZixNQUFNLElBQUksS0FBSyxDQUFDLDJEQUEyRCxDQUFDLENBQUM7SUFDL0UsQ0FBQztJQUVELE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdEMsTUFBTSxNQUFNLEdBQUcsTUFBTSxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDOUQsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3RDLE1BQU0sUUFBUSxHQUFHLE1BQU0sUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBRXBFLHdDQUF3QztJQUN4QyxNQUFNLFNBQVMsR0FBRyxJQUFBLG9DQUF5QixFQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztJQUMvRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDZixNQUFNLElBQUksS0FBSyxDQUFDLDBFQUEwRSxDQUFDLENBQUM7SUFDOUYsQ0FBQztJQUVELG9FQUFvRTtJQUNwRSxNQUFNLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxRQUFRLFVBQVUsbUJBQW1CLE1BQU0sQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO0FBQzNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCaXRHb0Jhc2UsIGRlY3J5cHRLZXljaGFpblByaXZhdGVLZXkgfSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgV2ViQXV0aG5PdHBEZXZpY2UgfSBmcm9tICcuL3dlYkF1dGhuVHlwZXMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVtb3ZlUGFzc2tleUZyb21XYWxsZXQocGFyYW1zOiB7XG4gIGJpdGdvOiBCaXRHb0Jhc2U7XG4gIGNvaW46IHN0cmluZztcbiAgd2FsbGV0SWQ6IHN0cmluZztcbiAgZGV2aWNlOiBXZWJBdXRobk90cERldmljZTtcbiAgd2FsbGV0UGFzc3BocmFzZTogc3RyaW5nO1xufSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IGJpdGdvLCBjb2luOiBjb2luTmFtZSwgd2FsbGV0SWQsIGRldmljZSwgd2FsbGV0UGFzc3BocmFzZSB9ID0gcGFyYW1zO1xuXG4gIGlmICghZGV2aWNlLmlkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdkZXZpY2UuaWQgaXMgcmVxdWlyZWQgdG8gcmVtb3ZlIGEgcGFzc2tleSBmcm9tIHRoZSB3YWxsZXQnKTtcbiAgfVxuXG4gIGNvbnN0IGJhc2VDb2luID0gYml0Z28uY29pbihjb2luTmFtZSk7XG4gIGNvbnN0IHdhbGxldCA9IGF3YWl0IGJhc2VDb2luLndhbGxldHMoKS5nZXQoeyBpZDogd2FsbGV0SWQgfSk7XG4gIGNvbnN0IGtleWNoYWluSWQgPSB3YWxsZXQua2V5SWRzKClbMF07XG4gIGNvbnN0IGtleWNoYWluID0gYXdhaXQgYmFzZUNvaW4ua2V5Y2hhaW5zKCkuZ2V0KHsgaWQ6IGtleWNoYWluSWQgfSk7XG5cbiAgLy8gVmVyaWZ5IHBhc3NwaHJhc2UgYmVmb3JlIGFueSBtdXRhdGlvblxuICBjb25zdCBkZWNyeXB0ZWQgPSBkZWNyeXB0S2V5Y2hhaW5Qcml2YXRlS2V5KGJpdGdvLCBrZXljaGFpbiwgd2FsbGV0UGFzc3BocmFzZSk7XG4gIGlmICghZGVjcnlwdGVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbmNvcnJlY3Qgd2FsbGV0IHBhc3NwaHJhc2UuIFBhc3NrZXkgcmVtb3ZhbCBhYm9ydGVkIHRvIHByZXZlbnQgbG9ja291dC4nKTtcbiAgfVxuXG4gIC8vIE5vIHNkay1jb3JlIGFic3RyYWN0aW9uIGZvciB0aGlzIGVuZHBvaW50OyByYXcgREVMRVRFIGlzIHJlcXVpcmVkXG4gIGF3YWl0IGJpdGdvLmRlbChiaXRnby51cmwoYC9rZXkvJHtrZXljaGFpbklkfS93ZWJhdXRobmRldmljZS8ke2RldmljZS5pZH1gLCAyKSkucmVzdWx0KCk7XG59XG4iXX0=
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare const ENTERPRISE_ID = "enterprise-abc";
|
|
2
|
+
export declare const WALLET_ID = "wallet-hot-123";
|
|
3
|
+
export declare const KEYCHAIN_ID = "key-user-001";
|
|
4
|
+
export declare const COIN = "tbtc";
|
|
5
|
+
export declare const EXISTING_PASSPHRASE = "my-existing-passphrase";
|
|
6
|
+
export declare const PRF_OUTPUT: ArrayBuffer;
|
|
7
|
+
export declare const CREDENTIAL_ID = "Y3JlZC1pZC00NTY";
|
|
8
|
+
export declare const DEVICE_MONGO_ID = "device-mongo-id-1";
|
|
9
|
+
export declare const BASE_SALT = "ZqJ64M2dL65zn2-Jxd58SMN2ILc9QjbCFxUTGHd_LC8";
|
|
10
|
+
export declare const REGISTER_CHALLENGE: string;
|
|
11
|
+
export declare const ASSERTION_CHALLENGE: string;
|
|
12
|
+
//# sourceMappingURL=fixtures.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fixtures.d.ts","sourceRoot":"","sources":["../../../../test/integration/helpers/fixtures.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,aAAa,mBAAmB,CAAC;AAC9C,eAAO,MAAM,SAAS,mBAAmB,CAAC;AAC1C,eAAO,MAAM,WAAW,iBAAiB,CAAC;AAC1C,eAAO,MAAM,IAAI,SAAS,CAAC;AAC3B,eAAO,MAAM,mBAAmB,2BAA2B,CAAC;AAC5D,eAAO,MAAM,UAAU,aAA0E,CAAC;AAClG,eAAO,MAAM,aAAa,oBAAoB,CAAC;AAC/C,eAAO,MAAM,eAAe,sBAAsB,CAAC;AACnD,eAAO,MAAM,SAAS,gDAAgD,CAAC;AACvE,eAAO,MAAM,kBAAkB,QAAqD,CAAC;AACrF,eAAO,MAAM,mBAAmB,QAAwD,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ASSERTION_CHALLENGE = exports.REGISTER_CHALLENGE = exports.BASE_SALT = exports.DEVICE_MONGO_ID = exports.CREDENTIAL_ID = exports.PRF_OUTPUT = exports.EXISTING_PASSPHRASE = exports.COIN = exports.KEYCHAIN_ID = exports.WALLET_ID = exports.ENTERPRISE_ID = void 0;
|
|
4
|
+
exports.ENTERPRISE_ID = 'enterprise-abc';
|
|
5
|
+
exports.WALLET_ID = 'wallet-hot-123';
|
|
6
|
+
exports.KEYCHAIN_ID = 'key-user-001';
|
|
7
|
+
exports.COIN = 'tbtc';
|
|
8
|
+
exports.EXISTING_PASSPHRASE = 'my-existing-passphrase';
|
|
9
|
+
exports.PRF_OUTPUT = new Uint8Array([0xde, 0xad, 0xbe, 0xef, 0xca, 0xfe, 0x01, 0x02]).buffer;
|
|
10
|
+
exports.CREDENTIAL_ID = 'Y3JlZC1pZC00NTY';
|
|
11
|
+
exports.DEVICE_MONGO_ID = 'device-mongo-id-1';
|
|
12
|
+
exports.BASE_SALT = 'ZqJ64M2dL65zn2-Jxd58SMN2ILc9QjbCFxUTGHd_LC8';
|
|
13
|
+
exports.REGISTER_CHALLENGE = Buffer.from('random-challenge').toString('base64');
|
|
14
|
+
exports.ASSERTION_CHALLENGE = Buffer.from('assertion-challenge').toString('base64');
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml4dHVyZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L2ludGVncmF0aW9uL2hlbHBlcnMvZml4dHVyZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQWEsUUFBQSxhQUFhLEdBQUcsZ0JBQWdCLENBQUM7QUFDakMsUUFBQSxTQUFTLEdBQUcsZ0JBQWdCLENBQUM7QUFDN0IsUUFBQSxXQUFXLEdBQUcsY0FBYyxDQUFDO0FBQzdCLFFBQUEsSUFBSSxHQUFHLE1BQU0sQ0FBQztBQUNkLFFBQUEsbUJBQW1CLEdBQUcsd0JBQXdCLENBQUM7QUFDL0MsUUFBQSxVQUFVLEdBQUcsSUFBSSxVQUFVLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7QUFDckYsUUFBQSxhQUFhLEdBQUcsaUJBQWlCLENBQUM7QUFDbEMsUUFBQSxlQUFlLEdBQUcsbUJBQW1CLENBQUM7QUFDdEMsUUFBQSxTQUFTLEdBQUcsNkNBQTZDLENBQUM7QUFDMUQsUUFBQSxrQkFBa0IsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ3hFLFFBQUEsbUJBQW1CLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBFTlRFUlBSSVNFX0lEID0gJ2VudGVycHJpc2UtYWJjJztcbmV4cG9ydCBjb25zdCBXQUxMRVRfSUQgPSAnd2FsbGV0LWhvdC0xMjMnO1xuZXhwb3J0IGNvbnN0IEtFWUNIQUlOX0lEID0gJ2tleS11c2VyLTAwMSc7XG5leHBvcnQgY29uc3QgQ09JTiA9ICd0YnRjJztcbmV4cG9ydCBjb25zdCBFWElTVElOR19QQVNTUEhSQVNFID0gJ215LWV4aXN0aW5nLXBhc3NwaHJhc2UnO1xuZXhwb3J0IGNvbnN0IFBSRl9PVVRQVVQgPSBuZXcgVWludDhBcnJheShbMHhkZSwgMHhhZCwgMHhiZSwgMHhlZiwgMHhjYSwgMHhmZSwgMHgwMSwgMHgwMl0pLmJ1ZmZlcjtcbmV4cG9ydCBjb25zdCBDUkVERU5USUFMX0lEID0gJ1kzSmxaQzFwWkMwME5UWSc7XG5leHBvcnQgY29uc3QgREVWSUNFX01PTkdPX0lEID0gJ2RldmljZS1tb25nby1pZC0xJztcbmV4cG9ydCBjb25zdCBCQVNFX1NBTFQgPSAnWnFKNjRNMmRMNjV6bjItSnhkNThTTU4ySUxjOVFqYkNGeFVUR0hkX0xDOCc7XG5leHBvcnQgY29uc3QgUkVHSVNURVJfQ0hBTExFTkdFID0gQnVmZmVyLmZyb20oJ3JhbmRvbS1jaGFsbGVuZ2UnKS50b1N0cmluZygnYmFzZTY0Jyk7XG5leHBvcnQgY29uc3QgQVNTRVJUSU9OX0NIQUxMRU5HRSA9IEJ1ZmZlci5mcm9tKCdhc3NlcnRpb24tY2hhbGxlbmdlJykudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuIl19
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export interface KeychainState {
|
|
2
|
+
id: string;
|
|
3
|
+
encryptedPrv: string;
|
|
4
|
+
webauthnDevices?: Array<{
|
|
5
|
+
authenticatorInfo: {
|
|
6
|
+
credID: string;
|
|
7
|
+
};
|
|
8
|
+
prfSalt: string;
|
|
9
|
+
id?: string;
|
|
10
|
+
encryptedPrv?: string;
|
|
11
|
+
}>;
|
|
12
|
+
}
|
|
13
|
+
export interface MockBitGo {
|
|
14
|
+
bitgo: any;
|
|
15
|
+
keychainState: KeychainState;
|
|
16
|
+
wallet: any;
|
|
17
|
+
encrypt: (params: {
|
|
18
|
+
password: string;
|
|
19
|
+
input: string;
|
|
20
|
+
}) => string;
|
|
21
|
+
decrypt: (params: {
|
|
22
|
+
password: string;
|
|
23
|
+
input: string;
|
|
24
|
+
}) => string;
|
|
25
|
+
}
|
|
26
|
+
export declare function makeMockBitGo(initialEncryptedPrv: string): MockBitGo;
|
|
27
|
+
//# sourceMappingURL=mockBitGo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mockBitGo.d.ts","sourceRoot":"","sources":["../../../../test/integration/helpers/mockBitGo.ts"],"names":[],"mappings":"AAsBA,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,KAAK,CAAC;QACtB,iBAAiB,EAAE;YAAE,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;QACtC,OAAO,EAAE,MAAM,CAAC;QAChB,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,GAAG,CAAC;IACX,aAAa,EAAE,aAAa,CAAC;IAC7B,MAAM,EAAE,GAAG,CAAC;IACZ,OAAO,EAAE,CAAC,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,KAAK,MAAM,CAAC;IACjE,OAAO,EAAE,CAAC,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,KAAK,MAAM,CAAC;CAClE;AAED,wBAAgB,aAAa,CAAC,mBAAmB,EAAE,MAAM,GAAG,SAAS,CA8GpE"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.makeMockBitGo = makeMockBitGo;
|
|
37
|
+
const sinon = __importStar(require("sinon"));
|
|
38
|
+
const fixtures_1 = require("./fixtures");
|
|
39
|
+
// Use sjcl directly — same underlying library as bitgo.encrypt/decrypt
|
|
40
|
+
const sjcl = require('sjcl');
|
|
41
|
+
function realEncrypt({ password, input }) {
|
|
42
|
+
return JSON.stringify(sjcl.encrypt(password, input));
|
|
43
|
+
}
|
|
44
|
+
function realDecrypt({ password, input }) {
|
|
45
|
+
return sjcl.decrypt(password, typeof input === 'string' ? JSON.parse(input) : input);
|
|
46
|
+
}
|
|
47
|
+
function makeMockBitGo(initialEncryptedPrv) {
|
|
48
|
+
const keychainState = {
|
|
49
|
+
id: fixtures_1.KEYCHAIN_ID,
|
|
50
|
+
encryptedPrv: initialEncryptedPrv,
|
|
51
|
+
webauthnDevices: undefined,
|
|
52
|
+
};
|
|
53
|
+
// Build the mock request chain: bitgo.get(url).result() etc.
|
|
54
|
+
function makeRequest(result) {
|
|
55
|
+
const req = {
|
|
56
|
+
send: sinon.stub().returnsThis(),
|
|
57
|
+
result: sinon.stub().resolves(result),
|
|
58
|
+
};
|
|
59
|
+
return req;
|
|
60
|
+
}
|
|
61
|
+
// Stub the wallet
|
|
62
|
+
const mockWallet = {
|
|
63
|
+
type: sinon.stub().returns('hot'),
|
|
64
|
+
toJSON: sinon.stub().returns({ enterprise: fixtures_1.ENTERPRISE_ID }),
|
|
65
|
+
keyIds: sinon.stub().returns([fixtures_1.KEYCHAIN_ID]),
|
|
66
|
+
getEncryptedUserKeychain: sinon.stub().callsFake(async () => ({ ...keychainState })),
|
|
67
|
+
};
|
|
68
|
+
// Stub baseCoin
|
|
69
|
+
const mockBaseCoin = {
|
|
70
|
+
wallets: sinon.stub().returns({
|
|
71
|
+
get: sinon.stub().resolves(mockWallet),
|
|
72
|
+
}),
|
|
73
|
+
keychains: sinon.stub().returns({
|
|
74
|
+
get: sinon.stub().callsFake(async () => ({ ...keychainState })),
|
|
75
|
+
}),
|
|
76
|
+
};
|
|
77
|
+
// Build the bitgo stub
|
|
78
|
+
const bitgo = {
|
|
79
|
+
coin: sinon.stub().returns(mockBaseCoin),
|
|
80
|
+
url: (path, version) => `https://app.bitgo-test.com/api/v${version ?? 2}${path}`,
|
|
81
|
+
encrypt: (params) => realEncrypt(params),
|
|
82
|
+
decrypt: (params) => realDecrypt(params),
|
|
83
|
+
get: sinon.stub().callsFake((url) => {
|
|
84
|
+
if (url.includes('/user/otp/webauthn/register')) {
|
|
85
|
+
return makeRequest({
|
|
86
|
+
challenge: fixtures_1.REGISTER_CHALLENGE,
|
|
87
|
+
baseSalt: fixtures_1.BASE_SALT,
|
|
88
|
+
rp: { name: 'BitGo', id: 'bitgo.com' },
|
|
89
|
+
user: { id: Buffer.from('user-id'), name: 'test@bitgo.com', displayName: 'Test User' },
|
|
90
|
+
pubKeyCredParams: [{ type: 'public-key', alg: -7 }],
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
if (url.includes('/user/otp/webauthn/assertion')) {
|
|
94
|
+
return makeRequest({ challenge: fixtures_1.ASSERTION_CHALLENGE });
|
|
95
|
+
}
|
|
96
|
+
return makeRequest({});
|
|
97
|
+
}),
|
|
98
|
+
put: sinon.stub().callsFake((url) => {
|
|
99
|
+
// PUT /user/otp — register device
|
|
100
|
+
if (url.includes('/user/otp') && !url.includes('/key/')) {
|
|
101
|
+
return {
|
|
102
|
+
send: sinon.stub().returnsThis(),
|
|
103
|
+
result: sinon.stub().resolves({
|
|
104
|
+
user: {
|
|
105
|
+
otpDevices: [
|
|
106
|
+
{
|
|
107
|
+
id: fixtures_1.DEVICE_MONGO_ID,
|
|
108
|
+
credentialId: fixtures_1.CREDENTIAL_ID,
|
|
109
|
+
prfSalt: fixtures_1.BASE_SALT,
|
|
110
|
+
isPasskey: true,
|
|
111
|
+
extensions: { prf: true },
|
|
112
|
+
},
|
|
113
|
+
],
|
|
114
|
+
},
|
|
115
|
+
}),
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
// PUT /{coin}/key/{keychainId} — attach webauthnInfo
|
|
119
|
+
if (url.includes('/key/')) {
|
|
120
|
+
return {
|
|
121
|
+
send: sinon.stub().callsFake((body) => ({
|
|
122
|
+
result: sinon.stub().callsFake(async () => {
|
|
123
|
+
// Update keychainState with webauthnInfo — simulates server persisting it
|
|
124
|
+
if (body?.webauthnInfo) {
|
|
125
|
+
keychainState.webauthnDevices = [
|
|
126
|
+
{
|
|
127
|
+
authenticatorInfo: { credID: fixtures_1.CREDENTIAL_ID },
|
|
128
|
+
prfSalt: body.webauthnInfo.prfSalt,
|
|
129
|
+
id: fixtures_1.DEVICE_MONGO_ID,
|
|
130
|
+
encryptedPrv: body.webauthnInfo.encryptedPrv,
|
|
131
|
+
},
|
|
132
|
+
];
|
|
133
|
+
keychainState.encryptedPrv = body.webauthnInfo.encryptedPrv;
|
|
134
|
+
}
|
|
135
|
+
return { ...keychainState };
|
|
136
|
+
}),
|
|
137
|
+
})),
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
return { send: sinon.stub().returnsThis(), result: sinon.stub().resolves({}) };
|
|
141
|
+
}),
|
|
142
|
+
del: sinon.stub().callsFake((_url) => {
|
|
143
|
+
return { result: sinon.stub().resolves({}) };
|
|
144
|
+
}),
|
|
145
|
+
};
|
|
146
|
+
return { bitgo, keychainState, wallet: mockWallet, encrypt: realEncrypt, decrypt: realDecrypt };
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ja0JpdEdvLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC9pbnRlZ3JhdGlvbi9oZWxwZXJzL21vY2tCaXRHby50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXlDQSxzQ0E4R0M7QUF2SkQsNkNBQStCO0FBQy9CLHlDQVFvQjtBQUVwQix1RUFBdUU7QUFDdkUsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBRTdCLFNBQVMsV0FBVyxDQUFDLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBdUM7SUFDM0UsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDdkQsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBdUM7SUFDM0UsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxPQUFPLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3ZGLENBQUM7QUFxQkQsU0FBZ0IsYUFBYSxDQUFDLG1CQUEyQjtJQUN2RCxNQUFNLGFBQWEsR0FBa0I7UUFDbkMsRUFBRSxFQUFFLHNCQUFXO1FBQ2YsWUFBWSxFQUFFLG1CQUFtQjtRQUNqQyxlQUFlLEVBQUUsU0FBUztLQUMzQixDQUFDO0lBRUYsNkRBQTZEO0lBQzdELFNBQVMsV0FBVyxDQUFDLE1BQWU7UUFDbEMsTUFBTSxHQUFHLEdBQUc7WUFDVixJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRTtZQUNoQyxNQUFNLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7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QUFHLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDOzRCQUM5RCxDQUFDOzRCQUNELE9BQU8sRUFBRSxHQUFHLGFBQWEsRUFBRSxDQUFDO3dCQUM5QixDQUFDLENBQUM7cUJBQ0gsQ0FBQyxDQUFDO2lCQUNKLENBQUM7WUFDSixDQUFDO1lBQ0QsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUNqRixDQUFDLENBQUM7UUFFRixHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQVksRUFBRSxFQUFFO1lBQzNDLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQy9DLENBQUMsQ0FBQztLQUNILENBQUM7SUFFRixPQUFPLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxDQUFDO0FBQ2xHLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBzaW5vbiBmcm9tICdzaW5vbic7XG5pbXBvcnQge1xuICBBU1NFUlRJT05fQ0hBTExFTkdFLFxuICBCQVNFX1NBTFQsXG4gIENSRURFTlRJQUxfSUQsXG4gIERFVklDRV9NT05HT19JRCxcbiAgRU5URVJQUklTRV9JRCxcbiAgS0VZQ0hBSU5fSUQsXG4gIFJFR0lTVEVSX0NIQUxMRU5HRSxcbn0gZnJvbSAnLi9maXh0dXJlcyc7XG5cbi8vIFVzZSBzamNsIGRpcmVjdGx5IOKAlCBzYW1lIHVuZGVybHlpbmcgbGlicmFyeSBhcyBiaXRnby5lbmNyeXB0L2RlY3J5cHRcbmNvbnN0IHNqY2wgPSByZXF1aXJlKCdzamNsJyk7XG5cbmZ1bmN0aW9uIHJlYWxFbmNyeXB0KHsgcGFzc3dvcmQsIGlucHV0IH06IHsgcGFzc3dvcmQ6IHN0cmluZzsgaW5wdXQ6IHN0cmluZyB9KTogc3RyaW5nIHtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHNqY2wuZW5jcnlwdChwYXNzd29yZCwgaW5wdXQpKTtcbn1cblxuZnVuY3Rpb24gcmVhbERlY3J5cHQoeyBwYXNzd29yZCwgaW5wdXQgfTogeyBwYXNzd29yZDogc3RyaW5nOyBpbnB1dDogc3RyaW5nIH0pOiBzdHJpbmcge1xuICByZXR1cm4gc2pjbC5kZWNyeXB0KHBhc3N3b3JkLCB0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnID8gSlNPTi5wYXJzZShpbnB1dCkgOiBpbnB1dCk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgS2V5Y2hhaW5TdGF0ZSB7XG4gIGlkOiBzdHJpbmc7XG4gIGVuY3J5cHRlZFBydjogc3RyaW5nO1xuICB3ZWJhdXRobkRldmljZXM/OiBBcnJheTx7XG4gICAgYXV0aGVudGljYXRvckluZm86IHsgY3JlZElEOiBzdHJpbmcgfTtcbiAgICBwcmZTYWx0OiBzdHJpbmc7XG4gICAgaWQ/OiBzdHJpbmc7XG4gICAgZW5jcnlwdGVkUHJ2Pzogc3RyaW5nO1xuICB9Pjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNb2NrQml0R28ge1xuICBiaXRnbzogYW55O1xuICBrZXljaGFpblN0YXRlOiBLZXljaGFpblN0YXRlO1xuICB3YWxsZXQ6IGFueTtcbiAgZW5jcnlwdDogKHBhcmFtczogeyBwYXNzd29yZDogc3RyaW5nOyBpbnB1dDogc3RyaW5nIH0pID0+IHN0cmluZztcbiAgZGVjcnlwdDogKHBhcmFtczogeyBwYXNzd29yZDogc3RyaW5nOyBpbnB1dDogc3RyaW5nIH0pID0+IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1ha2VNb2NrQml0R28oaW5pdGlhbEVuY3J5cHRlZFBydjogc3RyaW5nKTogTW9ja0JpdEdvIHtcbiAgY29uc3Qga2V5Y2hhaW5TdGF0ZTogS2V5Y2hhaW5TdGF0ZSA9IHtcbiAgICBpZDogS0VZQ0hBSU5fSUQsXG4gICAgZW5jcnlwdGVkUHJ2OiBpbml0aWFsRW5jcnlwdGVkUHJ2LFxuICAgIHdlYmF1dGhuRGV2aWNlczogdW5kZWZpbmVkLFxuICB9O1xuXG4gIC8vIEJ1aWxkIHRoZSBtb2NrIHJlcXVlc3QgY2hhaW46IGJpdGdvLmdldCh1cmwpLnJlc3VsdCgpIGV0Yy5cbiAgZnVuY3Rpb24gbWFrZVJlcXVlc3QocmVzdWx0OiB1bmtub3duKSB7XG4gICAgY29uc3QgcmVxID0ge1xuICAgICAgc2VuZDogc2lub24uc3R1YigpLnJldHVybnNUaGlzKCksXG4gICAgICByZXN1bHQ6IHNpbm9uLnN0dWIoKS5yZXNvbHZlcyhyZXN1bHQpLFxuICAgIH07XG4gICAgcmV0dXJuIHJlcTtcbiAgfVxuXG4gIC8vIFN0dWIgdGhlIHdhbGxldFxuICBjb25zdCBtb2NrV2FsbGV0ID0ge1xuICAgIHR5cGU6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKCdob3QnKSxcbiAgICB0b0pTT046IHNpbm9uLnN0dWIoKS5yZXR1cm5zKHsgZW50ZXJwcmlzZTogRU5URVJQUklTRV9JRCB9KSxcbiAgICBrZXlJZHM6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKFtLRVlDSEFJTl9JRF0pLFxuICAgIGdldEVuY3J5cHRlZFVzZXJLZXljaGFpbjogc2lub24uc3R1YigpLmNhbGxzRmFrZShhc3luYyAoKSA9PiAoeyAuLi5rZXljaGFpblN0YXRlIH0pKSxcbiAgfTtcblxuICAvLyBTdHViIGJhc2VDb2luXG4gIGNvbnN0IG1vY2tCYXNlQ29pbiA9IHtcbiAgICB3YWxsZXRzOiBzaW5vbi5zdHViKCkucmV0dXJucyh7XG4gICAgICBnZXQ6IHNpbm9uLnN0dWIoKS5yZXNvbHZlcyhtb2NrV2FsbGV0KSxcbiAgICB9KSxcbiAgICBrZXljaGFpbnM6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKHtcbiAgICAgIGdldDogc2lub24uc3R1YigpLmNhbGxzRmFrZShhc3luYyAoKSA9PiAoeyAuLi5rZXljaGFpblN0YXRlIH0pKSxcbiAgICB9KSxcbiAgfTtcblxuICAvLyBCdWlsZCB0aGUgYml0Z28gc3R1YlxuICBjb25zdCBiaXRnbzogYW55ID0ge1xuICAgIGNvaW46IHNpbm9uLnN0dWIoKS5yZXR1cm5zKG1vY2tCYXNlQ29pbiksXG5cbiAgICB1cmw6IChwYXRoOiBzdHJpbmcsIHZlcnNpb24/OiBudW1iZXIpID0+IGBodHRwczovL2FwcC5iaXRnby10ZXN0LmNvbS9hcGkvdiR7dmVyc2lvbiA/PyAyfSR7cGF0aH1gLFxuXG4gICAgZW5jcnlwdDogKHBhcmFtczogeyBwYXNzd29yZDogc3RyaW5nOyBpbnB1dDogc3RyaW5nIH0pID0+IHJlYWxFbmNyeXB0KHBhcmFtcyksXG4gICAgZGVjcnlwdDogKHBhcmFtczogeyBwYXNzd29yZDogc3RyaW5nOyBpbnB1dDogc3RyaW5nIH0pID0+IHJlYWxEZWNyeXB0KHBhcmFtcyksXG5cbiAgICBnZXQ6IHNpbm9uLnN0dWIoKS5jYWxsc0Zha2UoKHVybDogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAodXJsLmluY2x1ZGVzKCcvdXNlci9vdHAvd2ViYXV0aG4vcmVnaXN0ZXInKSkge1xuICAgICAgICByZXR1cm4gbWFrZVJlcXVlc3Qoe1xuICAgICAgICAgIGNoYWxsZW5nZTogUkVHSVNURVJfQ0hBTExFTkdFLFxuICAgICAgICAgIGJhc2VTYWx0OiBCQVNFX1NBTFQsXG4gICAgICAgICAgcnA6IHsgbmFtZTogJ0JpdEdvJywgaWQ6ICdiaXRnby5jb20nIH0sXG4gICAgICAgICAgdXNlcjogeyBpZDogQnVmZmVyLmZyb20oJ3VzZXItaWQnKSwgbmFtZTogJ3Rlc3RAYml0Z28uY29tJywgZGlzcGxheU5hbWU6ICdUZXN0IFVzZXInIH0sXG4gICAgICAgICAgcHViS2V5Q3JlZFBhcmFtczogW3sgdHlwZTogJ3B1YmxpYy1rZXknLCBhbGc6IC03IH1dLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmICh1cmwuaW5jbHVkZXMoJy91c2VyL290cC93ZWJhdXRobi9hc3NlcnRpb24nKSkge1xuICAgICAgICByZXR1cm4gbWFrZVJlcXVlc3QoeyBjaGFsbGVuZ2U6IEFTU0VSVElPTl9DSEFMTEVOR0UgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbWFrZVJlcXVlc3Qoe30pO1xuICAgIH0pLFxuXG4gICAgcHV0OiBzaW5vbi5zdHViKCkuY2FsbHNGYWtlKCh1cmw6IHN0cmluZykgPT4ge1xuICAgICAgLy8gUFVUIC91c2VyL290cCDigJQgcmVnaXN0ZXIgZGV2aWNlXG4gICAgICBpZiAodXJsLmluY2x1ZGVzKCcvdXNlci9vdHAnKSAmJiAhdXJsLmluY2x1ZGVzKCcva2V5LycpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc2VuZDogc2lub24uc3R1YigpLnJldHVybnNUaGlzKCksXG4gICAgICAgICAgcmVzdWx0OiBzaW5vbi5zdHViKCkucmVzb2x2ZXMoe1xuICAgICAgICAgICAgdXNlcjoge1xuICAgICAgICAgICAgICBvdHBEZXZpY2VzOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgaWQ6IERFVklDRV9NT05HT19JRCxcbiAgICAgICAgICAgICAgICAgIGNyZWRlbnRpYWxJZDogQ1JFREVOVElBTF9JRCxcbiAgICAgICAgICAgICAgICAgIHByZlNhbHQ6IEJBU0VfU0FMVCxcbiAgICAgICAgICAgICAgICAgIGlzUGFzc2tleTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbnM6IHsgcHJmOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICAvLyBQVVQgL3tjb2lufS9rZXkve2tleWNoYWluSWR9IOKAlCBhdHRhY2ggd2ViYXV0aG5JbmZvXG4gICAgICBpZiAodXJsLmluY2x1ZGVzKCcva2V5LycpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc2VuZDogc2lub24uc3R1YigpLmNhbGxzRmFrZSgoYm9keTogYW55KSA9PiAoe1xuICAgICAgICAgICAgcmVzdWx0OiBzaW5vbi5zdHViKCkuY2FsbHNGYWtlKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgLy8gVXBkYXRlIGtleWNoYWluU3RhdGUgd2l0aCB3ZWJhdXRobkluZm8g4oCUIHNpbXVsYXRlcyBzZXJ2ZXIgcGVyc2lzdGluZyBpdFxuICAgICAgICAgICAgICBpZiAoYm9keT8ud2ViYXV0aG5JbmZvKSB7XG4gICAgICAgICAgICAgICAga2V5Y2hhaW5TdGF0ZS53ZWJhdXRobkRldmljZXMgPSBbXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0b3JJbmZvOiB7IGNyZWRJRDogQ1JFREVOVElBTF9JRCB9LFxuICAgICAgICAgICAgICAgICAgICBwcmZTYWx0OiBib2R5LndlYmF1dGhuSW5mby5wcmZTYWx0LFxuICAgICAgICAgICAgICAgICAgICBpZDogREVWSUNFX01PTkdPX0lELFxuICAgICAgICAgICAgICAgICAgICBlbmNyeXB0ZWRQcnY6IGJvZHkud2ViYXV0aG5JbmZvLmVuY3J5cHRlZFBydixcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICBrZXljaGFpblN0YXRlLmVuY3J5cHRlZFBydiA9IGJvZHkud2ViYXV0aG5JbmZvLmVuY3J5cHRlZFBydjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4geyAuLi5rZXljaGFpblN0YXRlIH07XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICB9KSksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4geyBzZW5kOiBzaW5vbi5zdHViKCkucmV0dXJuc1RoaXMoKSwgcmVzdWx0OiBzaW5vbi5zdHViKCkucmVzb2x2ZXMoe30pIH07XG4gICAgfSksXG5cbiAgICBkZWw6IHNpbm9uLnN0dWIoKS5jYWxsc0Zha2UoKF91cmw6IHN0cmluZykgPT4ge1xuICAgICAgcmV0dXJuIHsgcmVzdWx0OiBzaW5vbi5zdHViKCkucmVzb2x2ZXMoe30pIH07XG4gICAgfSksXG4gIH07XG5cbiAgcmV0dXJuIHsgYml0Z28sIGtleWNoYWluU3RhdGUsIHdhbGxldDogbW9ja1dhbGxldCwgZW5jcnlwdDogcmVhbEVuY3J5cHQsIGRlY3J5cHQ6IHJlYWxEZWNyeXB0IH07XG59XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mockProvider.d.ts","sourceRoot":"","sources":["../../../../test/integration/helpers/mockProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwC,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAGpG,wBAAgB,gBAAgB,IAAI,gBAAgB,GAAG;IAAE,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAA;CAAE,CAmClH"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.makeMockProvider = makeMockProvider;
|
|
4
|
+
const fixtures_1 = require("./fixtures");
|
|
5
|
+
function makeMockProvider() {
|
|
6
|
+
let lastEvalByCredential;
|
|
7
|
+
const provider = {
|
|
8
|
+
get lastEvalByCredential() {
|
|
9
|
+
return lastEvalByCredential;
|
|
10
|
+
},
|
|
11
|
+
async create(options) {
|
|
12
|
+
return {
|
|
13
|
+
id: fixtures_1.CREDENTIAL_ID,
|
|
14
|
+
rawId: Buffer.from(fixtures_1.CREDENTIAL_ID, 'base64'),
|
|
15
|
+
type: 'public-key',
|
|
16
|
+
response: {
|
|
17
|
+
attestationObject: new ArrayBuffer(0),
|
|
18
|
+
clientDataJSON: new ArrayBuffer(0),
|
|
19
|
+
getTransports: () => [],
|
|
20
|
+
},
|
|
21
|
+
authenticatorAttachment: 'platform',
|
|
22
|
+
getClientExtensionResults: () => ({ prf: { enabled: true } }),
|
|
23
|
+
toJSON: () => ({}),
|
|
24
|
+
};
|
|
25
|
+
},
|
|
26
|
+
async get(options) {
|
|
27
|
+
lastEvalByCredential = options.evalByCredential;
|
|
28
|
+
return {
|
|
29
|
+
prfResult: fixtures_1.PRF_OUTPUT,
|
|
30
|
+
credentialId: fixtures_1.CREDENTIAL_ID,
|
|
31
|
+
otpCode: '123456',
|
|
32
|
+
};
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
return provider;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ja1Byb3ZpZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC9pbnRlZ3JhdGlvbi9oZWxwZXJzL21vY2tQcm92aWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUdBLDRDQW1DQztBQXJDRCx5Q0FBdUQ7QUFFdkQsU0FBZ0IsZ0JBQWdCO0lBQzlCLElBQUksb0JBQXdELENBQUM7SUFFN0QsTUFBTSxRQUFRLEdBQW9GO1FBQ2hHLElBQUksb0JBQW9CO1lBQ3RCLE9BQU8sb0JBQW9CLENBQUM7UUFDOUIsQ0FBQztRQUVELEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBMkM7WUFDdEQsT0FBTztnQkFDTCxFQUFFLEVBQUUsd0JBQWE7Z0JBQ2pCLEtBQUssRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLHdCQUFhLEVBQUUsUUFBUSxDQUFDO2dCQUMzQyxJQUFJLEVBQUUsWUFBWTtnQkFDbEIsUUFBUSxFQUFFO29CQUNSLGlCQUFpQixFQUFFLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQztvQkFDckMsY0FBYyxFQUFFLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQztvQkFDbEMsYUFBYSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUU7aUJBQ3hCO2dCQUNELHVCQUF1QixFQUFFLFVBQVU7Z0JBQ25DLHlCQUF5QixFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQztnQkFDN0QsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBOEIsQ0FBQTthQUNaLENBQUM7UUFDdEMsQ0FBQztRQUVELEtBQUssQ0FBQyxHQUFHLENBQUMsT0FBMEI7WUFDbEMsb0JBQW9CLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFDO1lBQ2hELE9BQU87Z0JBQ0wsU0FBUyxFQUFFLHFCQUFVO2dCQUNyQixZQUFZLEVBQUUsd0JBQWE7Z0JBQzNCLE9BQU8sRUFBRSxRQUFRO2FBQ2xCLENBQUM7UUFDSixDQUFDO0tBQ0YsQ0FBQztJQUVGLE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQYXNza2V5QXV0aFJlc3VsdCwgUGFzc2tleUdldE9wdGlvbnMsIFdlYkF1dGhuUHJvdmlkZXIgfSBmcm9tICcuLi8uLi8uLi9zcmMvd2ViQXV0aG5UeXBlcyc7XG5pbXBvcnQgeyBDUkVERU5USUFMX0lELCBQUkZfT1VUUFVUIH0gZnJvbSAnLi9maXh0dXJlcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBtYWtlTW9ja1Byb3ZpZGVyKCk6IFdlYkF1dGhuUHJvdmlkZXIgJiB7IGxhc3RFdmFsQnlDcmVkZW50aWFsOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgdW5kZWZpbmVkIH0ge1xuICBsZXQgbGFzdEV2YWxCeUNyZWRlbnRpYWw6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWQ7XG5cbiAgY29uc3QgcHJvdmlkZXI6IFdlYkF1dGhuUHJvdmlkZXIgJiB7IGxhc3RFdmFsQnlDcmVkZW50aWFsOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgdW5kZWZpbmVkIH0gPSB7XG4gICAgZ2V0IGxhc3RFdmFsQnlDcmVkZW50aWFsKCkge1xuICAgICAgcmV0dXJuIGxhc3RFdmFsQnlDcmVkZW50aWFsO1xuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGUob3B0aW9uczogUHVibGljS2V5Q3JlZGVudGlhbENyZWF0aW9uT3B0aW9ucyk6IFByb21pc2U8UHVibGljS2V5Q3JlZGVudGlhbD4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaWQ6IENSRURFTlRJQUxfSUQsXG4gICAgICAgIHJhd0lkOiBCdWZmZXIuZnJvbShDUkVERU5USUFMX0lELCAnYmFzZTY0JyksXG4gICAgICAgIHR5cGU6ICdwdWJsaWMta2V5JyxcbiAgICAgICAgcmVzcG9uc2U6IHtcbiAgICAgICAgICBhdHRlc3RhdGlvbk9iamVjdDogbmV3IEFycmF5QnVmZmVyKDApLFxuICAgICAgICAgIGNsaWVudERhdGFKU09OOiBuZXcgQXJyYXlCdWZmZXIoMCksXG4gICAgICAgICAgZ2V0VHJhbnNwb3J0czogKCkgPT4gW10sXG4gICAgICAgIH0sXG4gICAgICAgIGF1dGhlbnRpY2F0b3JBdHRhY2htZW50OiAncGxhdGZvcm0nLFxuICAgICAgICBnZXRDbGllbnRFeHRlbnNpb25SZXN1bHRzOiAoKSA9PiAoeyBwcmY6IHsgZW5hYmxlZDogdHJ1ZSB9IH0pLFxuICAgICAgICB0b0pTT046ICgpID0+ICh7fSBhcyBQdWJsaWNLZXlDcmVkZW50aWFsSlNPTiksXG4gICAgICB9IGFzIHVua25vd24gYXMgUHVibGljS2V5Q3JlZGVudGlhbDtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0KG9wdGlvbnM6IFBhc3NrZXlHZXRPcHRpb25zKTogUHJvbWlzZTxQYXNza2V5QXV0aFJlc3VsdD4ge1xuICAgICAgbGFzdEV2YWxCeUNyZWRlbnRpYWwgPSBvcHRpb25zLmV2YWxCeUNyZWRlbnRpYWw7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwcmZSZXN1bHQ6IFBSRl9PVVRQVVQsXG4gICAgICAgIGNyZWRlbnRpYWxJZDogQ1JFREVOVElBTF9JRCxcbiAgICAgICAgb3RwQ29kZTogJzEyMzQ1NicsXG4gICAgICB9O1xuICAgIH0sXG4gIH07XG5cbiAgcmV0dXJuIHByb3ZpZGVyO1xufVxuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"passkeyLifecycle.test.d.ts","sourceRoot":"","sources":["../../../test/integration/passkeyLifecycle.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
const assert = __importStar(require("assert"));
|
|
37
|
+
const derivePassword_1 = require("../../src/derivePassword");
|
|
38
|
+
const deriveEnterpriseSalt_1 = require("../../src/deriveEnterpriseSalt");
|
|
39
|
+
const registerPasskey_1 = require("../../src/registerPasskey");
|
|
40
|
+
const attachPasskeyToWallet_1 = require("../../src/attachPasskeyToWallet");
|
|
41
|
+
const derivePasskeyPrfKey_1 = require("../../src/derivePasskeyPrfKey");
|
|
42
|
+
const removePasskeyFromWallet_1 = require("../../src/removePasskeyFromWallet");
|
|
43
|
+
const removePasskeyFromAccount_1 = require("../../src/removePasskeyFromAccount");
|
|
44
|
+
const mockBitGo_1 = require("./helpers/mockBitGo");
|
|
45
|
+
const mockProvider_1 = require("./helpers/mockProvider");
|
|
46
|
+
const fixtures_1 = require("./helpers/fixtures");
|
|
47
|
+
// Use sjcl directly for round-trip encryption tests — same crypto as mockBitGo
|
|
48
|
+
const sjcl = require('sjcl');
|
|
49
|
+
const sjclEncrypt = (password, input) => JSON.stringify(sjcl.encrypt(password, input));
|
|
50
|
+
const sjclDecrypt = (password, input) => sjcl.decrypt(password, JSON.parse(input));
|
|
51
|
+
describe('passkey-crypto integration', function () {
|
|
52
|
+
let initialEncryptedPrv;
|
|
53
|
+
const PRIVATE_KEY = 'xprv-test-private-key-12345';
|
|
54
|
+
before(function () {
|
|
55
|
+
// Encrypt the private key with the existing passphrase (simulates what the server stores)
|
|
56
|
+
initialEncryptedPrv = sjclEncrypt(fixtures_1.EXISTING_PASSPHRASE, PRIVATE_KEY);
|
|
57
|
+
});
|
|
58
|
+
describe('register → attach', function () {
|
|
59
|
+
it('re-encrypts the private key under the PRF-derived password', async function () {
|
|
60
|
+
const { bitgo, keychainState } = (0, mockBitGo_1.makeMockBitGo)(initialEncryptedPrv);
|
|
61
|
+
const provider = (0, mockProvider_1.makeMockProvider)();
|
|
62
|
+
const device = await (0, registerPasskey_1.registerPasskey)({ bitgo, provider, label: 'test-key' });
|
|
63
|
+
assert.strictEqual(device.credentialId, fixtures_1.CREDENTIAL_ID);
|
|
64
|
+
assert.strictEqual(device.prfSupported, true);
|
|
65
|
+
await (0, attachPasskeyToWallet_1.attachPasskeyToWallet)({
|
|
66
|
+
bitgo,
|
|
67
|
+
coin: fixtures_1.COIN,
|
|
68
|
+
walletId: fixtures_1.WALLET_ID,
|
|
69
|
+
device,
|
|
70
|
+
existingPassphrase: fixtures_1.EXISTING_PASSPHRASE,
|
|
71
|
+
provider,
|
|
72
|
+
});
|
|
73
|
+
// Verify encryptedPrv round-trips with the PRF-derived password
|
|
74
|
+
const decrypted = sjclDecrypt((0, derivePassword_1.derivePassword)(fixtures_1.PRF_OUTPUT), keychainState.encryptedPrv);
|
|
75
|
+
assert.strictEqual(decrypted, PRIVATE_KEY);
|
|
76
|
+
// prfSalt stored in webauthnInfo must be valid base64url
|
|
77
|
+
assert.ok(keychainState.webauthnDevices);
|
|
78
|
+
assert.match(keychainState.webauthnDevices[0].prfSalt, /^[A-Za-z0-9\-_]+$/);
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
describe('attach → derivePasskeyPrfKey', function () {
|
|
82
|
+
it('derives the same passphrase used to re-encrypt during attach', async function () {
|
|
83
|
+
const { bitgo, keychainState, wallet } = (0, mockBitGo_1.makeMockBitGo)(initialEncryptedPrv);
|
|
84
|
+
const provider = (0, mockProvider_1.makeMockProvider)();
|
|
85
|
+
const device = { id: fixtures_1.DEVICE_MONGO_ID, credentialId: fixtures_1.CREDENTIAL_ID, prfSalt: fixtures_1.BASE_SALT, isPasskey: true };
|
|
86
|
+
await (0, attachPasskeyToWallet_1.attachPasskeyToWallet)({
|
|
87
|
+
bitgo,
|
|
88
|
+
coin: fixtures_1.COIN,
|
|
89
|
+
walletId: fixtures_1.WALLET_ID,
|
|
90
|
+
device,
|
|
91
|
+
existingPassphrase: fixtures_1.EXISTING_PASSPHRASE,
|
|
92
|
+
provider,
|
|
93
|
+
});
|
|
94
|
+
const derivedPassphrase = await (0, derivePasskeyPrfKey_1.derivePasskeyPrfKey)({ bitgo, wallet, provider });
|
|
95
|
+
// Same passphrase as what attach used — decrypts the stored key
|
|
96
|
+
assert.strictEqual(derivedPassphrase, (0, derivePassword_1.derivePassword)(fixtures_1.PRF_OUTPUT));
|
|
97
|
+
assert.strictEqual(sjclDecrypt(derivedPassphrase, keychainState.encryptedPrv), PRIVATE_KEY);
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
describe('full lifecycle (register → attach → derive → remove)', function () {
|
|
101
|
+
it('completes all steps and hits both DEL endpoints', async function () {
|
|
102
|
+
const { bitgo, wallet } = (0, mockBitGo_1.makeMockBitGo)(initialEncryptedPrv);
|
|
103
|
+
const provider = (0, mockProvider_1.makeMockProvider)();
|
|
104
|
+
const device = await (0, registerPasskey_1.registerPasskey)({ bitgo, provider, label: 'lifecycle-key' });
|
|
105
|
+
await (0, attachPasskeyToWallet_1.attachPasskeyToWallet)({
|
|
106
|
+
bitgo,
|
|
107
|
+
coin: fixtures_1.COIN,
|
|
108
|
+
walletId: fixtures_1.WALLET_ID,
|
|
109
|
+
device,
|
|
110
|
+
existingPassphrase: fixtures_1.EXISTING_PASSPHRASE,
|
|
111
|
+
provider,
|
|
112
|
+
});
|
|
113
|
+
const passphrase = await (0, derivePasskeyPrfKey_1.derivePasskeyPrfKey)({ bitgo, wallet, provider });
|
|
114
|
+
await (0, removePasskeyFromWallet_1.removePasskeyFromWallet)({ bitgo, coin: fixtures_1.COIN, walletId: fixtures_1.WALLET_ID, device, walletPassphrase: passphrase });
|
|
115
|
+
await (0, removePasskeyFromAccount_1.removePasskeyFromAccount)({ bitgo, device });
|
|
116
|
+
const delUrls = bitgo.del.args.map((a) => a[0]);
|
|
117
|
+
assert.ok(delUrls.some((url) => url.includes(`/key/${fixtures_1.KEYCHAIN_ID}/webauthndevice/${fixtures_1.DEVICE_MONGO_ID}`)));
|
|
118
|
+
assert.ok(delUrls.some((url) => url.includes(`/user/otp/${fixtures_1.DEVICE_MONGO_ID}`)));
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
describe('PRF salt derivation wiring', function () {
|
|
122
|
+
it('passes deriveEnterpriseSalt output as the eval salt in attachPasskeyToWallet', async function () {
|
|
123
|
+
const { bitgo } = (0, mockBitGo_1.makeMockBitGo)(initialEncryptedPrv);
|
|
124
|
+
const provider = (0, mockProvider_1.makeMockProvider)();
|
|
125
|
+
const device = { id: fixtures_1.DEVICE_MONGO_ID, credentialId: fixtures_1.CREDENTIAL_ID, prfSalt: fixtures_1.BASE_SALT, isPasskey: true };
|
|
126
|
+
await (0, attachPasskeyToWallet_1.attachPasskeyToWallet)({
|
|
127
|
+
bitgo,
|
|
128
|
+
coin: fixtures_1.COIN,
|
|
129
|
+
walletId: fixtures_1.WALLET_ID,
|
|
130
|
+
device,
|
|
131
|
+
existingPassphrase: fixtures_1.EXISTING_PASSPHRASE,
|
|
132
|
+
provider,
|
|
133
|
+
});
|
|
134
|
+
assert.strictEqual(provider.lastEvalByCredential?.[fixtures_1.CREDENTIAL_ID], (0, deriveEnterpriseSalt_1.deriveEnterpriseSalt)(fixtures_1.BASE_SALT, fixtures_1.ENTERPRISE_ID));
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
describe('error propagation', function () {
|
|
138
|
+
it('aborts removePasskeyFromWallet and does not DEL when passphrase is wrong', async function () {
|
|
139
|
+
const { bitgo } = (0, mockBitGo_1.makeMockBitGo)(initialEncryptedPrv);
|
|
140
|
+
const device = { id: fixtures_1.DEVICE_MONGO_ID, credentialId: fixtures_1.CREDENTIAL_ID, prfSalt: fixtures_1.BASE_SALT, isPasskey: true };
|
|
141
|
+
// Uses real sjcl decrypt — wrong passphrase genuinely fails decryptKeychainPrivateKey
|
|
142
|
+
await assert.rejects(() => (0, removePasskeyFromWallet_1.removePasskeyFromWallet)({
|
|
143
|
+
bitgo,
|
|
144
|
+
coin: fixtures_1.COIN,
|
|
145
|
+
walletId: fixtures_1.WALLET_ID,
|
|
146
|
+
device,
|
|
147
|
+
walletPassphrase: 'wrong-passphrase',
|
|
148
|
+
}), /Incorrect wallet passphrase/);
|
|
149
|
+
assert.strictEqual(bitgo.del.callCount, 0);
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFzc2tleUxpZmVjeWNsZS50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdGVzdC9pbnRlZ3JhdGlvbi9wYXNza2V5TGlmZWN5Y2xlLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwrQ0FBaUM7QUFDakMsNkRBQTBEO0FBQzFELHlFQUFzRTtBQUN0RSwrREFBNEQ7QUFDNUQsMkVBQXdFO0FBQ3hFLHVFQUFvRTtBQUNwRSwrRUFBNEU7QUFDNUUsaUZBQThFO0FBQzlFLG1EQUFvRDtBQUNwRCx5REFBMEQ7QUFDMUQsaURBVTRCO0FBRTVCLCtFQUErRTtBQUMvRSxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDN0IsTUFBTSxXQUFXLEdBQUcsQ0FBQyxRQUFnQixFQUFFLEtBQWEsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ3ZHLE1BQU0sV0FBVyxHQUFHLENBQUMsUUFBZ0IsRUFBRSxLQUFhLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUVuRyxRQUFRLENBQUMsNEJBQTRCLEVBQUU7SUFDckMsSUFBSSxtQkFBMkIsQ0FBQztJQUNoQyxNQUFNLFdBQVcsR0FBRyw2QkFBNkIsQ0FBQztJQUVsRCxNQUFNLENBQUM7UUFDTCwwRkFBMEY7UUFDMUYsbUJBQW1CLEdBQUcsV0FBVyxDQUFDLDhCQUFtQixFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3RFLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLG1CQUFtQixFQUFFO1FBQzVCLEVBQUUsQ0FBQyw0REFBNEQsRUFBRSxLQUFLO1lBQ3BFLE1BQU0s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QixLQUFLO2dCQUNMLElBQUksRUFBRSxlQUFJO2dCQUNWLFFBQVEsRUFBRSxvQkFBUztnQkFDbkIsTUFBTTtnQkFDTixnQkFBZ0IsRUFBRSxrQkFBa0I7YUFDckMsQ0FBQyxFQUNKLDZCQUE2QixDQUM5QixDQUFDO1lBRUYsTUFBTSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM3QyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7IGRlcml2ZVBhc3N3b3JkIH0gZnJvbSAnLi4vLi4vc3JjL2Rlcml2ZVBhc3N3b3JkJztcbmltcG9ydCB7IGRlcml2ZUVudGVycHJpc2VTYWx0IH0gZnJvbSAnLi4vLi4vc3JjL2Rlcml2ZUVudGVycHJpc2VTYWx0JztcbmltcG9ydCB7IHJlZ2lzdGVyUGFzc2tleSB9IGZyb20gJy4uLy4uL3NyYy9yZWdpc3RlclBhc3NrZXknO1xuaW1wb3J0IHsgYXR0YWNoUGFzc2tleVRvV2FsbGV0IH0gZnJvbSAnLi4vLi4vc3JjL2F0dGFjaFBhc3NrZXlUb1dhbGxldCc7XG5pbXBvcnQgeyBkZXJpdmVQYXNza2V5UHJmS2V5IH0gZnJvbSAnLi4vLi4vc3JjL2Rlcml2ZVBhc3NrZXlQcmZLZXknO1xuaW1wb3J0IHsgcmVtb3ZlUGFzc2tleUZyb21XYWxsZXQgfSBmcm9tICcuLi8uLi9zcmMvcmVtb3ZlUGFzc2tleUZyb21XYWxsZXQnO1xuaW1wb3J0IHsgcmVtb3ZlUGFzc2tleUZyb21BY2NvdW50IH0gZnJvbSAnLi4vLi4vc3JjL3JlbW92ZVBhc3NrZXlGcm9tQWNjb3VudCc7XG5pbXBvcnQgeyBtYWtlTW9ja0JpdEdvIH0gZnJvbSAnLi9oZWxwZXJzL21vY2tCaXRHbyc7XG5pbXBvcnQgeyBtYWtlTW9ja1Byb3ZpZGVyIH0gZnJvbSAnLi9oZWxwZXJzL21vY2tQcm92aWRlcic7XG5pbXBvcnQge1xuICBFTlRFUlBSSVNFX0lELFxuICBXQUxMRVRfSUQsXG4gIENPSU4sXG4gIEVYSVNUSU5HX1BBU1NQSFJBU0UsXG4gIFBSRl9PVVRQVVQsXG4gIENSRURFTlRJQUxfSUQsXG4gIERFVklDRV9NT05HT19JRCxcbiAgQkFTRV9TQUxULFxuICBLRVlDSEFJTl9JRCxcbn0gZnJvbSAnLi9oZWxwZXJzL2ZpeHR1cmVzJztcblxuLy8gVXNlIHNqY2wgZGlyZWN0bHkgZm9yIHJvdW5kLXRyaXAgZW5jcnlwdGlvbiB0ZXN0cyDigJQgc2FtZSBjcnlwdG8gYXMgbW9ja0JpdEdvXG5jb25zdCBzamNsID0gcmVxdWlyZSgnc2pjbCcpO1xuY29uc3Qgc2pjbEVuY3J5cHQgPSAocGFzc3dvcmQ6IHN0cmluZywgaW5wdXQ6IHN0cmluZykgPT4gSlNPTi5zdHJpbmdpZnkoc2pjbC5lbmNyeXB0KHBhc3N3b3JkLCBpbnB1dCkpO1xuY29uc3Qgc2pjbERlY3J5cHQgPSAocGFzc3dvcmQ6IHN0cmluZywgaW5wdXQ6IHN0cmluZykgPT4gc2pjbC5kZWNyeXB0KHBhc3N3b3JkLCBKU09OLnBhcnNlKGlucHV0KSk7XG5cbmRlc2NyaWJlKCdwYXNza2V5LWNyeXB0byBpbnRlZ3JhdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgbGV0IGluaXRpYWxFbmNyeXB0ZWRQcnY6IHN0cmluZztcbiAgY29uc3QgUFJJVkFURV9LRVkgPSAneHBydi10ZXN0LXByaXZhdGUta2V5LTEyMzQ1JztcblxuICBiZWZvcmUoZnVuY3Rpb24gKCkge1xuICAgIC8vIEVuY3J5cHQgdGhlIHByaXZhdGUga2V5IHdpdGggdGhlIGV4aXN0aW5nIHBhc3NwaHJhc2UgKHNpbXVsYXRlcyB3aGF0IHRoZSBzZXJ2ZXIgc3RvcmVzKVxuICAgIGluaXRpYWxFbmNyeXB0ZWRQcnYgPSBzamNsRW5jcnlwdChFWElTVElOR19QQVNTUEhSQVNFLCBQUklWQVRFX0tFWSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdyZWdpc3RlciDihpIgYXR0YWNoJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdyZS1lbmNyeXB0cyB0aGUgcHJpdmF0ZSBrZXkgdW5kZXIgdGhlIFBSRi1kZXJpdmVkIHBhc3N3b3JkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgeyBiaXRnbywga2V5Y2hhaW5TdGF0ZSB9ID0gbWFrZU1vY2tCaXRHbyhpbml0aWFsRW5jcnlwdGVkUHJ2KTtcbiAgICAgIGNvbnN0IHByb3ZpZGVyID0gbWFrZU1vY2tQcm92aWRlcigpO1xuXG4gICAgICBjb25zdCBkZXZpY2UgPSBhd2FpdCByZWdpc3RlclBhc3NrZXkoeyBiaXRnbywgcHJvdmlkZXIsIGxhYmVsOiAndGVzdC1rZXknIH0pO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGRldmljZS5jcmVkZW50aWFsSWQsIENSRURFTlRJQUxfSUQpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGRldmljZS5wcmZTdXBwb3J0ZWQsIHRydWUpO1xuXG4gICAgICBhd2FpdCBhdHRhY2hQYXNza2V5VG9XYWxsZXQoe1xuICAgICAgICBiaXRnbyxcbiAgICAgICAgY29pbjogQ09JTixcbiAgICAgICAgd2FsbGV0SWQ6IFdBTExFVF9JRCxcbiAgICAgICAgZGV2aWNlLFxuICAgICAgICBleGlzdGluZ1Bhc3NwaHJhc2U6IEVYSVNUSU5HX1BBU1NQSFJBU0UsXG4gICAgICAgIHByb3ZpZGVyLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIFZlcmlmeSBlbmNyeXB0ZWRQcnYgcm91bmQtdHJpcHMgd2l0aCB0aGUgUFJGLWRlcml2ZWQgcGFzc3dvcmRcbiAgICAgIGNvbnN0IGRlY3J5cHRlZCA9IHNqY2xEZWNyeXB0KGRlcml2ZVBhc3N3b3JkKFBSRl9PVVRQVVQpLCBrZXljaGFpblN0YXRlLmVuY3J5cHRlZFBydik7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZGVjcnlwdGVkLCBQUklWQVRFX0tFWSk7XG5cbiAgICAgIC8vIHByZlNhbHQgc3RvcmVkIGluIHdlYmF1dGhuSW5mbyBtdXN0IGJlIHZhbGlkIGJhc2U2NHVybFxuICAgICAgYXNzZXJ0Lm9rKGtleWNoYWluU3RhdGUud2ViYXV0aG5EZXZpY2VzKTtcbiAgICAgIGFzc2VydC5tYXRjaChrZXljaGFpblN0YXRlLndlYmF1dGhuRGV2aWNlc1swXS5wcmZTYWx0LCAvXltBLVphLXowLTlcXC1fXSskLyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdhdHRhY2gg4oaSIGRlcml2ZVBhc3NrZXlQcmZLZXknLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ2Rlcml2ZXMgdGhlIHNhbWUgcGFzc3BocmFzZSB1c2VkIHRvIHJlLWVuY3J5cHQgZHVyaW5nIGF0dGFjaCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHsgYml0Z28sIGtleWNoYWluU3RhdGUsIHdhbGxldCB9ID0gbWFrZU1vY2tCaXRHbyhpbml0aWFsRW5jcnlwdGVkUHJ2KTtcbiAgICAgIGNvbnN0IHByb3ZpZGVyID0gbWFrZU1vY2tQcm92aWRlcigpO1xuXG4gICAgICBjb25zdCBkZXZpY2UgPSB7IGlkOiBERVZJQ0VfTU9OR09fSUQsIGNyZWRlbnRpYWxJZDogQ1JFREVOVElBTF9JRCwgcHJmU2FsdDogQkFTRV9TQUxULCBpc1Bhc3NrZXk6IHRydWUgfTtcbiAgICAgIGF3YWl0IGF0dGFjaFBhc3NrZXlUb1dhbGxldCh7XG4gICAgICAgIGJpdGdvLFxuICAgICAgICBjb2luOiBDT0lOLFxuICAgICAgICB3YWxsZXRJZDogV0FMTEVUX0lELFxuICAgICAgICBkZXZpY2UsXG4gICAgICAgIGV4aXN0aW5nUGFzc3BocmFzZTogRVhJU1RJTkdfUEFTU1BIUkFTRSxcbiAgICAgICAgcHJvdmlkZXIsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgZGVyaXZlZFBhc3NwaHJhc2UgPSBhd2FpdCBkZXJpdmVQYXNza2V5UHJmS2V5KHsgYml0Z28sIHdhbGxldCwgcHJvdmlkZXIgfSk7XG5cbiAgICAgIC8vIFNhbWUgcGFzc3BocmFzZSBhcyB3aGF0IGF0dGFjaCB1c2VkIOKAlCBkZWNyeXB0cyB0aGUgc3RvcmVkIGtleVxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGRlcml2ZWRQYXNzcGhyYXNlLCBkZXJpdmVQYXNzd29yZChQUkZfT1VUUFVUKSk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoc2pjbERlY3J5cHQoZGVyaXZlZFBhc3NwaHJhc2UsIGtleWNoYWluU3RhdGUuZW5jcnlwdGVkUHJ2KSwgUFJJVkFURV9LRVkpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZnVsbCBsaWZlY3ljbGUgKHJlZ2lzdGVyIOKGkiBhdHRhY2gg4oaSIGRlcml2ZSDihpIgcmVtb3ZlKScsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnY29tcGxldGVzIGFsbCBzdGVwcyBhbmQgaGl0cyBib3RoIERFTCBlbmRwb2ludHMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB7IGJpdGdvLCB3YWxsZXQgfSA9IG1ha2VNb2NrQml0R28oaW5pdGlhbEVuY3J5cHRlZFBydik7XG4gICAgICBjb25zdCBwcm92aWRlciA9IG1ha2VNb2NrUHJvdmlkZXIoKTtcblxuICAgICAgY29uc3QgZGV2aWNlID0gYXdhaXQgcmVnaXN0ZXJQYXNza2V5KHsgYml0Z28sIHByb3ZpZGVyLCBsYWJlbDogJ2xpZmVjeWNsZS1rZXknIH0pO1xuICAgICAgYXdhaXQgYXR0YWNoUGFzc2tleVRvV2FsbGV0KHtcbiAgICAgICAgYml0Z28sXG4gICAgICAgIGNvaW46IENPSU4sXG4gICAgICAgIHdhbGxldElkOiBXQUxMRVRfSUQsXG4gICAgICAgIGRldmljZSxcbiAgICAgICAgZXhpc3RpbmdQYXNzcGhyYXNlOiBFWElTVElOR19QQVNTUEhSQVNFLFxuICAgICAgICBwcm92aWRlcixcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBwYXNzcGhyYXNlID0gYXdhaXQgZGVyaXZlUGFzc2tleVByZktleSh7IGJpdGdvLCB3YWxsZXQsIHByb3ZpZGVyIH0pO1xuICAgICAgYXdhaXQgcmVtb3ZlUGFzc2tleUZyb21XYWxsZXQoeyBiaXRnbywgY29pbjogQ09JTiwgd2FsbGV0SWQ6IFdBTExFVF9JRCwgZGV2aWNlLCB3YWxsZXRQYXNzcGhyYXNlOiBwYXNzcGhyYXNlIH0pO1xuICAgICAgYXdhaXQgcmVtb3ZlUGFzc2tleUZyb21BY2NvdW50KHsgYml0Z28sIGRldmljZSB9KTtcblxuICAgICAgY29uc3QgZGVsVXJscyA9IGJpdGdvLmRlbC5hcmdzLm1hcCgoYTogc3RyaW5nW10pID0+IGFbMF0pO1xuICAgICAgYXNzZXJ0Lm9rKGRlbFVybHMuc29tZSgodXJsOiBzdHJpbmcpID0+IHVybC5pbmNsdWRlcyhgL2tleS8ke0tFWUNIQUlOX0lEfS93ZWJhdXRobmRldmljZS8ke0RFVklDRV9NT05HT19JRH1gKSkpO1xuICAgICAgYXNzZXJ0Lm9rKGRlbFVybHMuc29tZSgodXJsOiBzdHJpbmcpID0+IHVybC5pbmNsdWRlcyhgL3VzZXIvb3RwLyR7REVWSUNFX01PTkdPX0lEfWApKSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdQUkYgc2FsdCBkZXJpdmF0aW9uIHdpcmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgncGFzc2VzIGRlcml2ZUVudGVycHJpc2VTYWx0IG91dHB1dCBhcyB0aGUgZXZhbCBzYWx0IGluIGF0dGFjaFBhc3NrZXlUb1dhbGxldCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHsgYml0Z28gfSA9IG1ha2VNb2NrQml0R28oaW5pdGlhbEVuY3J5cHRlZFBydik7XG4gICAgICBjb25zdCBwcm92aWRlciA9IG1ha2VNb2NrUHJvdmlkZXIoKTtcblxuICAgICAgY29uc3QgZGV2aWNlID0geyBpZDogREVWSUNFX01PTkdPX0lELCBjcmVkZW50aWFsSWQ6IENSRURFTlRJQUxfSUQsIHByZlNhbHQ6IEJBU0VfU0FMVCwgaXNQYXNza2V5OiB0cnVlIH07XG4gICAgICBhd2FpdCBhdHRhY2hQYXNza2V5VG9XYWxsZXQoe1xuICAgICAgICBiaXRnbyxcbiAgICAgICAgY29pbjogQ09JTixcbiAgICAgICAgd2FsbGV0SWQ6IFdBTExFVF9JRCxcbiAgICAgICAgZGV2aWNlLFxuICAgICAgICBleGlzdGluZ1Bhc3NwaHJhc2U6IEVYSVNUSU5HX1BBU1NQSFJBU0UsXG4gICAgICAgIHByb3ZpZGVyLFxuICAgICAgfSk7XG5cbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChcbiAgICAgICAgcHJvdmlkZXIubGFzdEV2YWxCeUNyZWRlbnRpYWw/LltDUkVERU5USUFMX0lEXSxcbiAgICAgICAgZGVyaXZlRW50ZXJwcmlzZVNhbHQoQkFTRV9TQUxULCBFTlRFUlBSSVNFX0lEKVxuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2Vycm9yIHByb3BhZ2F0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdhYm9ydHMgcmVtb3ZlUGFzc2tleUZyb21XYWxsZXQgYW5kIGRvZXMgbm90IERFTCB3aGVuIHBhc3NwaHJhc2UgaXMgd3JvbmcnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB7IGJpdGdvIH0gPSBtYWtlTW9ja0JpdEdvKGluaXRpYWxFbmNyeXB0ZWRQcnYpO1xuICAgICAgY29uc3QgZGV2aWNlID0geyBpZDogREVWSUNFX01PTkdPX0lELCBjcmVkZW50aWFsSWQ6IENSRURFTlRJQUxfSUQsIHByZlNhbHQ6IEJBU0VfU0FMVCwgaXNQYXNza2V5OiB0cnVlIH07XG5cbiAgICAgIC8vIFVzZXMgcmVhbCBzamNsIGRlY3J5cHQg4oCUIHdyb25nIHBhc3NwaHJhc2UgZ2VudWluZWx5IGZhaWxzIGRlY3J5cHRLZXljaGFpblByaXZhdGVLZXlcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKFxuICAgICAgICAoKSA9PlxuICAgICAgICAgIHJlbW92ZVBhc3NrZXlGcm9tV2FsbGV0KHtcbiAgICAgICAgICAgIGJpdGdvLFxuICAgICAgICAgICAgY29pbjogQ09JTixcbiAgICAgICAgICAgIHdhbGxldElkOiBXQUxMRVRfSUQsXG4gICAgICAgICAgICBkZXZpY2UsXG4gICAgICAgICAgICB3YWxsZXRQYXNzcGhyYXNlOiAnd3JvbmctcGFzc3BocmFzZScsXG4gICAgICAgICAgfSksXG4gICAgICAgIC9JbmNvcnJlY3Qgd2FsbGV0IHBhc3NwaHJhc2UvXG4gICAgICApO1xuXG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYml0Z28uZGVsLmNhbGxDb3VudCwgMCk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attachPasskeyToWallet.test.d.ts","sourceRoot":"","sources":["../../../test/unit/attachPasskeyToWallet.test.ts"],"names":[],"mappings":""}
|