import { _sign } from './sign'\r
import { _unlock } from './unlock'\r
import { _unopened } from './unopened'\r
+import { _update } from './update'\r
import { _verify } from './verify'\r
\r
/**\r
return await _unopened(this, rpc, batchSize, from)\r
}\r
\r
+ /**\r
+ * Updates the password used to encrypt the wallet. The wallet must be unlocked\r
+ * prior to update.\r
+ *\r
+ * @param {string} password Used to re-encrypt the wallet\r
+ */\r
+ async update (password: string): Promise<void> {\r
+ await _update(this, this.#vault, password)\r
+ }\r
+\r
/**\r
* Checks whether a given seed matches the wallet seed. The wallet must be\r
* unlocked prior to verification.\r
--- /dev/null
+//! SPDX-FileCopyrightText: 2025 Chris Duncan <chris@zoso.dev>
+//! SPDX-License-Identifier: GPL-3.0-or-later
+
+import { NamedData } from '#types'
+import { utf8 } from '../convert'
+import { Database } from '../database'
+import { Vault } from '../vault'
+import { Wallet } from '../wallet'
+import { _get } from './get'
+
+export async function _update (wallet: Wallet, vault: Vault, password?: string): Promise<void>
+export async function _update (wallet: Wallet, vault: Vault, password: unknown): Promise<void> {
+ try {
+ const record: NamedData = {
+ id: wallet.id,
+ type: wallet.type
+ }
+ if (wallet.type === 'Ledger') {
+ return
+ } else {
+ if (typeof password !== 'string') {
+ throw new TypeError('Password must be a string')
+ }
+ const { encrypted } = await _get(wallet.id)
+ const response = await vault.request<ArrayBuffer>({
+ action: 'update',
+ type: wallet.type,
+ password: utf8.toBuffer(password),
+ encrypted
+ })
+ password = undefined
+ record.iv = response.iv
+ record.salt = response.salt
+ record.encrypted = response.encrypted
+ }
+ await Database.put({ [wallet.id]: record }, Wallet.DB_NAME)
+ } catch (err) {
+ throw new Error('Failed to unlock wallet', { cause: err })
+ }
+}
*/
unopened (rpc: Rpc, batchSize?: number, from?: number): Promise<Account>
/**
+ * Updates the password used to encrypt the wallet. The wallet must be unlocked
+ * prior to update.
+ *
+ * @param {string} password Used to re-encrypt the wallet
+ */
+ update (password: string): Promise<void>
+ /**
* Checks whether a given seed matches the wallet seed. The wallet must be
* unlocked prior to verification.
*
await assert.resolves(wallet.destroy())\r
})\r
\r
+ await test('change the password on a BIP-44 wallet', async () => {\r
+ const wallet = await Wallet.load('BIP-44', '', NANO_TEST_VECTORS.MNEMONIC, NANO_TEST_VECTORS.PASSWORD)\r
+ await wallet.unlock('')\r
+\r
+ assert.ok('mnemonic' in wallet)\r
+ assert.ok('seed' in wallet)\r
+ assert.ok(wallet.mnemonic === undefined)\r
+ assert.ok(wallet.seed === undefined)\r
+ assert.ok(await wallet.verify(NANO_TEST_VECTORS.MNEMONIC))\r
+ assert.ok(await wallet.verify(NANO_TEST_VECTORS.BIP39_SEED))\r
+\r
+ await wallet.update(NANO_TEST_VECTORS.PASSWORD)\r
+ wallet.lock()\r
+ await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
+\r
+ assert.ok('mnemonic' in wallet)\r
+ assert.ok('seed' in wallet)\r
+ assert.ok(wallet.mnemonic === undefined)\r
+ assert.ok(wallet.seed === undefined)\r
+ assert.ok(await wallet.verify(NANO_TEST_VECTORS.MNEMONIC))\r
+ assert.ok(await wallet.verify(NANO_TEST_VECTORS.BIP39_SEED))\r
+\r
+ await assert.resolves(wallet.destroy())\r
+ })\r
+\r
await test('fail to unlock a Bip44Wallet with different passwords', async () => {\r
const wallet = await Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, NANO_TEST_VECTORS.MNEMONIC, NANO_TEST_VECTORS.PASSWORD)\r
await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
const wallet = await Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, NANO_TEST_VECTORS.MNEMONIC, NANO_TEST_VECTORS.PASSWORD)\r
await wallet.unlock(NANO_TEST_VECTORS.PASSWORD)\r
\r
- //@ts-expect-error\r
await assert.rejects(wallet.unlock(), { message: 'Failed to unlock wallet' })\r
//@ts-expect-error\r
await assert.rejects(wallet.unlock(1), { message: 'Failed to unlock wallet' })\r
await test('fail to unlock a Blake2bWallet with no input', async () => {\r
const wallet = await Wallet.load('BLAKE2b', NANO_TEST_VECTORS.PASSWORD, TREZOR_TEST_VECTORS.ENTROPY_1)\r
\r
- //@ts-expect-error\r
await assert.rejects(wallet.unlock(), { message: 'Failed to unlock wallet' })\r
//@ts-expect-error\r
await assert.rejects(wallet.unlock(1), { message: 'Failed to unlock wallet' })\r