@sentinel-atl/hsm 0.1.1

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 ADDED
@@ -0,0 +1,59 @@
1
+ # @sentinel-atl/hsm
2
+
3
+ HSM and secure enclave KeyProvider backends for the Agent Trust Layer.
4
+
5
+ ## Providers
6
+
7
+ | Provider | Status | Dependencies |
8
+ |---|---|---|
9
+ | `EncryptedFileKeyProvider` | **Fully functional** | None (Node.js crypto) |
10
+ | `AWSCloudHSMKeyProvider` | Stub (interface ready) | `pkcs11js` |
11
+ | `AzureManagedHSMKeyProvider` | Stub (interface ready) | `@azure/keyvault-keys` |
12
+ | `PKCS11KeyProvider` | Stub (interface ready) | `pkcs11js` |
13
+
14
+ ## Install
15
+
16
+ ```bash
17
+ npm install @sentinel-atl/hsm
18
+ ```
19
+
20
+ ## EncryptedFileKeyProvider
21
+
22
+ Production-ready encrypted file storage using AES-256-GCM with scrypt key derivation.
23
+
24
+ ```ts
25
+ import { EncryptedFileKeyProvider } from '@sentinel-atl/hsm';
26
+
27
+ const provider = new EncryptedFileKeyProvider({
28
+ directory: './keys',
29
+ passphrase: process.env.KEY_PASSPHRASE!,
30
+ });
31
+
32
+ // Use as a drop-in replacement for InMemoryKeyProvider
33
+ const kp = await provider.generate('my-agent-key');
34
+ const sig = await provider.sign('my-agent-key', data);
35
+ ```
36
+
37
+ **Security properties:**
38
+ - AES-256-GCM authenticated encryption
39
+ - scrypt key derivation (N=16384, r=8, p=1)
40
+ - Random salt per key, random IV per encryption
41
+ - Path traversal prevention on key IDs
42
+
43
+ ## HSM Stubs
44
+
45
+ The HSM stubs implement the `KeyProvider` interface and throw informative errors telling you which SDK to install:
46
+
47
+ ```ts
48
+ import { AWSCloudHSMKeyProvider } from '@sentinel-atl/hsm';
49
+
50
+ const provider = new AWSCloudHSMKeyProvider({
51
+ clusterId: 'cluster-abc',
52
+ pkcs11LibPath: '/opt/cloudhsm/lib/libcloudhsm_pkcs11.so',
53
+ pin: process.env.HSM_PIN!,
54
+ });
55
+ ```
56
+
57
+ ## License
58
+
59
+ MIT
@@ -0,0 +1,125 @@
1
+ /**
2
+ * @sentinel-atl/hsm — HSM and secure KeyProvider backends.
3
+ *
4
+ * Provides production-grade KeyProvider implementations:
5
+ * - EncryptedFileKeyProvider — AES-256-GCM encrypted file storage (Node crypto)
6
+ * - AWSCloudHSMKeyProvider — AWS CloudHSM (stub, requires pkcs11js)
7
+ * - AzureManagedHSMKeyProvider — Azure Managed HSM (stub, requires @azure/keyvault-keys)
8
+ * - PKCS11KeyProvider — Generic PKCS#11 interface (stub, requires pkcs11js)
9
+ *
10
+ * The EncryptedFileKeyProvider is fully functional with zero external deps.
11
+ * HSM stubs provide the correct interface and throw clear "configure SDK" errors.
12
+ */
13
+ import type { KeyProvider } from '@sentinel-atl/core';
14
+ interface KeyPair {
15
+ publicKey: Uint8Array;
16
+ privateKey: Uint8Array;
17
+ }
18
+ export interface EncryptedFileConfig {
19
+ /** Directory to store encrypted key files */
20
+ directory: string;
21
+ /** Passphrase for key derivation (use a strong passphrase!) */
22
+ passphrase: string;
23
+ /** Optional: scrypt cost parameter (default: 2^14) */
24
+ scryptN?: number;
25
+ }
26
+ /**
27
+ * EncryptedFileKeyProvider — stores Ed25519 keys as AES-256-GCM encrypted files.
28
+ *
29
+ * Each key is stored as a separate .key file:
30
+ * {directory}/{id}.key → { salt, iv, tag, ciphertext } (JSON)
31
+ *
32
+ * Key derivation: scrypt(passphrase, salt) → 32-byte AES key
33
+ * Encryption: AES-256-GCM with random IV per key
34
+ */
35
+ export declare class EncryptedFileKeyProvider implements KeyProvider {
36
+ private directory;
37
+ private passphrase;
38
+ private scryptN;
39
+ private cache;
40
+ constructor(config: EncryptedFileConfig);
41
+ generate(id: string): Promise<KeyPair>;
42
+ sign(id: string, data: Uint8Array): Promise<Uint8Array>;
43
+ getPublicKey(id: string): Promise<Uint8Array>;
44
+ has(id: string): Promise<boolean>;
45
+ delete(id: string): Promise<void>;
46
+ list(): Promise<string[]>;
47
+ exportPrivateKey(id: string): Promise<Uint8Array>;
48
+ private keyPath;
49
+ private deriveKey;
50
+ private encryptAndStore;
51
+ private loadKey;
52
+ }
53
+ export interface AWSCloudHSMConfig {
54
+ /** CloudHSM cluster ID */
55
+ clusterId: string;
56
+ /** PKCS#11 library path (e.g., /opt/cloudhsm/lib/libcloudhsm_pkcs11.so) */
57
+ pkcs11LibPath: string;
58
+ /** HSM user PIN */
59
+ pin: string;
60
+ }
61
+ /**
62
+ * AWSCloudHSMKeyProvider — interface for AWS CloudHSM.
63
+ *
64
+ * Requires the `pkcs11js` npm package and a configured CloudHSM cluster.
65
+ * This stub provides the correct KeyProvider interface; actual HSM operations
66
+ * require the PKCS#11 library to be installed and configured.
67
+ */
68
+ export declare class AWSCloudHSMKeyProvider implements KeyProvider {
69
+ private config;
70
+ constructor(config: AWSCloudHSMConfig);
71
+ generate(id: string): Promise<KeyPair>;
72
+ sign(id: string, data: Uint8Array): Promise<Uint8Array>;
73
+ getPublicKey(id: string): Promise<Uint8Array>;
74
+ has(id: string): Promise<boolean>;
75
+ delete(id: string): Promise<void>;
76
+ list(): Promise<string[]>;
77
+ }
78
+ export interface AzureManagedHSMConfig {
79
+ /** HSM vault URL (e.g., https://myhsm.managedhsm.azure.net) */
80
+ vaultUrl: string;
81
+ /** Optional: Azure credential (DefaultAzureCredential used if omitted) */
82
+ credential?: unknown;
83
+ }
84
+ /**
85
+ * AzureManagedHSMKeyProvider — interface for Azure Managed HSM.
86
+ *
87
+ * Requires @azure/keyvault-keys and @azure/identity packages.
88
+ * Keys are stored in Azure Managed HSM; signing happens server-side.
89
+ */
90
+ export declare class AzureManagedHSMKeyProvider implements KeyProvider {
91
+ private config;
92
+ constructor(config: AzureManagedHSMConfig);
93
+ generate(id: string): Promise<KeyPair>;
94
+ sign(id: string, data: Uint8Array): Promise<Uint8Array>;
95
+ getPublicKey(id: string): Promise<Uint8Array>;
96
+ has(id: string): Promise<boolean>;
97
+ delete(id: string): Promise<void>;
98
+ list(): Promise<string[]>;
99
+ }
100
+ export interface PKCS11Config {
101
+ /** Path to the PKCS#11 shared library */
102
+ libraryPath: string;
103
+ /** Slot index to use */
104
+ slotIndex?: number;
105
+ /** User PIN for authentication */
106
+ pin: string;
107
+ }
108
+ /**
109
+ * PKCS11KeyProvider — generic PKCS#11 interface for any HSM.
110
+ *
111
+ * Requires the `pkcs11js` npm package and a PKCS#11-compatible HSM.
112
+ * Works with YubiKey, SoftHSM, Thales Luna, nCipher, etc.
113
+ */
114
+ export declare class PKCS11KeyProvider implements KeyProvider {
115
+ private config;
116
+ constructor(config: PKCS11Config);
117
+ generate(id: string): Promise<KeyPair>;
118
+ sign(id: string, data: Uint8Array): Promise<Uint8Array>;
119
+ getPublicKey(id: string): Promise<Uint8Array>;
120
+ has(id: string): Promise<boolean>;
121
+ delete(id: string): Promise<void>;
122
+ list(): Promise<string[]>;
123
+ }
124
+ export {};
125
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js ADDED
@@ -0,0 +1,225 @@
1
+ /**
2
+ * @sentinel-atl/hsm — HSM and secure KeyProvider backends.
3
+ *
4
+ * Provides production-grade KeyProvider implementations:
5
+ * - EncryptedFileKeyProvider — AES-256-GCM encrypted file storage (Node crypto)
6
+ * - AWSCloudHSMKeyProvider — AWS CloudHSM (stub, requires pkcs11js)
7
+ * - AzureManagedHSMKeyProvider — Azure Managed HSM (stub, requires @azure/keyvault-keys)
8
+ * - PKCS11KeyProvider — Generic PKCS#11 interface (stub, requires pkcs11js)
9
+ *
10
+ * The EncryptedFileKeyProvider is fully functional with zero external deps.
11
+ * HSM stubs provide the correct interface and throw clear "configure SDK" errors.
12
+ */
13
+ import { createCipheriv, createDecipheriv, randomBytes, scryptSync } from 'node:crypto';
14
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';
15
+ import { join } from 'node:path';
16
+ /**
17
+ * EncryptedFileKeyProvider — stores Ed25519 keys as AES-256-GCM encrypted files.
18
+ *
19
+ * Each key is stored as a separate .key file:
20
+ * {directory}/{id}.key → { salt, iv, tag, ciphertext } (JSON)
21
+ *
22
+ * Key derivation: scrypt(passphrase, salt) → 32-byte AES key
23
+ * Encryption: AES-256-GCM with random IV per key
24
+ */
25
+ export class EncryptedFileKeyProvider {
26
+ directory;
27
+ passphrase;
28
+ scryptN;
29
+ cache = new Map();
30
+ constructor(config) {
31
+ this.directory = config.directory;
32
+ this.passphrase = config.passphrase;
33
+ this.scryptN = config.scryptN ?? 16384; // 2^14
34
+ if (!existsSync(this.directory)) {
35
+ mkdirSync(this.directory, { recursive: true });
36
+ }
37
+ }
38
+ async generate(id) {
39
+ const ed = await import('@noble/ed25519');
40
+ const privKey = randomBytes(32);
41
+ const pubKey = await ed.getPublicKeyAsync(privKey);
42
+ const kp = { publicKey: pubKey, privateKey: new Uint8Array(privKey) };
43
+ this.encryptAndStore(id, kp);
44
+ this.cache.set(id, kp);
45
+ return kp;
46
+ }
47
+ async sign(id, data) {
48
+ const kp = await this.loadKey(id);
49
+ const ed = await import('@noble/ed25519');
50
+ return ed.signAsync(data, kp.privateKey);
51
+ }
52
+ async getPublicKey(id) {
53
+ const kp = await this.loadKey(id);
54
+ return kp.publicKey;
55
+ }
56
+ async has(id) {
57
+ if (this.cache.has(id))
58
+ return true;
59
+ return existsSync(this.keyPath(id));
60
+ }
61
+ async delete(id) {
62
+ this.cache.delete(id);
63
+ const path = this.keyPath(id);
64
+ if (existsSync(path)) {
65
+ const { unlinkSync } = await import('node:fs');
66
+ unlinkSync(path);
67
+ }
68
+ }
69
+ async list() {
70
+ const { readdirSync } = await import('node:fs');
71
+ const files = readdirSync(this.directory);
72
+ return files
73
+ .filter(f => f.endsWith('.key'))
74
+ .map(f => f.slice(0, -4));
75
+ }
76
+ async exportPrivateKey(id) {
77
+ const kp = await this.loadKey(id);
78
+ return kp.privateKey;
79
+ }
80
+ // ─── Internal helpers ────────────────────────────────────────
81
+ keyPath(id) {
82
+ // Sanitize id to prevent path traversal
83
+ const safeId = id.replace(/[^a-zA-Z0-9_-]/g, '_');
84
+ return join(this.directory, `${safeId}.key`);
85
+ }
86
+ deriveKey(salt) {
87
+ return scryptSync(this.passphrase, salt, 32, { N: this.scryptN, r: 8, p: 1 });
88
+ }
89
+ encryptAndStore(id, kp) {
90
+ const salt = randomBytes(16);
91
+ const aesKey = this.deriveKey(salt);
92
+ const iv = randomBytes(12);
93
+ const cipher = createCipheriv('aes-256-gcm', aesKey, iv);
94
+ // Concatenate pub + priv for storage
95
+ const plaintext = Buffer.concat([
96
+ Buffer.from(kp.publicKey),
97
+ Buffer.from(kp.privateKey),
98
+ ]);
99
+ const ciphertext = Buffer.concat([cipher.update(plaintext), cipher.final()]);
100
+ const tag = cipher.getAuthTag();
101
+ const stored = {
102
+ salt: salt.toString('hex'),
103
+ iv: iv.toString('hex'),
104
+ tag: tag.toString('hex'),
105
+ ciphertext: ciphertext.toString('hex'),
106
+ pubKeyLen: kp.publicKey.length,
107
+ };
108
+ writeFileSync(this.keyPath(id), JSON.stringify(stored), 'utf-8');
109
+ }
110
+ async loadKey(id) {
111
+ if (this.cache.has(id))
112
+ return this.cache.get(id);
113
+ const path = this.keyPath(id);
114
+ if (!existsSync(path))
115
+ throw new Error(`Key not found: ${id}`);
116
+ const raw = JSON.parse(readFileSync(path, 'utf-8'));
117
+ const salt = Buffer.from(raw.salt, 'hex');
118
+ const iv = Buffer.from(raw.iv, 'hex');
119
+ const tag = Buffer.from(raw.tag, 'hex');
120
+ const ciphertext = Buffer.from(raw.ciphertext, 'hex');
121
+ const aesKey = this.deriveKey(salt);
122
+ const decipher = createDecipheriv('aes-256-gcm', aesKey, iv);
123
+ decipher.setAuthTag(tag);
124
+ const plaintext = Buffer.concat([decipher.update(ciphertext), decipher.final()]);
125
+ const publicKey = new Uint8Array(plaintext.subarray(0, raw.pubKeyLen));
126
+ const privateKey = new Uint8Array(plaintext.subarray(raw.pubKeyLen));
127
+ const kp = { publicKey, privateKey };
128
+ this.cache.set(id, kp);
129
+ return kp;
130
+ }
131
+ }
132
+ /**
133
+ * AWSCloudHSMKeyProvider — interface for AWS CloudHSM.
134
+ *
135
+ * Requires the `pkcs11js` npm package and a configured CloudHSM cluster.
136
+ * This stub provides the correct KeyProvider interface; actual HSM operations
137
+ * require the PKCS#11 library to be installed and configured.
138
+ */
139
+ export class AWSCloudHSMKeyProvider {
140
+ config;
141
+ constructor(config) {
142
+ this.config = config;
143
+ }
144
+ async generate(id) {
145
+ throw new Error(`AWSCloudHSMKeyProvider.generate(): Requires pkcs11js package and CloudHSM cluster "${this.config.clusterId}". ` +
146
+ 'Install pkcs11js and configure your cluster to use this provider.');
147
+ }
148
+ async sign(id, data) {
149
+ throw new Error('AWSCloudHSMKeyProvider.sign(): Requires pkcs11js. Keys never leave the HSM.');
150
+ }
151
+ async getPublicKey(id) {
152
+ throw new Error('AWSCloudHSMKeyProvider.getPublicKey(): Requires pkcs11js.');
153
+ }
154
+ async has(id) {
155
+ throw new Error('AWSCloudHSMKeyProvider.has(): Requires pkcs11js.');
156
+ }
157
+ async delete(id) {
158
+ throw new Error('AWSCloudHSMKeyProvider.delete(): Requires pkcs11js.');
159
+ }
160
+ async list() {
161
+ throw new Error('AWSCloudHSMKeyProvider.list(): Requires pkcs11js.');
162
+ }
163
+ }
164
+ /**
165
+ * AzureManagedHSMKeyProvider — interface for Azure Managed HSM.
166
+ *
167
+ * Requires @azure/keyvault-keys and @azure/identity packages.
168
+ * Keys are stored in Azure Managed HSM; signing happens server-side.
169
+ */
170
+ export class AzureManagedHSMKeyProvider {
171
+ config;
172
+ constructor(config) {
173
+ this.config = config;
174
+ }
175
+ async generate(id) {
176
+ throw new Error(`AzureManagedHSMKeyProvider.generate(): Requires @azure/keyvault-keys. ` +
177
+ `HSM URL: ${this.config.vaultUrl}`);
178
+ }
179
+ async sign(id, data) {
180
+ throw new Error('AzureManagedHSMKeyProvider.sign(): Requires @azure/keyvault-keys. Signing happens server-side.');
181
+ }
182
+ async getPublicKey(id) {
183
+ throw new Error('AzureManagedHSMKeyProvider.getPublicKey(): Requires @azure/keyvault-keys.');
184
+ }
185
+ async has(id) {
186
+ throw new Error('AzureManagedHSMKeyProvider.has(): Requires @azure/keyvault-keys.');
187
+ }
188
+ async delete(id) {
189
+ throw new Error('AzureManagedHSMKeyProvider.delete(): Requires @azure/keyvault-keys.');
190
+ }
191
+ async list() {
192
+ throw new Error('AzureManagedHSMKeyProvider.list(): Requires @azure/keyvault-keys.');
193
+ }
194
+ }
195
+ /**
196
+ * PKCS11KeyProvider — generic PKCS#11 interface for any HSM.
197
+ *
198
+ * Requires the `pkcs11js` npm package and a PKCS#11-compatible HSM.
199
+ * Works with YubiKey, SoftHSM, Thales Luna, nCipher, etc.
200
+ */
201
+ export class PKCS11KeyProvider {
202
+ config;
203
+ constructor(config) {
204
+ this.config = config;
205
+ }
206
+ async generate(id) {
207
+ throw new Error(`PKCS11KeyProvider.generate(): Requires pkcs11js and library at "${this.config.libraryPath}".`);
208
+ }
209
+ async sign(id, data) {
210
+ throw new Error('PKCS11KeyProvider.sign(): Requires pkcs11js.');
211
+ }
212
+ async getPublicKey(id) {
213
+ throw new Error('PKCS11KeyProvider.getPublicKey(): Requires pkcs11js.');
214
+ }
215
+ async has(id) {
216
+ throw new Error('PKCS11KeyProvider.has(): Requires pkcs11js.');
217
+ }
218
+ async delete(id) {
219
+ throw new Error('PKCS11KeyProvider.delete(): Requires pkcs11js.');
220
+ }
221
+ async list() {
222
+ throw new Error('PKCS11KeyProvider.list(): Requires pkcs11js.');
223
+ }
224
+ }
225
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,41 @@
1
+ {
2
+ "name": "@sentinel-atl/hsm",
3
+ "version": "0.1.1",
4
+ "description": "HSM and secure enclave KeyProvider backends — AWS CloudHSM, Azure Managed HSM, PKCS#11, and encrypted file storage",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "scripts": {
9
+ "build": "tsc",
10
+ "test": "vitest run"
11
+ },
12
+ "dependencies": {
13
+ "@sentinel-atl/core": "*"
14
+ },
15
+ "devDependencies": {
16
+ "typescript": "^5.7.0"
17
+ },
18
+ "files": [
19
+ "dist",
20
+ "README.md"
21
+ ],
22
+ "license": "Apache-2.0",
23
+ "repository": {
24
+ "type": "git",
25
+ "url": "https://github.com/sentinel-atl/project-sentinel.git",
26
+ "directory": "packages/hsm"
27
+ },
28
+ "keywords": [
29
+ "ai-agent",
30
+ "trust",
31
+ "identity",
32
+ "did",
33
+ "verifiable-credentials",
34
+ "mcp",
35
+ "security"
36
+ ],
37
+ "homepage": "https://github.com/sentinel-atl/project-sentinel#readme",
38
+ "bugs": {
39
+ "url": "https://github.com/sentinel-atl/project-sentinel/issues"
40
+ }
41
+ }