@bitgo-beta/sdk-lib-mpc 8.2.0-beta.2044 → 8.2.0-beta.2046

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.
@@ -1,4 +1,5 @@
1
1
  import { Buffer } from 'buffer';
2
+ import { Derive } from '../ecdsa-dkls/derive';
2
3
  import { VrfDkg } from './dkg';
3
4
  /**
4
5
  * Runs a local 2-of-3 VRF DKG across user (0), backup (1) and bitgo (2) parties and
@@ -6,4 +7,23 @@ import { VrfDkg } from './dkg';
6
7
  * `ecdsa-dkls/util.ts` so VRF tests read like the existing DKLS ones.
7
8
  */
8
9
  export declare function generateVrfDKGKeyShares(seedUser?: Buffer, seedBackup?: Buffer, seedBitgo?: Buffer): Promise<[VrfDkg, VrfDkg, VrfDkg]>;
10
+ /**
11
+ * Runs the hard-derivation ceremony on top of completed root sessions: the user (0)
12
+ * hard-derive session pairs with a fresh BitGo (2) session, and the backup (1)
13
+ * session with a second fresh BitGo session. The hard-derive wasm session is a
14
+ * 2-party threshold protocol per instance, so the BitGo server side runs two
15
+ * sessions — one per SDK party. All four derived keyshares agree on the child
16
+ * public key; the two BitGo shares are distinct private shares of that same key.
17
+ *
18
+ * @param path hardened derivation path bytes (e.g. `m/0'` as a 4-byte big-endian
19
+ * index with the hardened bit set)
20
+ * @returns [user, backup, bitgoUserPair, bitgoBackupPair] completed Derive sessions
21
+ */
22
+ export declare function generateHardDerivedKeyShares(userRoot: {
23
+ getKeyShare(): Buffer;
24
+ }, backupRoot: {
25
+ getKeyShare(): Buffer;
26
+ }, bitgoRoot: {
27
+ getKeyShare(): Buffer;
28
+ }, userVrf: VrfDkg, backupVrf: VrfDkg, bitgoVrf: VrfDkg, path: Uint8Array, seedUser?: Buffer, seedBackup?: Buffer): Promise<[Derive, Derive, Derive, Derive]>;
9
29
  //# sourceMappingURL=util.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../../../src/tss/dkls-vrf/util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAE/B;;;;GAIG;AACH,wBAAsB,uBAAuB,CAC3C,QAAQ,CAAC,EAAE,MAAM,EACjB,UAAU,CAAC,EAAE,MAAM,EACnB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CA0CnC"}
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../../../src/tss/dkls-vrf/util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAE/B;;;;GAIG;AACH,wBAAsB,uBAAuB,CAC3C,QAAQ,CAAC,EAAE,MAAM,EACjB,UAAU,CAAC,EAAE,MAAM,EACnB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CA0CnC;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,4BAA4B,CAChD,QAAQ,EAAE;IAAE,WAAW,IAAI,MAAM,CAAA;CAAE,EACnC,UAAU,EAAE;IAAE,WAAW,IAAI,MAAM,CAAA;CAAE,EACrC,SAAS,EAAE;IAAE,WAAW,IAAI,MAAM,CAAA;CAAE,EACpC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,UAAU,EAChB,QAAQ,CAAC,EAAE,MAAM,EACjB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAkD3C"}
@@ -1,6 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.generateVrfDKGKeyShares = generateVrfDKGKeyShares;
4
+ exports.generateHardDerivedKeyShares = generateHardDerivedKeyShares;
5
+ const derive_1 = require("../ecdsa-dkls/derive");
4
6
  const dkg_1 = require("./dkg");
5
7
  /**
6
8
  * Runs a local 2-of-3 VRF DKG across user (0), backup (1) and bitgo (2) parties and
@@ -49,4 +51,63 @@ async function generateVrfDKGKeyShares(seedUser, seedBackup, seedBitgo) {
49
51
  });
50
52
  return [user, backup, bitgo];
51
53
  }
52
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy90c3MvZGtscy12cmYvdXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQVFBLDBEQThDQztBQXJERCwrQkFBK0I7QUFFL0I7Ozs7R0FJRztBQUNJLEtBQUssVUFBVSx1QkFBdUIsQ0FDM0MsUUFBaUIsRUFDakIsVUFBbUIsRUFDbkIsU0FBa0I7SUFFbEIsTUFBTSxJQUFJLEdBQUcsSUFBSSxZQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDM0MsTUFBTSxNQUFNLEdBQUcsSUFBSSxZQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDL0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxZQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDN0Msa0JBQWtCO0lBQ2xCLE1BQU0sa0JBQWtCLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDaEQsTUFBTSxvQkFBb0IsR0FBRyxNQUFNLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNwRCxNQUFNLG1CQUFtQixHQUFHLE1BQU0sS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ2xELE1BQU0sbUJBQW1CLEdBQUcsTUFBTSxLQUFLLENBQUMsc0JBQXNCLENBQUM7UUFDN0QsV0FBVyxFQUFFLEVBQUU7UUFDZixpQkFBaUIsRUFBRSxDQUFDLEdBQUcsa0JBQWtCLENBQUMsaUJBQWlCLEVBQUUsR0FBRyxvQkFBb0IsQ0FBQyxpQkFBaUIsQ0FBQztLQUN4RyxDQUFDLENBQUM7SUFDSCxhQUFhO0lBRWIsa0JBQWtCO0lBQ2xCLE1BQU0sa0JBQWtCLEdBQUcsTUFBTSxJQUFJLENBQUMsc0JBQXNCLENBQUM7UUFDM0QsV0FBVyxFQUFFLEVBQUU7UUFDZixpQkFBaUIsRUFBRSxDQUFDLEdBQUcsbUJBQW1CLENBQUMsaUJBQWlCLEVBQUUsR0FBRyxvQkFBb0IsQ0FBQyxpQkFBaUIsQ0FBQztLQUN6RyxDQUFDLENBQUM7SUFDSCxNQUFNLG9CQUFvQixHQUFHLE1BQU0sTUFBTSxDQUFDLHNCQUFzQixDQUFDO1FBQy9ELFdBQVcsRUFBRSxFQUFFO1FBQ2YsaUJBQWlCLEVBQUUsQ0FBQyxHQUFHLGtCQUFrQixDQUFDLGlCQUFpQixFQUFFLEdBQUcsbUJBQW1CLENBQUMsaUJBQWlCLENBQUM7S0FDdkcsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxLQUFLLENBQUMsc0JBQXNCLENBQUM7UUFDakMsV0FBVyxFQUFFLENBQUMsbUJBQW1CLEVBQUUsa0JBQWtCLEVBQUUsb0JBQW9CLENBQUM7YUFDekUsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDO2FBQzdCLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDNUIsaUJBQWlCLEVBQUUsRUFBRTtLQUN0QixDQUFDLENBQUM7SUFDSCxNQUFNLElBQUksQ0FBQyxzQkFBc0IsQ0FBQztRQUNoQyxXQUFXLEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSxrQkFBa0IsRUFBRSxvQkFBb0IsQ0FBQzthQUN6RSxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUM7YUFDN0IsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM1QixpQkFBaUIsRUFBRSxFQUFFO0tBQ3RCLENBQUMsQ0FBQztJQUNILE1BQU0sTUFBTSxDQUFDLHNCQUFzQixDQUFDO1FBQ2xDLFdBQVcsRUFBRSxDQUFDLG1CQUFtQixFQUFFLGtCQUFrQixFQUFFLG9CQUFvQixDQUFDO2FBQ3pFLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQzthQUM3QixNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzVCLGlCQUFpQixFQUFFLEVBQUU7S0FDdEIsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDL0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJ1ZmZlciB9IGZyb20gJ2J1ZmZlcic7XG5pbXBvcnQgeyBWcmZEa2cgfSBmcm9tICcuL2RrZyc7XG5cbi8qKlxuICogUnVucyBhIGxvY2FsIDItb2YtMyBWUkYgREtHIGFjcm9zcyB1c2VyICgwKSwgYmFja3VwICgxKSBhbmQgYml0Z28gKDIpIHBhcnRpZXMgYW5kXG4gKiByZXR1cm5zIHRoZSB0aHJlZSBjb21wbGV0ZWQgVnJmRGtnIHNlc3Npb25zLCBtaXJyb3JpbmcgYGdlbmVyYXRlREtHS2V5U2hhcmVzYCBmcm9tXG4gKiBgZWNkc2EtZGtscy91dGlsLnRzYCBzbyBWUkYgdGVzdHMgcmVhZCBsaWtlIHRoZSBleGlzdGluZyBES0xTIG9uZXMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVZyZkRLR0tleVNoYXJlcyhcbiAgc2VlZFVzZXI/OiBCdWZmZXIsXG4gIHNlZWRCYWNrdXA/OiBCdWZmZXIsXG4gIHNlZWRCaXRnbz86IEJ1ZmZlclxuKTogUHJvbWlzZTxbVnJmRGtnLCBWcmZEa2csIFZyZkRrZ10+IHtcbiAgY29uc3QgdXNlciA9IG5ldyBWcmZEa2coMywgMiwgMCwgc2VlZFVzZXIpO1xuICBjb25zdCBiYWNrdXAgPSBuZXcgVnJmRGtnKDMsIDIsIDEsIHNlZWRCYWNrdXApO1xuICBjb25zdCBiaXRnbyA9IG5ldyBWcmZEa2coMywgMiwgMiwgc2VlZEJpdGdvKTtcbiAgLy8gI3JlZ2lvbiByb3VuZCAxXG4gIGNvbnN0IHVzZXJSb3VuZDFNZXNzYWdlcyA9IGF3YWl0IHVzZXIuaW5pdERrZygpO1xuICBjb25zdCBiYWNrdXBSb3VuZDFNZXNzYWdlcyA9IGF3YWl0IGJhY2t1cC5pbml0RGtnKCk7XG4gIGNvbnN0IGJpdGdvUm91bmQxTWVzc2FnZXMgPSBhd2FpdCBiaXRnby5pbml0RGtnKCk7XG4gIGNvbnN0IGJpdGdvUm91bmQyTWVzc2FnZXMgPSBhd2FpdCBiaXRnby5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHtcbiAgICBwMnBNZXNzYWdlczogW10sXG4gICAgYnJvYWRjYXN0TWVzc2FnZXM6IFsuLi51c2VyUm91bmQxTWVzc2FnZXMuYnJvYWRjYXN0TWVzc2FnZXMsIC4uLmJhY2t1cFJvdW5kMU1lc3NhZ2VzLmJyb2FkY2FzdE1lc3NhZ2VzXSxcbiAgfSk7XG4gIC8vICNlbmRyZWdpb25cblxuICAvLyAjcmVnaW9uIHJvdW5kIDJcbiAgY29uc3QgdXNlclJvdW5kMk1lc3NhZ2VzID0gYXdhaXQgdXNlci5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHtcbiAgICBwMnBNZXNzYWdlczogW10sXG4gICAgYnJvYWRjYXN0TWVzc2FnZXM6IFsuLi5iaXRnb1JvdW5kMU1lc3NhZ2VzLmJyb2FkY2FzdE1lc3NhZ2VzLCAuLi5iYWNrdXBSb3VuZDFNZXNzYWdlcy5icm9hZGNhc3RNZXNzYWdlc10sXG4gIH0pO1xuICBjb25zdCBiYWNrdXBSb3VuZDJNZXNzYWdlcyA9IGF3YWl0IGJhY2t1cC5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHtcbiAgICBwMnBNZXNzYWdlczogW10sXG4gICAgYnJvYWRjYXN0TWVzc2FnZXM6IFsuLi51c2VyUm91bmQxTWVzc2FnZXMuYnJvYWRjYXN0TWVzc2FnZXMsIC4uLmJpdGdvUm91bmQxTWVzc2FnZXMuYnJvYWRjYXN0TWVzc2FnZXNdLFxuICB9KTtcbiAgYXdhaXQgYml0Z28uaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgcDJwTWVzc2FnZXM6IFtiaXRnb1JvdW5kMk1lc3NhZ2VzLCB1c2VyUm91bmQyTWVzc2FnZXMsIGJhY2t1cFJvdW5kMk1lc3NhZ2VzXVxuICAgICAgLmZsYXRNYXAoKG0pID0+IG0ucDJwTWVzc2FnZXMpXG4gICAgICAuZmlsdGVyKChtKSA9PiBtLnRvID09PSAyKSxcbiAgICBicm9hZGNhc3RNZXNzYWdlczogW10sXG4gIH0pO1xuICBhd2FpdCB1c2VyLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgIHAycE1lc3NhZ2VzOiBbYml0Z29Sb3VuZDJNZXNzYWdlcywgdXNlclJvdW5kMk1lc3NhZ2VzLCBiYWNrdXBSb3VuZDJNZXNzYWdlc11cbiAgICAgIC5mbGF0TWFwKChtKSA9PiBtLnAycE1lc3NhZ2VzKVxuICAgICAgLmZpbHRlcigobSkgPT4gbS50byA9PT0gMCksXG4gICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtdLFxuICB9KTtcbiAgYXdhaXQgYmFja3VwLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgIHAycE1lc3NhZ2VzOiBbYml0Z29Sb3VuZDJNZXNzYWdlcywgdXNlclJvdW5kMk1lc3NhZ2VzLCBiYWNrdXBSb3VuZDJNZXNzYWdlc11cbiAgICAgIC5mbGF0TWFwKChtKSA9PiBtLnAycE1lc3NhZ2VzKVxuICAgICAgLmZpbHRlcigobSkgPT4gbS50byA9PT0gMSksXG4gICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtdLFxuICB9KTtcbiAgcmV0dXJuIFt1c2VyLCBiYWNrdXAsIGJpdGdvXTtcbn1cbiJdfQ==
54
+ /**
55
+ * Runs the hard-derivation ceremony on top of completed root sessions: the user (0)
56
+ * hard-derive session pairs with a fresh BitGo (2) session, and the backup (1)
57
+ * session with a second fresh BitGo session. The hard-derive wasm session is a
58
+ * 2-party threshold protocol per instance, so the BitGo server side runs two
59
+ * sessions — one per SDK party. All four derived keyshares agree on the child
60
+ * public key; the two BitGo shares are distinct private shares of that same key.
61
+ *
62
+ * @param path hardened derivation path bytes (e.g. `m/0'` as a 4-byte big-endian
63
+ * index with the hardened bit set)
64
+ * @returns [user, backup, bitgoUserPair, bitgoBackupPair] completed Derive sessions
65
+ */
66
+ async function generateHardDerivedKeyShares(userRoot, backupRoot, bitgoRoot, userVrf, backupVrf, bitgoVrf, path, seedUser, seedBackup) {
67
+ const user = new derive_1.Derive(3, 2, 0, userRoot.getKeyShare(), userVrf.getKeyShare(), path, seedUser);
68
+ const backup = new derive_1.Derive(3, 2, 1, backupRoot.getKeyShare(), backupVrf.getKeyShare(), path, seedBackup);
69
+ const bitgoUserPair = new derive_1.Derive(3, 2, 2, bitgoRoot.getKeyShare(), bitgoVrf.getKeyShare(), path);
70
+ const bitgoBackupPair = new derive_1.Derive(3, 2, 2, bitgoRoot.getKeyShare(), bitgoVrf.getKeyShare(), path);
71
+ // #region round 1
72
+ const userMsg1 = await user.initDerive();
73
+ const backupMsg1 = await backup.initDerive();
74
+ const bitgoUserPairMsg1 = await bitgoUserPair.initDerive();
75
+ const bitgoBackupPairMsg1 = await bitgoBackupPair.initDerive();
76
+ const userMsg2 = user.handleIncomingMessages({
77
+ p2pMessages: [],
78
+ broadcastMessages: [{ payload: bitgoUserPairMsg1.payload, from: bitgoUserPairMsg1.from }],
79
+ });
80
+ const bitgoUserPairMsg2 = bitgoUserPair.handleIncomingMessages({
81
+ p2pMessages: [],
82
+ broadcastMessages: [{ payload: userMsg1.payload, from: userMsg1.from }],
83
+ });
84
+ const backupMsg2 = backup.handleIncomingMessages({
85
+ p2pMessages: [],
86
+ broadcastMessages: [{ payload: bitgoBackupPairMsg1.payload, from: bitgoBackupPairMsg1.from }],
87
+ });
88
+ const bitgoBackupPairMsg2 = bitgoBackupPair.handleIncomingMessages({
89
+ p2pMessages: [],
90
+ broadcastMessages: [{ payload: backupMsg1.payload, from: backupMsg1.from }],
91
+ });
92
+ // #endregion
93
+ // #region round 2
94
+ user.handleIncomingMessages({
95
+ p2pMessages: [],
96
+ broadcastMessages: [{ payload: bitgoUserPairMsg2.broadcastMessages[0].payload, from: 2 }],
97
+ });
98
+ bitgoUserPair.handleIncomingMessages({
99
+ p2pMessages: [],
100
+ broadcastMessages: [{ payload: userMsg2.broadcastMessages[0].payload, from: 0 }],
101
+ });
102
+ backup.handleIncomingMessages({
103
+ p2pMessages: [],
104
+ broadcastMessages: [{ payload: bitgoBackupPairMsg2.broadcastMessages[0].payload, from: 2 }],
105
+ });
106
+ bitgoBackupPair.handleIncomingMessages({
107
+ p2pMessages: [],
108
+ broadcastMessages: [{ payload: backupMsg2.broadcastMessages[0].payload, from: 1 }],
109
+ });
110
+ // #endregion
111
+ return [user, backup, bitgoUserPair, bitgoBackupPair];
112
+ }
113
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy90c3MvZGtscy12cmYvdXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQVNBLDBEQThDQztBQWNELG9FQTREQztBQWhJRCxpREFBOEM7QUFDOUMsK0JBQStCO0FBRS9COzs7O0dBSUc7QUFDSSxLQUFLLFVBQVUsdUJBQXVCLENBQzNDLFFBQWlCLEVBQ2pCLFVBQW1CLEVBQ25CLFNBQWtCO0lBRWxCLE1BQU0sSUFBSSxHQUFHLElBQUksWUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzNDLE1BQU0sTUFBTSxHQUFHLElBQUksWUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQy9DLE1BQU0sS0FBSyxHQUFHLElBQUksWUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQzdDLGtCQUFrQjtJQUNsQixNQUFNLGtCQUFrQixHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ2hELE1BQU0sb0JBQW9CLEdBQUcsTUFBTSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDcEQsTUFBTSxtQkFBbUIsR0FBRyxNQUFNLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNsRCxNQUFNLG1CQUFtQixHQUFHLE1BQU0sS0FBSyxDQUFDLHNCQUFzQixDQUFDO1FBQzdELFdBQVcsRUFBRSxFQUFFO1FBQ2YsaUJBQWlCLEVBQUUsQ0FBQyxHQUFHLGtCQUFrQixDQUFDLGlCQUFpQixFQUFFLEdBQUcsb0JBQW9CLENBQUMsaUJBQWlCLENBQUM7S0FDeEcsQ0FBQyxDQUFDO0lBQ0gsYUFBYTtJQUViLGtCQUFrQjtJQUNsQixNQUFNLGtCQUFrQixHQUFHLE1BQU0sSUFBSSxDQUFDLHNCQUFzQixDQUFDO1FB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ZSB9IGZyb20gJy4uL2VjZHNhLWRrbHMvZGVyaXZlJztcbmltcG9ydCB7IFZyZkRrZyB9IGZyb20gJy4vZGtnJztcblxuLyoqXG4gKiBSdW5zIGEgbG9jYWwgMi1vZi0zIFZSRiBES0cgYWNyb3NzIHVzZXIgKDApLCBiYWNrdXAgKDEpIGFuZCBiaXRnbyAoMikgcGFydGllcyBhbmRcbiAqIHJldHVybnMgdGhlIHRocmVlIGNvbXBsZXRlZCBWcmZEa2cgc2Vzc2lvbnMsIG1pcnJvcmluZyBgZ2VuZXJhdGVES0dLZXlTaGFyZXNgIGZyb21cbiAqIGBlY2RzYS1ka2xzL3V0aWwudHNgIHNvIFZSRiB0ZXN0cyByZWFkIGxpa2UgdGhlIGV4aXN0aW5nIERLTFMgb25lcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlVnJmREtHS2V5U2hhcmVzKFxuICBzZWVkVXNlcj86IEJ1ZmZlcixcbiAgc2VlZEJhY2t1cD86IEJ1ZmZlcixcbiAgc2VlZEJpdGdvPzogQnVmZmVyXG4pOiBQcm9taXNlPFtWcmZEa2csIFZyZkRrZywgVnJmRGtnXT4ge1xuICBjb25zdCB1c2VyID0gbmV3IFZyZkRrZygzLCAyLCAwLCBzZWVkVXNlcik7XG4gIGNvbnN0IGJhY2t1cCA9IG5ldyBWcmZEa2coMywgMiwgMSwgc2VlZEJhY2t1cCk7XG4gIGNvbnN0IGJpdGdvID0gbmV3IFZyZkRrZygzLCAyLCAyLCBzZWVkQml0Z28pO1xuICAvLyAjcmVnaW9uIHJvdW5kIDFcbiAgY29uc3QgdXNlclJvdW5kMU1lc3NhZ2VzID0gYXdhaXQgdXNlci5pbml0RGtnKCk7XG4gIGNvbnN0IGJhY2t1cFJvdW5kMU1lc3NhZ2VzID0gYXdhaXQgYmFja3VwLmluaXREa2coKTtcbiAgY29uc3QgYml0Z29Sb3VuZDFNZXNzYWdlcyA9IGF3YWl0IGJpdGdvLmluaXREa2coKTtcbiAgY29uc3QgYml0Z29Sb3VuZDJNZXNzYWdlcyA9IGF3YWl0IGJpdGdvLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgIHAycE1lc3NhZ2VzOiBbXSxcbiAgICBicm9hZGNhc3RNZXNzYWdlczogWy4uLnVzZXJSb3VuZDFNZXNzYWdlcy5icm9hZGNhc3RNZXNzYWdlcywgLi4uYmFja3VwUm91bmQxTWVzc2FnZXMuYnJvYWRjYXN0TWVzc2FnZXNdLFxuICB9KTtcbiAgLy8gI2VuZHJlZ2lvblxuXG4gIC8vICNyZWdpb24gcm91bmQgMlxuICBjb25zdCB1c2VyUm91bmQyTWVzc2FnZXMgPSBhd2FpdCB1c2VyLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgIHAycE1lc3NhZ2VzOiBbXSxcbiAgICBicm9hZGNhc3RNZXNzYWdlczogWy4uLmJpdGdvUm91bmQxTWVzc2FnZXMuYnJvYWRjYXN0TWVzc2FnZXMsIC4uLmJhY2t1cFJvdW5kMU1lc3NhZ2VzLmJyb2FkY2FzdE1lc3NhZ2VzXSxcbiAgfSk7XG4gIGNvbnN0IGJhY2t1cFJvdW5kMk1lc3NhZ2VzID0gYXdhaXQgYmFja3VwLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgIHAycE1lc3NhZ2VzOiBbXSxcbiAgICBicm9hZGNhc3RNZXNzYWdlczogWy4uLnVzZXJSb3VuZDFNZXNzYWdlcy5icm9hZGNhc3RNZXNzYWdlcywgLi4uYml0Z29Sb3VuZDFNZXNzYWdlcy5icm9hZGNhc3RNZXNzYWdlc10sXG4gIH0pO1xuICBhd2FpdCBiaXRnby5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHtcbiAgICBwMnBNZXNzYWdlczogW2JpdGdvUm91bmQyTWVzc2FnZXMsIHVzZXJSb3VuZDJNZXNzYWdlcywgYmFja3VwUm91bmQyTWVzc2FnZXNdXG4gICAgICAuZmxhdE1hcCgobSkgPT4gbS5wMnBNZXNzYWdlcylcbiAgICAgIC5maWx0ZXIoKG0pID0+IG0udG8gPT09IDIpLFxuICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbXSxcbiAgfSk7XG4gIGF3YWl0IHVzZXIuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgcDJwTWVzc2FnZXM6IFtiaXRnb1JvdW5kMk1lc3NhZ2VzLCB1c2VyUm91bmQyTWVzc2FnZXMsIGJhY2t1cFJvdW5kMk1lc3NhZ2VzXVxuICAgICAgLmZsYXRNYXAoKG0pID0+IG0ucDJwTWVzc2FnZXMpXG4gICAgICAuZmlsdGVyKChtKSA9PiBtLnRvID09PSAwKSxcbiAgICBicm9hZGNhc3RNZXNzYWdlczogW10sXG4gIH0pO1xuICBhd2FpdCBiYWNrdXAuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgcDJwTWVzc2FnZXM6IFtiaXRnb1JvdW5kMk1lc3NhZ2VzLCB1c2VyUm91bmQyTWVzc2FnZXMsIGJhY2t1cFJvdW5kMk1lc3NhZ2VzXVxuICAgICAgLmZsYXRNYXAoKG0pID0+IG0ucDJwTWVzc2FnZXMpXG4gICAgICAuZmlsdGVyKChtKSA9PiBtLnRvID09PSAxKSxcbiAgICBicm9hZGNhc3RNZXNzYWdlczogW10sXG4gIH0pO1xuICByZXR1cm4gW3VzZXIsIGJhY2t1cCwgYml0Z29dO1xufVxuXG4vKipcbiAqIFJ1bnMgdGhlIGhhcmQtZGVyaXZhdGlvbiBjZXJlbW9ueSBvbiB0b3Agb2YgY29tcGxldGVkIHJvb3Qgc2Vzc2lvbnM6IHRoZSB1c2VyICgwKVxuICogaGFyZC1kZXJpdmUgc2Vzc2lvbiBwYWlycyB3aXRoIGEgZnJlc2ggQml0R28gKDIpIHNlc3Npb24sIGFuZCB0aGUgYmFja3VwICgxKVxuICogc2Vzc2lvbiB3aXRoIGEgc2Vjb25kIGZyZXNoIEJpdEdvIHNlc3Npb24uIFRoZSBoYXJkLWRlcml2ZSB3YXNtIHNlc3Npb24gaXMgYVxuICogMi1wYXJ0eSB0aHJlc2hvbGQgcHJvdG9jb2wgcGVyIGluc3RhbmNlLCBzbyB0aGUgQml0R28gc2VydmVyIHNpZGUgcnVucyB0d29cbiAqIHNlc3Npb25zIOKAlCBvbmUgcGVyIFNESyBwYXJ0eS4gQWxsIGZvdXIgZGVyaXZlZCBrZXlzaGFyZXMgYWdyZWUgb24gdGhlIGNoaWxkXG4gKiBwdWJsaWMga2V5OyB0aGUgdHdvIEJpdEdvIHNoYXJlcyBhcmUgZGlzdGluY3QgcHJpdmF0ZSBzaGFyZXMgb2YgdGhhdCBzYW1lIGtleS5cbiAqXG4gKiBAcGFyYW0gcGF0aCBoYXJkZW5lZCBkZXJpdmF0aW9uIHBhdGggYnl0ZXMgKGUuZy4gYG0vMCdgIGFzIGEgNC1ieXRlIGJpZy1lbmRpYW5cbiAqICAgaW5kZXggd2l0aCB0aGUgaGFyZGVuZWQgYml0IHNldClcbiAqIEByZXR1cm5zIFt1c2VyLCBiYWNrdXAsIGJpdGdvVXNlclBhaXIsIGJpdGdvQmFja3VwUGFpcl0gY29tcGxldGVkIERlcml2ZSBzZXNzaW9uc1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVIYXJkRGVyaXZlZEtleVNoYXJlcyhcbiAgdXNlclJvb3Q6IHsgZ2V0S2V5U2hhcmUoKTogQnVmZmVyIH0sXG4gIGJhY2t1cFJvb3Q6IHsgZ2V0S2V5U2hhcmUoKTogQnVmZmVyIH0sXG4gIGJpdGdvUm9vdDogeyBnZXRLZXlTaGFyZSgpOiBCdWZmZXIgfSxcbiAgdXNlclZyZjogVnJmRGtnLFxuICBiYWNrdXBWcmY6IFZyZkRrZyxcbiAgYml0Z29WcmY6IFZyZkRrZyxcbiAgcGF0aDogVWludDhBcnJheSxcbiAgc2VlZFVzZXI/OiBCdWZmZXIsXG4gIHNlZWRCYWNrdXA/OiBCdWZmZXJcbik6IFByb21pc2U8W0Rlcml2ZSwgRGVyaXZlLCBEZXJpdmUsIERlcml2ZV0+IHtcbiAgY29uc3QgdXNlciA9IG5ldyBEZXJpdmUoMywgMiwgMCwgdXNlclJvb3QuZ2V0S2V5U2hhcmUoKSwgdXNlclZyZi5nZXRLZXlTaGFyZSgpLCBwYXRoLCBzZWVkVXNlcik7XG4gIGNvbnN0IGJhY2t1cCA9IG5ldyBEZXJpdmUoMywgMiwgMSwgYmFja3VwUm9vdC5nZXRLZXlTaGFyZSgpLCBiYWNrdXBWcmYuZ2V0S2V5U2hhcmUoKSwgcGF0aCwgc2VlZEJhY2t1cCk7XG4gIGNvbnN0IGJpdGdvVXNlclBhaXIgPSBuZXcgRGVyaXZlKDMsIDIsIDIsIGJpdGdvUm9vdC5nZXRLZXlTaGFyZSgpLCBiaXRnb1ZyZi5nZXRLZXlTaGFyZSgpLCBwYXRoKTtcbiAgY29uc3QgYml0Z29CYWNrdXBQYWlyID0gbmV3IERlcml2ZSgzLCAyLCAyLCBiaXRnb1Jvb3QuZ2V0S2V5U2hhcmUoKSwgYml0Z29WcmYuZ2V0S2V5U2hhcmUoKSwgcGF0aCk7XG5cbiAgLy8gI3JlZ2lvbiByb3VuZCAxXG4gIGNvbnN0IHVzZXJNc2cxID0gYXdhaXQgdXNlci5pbml0RGVyaXZlKCk7XG4gIGNvbnN0IGJhY2t1cE1zZzEgPSBhd2FpdCBiYWNrdXAuaW5pdERlcml2ZSgpO1xuICBjb25zdCBiaXRnb1VzZXJQYWlyTXNnMSA9IGF3YWl0IGJpdGdvVXNlclBhaXIuaW5pdERlcml2ZSgpO1xuICBjb25zdCBiaXRnb0JhY2t1cFBhaXJNc2cxID0gYXdhaXQgYml0Z29CYWNrdXBQYWlyLmluaXREZXJpdmUoKTtcblxuICBjb25zdCB1c2VyTXNnMiA9IHVzZXIuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgcDJwTWVzc2FnZXM6IFtdLFxuICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbeyBwYXlsb2FkOiBiaXRnb1VzZXJQYWlyTXNnMS5wYXlsb2FkLCBmcm9tOiBiaXRnb1VzZXJQYWlyTXNnMS5mcm9tIH1dLFxuICB9KTtcbiAgY29uc3QgYml0Z29Vc2VyUGFpck1zZzIgPSBiaXRnb1VzZXJQYWlyLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgIHAycE1lc3NhZ2VzOiBbXSxcbiAgICBicm9hZGNhc3RNZXNzYWdlczogW3sgcGF5bG9hZDogdXNlck1zZzEucGF5bG9hZCwgZnJvbTogdXNlck1zZzEuZnJvbSB9XSxcbiAgfSk7XG4gIGNvbnN0IGJhY2t1cE1zZzIgPSBiYWNrdXAuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgcDJwTWVzc2FnZXM6IFtdLFxuICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbeyBwYXlsb2FkOiBiaXRnb0JhY2t1cFBhaXJNc2cxLnBheWxvYWQsIGZyb206IGJpdGdvQmFja3VwUGFpck1zZzEuZnJvbSB9XSxcbiAgfSk7XG4gIGNvbnN0IGJpdGdvQmFja3VwUGFpck1zZzIgPSBiaXRnb0JhY2t1cFBhaXIuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgcDJwTWVzc2FnZXM6IFtdLFxuICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbeyBwYXlsb2FkOiBiYWNrdXBNc2cxLnBheWxvYWQsIGZyb206IGJhY2t1cE1zZzEuZnJvbSB9XSxcbiAgfSk7XG4gIC8vICNlbmRyZWdpb25cblxuICAvLyAjcmVnaW9uIHJvdW5kIDJcbiAgdXNlci5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHtcbiAgICBwMnBNZXNzYWdlczogW10sXG4gICAgYnJvYWRjYXN0TWVzc2FnZXM6IFt7IHBheWxvYWQ6IGJpdGdvVXNlclBhaXJNc2cyLmJyb2FkY2FzdE1lc3NhZ2VzWzBdLnBheWxvYWQsIGZyb206IDIgfV0sXG4gIH0pO1xuICBiaXRnb1VzZXJQYWlyLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgIHAycE1lc3NhZ2VzOiBbXSxcbiAgICBicm9hZGNhc3RNZXNzYWdlczogW3sgcGF5bG9hZDogdXNlck1zZzIuYnJvYWRjYXN0TWVzc2FnZXNbMF0ucGF5bG9hZCwgZnJvbTogMCB9XSxcbiAgfSk7XG4gIGJhY2t1cC5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHtcbiAgICBwMnBNZXNzYWdlczogW10sXG4gICAgYnJvYWRjYXN0TWVzc2FnZXM6IFt7IHBheWxvYWQ6IGJpdGdvQmFja3VwUGFpck1zZzIuYnJvYWRjYXN0TWVzc2FnZXNbMF0ucGF5bG9hZCwgZnJvbTogMiB9XSxcbiAgfSk7XG4gIGJpdGdvQmFja3VwUGFpci5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHtcbiAgICBwMnBNZXNzYWdlczogW10sXG4gICAgYnJvYWRjYXN0TWVzc2FnZXM6IFt7IHBheWxvYWQ6IGJhY2t1cE1zZzIuYnJvYWRjYXN0TWVzc2FnZXNbMF0ucGF5bG9hZCwgZnJvbTogMSB9XSxcbiAgfSk7XG4gIC8vICNlbmRyZWdpb25cblxuICByZXR1cm4gW3VzZXIsIGJhY2t1cCwgYml0Z29Vc2VyUGFpciwgYml0Z29CYWNrdXBQYWlyXTtcbn1cbiJdfQ==
@@ -0,0 +1,111 @@
1
+ import type { HardDeriveSession as DklsHardDeriveSession, VrfKeygenSession as DklsVrfKeygenSession } from '@silencelaboratories/dkls-wasm-ll-vrf-node';
2
+ import type { HardDeriveSession as DklsVrfWebHardDeriveSession, VrfKeygenSession as DklsVrfWebKeygenSession } from '@silencelaboratories/dkls-wasm-ll-vrf-web';
3
+ import { Buffer } from 'buffer';
4
+ import { DeserializedBroadcastMessage, DeserializedMessages } from './types';
5
+ type NodeVrfWasmer = typeof import('@silencelaboratories/dkls-wasm-ll-vrf-node');
6
+ type WebVrfWasmer = typeof import('@silencelaboratories/dkls-wasm-ll-vrf-web');
7
+ type BundlerVrfWasmer = typeof import('@silencelaboratories/dkls-wasm-ll-vrf-bundler');
8
+ type VrfWasm = NodeVrfWasmer | WebVrfWasmer | BundlerVrfWasmer;
9
+ export type { DklsHardDeriveSession, DklsVrfWebHardDeriveSession, DklsVrfKeygenSession, DklsVrfWebKeygenSession };
10
+ export declare enum DeriveState {
11
+ Uninitialized = 0,
12
+ Round1 = 1,
13
+ Round2 = 2,
14
+ Complete = 3,
15
+ InvalidState = 4
16
+ }
17
+ export interface DeriveSessionData {
18
+ deriveSessionBytes: Uint8Array;
19
+ deriveState: DeriveState;
20
+ keyShareBuff?: Buffer;
21
+ ownMsg1?: Uint8Array;
22
+ ownMsg2?: Uint8Array;
23
+ }
24
+ /**
25
+ * Round driver for the DKLS23 hard-derivation protocol (Ristretto VRF backed),
26
+ * which derives a child signing keyshare from a root keyshare and its VRF keyshare.
27
+ *
28
+ * Each session is a 2-party threshold protocol between this party and one partner:
29
+ * every round accepts exactly two broadcast messages — this party's own (created by
30
+ * `initDerive()` and re-fed automatically) and the partner's. A ceremony runs one
31
+ * `Derive` per SDK party, each paired with the BitGo party:
32
+ *
33
+ * - Round 1 (`WaitMsg1`): consume `{own msg1, partner msg1}`, emit own broadcast msg2.
34
+ * - Round 2 (`WaitMsg2`): consume `{own msg2, partner msg2}`, finalize the session
35
+ * and extract the derived DKLS `Keyshare`.
36
+ *
37
+ * The session is seeded from the decrypted root blob: the DKLS signing keyshare and
38
+ * the Ristretto VRF keyshare produced by root keygen, plus the child's hardened
39
+ * derivation path.
40
+ *
41
+ * Party indices follow the MPCv2 convention: 0 = user, 1 = backup, 2 = bitgo.
42
+ */
43
+ export declare class Derive {
44
+ protected deriveSession: DklsHardDeriveSession | DklsVrfWebHardDeriveSession | undefined;
45
+ protected deriveSessionBytes: Uint8Array;
46
+ protected keyShareBuff: Buffer | undefined;
47
+ protected n: number;
48
+ protected t: number;
49
+ protected partyIdx: number;
50
+ protected rootKeyShare: Buffer;
51
+ protected vrfKeyShare: Buffer;
52
+ protected path: Uint8Array;
53
+ protected seed: Buffer | undefined;
54
+ protected deriveState: DeriveState;
55
+ protected vrfWasm: VrfWasm | null;
56
+ protected ownMsg1: Uint8Array | undefined;
57
+ protected ownMsg2: Uint8Array | undefined;
58
+ constructor(n: number, t: number, partyIdx: number, rootKeyShare: Buffer, vrfKeyShare: Buffer, path: Uint8Array, seed?: Buffer, vrfWasm?: BundlerVrfWasmer);
59
+ private loadVrfWasm;
60
+ private getVrfWasm;
61
+ private _restoreSession;
62
+ /**
63
+ * Re-derive the round state from the wasm session bytes instead of trusting a
64
+ * caller-supplied enum. The wasm embeds the round tag (`WaitMsg1`/`WaitMsg2`,
65
+ * then a `Share` payload once finalized) for exactly this reason.
66
+ */
67
+ private _deserializeState;
68
+ /**
69
+ * Create this party's first hard-derive message (broadcast). Seeds the wasm
70
+ * session from the root keyshare, VRF keyshare and derivation path.
71
+ */
72
+ initDerive(): Promise<DeserializedBroadcastMessage>;
73
+ /**
74
+ * Process the messages this party holds for the current round and return this
75
+ * party's messages for the next round. Callers pass the partner's broadcast
76
+ * message only; this party's own message is re-fed automatically because the
77
+ * wasm session validates the sender set as `{self, partner}`.
78
+ *
79
+ * - Round 1 (WaitMsg1): consumes `{own msg1, partner msg1}` and emits this
80
+ * party's broadcast msg2.
81
+ * - Round 2 (WaitMsg2): consumes `{own msg2, partner msg2}` and finalizes the
82
+ * session, returning no messages.
83
+ */
84
+ handleIncomingMessages(messagesForIthRound: DeserializedMessages): DeserializedMessages;
85
+ /**
86
+ * Get the derived DKLS keyshare bytes (CBOR `Keyshare`) once the derive is
87
+ * complete. This buffer is private key material.
88
+ */
89
+ getKeyShare(): Buffer;
90
+ /**
91
+ * Returns a CBOR-encoded ReducedKeyShare buffer containing the derived party's
92
+ * private scalar (s_i) in the `prv` field. This buffer is private key material;
93
+ * the caller encrypts it as `reducedEncryptedPrv`, matching `Dkg.getReducedKeyShare`.
94
+ */
95
+ getReducedKeyShare(): Buffer;
96
+ /**
97
+ * Get the current session data that can be used to restore the session later.
98
+ *
99
+ * The returned session bytes are secret key material — they carry this party's
100
+ * root keyshares. They must never be logged or persisted in the clear; the
101
+ * caller encrypts them exactly like the key share itself.
102
+ */
103
+ getSessionData(): DeriveSessionData;
104
+ /**
105
+ * Restore a session snapshot captured after initDerive() or round 1 processing.
106
+ * Do not call this before initDerive() has created session bytes.
107
+ * The round state is re-derived from the wasm session bytes, not the caller enum.
108
+ */
109
+ static restoreSession(n: number, t: number, partyIdx: number, rootKeyShare: Buffer, vrfKeyShare: Buffer, path: Uint8Array, sessionData: DeriveSessionData, seed?: Buffer, vrfWasm?: BundlerVrfWasmer): Promise<Derive>;
110
+ }
111
+ //# sourceMappingURL=derive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"derive.d.ts","sourceRoot":"","sources":["../../../../src/tss/ecdsa-dkls/derive.ts"],"names":[],"mappings":"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"}