@smartledger/keys 1.5.0 → 1.5.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 CHANGED
@@ -2,10 +2,12 @@
2
2
 
3
3
  **Single source of truth for cryptographic key operations.**
4
4
 
5
- Version: 1.4.0
5
+ Version: 1.5.1
6
6
  Status: ✅ Production Ready
7
7
  Tests: 52/52 passing
8
8
 
9
+ **New in 1.5.1:** All three ML-DSA security levels now available (44/65/87)
10
+
9
11
  ---
10
12
 
11
13
  ## Why This SDK?
@@ -48,6 +50,16 @@ And **don't care** how keys are stored, rotated, or implemented.
48
50
  npm install @smartledger/keys
49
51
  ```
50
52
 
53
+ ### Supported ML-DSA Variants
54
+
55
+ Choose the right security level for your use case:
56
+
57
+ | Variant | NIST Level | Equivalent | Use Case |
58
+ |---------|------------|------------|----------|
59
+ | **ml-dsa-44** | Level 2 | AES-128 | IoT devices, high-throughput systems |
60
+ | **ml-dsa-65** | Level 3 | AES-192 | **General purpose (recommended)** |
61
+ | **ml-dsa-87** | Level 5 | AES-256 | High-security, long-term confidential data |
62
+
51
63
  ---
52
64
 
53
65
  ## Quick Start
@@ -59,10 +71,11 @@ import { createKeySDK } from '@smartledger/keys';
59
71
  const sdk = createKeySDK();
60
72
 
61
73
  // Create both PQ + ECDSA keys for an agent
74
+ // Using ml-dsa-65 (Level 3) - recommended for most use cases
62
75
  const { primaryKey, secondaryKey } = await sdk.createDualSignatureKeys(
63
76
  'agent-resonance',
64
77
  {
65
- primarySignatureSuite: 'ml-dsa-87',
78
+ primarySignatureSuite: 'ml-dsa-65', // or 'ml-dsa-44', 'ml-dsa-87'
66
79
  secondarySignatureSuite: 'bsv-ecdsa-secp256k1',
67
80
  }
68
81
  );
@@ -101,7 +114,7 @@ Create a new key for an agent/module.
101
114
  ```typescript
102
115
  const key = await sdk.createKey(
103
116
  'agent-schema',
104
- { primarySignatureSuite: 'ml-dsa-87' },
117
+ { primarySignatureSuite: 'ml-dsa-65' }, // Recommended: Level 3
105
118
  {
106
119
  expiresAt: new Date(Date.now() + 365 * 86400000).toISOString(), // 1 year
107
120
  usage: ['signing'],
@@ -124,7 +137,7 @@ Get an existing key by ID.
124
137
  ```typescript
125
138
  const key = await sdk.getKey('agent-resonance:pk-ml-1');
126
139
  if (key) {
127
- console.log(key.meta.suiteId); // 'ml-dsa-87'
140
+ console.log(key.meta.suiteId); // 'ml-dsa-65' or 'ml-dsa-44', 'ml-dsa-87'
128
141
  console.log(key.publicKey); // Uint8Array
129
142
  }
130
143
  ```
@@ -207,7 +220,7 @@ Looks up the most recent active keys and infers the profile.
207
220
  **Example:**
208
221
  ```typescript
209
222
  const profile = await sdk.getActiveCryptoProfile('agent-schema');
210
- console.log(profile.primarySignatureSuite); // 'ml-dsa-87'
223
+ console.log(profile.primarySignatureSuite); // 'ml-dsa-65'
211
224
  console.log(profile.secondarySignatureSuite); // 'bsv-ecdsa-secp256k1'
212
225
  ```
213
226
 
@@ -252,11 +265,11 @@ Create key if it doesn't exist, otherwise return existing.
252
265
  ```typescript
253
266
  // Safe to call multiple times
254
267
  const key1 = await sdk.getOrCreateKey('agent-validator', {
255
- primarySignatureSuite: 'ml-dsa-87',
268
+ primarySignatureSuite: 'ml-dsa-65',
256
269
  });
257
270
 
258
271
  const key2 = await sdk.getOrCreateKey('agent-validator', {
259
- primarySignatureSuite: 'ml-dsa-87',
272
+ primarySignatureSuite: 'ml-dsa-65',
260
273
  });
261
274
 
262
275
  console.log(key1.meta.keyId === key2.meta.keyId); // true
@@ -275,7 +288,7 @@ Create both primary and secondary keys in one call. Requires `profile.secondaryS
275
288
  const { primaryKey, secondaryKey } = await sdk.createDualSignatureKeys(
276
289
  'agent-bridge',
277
290
  {
278
- primarySignatureSuite: 'ml-dsa-87',
291
+ primarySignatureSuite: 'ml-dsa-65', // Recommended
279
292
  secondarySignatureSuite: 'bsv-ecdsa-secp256k1',
280
293
  }
281
294
  );
@@ -351,7 +364,7 @@ Per-agent/module crypto configuration.
351
364
 
352
365
  ```typescript
353
366
  interface CryptoProfile {
354
- primarySignatureSuite: string; // e.g. 'ml-dsa-87'
367
+ primarySignatureSuite: string; // e.g. 'ml-dsa-65' (recommended), 'ml-dsa-44', 'ml-dsa-87'
355
368
  secondarySignatureSuite?: string; // e.g. 'bsv-ecdsa-secp256k1' (hybrid)
356
369
  keyEncapsulationSuite?: string; // e.g. 'ml-kem-768' (future)
357
370
  }
@@ -364,9 +377,9 @@ interface CryptoProfile {
364
377
  ### Single Signature (PQ-only)
365
378
 
366
379
  ```typescript
367
- // Agent uses only ML-DSA
380
+ // Agent uses only ML-DSA (recommended: ml-dsa-65)
368
381
  const key = await sdk.createKey('agent-research', {
369
- primarySignatureSuite: 'ml-dsa-87',
382
+ primarySignatureSuite: 'ml-dsa-65', // or 'ml-dsa-44' for IoT, 'ml-dsa-87' for max security
370
383
  });
371
384
 
372
385
  const message = new TextEncoder().encode('research results');
@@ -378,7 +391,7 @@ const signature = await sdk.signWithKey(key.meta.keyId, message);
378
391
  ```typescript
379
392
  // One call to create both keys
380
393
  await sdk.getOrCreateDualSignatureKeys('agent-bridge', {
381
- primarySignatureSuite: 'ml-dsa-87',
394
+ primarySignatureSuite: 'ml-dsa-65', // Balanced security (recommended)
382
395
  secondarySignatureSuite: 'bsv-ecdsa-secp256k1',
383
396
  });
384
397
 
@@ -397,7 +410,7 @@ console.log(verified.allValid); // true
397
410
  // Safe to call on every startup
398
411
  async function setupAgent(agentId: string) {
399
412
  const key = await sdk.getOrCreateKey(agentId, {
400
- primarySignatureSuite: 'ml-dsa-87',
413
+ primarySignatureSuite: 'ml-dsa-65', // Recommended default
401
414
  }, {
402
415
  expiresAt: new Date(Date.now() + 365 * 86400000).toISOString(),
403
416
  });
@@ -491,7 +504,7 @@ const sig = await suite.sign(key.keypair.privateKey, message);
491
504
  ```typescript
492
505
  // Clean, centralized
493
506
  const key = await sdk.createKey('agent-1', {
494
- primarySignatureSuite: 'ml-dsa-87',
507
+ primarySignatureSuite: 'ml-dsa-65', // Choose: 'ml-dsa-44', '65', or '87'
495
508
  });
496
509
 
497
510
  const sig = await sdk.signWithKey(key.meta.keyId, message);
@@ -1 +1 @@
1
- {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../src/browser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAaH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAGzC,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzD;;;GAGG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,CAqBpD;AAED;;GAEG;;;;AACH,wBAEE"}
1
+ {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../src/browser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAYH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAGzC,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzD;;;GAGG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,CAoBpD;AAED;;GAEG;;;;AACH,wBAEE"}
@@ -37,9 +37,8 @@ async function createKeySDK() {
37
37
  const suiteRegistry = new crypto_1.SignatureSuiteRegistry();
38
38
  suiteRegistry.register(new crypto_1.BsvEcdsaSuite());
39
39
  suiteRegistry.register(new crypto_1.MlDsa44Suite()); // Level 2 (AES-128 equivalent)
40
- suiteRegistry.register(new crypto_1.MlDsa65Suite()); // Level 3 (AES-192 equivalent)
40
+ suiteRegistry.register(new crypto_1.MlDsa65Suite()); // Level 3 (AES-192 equivalent) - also 'ml-dsa-65' default
41
41
  suiteRegistry.register(new crypto_1.MlDsa87Suite()); // Level 5 (AES-256 equivalent)
42
- suiteRegistry.register(new crypto_1.MlDsaSuite()); // Alias for MlDsa65Suite
43
42
  const sdk = new sdk_js_1.DefaultKeySDK({
44
43
  keyRegistry,
45
44
  suiteRegistry,
@@ -1 +1 @@
1
- {"version":3,"file":"browser.js","sourceRoot":"","sources":["../../src/browser.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;;AAuBH,oCAqBC;AA1CD,qCAAyC;AACzC,gDAS6B;AAG7B,wCAAwC;AACxC,6CAA2B;AAC3B,8CAAyD;AAAhD,4GAAA,kBAAkB,OAAA;AAE3B;;;GAGG;AACI,KAAK,UAAU,YAAY;IAChC,MAAM,OAAO,GAAG,IAAI,2BAAkB,EAAE,CAAC;IACzC,MAAM,WAAW,GAAG,IAAI,oBAAW,CAAC,OAAO,CAAC,CAAC;IAE7C,+DAA+D;IAC/D,MAAM,aAAa,GAAG,IAAI,+BAAsB,EAAE,CAAC;IACnD,aAAa,CAAC,QAAQ,CAAC,IAAI,sBAAa,EAAE,CAAC,CAAC;IAC5C,aAAa,CAAC,QAAQ,CAAC,IAAI,qBAAY,EAAE,CAAC,CAAC,CAAC,+BAA+B;IAC3E,aAAa,CAAC,QAAQ,CAAC,IAAI,qBAAY,EAAE,CAAC,CAAC,CAAC,+BAA+B;IAC3E,aAAa,CAAC,QAAQ,CAAC,IAAI,qBAAY,EAAE,CAAC,CAAC,CAAC,+BAA+B;IAC3E,aAAa,CAAC,QAAQ,CAAC,IAAI,mBAAU,EAAE,CAAC,CAAC,CAAG,yBAAyB;IAErE,MAAM,GAAG,GAAG,IAAI,sBAAa,CAAC;QAC5B,WAAW;QACX,aAAa;KACd,CAAC,CAAC;IAEH,2CAA2C;IAC3C,kEAAkE;IAElE,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;GAEG;AACH,kBAAe;IACb,YAAY;CACb,CAAC;AAEF,8BAA8B;AAC9B,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;IACjC,MAAc,CAAC,SAAS,GAAG;QAC1B,YAAY;KACb,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"browser.js","sourceRoot":"","sources":["../../src/browser.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;;AAsBH,oCAoBC;AAxCD,qCAAyC;AACzC,gDAQ6B;AAG7B,wCAAwC;AACxC,6CAA2B;AAC3B,8CAAyD;AAAhD,4GAAA,kBAAkB,OAAA;AAE3B;;;GAGG;AACI,KAAK,UAAU,YAAY;IAChC,MAAM,OAAO,GAAG,IAAI,2BAAkB,EAAE,CAAC;IACzC,MAAM,WAAW,GAAG,IAAI,oBAAW,CAAC,OAAO,CAAC,CAAC;IAE7C,+DAA+D;IAC/D,MAAM,aAAa,GAAG,IAAI,+BAAsB,EAAE,CAAC;IACnD,aAAa,CAAC,QAAQ,CAAC,IAAI,sBAAa,EAAE,CAAC,CAAC;IAC5C,aAAa,CAAC,QAAQ,CAAC,IAAI,qBAAY,EAAE,CAAC,CAAC,CAAC,+BAA+B;IAC3E,aAAa,CAAC,QAAQ,CAAC,IAAI,qBAAY,EAAE,CAAC,CAAC,CAAC,0DAA0D;IACtG,aAAa,CAAC,QAAQ,CAAC,IAAI,qBAAY,EAAE,CAAC,CAAC,CAAC,+BAA+B;IAE3E,MAAM,GAAG,GAAG,IAAI,sBAAa,CAAC;QAC5B,WAAW;QACX,aAAa;KACd,CAAC,CAAC;IAEH,2CAA2C;IAC3C,kEAAkE;IAElE,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;GAEG;AACH,kBAAe;IACb,YAAY;CACb,CAAC;AAEF,8BAA8B;AAC9B,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;IACjC,MAAc,CAAC,SAAS,GAAG;QAC1B,YAAY;KACb,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../src/browser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAaH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAGzC,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzD;;;GAGG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,CAqBpD;AAED;;GAEG;;;;AACH,wBAEE"}
1
+ {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../src/browser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAYH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAGzC,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzD;;;GAGG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,CAoBpD;AAED;;GAEG;;;;AACH,wBAEE"}
@@ -3,7 +3,7 @@
3
3
  * Includes WASM initialization and browser-compatible exports
4
4
  */
5
5
  import { DefaultKeySDK } from './sdk.js';
6
- import { InMemoryKeyStorage, KeyRegistry, SignatureSuiteRegistry, BsvEcdsaSuite, MlDsa44Suite, MlDsa65Suite, MlDsa87Suite, MlDsaSuite, } from '@smartledger/crypto';
6
+ import { InMemoryKeyStorage, KeyRegistry, SignatureSuiteRegistry, BsvEcdsaSuite, MlDsa44Suite, MlDsa65Suite, MlDsa87Suite, } from '@smartledger/crypto';
7
7
  // Re-export all types for browser usage
8
8
  export * from './types.js';
9
9
  export { InMemoryKeyStorage } from '@smartledger/crypto';
@@ -18,9 +18,8 @@ export async function createKeySDK() {
18
18
  const suiteRegistry = new SignatureSuiteRegistry();
19
19
  suiteRegistry.register(new BsvEcdsaSuite());
20
20
  suiteRegistry.register(new MlDsa44Suite()); // Level 2 (AES-128 equivalent)
21
- suiteRegistry.register(new MlDsa65Suite()); // Level 3 (AES-192 equivalent)
21
+ suiteRegistry.register(new MlDsa65Suite()); // Level 3 (AES-192 equivalent) - also 'ml-dsa-65' default
22
22
  suiteRegistry.register(new MlDsa87Suite()); // Level 5 (AES-256 equivalent)
23
- suiteRegistry.register(new MlDsaSuite()); // Alias for MlDsa65Suite
24
23
  const sdk = new DefaultKeySDK({
25
24
  keyRegistry,
26
25
  suiteRegistry,
@@ -1 +1 @@
1
- {"version":3,"file":"browser.js","sourceRoot":"","sources":["../../src/browser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EACL,kBAAkB,EAClB,WAAW,EACX,sBAAsB,EACtB,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,UAAU,GACX,MAAM,qBAAqB,CAAC;AAG7B,wCAAwC;AACxC,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,MAAM,OAAO,GAAG,IAAI,kBAAkB,EAAE,CAAC;IACzC,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC;IAE7C,+DAA+D;IAC/D,MAAM,aAAa,GAAG,IAAI,sBAAsB,EAAE,CAAC;IACnD,aAAa,CAAC,QAAQ,CAAC,IAAI,aAAa,EAAE,CAAC,CAAC;IAC5C,aAAa,CAAC,QAAQ,CAAC,IAAI,YAAY,EAAE,CAAC,CAAC,CAAC,+BAA+B;IAC3E,aAAa,CAAC,QAAQ,CAAC,IAAI,YAAY,EAAE,CAAC,CAAC,CAAC,+BAA+B;IAC3E,aAAa,CAAC,QAAQ,CAAC,IAAI,YAAY,EAAE,CAAC,CAAC,CAAC,+BAA+B;IAC3E,aAAa,CAAC,QAAQ,CAAC,IAAI,UAAU,EAAE,CAAC,CAAC,CAAG,yBAAyB;IAErE,MAAM,GAAG,GAAG,IAAI,aAAa,CAAC;QAC5B,WAAW;QACX,aAAa;KACd,CAAC,CAAC;IAEH,2CAA2C;IAC3C,kEAAkE;IAElE,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;GAEG;AACH,eAAe;IACb,YAAY;CACb,CAAC;AAEF,8BAA8B;AAC9B,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;IACjC,MAAc,CAAC,SAAS,GAAG;QAC1B,YAAY;KACb,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"browser.js","sourceRoot":"","sources":["../../src/browser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EACL,kBAAkB,EAClB,WAAW,EACX,sBAAsB,EACtB,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,YAAY,GACb,MAAM,qBAAqB,CAAC;AAG7B,wCAAwC;AACxC,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,MAAM,OAAO,GAAG,IAAI,kBAAkB,EAAE,CAAC;IACzC,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC;IAE7C,+DAA+D;IAC/D,MAAM,aAAa,GAAG,IAAI,sBAAsB,EAAE,CAAC;IACnD,aAAa,CAAC,QAAQ,CAAC,IAAI,aAAa,EAAE,CAAC,CAAC;IAC5C,aAAa,CAAC,QAAQ,CAAC,IAAI,YAAY,EAAE,CAAC,CAAC,CAAC,+BAA+B;IAC3E,aAAa,CAAC,QAAQ,CAAC,IAAI,YAAY,EAAE,CAAC,CAAC,CAAC,0DAA0D;IACtG,aAAa,CAAC,QAAQ,CAAC,IAAI,YAAY,EAAE,CAAC,CAAC,CAAC,+BAA+B;IAE3E,MAAM,GAAG,GAAG,IAAI,aAAa,CAAC;QAC5B,WAAW;QACX,aAAa;KACd,CAAC,CAAC;IAEH,2CAA2C;IAC3C,kEAAkE;IAElE,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;GAEG;AACH,eAAe;IACb,YAAY;CACb,CAAC;AAEF,8BAA8B;AAC9B,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;IACjC,MAAc,CAAC,SAAS,GAAG;QAC1B,YAAY;KACb,CAAC;AACJ,CAAC"}
@@ -10400,8 +10400,6 @@ zoo`.split("\n");
10400
10400
  return ML_DSA_SIZES["ml-dsa-87"];
10401
10401
  }
10402
10402
  };
10403
- var MlDsaSuite = class extends MlDsa65Suite {
10404
- };
10405
10403
 
10406
10404
  // src/sdk.ts
10407
10405
  var DefaultKeySDK = class {
@@ -10794,7 +10792,6 @@ Consider using one of these suites or remove the derivationContext option.` : `N
10794
10792
  suiteRegistry.register(new MlDsa44Suite());
10795
10793
  suiteRegistry.register(new MlDsa65Suite());
10796
10794
  suiteRegistry.register(new MlDsa87Suite());
10797
- suiteRegistry.register(new MlDsaSuite());
10798
10795
  const sdk = new DefaultKeySDK({
10799
10796
  keyRegistry,
10800
10797
  suiteRegistry