Skip to content

Commit 44c275c

Browse files
WIP: integrate getting bitgo gpg key
1 parent 8be5edb commit 44c275c

File tree

5 files changed

+38
-11
lines changed

5 files changed

+38
-11
lines changed

src/__tests__/masterBitgoExpress/.wip.md

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,20 @@
11
# Notes
22

33
## Work Items
4+
45
- [x] Get example logs
56
- [x] Create api specs for use
6-
- [x] Actual Master Spec
7-
- [x] Standup Enclaved Spec
8-
- [x] Create empty handlers
9-
- [ ] Modify to directly call BitGo (instaead of using the methods)
7+
- [x] Actual Master Spec
8+
- [x] Standup Enclaved Spec
9+
- [x] Create empty handlers
10+
- [x] Modify to directly call BitGo (instaead of using the methods)
11+
- [ ] Fill out implementation for finalize
12+
- [ ] mock out the encrypted data being sent back & forth
1013
- [ ] Create integration tests with fake values from below
11-
- [ ] pass in BitGo GPG Key to enclaved
14+
- [x] pass in BitGo GPG Key to enclaved
1215

1316
## Example Logs from Creating a Solana Keychain
17+
1418
```json
1519
Starting keychain creation process...
1620
Step 1: Initializing MPC...
@@ -296,4 +300,4 @@ Final keychain triplet: {
296300
"walletHSMGPGPublicKeySigs": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nxk8EaFRmgBMFK4EEAAoCAwTGXYL4mPPKg3u1KkPeXR9lOqqem/i3kgdgQE9P\nIZlvNdZyVcoAyrTos0Negm39jQPzssKbjNYbwmD6oBliJIWDzVUxYzU3NDY3\nNmUwNWM3Zjc0Zjg4YmM5YmEgPHVzZXItMWM1NzQ2NzZlMDVjN2Y3NGY4OGJj\nOWJhQDFjNTc0Njc2ZTA1YzdmNzRmODhiYzliYS5jb20+wowEEBMIAD4FgmhU\nZoAECwkHCAmQ6ylVI/YkWEQDFQgKBBYAAgECGQECmwMCHgEWIQRS2wpzMoJX\nVNidgnnrKVUj9iRYRAAA0kkA/R78hy0CNnUPCMMi2Co6VlYALrx+xFydb0+7\n8Yza5IF2AP93Xc9FKo8OPO5pg5uPnC6fXvsJqVne289iETTtsihaaMLCCQQT\nEwgCewWCaFRmhgILCQmQiTUbCAxrp3uXFIAAAAAADgCAY29tbW9uS2V5Y2hh\naW40ZTUzNGEwMTkzYzY2MzZhMDcyNzA3OWUyNTYwMWFiZDZjMjg1M2Q2MzU4\nMjE2MmJjNTNhZTY5YjE1MmYwZWMyYzJlMDk2NTgzZGE4ZTdmZmQzNmRmZjYx\nMzFhMTcwMjA3MjdmOTU0MzAwMTUyNWMxNzJjMWU3NzI5MDAzNTlkMz0UgAAA\nAAAMACh1c2VyR3BnS2V5SWQ1MmRiMGE3MzMyODI1NzU0ZDg5ZDgyNzllYjI5\nNTUyM2Y2MjQ1ODQ0PxSAAAAAAA4AKGJhY2t1cEdwZ0tleUlkODk0OTEwZjQx\nNzAzZTZjMmI2YWE4ODQ0YWNkNzJkMDRkOTlhMDFjMJUUgAAAAAAMAIB1c2Vy\nU2hhcmVQdWI3MWM5ZTUwZWQwYTM2ZDJhNjNiODQyMmIxYWJjZGNkYjdlMDA2\nYTNhYzYxZTM0ZmUyNGU5YmYwMjY1YzU4ZDkwNGRhYzZmNjkzZGRlZGY1NzU0\nZjIwOWRlNDI5YjliODViODc4ZTA5MjllYzg2NjAxN2Y4ZGExYjE3ZTE2OTZj\nM5cUgAAAAAAOAIBiYWNrdXBTaGFyZVB1YjI5NWRjZDIwMTQ3Yzk4ZjJmODUx\nZjU1MmYxODk0NmM5NDkyN2ZlMzFlNjE4NjM2Mzg1Y2MyMzVhMzk1OWIwOWQ0\nZGFjNmY2OTNkZGVkZjU3NTRmMjA5ZGU0MjliOWI4NWI4NzhlMDkyOWVjODY2\nMDE3ZjhkYTFiMTdlMTY5NmMzAhUIAhYAA5sCAQIeARYhBHRL5D/8nRM3opQn\nXok1GwgMa6d7AAD7mAEA2N9MScMErOBVXAJ03lvxpz+7PgbScvL7RO1OiQRz\nxeMA+wUgxou9ZJpBUuenj/z/29vcboGUI+FcnD/g8ZWCHG/fzlMEaFRmgBIF\nK4EEAAoCAwT30/I8Lw7K+MxvkYwsi9TdQ5ry8McPDgQnEST2+M/UzzD1TPwG\nVFvLXBgVKFxNiuXyWoGa870qzAddIu/DLDVAAwEIB8J4BBgTCAAqBYJoVGaA\nCZDrKVUj9iRYRAKbDBYhBFLbCnMygldU2J2CeespVSP2JFhEAABLGwD9FsE/\nks9t9wBrLyiyKlVZ/+hPPDb+0rMRHQrcV8ACwiYA/RzZ576prROfme957NGj\n5fGAijHDaBPyNinLMnD4EoEFxk8EaFRmgBMFK4EEAAoCAwQbnZsAMbrZ6Lnl\nMT8ZjmCyq4Au+KDEMH9dndk5qVpZIgvHzMwZYusZtija5M/erWbg0Iutv1R1\nolMd9htHSScOzVViMmZlNTRlZTI1YzIyOWM0MzJiNzU2MWYgPHVzZXItYjJm\nZTU0ZWUyNWMyMjljNDMyYjc1NjFmQGIyZmU1NGVlMjVjMjI5YzQzMmI3NTYx\nZi5jb20+wowEEBMIAD4FgmhUZoAECwkHCAmQrNctBNmaAcADFQgKBBYAAgEC\nGQECmwMCHgEWIQSJSRD0FwPmwraqiESs1y0E2ZoBwAAAqJkBAIhIhHS8i71t\nbe43TKYThRaOzeo73afL31UEbK12huloAQCrjr5GEz+4L84Nl8TcWt5yAI8U\nF1hi+O5rdP35UL6xKcLCCQQTEwgCewWCaFRmhwILCQmQiTUbCAxrp3uXFIAA\nAAAADgCAY29tbW9uS2V5Y2hhaW40ZTUzNGEwMTkzYzY2MzZhMDcyNzA3OWUy\nNTYwMWFiZDZjMjg1M2Q2MzU4MjE2MmJjNTNhZTY5YjE1MmYwZWMyYzJlMDk2\nNTgzZGE4ZTdmZmQzNmRmZjYxMzFhMTcwMjA3MjdmOTU0MzAwMTUyNWMxNzJj\nMWU3NzI5MDAzNTlkMz0UgAAAAAAMACh1c2VyR3BnS2V5SWQ1MmRiMGE3MzMy\nODI1NzU0ZDg5ZDgyNzllYjI5NTUyM2Y2MjQ1ODQ0PxSAAAAAAA4AKGJhY2t1\ncEdwZ0tleUlkODk0OTEwZjQxNzAzZTZjMmI2YWE4ODQ0YWNkNzJkMDRkOTlh\nMDFjMJUUgAAAAAAMAIB1c2VyU2hhcmVQdWI3MWM5ZTUwZWQwYTM2ZDJhNjNi\nODQyMmIxYWJjZGNkYjdlMDA2YTNhYzYxZTM0ZmUyNGU5YmYwMjY1YzU4ZDkw\nNGRhYzZmNjkzZGRlZGY1NzU0ZjIwOWRlNDI5YjliODViODc4ZTA5MjllYzg2\nNjAxN2Y4ZGExYjE3ZTE2OTZjM5cUgAAAAAAOAIBiYWNrdXBTaGFyZVB1YjI5\nNWRjZDIwMTQ3Yzk4ZjJmODUxZjU1MmYxODk0NmM5NDkyN2ZlMzFlNjE4NjM2\nMzg1Y2MyMzVhMzk1OWIwOWQ0ZGFjNmY2OTNkZGVkZjU3NTRmMjA5ZGU0Mjli\nOWI4NWI4NzhlMDkyOWVjODY2MDE3ZjhkYTFiMTdlMTY5NmMzAhUIAhYAA5sC\nAQIeARYhBHRL5D/8nRM3opQnXok1GwgMa6d7AAA1qQD/VhEk0qEulSG72bf7\nH5TOCL6dnYbxmWswr4on7z3zXoEA/iW1qjJ73pqhjDtajEWgN6xUn2tV9Gpg\nThEYxANgKbB9zlMEaFRmgBIFK4EEAAoCAwT4Gb8wWXh8/sLEmxqedVVxnUz5\nsvxfyRyXfTBdouSKq+BmkS6etrjajhHBpBxCKuy89f352LQ/YWgVcf+fX6zX\nAwEIB8J4BBgTCAAqBYJoVGaACZCs1y0E2ZoBwAKbDBYhBIlJEPQXA+bCtqqI\nRKzXLQTZmgHAAABdagEAj3HDYn2bPI8amcWIhv+rEdHNJtew1jI+/FRTXmtI\nqJoA/27LrU0kGze9NPzN/fc+QCCjEVmwQMvACwPI55wf8KKX\n=c8yX\n-----END PGP PUBLIC KEY BLOCK-----\n"
297301
}
298302
}
299-
```
303+
```

src/__tests__/masterBitgoExpress/generateWallet.test.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,9 +138,23 @@ describe('POST /api/:coin/wallet/generate', () => {
138138
});
139139

140140
it('should generate a TSS wallet by calling the enclaved express service', async () => {
141+
const constantsNock = nock(bitgoApiUrl)
142+
.get('/api/v1/client/constants')
143+
// Not sure why the nock is not matching any headers, but this works
144+
.matchHeader('accept-encoding', 'gzip, deflate')
145+
.matchHeader('bitgo-sdk-version', '48.0.0')
146+
.reply(200, {
147+
constants: {
148+
mpc: {
149+
bitgoPublicKey: 'test-bitgo-public-key',
150+
},
151+
},
152+
});
153+
141154
const userInitNock = nock(enclavedExpressUrl)
142155
.post(`/api/${eddsaCoin}/mpc/initialize`, {
143156
source: 'user',
157+
bitgoGpgKey: 'test-bitgo-public-key',
144158
})
145159
.reply(200, {
146160
encryptedDataKey: 'key',
@@ -163,6 +177,7 @@ describe('POST /api/:coin/wallet/generate', () => {
163177
const backupInitNock = nock(enclavedExpressUrl)
164178
.post(`/api/${eddsaCoin}/mpc/initialize`, {
165179
source: 'backup',
180+
bitgoGpgKey: 'test-bitgo-public-key',
166181
})
167182
.reply(200, {
168183
encryptedDataKey: 'key',
@@ -261,6 +276,7 @@ describe('POST /api/:coin/wallet/generate', () => {
261276
// );
262277

263278
// Verify all nock mocks were called
279+
constantsNock.done();
264280
userInitNock.done();
265281
backupInitNock.done();
266282
bitgoAddKeychainNock.done();

src/enclavedBitgoExpress/routers/enclavedApiSpec.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ const BitgoPayloadType = t.union([
5050

5151
export const InitEddsaKeyGenerationRequest = {
5252
source: t.union([t.literal('user'), t.literal('backup')]),
53+
bitgoGpgKey: t.string,
5354
};
5455

5556
export const InitEddsaKeyGenerationResponse = t.type({

src/masterBitgoExpress/enclavedExpressClient.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,10 @@ import { InitEddsaKeyGenerationResponse } from '../enclavedBitgoExpress/routers/
1414

1515
const debugLogger = debug('bitgo:express:enclavedExpressClient');
1616

17-
interface InitMpcKeyGenerationParams {
17+
export type InitMpcKeyGenerationParams = {
1818
source: 'user' | 'backup';
19-
coin?: string;
20-
}
19+
bitgoGpgKey: string;
20+
};
2121

2222
interface FinalizeMpcKeyGenerationParams {
2323
source: 'user' | 'backup';
@@ -268,6 +268,7 @@ export class EnclavedExpressClient {
268268
let request = this.apiClient['v1.key.mpc.init'].post({
269269
coin: this.coin,
270270
source: params.source,
271+
bitgoGpgKey: params.bitgoGpgKey,
271272
});
272273

273274
if (this.tlsMode === TlsMode.MTLS) {

src/masterBitgoExpress/generateWallet.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -154,15 +154,20 @@ export async function handleGenerateOnPremMpcWallet(
154154
walletParams.enterprise = enterprise;
155155
}
156156

157+
const constants = await bitgo.fetchConstants();
158+
if (!constants.mpc || !constants.mpc.bitgoPublicKey) {
159+
throw new Error('Unable to create MPC keys - bitgoPublicKey is missing from constants');
160+
}
161+
157162
// Initialize key generation for user and backup
158163
const userInitResponse = await enclavedExpressClient.initMpcKeyGeneration({
159164
source: 'user',
160-
coin: req.params.coin,
165+
bitgoGpgKey: constants.mpc.bitgoPublicKey,
161166
});
162167

163168
const backupInitResponse = await enclavedExpressClient.initMpcKeyGeneration({
164169
source: 'backup',
165-
coin: req.params.coin,
170+
bitgoGpgKey: constants.mpc.bitgoPublicKey,
166171
});
167172

168173
// Extract GPG keys based on payload type

0 commit comments

Comments
 (0)