@123456btc/123456btc-cli 1.0.1 → 1.0.3

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.
Files changed (132) hide show
  1. package/README.md +182 -39
  2. package/README.zh-CN.md +78 -0
  3. package/dist/api/client.d.ts +4 -0
  4. package/dist/api/client.d.ts.map +1 -1
  5. package/dist/api/client.js +74 -16
  6. package/dist/api/client.js.map +1 -1
  7. package/dist/api/provider.d.ts +163 -0
  8. package/dist/api/provider.d.ts.map +1 -0
  9. package/dist/api/provider.js +123 -0
  10. package/dist/api/provider.js.map +1 -0
  11. package/dist/api/signal-crypto.d.ts +17 -0
  12. package/dist/api/signal-crypto.d.ts.map +1 -0
  13. package/dist/api/signal-crypto.js +48 -0
  14. package/dist/api/signal-crypto.js.map +1 -0
  15. package/dist/api/signals.d.ts +47 -0
  16. package/dist/api/signals.d.ts.map +1 -0
  17. package/dist/api/signals.js +34 -0
  18. package/dist/api/signals.js.map +1 -0
  19. package/dist/api/strategy-stream.d.ts +59 -0
  20. package/dist/api/strategy-stream.d.ts.map +1 -0
  21. package/dist/api/strategy-stream.js +136 -0
  22. package/dist/api/strategy-stream.js.map +1 -0
  23. package/dist/api/strategy.d.ts +66 -20
  24. package/dist/api/strategy.d.ts.map +1 -1
  25. package/dist/api/strategy.js +15 -18
  26. package/dist/api/strategy.js.map +1 -1
  27. package/dist/api/token-manager.d.ts +37 -0
  28. package/dist/api/token-manager.d.ts.map +1 -0
  29. package/dist/api/token-manager.js +191 -0
  30. package/dist/api/token-manager.js.map +1 -0
  31. package/dist/api/wallet.d.ts +38 -0
  32. package/dist/api/wallet.d.ts.map +1 -0
  33. package/dist/api/wallet.js +23 -0
  34. package/dist/api/wallet.js.map +1 -0
  35. package/dist/cli.js +12 -2
  36. package/dist/cli.js.map +1 -1
  37. package/dist/commands/auth.d.ts.map +1 -1
  38. package/dist/commands/auth.js +149 -3
  39. package/dist/commands/auth.js.map +1 -1
  40. package/dist/commands/health.d.ts +3 -0
  41. package/dist/commands/health.d.ts.map +1 -0
  42. package/dist/commands/health.js +77 -0
  43. package/dist/commands/health.js.map +1 -0
  44. package/dist/commands/install.d.ts.map +1 -1
  45. package/dist/commands/install.js +127 -24
  46. package/dist/commands/install.js.map +1 -1
  47. package/dist/commands/provider.d.ts +3 -0
  48. package/dist/commands/provider.d.ts.map +1 -0
  49. package/dist/commands/provider.js +371 -0
  50. package/dist/commands/provider.js.map +1 -0
  51. package/dist/commands/signals.d.ts +3 -0
  52. package/dist/commands/signals.d.ts.map +1 -0
  53. package/dist/commands/signals.js +104 -0
  54. package/dist/commands/signals.js.map +1 -0
  55. package/dist/commands/strategy.d.ts.map +1 -1
  56. package/dist/commands/strategy.js +147 -59
  57. package/dist/commands/strategy.js.map +1 -1
  58. package/dist/commands/tier.d.ts +3 -0
  59. package/dist/commands/tier.d.ts.map +1 -0
  60. package/dist/commands/tier.js +105 -0
  61. package/dist/commands/tier.js.map +1 -0
  62. package/dist/commands/vault.d.ts +7 -0
  63. package/dist/commands/vault.d.ts.map +1 -0
  64. package/dist/commands/vault.js +377 -0
  65. package/dist/commands/vault.js.map +1 -0
  66. package/dist/commands/wallet.d.ts +3 -0
  67. package/dist/commands/wallet.d.ts.map +1 -0
  68. package/dist/commands/wallet.js +74 -0
  69. package/dist/commands/wallet.js.map +1 -0
  70. package/dist/config.d.ts +1 -0
  71. package/dist/config.d.ts.map +1 -1
  72. package/dist/config.js +16 -2
  73. package/dist/config.js.map +1 -1
  74. package/dist/index.d.ts +12 -4
  75. package/dist/index.d.ts.map +1 -1
  76. package/dist/index.js +22 -6
  77. package/dist/index.js.map +1 -1
  78. package/dist/providers/executor.d.ts +55 -20
  79. package/dist/providers/executor.d.ts.map +1 -1
  80. package/dist/providers/executor.js +260 -58
  81. package/dist/providers/executor.js.map +1 -1
  82. package/dist/providers/risk.d.ts +17 -0
  83. package/dist/providers/risk.d.ts.map +1 -0
  84. package/dist/providers/risk.js +67 -0
  85. package/dist/providers/risk.js.map +1 -0
  86. package/dist/providers/state.d.ts +30 -0
  87. package/dist/providers/state.d.ts.map +1 -0
  88. package/dist/providers/state.js +190 -0
  89. package/dist/providers/state.js.map +1 -0
  90. package/dist/types/strategy.d.ts +65 -1
  91. package/dist/types/strategy.d.ts.map +1 -1
  92. package/dist/types/strategy.js +1 -0
  93. package/dist/types/strategy.js.map +1 -1
  94. package/dist/utils/auth.d.ts +1 -0
  95. package/dist/utils/auth.d.ts.map +1 -1
  96. package/dist/utils/device.d.ts +13 -0
  97. package/dist/utils/device.d.ts.map +1 -0
  98. package/dist/utils/device.js +104 -0
  99. package/dist/utils/device.js.map +1 -0
  100. package/dist/vault/backends/file.d.ts +15 -0
  101. package/dist/vault/backends/file.d.ts.map +1 -0
  102. package/dist/vault/backends/file.js +39 -0
  103. package/dist/vault/backends/file.js.map +1 -0
  104. package/dist/vault/backends/os-keychain.d.ts +13 -0
  105. package/dist/vault/backends/os-keychain.d.ts.map +1 -0
  106. package/dist/vault/backends/os-keychain.js +60 -0
  107. package/dist/vault/backends/os-keychain.js.map +1 -0
  108. package/dist/vault/backends/os-secret.d.ts +13 -0
  109. package/dist/vault/backends/os-secret.d.ts.map +1 -0
  110. package/dist/vault/backends/os-secret.js +57 -0
  111. package/dist/vault/backends/os-secret.js.map +1 -0
  112. package/dist/vault/backends/os-win-cred.d.ts +13 -0
  113. package/dist/vault/backends/os-win-cred.d.ts.map +1 -0
  114. package/dist/vault/backends/os-win-cred.js +76 -0
  115. package/dist/vault/backends/os-win-cred.js.map +1 -0
  116. package/dist/vault/crypto.d.ts +49 -0
  117. package/dist/vault/crypto.d.ts.map +1 -0
  118. package/dist/vault/crypto.js +122 -0
  119. package/dist/vault/crypto.js.map +1 -0
  120. package/dist/vault/index.d.ts +88 -0
  121. package/dist/vault/index.d.ts.map +1 -0
  122. package/dist/vault/index.js +276 -0
  123. package/dist/vault/index.js.map +1 -0
  124. package/dist/vault/storage.d.ts +14 -0
  125. package/dist/vault/storage.d.ts.map +1 -0
  126. package/dist/vault/storage.js +68 -0
  127. package/dist/vault/storage.js.map +1 -0
  128. package/dist/vault/types.d.ts +41 -0
  129. package/dist/vault/types.d.ts.map +1 -0
  130. package/dist/vault/types.js +6 -0
  131. package/dist/vault/types.js.map +1 -0
  132. package/package.json +5 -2
@@ -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"}