vault envelope encryption
Explanation
The idea is to add support for envelope encryption to the keyring controller. That is, we allow to inject an external encryption key that is used for vault encryption. We then encrypt the vault encryption key under the password and store it in the state.
This solves a problem we had with making the vault recoverable from the SRP backup key. See https://github.com/MetaMask/decisions/pull/85 for context. Envelope encryption also has other benefits like more efficient rekeying. (Can change the password without having to re-encrypt the whole vault.)
Things to pay extra attention to:
- backwards compatibility
- migration
- correct rollback upon failed state change
References
Changelog
Checklist
- [x] I've updated the test suite for new or updated code as appropriate
- [x] I've updated documentation (JSDoc, Markdown, etc.) for new or updated code as appropriate
- [x] I've communicated my changes to consumers by updating changelogs for packages I've changed, highlighting breaking changes as necessary
- [x] I've prepared draft pull requests for clients and consumer packages to resolve any breaking changes
We should probably throw an error in the constructor if encryptedEncryptionKey is in the injected state but the encryptor doesn't support key export
rebase
@metamaskbot publish-preview
Preview builds have been published. See these instructions for more information about preview builds.
Expand for full list of packages and versions.
{
"@metamask-previews/account-tree-controller": "0.1.0-preview-a272c5e1",
"@metamask-previews/accounts-controller": "30.0.0-preview-a272c5e1",
"@metamask-previews/address-book-controller": "6.1.0-preview-a272c5e1",
"@metamask-previews/announcement-controller": "7.0.3-preview-a272c5e1",
"@metamask-previews/app-metadata-controller": "1.0.0-preview-a272c5e1",
"@metamask-previews/approval-controller": "7.1.3-preview-a272c5e1",
"@metamask-previews/assets-controllers": "68.1.0-preview-a272c5e1",
"@metamask-previews/base-controller": "8.0.1-preview-a272c5e1",
"@metamask-previews/bridge-controller": "32.1.1-preview-a272c5e1",
"@metamask-previews/bridge-status-controller": "29.1.0-preview-a272c5e1",
"@metamask-previews/build-utils": "3.0.3-preview-a272c5e1",
"@metamask-previews/chain-agnostic-permission": "0.7.0-preview-a272c5e1",
"@metamask-previews/composable-controller": "11.0.0-preview-a272c5e1",
"@metamask-previews/controller-utils": "11.10.0-preview-a272c5e1",
"@metamask-previews/delegation-controller": "0.4.0-preview-a272c5e1",
"@metamask-previews/earn-controller": "1.1.0-preview-a272c5e1",
"@metamask-previews/eip1193-permission-middleware": "0.1.0-preview-a272c5e1",
"@metamask-previews/ens-controller": "16.0.0-preview-a272c5e1",
"@metamask-previews/error-reporting-service": "1.0.0-preview-a272c5e1",
"@metamask-previews/eth-json-rpc-provider": "4.1.8-preview-a272c5e1",
"@metamask-previews/foundryup": "1.0.0-preview-a272c5e1",
"@metamask-previews/gas-fee-controller": "23.0.0-preview-a272c5e1",
"@metamask-previews/json-rpc-engine": "10.0.3-preview-a272c5e1",
"@metamask-previews/json-rpc-middleware-stream": "8.0.7-preview-a272c5e1",
"@metamask-previews/keyring-controller": "22.0.2-preview-a272c5e1",
"@metamask-previews/logging-controller": "6.0.4-preview-a272c5e1",
"@metamask-previews/message-manager": "12.0.1-preview-a272c5e1",
"@metamask-previews/multichain": "4.1.0-preview-a272c5e1",
"@metamask-previews/multichain-api-middleware": "0.4.0-preview-a272c5e1",
"@metamask-previews/multichain-network-controller": "0.8.0-preview-a272c5e1",
"@metamask-previews/multichain-transactions-controller": "2.0.0-preview-a272c5e1",
"@metamask-previews/name-controller": "8.0.3-preview-a272c5e1",
"@metamask-previews/network-controller": "23.6.0-preview-a272c5e1",
"@metamask-previews/notification-services-controller": "10.0.0-preview-a272c5e1",
"@metamask-previews/permission-controller": "11.0.6-preview-a272c5e1",
"@metamask-previews/permission-log-controller": "3.0.3-preview-a272c5e1",
"@metamask-previews/phishing-controller": "12.5.0-preview-a272c5e1",
"@metamask-previews/polling-controller": "13.0.0-preview-a272c5e1",
"@metamask-previews/preferences-controller": "18.1.0-preview-a272c5e1",
"@metamask-previews/profile-sync-controller": "17.0.0-preview-a272c5e1",
"@metamask-previews/queued-request-controller": "10.0.0-preview-a272c5e1",
"@metamask-previews/rate-limit-controller": "6.0.3-preview-a272c5e1",
"@metamask-previews/remote-feature-flag-controller": "1.6.0-preview-a272c5e1",
"@metamask-previews/sample-controllers": "0.1.0-preview-a272c5e1",
"@metamask-previews/seedless-onboarding-controller": "1.0.0-preview-a272c5e1",
"@metamask-previews/selected-network-controller": "22.1.0-preview-a272c5e1",
"@metamask-previews/signature-controller": "30.0.0-preview-a272c5e1",
"@metamask-previews/token-search-discovery-controller": "3.3.0-preview-a272c5e1",
"@metamask-previews/transaction-controller": "57.2.0-preview-a272c5e1",
"@metamask-previews/user-operation-controller": "36.0.0-preview-a272c5e1"
}
rebase
@metamaskbot publish-preview
Preview builds have been published. See these instructions for more information about preview builds.
Expand for full list of packages and versions.
{
"@metamask-previews/account-tree-controller": "0.1.1-preview-0013a1bd",
"@metamask-previews/accounts-controller": "30.0.0-preview-0013a1bd",
"@metamask-previews/address-book-controller": "6.1.0-preview-0013a1bd",
"@metamask-previews/announcement-controller": "7.0.3-preview-0013a1bd",
"@metamask-previews/app-metadata-controller": "1.0.0-preview-0013a1bd",
"@metamask-previews/approval-controller": "7.1.3-preview-0013a1bd",
"@metamask-previews/assets-controllers": "68.1.0-preview-0013a1bd",
"@metamask-previews/base-controller": "8.0.1-preview-0013a1bd",
"@metamask-previews/bridge-controller": "32.1.2-preview-0013a1bd",
"@metamask-previews/bridge-status-controller": "29.1.1-preview-0013a1bd",
"@metamask-previews/build-utils": "3.0.3-preview-0013a1bd",
"@metamask-previews/chain-agnostic-permission": "0.7.0-preview-0013a1bd",
"@metamask-previews/composable-controller": "11.0.0-preview-0013a1bd",
"@metamask-previews/controller-utils": "11.10.0-preview-0013a1bd",
"@metamask-previews/delegation-controller": "0.4.0-preview-0013a1bd",
"@metamask-previews/earn-controller": "1.1.0-preview-0013a1bd",
"@metamask-previews/eip1193-permission-middleware": "0.1.0-preview-0013a1bd",
"@metamask-previews/ens-controller": "16.0.0-preview-0013a1bd",
"@metamask-previews/error-reporting-service": "1.0.0-preview-0013a1bd",
"@metamask-previews/eth-json-rpc-provider": "4.1.8-preview-0013a1bd",
"@metamask-previews/foundryup": "1.0.0-preview-0013a1bd",
"@metamask-previews/gas-fee-controller": "23.0.0-preview-0013a1bd",
"@metamask-previews/json-rpc-engine": "10.0.3-preview-0013a1bd",
"@metamask-previews/json-rpc-middleware-stream": "8.0.7-preview-0013a1bd",
"@metamask-previews/keyring-controller": "22.0.2-preview-0013a1bd",
"@metamask-previews/logging-controller": "6.0.4-preview-0013a1bd",
"@metamask-previews/message-manager": "12.0.1-preview-0013a1bd",
"@metamask-previews/multichain-api-middleware": "0.4.0-preview-0013a1bd",
"@metamask-previews/multichain-network-controller": "0.8.0-preview-0013a1bd",
"@metamask-previews/multichain-transactions-controller": "2.0.0-preview-0013a1bd",
"@metamask-previews/name-controller": "8.0.3-preview-0013a1bd",
"@metamask-previews/network-controller": "23.6.0-preview-0013a1bd",
"@metamask-previews/notification-services-controller": "10.0.0-preview-0013a1bd",
"@metamask-previews/permission-controller": "11.0.6-preview-0013a1bd",
"@metamask-previews/permission-log-controller": "3.0.3-preview-0013a1bd",
"@metamask-previews/phishing-controller": "12.6.0-preview-0013a1bd",
"@metamask-previews/polling-controller": "13.0.0-preview-0013a1bd",
"@metamask-previews/preferences-controller": "18.1.0-preview-0013a1bd",
"@metamask-previews/profile-sync-controller": "17.1.0-preview-0013a1bd",
"@metamask-previews/queued-request-controller": "10.0.0-preview-0013a1bd",
"@metamask-previews/rate-limit-controller": "6.0.3-preview-0013a1bd",
"@metamask-previews/remote-feature-flag-controller": "1.6.0-preview-0013a1bd",
"@metamask-previews/sample-controllers": "0.1.0-preview-0013a1bd",
"@metamask-previews/seedless-onboarding-controller": "1.0.0-preview-0013a1bd",
"@metamask-previews/selected-network-controller": "22.1.0-preview-0013a1bd",
"@metamask-previews/signature-controller": "30.0.0-preview-0013a1bd",
"@metamask-previews/token-search-discovery-controller": "3.3.0-preview-0013a1bd",
"@metamask-previews/transaction-controller": "57.3.0-preview-0013a1bd",
"@metamask-previews/user-operation-controller": "36.0.0-preview-0013a1bd"
}