mainnet-js 4.0.0-next.11 → 4.0.0-next.13
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.
- package/dist/module/db/EncryptedStorageProvider.d.ts +137 -0
- package/dist/module/db/EncryptedStorageProvider.d.ts.map +1 -0
- package/dist/module/db/EncryptedStorageProvider.js +403 -0
- package/dist/module/db/EncryptedStorageProvider.js.map +1 -0
- package/dist/module/db/StorageProvider.d.ts +6 -0
- package/dist/module/db/StorageProvider.d.ts.map +1 -1
- package/dist/module/db/StorageProvider.js.map +1 -1
- package/dist/module/history/getHistory.js +1 -1
- package/dist/module/history/getHistory.js.map +1 -1
- package/dist/module/index.d.ts.map +1 -1
- package/dist/module/index.js +2 -0
- package/dist/module/index.js.map +1 -1
- package/dist/module/transaction/Wif.d.ts +11 -4
- package/dist/module/transaction/Wif.d.ts.map +1 -1
- package/dist/module/transaction/Wif.js +82 -35
- package/dist/module/transaction/Wif.js.map +1 -1
- package/dist/module/transaction/coin-control/fee.d.ts +32 -0
- package/dist/module/transaction/coin-control/fee.d.ts.map +1 -0
- package/dist/module/transaction/coin-control/fee.js +37 -0
- package/dist/module/transaction/coin-control/fee.js.map +1 -0
- package/dist/module/transaction/coin-control/index.d.ts +6 -0
- package/dist/module/transaction/coin-control/index.d.ts.map +1 -0
- package/dist/module/transaction/coin-control/index.js +5 -0
- package/dist/module/transaction/coin-control/index.js.map +1 -0
- package/dist/module/transaction/coin-control/input-order.d.ts +22 -0
- package/dist/module/transaction/coin-control/input-order.d.ts.map +1 -0
- package/dist/module/transaction/coin-control/input-order.js +54 -0
- package/dist/module/transaction/coin-control/input-order.js.map +1 -0
- package/dist/module/transaction/coin-control/output-order.d.ts +22 -0
- package/dist/module/transaction/coin-control/output-order.d.ts.map +1 -0
- package/dist/module/transaction/coin-control/output-order.js +77 -0
- package/dist/module/transaction/coin-control/output-order.js.map +1 -0
- package/dist/module/transaction/coin-control/selection.d.ts +54 -0
- package/dist/module/transaction/coin-control/selection.d.ts.map +1 -0
- package/dist/module/transaction/coin-control/selection.js +135 -0
- package/dist/module/transaction/coin-control/selection.js.map +1 -0
- package/dist/module/transaction/coin-control/types.d.ts +62 -0
- package/dist/module/transaction/coin-control/types.d.ts.map +1 -0
- package/dist/module/transaction/coin-control/types.js +2 -0
- package/dist/module/transaction/coin-control/types.js.map +1 -0
- package/dist/module/wallet/Base.d.ts.map +1 -1
- package/dist/module/wallet/Base.js +10 -2
- package/dist/module/wallet/Base.js.map +1 -1
- package/dist/module/wallet/interface.d.ts +9 -0
- package/dist/module/wallet/interface.d.ts.map +1 -1
- package/package.json +13 -3
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import type { WalletDbEntryI } from "./interface.js";
|
|
2
|
+
import type StorageProvider from "./StorageProvider.js";
|
|
3
|
+
/**
|
|
4
|
+
* Thrown by EncryptedStorageProvider when decryption fails -- either because
|
|
5
|
+
* the supplied passphrase is wrong, the ciphertext was tampered with, or the
|
|
6
|
+
* row was rebound to a different name (AAD mismatch).
|
|
7
|
+
*/
|
|
8
|
+
export declare class DecryptionError extends Error {
|
|
9
|
+
constructor(message?: string);
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* EncryptedStorageProvider wraps any StorageProvider and transparently
|
|
13
|
+
* encrypts the `wallet` field (the wallet ID / serialized seed) at rest.
|
|
14
|
+
*
|
|
15
|
+
* The `name` field is left in plaintext so existing lookup-by-name semantics
|
|
16
|
+
* are preserved.
|
|
17
|
+
*
|
|
18
|
+
* Salt, iteration count, and a passphrase verifier (HMAC-SHA256 over a fixed
|
|
19
|
+
* marker, keyed with PBKDF2-derived material) are persisted as a metadata row
|
|
20
|
+
* in the wrapped provider. `init()` verifies the passphrase against this row
|
|
21
|
+
* and fails fast with {@link DecryptionError} on mismatch.
|
|
22
|
+
*
|
|
23
|
+
* Backwards compatibility: plaintext wallet IDs already in the wrapped
|
|
24
|
+
* provider are returned as-is on read; subsequent writes are always encrypted.
|
|
25
|
+
*
|
|
26
|
+
* AAD binding: each row's ciphertext is authenticated against the row name,
|
|
27
|
+
* so renaming a wallet is not supported in-place -- the caller must read the
|
|
28
|
+
* plaintext, write under the new name, and remove the old row.
|
|
29
|
+
*/
|
|
30
|
+
export declare class EncryptedStorageProvider implements StorageProvider {
|
|
31
|
+
private wrapped;
|
|
32
|
+
private passphrase;
|
|
33
|
+
private iterations;
|
|
34
|
+
private keysPromise;
|
|
35
|
+
constructor(wrapped: StorageProvider, passphrase: string, options?: {
|
|
36
|
+
iterations?: number;
|
|
37
|
+
});
|
|
38
|
+
/**
|
|
39
|
+
* Build a single-arg `(dbName: string)` subclass suitable for assignment to
|
|
40
|
+
* `BaseWallet.StorageProvider`. The wrapped provider class and the passphrase
|
|
41
|
+
* are baked in; each `new Bound(dbName)` constructs a fresh wrapped provider
|
|
42
|
+
* with that dbName and wraps it.
|
|
43
|
+
*
|
|
44
|
+
* @example
|
|
45
|
+
* BaseWallet.StorageProvider = EncryptedStorageProvider.wrapProvider(
|
|
46
|
+
* IndexedDBProvider,
|
|
47
|
+
* userPassphrase,
|
|
48
|
+
* );
|
|
49
|
+
*/
|
|
50
|
+
static wrapProvider(wrappedProvider: new (dbName: string) => StorageProvider, passphrase: string, options?: {
|
|
51
|
+
iterations?: number;
|
|
52
|
+
}): new (dbName: string) => EncryptedStorageProvider;
|
|
53
|
+
private getKeys;
|
|
54
|
+
private readMeta;
|
|
55
|
+
private writeMeta;
|
|
56
|
+
init(): Promise<EncryptedStorageProvider>;
|
|
57
|
+
close(): Promise<EncryptedStorageProvider>;
|
|
58
|
+
getInfo(): string;
|
|
59
|
+
addWallet(name: string, walletId: string): Promise<boolean>;
|
|
60
|
+
getWallet(name: string): Promise<WalletDbEntryI | undefined>;
|
|
61
|
+
getWallets(): Promise<WalletDbEntryI[]>;
|
|
62
|
+
updateWallet(name: string, walletId: string): Promise<void>;
|
|
63
|
+
walletExists(name: string): Promise<boolean>;
|
|
64
|
+
deleteWallet(name: string): Promise<void>;
|
|
65
|
+
private decryptField;
|
|
66
|
+
/**
|
|
67
|
+
* Re-encrypt entries with a new passphrase. A fresh salt is generated, a new
|
|
68
|
+
* key is derived, the meta row is rewritten with a new verifier, and the
|
|
69
|
+
* wrapper switches to using the new passphrase for all subsequent reads and
|
|
70
|
+
* writes.
|
|
71
|
+
*
|
|
72
|
+
* By default every encrypted row that can be decrypted with the current
|
|
73
|
+
* passphrase is re-encrypted. Plaintext rows are left untouched. Rows that
|
|
74
|
+
* fail to decrypt are skipped and reported.
|
|
75
|
+
*
|
|
76
|
+
* When `options.names` is provided only those rows are re-encrypted. Any
|
|
77
|
+
* other encrypted rows will become unrecoverable, because after the change
|
|
78
|
+
* the old key is gone. Use this mode only when you knowingly want to drop
|
|
79
|
+
* unselected entries (e.g. after migrating them elsewhere).
|
|
80
|
+
*
|
|
81
|
+
* When `options.iterations` is provided the new key is derived with that
|
|
82
|
+
* iteration count; otherwise the wrapper's current iteration count is reused.
|
|
83
|
+
*
|
|
84
|
+
* @returns `rotated` -- names of rows that were re-encrypted; `skipped` --
|
|
85
|
+
* names that were left alone (plaintext, failed to decrypt, or filtered
|
|
86
|
+
* out by `options.names`).
|
|
87
|
+
*/
|
|
88
|
+
changePassphrase(newPassphrase: string, options?: {
|
|
89
|
+
names?: string[];
|
|
90
|
+
iterations?: number;
|
|
91
|
+
}): Promise<{
|
|
92
|
+
rotated: string[];
|
|
93
|
+
skipped: string[];
|
|
94
|
+
}>;
|
|
95
|
+
/**
|
|
96
|
+
* Encrypt every plaintext row in the store under the current passphrase.
|
|
97
|
+
* Used to migrate legacy (or back-compat-read) entries into the encrypted
|
|
98
|
+
* format -- for example, when a consumer enables encryption on a store that
|
|
99
|
+
* previously held plaintext wallets.
|
|
100
|
+
*
|
|
101
|
+
* Already-encrypted rows are left alone. With `options.names`, only the
|
|
102
|
+
* listed plaintext rows are encrypted; the rest are reported as skipped.
|
|
103
|
+
*
|
|
104
|
+
* @returns the names of rows that were encrypted and the names that were
|
|
105
|
+
* skipped (already encrypted, or filtered out).
|
|
106
|
+
*/
|
|
107
|
+
encryptPlaintextRows(options?: {
|
|
108
|
+
names?: string[];
|
|
109
|
+
}): Promise<{
|
|
110
|
+
encrypted: string[];
|
|
111
|
+
skipped: string[];
|
|
112
|
+
}>;
|
|
113
|
+
/**
|
|
114
|
+
* Decrypt every encrypted row back to plaintext on the wrapped provider and
|
|
115
|
+
* delete the metadata row. After this call the wrapped store is in the same
|
|
116
|
+
* shape it had before encryption was enabled.
|
|
117
|
+
*
|
|
118
|
+
* The wrapper itself is not decommissioned. A subsequent write through this
|
|
119
|
+
* instance (or a freshly constructed one with the same passphrase) will see
|
|
120
|
+
* an empty meta row, derive a new key, and re-establish encryption with a
|
|
121
|
+
* fresh salt. Discard the instance and stop wrapping the store if you want
|
|
122
|
+
* to keep it plaintext.
|
|
123
|
+
*
|
|
124
|
+
* Rows that cannot be decrypted (corrupted ciphertext, or encrypted under a
|
|
125
|
+
* different passphrase) are left in place and reported as skipped.
|
|
126
|
+
* Plaintext rows are also reported as skipped.
|
|
127
|
+
*
|
|
128
|
+
* @returns `decrypted` -- names of rows that were turned back into plaintext;
|
|
129
|
+
* `skipped` -- names that were left alone (plaintext, or failed to decrypt).
|
|
130
|
+
*/
|
|
131
|
+
removeEncryption(): Promise<{
|
|
132
|
+
decrypted: string[];
|
|
133
|
+
skipped: string[];
|
|
134
|
+
}>;
|
|
135
|
+
}
|
|
136
|
+
export default EncryptedStorageProvider;
|
|
137
|
+
//# sourceMappingURL=EncryptedStorageProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EncryptedStorageProvider.d.ts","sourceRoot":"","sources":["../../../src/db/EncryptedStorageProvider.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,KAAK,eAAe,MAAM,sBAAsB,CAAC;AAwBxD;;;;GAIG;AACH,qBAAa,eAAgB,SAAQ,KAAK;gBAEtC,OAAO,SAAiF;CAK3F;AA8FD;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,wBAAyB,YAAW,eAAe;IAC9D,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,WAAW,CAAqC;gBAGtD,OAAO,EAAE,eAAe,EACxB,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAA;KAAO;IAevC;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,YAAY,CACjB,eAAe,EAAE,KAAK,MAAM,EAAE,MAAM,KAAK,eAAe,EACxD,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,GAChC,KACD,MAAM,EAAE,MAAM,KACX,wBAAwB;YAQf,OAAO;YAwCP,QAAQ;YAqBR,SAAS;IASjB,IAAI,IAAI,OAAO,CAAC,wBAAwB,CAAC;IAMzC,KAAK,IAAI,OAAO,CAAC,wBAAwB,CAAC;IAMhD,OAAO,IAAI,MAAM;IAIX,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAW3D,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC;IAO5D,UAAU,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IAavC,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAW3D,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAK5C,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YASjC,YAAY;IAQ1B;;;;;;;;;;;;;;;;;;;;;OAqBG;IACG,gBAAgB,CACpB,aAAa,EAAE,MAAM,EACrB,OAAO,GAAE;QAAE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAO,GACtD,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAsDpD;;;;;;;;;;;OAWG;IACG,oBAAoB,CACxB,OAAO,GAAE;QAAE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;KAAO,GACjC,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,EAAE,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IA0BtD;;;;;;;;;;;;;;;;;OAiBG;IACG,gBAAgB,IAAI,OAAO,CAAC;QAChC,SAAS,EAAE,MAAM,EAAE,CAAC;QACpB,OAAO,EAAE,MAAM,EAAE,CAAC;KACnB,CAAC;CA6BH;AAED,eAAe,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,403 @@
|
|
|
1
|
+
import { base64ToBin, binToBase64, binToHex, binToUtf8, generateRandomBytes, hexToBin, hmacSha256, pbkdf2HmacSha512, utf8ToBin, } from "@bitauth/libauth";
|
|
2
|
+
const ENC_PREFIX = "enc:v1:";
|
|
3
|
+
const META_ROW_NAME = "__enc_meta_v1__";
|
|
4
|
+
const DEFAULT_ITERATIONS = 600_000;
|
|
5
|
+
const SALT_LENGTH = 16;
|
|
6
|
+
const KEY_LENGTH = 32;
|
|
7
|
+
const HMAC_KEY_LENGTH = 32;
|
|
8
|
+
const IV_LENGTH = 12;
|
|
9
|
+
const VERIFIER_INPUT = utf8ToBin("EncryptedStorageProvider-v1-verifier");
|
|
10
|
+
/**
|
|
11
|
+
* Thrown by EncryptedStorageProvider when decryption fails -- either because
|
|
12
|
+
* the supplied passphrase is wrong, the ciphertext was tampered with, or the
|
|
13
|
+
* row was rebound to a different name (AAD mismatch).
|
|
14
|
+
*/
|
|
15
|
+
export class DecryptionError extends Error {
|
|
16
|
+
constructor(message = "Decryption failed: wrong passphrase, wrong row name, or corrupted ciphertext") {
|
|
17
|
+
super(message);
|
|
18
|
+
this.name = "DecryptionError";
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function getSubtle() {
|
|
22
|
+
const subtle = globalThis.crypto?.subtle;
|
|
23
|
+
if (!subtle) {
|
|
24
|
+
throw new Error("WebCrypto SubtleCrypto is not available. EncryptedStorageProvider requires Node 19+ or a browser secure context.");
|
|
25
|
+
}
|
|
26
|
+
return subtle;
|
|
27
|
+
}
|
|
28
|
+
async function deriveKeys(passphrase, salt, iterations) {
|
|
29
|
+
// Derive AES_KEY || HMAC_KEY from one PBKDF2 pass.
|
|
30
|
+
const result = pbkdf2HmacSha512({
|
|
31
|
+
password: utf8ToBin(passphrase),
|
|
32
|
+
salt,
|
|
33
|
+
iterations,
|
|
34
|
+
derivedKeyLength: KEY_LENGTH + HMAC_KEY_LENGTH,
|
|
35
|
+
});
|
|
36
|
+
if (typeof result === "string") {
|
|
37
|
+
throw new Error(`PBKDF2 derivation failed: ${result}`);
|
|
38
|
+
}
|
|
39
|
+
const buf = result;
|
|
40
|
+
const aesKey = await getSubtle().importKey("raw", buf.slice(0, KEY_LENGTH), { name: "AES-GCM" }, false, ["encrypt", "decrypt"]);
|
|
41
|
+
const hmacKey = buf.slice(KEY_LENGTH);
|
|
42
|
+
return { aesKey, hmacKey };
|
|
43
|
+
}
|
|
44
|
+
function computeVerifier(hmacKey) {
|
|
45
|
+
return binToHex(hmacSha256(hmacKey, VERIFIER_INPUT));
|
|
46
|
+
}
|
|
47
|
+
async function encryptString(key, plaintext, aad) {
|
|
48
|
+
const iv = generateRandomBytes(IV_LENGTH);
|
|
49
|
+
const ct = new Uint8Array(await getSubtle().encrypt({
|
|
50
|
+
name: "AES-GCM",
|
|
51
|
+
iv: iv,
|
|
52
|
+
additionalData: utf8ToBin(aad),
|
|
53
|
+
}, key, utf8ToBin(plaintext)));
|
|
54
|
+
return `${ENC_PREFIX}${binToBase64(iv)}:${binToBase64(ct)}`;
|
|
55
|
+
}
|
|
56
|
+
// Precondition: payload starts with ENC_PREFIX. Internal callers gate on that
|
|
57
|
+
// via the same constant before delegating here.
|
|
58
|
+
async function decryptString(key, payload, aad) {
|
|
59
|
+
const body = payload.slice(ENC_PREFIX.length);
|
|
60
|
+
const sep = body.indexOf(":");
|
|
61
|
+
if (sep <= 0 || sep >= body.length - 1) {
|
|
62
|
+
throw new Error("Malformed encrypted payload");
|
|
63
|
+
}
|
|
64
|
+
const iv = base64ToBin(body.slice(0, sep));
|
|
65
|
+
const ct = base64ToBin(body.slice(sep + 1));
|
|
66
|
+
let pt;
|
|
67
|
+
try {
|
|
68
|
+
pt = await getSubtle().decrypt({
|
|
69
|
+
name: "AES-GCM",
|
|
70
|
+
iv: iv,
|
|
71
|
+
additionalData: utf8ToBin(aad),
|
|
72
|
+
}, key, ct);
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
throw new DecryptionError();
|
|
76
|
+
}
|
|
77
|
+
return binToUtf8(new Uint8Array(pt));
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* EncryptedStorageProvider wraps any StorageProvider and transparently
|
|
81
|
+
* encrypts the `wallet` field (the wallet ID / serialized seed) at rest.
|
|
82
|
+
*
|
|
83
|
+
* The `name` field is left in plaintext so existing lookup-by-name semantics
|
|
84
|
+
* are preserved.
|
|
85
|
+
*
|
|
86
|
+
* Salt, iteration count, and a passphrase verifier (HMAC-SHA256 over a fixed
|
|
87
|
+
* marker, keyed with PBKDF2-derived material) are persisted as a metadata row
|
|
88
|
+
* in the wrapped provider. `init()` verifies the passphrase against this row
|
|
89
|
+
* and fails fast with {@link DecryptionError} on mismatch.
|
|
90
|
+
*
|
|
91
|
+
* Backwards compatibility: plaintext wallet IDs already in the wrapped
|
|
92
|
+
* provider are returned as-is on read; subsequent writes are always encrypted.
|
|
93
|
+
*
|
|
94
|
+
* AAD binding: each row's ciphertext is authenticated against the row name,
|
|
95
|
+
* so renaming a wallet is not supported in-place -- the caller must read the
|
|
96
|
+
* plaintext, write under the new name, and remove the old row.
|
|
97
|
+
*/
|
|
98
|
+
export class EncryptedStorageProvider {
|
|
99
|
+
constructor(wrapped, passphrase, options = {}) {
|
|
100
|
+
this.keysPromise = null;
|
|
101
|
+
if (!wrapped) {
|
|
102
|
+
throw new Error("EncryptedStorageProvider requires a wrapped provider");
|
|
103
|
+
}
|
|
104
|
+
if (!passphrase) {
|
|
105
|
+
throw new Error("EncryptedStorageProvider requires a non-empty passphrase");
|
|
106
|
+
}
|
|
107
|
+
this.wrapped = wrapped;
|
|
108
|
+
this.passphrase = passphrase;
|
|
109
|
+
this.iterations = options.iterations ?? DEFAULT_ITERATIONS;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Build a single-arg `(dbName: string)` subclass suitable for assignment to
|
|
113
|
+
* `BaseWallet.StorageProvider`. The wrapped provider class and the passphrase
|
|
114
|
+
* are baked in; each `new Bound(dbName)` constructs a fresh wrapped provider
|
|
115
|
+
* with that dbName and wraps it.
|
|
116
|
+
*
|
|
117
|
+
* @example
|
|
118
|
+
* BaseWallet.StorageProvider = EncryptedStorageProvider.wrapProvider(
|
|
119
|
+
* IndexedDBProvider,
|
|
120
|
+
* userPassphrase,
|
|
121
|
+
* );
|
|
122
|
+
*/
|
|
123
|
+
static wrapProvider(wrappedProvider, passphrase, options) {
|
|
124
|
+
return class BoundEncryptedStorageProvider extends EncryptedStorageProvider {
|
|
125
|
+
constructor(dbName) {
|
|
126
|
+
super(new wrappedProvider(dbName), passphrase, options);
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
async getKeys() {
|
|
131
|
+
if (this.keysPromise)
|
|
132
|
+
return this.keysPromise;
|
|
133
|
+
this.keysPromise = (async () => {
|
|
134
|
+
const meta = await this.readMeta();
|
|
135
|
+
if (!meta) {
|
|
136
|
+
// Fresh store: derive keys, stamp meta with a verifier, persist it.
|
|
137
|
+
const saltHex = binToHex(generateRandomBytes(SALT_LENGTH));
|
|
138
|
+
const keys = await deriveKeys(this.passphrase, hexToBin(saltHex), this.iterations);
|
|
139
|
+
await this.writeMeta({
|
|
140
|
+
saltHex,
|
|
141
|
+
iterations: this.iterations,
|
|
142
|
+
verifier: computeVerifier(keys.hmacKey),
|
|
143
|
+
});
|
|
144
|
+
return keys;
|
|
145
|
+
}
|
|
146
|
+
const keys = await deriveKeys(this.passphrase, hexToBin(meta.saltHex), meta.iterations);
|
|
147
|
+
if (meta.verifier !== computeVerifier(keys.hmacKey)) {
|
|
148
|
+
throw new DecryptionError("Decryption failed: wrong passphrase for encrypted store");
|
|
149
|
+
}
|
|
150
|
+
return keys;
|
|
151
|
+
})();
|
|
152
|
+
return this.keysPromise.catch((err) => {
|
|
153
|
+
// Don't cache the rejection -- a follow-up call with a corrected
|
|
154
|
+
// passphrase (or a stale-state retry) should be allowed to re-derive.
|
|
155
|
+
this.keysPromise = null;
|
|
156
|
+
throw err;
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
async readMeta() {
|
|
160
|
+
const row = await this.wrapped.getWallet(META_ROW_NAME);
|
|
161
|
+
if (!row)
|
|
162
|
+
return undefined;
|
|
163
|
+
let parsed;
|
|
164
|
+
try {
|
|
165
|
+
parsed = JSON.parse(row.wallet);
|
|
166
|
+
}
|
|
167
|
+
catch {
|
|
168
|
+
throw new Error("Encrypted store metadata is corrupted");
|
|
169
|
+
}
|
|
170
|
+
if (typeof parsed.saltHex !== "string" ||
|
|
171
|
+
typeof parsed.iterations !== "number" ||
|
|
172
|
+
typeof parsed.verifier !== "string") {
|
|
173
|
+
throw new Error("Encrypted store metadata is missing required fields (saltHex, iterations, verifier)");
|
|
174
|
+
}
|
|
175
|
+
return parsed;
|
|
176
|
+
}
|
|
177
|
+
async writeMeta(meta) {
|
|
178
|
+
const serialized = JSON.stringify(meta);
|
|
179
|
+
if (await this.wrapped.walletExists(META_ROW_NAME)) {
|
|
180
|
+
await this.wrapped.updateWallet(META_ROW_NAME, serialized);
|
|
181
|
+
}
|
|
182
|
+
else {
|
|
183
|
+
await this.wrapped.addWallet(META_ROW_NAME, serialized);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
async init() {
|
|
187
|
+
await this.wrapped.init();
|
|
188
|
+
await this.getKeys();
|
|
189
|
+
return this;
|
|
190
|
+
}
|
|
191
|
+
async close() {
|
|
192
|
+
await this.wrapped.close();
|
|
193
|
+
this.keysPromise = null;
|
|
194
|
+
return this;
|
|
195
|
+
}
|
|
196
|
+
getInfo() {
|
|
197
|
+
return `encrypted(${this.wrapped.getInfo()})`;
|
|
198
|
+
}
|
|
199
|
+
async addWallet(name, walletId) {
|
|
200
|
+
if (name === META_ROW_NAME) {
|
|
201
|
+
throw new Error(`Wallet name "${META_ROW_NAME}" is reserved by EncryptedStorageProvider`);
|
|
202
|
+
}
|
|
203
|
+
const { aesKey } = await this.getKeys();
|
|
204
|
+
const ciphertext = await encryptString(aesKey, walletId, name);
|
|
205
|
+
return this.wrapped.addWallet(name, ciphertext);
|
|
206
|
+
}
|
|
207
|
+
async getWallet(name) {
|
|
208
|
+
if (name === META_ROW_NAME)
|
|
209
|
+
return undefined;
|
|
210
|
+
const row = await this.wrapped.getWallet(name);
|
|
211
|
+
if (!row)
|
|
212
|
+
return undefined;
|
|
213
|
+
return { ...row, wallet: await this.decryptField(row.wallet, name) };
|
|
214
|
+
}
|
|
215
|
+
async getWallets() {
|
|
216
|
+
const rows = await this.wrapped.getWallets();
|
|
217
|
+
const result = [];
|
|
218
|
+
for (const row of rows) {
|
|
219
|
+
if (row.name === META_ROW_NAME)
|
|
220
|
+
continue;
|
|
221
|
+
result.push({
|
|
222
|
+
...row,
|
|
223
|
+
wallet: await this.decryptField(row.wallet, row.name),
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
return result;
|
|
227
|
+
}
|
|
228
|
+
async updateWallet(name, walletId) {
|
|
229
|
+
if (name === META_ROW_NAME) {
|
|
230
|
+
throw new Error(`Wallet name "${META_ROW_NAME}" is reserved by EncryptedStorageProvider`);
|
|
231
|
+
}
|
|
232
|
+
const { aesKey } = await this.getKeys();
|
|
233
|
+
const ciphertext = await encryptString(aesKey, walletId, name);
|
|
234
|
+
await this.wrapped.updateWallet(name, ciphertext);
|
|
235
|
+
}
|
|
236
|
+
async walletExists(name) {
|
|
237
|
+
if (name === META_ROW_NAME)
|
|
238
|
+
return false;
|
|
239
|
+
return this.wrapped.walletExists(name);
|
|
240
|
+
}
|
|
241
|
+
async deleteWallet(name) {
|
|
242
|
+
if (name === META_ROW_NAME) {
|
|
243
|
+
throw new Error(`Wallet name "${META_ROW_NAME}" is reserved by EncryptedStorageProvider`);
|
|
244
|
+
}
|
|
245
|
+
await this.wrapped.deleteWallet(name);
|
|
246
|
+
}
|
|
247
|
+
async decryptField(payload, name) {
|
|
248
|
+
if (!payload.startsWith(ENC_PREFIX)) {
|
|
249
|
+
return payload;
|
|
250
|
+
}
|
|
251
|
+
const { aesKey } = await this.getKeys();
|
|
252
|
+
return decryptString(aesKey, payload, name);
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Re-encrypt entries with a new passphrase. A fresh salt is generated, a new
|
|
256
|
+
* key is derived, the meta row is rewritten with a new verifier, and the
|
|
257
|
+
* wrapper switches to using the new passphrase for all subsequent reads and
|
|
258
|
+
* writes.
|
|
259
|
+
*
|
|
260
|
+
* By default every encrypted row that can be decrypted with the current
|
|
261
|
+
* passphrase is re-encrypted. Plaintext rows are left untouched. Rows that
|
|
262
|
+
* fail to decrypt are skipped and reported.
|
|
263
|
+
*
|
|
264
|
+
* When `options.names` is provided only those rows are re-encrypted. Any
|
|
265
|
+
* other encrypted rows will become unrecoverable, because after the change
|
|
266
|
+
* the old key is gone. Use this mode only when you knowingly want to drop
|
|
267
|
+
* unselected entries (e.g. after migrating them elsewhere).
|
|
268
|
+
*
|
|
269
|
+
* When `options.iterations` is provided the new key is derived with that
|
|
270
|
+
* iteration count; otherwise the wrapper's current iteration count is reused.
|
|
271
|
+
*
|
|
272
|
+
* @returns `rotated` -- names of rows that were re-encrypted; `skipped` --
|
|
273
|
+
* names that were left alone (plaintext, failed to decrypt, or filtered
|
|
274
|
+
* out by `options.names`).
|
|
275
|
+
*/
|
|
276
|
+
async changePassphrase(newPassphrase, options = {}) {
|
|
277
|
+
if (!newPassphrase) {
|
|
278
|
+
throw new Error("changePassphrase requires a non-empty passphrase");
|
|
279
|
+
}
|
|
280
|
+
const oldKeys = await this.getKeys();
|
|
281
|
+
const newIterations = options.iterations ?? this.iterations;
|
|
282
|
+
const newSalt = generateRandomBytes(SALT_LENGTH);
|
|
283
|
+
const newKeys = await deriveKeys(newPassphrase, newSalt, newIterations);
|
|
284
|
+
const allRows = await this.wrapped.getWallets();
|
|
285
|
+
const filter = options.names ? new Set(options.names) : null;
|
|
286
|
+
const rotated = [];
|
|
287
|
+
const skipped = [];
|
|
288
|
+
for (const row of allRows) {
|
|
289
|
+
if (row.name === META_ROW_NAME)
|
|
290
|
+
continue;
|
|
291
|
+
if (filter && !filter.has(row.name)) {
|
|
292
|
+
skipped.push(row.name);
|
|
293
|
+
continue;
|
|
294
|
+
}
|
|
295
|
+
if (!row.wallet.startsWith(ENC_PREFIX)) {
|
|
296
|
+
skipped.push(row.name);
|
|
297
|
+
continue;
|
|
298
|
+
}
|
|
299
|
+
let plaintext;
|
|
300
|
+
try {
|
|
301
|
+
plaintext = await decryptString(oldKeys.aesKey, row.wallet, row.name);
|
|
302
|
+
}
|
|
303
|
+
catch {
|
|
304
|
+
skipped.push(row.name);
|
|
305
|
+
continue;
|
|
306
|
+
}
|
|
307
|
+
const ciphertext = await encryptString(newKeys.aesKey, plaintext, row.name);
|
|
308
|
+
await this.wrapped.updateWallet(row.name, ciphertext);
|
|
309
|
+
rotated.push(row.name);
|
|
310
|
+
}
|
|
311
|
+
await this.writeMeta({
|
|
312
|
+
saltHex: binToHex(newSalt),
|
|
313
|
+
iterations: newIterations,
|
|
314
|
+
verifier: computeVerifier(newKeys.hmacKey),
|
|
315
|
+
});
|
|
316
|
+
this.passphrase = newPassphrase;
|
|
317
|
+
this.iterations = newIterations;
|
|
318
|
+
this.keysPromise = Promise.resolve(newKeys);
|
|
319
|
+
return { rotated, skipped };
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Encrypt every plaintext row in the store under the current passphrase.
|
|
323
|
+
* Used to migrate legacy (or back-compat-read) entries into the encrypted
|
|
324
|
+
* format -- for example, when a consumer enables encryption on a store that
|
|
325
|
+
* previously held plaintext wallets.
|
|
326
|
+
*
|
|
327
|
+
* Already-encrypted rows are left alone. With `options.names`, only the
|
|
328
|
+
* listed plaintext rows are encrypted; the rest are reported as skipped.
|
|
329
|
+
*
|
|
330
|
+
* @returns the names of rows that were encrypted and the names that were
|
|
331
|
+
* skipped (already encrypted, or filtered out).
|
|
332
|
+
*/
|
|
333
|
+
async encryptPlaintextRows(options = {}) {
|
|
334
|
+
const { aesKey } = await this.getKeys();
|
|
335
|
+
const allRows = await this.wrapped.getWallets();
|
|
336
|
+
const filter = options.names ? new Set(options.names) : null;
|
|
337
|
+
const encrypted = [];
|
|
338
|
+
const skipped = [];
|
|
339
|
+
for (const row of allRows) {
|
|
340
|
+
if (row.name === META_ROW_NAME)
|
|
341
|
+
continue;
|
|
342
|
+
if (filter && !filter.has(row.name)) {
|
|
343
|
+
skipped.push(row.name);
|
|
344
|
+
continue;
|
|
345
|
+
}
|
|
346
|
+
if (row.wallet.startsWith(ENC_PREFIX)) {
|
|
347
|
+
skipped.push(row.name);
|
|
348
|
+
continue;
|
|
349
|
+
}
|
|
350
|
+
const ciphertext = await encryptString(aesKey, row.wallet, row.name);
|
|
351
|
+
await this.wrapped.updateWallet(row.name, ciphertext);
|
|
352
|
+
encrypted.push(row.name);
|
|
353
|
+
}
|
|
354
|
+
return { encrypted, skipped };
|
|
355
|
+
}
|
|
356
|
+
/**
|
|
357
|
+
* Decrypt every encrypted row back to plaintext on the wrapped provider and
|
|
358
|
+
* delete the metadata row. After this call the wrapped store is in the same
|
|
359
|
+
* shape it had before encryption was enabled.
|
|
360
|
+
*
|
|
361
|
+
* The wrapper itself is not decommissioned. A subsequent write through this
|
|
362
|
+
* instance (or a freshly constructed one with the same passphrase) will see
|
|
363
|
+
* an empty meta row, derive a new key, and re-establish encryption with a
|
|
364
|
+
* fresh salt. Discard the instance and stop wrapping the store if you want
|
|
365
|
+
* to keep it plaintext.
|
|
366
|
+
*
|
|
367
|
+
* Rows that cannot be decrypted (corrupted ciphertext, or encrypted under a
|
|
368
|
+
* different passphrase) are left in place and reported as skipped.
|
|
369
|
+
* Plaintext rows are also reported as skipped.
|
|
370
|
+
*
|
|
371
|
+
* @returns `decrypted` -- names of rows that were turned back into plaintext;
|
|
372
|
+
* `skipped` -- names that were left alone (plaintext, or failed to decrypt).
|
|
373
|
+
*/
|
|
374
|
+
async removeEncryption() {
|
|
375
|
+
const { aesKey } = await this.getKeys();
|
|
376
|
+
const allRows = await this.wrapped.getWallets();
|
|
377
|
+
const decrypted = [];
|
|
378
|
+
const skipped = [];
|
|
379
|
+
for (const row of allRows) {
|
|
380
|
+
if (row.name === META_ROW_NAME)
|
|
381
|
+
continue;
|
|
382
|
+
if (!row.wallet.startsWith(ENC_PREFIX)) {
|
|
383
|
+
skipped.push(row.name);
|
|
384
|
+
continue;
|
|
385
|
+
}
|
|
386
|
+
let plaintext;
|
|
387
|
+
try {
|
|
388
|
+
plaintext = await decryptString(aesKey, row.wallet, row.name);
|
|
389
|
+
}
|
|
390
|
+
catch {
|
|
391
|
+
skipped.push(row.name);
|
|
392
|
+
continue;
|
|
393
|
+
}
|
|
394
|
+
await this.wrapped.updateWallet(row.name, plaintext);
|
|
395
|
+
decrypted.push(row.name);
|
|
396
|
+
}
|
|
397
|
+
await this.wrapped.deleteWallet(META_ROW_NAME);
|
|
398
|
+
this.keysPromise = null;
|
|
399
|
+
return { decrypted, skipped };
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
export default EncryptedStorageProvider;
|
|
403
|
+
//# sourceMappingURL=EncryptedStorageProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EncryptedStorageProvider.js","sourceRoot":"","sources":["../../../src/db/EncryptedStorageProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -50,5 +50,11 @@ export default abstract class StorageProvider {
|
|
|
50
50
|
* @param name A user defined name for the wallet, and the walletId.
|
|
51
51
|
*/
|
|
52
52
|
abstract walletExists(name: string): Promise<boolean>;
|
|
53
|
+
/**
|
|
54
|
+
* Delete a named wallet from the database. No-op if the row does not exist.
|
|
55
|
+
* @param name The user-defined name of the wallet to remove.
|
|
56
|
+
* @throws {Error} If the deletion fails for reasons other than absence.
|
|
57
|
+
*/
|
|
58
|
+
abstract deleteWallet(name: string): Promise<void>;
|
|
53
59
|
}
|
|
54
60
|
//# sourceMappingURL=StorageProvider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StorageProvider.d.ts","sourceRoot":"","sources":["../../../src/db/StorageProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhD,MAAM,CAAC,OAAO,CAAC,QAAQ,OAAO,eAAe;gBACxB,GAAG,IAAI,EAAE,GAAG,EAAE;IAIjC;;;;OAIG;IACH,QAAQ,CAAC,IAAI,IAAI,OAAO,CAAC,eAAe,CAAC;IAEzC;;;;OAIG;IACH,QAAQ,CAAC,KAAK,IAAI,OAAO,CAAC,eAAe,CAAC;IAE1C;;;;OAIG;IACH,QAAQ,CAAC,OAAO,IAAI,MAAM;IAE1B;;;;;;OAMG;IACH,QAAQ,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAEpE;;OAEG;IACH,QAAQ,CAAC,UAAU,IAAI,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IAErD;;;;;OAKG;IACH,QAAQ,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC;IAErE;;;;;OAKG;IACH,QAAQ,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAEpE;;;OAGG;IACH,QAAQ,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"StorageProvider.d.ts","sourceRoot":"","sources":["../../../src/db/StorageProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhD,MAAM,CAAC,OAAO,CAAC,QAAQ,OAAO,eAAe;gBACxB,GAAG,IAAI,EAAE,GAAG,EAAE;IAIjC;;;;OAIG;IACH,QAAQ,CAAC,IAAI,IAAI,OAAO,CAAC,eAAe,CAAC;IAEzC;;;;OAIG;IACH,QAAQ,CAAC,KAAK,IAAI,OAAO,CAAC,eAAe,CAAC;IAE1C;;;;OAIG;IACH,QAAQ,CAAC,OAAO,IAAI,MAAM;IAE1B;;;;;;OAMG;IACH,QAAQ,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAEpE;;OAEG;IACH,QAAQ,CAAC,UAAU,IAAI,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IAErD;;;;;OAKG;IACH,QAAQ,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC;IAErE;;;;;OAKG;IACH,QAAQ,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAEpE;;;OAGG;IACH,QAAQ,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAErD;;;;OAIG;IACH,QAAQ,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CACnD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StorageProvider.js","sourceRoot":"","sources":["../../../src/db/StorageProvider.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,OAAO,OAAgB,eAAe;IAC3C,YAAmB,GAAG,IAAW;QAC/B,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;IAC5E,CAAC;
|
|
1
|
+
{"version":3,"file":"StorageProvider.js","sourceRoot":"","sources":["../../../src/db/StorageProvider.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,OAAO,OAAgB,eAAe;IAC3C,YAAmB,GAAG,IAAW;QAC/B,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;IAC5E,CAAC;CAiEF"}
|
|
@@ -16,7 +16,7 @@ export const getHistory = async ({ addresses, provider, unit = "sat", fromHeight
|
|
|
16
16
|
}
|
|
17
17
|
else {
|
|
18
18
|
const allHistory = (await Promise.all(addresses.map(async (address) => provider.getHistory(address, fromHeight, toHeight)))).flat();
|
|
19
|
-
// Dedup using Set instead of O(N
|
|
19
|
+
// Dedup using Set instead of O(N^2) findIndex
|
|
20
20
|
const seen = new Set();
|
|
21
21
|
const deduped = [];
|
|
22
22
|
for (const item of allHistory) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getHistory.js","sourceRoot":"","sources":["../../../src/history/getHistory.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"getHistory.js","sourceRoot":"","sources":["../../../src/history/getHistory.ts"],"names":[],"mappings":"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"}
|