@123456btc/123456btc-cli 1.0.1 → 1.0.2
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/api/client.d.ts +4 -0
- package/dist/api/client.d.ts.map +1 -1
- package/dist/api/client.js +74 -16
- package/dist/api/client.js.map +1 -1
- package/dist/api/provider.d.ts +163 -0
- package/dist/api/provider.d.ts.map +1 -0
- package/dist/api/provider.js +123 -0
- package/dist/api/provider.js.map +1 -0
- package/dist/api/signal-crypto.d.ts +17 -0
- package/dist/api/signal-crypto.d.ts.map +1 -0
- package/dist/api/signal-crypto.js +48 -0
- package/dist/api/signal-crypto.js.map +1 -0
- package/dist/api/signals.d.ts +47 -0
- package/dist/api/signals.d.ts.map +1 -0
- package/dist/api/signals.js +34 -0
- package/dist/api/signals.js.map +1 -0
- package/dist/api/strategy-stream.d.ts +59 -0
- package/dist/api/strategy-stream.d.ts.map +1 -0
- package/dist/api/strategy-stream.js +136 -0
- package/dist/api/strategy-stream.js.map +1 -0
- package/dist/api/strategy.d.ts +66 -20
- package/dist/api/strategy.d.ts.map +1 -1
- package/dist/api/strategy.js +15 -18
- package/dist/api/strategy.js.map +1 -1
- package/dist/api/token-manager.d.ts +37 -0
- package/dist/api/token-manager.d.ts.map +1 -0
- package/dist/api/token-manager.js +191 -0
- package/dist/api/token-manager.js.map +1 -0
- package/dist/api/wallet.d.ts +38 -0
- package/dist/api/wallet.d.ts.map +1 -0
- package/dist/api/wallet.js +23 -0
- package/dist/api/wallet.js.map +1 -0
- package/dist/cli.js +12 -2
- package/dist/cli.js.map +1 -1
- package/dist/commands/auth.d.ts.map +1 -1
- package/dist/commands/auth.js +149 -3
- package/dist/commands/auth.js.map +1 -1
- package/dist/commands/health.d.ts +3 -0
- package/dist/commands/health.d.ts.map +1 -0
- package/dist/commands/health.js +77 -0
- package/dist/commands/health.js.map +1 -0
- package/dist/commands/install.d.ts.map +1 -1
- package/dist/commands/install.js +127 -24
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/provider.d.ts +3 -0
- package/dist/commands/provider.d.ts.map +1 -0
- package/dist/commands/provider.js +371 -0
- package/dist/commands/provider.js.map +1 -0
- package/dist/commands/signals.d.ts +3 -0
- package/dist/commands/signals.d.ts.map +1 -0
- package/dist/commands/signals.js +104 -0
- package/dist/commands/signals.js.map +1 -0
- package/dist/commands/strategy.d.ts.map +1 -1
- package/dist/commands/strategy.js +147 -59
- package/dist/commands/strategy.js.map +1 -1
- package/dist/commands/tier.d.ts +3 -0
- package/dist/commands/tier.d.ts.map +1 -0
- package/dist/commands/tier.js +105 -0
- package/dist/commands/tier.js.map +1 -0
- package/dist/commands/vault.d.ts +7 -0
- package/dist/commands/vault.d.ts.map +1 -0
- package/dist/commands/vault.js +377 -0
- package/dist/commands/vault.js.map +1 -0
- package/dist/commands/wallet.d.ts +3 -0
- package/dist/commands/wallet.d.ts.map +1 -0
- package/dist/commands/wallet.js +74 -0
- package/dist/commands/wallet.js.map +1 -0
- package/dist/config.d.ts +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +16 -2
- package/dist/config.js.map +1 -1
- package/dist/index.d.ts +12 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +22 -6
- package/dist/index.js.map +1 -1
- package/dist/providers/executor.d.ts +55 -20
- package/dist/providers/executor.d.ts.map +1 -1
- package/dist/providers/executor.js +260 -58
- package/dist/providers/executor.js.map +1 -1
- package/dist/providers/risk.d.ts +17 -0
- package/dist/providers/risk.d.ts.map +1 -0
- package/dist/providers/risk.js +67 -0
- package/dist/providers/risk.js.map +1 -0
- package/dist/providers/state.d.ts +30 -0
- package/dist/providers/state.d.ts.map +1 -0
- package/dist/providers/state.js +190 -0
- package/dist/providers/state.js.map +1 -0
- package/dist/types/strategy.d.ts +65 -1
- package/dist/types/strategy.d.ts.map +1 -1
- package/dist/types/strategy.js +1 -0
- package/dist/types/strategy.js.map +1 -1
- package/dist/utils/auth.d.ts +1 -0
- package/dist/utils/auth.d.ts.map +1 -1
- package/dist/utils/device.d.ts +13 -0
- package/dist/utils/device.d.ts.map +1 -0
- package/dist/utils/device.js +104 -0
- package/dist/utils/device.js.map +1 -0
- package/dist/vault/backends/file.d.ts +15 -0
- package/dist/vault/backends/file.d.ts.map +1 -0
- package/dist/vault/backends/file.js +39 -0
- package/dist/vault/backends/file.js.map +1 -0
- package/dist/vault/backends/os-keychain.d.ts +13 -0
- package/dist/vault/backends/os-keychain.d.ts.map +1 -0
- package/dist/vault/backends/os-keychain.js +60 -0
- package/dist/vault/backends/os-keychain.js.map +1 -0
- package/dist/vault/backends/os-secret.d.ts +13 -0
- package/dist/vault/backends/os-secret.d.ts.map +1 -0
- package/dist/vault/backends/os-secret.js +57 -0
- package/dist/vault/backends/os-secret.js.map +1 -0
- package/dist/vault/backends/os-win-cred.d.ts +13 -0
- package/dist/vault/backends/os-win-cred.d.ts.map +1 -0
- package/dist/vault/backends/os-win-cred.js +76 -0
- package/dist/vault/backends/os-win-cred.js.map +1 -0
- package/dist/vault/crypto.d.ts +49 -0
- package/dist/vault/crypto.d.ts.map +1 -0
- package/dist/vault/crypto.js +122 -0
- package/dist/vault/crypto.js.map +1 -0
- package/dist/vault/index.d.ts +88 -0
- package/dist/vault/index.d.ts.map +1 -0
- package/dist/vault/index.js +276 -0
- package/dist/vault/index.js.map +1 -0
- package/dist/vault/storage.d.ts +14 -0
- package/dist/vault/storage.d.ts.map +1 -0
- package/dist/vault/storage.js +68 -0
- package/dist/vault/storage.js.map +1 -0
- package/dist/vault/types.d.ts +41 -0
- package/dist/vault/types.d.ts.map +1 -0
- package/dist/vault/types.js +6 -0
- package/dist/vault/types.js.map +1 -0
- package/package.json +3 -1
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Linux libsecret storage backend
|
|
4
|
+
* Uses `secret-tool` command-line utility (package: libsecret-tools)
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.LinuxSecretBackend = void 0;
|
|
8
|
+
const child_process_1 = require("child_process");
|
|
9
|
+
const COLLECTION = '123456btc-cli';
|
|
10
|
+
const LABEL = '123456btc Vault';
|
|
11
|
+
class LinuxSecretBackend {
|
|
12
|
+
name = 'Linux libsecret';
|
|
13
|
+
async isAvailable() {
|
|
14
|
+
if (process.platform !== 'linux')
|
|
15
|
+
return false;
|
|
16
|
+
try {
|
|
17
|
+
(0, child_process_1.execSync)('which secret-tool', { stdio: 'ignore' });
|
|
18
|
+
return true;
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
async read() {
|
|
25
|
+
try {
|
|
26
|
+
const result = (0, child_process_1.execSync)(`secret-tool lookup collection "${COLLECTION}" label "${LABEL}"`, { encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe'] });
|
|
27
|
+
return Buffer.from(result.trim(), 'base64');
|
|
28
|
+
}
|
|
29
|
+
catch (err) {
|
|
30
|
+
if (err.status === 1)
|
|
31
|
+
return null; // not found
|
|
32
|
+
throw err;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
async write(data) {
|
|
36
|
+
const b64 = data.toString('base64');
|
|
37
|
+
// Clear existing
|
|
38
|
+
try {
|
|
39
|
+
(0, child_process_1.execSync)(`secret-tool clear collection "${COLLECTION}" label "${LABEL}"`, { stdio: 'ignore' });
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
// ignore
|
|
43
|
+
}
|
|
44
|
+
// Store new
|
|
45
|
+
(0, child_process_1.execSync)(`echo -n "${b64}" | secret-tool store --label="${LABEL}" collection "${COLLECTION}" label "${LABEL}"`, { stdio: 'ignore' });
|
|
46
|
+
}
|
|
47
|
+
async delete() {
|
|
48
|
+
try {
|
|
49
|
+
(0, child_process_1.execSync)(`secret-tool clear collection "${COLLECTION}" label "${LABEL}"`, { stdio: 'ignore' });
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
// ignore
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
exports.LinuxSecretBackend = LinuxSecretBackend;
|
|
57
|
+
//# sourceMappingURL=os-secret.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"os-secret.js","sourceRoot":"","sources":["../../../src/vault/backends/os-secret.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,iDAAyC;AAGzC,MAAM,UAAU,GAAG,eAAe,CAAC;AACnC,MAAM,KAAK,GAAG,iBAAiB,CAAC;AAEhC,MAAa,kBAAkB;IACpB,IAAI,GAAG,iBAAiB,CAAC;IAElC,KAAK,CAAC,WAAW;QACf,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;YAAE,OAAO,KAAK,CAAC;QAC/C,IAAI,CAAC;YACH,IAAA,wBAAQ,EAAC,mBAAmB,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YACnD,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAA,wBAAQ,EACrB,kCAAkC,UAAU,YAAY,KAAK,GAAG,EAChE,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CACtD,CAAC;YACF,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,QAAQ,CAAC,CAAC;QAC9C,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,IAAI,CAAC,CAAC,YAAY;YAC/C,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAY;QACtB,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACpC,iBAAiB;QACjB,IAAI,CAAC;YACH,IAAA,wBAAQ,EACN,iCAAiC,UAAU,YAAY,KAAK,GAAG,EAC/D,EAAE,KAAK,EAAE,QAAQ,EAAE,CACpB,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,YAAY;QACZ,IAAA,wBAAQ,EACN,YAAY,GAAG,kCAAkC,KAAK,iBAAiB,UAAU,YAAY,KAAK,GAAG,EACrG,EAAE,KAAK,EAAE,QAAQ,EAAE,CACpB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,MAAM;QACV,IAAI,CAAC;YACH,IAAA,wBAAQ,EACN,iCAAiC,UAAU,YAAY,KAAK,GAAG,EAC/D,EAAE,KAAK,EAAE,QAAQ,EAAE,CACpB,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC;CACF;AAtDD,gDAsDC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Windows Credential Manager backend
|
|
3
|
+
* Uses PowerShell [Windows.Security.Credentials.PasswordVault]
|
|
4
|
+
*/
|
|
5
|
+
import type { IStorageBackend } from '../types';
|
|
6
|
+
export declare class WindowsCredBackend implements IStorageBackend {
|
|
7
|
+
readonly name = "Windows Credential Manager";
|
|
8
|
+
isAvailable(): Promise<boolean>;
|
|
9
|
+
read(): Promise<Buffer | null>;
|
|
10
|
+
write(data: Buffer): Promise<void>;
|
|
11
|
+
delete(): Promise<void>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=os-win-cred.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"os-win-cred.d.ts","sourceRoot":"","sources":["../../../src/vault/backends/os-win-cred.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAKhD,qBAAa,kBAAmB,YAAW,eAAe;IACxD,QAAQ,CAAC,IAAI,gCAAgC;IAEvC,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAgB/B,IAAI,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAqB9B,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAWlC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;CAW9B"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Windows Credential Manager backend
|
|
4
|
+
* Uses PowerShell [Windows.Security.Credentials.PasswordVault]
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.WindowsCredBackend = void 0;
|
|
8
|
+
const child_process_1 = require("child_process");
|
|
9
|
+
const RESOURCE = '123456btc-cli-vault';
|
|
10
|
+
const USERNAME = 'vault';
|
|
11
|
+
class WindowsCredBackend {
|
|
12
|
+
name = 'Windows Credential Manager';
|
|
13
|
+
async isAvailable() {
|
|
14
|
+
if (process.platform !== 'win32')
|
|
15
|
+
return false;
|
|
16
|
+
try {
|
|
17
|
+
(0, child_process_1.execSync)('powershell -Command "Get-Command Get-Credential"', { stdio: 'ignore' });
|
|
18
|
+
return true;
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
// Fallback: just check powershell exists
|
|
22
|
+
try {
|
|
23
|
+
(0, child_process_1.execSync)('powershell -Command "echo test"', { stdio: 'ignore' });
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
async read() {
|
|
32
|
+
try {
|
|
33
|
+
const ps = `
|
|
34
|
+
$vault = New-Object Windows.Security.Credentials.PasswordVault;
|
|
35
|
+
try {
|
|
36
|
+
$cred = $vault.Retrieve("${RESOURCE}", "${USERNAME}");
|
|
37
|
+
$cred.Password;
|
|
38
|
+
} catch {
|
|
39
|
+
exit 1;
|
|
40
|
+
}
|
|
41
|
+
`;
|
|
42
|
+
const result = (0, child_process_1.execSync)(`powershell -Command "${ps.replace(/\n/g, ' ').replace(/"/g, '\\"')}"`, {
|
|
43
|
+
encoding: 'utf8',
|
|
44
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
45
|
+
});
|
|
46
|
+
return Buffer.from(result.trim(), 'base64');
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
async write(data) {
|
|
53
|
+
const b64 = data.toString('base64');
|
|
54
|
+
const ps = `
|
|
55
|
+
$vault = New-Object Windows.Security.Credentials.PasswordVault;
|
|
56
|
+
try { $vault.Remove((New-Object Windows.Security.Credentials.PasswordCredential("${RESOURCE}", "${USERNAME}", ""))); } catch { }
|
|
57
|
+
$cred = New-Object Windows.Security.Credentials.PasswordCredential("${RESOURCE}", "${USERNAME}", "${b64}");
|
|
58
|
+
$vault.Add($cred);
|
|
59
|
+
`;
|
|
60
|
+
(0, child_process_1.execSync)(`powershell -Command "${ps.replace(/\n/g, ' ')}"`, { stdio: 'ignore' });
|
|
61
|
+
}
|
|
62
|
+
async delete() {
|
|
63
|
+
try {
|
|
64
|
+
const ps = `
|
|
65
|
+
$vault = New-Object Windows.Security.Credentials.PasswordVault;
|
|
66
|
+
$vault.Remove((New-Object Windows.Security.Credentials.PasswordCredential("${RESOURCE}", "${USERNAME}", "")));
|
|
67
|
+
`;
|
|
68
|
+
(0, child_process_1.execSync)(`powershell -Command "${ps.replace(/\n/g, ' ')}"`, { stdio: 'ignore' });
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
// ignore
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
exports.WindowsCredBackend = WindowsCredBackend;
|
|
76
|
+
//# sourceMappingURL=os-win-cred.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"os-win-cred.js","sourceRoot":"","sources":["../../../src/vault/backends/os-win-cred.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,iDAAyC;AAGzC,MAAM,QAAQ,GAAG,qBAAqB,CAAC;AACvC,MAAM,QAAQ,GAAG,OAAO,CAAC;AAEzB,MAAa,kBAAkB;IACpB,IAAI,GAAG,4BAA4B,CAAC;IAE7C,KAAK,CAAC,WAAW;QACf,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;YAAE,OAAO,KAAK,CAAC;QAC/C,IAAI,CAAC;YACH,IAAA,wBAAQ,EAAC,kDAAkD,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YAClF,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,yCAAyC;YACzC,IAAI,CAAC;gBACH,IAAA,wBAAQ,EAAC,iCAAiC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;gBACjE,OAAO,IAAI,CAAC;YACd,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC;YACH,MAAM,EAAE,GAAG;;;qCAGoB,QAAQ,OAAO,QAAQ;;;;;OAKrD,CAAC;YACF,MAAM,MAAM,GAAG,IAAA,wBAAQ,EAAC,wBAAwB,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,EAAE;gBAC9F,QAAQ,EAAE,MAAM;gBAChB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;aAChC,CAAC,CAAC;YACH,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,QAAQ,CAAC,CAAC;QAC9C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAY;QACtB,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACpC,MAAM,EAAE,GAAG;;yFAE0E,QAAQ,OAAO,QAAQ;4EACpC,QAAQ,OAAO,QAAQ,OAAO,GAAG;;KAExG,CAAC;QACF,IAAA,wBAAQ,EAAC,wBAAwB,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IACnF,CAAC;IAED,KAAK,CAAC,MAAM;QACV,IAAI,CAAC;YACH,MAAM,EAAE,GAAG;;qFAEoE,QAAQ,OAAO,QAAQ;OACrG,CAAC;YACF,IAAA,wBAAQ,EAAC,wBAAwB,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QACnF,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC;CACF;AA9DD,gDA8DC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vault cryptography - scrypt KDF + AES-256-GCM
|
|
3
|
+
*
|
|
4
|
+
* Security design:
|
|
5
|
+
* - Master password never stored
|
|
6
|
+
* - KEK (Key Encryption Key) derived via scrypt (2^17, r=8, p=1)
|
|
7
|
+
* - Data encrypted with AES-256-GCM, random IV per entry
|
|
8
|
+
* - Sensitive buffers are Uint8Array (can be zeroed after use)
|
|
9
|
+
*/
|
|
10
|
+
import type { SecureBuffer, KDFParams } from './types';
|
|
11
|
+
declare const VAULT_VERSION = 1;
|
|
12
|
+
declare const SALT_LEN = 32;
|
|
13
|
+
declare const DEFAULT_KDF: KDFParams;
|
|
14
|
+
export { VAULT_VERSION, DEFAULT_KDF, SALT_LEN };
|
|
15
|
+
/**
|
|
16
|
+
* Derive KEK from password + salt using scrypt
|
|
17
|
+
*/
|
|
18
|
+
export declare function deriveKey(password: string, salt: Uint8Array, params?: KDFParams): SecureBuffer;
|
|
19
|
+
/**
|
|
20
|
+
* Encrypt plaintext with AES-256-GCM
|
|
21
|
+
* Returns: iv (16) + ciphertext + authTag (16)
|
|
22
|
+
*/
|
|
23
|
+
export declare function encrypt(plaintext: Uint8Array, key: Uint8Array): Uint8Array;
|
|
24
|
+
/**
|
|
25
|
+
* Decrypt ciphertext with AES-256-GCM
|
|
26
|
+
* Input format: iv (16) + ciphertext + authTag (16)
|
|
27
|
+
*/
|
|
28
|
+
export declare function decrypt(ciphertext: Uint8Array, key: Uint8Array): Uint8Array;
|
|
29
|
+
/**
|
|
30
|
+
* Create a secure buffer that can be explicitly wiped from memory
|
|
31
|
+
*/
|
|
32
|
+
export declare function secureBuffer(data: Uint8Array | Buffer): SecureBuffer;
|
|
33
|
+
/**
|
|
34
|
+
* Generate random salt
|
|
35
|
+
*/
|
|
36
|
+
export declare function generateSalt(): Uint8Array;
|
|
37
|
+
/**
|
|
38
|
+
* Encode vault data for storage
|
|
39
|
+
*/
|
|
40
|
+
export declare function encodeVaultData(entries: unknown[], meta: unknown): Uint8Array;
|
|
41
|
+
/**
|
|
42
|
+
* Decode vault data from storage
|
|
43
|
+
*/
|
|
44
|
+
export declare function decodeVaultData(data: Uint8Array): {
|
|
45
|
+
version: number;
|
|
46
|
+
meta: unknown;
|
|
47
|
+
entries: unknown[];
|
|
48
|
+
};
|
|
49
|
+
//# sourceMappingURL=crypto.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../../src/vault/crypto.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEvD,QAAA,MAAM,aAAa,IAAI,CAAC;AACxB,QAAA,MAAM,QAAQ,KAAK,CAAC;AAOpB,QAAA,MAAM,WAAW,EAAE,SAMlB,CAAC;AAEF,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC;AAEhD;;GAEG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,GAAE,SAAuB,GAAG,YAAY,CAgB3G;AAED;;;GAGG;AACH,wBAAgB,OAAO,CAAC,SAAS,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,GAAG,UAAU,CAM1E;AAED;;;GAGG;AACH,wBAAgB,OAAO,CAAC,UAAU,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,GAAG,UAAU,CAW3E;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,GAAG,YAAY,CAapE;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,UAAU,CAEzC;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,GAAG,UAAU,CAG7E;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,UAAU,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,EAAE,CAAA;CAAE,CAGxG"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Vault cryptography - scrypt KDF + AES-256-GCM
|
|
4
|
+
*
|
|
5
|
+
* Security design:
|
|
6
|
+
* - Master password never stored
|
|
7
|
+
* - KEK (Key Encryption Key) derived via scrypt (2^17, r=8, p=1)
|
|
8
|
+
* - Data encrypted with AES-256-GCM, random IV per entry
|
|
9
|
+
* - Sensitive buffers are Uint8Array (can be zeroed after use)
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.SALT_LEN = exports.DEFAULT_KDF = exports.VAULT_VERSION = void 0;
|
|
13
|
+
exports.deriveKey = deriveKey;
|
|
14
|
+
exports.encrypt = encrypt;
|
|
15
|
+
exports.decrypt = decrypt;
|
|
16
|
+
exports.secureBuffer = secureBuffer;
|
|
17
|
+
exports.generateSalt = generateSalt;
|
|
18
|
+
exports.encodeVaultData = encodeVaultData;
|
|
19
|
+
exports.decodeVaultData = decodeVaultData;
|
|
20
|
+
const crypto_1 = require("crypto");
|
|
21
|
+
const VAULT_VERSION = 1;
|
|
22
|
+
exports.VAULT_VERSION = VAULT_VERSION;
|
|
23
|
+
const SALT_LEN = 32;
|
|
24
|
+
exports.SALT_LEN = SALT_LEN;
|
|
25
|
+
const IV_LEN = 16;
|
|
26
|
+
const AUTH_TAG_LEN = 16;
|
|
27
|
+
const KEY_LEN = 32;
|
|
28
|
+
// scrypt parameters: N=2^17 (131072), r=8, p=1
|
|
29
|
+
// ~100ms on modern CPU, memory ~128MB
|
|
30
|
+
const DEFAULT_KDF = {
|
|
31
|
+
algorithm: 'scrypt',
|
|
32
|
+
n: 131072,
|
|
33
|
+
r: 8,
|
|
34
|
+
p: 1,
|
|
35
|
+
dkLen: KEY_LEN,
|
|
36
|
+
};
|
|
37
|
+
exports.DEFAULT_KDF = DEFAULT_KDF;
|
|
38
|
+
/**
|
|
39
|
+
* Derive KEK from password + salt using scrypt
|
|
40
|
+
*/
|
|
41
|
+
function deriveKey(password, salt, params = DEFAULT_KDF) {
|
|
42
|
+
const pwdBuf = new TextEncoder().encode(password);
|
|
43
|
+
const n = params.n ?? 131072;
|
|
44
|
+
const r = params.r ?? 8;
|
|
45
|
+
const p = params.p ?? 1;
|
|
46
|
+
// maxmem = 128 * N * r * 2 (double for safety margin)
|
|
47
|
+
const maxmem = 128 * n * r * 2 + 1024 * 1024;
|
|
48
|
+
const key = (0, crypto_1.scryptSync)(pwdBuf, salt, params.dkLen, {
|
|
49
|
+
N: n,
|
|
50
|
+
r,
|
|
51
|
+
p,
|
|
52
|
+
maxmem,
|
|
53
|
+
});
|
|
54
|
+
// wipe password buffer
|
|
55
|
+
pwdBuf.fill(0);
|
|
56
|
+
return secureBuffer(key);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Encrypt plaintext with AES-256-GCM
|
|
60
|
+
* Returns: iv (16) + ciphertext + authTag (16)
|
|
61
|
+
*/
|
|
62
|
+
function encrypt(plaintext, key) {
|
|
63
|
+
const iv = (0, crypto_1.randomBytes)(IV_LEN);
|
|
64
|
+
const cipher = (0, crypto_1.createCipheriv)('aes-256-gcm', key, iv);
|
|
65
|
+
const ciphertext = Buffer.concat([cipher.update(plaintext), cipher.final()]);
|
|
66
|
+
const authTag = cipher.getAuthTag();
|
|
67
|
+
return Buffer.concat([iv, ciphertext, authTag]);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Decrypt ciphertext with AES-256-GCM
|
|
71
|
+
* Input format: iv (16) + ciphertext + authTag (16)
|
|
72
|
+
*/
|
|
73
|
+
function decrypt(ciphertext, key) {
|
|
74
|
+
if (ciphertext.length < IV_LEN + AUTH_TAG_LEN) {
|
|
75
|
+
throw new Error('Ciphertext too short');
|
|
76
|
+
}
|
|
77
|
+
const iv = ciphertext.slice(0, IV_LEN);
|
|
78
|
+
const encrypted = ciphertext.slice(IV_LEN, -AUTH_TAG_LEN);
|
|
79
|
+
const authTag = ciphertext.slice(-AUTH_TAG_LEN);
|
|
80
|
+
const decipher = (0, crypto_1.createDecipheriv)('aes-256-gcm', key, iv);
|
|
81
|
+
decipher.setAuthTag(authTag);
|
|
82
|
+
const plaintext = Buffer.concat([decipher.update(encrypted), decipher.final()]);
|
|
83
|
+
return plaintext;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Create a secure buffer that can be explicitly wiped from memory
|
|
87
|
+
*/
|
|
88
|
+
function secureBuffer(data) {
|
|
89
|
+
const buf = new Uint8Array(data);
|
|
90
|
+
return {
|
|
91
|
+
data: buf,
|
|
92
|
+
wipe() {
|
|
93
|
+
// random overwrite then zero
|
|
94
|
+
const tmp = new Uint8Array(buf.length);
|
|
95
|
+
const rnd = (0, crypto_1.randomBytes)(buf.length);
|
|
96
|
+
tmp.set(rnd);
|
|
97
|
+
buf.set(tmp);
|
|
98
|
+
buf.fill(0);
|
|
99
|
+
},
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Generate random salt
|
|
104
|
+
*/
|
|
105
|
+
function generateSalt() {
|
|
106
|
+
return (0, crypto_1.randomBytes)(SALT_LEN);
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Encode vault data for storage
|
|
110
|
+
*/
|
|
111
|
+
function encodeVaultData(entries, meta) {
|
|
112
|
+
const payload = JSON.stringify({ version: VAULT_VERSION, meta, entries });
|
|
113
|
+
return new TextEncoder().encode(payload);
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Decode vault data from storage
|
|
117
|
+
*/
|
|
118
|
+
function decodeVaultData(data) {
|
|
119
|
+
const text = new TextDecoder().decode(data);
|
|
120
|
+
return JSON.parse(text);
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=crypto.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../src/vault/crypto.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VaultManager - Secure key vault for 123456btc CLI
|
|
3
|
+
*
|
|
4
|
+
* Manages encrypted storage of:
|
|
5
|
+
* - Exchange API keys (Binance, OKX, Bybit, etc.)
|
|
6
|
+
* - LLM provider keys (OpenAI, Anthropic, etc.)
|
|
7
|
+
* - Wallet private keys (Solana, etc.)
|
|
8
|
+
*
|
|
9
|
+
* Security model:
|
|
10
|
+
* - Master password → scrypt KDF → KEK
|
|
11
|
+
* - KEK encrypts all vault data (AES-256-GCM)
|
|
12
|
+
* - Plaintext keys only exist in memory during active use
|
|
13
|
+
* - Memory buffers are explicitly wiped after use
|
|
14
|
+
*/
|
|
15
|
+
import type { VaultEntry, SecureBuffer } from './types';
|
|
16
|
+
export declare class VaultManager {
|
|
17
|
+
private state;
|
|
18
|
+
private kek;
|
|
19
|
+
private backend;
|
|
20
|
+
private autoLockTimer;
|
|
21
|
+
private readonly autoLockMs;
|
|
22
|
+
constructor(options?: {
|
|
23
|
+
autoLockMs?: number;
|
|
24
|
+
forceFile?: string;
|
|
25
|
+
});
|
|
26
|
+
/**
|
|
27
|
+
* Initialize vault with a master password
|
|
28
|
+
* Creates new vault if not exists
|
|
29
|
+
*/
|
|
30
|
+
init(password: string): Promise<void>;
|
|
31
|
+
/**
|
|
32
|
+
* Unlock vault with master password
|
|
33
|
+
*/
|
|
34
|
+
unlock(password: string): Promise<void>;
|
|
35
|
+
/**
|
|
36
|
+
* Lock vault, wipe KEK from memory
|
|
37
|
+
*/
|
|
38
|
+
lock(): void;
|
|
39
|
+
/**
|
|
40
|
+
* Check if vault is unlocked
|
|
41
|
+
*/
|
|
42
|
+
isUnlocked(): boolean;
|
|
43
|
+
/**
|
|
44
|
+
* Set a vault entry (create or update)
|
|
45
|
+
*/
|
|
46
|
+
set(name: string, data: Record<string, string>, category?: VaultEntry['category'], tags?: string[]): Promise<void>;
|
|
47
|
+
/**
|
|
48
|
+
* Get a vault entry by name
|
|
49
|
+
* Returns decrypted data as SecureBuffer-compatible plain object
|
|
50
|
+
*/
|
|
51
|
+
get(name: string): VaultEntry | undefined;
|
|
52
|
+
/**
|
|
53
|
+
* Get sensitive value as SecureBuffer (must call .wipe() after use!)
|
|
54
|
+
*/
|
|
55
|
+
getSecure(name: string, field: string): SecureBuffer | undefined;
|
|
56
|
+
/**
|
|
57
|
+
* List all vault entries (sensitive values masked)
|
|
58
|
+
*/
|
|
59
|
+
list(): Array<Pick<VaultEntry, 'name' | 'category' | 'createdAt' | 'updatedAt' | 'tags'> & {
|
|
60
|
+
fields: string[];
|
|
61
|
+
}>;
|
|
62
|
+
/**
|
|
63
|
+
* Remove an entry by name
|
|
64
|
+
*/
|
|
65
|
+
remove(name: string): Promise<boolean>;
|
|
66
|
+
/**
|
|
67
|
+
* Change master password
|
|
68
|
+
*/
|
|
69
|
+
changePassword(oldPassword: string, newPassword: string): Promise<void>;
|
|
70
|
+
/**
|
|
71
|
+
* Destroy vault (delete all data)
|
|
72
|
+
*/
|
|
73
|
+
destroy(): Promise<void>;
|
|
74
|
+
/**
|
|
75
|
+
* Get storage backend name
|
|
76
|
+
*/
|
|
77
|
+
getBackendName(): string;
|
|
78
|
+
private _ensureUnlocked;
|
|
79
|
+
private _save;
|
|
80
|
+
private _startAutoLock;
|
|
81
|
+
private _clearKek;
|
|
82
|
+
}
|
|
83
|
+
export declare function getVault(options?: {
|
|
84
|
+
autoLockMs?: number;
|
|
85
|
+
forceFile?: string;
|
|
86
|
+
}): VaultManager;
|
|
87
|
+
export declare function resetVault(): void;
|
|
88
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vault/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,UAAU,EAA0C,YAAY,EAAE,MAAM,SAAS,CAAC;AAchG,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAIX;IAEF,OAAO,CAAC,GAAG,CAA6B;IACxC,OAAO,CAAC,OAAO,CAAgC;IAC/C,OAAO,CAAC,aAAa,CAA+B;IACpD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAExB,OAAO,GAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO;IAIrE;;;OAGG;IACG,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA4B3C;;OAEG;IACG,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAwC7C;;OAEG;IACH,IAAI,IAAI,IAAI;IAWZ;;OAEG;IACH,UAAU,IAAI,OAAO;IAIrB;;OAEG;IACG,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,QAAQ,GAAE,UAAU,CAAC,UAAU,CAAW,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA4BjI;;;OAGG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAKzC;;OAEG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAShE;;OAEG;IACH,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,GAAG,WAAW,GAAG,WAAW,GAAG,MAAM,CAAC,GAAG;QAAE,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAYhH;;OAEG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAS5C;;OAEG;IACG,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB7E;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAM9B;;OAEG;IACH,cAAc,IAAI,MAAM;IAMxB,OAAO,CAAC,eAAe;YAMT,KAAK;IAenB,OAAO,CAAC,cAAc;IAUtB,OAAO,CAAC,SAAS;CAMlB;AAKD,wBAAgB,QAAQ,CAAC,OAAO,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,YAAY,CAK5F;AAED,wBAAgB,UAAU,IAAI,IAAI,CAKjC"}
|