@bitgo/passkey-crypto 0.0.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/LICENSE +191 -0
  2. package/dist/src/attachPasskeyToWallet.d.ts +11 -0
  3. package/dist/src/attachPasskeyToWallet.d.ts.map +1 -0
  4. package/dist/src/attachPasskeyToWallet.js +63 -0
  5. package/dist/src/base64url.d.ts +16 -0
  6. package/dist/src/base64url.d.ts.map +1 -0
  7. package/dist/src/base64url.js +27 -0
  8. package/dist/src/deriveEnterpriseSalt.d.ts +18 -0
  9. package/dist/src/deriveEnterpriseSalt.d.ts.map +1 -0
  10. package/dist/src/deriveEnterpriseSalt.js +26 -0
  11. package/dist/src/derivePasskeyPrfKey.d.ts +15 -0
  12. package/dist/src/derivePasskeyPrfKey.d.ts.map +1 -0
  13. package/dist/src/derivePasskeyPrfKey.js +68 -0
  14. package/dist/src/derivePassword.d.ts +11 -0
  15. package/dist/src/derivePassword.d.ts.map +1 -0
  16. package/dist/src/derivePassword.js +16 -0
  17. package/dist/src/index.d.ts +10 -0
  18. package/dist/src/index.d.ts.map +1 -0
  19. package/dist/src/index.js +21 -0
  20. package/dist/src/prfHelpers.d.ts +15 -0
  21. package/dist/src/prfHelpers.d.ts.map +1 -0
  22. package/dist/src/prfHelpers.js +47 -0
  23. package/dist/src/registerPasskey.d.ts +10 -0
  24. package/dist/src/registerPasskey.d.ts.map +1 -0
  25. package/dist/src/registerPasskey.js +93 -0
  26. package/dist/src/removePasskeyFromAccount.d.ts +11 -0
  27. package/dist/src/removePasskeyFromAccount.d.ts.map +1 -0
  28. package/dist/src/removePasskeyFromAccount.js +15 -0
  29. package/dist/src/removePasskeyFromWallet.d.ts +10 -0
  30. package/dist/src/removePasskeyFromWallet.d.ts.map +1 -0
  31. package/dist/src/removePasskeyFromWallet.js +22 -0
  32. package/dist/src/webAuthnTypes.d.ts +18 -0
  33. package/dist/src/webAuthnTypes.d.ts.map +1 -0
  34. package/dist/src/webAuthnTypes.js +3 -0
  35. package/dist/test/integration/helpers/fixtures.d.ts +12 -0
  36. package/dist/test/integration/helpers/fixtures.d.ts.map +1 -0
  37. package/dist/test/integration/helpers/fixtures.js +15 -0
  38. package/dist/test/integration/helpers/mockBitGo.d.ts +27 -0
  39. package/dist/test/integration/helpers/mockBitGo.d.ts.map +1 -0
  40. package/dist/test/integration/helpers/mockBitGo.js +148 -0
  41. package/dist/test/integration/helpers/mockProvider.d.ts +5 -0
  42. package/dist/test/integration/helpers/mockProvider.d.ts.map +1 -0
  43. package/dist/test/integration/helpers/mockProvider.js +37 -0
  44. package/dist/test/integration/passkeyLifecycle.test.d.ts +2 -0
  45. package/dist/test/integration/passkeyLifecycle.test.d.ts.map +1 -0
  46. package/dist/test/integration/passkeyLifecycle.test.js +153 -0
  47. package/dist/test/unit/attachPasskeyToWallet.test.d.ts +2 -0
  48. package/dist/test/unit/attachPasskeyToWallet.test.d.ts.map +1 -0
  49. package/dist/test/unit/attachPasskeyToWallet.test.js +205 -0
  50. package/dist/test/unit/base64url.test.d.ts +2 -0
  51. package/dist/test/unit/base64url.test.d.ts.map +1 -0
  52. package/dist/test/unit/base64url.test.js +75 -0
  53. package/dist/test/unit/deriveEnterpriseSalt.test.d.ts +2 -0
  54. package/dist/test/unit/deriveEnterpriseSalt.test.d.ts.map +1 -0
  55. package/dist/test/unit/deriveEnterpriseSalt.test.js +77 -0
  56. package/dist/test/unit/derivePasskeyPrfKey.test.d.ts +2 -0
  57. package/dist/test/unit/derivePasskeyPrfKey.test.d.ts.map +1 -0
  58. package/dist/test/unit/derivePasskeyPrfKey.test.js +152 -0
  59. package/dist/test/unit/derivePassword.test.d.ts +2 -0
  60. package/dist/test/unit/derivePassword.test.d.ts.map +1 -0
  61. package/dist/test/unit/derivePassword.test.js +66 -0
  62. package/dist/test/unit/prfHelpers.test.d.ts +2 -0
  63. package/dist/test/unit/prfHelpers.test.d.ts.map +1 -0
  64. package/dist/test/unit/prfHelpers.test.js +99 -0
  65. package/dist/test/unit/registerPasskey.test.d.ts +2 -0
  66. package/dist/test/unit/registerPasskey.test.d.ts.map +1 -0
  67. package/dist/test/unit/registerPasskey.test.js +155 -0
  68. package/dist/test/unit/removePasskeyFromAccount.test.d.ts +2 -0
  69. package/dist/test/unit/removePasskeyFromAccount.test.d.ts.map +1 -0
  70. package/dist/test/unit/removePasskeyFromAccount.test.js +88 -0
  71. package/dist/test/unit/removePasskeyFromWallet.test.d.ts +2 -0
  72. package/dist/test/unit/removePasskeyFromWallet.test.d.ts.map +1 -0
  73. package/dist/test/unit/removePasskeyFromWallet.test.js +170 -0
  74. package/dist/tsconfig.tsbuildinfo +1 -0
  75. package/package.json +39 -10
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildEvalByCredential = buildEvalByCredential;
4
+ exports.matchDeviceByCredentialId = matchDeviceByCredentialId;
5
+ const base64url_1 = require("./base64url");
6
+ /**
7
+ * Builds the PRF eval map and credential-to-device lookup from a wallet
8
+ * keychain's webauthn devices. Devices without a prfSalt are skipped.
9
+ */
10
+ function buildEvalByCredential(devices) {
11
+ const evalByCredential = {};
12
+ const credIdToDevice = new Map();
13
+ for (const device of devices) {
14
+ if (!device.prfSalt)
15
+ continue;
16
+ const { credID } = device.authenticatorInfo;
17
+ // Normalise credID to base64url (no padding, URL-safe chars) so it matches
18
+ // the key format used by attachPasskeyToWallet (device.credentialId from the
19
+ // browser, which is already base64url). The WebAuthn PRF extension looks up
20
+ // the selected credential's ID against evalByCredential keys — if the encoding
21
+ // differs (e.g. standard base64 with padding/+/), the lookup silently fails and
22
+ // PRF evaluates with no salt, producing a different output.
23
+ const credIdBase64url = (0, base64url_1.toBase64Url)(credID);
24
+ // Pass prfSalt through as-is (base64url). attachPasskeyToWallet writes the
25
+ // server-stored salt in the same encoding and feeds the same string to
26
+ // the PRF extension at attach time, so both paths produce the same salt
27
+ // bytes — provided the WebAuthn provider layer decodes base64url before
28
+ // handing the bytes to navigator.credentials.get.
29
+ evalByCredential[credIdBase64url] = device.prfSalt;
30
+ credIdToDevice.set(credIdBase64url, device);
31
+ }
32
+ return { evalByCredential, credIdToDevice };
33
+ }
34
+ /**
35
+ * Returns the WebauthnDevice matching the given credential ID.
36
+ * @throws if no matching device is found
37
+ */
38
+ function matchDeviceByCredentialId(devices, credentialId) {
39
+ // Normalise both sides to base64url so padding/char differences don't break matching.
40
+ const needle = (0, base64url_1.toBase64Url)(credentialId);
41
+ const device = devices.find((d) => (0, base64url_1.toBase64Url)(d.authenticatorInfo.credID) === needle);
42
+ if (!device) {
43
+ throw new Error('Could not identify which passkey device was used');
44
+ }
45
+ return device;
46
+ }
47
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJmSGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wcmZIZWxwZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBT0Esc0RBNkJDO0FBTUQsOERBUUM7QUFqREQsMkNBQTBDO0FBRTFDOzs7R0FHRztBQUNILFNBQWdCLHFCQUFxQixDQUFDLE9BQXlCO0lBSTdELE1BQU0sZ0JBQWdCLEdBQTJCLEVBQUUsQ0FBQztJQUNwRCxNQUFNLGNBQWMsR0FBRyxJQUFJLEdBQUcsRUFBMEIsQ0FBQztJQUV6RCxLQUFLLE1BQU0sTUFBTSxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTztZQUFFLFNBQVM7UUFDOUIsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQztRQUU1QywyRUFBMkU7UUFDM0UsNkVBQTZFO1FBQzdFLDRFQUE0RTtRQUM1RSwrRUFBK0U7UUFDL0UsZ0ZBQWdGO1FBQ2hGLDREQUE0RDtRQUM1RCxNQUFNLGVBQWUsR0FBRyxJQUFBLHVCQUFXLEVBQUMsTUFBTSxDQUFDLENBQUM7UUFFNUMsMkVBQTJFO1FBQzNFLHVFQUF1RTtRQUN2RSx3RUFBd0U7UUFDeEUsd0VBQXdFO1FBQ3hFLGtEQUFrRDtRQUNsRCxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDO1FBQ25ELGNBQWMsQ0FBQyxHQUFHLENBQUMsZUFBZSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLENBQUM7QUFDOUMsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQWdCLHlCQUF5QixDQUFDLE9BQXlCLEVBQUUsWUFBb0I7SUFDdkYsc0ZBQXNGO0lBQ3RGLE1BQU0sTUFBTSxHQUFHLElBQUEsdUJBQVcsRUFBQyxZQUFZLENBQUMsQ0FBQztJQUN6QyxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFBLHVCQUFXLEVBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxLQUFLLE1BQU0sQ0FBQyxDQUFDO0lBQ3ZGLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNaLE1BQU0sSUFBSSxLQUFLLENBQUMsa0RBQWtELENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgV2ViYXV0aG5EZXZpY2UgfSBmcm9tICdAYml0Z28vcHVibGljLXR5cGVzJztcbmltcG9ydCB7IHRvQmFzZTY0VXJsIH0gZnJvbSAnLi9iYXNlNjR1cmwnO1xuXG4vKipcbiAqIEJ1aWxkcyB0aGUgUFJGIGV2YWwgbWFwIGFuZCBjcmVkZW50aWFsLXRvLWRldmljZSBsb29rdXAgZnJvbSBhIHdhbGxldFxuICoga2V5Y2hhaW4ncyB3ZWJhdXRobiBkZXZpY2VzLiBEZXZpY2VzIHdpdGhvdXQgYSBwcmZTYWx0IGFyZSBza2lwcGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRFdmFsQnlDcmVkZW50aWFsKGRldmljZXM6IFdlYmF1dGhuRGV2aWNlW10pOiB7XG4gIGV2YWxCeUNyZWRlbnRpYWw6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGNyZWRJZFRvRGV2aWNlOiBNYXA8c3RyaW5nLCBXZWJhdXRobkRldmljZT47XG59IHtcbiAgY29uc3QgZXZhbEJ5Q3JlZGVudGlhbDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBjb25zdCBjcmVkSWRUb0RldmljZSA9IG5ldyBNYXA8c3RyaW5nLCBXZWJhdXRobkRldmljZT4oKTtcblxuICBmb3IgKGNvbnN0IGRldmljZSBvZiBkZXZpY2VzKSB7XG4gICAgaWYgKCFkZXZpY2UucHJmU2FsdCkgY29udGludWU7XG4gICAgY29uc3QgeyBjcmVkSUQgfSA9IGRldmljZS5hdXRoZW50aWNhdG9ySW5mbztcblxuICAgIC8vIE5vcm1hbGlzZSBjcmVkSUQgdG8gYmFzZTY0dXJsIChubyBwYWRkaW5nLCBVUkwtc2FmZSBjaGFycykgc28gaXQgbWF0Y2hlc1xuICAgIC8vIHRoZSBrZXkgZm9ybWF0IHVzZWQgYnkgYXR0YWNoUGFzc2tleVRvV2FsbGV0IChkZXZpY2UuY3JlZGVudGlhbElkIGZyb20gdGhlXG4gICAgLy8gYnJvd3Nlciwgd2hpY2ggaXMgYWxyZWFkeSBiYXNlNjR1cmwpLiBUaGUgV2ViQXV0aG4gUFJGIGV4dGVuc2lvbiBsb29rcyB1cFxuICAgIC8vIHRoZSBzZWxlY3RlZCBjcmVkZW50aWFsJ3MgSUQgYWdhaW5zdCBldmFsQnlDcmVkZW50aWFsIGtleXMg4oCUIGlmIHRoZSBlbmNvZGluZ1xuICAgIC8vIGRpZmZlcnMgKGUuZy4gc3RhbmRhcmQgYmFzZTY0IHdpdGggcGFkZGluZy8rLyksIHRoZSBsb29rdXAgc2lsZW50bHkgZmFpbHMgYW5kXG4gICAgLy8gUFJGIGV2YWx1YXRlcyB3aXRoIG5vIHNhbHQsIHByb2R1Y2luZyBhIGRpZmZlcmVudCBvdXRwdXQuXG4gICAgY29uc3QgY3JlZElkQmFzZTY0dXJsID0gdG9CYXNlNjRVcmwoY3JlZElEKTtcblxuICAgIC8vIFBhc3MgcHJmU2FsdCB0aHJvdWdoIGFzLWlzIChiYXNlNjR1cmwpLiBhdHRhY2hQYXNza2V5VG9XYWxsZXQgd3JpdGVzIHRoZVxuICAgIC8vIHNlcnZlci1zdG9yZWQgc2FsdCBpbiB0aGUgc2FtZSBlbmNvZGluZyBhbmQgZmVlZHMgdGhlIHNhbWUgc3RyaW5nIHRvXG4gICAgLy8gdGhlIFBSRiBleHRlbnNpb24gYXQgYXR0YWNoIHRpbWUsIHNvIGJvdGggcGF0aHMgcHJvZHVjZSB0aGUgc2FtZSBzYWx0XG4gICAgLy8gYnl0ZXMg4oCUIHByb3ZpZGVkIHRoZSBXZWJBdXRobiBwcm92aWRlciBsYXllciBkZWNvZGVzIGJhc2U2NHVybCBiZWZvcmVcbiAgICAvLyBoYW5kaW5nIHRoZSBieXRlcyB0byBuYXZpZ2F0b3IuY3JlZGVudGlhbHMuZ2V0LlxuICAgIGV2YWxCeUNyZWRlbnRpYWxbY3JlZElkQmFzZTY0dXJsXSA9IGRldmljZS5wcmZTYWx0O1xuICAgIGNyZWRJZFRvRGV2aWNlLnNldChjcmVkSWRCYXNlNjR1cmwsIGRldmljZSk7XG4gIH1cblxuICByZXR1cm4geyBldmFsQnlDcmVkZW50aWFsLCBjcmVkSWRUb0RldmljZSB9O1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIFdlYmF1dGhuRGV2aWNlIG1hdGNoaW5nIHRoZSBnaXZlbiBjcmVkZW50aWFsIElELlxuICogQHRocm93cyBpZiBubyBtYXRjaGluZyBkZXZpY2UgaXMgZm91bmRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hdGNoRGV2aWNlQnlDcmVkZW50aWFsSWQoZGV2aWNlczogV2ViYXV0aG5EZXZpY2VbXSwgY3JlZGVudGlhbElkOiBzdHJpbmcpOiBXZWJhdXRobkRldmljZSB7XG4gIC8vIE5vcm1hbGlzZSBib3RoIHNpZGVzIHRvIGJhc2U2NHVybCBzbyBwYWRkaW5nL2NoYXIgZGlmZmVyZW5jZXMgZG9uJ3QgYnJlYWsgbWF0Y2hpbmcuXG4gIGNvbnN0IG5lZWRsZSA9IHRvQmFzZTY0VXJsKGNyZWRlbnRpYWxJZCk7XG4gIGNvbnN0IGRldmljZSA9IGRldmljZXMuZmluZCgoZCkgPT4gdG9CYXNlNjRVcmwoZC5hdXRoZW50aWNhdG9ySW5mby5jcmVkSUQpID09PSBuZWVkbGUpO1xuICBpZiAoIWRldmljZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGlkZW50aWZ5IHdoaWNoIHBhc3NrZXkgZGV2aWNlIHdhcyB1c2VkJyk7XG4gIH1cbiAgcmV0dXJuIGRldmljZTtcbn1cbiJdfQ==
@@ -0,0 +1,10 @@
1
+ import { BitGoBase } from '@bitgo/sdk-core';
2
+ import { WebAuthnOtpDevice, WebAuthnProvider } from './webAuthnTypes';
3
+ export declare function registerPasskey(params: {
4
+ bitgo: BitGoBase;
5
+ provider: WebAuthnProvider;
6
+ label: string;
7
+ }): Promise<WebAuthnOtpDevice & {
8
+ prfSupported: boolean;
9
+ }>;
10
+ //# sourceMappingURL=registerPasskey.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registerPasskey.d.ts","sourceRoot":"","sources":["../../src/registerPasskey.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAoEtE,wBAAsB,eAAe,CAAC,MAAM,EAAE;IAC5C,KAAK,EAAE,SAAS,CAAC;IACjB,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;CACf,GAAG,OAAO,CAAC,iBAAiB,GAAG;IAAE,YAAY,EAAE,OAAO,CAAA;CAAE,CAAC,CA8DzD"}
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerPasskey = registerPasskey;
4
+ const base64url_1 = require("./base64url");
5
+ /**
6
+ * Recursively converts a PublicKeyCredential (or any value it contains) to a
7
+ * JSON-serialisable representation, encoding ArrayBuffers as base64url strings.
8
+ */
9
+ function publicKeyCredentialToJSON(value) {
10
+ if (Array.isArray(value)) {
11
+ return value.map(publicKeyCredentialToJSON);
12
+ }
13
+ if (value instanceof ArrayBuffer) {
14
+ return (0, base64url_1.bufferToBase64Url)(value);
15
+ }
16
+ if (ArrayBuffer.isView(value)) {
17
+ return (0, base64url_1.bufferToBase64Url)(value.buffer);
18
+ }
19
+ if (value instanceof Object) {
20
+ const result = {};
21
+ // Use for...in to enumerate DOM object properties (non-enumerable own + inherited)
22
+ for (const key in value) {
23
+ result[key] = publicKeyCredentialToJSON(value[key]);
24
+ }
25
+ return result;
26
+ }
27
+ return value;
28
+ }
29
+ /**
30
+ * Decodes excluded credential IDs from base64 strings to ArrayBuffers.
31
+ * The WebAuthn API requires BufferSource values, not base64 strings.
32
+ */
33
+ function preformatExcludedCredentials(excludeCredentials) {
34
+ if (!excludeCredentials)
35
+ return [];
36
+ return excludeCredentials.map((cred) => ({
37
+ ...cred,
38
+ id: Buffer.from(cred.id, 'base64'),
39
+ }));
40
+ }
41
+ async function registerPasskey(params) {
42
+ const { bitgo, provider, label } = params;
43
+ // Step 1: Fetch server challenge (contains baseSalt)
44
+ const challenge = (await bitgo
45
+ .get(bitgo.url('/user/otp/webauthn/register', 2))
46
+ .result());
47
+ // Step 2: Pass formatted challenge to provider.create() — browser returns attestation
48
+ const attestation = await provider.create({
49
+ challenge: Buffer.from(challenge.challenge, 'base64'),
50
+ rp: challenge.rp,
51
+ user: challenge.user,
52
+ pubKeyCredParams: challenge.pubKeyCredParams,
53
+ timeout: challenge.timeout,
54
+ excludeCredentials: preformatExcludedCredentials(challenge.excludeCredentials),
55
+ authenticatorSelection: challenge.authenticatorSelection,
56
+ attestation: challenge.attestation,
57
+ extensions: challenge.extensions,
58
+ });
59
+ // Step 3: Check if PRF is supported — `prf.enabled` is set during registration
60
+ // (not `prf.results.first`, which is only present during authentication assertions)
61
+ const clientExtensionResults = attestation.getClientExtensionResults();
62
+ const prfEnabled = clientExtensionResults.prf;
63
+ const prfSupported = typeof prfEnabled === 'object' && prfEnabled !== null && prfEnabled.enabled === true;
64
+ // Step 4: Serialize the full credential using recursive base64url encoding
65
+ const otp = JSON.stringify(publicKeyCredentialToJSON(attestation));
66
+ const putBody = {
67
+ otp,
68
+ type: 'webauthn',
69
+ label,
70
+ };
71
+ if (prfSupported) {
72
+ putBody.extensions = ['prf'];
73
+ putBody.scopes = ['wallet_hot'];
74
+ }
75
+ // Step 5: PUT /api/v2/user/otp
76
+ const response = (await bitgo.put(bitgo.url('/user/otp', 2)).send(putBody).result());
77
+ // Step 6: Find the newly registered device by matching credentialId
78
+ const device = response.user.otpDevices.find((d) => d.credentialId === attestation.id);
79
+ if (!device) {
80
+ const available = response.user.otpDevices.map((d) => d.credentialId).join(', ');
81
+ throw new Error(`Registered device not found in response (credentialId: ${attestation.id}). Available: [${available}]`);
82
+ }
83
+ // Step 7: Return WebAuthnOtpDevice + prfSupported
84
+ return {
85
+ id: device.id,
86
+ credentialId: device.credentialId,
87
+ prfSalt: device.prfSalt,
88
+ isPasskey: device.isPasskey,
89
+ extensions: device.extensions,
90
+ prfSupported,
91
+ };
92
+ }
93
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0ZXJQYXNza2V5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3JlZ2lzdGVyUGFzc2tleS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQXNFQSwwQ0FrRUM7QUF2SUQsMkNBQWdEO0FBOEJoRDs7O0dBR0c7QUFDSCxTQUFTLHlCQUF5QixDQUFDLEtBQWM7SUFDL0MsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDekIsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLHlCQUF5QixDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUNELElBQUksS0FBSyxZQUFZLFdBQVcsRUFBRSxDQUFDO1FBQ2pDLE9BQU8sSUFBQSw2QkFBaUIsRUFBQyxLQUFLLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBQ0QsSUFBSSxXQUFXLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDOUIsT0FBTyxJQUFBLDZCQUFpQixFQUFDLEtBQUssQ0FBQyxNQUFxQixDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUNELElBQUksS0FBSyxZQUFZLE1BQU0sRUFBRSxDQUFDO1FBQzVCLE1BQU0sTUFBTSxHQUE0QixFQUFFLENBQUM7UUFDM0MsbUZBQW1GO1FBQ25GLEtBQUssTUFBTSxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7WUFDeEIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLHlCQUF5QixDQUFFLEtBQWlDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNuRixDQUFDO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsNEJBQTRCLENBQ25DLGtCQUErRDtJQUUvRCxJQUFJLENBQUMsa0JBQWtCO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFDbkMsT0FBTyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJ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QUUsa0JBQWtCLFNBQVMsR0FBRyxDQUN2RyxDQUFDO0lBQ0osQ0FBQztJQUVELGtEQUFrRDtJQUNsRCxPQUFPO1FBQ0wsRUFBRSxFQUFFLE1BQU0sQ0FBQyxFQUFFO1FBQ2IsWUFBWSxFQUFFLE1BQU0sQ0FBQyxZQUFZO1FBQ2pDLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTztRQUN2QixTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVM7UUFDM0IsVUFBVSxFQUFFLE1BQU0sQ0FBQyxVQUFVO1FBQzdCLFlBQVk7S0FDYixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJpdEdvQmFzZSB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyBidWZmZXJUb0Jhc2U2NFVybCB9IGZyb20gJy4vYmFzZTY0dXJsJztcbmltcG9ydCB7IFdlYkF1dGhuT3RwRGV2aWNlLCBXZWJBdXRoblByb3ZpZGVyIH0gZnJvbSAnLi93ZWJBdXRoblR5cGVzJztcblxuaW50ZXJmYWNlIFJlZ2lzdGVyQ2hhbGxlbmdlUmVzcG9uc2Uge1xuICBjaGFsbGVuZ2U6IHN0cmluZztcbiAgYmFzZVNhbHQ6IHN0cmluZztcbiAgcnA6IFB1YmxpY0tleUNyZWRlbnRpYWxScEVudGl0eTtcbiAgdXNlcjogUHVibGljS2V5Q3JlZGVudGlhbFVzZXJFbnRpdHk7XG4gIHB1YktleUNyZWRQYXJhbXM6IFB1YmxpY0tleUNyZWRlbnRpYWxQYXJhbWV0ZXJzW107XG4gIHRpbWVvdXQ/OiBudW1iZXI7XG4gIGV4Y2x1ZGVDcmVkZW50aWFscz86IFB1YmxpY0tleUNyZWRlbnRpYWxEZXNjcmlwdG9yW107XG4gIGF1dGhlbnRpY2F0b3JTZWxlY3Rpb24/OiBBdXRoZW50aWNhdG9yU2VsZWN0aW9uQ3JpdGVyaWE7XG4gIGF0dGVzdGF0aW9uPzogQXR0ZXN0YXRpb25Db252ZXlhbmNlUHJlZmVyZW5jZTtcbiAgZXh0ZW5zaW9ucz86IEF1dGhlbnRpY2F0aW9uRXh0ZW5zaW9uc0NsaWVudElucHV0cztcbn1cblxuaW50ZXJmYWNlIE90cERldmljZSB7XG4gIGlkOiBzdHJpbmc7XG4gIGNyZWRlbnRpYWxJZDogc3RyaW5nO1xuICBwcmZTYWx0Pzogc3RyaW5nO1xuICBpc1Bhc3NrZXk/OiBib29sZWFuO1xuICBleHRlbnNpb25zPzogUmVjb3JkPHN0cmluZywgYm9vbGVhbj47XG59XG5cbmludGVyZmFjZSBSZWdpc3Rlck90cFJlc3BvbnNlIHtcbiAgdXNlcjoge1xuICAgIG90cERldmljZXM6IE90cERldmljZVtdO1xuICB9O1xufVxuXG4vKipcbiAqIFJlY3Vyc2l2ZWx5IGNvbnZlcnRzIGEgUHVibGljS2V5Q3JlZGVudGlhbCAob3IgYW55IHZhbHVlIGl0IGNvbnRhaW5zKSB0byBhXG4gKiBKU09OLXNlcmlhbGlzYWJsZSByZXByZXNlbnRhdGlvbiwgZW5jb2RpbmcgQXJyYXlCdWZmZXJzIGFzIGJhc2U2NHVybCBzdHJpbmdzLlxuICovXG5mdW5jdGlvbiBwdWJsaWNLZXlDcmVkZW50aWFsVG9KU09OKHZhbHVlOiB1bmtub3duKTogdW5rbm93biB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZS5tYXAocHVibGljS2V5Q3JlZGVudGlhbFRvSlNPTik7XG4gIH1cbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICByZXR1cm4gYnVmZmVyVG9CYXNlNjRVcmwodmFsdWUpO1xuICB9XG4gIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcodmFsdWUpKSB7XG4gICAgcmV0dXJuIGJ1ZmZlclRvQmFzZTY0VXJsKHZhbHVlLmJ1ZmZlciBhcyBBcnJheUJ1ZmZlcik7XG4gIH1cbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgT2JqZWN0KSB7XG4gICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgIC8vIFVzZSBmb3IuLi5pbiB0byBlbnVtZXJhdGUgRE9NIG9iamVjdCBwcm9wZXJ0aWVzIChub24tZW51bWVyYWJsZSBvd24gKyBpbmhlcml0ZWQpXG4gICAgZm9yIChjb25zdCBrZXkgaW4gdmFsdWUpIHtcbiAgICAgIHJlc3VsdFtrZXldID0gcHVibGljS2V5Q3JlZGVudGlhbFRvSlNPTigodmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuLyoqXG4gKiBEZWNvZGVzIGV4Y2x1ZGVkIGNyZWRlbnRpYWwgSURzIGZyb20gYmFzZTY0IHN0cmluZ3MgdG8gQXJyYXlCdWZmZXJzLlxuICogVGhlIFdlYkF1dGhuIEFQSSByZXF1aXJlcyBCdWZmZXJTb3VyY2UgdmFsdWVzLCBub3QgYmFzZTY0IHN0cmluZ3MuXG4gKi9cbmZ1bmN0aW9uIHByZWZvcm1hdEV4Y2x1ZGVkQ3JlZGVudGlhbHMoXG4gIGV4Y2x1ZGVDcmVkZW50aWFsczogUHVibGljS2V5Q3JlZGVudGlhbERlc2NyaXB0b3JbXSB8IHVuZGVmaW5lZFxuKTogUHVibGljS2V5Q3JlZGVudGlhbERlc2NyaXB0b3JbXSB7XG4gIGlmICghZXhjbHVkZUNyZWRlbnRpYWxzKSByZXR1cm4gW107XG4gIHJldHVybiBleGNsdWRlQ3JlZGVudGlhbHMubWFwKChjcmVkKSA9PiAoe1xuICAgIC4uLmNyZWQsXG4gICAgaWQ6IEJ1ZmZlci5mcm9tKGNyZWQuaWQgYXMgdW5rbm93biBhcyBzdHJpbmcsICdiYXNlNjQnKSBhcyB1bmtub3duIGFzIEFycmF5QnVmZmVyLFxuICB9KSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWdpc3RlclBhc3NrZXkocGFyYW1zOiB7XG4gIGJpdGdvOiBCaXRHb0Jhc2U7XG4gIHByb3ZpZGVyOiBXZWJBdXRoblByb3ZpZGVyO1xuICBsYWJlbDogc3RyaW5nO1xufSk6IFByb21pc2U8V2ViQXV0aG5PdHBEZXZpY2UgJiB7IHByZlN1cHBvcnRlZDogYm9vbGVhbiB9PiB7XG4gIGNvbnN0IHsgYml0Z28sIHByb3ZpZGVyLCBsYWJlbCB9ID0gcGFyYW1zO1xuXG4gIC8vIFN0ZXAgMTogRmV0Y2ggc2VydmVyIGNoYWxsZW5nZSAoY29udGFpbnMgYmFzZVNhbHQpXG4gIGNvbnN0IGNoYWxsZW5nZSA9IChhd2FpdCBiaXRnb1xuICAgIC5nZXQoYml0Z28udXJsKCcvdXNlci9vdHAvd2ViYXV0aG4vcmVnaXN0ZXInLCAyKSlcbiAgICAucmVzdWx0KCkpIGFzIFJlZ2lzdGVyQ2hhbGxlbmdlUmVzcG9uc2U7XG5cbiAgLy8gU3RlcCAyOiBQYXNzIGZvcm1hdHRlZCBjaGFsbGVuZ2UgdG8gcHJvdmlkZXIuY3JlYXRlKCkg4oCUIGJyb3dzZXIgcmV0dXJucyBhdHRlc3RhdGlvblxuICBjb25zdCBhdHRlc3RhdGlvbiA9IGF3YWl0IHByb3ZpZGVyLmNyZWF0ZSh7XG4gICAgY2hhbGxlbmdlOiBCdWZmZXIuZnJvbShjaGFsbGVuZ2UuY2hhbGxlbmdlLCAnYmFzZTY0JyksXG4gICAgcnA6IGNoYWxsZW5nZS5ycCxcbiAgICB1c2VyOiBjaGFsbGVuZ2UudXNlcixcbiAgICBwdWJLZXlDcmVkUGFyYW1zOiBjaGFsbGVuZ2UucHViS2V5Q3JlZFBhcmFtcyxcbiAgICB0aW1lb3V0OiBjaGFsbGVuZ2UudGltZW91dCxcbiAgICBleGNsdWRlQ3JlZGVudGlhbHM6IHByZWZvcm1hdEV4Y2x1ZGVkQ3JlZGVudGlhbHMoY2hhbGxlbmdlLmV4Y2x1ZGVDcmVkZW50aWFscyksXG4gICAgYXV0aGVudGljYXRvclNlbGVjdGlvbjogY2hhbGxlbmdlLmF1dGhlbnRpY2F0b3JTZWxlY3Rpb24sXG4gICAgYXR0ZXN0YXRpb246IGNoYWxsZW5nZS5hdHRlc3RhdGlvbixcbiAgICBleHRlbnNpb25zOiBjaGFsbGVuZ2UuZXh0ZW5zaW9ucyxcbiAgfSk7XG5cbiAgLy8gU3RlcCAzOiBDaGVjayBpZiBQUkYgaXMgc3VwcG9ydGVkIOKAlCBgcHJmLmVuYWJsZWRgIGlzIHNldCBkdXJpbmcgcmVnaXN0cmF0aW9uXG4gIC8vIChub3QgYHByZi5yZXN1bHRzLmZpcnN0YCwgd2hpY2ggaXMgb25seSBwcmVzZW50IGR1cmluZyBhdXRoZW50aWNhdGlvbiBhc3NlcnRpb25zKVxuICBjb25zdCBjbGllbnRFeHRlbnNpb25SZXN1bHRzOiBBdXRoZW50aWNhdGlvbkV4dGVuc2lvbnNDbGllbnRPdXRwdXRzID0gYXR0ZXN0YXRpb24uZ2V0Q2xpZW50RXh0ZW5zaW9uUmVzdWx0cygpO1xuICBjb25zdCBwcmZFbmFibGVkID0gY2xpZW50RXh0ZW5zaW9uUmVzdWx0cy5wcmY7XG4gIGNvbnN0IHByZlN1cHBvcnRlZCA9IHR5cGVvZiBwcmZFbmFibGVkID09PSAnb2JqZWN0JyAmJiBwcmZFbmFibGVkICE9PSBudWxsICYmIHByZkVuYWJsZWQuZW5hYmxlZCA9PT0gdHJ1ZTtcblxuICAvLyBTdGVwIDQ6IFNlcmlhbGl6ZSB0aGUgZnVsbCBjcmVkZW50aWFsIHVzaW5nIHJlY3Vyc2l2ZSBiYXNlNjR1cmwgZW5jb2RpbmdcbiAgY29uc3Qgb3RwID0gSlNPTi5zdHJpbmdpZnkocHVibGljS2V5Q3JlZGVudGlhbFRvSlNPTihhdHRlc3RhdGlvbikpO1xuXG4gIGNvbnN0IHB1dEJvZHk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgIG90cCxcbiAgICB0eXBlOiAnd2ViYXV0aG4nLFxuICAgIGxhYmVsLFxuICB9O1xuXG4gIGlmIChwcmZTdXBwb3J0ZWQpIHtcbiAgICBwdXRCb2R5LmV4dGVuc2lvbnMgPSBbJ3ByZiddO1xuICAgIHB1dEJvZHkuc2NvcGVzID0gWyd3YWxsZXRfaG90J107XG4gIH1cblxuICAvLyBTdGVwIDU6IFBVVCAvYXBpL3YyL3VzZXIvb3RwXG4gIGNvbnN0IHJlc3BvbnNlID0gKGF3YWl0IGJpdGdvLnB1dChiaXRnby51cmwoJy91c2VyL290cCcsIDIpKS5zZW5kKHB1dEJvZHkpLnJlc3VsdCgpKSBhcyBSZWdpc3Rlck90cFJlc3BvbnNlO1xuXG4gIC8vIFN0ZXAgNjogRmluZCB0aGUgbmV3bHkgcmVnaXN0ZXJlZCBkZXZpY2UgYnkgbWF0Y2hpbmcgY3JlZGVudGlhbElkXG4gIGNvbnN0IGRldmljZSA9IHJlc3BvbnNlLnVzZXIub3RwRGV2aWNlcy5maW5kKChkKSA9PiBkLmNyZWRlbnRpYWxJZCA9PT0gYXR0ZXN0YXRpb24uaWQpO1xuICBpZiAoIWRldmljZSkge1xuICAgIGNvbnN0IGF2YWlsYWJsZSA9IHJlc3BvbnNlLnVzZXIub3RwRGV2aWNlcy5tYXAoKGQpID0+IGQuY3JlZGVudGlhbElkKS5qb2luKCcsICcpO1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBSZWdpc3RlcmVkIGRldmljZSBub3QgZm91bmQgaW4gcmVzcG9uc2UgKGNyZWRlbnRpYWxJZDogJHthdHRlc3RhdGlvbi5pZH0pLiBBdmFpbGFibGU6IFske2F2YWlsYWJsZX1dYFxuICAgICk7XG4gIH1cblxuICAvLyBTdGVwIDc6IFJldHVybiBXZWJBdXRobk90cERldmljZSArIHByZlN1cHBvcnRlZFxuICByZXR1cm4ge1xuICAgIGlkOiBkZXZpY2UuaWQsXG4gICAgY3JlZGVudGlhbElkOiBkZXZpY2UuY3JlZGVudGlhbElkLFxuICAgIHByZlNhbHQ6IGRldmljZS5wcmZTYWx0LFxuICAgIGlzUGFzc2tleTogZGV2aWNlLmlzUGFzc2tleSxcbiAgICBleHRlbnNpb25zOiBkZXZpY2UuZXh0ZW5zaW9ucyxcbiAgICBwcmZTdXBwb3J0ZWQsXG4gIH07XG59XG4iXX0=
@@ -0,0 +1,11 @@
1
+ import { BitGoBase } from '@bitgo/sdk-core';
2
+ import type { WebAuthnOtpDevice } from '@bitgo/public-types';
3
+ /**
4
+ * Permanently removes a passkey credential from the user's account.
5
+ * Call removePasskeyFromWallet() for all affected wallets before calling this.
6
+ */
7
+ export declare function removePasskeyFromAccount(params: {
8
+ bitgo: BitGoBase;
9
+ device: WebAuthnOtpDevice;
10
+ }): Promise<void>;
11
+ //# sourceMappingURL=removePasskeyFromAccount.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"removePasskeyFromAccount.d.ts","sourceRoot":"","sources":["../../src/removePasskeyFromAccount.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE7D;;;GAGG;AACH,wBAAsB,wBAAwB,CAAC,MAAM,EAAE;IAAE,KAAK,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,iBAAiB,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAMrH"}
@@ -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,18 @@
1
+ export type { WebAuthnOtpDevice } from '@bitgo/public-types';
2
+ /** Result of a WebAuthn assertion with the PRF extension. */
3
+ export interface PasskeyAuthResult {
4
+ prfResult: ArrayBuffer | undefined;
5
+ credentialId: string;
6
+ otpCode: string;
7
+ }
8
+ /** Options for WebAuthnProvider.get(). */
9
+ export interface PasskeyGetOptions {
10
+ publicKey: PublicKeyCredentialRequestOptions;
11
+ evalByCredential?: Record<string, string>;
12
+ }
13
+ /** Abstraction over the WebAuthn credential API. */
14
+ export interface WebAuthnProvider {
15
+ create(options: PublicKeyCredentialCreationOptions): Promise<PublicKeyCredential>;
16
+ get(options: PasskeyGetOptions): Promise<PasskeyAuthResult>;
17
+ }
18
+ //# sourceMappingURL=webAuthnTypes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webAuthnTypes.d.ts","sourceRoot":"","sources":["../../src/webAuthnTypes.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE7D,6DAA6D;AAC7D,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,WAAW,GAAG,SAAS,CAAC;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,0CAA0C;AAC1C,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,iCAAiC,CAAC;IAC7C,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC3C;AAED,oDAAoD;AACpD,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,OAAO,EAAE,kCAAkC,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAClF,GAAG,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;CAC7D"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViQXV0aG5UeXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy93ZWJBdXRoblR5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSB7IFdlYkF1dGhuT3RwRGV2aWNlIH0gZnJvbSAnQGJpdGdvL3B1YmxpYy10eXBlcyc7XG5cbi8qKiBSZXN1bHQgb2YgYSBXZWJBdXRobiBhc3NlcnRpb24gd2l0aCB0aGUgUFJGIGV4dGVuc2lvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFzc2tleUF1dGhSZXN1bHQge1xuICBwcmZSZXN1bHQ6IEFycmF5QnVmZmVyIHwgdW5kZWZpbmVkO1xuICBjcmVkZW50aWFsSWQ6IHN0cmluZztcbiAgb3RwQ29kZTogc3RyaW5nO1xufVxuXG4vKiogT3B0aW9ucyBmb3IgV2ViQXV0aG5Qcm92aWRlci5nZXQoKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFzc2tleUdldE9wdGlvbnMge1xuICBwdWJsaWNLZXk6IFB1YmxpY0tleUNyZWRlbnRpYWxSZXF1ZXN0T3B0aW9ucztcbiAgZXZhbEJ5Q3JlZGVudGlhbD86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG59XG5cbi8qKiBBYnN0cmFjdGlvbiBvdmVyIHRoZSBXZWJBdXRobiBjcmVkZW50aWFsIEFQSS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2ViQXV0aG5Qcm92aWRlciB7XG4gIGNyZWF0ZShvcHRpb25zOiBQdWJsaWNLZXlDcmVkZW50aWFsQ3JlYXRpb25PcHRpb25zKTogUHJvbWlzZTxQdWJsaWNLZXlDcmVkZW50aWFsPjtcbiAgZ2V0KG9wdGlvbnM6IFBhc3NrZXlHZXRPcHRpb25zKTogUHJvbWlzZTxQYXNza2V5QXV0aFJlc3VsdD47XG59XG4iXX0=
@@ -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,5 @@
1
+ import { WebAuthnProvider } from '../../../src/webAuthnTypes';
2
+ export declare function makeMockProvider(): WebAuthnProvider & {
3
+ lastEvalByCredential: Record<string, string> | undefined;
4
+ };
5
+ //# sourceMappingURL=mockProvider.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=passkeyLifecycle.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"passkeyLifecycle.test.d.ts","sourceRoot":"","sources":["../../../test/integration/passkeyLifecycle.test.ts"],"names":[],"mappings":""}