@secfn/core 0.0.1 → 0.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/README.md +30 -322
- package/dist/encryption.d.ts +8 -0
- package/dist/encryption.d.ts.map +1 -0
- package/dist/encryption.js +76 -0
- package/dist/encryption.js.map +1 -0
- package/dist/errors.d.ts +24 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +47 -0
- package/dist/errors.js.map +1 -0
- package/dist/id.d.ts +3 -0
- package/dist/id.d.ts.map +1 -0
- package/dist/id.js +11 -0
- package/dist/id.js.map +1 -0
- package/dist/index.d.ts +9 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -11
- package/dist/index.js.map +1 -1
- package/dist/scanner/reporters.d.ts +14 -0
- package/dist/scanner/reporters.d.ts.map +1 -0
- package/dist/scanner/reporters.js +85 -0
- package/dist/scanner/reporters.js.map +1 -0
- package/dist/scanner/rules.d.ts +24 -0
- package/dist/scanner/rules.d.ts.map +1 -0
- package/dist/scanner/rules.js +141 -0
- package/dist/scanner/rules.js.map +1 -0
- package/dist/scanner/scanner.d.ts +25 -0
- package/dist/scanner/scanner.d.ts.map +1 -0
- package/dist/scanner/scanner.js +73 -0
- package/dist/scanner/scanner.js.map +1 -0
- package/dist/scanner/utils.d.ts +15 -0
- package/dist/scanner/utils.d.ts.map +1 -0
- package/dist/scanner/utils.js +40 -0
- package/dist/scanner/utils.js.map +1 -0
- package/dist/schema.d.ts +9 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +246 -0
- package/dist/schema.js.map +1 -0
- package/dist/types.d.ts +258 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +29 -26
- package/dist/access-control/rbac.d.ts +0 -48
- package/dist/access-control/rbac.d.ts.map +0 -1
- package/dist/access-control/rbac.js +0 -203
- package/dist/access-control/rbac.js.map +0 -1
- package/dist/core/secfn.d.ts +0 -28
- package/dist/core/secfn.d.ts.map +0 -1
- package/dist/core/secfn.js +0 -73
- package/dist/core/secfn.js.map +0 -1
- package/dist/monitoring/security-monitor.d.ts +0 -46
- package/dist/monitoring/security-monitor.d.ts.map +0 -1
- package/dist/monitoring/security-monitor.js +0 -172
- package/dist/monitoring/security-monitor.js.map +0 -1
- package/dist/rate-limiting/rate-limiter.d.ts +0 -31
- package/dist/rate-limiting/rate-limiter.d.ts.map +0 -1
- package/dist/rate-limiting/rate-limiter.js +0 -140
- package/dist/rate-limiting/rate-limiter.js.map +0 -1
- package/dist/scanning/patterns.d.ts +0 -3
- package/dist/scanning/patterns.d.ts.map +0 -1
- package/dist/scanning/patterns.js +0 -139
- package/dist/scanning/patterns.js.map +0 -1
- package/dist/scanning/scanner.d.ts +0 -36
- package/dist/scanning/scanner.d.ts.map +0 -1
- package/dist/scanning/scanner.js +0 -152
- package/dist/scanning/scanner.js.map +0 -1
- package/dist/secrets/encryption.d.ts +0 -17
- package/dist/secrets/encryption.d.ts.map +0 -1
- package/dist/secrets/encryption.js +0 -47
- package/dist/secrets/encryption.js.map +0 -1
- package/dist/secrets/vault.d.ts +0 -43
- package/dist/secrets/vault.d.ts.map +0 -1
- package/dist/secrets/vault.js +0 -126
- package/dist/secrets/vault.js.map +0 -1
- package/dist/storage/indexeddb-storage.d.ts +0 -37
- package/dist/storage/indexeddb-storage.d.ts.map +0 -1
- package/dist/storage/indexeddb-storage.js +0 -284
- package/dist/storage/indexeddb-storage.js.map +0 -1
- package/dist/types/index.d.ts +0 -189
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js +0 -2
- package/dist/types/index.js.map +0 -1
- package/dist/utils/helpers.d.ts +0 -8
- package/dist/utils/helpers.d.ts.map +0 -1
- package/dist/utils/helpers.js +0 -73
- package/dist/utils/helpers.js.map +0 -1
- package/examples/basic-usage.ts +0 -143
- package/src/access-control/rbac.ts +0 -271
- package/src/core/secfn.ts +0 -90
- package/src/index.ts +0 -27
- package/src/monitoring/security-monitor.ts +0 -245
- package/src/rate-limiting/rate-limiter.ts +0 -181
- package/src/scanning/patterns.ts +0 -140
- package/src/scanning/scanner.ts +0 -199
- package/src/secrets/encryption.ts +0 -74
- package/src/secrets/vault.ts +0 -187
- package/src/storage/indexeddb-storage.ts +0 -355
- package/src/types/index.ts +0 -213
- package/src/utils/helpers.ts +0 -84
- package/tsconfig.json +0 -26
package/README.md
CHANGED
|
@@ -1,334 +1,42 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @secfn/core
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Core contracts and pure utilities for SecFn V1.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
`@secfn/core` intentionally contains no database adapter, HTTP router, or framework integration. It provides the shared types that `@secfn/server`, `@secfn/runtime`, and `@secfn/cli` build on.
|
|
6
6
|
|
|
7
|
-
##
|
|
7
|
+
## Exports
|
|
8
8
|
|
|
9
|
-
-
|
|
10
|
-
-
|
|
11
|
-
-
|
|
12
|
-
-
|
|
13
|
-
-
|
|
14
|
-
-
|
|
15
|
-
-
|
|
9
|
+
- Encryption primitives using AES-256-GCM with per-record IV and salt.
|
|
10
|
+
- `KeyProvider` and `createStaticKeyProvider` for default env/master-key workflows.
|
|
11
|
+
- AAD helpers binding encrypted versions to tenant, namespace, secret id, and version.
|
|
12
|
+
- Scanner interfaces, default secret rule pack, scanner engine, and table/JSON/SARIF reporters.
|
|
13
|
+
- RBAC, audit event, secret, service token, runtime, and server config types.
|
|
14
|
+
- `SecFnError` variants.
|
|
15
|
+
- `getSecFnSchema()` for `@superfunctions/db` schema discovery.
|
|
16
16
|
|
|
17
|
-
##
|
|
17
|
+
## Example
|
|
18
18
|
|
|
19
|
-
```
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
const secFn = createSecFn({
|
|
29
|
-
namespace: 'my-app',
|
|
30
|
-
masterKey: process.env.MASTER_KEY,
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
await secFn.initialize();
|
|
34
|
-
|
|
35
|
-
const vault = secFn.createSecretsVault();
|
|
36
|
-
await vault.set('api_key', 'secret-value', {
|
|
37
|
-
tags: ['production'],
|
|
38
|
-
environment: 'production',
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
const secret = await vault.get('api_key');
|
|
42
|
-
console.log('Retrieved:', secret);
|
|
43
|
-
|
|
44
|
-
await secFn.destroy();
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
## Core Components
|
|
48
|
-
|
|
49
|
-
### 1. Secrets Vault
|
|
19
|
+
```ts
|
|
20
|
+
import {
|
|
21
|
+
buildSecretAad,
|
|
22
|
+
createStaticKeyProvider,
|
|
23
|
+
decryptSecret,
|
|
24
|
+
encryptSecret,
|
|
25
|
+
getSecFnSchema,
|
|
26
|
+
} from "@secfn/core";
|
|
50
27
|
|
|
51
|
-
|
|
28
|
+
const keyProvider = createStaticKeyProvider(process.env.SECFN_MASTER_KEY!, "env:main");
|
|
52
29
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
environment: 'production',
|
|
59
|
-
expiresAt: Date.now() + 90 * 24 * 60 * 60 * 1000,
|
|
60
|
-
rotateEvery: 90 * 24 * 60 * 60 * 1000,
|
|
30
|
+
const aad = buildSecretAad({
|
|
31
|
+
tenantId: "acme",
|
|
32
|
+
namespace: "web",
|
|
33
|
+
secretId: "secret_123",
|
|
34
|
+
version: 1,
|
|
61
35
|
});
|
|
62
36
|
|
|
63
|
-
const
|
|
64
|
-
|
|
65
|
-
const
|
|
66
|
-
|
|
67
|
-
await vault.rotate('stripe_api_key', 'sk_live_new...');
|
|
68
|
-
|
|
69
|
-
const accessLog = await vault.getAccessLog('stripe_api_key', 100);
|
|
37
|
+
const encrypted = await encryptSecret("plain", keyProvider, aad);
|
|
38
|
+
const plain = await decryptSecret(encrypted, keyProvider, aad);
|
|
39
|
+
const schema = getSecFnSchema();
|
|
70
40
|
```
|
|
71
41
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
Detect hardcoded secrets in source code with 20+ built-in patterns.
|
|
75
|
-
|
|
76
|
-
```typescript
|
|
77
|
-
const scanner = secFn.createSecretScanner({
|
|
78
|
-
excludePaths: ['node_modules/**', 'dist/**'],
|
|
79
|
-
minEntropy: 3.5,
|
|
80
|
-
});
|
|
81
|
-
|
|
82
|
-
const results = await scanner.scanDirectory('./src');
|
|
83
|
-
|
|
84
|
-
results.forEach(result => {
|
|
85
|
-
console.log(`${result.severity}: ${result.pattern} in ${result.file}:${result.line}`);
|
|
86
|
-
console.log(` Match: ${result.redactedMatch}`);
|
|
87
|
-
});
|
|
88
|
-
|
|
89
|
-
const gitResults = await scanner.scanGitHistory({
|
|
90
|
-
branch: 'main',
|
|
91
|
-
commits: 100,
|
|
92
|
-
});
|
|
93
|
-
|
|
94
|
-
scanner.addPattern({
|
|
95
|
-
name: 'Custom Secret',
|
|
96
|
-
pattern: /custom_secret_[a-zA-Z0-9]{32}/g,
|
|
97
|
-
entropy: 4.0,
|
|
98
|
-
description: 'Custom application secret',
|
|
99
|
-
severity: 'high',
|
|
100
|
-
});
|
|
101
|
-
```
|
|
102
|
-
|
|
103
|
-
**Built-in Secret Patterns:**
|
|
104
|
-
- AWS Access Keys, Secret Keys
|
|
105
|
-
- GitHub Tokens
|
|
106
|
-
- Stripe API Keys
|
|
107
|
-
- OpenAI & Anthropic API Keys
|
|
108
|
-
- Google API Keys
|
|
109
|
-
- Slack Tokens
|
|
110
|
-
- NPM Tokens
|
|
111
|
-
- JWT Tokens
|
|
112
|
-
- Database Connection Strings
|
|
113
|
-
- Private Keys (RSA, OpenSSH, DSA, EC, PGP)
|
|
114
|
-
- And many more...
|
|
115
|
-
|
|
116
|
-
### 3. Access Control (RBAC)
|
|
117
|
-
|
|
118
|
-
Fine-grained role-based access control with permission caching.
|
|
119
|
-
|
|
120
|
-
```typescript
|
|
121
|
-
const access = secFn.createAccessControl();
|
|
122
|
-
|
|
123
|
-
await access.createRole({
|
|
124
|
-
name: 'editor',
|
|
125
|
-
description: 'Can edit projects and files',
|
|
126
|
-
permissions: ['project:read', 'project:write', 'file:read', 'file:write'],
|
|
127
|
-
});
|
|
128
|
-
|
|
129
|
-
await access.createRole({
|
|
130
|
-
name: 'admin',
|
|
131
|
-
description: 'Full system access',
|
|
132
|
-
permissions: ['*:*'],
|
|
133
|
-
});
|
|
134
|
-
|
|
135
|
-
await access.assignRole('user_123', 'editor', {
|
|
136
|
-
resourceIds: ['project_abc', 'project_def'],
|
|
137
|
-
});
|
|
138
|
-
|
|
139
|
-
const allowed = await access.check({
|
|
140
|
-
userId: 'user_123',
|
|
141
|
-
action: 'project:write',
|
|
142
|
-
resourceId: 'project_abc',
|
|
143
|
-
});
|
|
144
|
-
|
|
145
|
-
const permissions = await access.getUserPermissions('user_123');
|
|
146
|
-
```
|
|
147
|
-
|
|
148
|
-
### 4. Rate Limiting
|
|
149
|
-
|
|
150
|
-
Protect against brute force and API abuse with token bucket algorithm.
|
|
151
|
-
|
|
152
|
-
```typescript
|
|
153
|
-
const limiter = secFn.createRateLimiter({
|
|
154
|
-
rules: {
|
|
155
|
-
global: { requests: 1000, window: 60000 },
|
|
156
|
-
perUser: { requests: 100, window: 60000 },
|
|
157
|
-
perIP: { requests: 50, window: 60000, blockDuration: 300000 },
|
|
158
|
-
perEndpoint: {
|
|
159
|
-
'/api/login': { requests: 5, window: 300000 },
|
|
160
|
-
'/api/search': { requests: 100, window: 60000 },
|
|
161
|
-
},
|
|
162
|
-
},
|
|
163
|
-
onLimitExceeded: async (violation) => {
|
|
164
|
-
console.warn(`Rate limit exceeded for ${violation.ip}`);
|
|
165
|
-
},
|
|
166
|
-
});
|
|
167
|
-
|
|
168
|
-
const result = await limiter.check({
|
|
169
|
-
userId: 'user_123',
|
|
170
|
-
ip: '192.168.1.1',
|
|
171
|
-
endpoint: '/api/search',
|
|
172
|
-
});
|
|
173
|
-
|
|
174
|
-
if (!result.allowed) {
|
|
175
|
-
throw new Error(`Rate limit exceeded. Retry after ${result.retryAfter}ms`);
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
await limiter.resetUser('user_123');
|
|
179
|
-
await limiter.unblock('ip:192.168.1.1');
|
|
180
|
-
```
|
|
181
|
-
|
|
182
|
-
### 5. Security Monitoring
|
|
183
|
-
|
|
184
|
-
Comprehensive event logging with metrics and anomaly detection.
|
|
185
|
-
|
|
186
|
-
```typescript
|
|
187
|
-
const monitoring = secFn.createMonitoring({
|
|
188
|
-
retention: 90 * 24 * 60 * 60 * 1000,
|
|
189
|
-
anomalyDetection: {
|
|
190
|
-
enabled: true,
|
|
191
|
-
sensitivity: 0.8,
|
|
192
|
-
},
|
|
193
|
-
});
|
|
194
|
-
|
|
195
|
-
await monitoring.logEvent({
|
|
196
|
-
type: 'auth_failure',
|
|
197
|
-
severity: 'medium',
|
|
198
|
-
userId: 'user_123',
|
|
199
|
-
ip: '192.168.1.1',
|
|
200
|
-
resource: '/api/login',
|
|
201
|
-
action: 'login',
|
|
202
|
-
metadata: {
|
|
203
|
-
reason: 'invalid_password',
|
|
204
|
-
attemptCount: 3,
|
|
205
|
-
},
|
|
206
|
-
});
|
|
207
|
-
|
|
208
|
-
const events = await monitoring.queryEvents({
|
|
209
|
-
type: 'auth_failure',
|
|
210
|
-
severity: ['high', 'critical'],
|
|
211
|
-
startDate: Date.now() - 24 * 60 * 60 * 1000,
|
|
212
|
-
});
|
|
213
|
-
|
|
214
|
-
const metrics = await monitoring.getMetrics({
|
|
215
|
-
start: Date.now() - 7 * 24 * 60 * 60 * 1000,
|
|
216
|
-
end: Date.now(),
|
|
217
|
-
});
|
|
218
|
-
|
|
219
|
-
console.log('Total events:', metrics.totalEvents);
|
|
220
|
-
console.log('Events by type:', metrics.eventsByType);
|
|
221
|
-
console.log('Anomalies:', metrics.anomalies);
|
|
222
|
-
|
|
223
|
-
await monitoring.resolveEvent('event_123', {
|
|
224
|
-
resolvedBy: 'admin_456',
|
|
225
|
-
notes: 'False positive',
|
|
226
|
-
});
|
|
227
|
-
```
|
|
228
|
-
|
|
229
|
-
## Storage
|
|
230
|
-
|
|
231
|
-
SecFn uses IndexedDB for browser/local storage with no external dependencies.
|
|
232
|
-
|
|
233
|
-
```typescript
|
|
234
|
-
const secFn = createSecFn({
|
|
235
|
-
storage: {
|
|
236
|
-
type: 'indexeddb',
|
|
237
|
-
dbName: 'my-app-security',
|
|
238
|
-
retentionDays: 90,
|
|
239
|
-
},
|
|
240
|
-
});
|
|
241
|
-
```
|
|
242
|
-
|
|
243
|
-
**Storage Schema:**
|
|
244
|
-
- `secfn_secrets` - Encrypted secrets
|
|
245
|
-
- `secfn_secret_access` - Access logs
|
|
246
|
-
- `secfn_roles` - Role definitions
|
|
247
|
-
- `secfn_user_roles` - User-role assignments
|
|
248
|
-
- `secfn_security_events` - Security events
|
|
249
|
-
- `secfn_rate_limits` - Rate limit tracking
|
|
250
|
-
- `secfn_scan_results` - Secret scan results
|
|
251
|
-
|
|
252
|
-
## Performance
|
|
253
|
-
|
|
254
|
-
**V0 Benchmarks:**
|
|
255
|
-
- Scan 10,000 files for secrets: <10s
|
|
256
|
-
- Rate limit check: <5ms
|
|
257
|
-
- Access control check: <10ms (with cache)
|
|
258
|
-
- Log 1,000 security events: <500ms
|
|
259
|
-
- Query 10,000 events: <100ms
|
|
260
|
-
- Encrypt/decrypt secret: <10ms
|
|
261
|
-
|
|
262
|
-
## Examples
|
|
263
|
-
|
|
264
|
-
See `examples/basic-usage.ts` for a comprehensive demonstration of all features.
|
|
265
|
-
|
|
266
|
-
```bash
|
|
267
|
-
npm run build
|
|
268
|
-
node dist/examples/basic-usage.js
|
|
269
|
-
```
|
|
270
|
-
|
|
271
|
-
## Development
|
|
272
|
-
|
|
273
|
-
```bash
|
|
274
|
-
npm install
|
|
275
|
-
|
|
276
|
-
npm run build
|
|
277
|
-
|
|
278
|
-
npm run build:watch
|
|
279
|
-
|
|
280
|
-
npm test
|
|
281
|
-
|
|
282
|
-
npm run test:watch
|
|
283
|
-
|
|
284
|
-
npm run test:coverage
|
|
285
|
-
|
|
286
|
-
npm run typecheck
|
|
287
|
-
|
|
288
|
-
npm run lint
|
|
289
|
-
```
|
|
290
|
-
|
|
291
|
-
## Architecture
|
|
292
|
-
|
|
293
|
-
```
|
|
294
|
-
secfn/
|
|
295
|
-
├── storage/ # IndexedDB persistence
|
|
296
|
-
├── secrets/ # Vault & encryption
|
|
297
|
-
├── scanning/ # Secret detection
|
|
298
|
-
├── access-control/ # RBAC system
|
|
299
|
-
├── rate-limiting/ # Request throttling
|
|
300
|
-
├── monitoring/ # Event logging
|
|
301
|
-
└── core/ # Main orchestrator
|
|
302
|
-
```
|
|
303
|
-
|
|
304
|
-
## Security Best Practices
|
|
305
|
-
|
|
306
|
-
1. **Master Key**: Always use a strong, randomly generated master key in production
|
|
307
|
-
2. **Rotation**: Enable automatic secret rotation for sensitive credentials
|
|
308
|
-
3. **Monitoring**: Review security events and anomalies regularly
|
|
309
|
-
4. **Access Control**: Apply principle of least privilege
|
|
310
|
-
5. **Rate Limiting**: Configure appropriate limits for your use case
|
|
311
|
-
6. **Scanning**: Integrate secret scanning into your CI/CD pipeline
|
|
312
|
-
|
|
313
|
-
## Roadmap
|
|
314
|
-
|
|
315
|
-
- [ ] File system storage backend
|
|
316
|
-
- [ ] Database adapter support (@superfunctions/db)
|
|
317
|
-
- [ ] Vulnerability scanning (SQL injection, XSS, etc.)
|
|
318
|
-
- [ ] Security middleware for Express/Hono/Fastify
|
|
319
|
-
- [ ] HTML security dashboard
|
|
320
|
-
- [ ] CLI tools
|
|
321
|
-
- [ ] Real-time alert notifications
|
|
322
|
-
- [ ] Advanced anomaly detection with ML
|
|
323
|
-
|
|
324
|
-
## License
|
|
325
|
-
|
|
326
|
-
MIT
|
|
327
|
-
|
|
328
|
-
## Contributing
|
|
329
|
-
|
|
330
|
-
Contributions welcome! This is part of the super-functions ecosystem.
|
|
331
|
-
|
|
332
|
-
## Support
|
|
333
|
-
|
|
334
|
-
For issues and questions, please open an issue on GitHub.
|
|
42
|
+
Production storage, admin routes, runtime routes, RBAC services, rate limiting, and audit persistence live in `@secfn/server`.
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { EncryptedSecretPayload, KeyProvider, SecretAadInput } from "./types.js";
|
|
2
|
+
export declare function createStaticKeyProvider(secret: string | Uint8Array, keyId?: string): KeyProvider;
|
|
3
|
+
export declare function buildSecretAad(input: SecretAadInput): string;
|
|
4
|
+
export declare function encryptSecret(plaintext: string, keyProvider: KeyProvider, aad: string): Promise<EncryptedSecretPayload>;
|
|
5
|
+
export declare function decryptSecret(payload: EncryptedSecretPayload, keyProvider: KeyProvider, aad: string): Promise<string>;
|
|
6
|
+
export declare function hashToken(token: string): string;
|
|
7
|
+
export declare function verifyTokenHash(token: string, expectedHash: string): boolean;
|
|
8
|
+
//# sourceMappingURL=encryption.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encryption.d.ts","sourceRoot":"","sources":["../src/encryption.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EACV,sBAAsB,EAEtB,WAAW,EACX,cAAc,EACf,MAAM,YAAY,CAAC;AAQpB,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,EAAE,KAAK,SAAY,GAAG,WAAW,CAInG;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,CAO5D;AAED,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,WAAW,EACxB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,sBAAsB,CAAC,CAqBjC;AAED,wBAAsB,aAAa,CACjC,OAAO,EAAE,sBAAsB,EAC/B,WAAW,EAAE,WAAW,EACxB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,MAAM,CAAC,CAwBjB;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAI5E"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { createCipheriv, createDecipheriv, pbkdf2Sync, randomBytes, timingSafeEqual, createHash, } from "node:crypto";
|
|
2
|
+
import { SecFnEncryptionError } from "./errors.js";
|
|
3
|
+
const ALGORITHM = "aes-256-gcm";
|
|
4
|
+
const ITERATIONS = 210_000;
|
|
5
|
+
const KEY_LENGTH = 32;
|
|
6
|
+
const IV_LENGTH = 12;
|
|
7
|
+
const SALT_LENGTH = 16;
|
|
8
|
+
export function createStaticKeyProvider(secret, keyId = "default") {
|
|
9
|
+
return {
|
|
10
|
+
resolveKey: () => ({ keyId, secret }),
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
export function buildSecretAad(input) {
|
|
14
|
+
return JSON.stringify({
|
|
15
|
+
tenantId: input.tenantId ?? null,
|
|
16
|
+
namespace: input.namespace ?? null,
|
|
17
|
+
secretId: input.secretId,
|
|
18
|
+
version: input.version,
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
export async function encryptSecret(plaintext, keyProvider, aad) {
|
|
22
|
+
const material = await keyProvider.resolveKey({ purpose: "encrypt" });
|
|
23
|
+
const salt = randomBytes(SALT_LENGTH);
|
|
24
|
+
const iv = randomBytes(IV_LENGTH);
|
|
25
|
+
const key = deriveKey(material, salt);
|
|
26
|
+
const cipher = createCipheriv(ALGORITHM, key, iv);
|
|
27
|
+
cipher.setAAD(Buffer.from(aad, "utf8"));
|
|
28
|
+
const ciphertext = Buffer.concat([
|
|
29
|
+
cipher.update(plaintext, "utf8"),
|
|
30
|
+
cipher.final(),
|
|
31
|
+
]);
|
|
32
|
+
return {
|
|
33
|
+
algorithm: "AES-256-GCM",
|
|
34
|
+
keyId: material.keyId,
|
|
35
|
+
iv: iv.toString("base64url"),
|
|
36
|
+
salt: salt.toString("base64url"),
|
|
37
|
+
authTag: cipher.getAuthTag().toString("base64url"),
|
|
38
|
+
ciphertext: ciphertext.toString("base64url"),
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
export async function decryptSecret(payload, keyProvider, aad) {
|
|
42
|
+
try {
|
|
43
|
+
const material = await keyProvider.resolveKey({
|
|
44
|
+
keyId: payload.keyId,
|
|
45
|
+
purpose: "decrypt",
|
|
46
|
+
});
|
|
47
|
+
const key = deriveKey(material, Buffer.from(payload.salt, "base64url"));
|
|
48
|
+
const decipher = createDecipheriv(ALGORITHM, key, Buffer.from(payload.iv, "base64url"));
|
|
49
|
+
decipher.setAAD(Buffer.from(aad, "utf8"));
|
|
50
|
+
decipher.setAuthTag(Buffer.from(payload.authTag, "base64url"));
|
|
51
|
+
return Buffer.concat([
|
|
52
|
+
decipher.update(Buffer.from(payload.ciphertext, "base64url")),
|
|
53
|
+
decipher.final(),
|
|
54
|
+
]).toString("utf8");
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
throw new SecFnEncryptionError("Secret decryption failed", {
|
|
58
|
+
cause: error instanceof Error ? error.message : String(error),
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
export function hashToken(token) {
|
|
63
|
+
return createHash("sha256").update(token, "utf8").digest("hex");
|
|
64
|
+
}
|
|
65
|
+
export function verifyTokenHash(token, expectedHash) {
|
|
66
|
+
const actual = Buffer.from(hashToken(token), "hex");
|
|
67
|
+
const expected = Buffer.from(expectedHash, "hex");
|
|
68
|
+
return actual.length === expected.length && timingSafeEqual(actual, expected);
|
|
69
|
+
}
|
|
70
|
+
function deriveKey(material, salt) {
|
|
71
|
+
const secret = typeof material.secret === "string"
|
|
72
|
+
? Buffer.from(material.secret, "utf8")
|
|
73
|
+
: Buffer.from(material.secret);
|
|
74
|
+
return pbkdf2Sync(secret, salt, ITERATIONS, KEY_LENGTH, "sha256");
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=encryption.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encryption.js","sourceRoot":"","sources":["../src/encryption.ts"],"names":[],"mappings":"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"}
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export declare class SecFnError extends Error {
|
|
2
|
+
readonly code: string;
|
|
3
|
+
readonly details?: Record<string, unknown> | undefined;
|
|
4
|
+
constructor(message: string, code: string, details?: Record<string, unknown> | undefined);
|
|
5
|
+
}
|
|
6
|
+
export declare class SecFnConfigError extends SecFnError {
|
|
7
|
+
constructor(message: string, details?: Record<string, unknown>);
|
|
8
|
+
}
|
|
9
|
+
export declare class SecFnUnauthorizedError extends SecFnError {
|
|
10
|
+
constructor(message?: string, details?: Record<string, unknown>);
|
|
11
|
+
}
|
|
12
|
+
export declare class SecFnForbiddenError extends SecFnError {
|
|
13
|
+
constructor(message?: string, details?: Record<string, unknown>);
|
|
14
|
+
}
|
|
15
|
+
export declare class SecFnNotFoundError extends SecFnError {
|
|
16
|
+
constructor(message?: string, details?: Record<string, unknown>);
|
|
17
|
+
}
|
|
18
|
+
export declare class SecFnValidationError extends SecFnError {
|
|
19
|
+
constructor(message?: string, details?: Record<string, unknown>);
|
|
20
|
+
}
|
|
21
|
+
export declare class SecFnEncryptionError extends SecFnError {
|
|
22
|
+
constructor(message?: string, details?: Record<string, unknown>);
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,UAAW,SAAQ,KAAK;IAGjC,QAAQ,CAAC,IAAI,EAAE,MAAM;IACrB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;gBAF1C,OAAO,EAAE,MAAM,EACN,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,YAAA;CAK7C;AAED,qBAAa,gBAAiB,SAAQ,UAAU;gBAClC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAI/D;AAED,qBAAa,sBAAuB,SAAQ,UAAU;gBACxC,OAAO,SAAiB,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAIxE;AAED,qBAAa,mBAAoB,SAAQ,UAAU;gBACrC,OAAO,SAAc,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAIrE;AAED,qBAAa,kBAAmB,SAAQ,UAAU;gBACpC,OAAO,SAAc,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAIrE;AAED,qBAAa,oBAAqB,SAAQ,UAAU;gBACtC,OAAO,SAAkB,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAIzE;AAED,qBAAa,oBAAqB,SAAQ,UAAU;gBACtC,OAAO,SAA6B,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAIpF"}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
export class SecFnError extends Error {
|
|
2
|
+
code;
|
|
3
|
+
details;
|
|
4
|
+
constructor(message, code, details) {
|
|
5
|
+
super(message);
|
|
6
|
+
this.code = code;
|
|
7
|
+
this.details = details;
|
|
8
|
+
this.name = "SecFnError";
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export class SecFnConfigError extends SecFnError {
|
|
12
|
+
constructor(message, details) {
|
|
13
|
+
super(message, "SECFN_CONFIG_INVALID", details);
|
|
14
|
+
this.name = "SecFnConfigError";
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export class SecFnUnauthorizedError extends SecFnError {
|
|
18
|
+
constructor(message = "Unauthorized", details) {
|
|
19
|
+
super(message, "SECFN_UNAUTHORIZED", details);
|
|
20
|
+
this.name = "SecFnUnauthorizedError";
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export class SecFnForbiddenError extends SecFnError {
|
|
24
|
+
constructor(message = "Forbidden", details) {
|
|
25
|
+
super(message, "SECFN_FORBIDDEN", details);
|
|
26
|
+
this.name = "SecFnForbiddenError";
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
export class SecFnNotFoundError extends SecFnError {
|
|
30
|
+
constructor(message = "Not found", details) {
|
|
31
|
+
super(message, "SECFN_NOT_FOUND", details);
|
|
32
|
+
this.name = "SecFnNotFoundError";
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
export class SecFnValidationError extends SecFnError {
|
|
36
|
+
constructor(message = "Invalid input", details) {
|
|
37
|
+
super(message, "SECFN_VALIDATION_FAILED", details);
|
|
38
|
+
this.name = "SecFnValidationError";
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
export class SecFnEncryptionError extends SecFnError {
|
|
42
|
+
constructor(message = "Secret encryption failed", details) {
|
|
43
|
+
super(message, "SECFN_ENCRYPTION_FAILED", details);
|
|
44
|
+
this.name = "SecFnEncryptionError";
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,UAAW,SAAQ,KAAK;IAGxB;IACA;IAHX,YACE,OAAe,EACN,IAAY,EACZ,OAAiC;QAE1C,KAAK,CAAC,OAAO,CAAC,CAAC;QAHN,SAAI,GAAJ,IAAI,CAAQ;QACZ,YAAO,GAAP,OAAO,CAA0B;QAG1C,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;IAC3B,CAAC;CACF;AAED,MAAM,OAAO,gBAAiB,SAAQ,UAAU;IAC9C,YAAY,OAAe,EAAE,OAAiC;QAC5D,KAAK,CAAC,OAAO,EAAE,sBAAsB,EAAE,OAAO,CAAC,CAAC;QAChD,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF;AAED,MAAM,OAAO,sBAAuB,SAAQ,UAAU;IACpD,YAAY,OAAO,GAAG,cAAc,EAAE,OAAiC;QACrE,KAAK,CAAC,OAAO,EAAE,oBAAoB,EAAE,OAAO,CAAC,CAAC;QAC9C,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACvC,CAAC;CACF;AAED,MAAM,OAAO,mBAAoB,SAAQ,UAAU;IACjD,YAAY,OAAO,GAAG,WAAW,EAAE,OAAiC;QAClE,KAAK,CAAC,OAAO,EAAE,iBAAiB,EAAE,OAAO,CAAC,CAAC;QAC3C,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF;AAED,MAAM,OAAO,kBAAmB,SAAQ,UAAU;IAChD,YAAY,OAAO,GAAG,WAAW,EAAE,OAAiC;QAClE,KAAK,CAAC,OAAO,EAAE,iBAAiB,EAAE,OAAO,CAAC,CAAC;QAC3C,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAED,MAAM,OAAO,oBAAqB,SAAQ,UAAU;IAClD,YAAY,OAAO,GAAG,eAAe,EAAE,OAAiC;QACtE,KAAK,CAAC,OAAO,EAAE,yBAAyB,EAAE,OAAO,CAAC,CAAC;QACnD,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF;AAED,MAAM,OAAO,oBAAqB,SAAQ,UAAU;IAClD,YAAY,OAAO,GAAG,0BAA0B,EAAE,OAAiC;QACjF,KAAK,CAAC,OAAO,EAAE,yBAAyB,EAAE,OAAO,CAAC,CAAC;QACnD,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF"}
|
package/dist/id.d.ts
ADDED
package/dist/id.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"id.d.ts","sourceRoot":"","sources":["../src/id.ts"],"names":[],"mappings":"AAEA,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAKjD;AAED,wBAAgB,MAAM,IAAI,MAAM,CAE/B"}
|
package/dist/id.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { randomBytes, randomUUID } from "node:crypto";
|
|
2
|
+
export function generateId(prefix) {
|
|
3
|
+
if (typeof randomUUID === "function") {
|
|
4
|
+
return `${prefix}_${randomUUID().replace(/-/g, "")}`;
|
|
5
|
+
}
|
|
6
|
+
return `${prefix}_${randomBytes(16).toString("hex")}`;
|
|
7
|
+
}
|
|
8
|
+
export function nowIso() {
|
|
9
|
+
return new Date().toISOString();
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=id.js.map
|
package/dist/id.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"id.js","sourceRoot":"","sources":["../src/id.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEtD,MAAM,UAAU,UAAU,CAAC,MAAc;IACvC,IAAI,OAAO,UAAU,KAAK,UAAU,EAAE,CAAC;QACrC,OAAO,GAAG,MAAM,IAAI,UAAU,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC;IACvD,CAAC;IACD,OAAO,GAAG,MAAM,IAAI,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,MAAM;IACpB,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AAClC,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
export
|
|
2
|
-
export
|
|
3
|
-
export
|
|
4
|
-
export
|
|
5
|
-
export
|
|
6
|
-
export
|
|
7
|
-
export
|
|
8
|
-
export
|
|
9
|
-
export
|
|
10
|
-
export * from './types/index.js';
|
|
11
|
-
export { generateId, calculateEntropy, redactSecret, isExpired, delay, sanitizeForLog, parseTimeWindow, } from './utils/helpers.js';
|
|
1
|
+
export * from "./types.js";
|
|
2
|
+
export * from "./errors.js";
|
|
3
|
+
export * from "./id.js";
|
|
4
|
+
export * from "./encryption.js";
|
|
5
|
+
export * from "./schema.js";
|
|
6
|
+
export * from "./scanner/scanner.js";
|
|
7
|
+
export * from "./scanner/rules.js";
|
|
8
|
+
export * from "./scanner/reporters.js";
|
|
9
|
+
export * from "./scanner/utils.js";
|
|
12
10
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC;AACxB,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
export
|
|
2
|
-
export
|
|
3
|
-
export
|
|
4
|
-
export
|
|
5
|
-
export
|
|
6
|
-
export
|
|
7
|
-
export
|
|
8
|
-
export
|
|
9
|
-
export
|
|
10
|
-
export * from './types/index.js';
|
|
11
|
-
export { generateId, calculateEntropy, redactSecret, isExpired, delay, sanitizeForLog, parseTimeWindow, } from './utils/helpers.js';
|
|
1
|
+
export * from "./types.js";
|
|
2
|
+
export * from "./errors.js";
|
|
3
|
+
export * from "./id.js";
|
|
4
|
+
export * from "./encryption.js";
|
|
5
|
+
export * from "./schema.js";
|
|
6
|
+
export * from "./scanner/scanner.js";
|
|
7
|
+
export * from "./scanner/rules.js";
|
|
8
|
+
export * from "./scanner/reporters.js";
|
|
9
|
+
export * from "./scanner/utils.js";
|
|
12
10
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC;AACxB,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { SecurityFinding } from "../types.js";
|
|
2
|
+
declare const SEVERITY_ORDER: {
|
|
3
|
+
readonly info: 0;
|
|
4
|
+
readonly low: 1;
|
|
5
|
+
readonly medium: 2;
|
|
6
|
+
readonly high: 3;
|
|
7
|
+
readonly critical: 4;
|
|
8
|
+
};
|
|
9
|
+
export declare function findingMeetsSeverity(finding: SecurityFinding, minimum: keyof typeof SEVERITY_ORDER): boolean;
|
|
10
|
+
export declare function formatFindingsTable(findings: SecurityFinding[]): string;
|
|
11
|
+
export declare function formatFindingsJson(findings: SecurityFinding[]): string;
|
|
12
|
+
export declare function formatFindingsSarif(findings: SecurityFinding[]): string;
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=reporters.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reporters.d.ts","sourceRoot":"","sources":["../../src/scanner/reporters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD,QAAA,MAAM,cAAc;;;;;;CAMV,CAAC;AAEX,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,OAAO,cAAc,GAAG,OAAO,CAE5G;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,eAAe,EAAE,GAAG,MAAM,CAcvE;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,eAAe,EAAE,GAAG,MAAM,CAEtE;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,eAAe,EAAE,GAAG,MAAM,CAkDvE"}
|