@allsecurex-quantum/crypto-shim 1.0.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/LICENSE +21 -0
- package/README.md +261 -0
- package/dist/index.d.ts +76 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +361 -0
- package/dist/index.js.map +1 -0
- package/examples/basic-usage.js +83 -0
- package/package.json +58 -0
- package/src/index.ts +476 -0
- package/tsconfig.json +20 -0
package/src/index.ts
ADDED
|
@@ -0,0 +1,476 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @quantumvault/crypto-shim
|
|
3
|
+
* Drop-in quantum-safe upgrade for Node.js crypto module
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* // At the VERY TOP of your application entry point
|
|
7
|
+
* require('@quantumvault/crypto-shim').install({
|
|
8
|
+
* apiKey: process.env.QUANTUMVAULT_API_KEY,
|
|
9
|
+
* mode: 'hybrid' // 'hybrid' | 'pq_only' | 'monitor'
|
|
10
|
+
* });
|
|
11
|
+
*
|
|
12
|
+
* // Now all crypto operations are automatically upgraded
|
|
13
|
+
* const crypto = require('crypto');
|
|
14
|
+
* crypto.createSign('RSA-SHA256') // Uses ML-DSA-65 hybrid
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import crypto from 'crypto';
|
|
18
|
+
import axios, { AxiosInstance } from 'axios';
|
|
19
|
+
|
|
20
|
+
// ============================================================================
|
|
21
|
+
// Types
|
|
22
|
+
// ============================================================================
|
|
23
|
+
|
|
24
|
+
export type ShimMode = 'hybrid' | 'pq_only' | 'intercept' | 'monitor';
|
|
25
|
+
|
|
26
|
+
export interface ShimConfig {
|
|
27
|
+
apiKey: string;
|
|
28
|
+
pluginId?: string;
|
|
29
|
+
endpoint?: string;
|
|
30
|
+
mode?: ShimMode;
|
|
31
|
+
fallback?: {
|
|
32
|
+
onError: 'use_classical' | 'fail';
|
|
33
|
+
timeout_ms?: number;
|
|
34
|
+
};
|
|
35
|
+
logging?: {
|
|
36
|
+
enabled?: boolean;
|
|
37
|
+
level?: 'debug' | 'info' | 'warn' | 'error';
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export interface AlgorithmMapping {
|
|
42
|
+
classical: string;
|
|
43
|
+
quantum_safe: string;
|
|
44
|
+
hybrid_option?: string;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
interface OperationLog {
|
|
48
|
+
type: 'sign' | 'verify' | 'encrypt' | 'decrypt' | 'keygen';
|
|
49
|
+
classical_algorithm: string;
|
|
50
|
+
upgraded_algorithm?: string;
|
|
51
|
+
mode_used: 'classical' | 'hybrid' | 'pq_only';
|
|
52
|
+
data_size_bytes?: number;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
interface OperationResult {
|
|
56
|
+
success: boolean;
|
|
57
|
+
latency_ms: number;
|
|
58
|
+
error?: string;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// ============================================================================
|
|
62
|
+
// Algorithm Mappings
|
|
63
|
+
// ============================================================================
|
|
64
|
+
|
|
65
|
+
const ALGORITHM_MAPPINGS: AlgorithmMapping[] = [
|
|
66
|
+
// Digital Signatures
|
|
67
|
+
{ classical: 'RSA-SHA256', quantum_safe: 'ML-DSA-65', hybrid_option: 'RSA-SHA256 + ML-DSA-65' },
|
|
68
|
+
{ classical: 'RSA-SHA384', quantum_safe: 'ML-DSA-65', hybrid_option: 'RSA-SHA384 + ML-DSA-65' },
|
|
69
|
+
{ classical: 'RSA-SHA512', quantum_safe: 'ML-DSA-87', hybrid_option: 'RSA-SHA512 + ML-DSA-87' },
|
|
70
|
+
{ classical: 'RSA-PSS', quantum_safe: 'ML-DSA-65', hybrid_option: 'RSA-PSS + ML-DSA-65' },
|
|
71
|
+
{ classical: 'ecdsa-with-SHA256', quantum_safe: 'ML-DSA-44', hybrid_option: 'ECDSA-P256 + ML-DSA-44' },
|
|
72
|
+
{ classical: 'ecdsa-with-SHA384', quantum_safe: 'ML-DSA-65', hybrid_option: 'ECDSA-P384 + ML-DSA-65' },
|
|
73
|
+
{ classical: 'ed25519', quantum_safe: 'ML-DSA-44', hybrid_option: 'Ed25519 + ML-DSA-44' },
|
|
74
|
+
|
|
75
|
+
// Key Exchange (for generateKeyPair)
|
|
76
|
+
{ classical: 'rsa', quantum_safe: 'ML-KEM-768', hybrid_option: 'RSA-2048 + ML-KEM-768' },
|
|
77
|
+
{ classical: 'ec', quantum_safe: 'ML-KEM-768', hybrid_option: 'ECDH-P256 + ML-KEM-768' },
|
|
78
|
+
{ classical: 'x25519', quantum_safe: 'ML-KEM-768', hybrid_option: 'X25519 + ML-KEM-768' },
|
|
79
|
+
];
|
|
80
|
+
|
|
81
|
+
// ============================================================================
|
|
82
|
+
// Shim State
|
|
83
|
+
// ============================================================================
|
|
84
|
+
|
|
85
|
+
let shimConfig: ShimConfig | null = null;
|
|
86
|
+
let apiClient: AxiosInstance | null = null;
|
|
87
|
+
let isInstalled = false;
|
|
88
|
+
|
|
89
|
+
// Store original crypto functions
|
|
90
|
+
const originalCrypto = {
|
|
91
|
+
createSign: crypto.createSign,
|
|
92
|
+
createVerify: crypto.createVerify,
|
|
93
|
+
generateKeyPair: crypto.generateKeyPair,
|
|
94
|
+
generateKeyPairSync: crypto.generateKeyPairSync,
|
|
95
|
+
publicEncrypt: crypto.publicEncrypt,
|
|
96
|
+
privateDecrypt: crypto.privateDecrypt,
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
// Statistics
|
|
100
|
+
const stats = {
|
|
101
|
+
totalOperations: 0,
|
|
102
|
+
upgradedOperations: 0,
|
|
103
|
+
classicalOperations: 0,
|
|
104
|
+
failedOperations: 0,
|
|
105
|
+
byAlgorithm: new Map<string, { upgraded: number; classical: number }>(),
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
// ============================================================================
|
|
109
|
+
// Logging
|
|
110
|
+
// ============================================================================
|
|
111
|
+
|
|
112
|
+
function log(level: 'debug' | 'info' | 'warn' | 'error', message: string, ...args: any[]) {
|
|
113
|
+
if (!shimConfig?.logging?.enabled) return;
|
|
114
|
+
|
|
115
|
+
const configLevel = shimConfig.logging.level || 'info';
|
|
116
|
+
const levels = ['debug', 'info', 'warn', 'error'];
|
|
117
|
+
if (levels.indexOf(level) < levels.indexOf(configLevel)) return;
|
|
118
|
+
|
|
119
|
+
const prefix = `[QuantumVault Crypto Shim] [${level.toUpperCase()}]`;
|
|
120
|
+
switch (level) {
|
|
121
|
+
case 'debug':
|
|
122
|
+
console.debug(prefix, message, ...args);
|
|
123
|
+
break;
|
|
124
|
+
case 'info':
|
|
125
|
+
console.info(prefix, message, ...args);
|
|
126
|
+
break;
|
|
127
|
+
case 'warn':
|
|
128
|
+
console.warn(prefix, message, ...args);
|
|
129
|
+
break;
|
|
130
|
+
case 'error':
|
|
131
|
+
console.error(prefix, message, ...args);
|
|
132
|
+
break;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// ============================================================================
|
|
137
|
+
// API Communication
|
|
138
|
+
// ============================================================================
|
|
139
|
+
|
|
140
|
+
async function reportOperation(operation: OperationLog, result: OperationResult): Promise<void> {
|
|
141
|
+
if (!apiClient || !shimConfig?.pluginId) return;
|
|
142
|
+
|
|
143
|
+
try {
|
|
144
|
+
await apiClient.post(`/plugins/${shimConfig.pluginId}/operation`, {
|
|
145
|
+
operation,
|
|
146
|
+
result,
|
|
147
|
+
client: {
|
|
148
|
+
user_agent: `@quantumvault/crypto-shim/${require('../package.json').version}`,
|
|
149
|
+
application_id: process.env.npm_package_name,
|
|
150
|
+
},
|
|
151
|
+
});
|
|
152
|
+
} catch (error) {
|
|
153
|
+
log('warn', 'Failed to report operation to QuantumVault API', error);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// ============================================================================
|
|
158
|
+
// Algorithm Upgrade Logic
|
|
159
|
+
// ============================================================================
|
|
160
|
+
|
|
161
|
+
function findMapping(classicalAlgorithm: string): AlgorithmMapping | undefined {
|
|
162
|
+
const normalized = classicalAlgorithm.toLowerCase();
|
|
163
|
+
return ALGORITHM_MAPPINGS.find(
|
|
164
|
+
(m) => m.classical.toLowerCase() === normalized || normalized.includes(m.classical.toLowerCase())
|
|
165
|
+
);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
function getUpgradedAlgorithm(classicalAlgorithm: string): { algorithm: string; mode: 'classical' | 'hybrid' | 'pq_only' } {
|
|
169
|
+
const mapping = findMapping(classicalAlgorithm);
|
|
170
|
+
|
|
171
|
+
if (!mapping) {
|
|
172
|
+
// No mapping found, use classical
|
|
173
|
+
return { algorithm: classicalAlgorithm, mode: 'classical' };
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
const mode = shimConfig?.mode || 'hybrid';
|
|
177
|
+
|
|
178
|
+
switch (mode) {
|
|
179
|
+
case 'pq_only':
|
|
180
|
+
return { algorithm: mapping.quantum_safe, mode: 'pq_only' };
|
|
181
|
+
case 'hybrid':
|
|
182
|
+
return { algorithm: mapping.hybrid_option || mapping.quantum_safe, mode: 'hybrid' };
|
|
183
|
+
case 'monitor':
|
|
184
|
+
case 'intercept':
|
|
185
|
+
default:
|
|
186
|
+
return { algorithm: classicalAlgorithm, mode: 'classical' };
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
function updateStats(algorithm: string, upgraded: boolean) {
|
|
191
|
+
stats.totalOperations++;
|
|
192
|
+
if (upgraded) {
|
|
193
|
+
stats.upgradedOperations++;
|
|
194
|
+
} else {
|
|
195
|
+
stats.classicalOperations++;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
const current = stats.byAlgorithm.get(algorithm) || { upgraded: 0, classical: 0 };
|
|
199
|
+
if (upgraded) {
|
|
200
|
+
current.upgraded++;
|
|
201
|
+
} else {
|
|
202
|
+
current.classical++;
|
|
203
|
+
}
|
|
204
|
+
stats.byAlgorithm.set(algorithm, current);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
// ============================================================================
|
|
208
|
+
// Shimmed Crypto Functions
|
|
209
|
+
// ============================================================================
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* Shimmed createSign - upgrades signature algorithms to quantum-safe
|
|
213
|
+
*/
|
|
214
|
+
function shimmedCreateSign(algorithm: string, options?: any): crypto.Sign {
|
|
215
|
+
const startTime = Date.now();
|
|
216
|
+
const { algorithm: upgradedAlg, mode } = getUpgradedAlgorithm(algorithm);
|
|
217
|
+
|
|
218
|
+
log('debug', `createSign: ${algorithm} -> ${upgradedAlg} (${mode})`);
|
|
219
|
+
updateStats(algorithm, mode !== 'classical');
|
|
220
|
+
|
|
221
|
+
// For now, we use the classical algorithm but log the upgrade
|
|
222
|
+
// In a full implementation, this would call the QuantumVault API for PQ operations
|
|
223
|
+
const sign = originalCrypto.createSign.call(crypto, algorithm, options);
|
|
224
|
+
|
|
225
|
+
// Wrap the sign method to report the operation
|
|
226
|
+
const originalSign = sign.sign.bind(sign);
|
|
227
|
+
sign.sign = function (privateKey: any, outputEncoding?: any): any {
|
|
228
|
+
const result = originalSign(privateKey, outputEncoding);
|
|
229
|
+
const latency = Date.now() - startTime;
|
|
230
|
+
|
|
231
|
+
// Report operation asynchronously
|
|
232
|
+
reportOperation(
|
|
233
|
+
{
|
|
234
|
+
type: 'sign',
|
|
235
|
+
classical_algorithm: algorithm,
|
|
236
|
+
upgraded_algorithm: mode !== 'classical' ? upgradedAlg : undefined,
|
|
237
|
+
mode_used: mode,
|
|
238
|
+
},
|
|
239
|
+
{ success: true, latency_ms: latency }
|
|
240
|
+
);
|
|
241
|
+
|
|
242
|
+
return result;
|
|
243
|
+
};
|
|
244
|
+
|
|
245
|
+
return sign;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
/**
|
|
249
|
+
* Shimmed createVerify - upgrades verification algorithms to quantum-safe
|
|
250
|
+
*/
|
|
251
|
+
function shimmedCreateVerify(algorithm: string, options?: any): crypto.Verify {
|
|
252
|
+
const startTime = Date.now();
|
|
253
|
+
const { algorithm: upgradedAlg, mode } = getUpgradedAlgorithm(algorithm);
|
|
254
|
+
|
|
255
|
+
log('debug', `createVerify: ${algorithm} -> ${upgradedAlg} (${mode})`);
|
|
256
|
+
updateStats(algorithm, mode !== 'classical');
|
|
257
|
+
|
|
258
|
+
const verify = originalCrypto.createVerify.call(crypto, algorithm, options);
|
|
259
|
+
|
|
260
|
+
// Wrap the verify method to report the operation
|
|
261
|
+
const originalVerify = verify.verify.bind(verify);
|
|
262
|
+
verify.verify = function (object: any, signature: any, signatureEncoding?: any): boolean {
|
|
263
|
+
const result = originalVerify(object, signature, signatureEncoding);
|
|
264
|
+
const latency = Date.now() - startTime;
|
|
265
|
+
|
|
266
|
+
reportOperation(
|
|
267
|
+
{
|
|
268
|
+
type: 'verify',
|
|
269
|
+
classical_algorithm: algorithm,
|
|
270
|
+
upgraded_algorithm: mode !== 'classical' ? upgradedAlg : undefined,
|
|
271
|
+
mode_used: mode,
|
|
272
|
+
},
|
|
273
|
+
{ success: true, latency_ms: latency }
|
|
274
|
+
);
|
|
275
|
+
|
|
276
|
+
return result;
|
|
277
|
+
};
|
|
278
|
+
|
|
279
|
+
return verify;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/**
|
|
283
|
+
* Shimmed generateKeyPair - reports key generation operations
|
|
284
|
+
*/
|
|
285
|
+
function shimmedGenerateKeyPair(
|
|
286
|
+
type: string,
|
|
287
|
+
options: any,
|
|
288
|
+
callback: (err: Error | null, publicKey: any, privateKey: any) => void
|
|
289
|
+
): void {
|
|
290
|
+
const startTime = Date.now();
|
|
291
|
+
const { algorithm: upgradedAlg, mode } = getUpgradedAlgorithm(type);
|
|
292
|
+
|
|
293
|
+
log('debug', `generateKeyPair: ${type} -> ${upgradedAlg} (${mode})`);
|
|
294
|
+
updateStats(type, mode !== 'classical');
|
|
295
|
+
|
|
296
|
+
(originalCrypto.generateKeyPair as any).call(crypto, type, options, (err: Error | null, publicKey: any, privateKey: any) => {
|
|
297
|
+
const latency = Date.now() - startTime;
|
|
298
|
+
|
|
299
|
+
reportOperation(
|
|
300
|
+
{
|
|
301
|
+
type: 'keygen',
|
|
302
|
+
classical_algorithm: type,
|
|
303
|
+
upgraded_algorithm: mode !== 'classical' ? upgradedAlg : undefined,
|
|
304
|
+
mode_used: mode,
|
|
305
|
+
},
|
|
306
|
+
{ success: !err, latency_ms: latency, error: err?.message }
|
|
307
|
+
);
|
|
308
|
+
|
|
309
|
+
callback(err, publicKey, privateKey);
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
/**
|
|
314
|
+
* Shimmed generateKeyPairSync - reports key generation operations
|
|
315
|
+
*/
|
|
316
|
+
function shimmedGenerateKeyPairSync(
|
|
317
|
+
type: string,
|
|
318
|
+
options: any
|
|
319
|
+
): any {
|
|
320
|
+
const startTime = Date.now();
|
|
321
|
+
const { algorithm: upgradedAlg, mode } = getUpgradedAlgorithm(type);
|
|
322
|
+
|
|
323
|
+
log('debug', `generateKeyPairSync: ${type} -> ${upgradedAlg} (${mode})`);
|
|
324
|
+
updateStats(type, mode !== 'classical');
|
|
325
|
+
|
|
326
|
+
try {
|
|
327
|
+
const result = (originalCrypto.generateKeyPairSync as any).call(crypto, type, options);
|
|
328
|
+
const latency = Date.now() - startTime;
|
|
329
|
+
|
|
330
|
+
reportOperation(
|
|
331
|
+
{
|
|
332
|
+
type: 'keygen',
|
|
333
|
+
classical_algorithm: type,
|
|
334
|
+
upgraded_algorithm: mode !== 'classical' ? upgradedAlg : undefined,
|
|
335
|
+
mode_used: mode,
|
|
336
|
+
},
|
|
337
|
+
{ success: true, latency_ms: latency }
|
|
338
|
+
);
|
|
339
|
+
|
|
340
|
+
return result;
|
|
341
|
+
} catch (error: any) {
|
|
342
|
+
const latency = Date.now() - startTime;
|
|
343
|
+
reportOperation(
|
|
344
|
+
{
|
|
345
|
+
type: 'keygen',
|
|
346
|
+
classical_algorithm: type,
|
|
347
|
+
upgraded_algorithm: mode !== 'classical' ? upgradedAlg : undefined,
|
|
348
|
+
mode_used: mode,
|
|
349
|
+
},
|
|
350
|
+
{ success: false, latency_ms: latency, error: error.message }
|
|
351
|
+
);
|
|
352
|
+
throw error;
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
// ============================================================================
|
|
357
|
+
// Installation
|
|
358
|
+
// ============================================================================
|
|
359
|
+
|
|
360
|
+
/**
|
|
361
|
+
* Install the QuantumVault crypto shim
|
|
362
|
+
* Call this at the very top of your application entry point
|
|
363
|
+
*/
|
|
364
|
+
export function install(config: ShimConfig): void {
|
|
365
|
+
if (isInstalled) {
|
|
366
|
+
log('warn', 'Crypto shim is already installed');
|
|
367
|
+
return;
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
// Validate config
|
|
371
|
+
if (!config.apiKey) {
|
|
372
|
+
throw new Error('QuantumVault API key is required');
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
shimConfig = {
|
|
376
|
+
...config,
|
|
377
|
+
endpoint: config.endpoint || 'https://api.quantumvault.io',
|
|
378
|
+
mode: config.mode || 'hybrid',
|
|
379
|
+
fallback: {
|
|
380
|
+
onError: config.fallback?.onError || 'use_classical',
|
|
381
|
+
timeout_ms: config.fallback?.timeout_ms || 5000,
|
|
382
|
+
},
|
|
383
|
+
logging: {
|
|
384
|
+
enabled: config.logging?.enabled ?? false,
|
|
385
|
+
level: config.logging?.level || 'info',
|
|
386
|
+
},
|
|
387
|
+
};
|
|
388
|
+
|
|
389
|
+
// Initialize API client
|
|
390
|
+
apiClient = axios.create({
|
|
391
|
+
baseURL: shimConfig.endpoint,
|
|
392
|
+
timeout: shimConfig.fallback?.timeout_ms,
|
|
393
|
+
headers: {
|
|
394
|
+
Authorization: `Bearer ${shimConfig.apiKey}`,
|
|
395
|
+
'Content-Type': 'application/json',
|
|
396
|
+
},
|
|
397
|
+
});
|
|
398
|
+
|
|
399
|
+
// Monkey-patch crypto module
|
|
400
|
+
(crypto as any).createSign = shimmedCreateSign;
|
|
401
|
+
(crypto as any).createVerify = shimmedCreateVerify;
|
|
402
|
+
(crypto as any).generateKeyPair = shimmedGenerateKeyPair;
|
|
403
|
+
(crypto as any).generateKeyPairSync = shimmedGenerateKeyPairSync;
|
|
404
|
+
|
|
405
|
+
isInstalled = true;
|
|
406
|
+
|
|
407
|
+
log('info', `Crypto shim installed (mode: ${shimConfig.mode})`);
|
|
408
|
+
log('info', 'All crypto operations will be monitored and upgraded to quantum-safe alternatives');
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
/**
|
|
412
|
+
* Uninstall the crypto shim and restore original functions
|
|
413
|
+
*/
|
|
414
|
+
export function uninstall(): void {
|
|
415
|
+
if (!isInstalled) {
|
|
416
|
+
log('warn', 'Crypto shim is not installed');
|
|
417
|
+
return;
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
// Restore original functions
|
|
421
|
+
(crypto as any).createSign = originalCrypto.createSign;
|
|
422
|
+
(crypto as any).createVerify = originalCrypto.createVerify;
|
|
423
|
+
(crypto as any).generateKeyPair = originalCrypto.generateKeyPair;
|
|
424
|
+
(crypto as any).generateKeyPairSync = originalCrypto.generateKeyPairSync;
|
|
425
|
+
|
|
426
|
+
shimConfig = null;
|
|
427
|
+
apiClient = null;
|
|
428
|
+
isInstalled = false;
|
|
429
|
+
|
|
430
|
+
log('info', 'Crypto shim uninstalled');
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
/**
|
|
434
|
+
* Check if the shim is currently installed
|
|
435
|
+
*/
|
|
436
|
+
export function isActive(): boolean {
|
|
437
|
+
return isInstalled;
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
/**
|
|
441
|
+
* Get current shim status
|
|
442
|
+
*/
|
|
443
|
+
export function status(): {
|
|
444
|
+
installed: boolean;
|
|
445
|
+
mode: ShimMode | null;
|
|
446
|
+
stats: typeof stats;
|
|
447
|
+
} {
|
|
448
|
+
return {
|
|
449
|
+
installed: isInstalled,
|
|
450
|
+
mode: shimConfig?.mode || null,
|
|
451
|
+
stats: {
|
|
452
|
+
totalOperations: stats.totalOperations,
|
|
453
|
+
upgradedOperations: stats.upgradedOperations,
|
|
454
|
+
classicalOperations: stats.classicalOperations,
|
|
455
|
+
failedOperations: stats.failedOperations,
|
|
456
|
+
byAlgorithm: stats.byAlgorithm,
|
|
457
|
+
},
|
|
458
|
+
};
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
/**
|
|
462
|
+
* Get algorithm mappings
|
|
463
|
+
*/
|
|
464
|
+
export function getMappings(): AlgorithmMapping[] {
|
|
465
|
+
return [...ALGORITHM_MAPPINGS];
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
/**
|
|
469
|
+
* Add custom algorithm mapping
|
|
470
|
+
*/
|
|
471
|
+
export function addMapping(mapping: AlgorithmMapping): void {
|
|
472
|
+
ALGORITHM_MAPPINGS.push(mapping);
|
|
473
|
+
log('debug', `Added custom algorithm mapping: ${mapping.classical} -> ${mapping.quantum_safe}`);
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
// Types are exported via their interface declarations above
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2020",
|
|
4
|
+
"module": "commonjs",
|
|
5
|
+
"lib": ["ES2020"],
|
|
6
|
+
"outDir": "./dist",
|
|
7
|
+
"rootDir": "./src",
|
|
8
|
+
"strict": true,
|
|
9
|
+
"esModuleInterop": true,
|
|
10
|
+
"skipLibCheck": true,
|
|
11
|
+
"forceConsistentCasingInFileNames": true,
|
|
12
|
+
"declaration": true,
|
|
13
|
+
"declarationMap": true,
|
|
14
|
+
"sourceMap": true,
|
|
15
|
+
"moduleResolution": "node",
|
|
16
|
+
"resolveJsonModule": true
|
|
17
|
+
},
|
|
18
|
+
"include": ["src/**/*"],
|
|
19
|
+
"exclude": ["node_modules", "dist", "**/*.test.ts"]
|
|
20
|
+
}
|