@id-wispera/core 0.1.0
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/README.md +268 -0
- package/dist/audit.d.ts +68 -0
- package/dist/audit.d.ts.map +1 -0
- package/dist/audit.js +252 -0
- package/dist/audit.js.map +1 -0
- package/dist/auth/index.d.ts +8 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +8 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/keychainProvider.d.ts +40 -0
- package/dist/auth/keychainProvider.d.ts.map +1 -0
- package/dist/auth/keychainProvider.js +98 -0
- package/dist/auth/keychainProvider.js.map +1 -0
- package/dist/auth/passphraseProvider.d.ts +80 -0
- package/dist/auth/passphraseProvider.d.ts.map +1 -0
- package/dist/auth/passphraseProvider.js +188 -0
- package/dist/auth/passphraseProvider.js.map +1 -0
- package/dist/auth/sessionTokenManager.d.ts +106 -0
- package/dist/auth/sessionTokenManager.d.ts.map +1 -0
- package/dist/auth/sessionTokenManager.js +263 -0
- package/dist/auth/sessionTokenManager.js.map +1 -0
- package/dist/delegation.d.ts +81 -0
- package/dist/delegation.d.ts.map +1 -0
- package/dist/delegation.js +299 -0
- package/dist/delegation.js.map +1 -0
- package/dist/detection.d.ts +35 -0
- package/dist/detection.d.ts.map +1 -0
- package/dist/detection.js +474 -0
- package/dist/detection.js.map +1 -0
- package/dist/exec/execManager.d.ts +60 -0
- package/dist/exec/execManager.d.ts.map +1 -0
- package/dist/exec/execManager.js +226 -0
- package/dist/exec/execManager.js.map +1 -0
- package/dist/exec/index.d.ts +6 -0
- package/dist/exec/index.d.ts.map +1 -0
- package/dist/exec/index.js +5 -0
- package/dist/exec/index.js.map +1 -0
- package/dist/index.d.ts +35 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +98 -0
- package/dist/index.js.map +1 -0
- package/dist/integrations/base.d.ts +64 -0
- package/dist/integrations/base.d.ts.map +1 -0
- package/dist/integrations/base.js +173 -0
- package/dist/integrations/base.js.map +1 -0
- package/dist/integrations/envMapping.d.ts +47 -0
- package/dist/integrations/envMapping.d.ts.map +1 -0
- package/dist/integrations/envMapping.js +174 -0
- package/dist/integrations/envMapping.js.map +1 -0
- package/dist/integrations/google-a2a.d.ts +48 -0
- package/dist/integrations/google-a2a.d.ts.map +1 -0
- package/dist/integrations/google-a2a.js +108 -0
- package/dist/integrations/google-a2a.js.map +1 -0
- package/dist/integrations/index.d.ts +14 -0
- package/dist/integrations/index.d.ts.map +1 -0
- package/dist/integrations/index.js +14 -0
- package/dist/integrations/index.js.map +1 -0
- package/dist/integrations/langchain.d.ts +38 -0
- package/dist/integrations/langchain.d.ts.map +1 -0
- package/dist/integrations/langchain.js +45 -0
- package/dist/integrations/langchain.js.map +1 -0
- package/dist/integrations/openai-agents.d.ts +76 -0
- package/dist/integrations/openai-agents.d.ts.map +1 -0
- package/dist/integrations/openai-agents.js +95 -0
- package/dist/integrations/openai-agents.js.map +1 -0
- package/dist/integrations/slack.d.ts +59 -0
- package/dist/integrations/slack.d.ts.map +1 -0
- package/dist/integrations/slack.js +113 -0
- package/dist/integrations/slack.js.map +1 -0
- package/dist/integrations/types.d.ts +107 -0
- package/dist/integrations/types.d.ts.map +1 -0
- package/dist/integrations/types.js +6 -0
- package/dist/integrations/types.js.map +1 -0
- package/dist/locations.d.ts +157 -0
- package/dist/locations.d.ts.map +1 -0
- package/dist/locations.js +733 -0
- package/dist/locations.js.map +1 -0
- package/dist/passport.d.ts +70 -0
- package/dist/passport.d.ts.map +1 -0
- package/dist/passport.js +429 -0
- package/dist/passport.js.map +1 -0
- package/dist/policy.d.ts +80 -0
- package/dist/policy.d.ts.map +1 -0
- package/dist/policy.js +392 -0
- package/dist/policy.js.map +1 -0
- package/dist/providers/openclaw.d.ts +80 -0
- package/dist/providers/openclaw.d.ts.map +1 -0
- package/dist/providers/openclaw.js +712 -0
- package/dist/providers/openclaw.js.map +1 -0
- package/dist/provisioning/adminPassport.d.ts +51 -0
- package/dist/provisioning/adminPassport.d.ts.map +1 -0
- package/dist/provisioning/adminPassport.js +101 -0
- package/dist/provisioning/adminPassport.js.map +1 -0
- package/dist/provisioning/index.d.ts +81 -0
- package/dist/provisioning/index.d.ts.map +1 -0
- package/dist/provisioning/index.js +141 -0
- package/dist/provisioning/index.js.map +1 -0
- package/dist/provisioning/provider.d.ts +59 -0
- package/dist/provisioning/provider.d.ts.map +1 -0
- package/dist/provisioning/provider.js +52 -0
- package/dist/provisioning/provider.js.map +1 -0
- package/dist/provisioning/providers/anthropic.d.ts +32 -0
- package/dist/provisioning/providers/anthropic.d.ts.map +1 -0
- package/dist/provisioning/providers/anthropic.js +116 -0
- package/dist/provisioning/providers/anthropic.js.map +1 -0
- package/dist/provisioning/providers/aws.d.ts +29 -0
- package/dist/provisioning/providers/aws.d.ts.map +1 -0
- package/dist/provisioning/providers/aws.js +455 -0
- package/dist/provisioning/providers/aws.js.map +1 -0
- package/dist/provisioning/providers/azure-entra.d.ts +32 -0
- package/dist/provisioning/providers/azure-entra.d.ts.map +1 -0
- package/dist/provisioning/providers/azure-entra.js +312 -0
- package/dist/provisioning/providers/azure-entra.js.map +1 -0
- package/dist/provisioning/providers/github.d.ts +24 -0
- package/dist/provisioning/providers/github.d.ts.map +1 -0
- package/dist/provisioning/providers/github.js +219 -0
- package/dist/provisioning/providers/github.js.map +1 -0
- package/dist/provisioning/providers/google-cloud.d.ts +34 -0
- package/dist/provisioning/providers/google-cloud.d.ts.map +1 -0
- package/dist/provisioning/providers/google-cloud.js +366 -0
- package/dist/provisioning/providers/google-cloud.js.map +1 -0
- package/dist/provisioning/providers/openai.d.ts +29 -0
- package/dist/provisioning/providers/openai.d.ts.map +1 -0
- package/dist/provisioning/providers/openai.js +263 -0
- package/dist/provisioning/providers/openai.js.map +1 -0
- package/dist/provisioning/providers/sendgrid.d.ts +27 -0
- package/dist/provisioning/providers/sendgrid.d.ts.map +1 -0
- package/dist/provisioning/providers/sendgrid.js +186 -0
- package/dist/provisioning/providers/sendgrid.js.map +1 -0
- package/dist/provisioning/providers/twilio.d.ts +27 -0
- package/dist/provisioning/providers/twilio.d.ts.map +1 -0
- package/dist/provisioning/providers/twilio.js +194 -0
- package/dist/provisioning/providers/twilio.js.map +1 -0
- package/dist/provisioning/types.d.ts +274 -0
- package/dist/provisioning/types.d.ts.map +1 -0
- package/dist/provisioning/types.js +6 -0
- package/dist/provisioning/types.js.map +1 -0
- package/dist/sharing.d.ts +60 -0
- package/dist/sharing.d.ts.map +1 -0
- package/dist/sharing.js +305 -0
- package/dist/sharing.js.map +1 -0
- package/dist/types.d.ts +396 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +88 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +45 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +110 -0
- package/dist/utils.js.map +1 -0
- package/dist/vault.d.ts +151 -0
- package/dist/vault.d.ts.map +1 -0
- package/dist/vault.js +499 -0
- package/dist/vault.js.map +1 -0
- package/package.json +117 -0
package/dist/vault.d.ts
ADDED
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ID Wispera Encrypted Vault
|
|
3
|
+
* Local-first encrypted storage using AES-256-GCM
|
|
4
|
+
*/
|
|
5
|
+
import { Passport, AuditEntry, VaultConfig, VaultData, VaultState } from './types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Scrypt parameters matching Python/Go SDKs for cross-SDK interoperability.
|
|
8
|
+
*/
|
|
9
|
+
export declare const SCRYPT_PARAMS: {
|
|
10
|
+
readonly N: 16384;
|
|
11
|
+
readonly r: 8;
|
|
12
|
+
readonly p: 1;
|
|
13
|
+
readonly keyLen: 32;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Storage backend interface
|
|
17
|
+
*/
|
|
18
|
+
export interface StorageBackend {
|
|
19
|
+
read(): Promise<VaultData | null>;
|
|
20
|
+
write(data: VaultData): Promise<void>;
|
|
21
|
+
exists(): Promise<boolean>;
|
|
22
|
+
delete(): Promise<void>;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* In-memory storage backend (for testing)
|
|
26
|
+
*/
|
|
27
|
+
export declare class MemoryStorageBackend implements StorageBackend {
|
|
28
|
+
private data;
|
|
29
|
+
read(): Promise<VaultData | null>;
|
|
30
|
+
write(data: VaultData): Promise<void>;
|
|
31
|
+
exists(): Promise<boolean>;
|
|
32
|
+
delete(): Promise<void>;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* File system storage backend
|
|
36
|
+
*/
|
|
37
|
+
export declare class FileSystemStorageBackend implements StorageBackend {
|
|
38
|
+
private path;
|
|
39
|
+
constructor(path: string);
|
|
40
|
+
read(): Promise<VaultData | null>;
|
|
41
|
+
write(data: VaultData): Promise<void>;
|
|
42
|
+
exists(): Promise<boolean>;
|
|
43
|
+
delete(): Promise<void>;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Encrypted vault for storing passports and audit logs
|
|
47
|
+
*/
|
|
48
|
+
export declare class Vault {
|
|
49
|
+
private key;
|
|
50
|
+
private salt;
|
|
51
|
+
private iv;
|
|
52
|
+
private passports;
|
|
53
|
+
private auditLog;
|
|
54
|
+
private config;
|
|
55
|
+
private storage;
|
|
56
|
+
private createdAt;
|
|
57
|
+
private lastAccessedAt;
|
|
58
|
+
constructor(config: VaultConfig, storage?: StorageBackend);
|
|
59
|
+
/**
|
|
60
|
+
* Check if the vault is unlocked
|
|
61
|
+
*/
|
|
62
|
+
get isUnlocked(): boolean;
|
|
63
|
+
/**
|
|
64
|
+
* Get vault state information
|
|
65
|
+
*/
|
|
66
|
+
getState(): VaultState;
|
|
67
|
+
/**
|
|
68
|
+
* Initialize a new vault
|
|
69
|
+
*/
|
|
70
|
+
init(passphrase: string): Promise<void>;
|
|
71
|
+
/**
|
|
72
|
+
* Unlock an existing vault
|
|
73
|
+
*/
|
|
74
|
+
unlock(passphrase: string): Promise<void>;
|
|
75
|
+
/**
|
|
76
|
+
* Lock the vault (clear keys from memory)
|
|
77
|
+
*/
|
|
78
|
+
lock(): void;
|
|
79
|
+
/**
|
|
80
|
+
* Save the vault to storage
|
|
81
|
+
*/
|
|
82
|
+
private save;
|
|
83
|
+
/**
|
|
84
|
+
* Ensure vault is unlocked before operations
|
|
85
|
+
*/
|
|
86
|
+
private ensureUnlocked;
|
|
87
|
+
/**
|
|
88
|
+
* Store a passport in the vault
|
|
89
|
+
*/
|
|
90
|
+
storePassport(passport: Passport): Promise<void>;
|
|
91
|
+
/**
|
|
92
|
+
* Retrieve a passport by ID
|
|
93
|
+
*/
|
|
94
|
+
retrievePassport(id: string): Promise<Passport | null>;
|
|
95
|
+
/**
|
|
96
|
+
* Delete a passport by ID
|
|
97
|
+
*/
|
|
98
|
+
deletePassport(id: string): Promise<boolean>;
|
|
99
|
+
/**
|
|
100
|
+
* Get all passports
|
|
101
|
+
*/
|
|
102
|
+
getAllPassports(): Promise<Passport[]>;
|
|
103
|
+
/**
|
|
104
|
+
* Add an entry to the audit log
|
|
105
|
+
*/
|
|
106
|
+
addAuditEntry(entry: AuditEntry): Promise<void>;
|
|
107
|
+
/**
|
|
108
|
+
* Get audit log entries
|
|
109
|
+
*/
|
|
110
|
+
getAuditLog(passportId?: string): Promise<AuditEntry[]>;
|
|
111
|
+
/**
|
|
112
|
+
* Export vault data (with credentials masked)
|
|
113
|
+
*/
|
|
114
|
+
exportVault(format: 'json' | 'csv'): Promise<string>;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Migrate a v1 (PBKDF2) vault to v2 (Scrypt).
|
|
118
|
+
*
|
|
119
|
+
* 1. Reads the vault file and checks its version.
|
|
120
|
+
* 2. Decrypts with the v1 KDF (PBKDF2).
|
|
121
|
+
* 3. Re-encrypts with the v2 KDF (Scrypt).
|
|
122
|
+
* 4. Writes the updated vault with version 2.
|
|
123
|
+
*
|
|
124
|
+
* The passphrase does not change — only the key derivation function is upgraded.
|
|
125
|
+
*/
|
|
126
|
+
export declare function migrateVault(passphrase: string, vaultPath?: string): Promise<{
|
|
127
|
+
migrated: boolean;
|
|
128
|
+
fromVersion: number;
|
|
129
|
+
toVersion: number;
|
|
130
|
+
}>;
|
|
131
|
+
/**
|
|
132
|
+
* Get the default vault path
|
|
133
|
+
*/
|
|
134
|
+
export declare function getDefaultVaultPath(): string;
|
|
135
|
+
/**
|
|
136
|
+
* Initialize a new vault
|
|
137
|
+
*/
|
|
138
|
+
export declare function initVault(passphrase: string, storagePath?: string): Promise<Vault>;
|
|
139
|
+
/**
|
|
140
|
+
* Unlock an existing vault
|
|
141
|
+
*/
|
|
142
|
+
export declare function unlockVault(passphrase: string, storagePath?: string): Promise<Vault>;
|
|
143
|
+
/**
|
|
144
|
+
* Lock a vault
|
|
145
|
+
*/
|
|
146
|
+
export declare function lockVault(vault: Vault): void;
|
|
147
|
+
/**
|
|
148
|
+
* Check if a vault exists
|
|
149
|
+
*/
|
|
150
|
+
export declare function vaultExists(storagePath?: string): Promise<boolean>;
|
|
151
|
+
//# sourceMappingURL=vault.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vault.d.ts","sourceRoot":"","sources":["../src/vault.ts"],"names":[],"mappings":"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"}
|
package/dist/vault.js
ADDED
|
@@ -0,0 +1,499 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ID Wispera Encrypted Vault
|
|
3
|
+
* Local-first encrypted storage using AES-256-GCM
|
|
4
|
+
*/
|
|
5
|
+
/// <reference lib="dom" />
|
|
6
|
+
import { VaultError, VAULT_DATA_VERSION, } from './types.js';
|
|
7
|
+
import { getRandomBytes, getCryptoSubtle, toBufferSource, maskValue } from './utils.js';
|
|
8
|
+
// ============================================================================
|
|
9
|
+
// Crypto Utilities
|
|
10
|
+
// ============================================================================
|
|
11
|
+
/**
|
|
12
|
+
* Convert bytes to hex string
|
|
13
|
+
*/
|
|
14
|
+
function bytesToHex(bytes) {
|
|
15
|
+
return Array.from(bytes)
|
|
16
|
+
.map((b) => b.toString(16).padStart(2, '0'))
|
|
17
|
+
.join('');
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Convert hex string to bytes
|
|
21
|
+
*/
|
|
22
|
+
function hexToBytes(hex) {
|
|
23
|
+
const bytes = new Uint8Array(hex.length / 2);
|
|
24
|
+
for (let i = 0; i < hex.length; i += 2) {
|
|
25
|
+
bytes[i / 2] = parseInt(hex.substr(i, 2), 16);
|
|
26
|
+
}
|
|
27
|
+
return bytes;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Convert string to bytes
|
|
31
|
+
*/
|
|
32
|
+
function stringToBytes(str) {
|
|
33
|
+
return new TextEncoder().encode(str);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Convert bytes to string
|
|
37
|
+
*/
|
|
38
|
+
function bytesToString(bytes) {
|
|
39
|
+
return new TextDecoder().decode(bytes);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Scrypt parameters matching Python/Go SDKs for cross-SDK interoperability.
|
|
43
|
+
*/
|
|
44
|
+
export const SCRYPT_PARAMS = {
|
|
45
|
+
N: 16384, // 2^14 — CPU/memory cost
|
|
46
|
+
r: 8, // block size
|
|
47
|
+
p: 1, // parallelism
|
|
48
|
+
keyLen: 32, // 256-bit key
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* Derive encryption key from passphrase using the appropriate KDF for the vault version.
|
|
52
|
+
* - Version 1 (legacy): PBKDF2-SHA256, 100 000 iterations
|
|
53
|
+
* - Version 2 (current): Scrypt N=16384, r=8, p=1 — matches Python/Go SDKs
|
|
54
|
+
*/
|
|
55
|
+
async function deriveKey(passphrase, salt, version = 2, iterations = 100000) {
|
|
56
|
+
let rawKey;
|
|
57
|
+
if (version >= 2) {
|
|
58
|
+
// Scrypt via Node.js crypto (not available in Web Crypto API)
|
|
59
|
+
const nodeCrypto = await import('crypto');
|
|
60
|
+
rawKey = nodeCrypto.scryptSync(passphrase, salt, SCRYPT_PARAMS.keyLen, { N: SCRYPT_PARAMS.N, r: SCRYPT_PARAMS.r, p: SCRYPT_PARAMS.p });
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
// Legacy PBKDF2 for v1 vaults (backward compatibility)
|
|
64
|
+
const subtle = await getCryptoSubtle();
|
|
65
|
+
const keyMaterial = await subtle.importKey('raw', toBufferSource(stringToBytes(passphrase)), 'PBKDF2', false, ['deriveBits', 'deriveKey']);
|
|
66
|
+
return subtle.deriveKey({
|
|
67
|
+
name: 'PBKDF2',
|
|
68
|
+
salt: toBufferSource(salt),
|
|
69
|
+
iterations,
|
|
70
|
+
hash: 'SHA-256',
|
|
71
|
+
}, keyMaterial, { name: 'AES-GCM', length: 256 }, false, ['encrypt', 'decrypt']);
|
|
72
|
+
}
|
|
73
|
+
// Import the raw Scrypt-derived bytes as a CryptoKey for AES-GCM
|
|
74
|
+
const subtle = await getCryptoSubtle();
|
|
75
|
+
return subtle.importKey('raw', toBufferSource(rawKey), { name: 'AES-GCM', length: 256 }, false, ['encrypt', 'decrypt']);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Encrypt data using AES-256-GCM
|
|
79
|
+
*/
|
|
80
|
+
async function encrypt(data, key, iv) {
|
|
81
|
+
const crypto = await getCryptoSubtle();
|
|
82
|
+
const encrypted = await crypto.encrypt({ name: 'AES-GCM', iv: toBufferSource(iv) }, key, toBufferSource(stringToBytes(data)));
|
|
83
|
+
return bytesToHex(new Uint8Array(encrypted));
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Decrypt data using AES-256-GCM
|
|
87
|
+
*/
|
|
88
|
+
async function decrypt(encryptedHex, key, iv) {
|
|
89
|
+
const crypto = await getCryptoSubtle();
|
|
90
|
+
const decrypted = await crypto.decrypt({ name: 'AES-GCM', iv: toBufferSource(iv) }, key, toBufferSource(hexToBytes(encryptedHex)));
|
|
91
|
+
return bytesToString(new Uint8Array(decrypted));
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* In-memory storage backend (for testing)
|
|
95
|
+
*/
|
|
96
|
+
export class MemoryStorageBackend {
|
|
97
|
+
data = null;
|
|
98
|
+
async read() {
|
|
99
|
+
return this.data;
|
|
100
|
+
}
|
|
101
|
+
async write(data) {
|
|
102
|
+
this.data = data;
|
|
103
|
+
}
|
|
104
|
+
async exists() {
|
|
105
|
+
return this.data !== null;
|
|
106
|
+
}
|
|
107
|
+
async delete() {
|
|
108
|
+
this.data = null;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* File system storage backend
|
|
113
|
+
*/
|
|
114
|
+
export class FileSystemStorageBackend {
|
|
115
|
+
path;
|
|
116
|
+
constructor(path) {
|
|
117
|
+
this.path = path;
|
|
118
|
+
}
|
|
119
|
+
async read() {
|
|
120
|
+
const fs = await import('fs/promises');
|
|
121
|
+
try {
|
|
122
|
+
const content = await fs.readFile(this.path, 'utf-8');
|
|
123
|
+
return JSON.parse(content);
|
|
124
|
+
}
|
|
125
|
+
catch (err) {
|
|
126
|
+
if (err.code === 'ENOENT') {
|
|
127
|
+
return null;
|
|
128
|
+
}
|
|
129
|
+
throw err;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
async write(data) {
|
|
133
|
+
const fs = await import('fs/promises');
|
|
134
|
+
const path = await import('path');
|
|
135
|
+
const dir = path.dirname(this.path);
|
|
136
|
+
await fs.mkdir(dir, { recursive: true });
|
|
137
|
+
await fs.writeFile(this.path, JSON.stringify(data, null, 2), 'utf-8');
|
|
138
|
+
}
|
|
139
|
+
async exists() {
|
|
140
|
+
const fs = await import('fs/promises');
|
|
141
|
+
try {
|
|
142
|
+
await fs.access(this.path);
|
|
143
|
+
return true;
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
return false;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
async delete() {
|
|
150
|
+
const fs = await import('fs/promises');
|
|
151
|
+
try {
|
|
152
|
+
await fs.unlink(this.path);
|
|
153
|
+
}
|
|
154
|
+
catch (err) {
|
|
155
|
+
if (err.code !== 'ENOENT') {
|
|
156
|
+
throw err;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
// ============================================================================
|
|
162
|
+
// Vault Class
|
|
163
|
+
// ============================================================================
|
|
164
|
+
/**
|
|
165
|
+
* Encrypted vault for storing passports and audit logs
|
|
166
|
+
*/
|
|
167
|
+
export class Vault {
|
|
168
|
+
key = null;
|
|
169
|
+
salt = null;
|
|
170
|
+
iv = null;
|
|
171
|
+
passports = new Map();
|
|
172
|
+
auditLog = [];
|
|
173
|
+
config;
|
|
174
|
+
storage;
|
|
175
|
+
createdAt = new Date().toISOString();
|
|
176
|
+
lastAccessedAt = new Date().toISOString();
|
|
177
|
+
constructor(config, storage) {
|
|
178
|
+
this.config = config;
|
|
179
|
+
if (storage) {
|
|
180
|
+
this.storage = storage;
|
|
181
|
+
}
|
|
182
|
+
else if (config.storagePath) {
|
|
183
|
+
this.storage = new FileSystemStorageBackend(config.storagePath);
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
this.storage = new MemoryStorageBackend();
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Check if the vault is unlocked
|
|
191
|
+
*/
|
|
192
|
+
get isUnlocked() {
|
|
193
|
+
return this.key !== null;
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Get vault state information
|
|
197
|
+
*/
|
|
198
|
+
getState() {
|
|
199
|
+
return {
|
|
200
|
+
isUnlocked: this.isUnlocked,
|
|
201
|
+
path: this.config.storagePath ?? ':memory:',
|
|
202
|
+
passportCount: this.passports.size,
|
|
203
|
+
createdAt: this.createdAt,
|
|
204
|
+
lastAccessedAt: this.lastAccessedAt,
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Initialize a new vault
|
|
209
|
+
*/
|
|
210
|
+
async init(passphrase) {
|
|
211
|
+
if (await this.storage.exists()) {
|
|
212
|
+
throw new VaultError('Vault already exists', 'VAULT_EXISTS');
|
|
213
|
+
}
|
|
214
|
+
this.salt = getRandomBytes(32);
|
|
215
|
+
this.iv = getRandomBytes(12);
|
|
216
|
+
this.key = await deriveKey(passphrase, this.salt, VAULT_DATA_VERSION, this.config.keyDerivationIterations);
|
|
217
|
+
this.createdAt = new Date().toISOString();
|
|
218
|
+
this.lastAccessedAt = new Date().toISOString();
|
|
219
|
+
await this.save();
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Unlock an existing vault
|
|
223
|
+
*/
|
|
224
|
+
async unlock(passphrase) {
|
|
225
|
+
const data = await this.storage.read();
|
|
226
|
+
if (!data) {
|
|
227
|
+
throw new VaultError('Vault does not exist', 'VAULT_NOT_FOUND');
|
|
228
|
+
}
|
|
229
|
+
if (data.version < 1 || data.version > VAULT_DATA_VERSION) {
|
|
230
|
+
throw new VaultError(`Unsupported vault version: ${data.version}`, 'UNSUPPORTED_VERSION', { version: data.version });
|
|
231
|
+
}
|
|
232
|
+
this.salt = hexToBytes(data.salt);
|
|
233
|
+
this.iv = hexToBytes(data.iv);
|
|
234
|
+
this.key = await deriveKey(passphrase, this.salt, data.version, this.config.keyDerivationIterations);
|
|
235
|
+
try {
|
|
236
|
+
// Try to decrypt passports to verify the key is correct
|
|
237
|
+
const passportsJson = await decrypt(data.encryptedPassports, this.key, this.iv);
|
|
238
|
+
const passports = JSON.parse(passportsJson);
|
|
239
|
+
this.passports = new Map(passports.map((p) => [p.id, p]));
|
|
240
|
+
const auditJson = await decrypt(data.encryptedAuditLog, this.key, this.iv);
|
|
241
|
+
this.auditLog = JSON.parse(auditJson);
|
|
242
|
+
this.createdAt = data.metadata.createdAt;
|
|
243
|
+
this.lastAccessedAt = new Date().toISOString();
|
|
244
|
+
}
|
|
245
|
+
catch {
|
|
246
|
+
this.key = null;
|
|
247
|
+
this.salt = null;
|
|
248
|
+
this.iv = null;
|
|
249
|
+
throw new VaultError('Invalid passphrase', 'INVALID_PASSPHRASE');
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Lock the vault (clear keys from memory)
|
|
254
|
+
*/
|
|
255
|
+
lock() {
|
|
256
|
+
this.key = null;
|
|
257
|
+
this.passports.clear();
|
|
258
|
+
this.auditLog = [];
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Save the vault to storage
|
|
262
|
+
*/
|
|
263
|
+
async save() {
|
|
264
|
+
if (!this.key || !this.salt || !this.iv) {
|
|
265
|
+
throw new VaultError('Vault is locked', 'VAULT_LOCKED');
|
|
266
|
+
}
|
|
267
|
+
const passportsJson = JSON.stringify(Array.from(this.passports.values()));
|
|
268
|
+
const auditJson = JSON.stringify(this.auditLog);
|
|
269
|
+
const data = {
|
|
270
|
+
version: VAULT_DATA_VERSION,
|
|
271
|
+
salt: bytesToHex(this.salt),
|
|
272
|
+
iv: bytesToHex(this.iv),
|
|
273
|
+
encryptedPassports: await encrypt(passportsJson, this.key, this.iv),
|
|
274
|
+
encryptedAuditLog: await encrypt(auditJson, this.key, this.iv),
|
|
275
|
+
metadata: {
|
|
276
|
+
createdAt: this.createdAt,
|
|
277
|
+
updatedAt: new Date().toISOString(),
|
|
278
|
+
passportCount: this.passports.size,
|
|
279
|
+
},
|
|
280
|
+
};
|
|
281
|
+
await this.storage.write(data);
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Ensure vault is unlocked before operations
|
|
285
|
+
*/
|
|
286
|
+
ensureUnlocked() {
|
|
287
|
+
if (!this.isUnlocked) {
|
|
288
|
+
throw new VaultError('Vault is locked', 'VAULT_LOCKED');
|
|
289
|
+
}
|
|
290
|
+
this.lastAccessedAt = new Date().toISOString();
|
|
291
|
+
}
|
|
292
|
+
// ============================================================================
|
|
293
|
+
// Passport Operations
|
|
294
|
+
// ============================================================================
|
|
295
|
+
/**
|
|
296
|
+
* Store a passport in the vault
|
|
297
|
+
*/
|
|
298
|
+
async storePassport(passport) {
|
|
299
|
+
this.ensureUnlocked();
|
|
300
|
+
this.passports.set(passport.id, passport);
|
|
301
|
+
await this.save();
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* Retrieve a passport by ID
|
|
305
|
+
*/
|
|
306
|
+
async retrievePassport(id) {
|
|
307
|
+
this.ensureUnlocked();
|
|
308
|
+
return this.passports.get(id) ?? null;
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* Delete a passport by ID
|
|
312
|
+
*/
|
|
313
|
+
async deletePassport(id) {
|
|
314
|
+
this.ensureUnlocked();
|
|
315
|
+
const deleted = this.passports.delete(id);
|
|
316
|
+
if (deleted) {
|
|
317
|
+
await this.save();
|
|
318
|
+
}
|
|
319
|
+
return deleted;
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Get all passports
|
|
323
|
+
*/
|
|
324
|
+
async getAllPassports() {
|
|
325
|
+
this.ensureUnlocked();
|
|
326
|
+
return Array.from(this.passports.values());
|
|
327
|
+
}
|
|
328
|
+
// ============================================================================
|
|
329
|
+
// Audit Log Operations
|
|
330
|
+
// ============================================================================
|
|
331
|
+
/**
|
|
332
|
+
* Add an entry to the audit log
|
|
333
|
+
*/
|
|
334
|
+
async addAuditEntry(entry) {
|
|
335
|
+
this.ensureUnlocked();
|
|
336
|
+
this.auditLog.push(entry);
|
|
337
|
+
await this.save();
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* Get audit log entries
|
|
341
|
+
*/
|
|
342
|
+
async getAuditLog(passportId) {
|
|
343
|
+
this.ensureUnlocked();
|
|
344
|
+
if (passportId) {
|
|
345
|
+
return this.auditLog.filter((e) => e.passportId === passportId);
|
|
346
|
+
}
|
|
347
|
+
return [...this.auditLog];
|
|
348
|
+
}
|
|
349
|
+
// ============================================================================
|
|
350
|
+
// Export Operations
|
|
351
|
+
// ============================================================================
|
|
352
|
+
/**
|
|
353
|
+
* Export vault data (with credentials masked)
|
|
354
|
+
*/
|
|
355
|
+
async exportVault(format) {
|
|
356
|
+
this.ensureUnlocked();
|
|
357
|
+
const maskedPassports = Array.from(this.passports.values()).map((p) => ({
|
|
358
|
+
...p,
|
|
359
|
+
credentialValue: maskValue(p.credentialValue),
|
|
360
|
+
}));
|
|
361
|
+
if (format === 'json') {
|
|
362
|
+
return JSON.stringify({
|
|
363
|
+
passports: maskedPassports,
|
|
364
|
+
auditLog: this.auditLog,
|
|
365
|
+
exportedAt: new Date().toISOString(),
|
|
366
|
+
}, null, 2);
|
|
367
|
+
}
|
|
368
|
+
// CSV format
|
|
369
|
+
const headers = [
|
|
370
|
+
'id',
|
|
371
|
+
'name',
|
|
372
|
+
'credentialType',
|
|
373
|
+
'visaType',
|
|
374
|
+
'status',
|
|
375
|
+
'platforms',
|
|
376
|
+
'humanOwner',
|
|
377
|
+
'validFrom',
|
|
378
|
+
'validUntil',
|
|
379
|
+
'tags',
|
|
380
|
+
];
|
|
381
|
+
const rows = maskedPassports.map((p) => [
|
|
382
|
+
p.id,
|
|
383
|
+
p.name,
|
|
384
|
+
p.credentialType,
|
|
385
|
+
p.visaType,
|
|
386
|
+
p.status,
|
|
387
|
+
p.platforms.join(';'),
|
|
388
|
+
p.humanOwner,
|
|
389
|
+
p.validFrom,
|
|
390
|
+
p.validUntil ?? '',
|
|
391
|
+
p.tags.join(';'),
|
|
392
|
+
].join(','));
|
|
393
|
+
return [headers.join(','), ...rows].join('\n');
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
// ============================================================================
|
|
397
|
+
// Vault Migration
|
|
398
|
+
// ============================================================================
|
|
399
|
+
/**
|
|
400
|
+
* Migrate a v1 (PBKDF2) vault to v2 (Scrypt).
|
|
401
|
+
*
|
|
402
|
+
* 1. Reads the vault file and checks its version.
|
|
403
|
+
* 2. Decrypts with the v1 KDF (PBKDF2).
|
|
404
|
+
* 3. Re-encrypts with the v2 KDF (Scrypt).
|
|
405
|
+
* 4. Writes the updated vault with version 2.
|
|
406
|
+
*
|
|
407
|
+
* The passphrase does not change — only the key derivation function is upgraded.
|
|
408
|
+
*/
|
|
409
|
+
export async function migrateVault(passphrase, vaultPath) {
|
|
410
|
+
const path = vaultPath ?? getDefaultVaultPath();
|
|
411
|
+
const storage = new FileSystemStorageBackend(path);
|
|
412
|
+
const data = await storage.read();
|
|
413
|
+
if (!data) {
|
|
414
|
+
throw new VaultError('Vault does not exist', 'VAULT_NOT_FOUND');
|
|
415
|
+
}
|
|
416
|
+
if (data.version >= VAULT_DATA_VERSION) {
|
|
417
|
+
return { migrated: false, fromVersion: data.version, toVersion: data.version };
|
|
418
|
+
}
|
|
419
|
+
const fromVersion = data.version;
|
|
420
|
+
// Decrypt with the old KDF
|
|
421
|
+
const salt = hexToBytes(data.salt);
|
|
422
|
+
const iv = hexToBytes(data.iv);
|
|
423
|
+
const oldKey = await deriveKey(passphrase, salt, fromVersion);
|
|
424
|
+
let passportsJson;
|
|
425
|
+
let auditJson;
|
|
426
|
+
try {
|
|
427
|
+
passportsJson = await decrypt(data.encryptedPassports, oldKey, iv);
|
|
428
|
+
auditJson = await decrypt(data.encryptedAuditLog, oldKey, iv);
|
|
429
|
+
}
|
|
430
|
+
catch {
|
|
431
|
+
throw new VaultError('Invalid passphrase', 'INVALID_PASSPHRASE');
|
|
432
|
+
}
|
|
433
|
+
// Re-encrypt with the new KDF (same salt, same IV — only the derived key changes)
|
|
434
|
+
const newSalt = getRandomBytes(32);
|
|
435
|
+
const newIv = getRandomBytes(12);
|
|
436
|
+
const newKey = await deriveKey(passphrase, newSalt, VAULT_DATA_VERSION);
|
|
437
|
+
const newData = {
|
|
438
|
+
version: VAULT_DATA_VERSION,
|
|
439
|
+
salt: bytesToHex(newSalt),
|
|
440
|
+
iv: bytesToHex(newIv),
|
|
441
|
+
encryptedPassports: await encrypt(passportsJson, newKey, newIv),
|
|
442
|
+
encryptedAuditLog: await encrypt(auditJson, newKey, newIv),
|
|
443
|
+
metadata: {
|
|
444
|
+
...data.metadata,
|
|
445
|
+
updatedAt: new Date().toISOString(),
|
|
446
|
+
},
|
|
447
|
+
};
|
|
448
|
+
await storage.write(newData);
|
|
449
|
+
return { migrated: true, fromVersion, toVersion: VAULT_DATA_VERSION };
|
|
450
|
+
}
|
|
451
|
+
// ============================================================================
|
|
452
|
+
// Factory Functions
|
|
453
|
+
// ============================================================================
|
|
454
|
+
/**
|
|
455
|
+
* Get the default vault path
|
|
456
|
+
*/
|
|
457
|
+
export function getDefaultVaultPath() {
|
|
458
|
+
const home = process.env.HOME ?? process.env.USERPROFILE ?? '.';
|
|
459
|
+
return `${home}/.id-wispera/vault.json`;
|
|
460
|
+
}
|
|
461
|
+
/**
|
|
462
|
+
* Initialize a new vault
|
|
463
|
+
*/
|
|
464
|
+
export async function initVault(passphrase, storagePath) {
|
|
465
|
+
const path = storagePath ?? getDefaultVaultPath();
|
|
466
|
+
const vault = new Vault({
|
|
467
|
+
storagePath: path,
|
|
468
|
+
storageType: 'filesystem',
|
|
469
|
+
});
|
|
470
|
+
await vault.init(passphrase);
|
|
471
|
+
return vault;
|
|
472
|
+
}
|
|
473
|
+
/**
|
|
474
|
+
* Unlock an existing vault
|
|
475
|
+
*/
|
|
476
|
+
export async function unlockVault(passphrase, storagePath) {
|
|
477
|
+
const path = storagePath ?? getDefaultVaultPath();
|
|
478
|
+
const vault = new Vault({
|
|
479
|
+
storagePath: path,
|
|
480
|
+
storageType: 'filesystem',
|
|
481
|
+
});
|
|
482
|
+
await vault.unlock(passphrase);
|
|
483
|
+
return vault;
|
|
484
|
+
}
|
|
485
|
+
/**
|
|
486
|
+
* Lock a vault
|
|
487
|
+
*/
|
|
488
|
+
export function lockVault(vault) {
|
|
489
|
+
vault.lock();
|
|
490
|
+
}
|
|
491
|
+
/**
|
|
492
|
+
* Check if a vault exists
|
|
493
|
+
*/
|
|
494
|
+
export async function vaultExists(storagePath) {
|
|
495
|
+
const path = storagePath ?? getDefaultVaultPath();
|
|
496
|
+
const storage = new FileSystemStorageBackend(path);
|
|
497
|
+
return storage.exists();
|
|
498
|
+
}
|
|
499
|
+
//# sourceMappingURL=vault.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vault.js","sourceRoot":"","sources":["../src/vault.ts"],"names":[],"mappings":"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"}
|